var extname = require('path').extname; var Metalsmith = require('metalsmith'); var drafts = require('metalsmith-drafts'); var markdown = require('metalsmith-markdown'); var layouts = require('metalsmith-layouts'); var inplace = require('metalsmith-in-place'); var uglify = require('metalsmith-uglify'); var rename = require('metalsmith-rename'); var metadata = require('metalsmith-metadata'); var fingerprint = require('metalsmith-fingerprint'); var branch = require('metalsmith-branch'); var assets = require('metalsmith-assets'); var paths = require('metalsmith-paths'); var linkchecker = require('metalsmith-broken-link-checker'); var rootpath = require('metalsmith-rootpath'); var collections = require('metalsmith-collections'); var filenamedate = require('metalsmith-date-in-filename'); var registerHelpers = require('metalsmith-register-helpers'); var match = require('multimatch'); /** * Helpers */ // generate metadata for lab membership (used in buildPubs, buildGrants, and /people/index.md) var buildMembers = require('./stages/build-members.js') // generate metadata for publications (used in /papers/index.md) var buildPubs = require('./stages/build-pubs.js'); // generate metadata for grants (used in /grants/index.md) var buildGrants = require('./stages/build-grants.js'); // use mathjax to render inline-latex var renderTeX = require('./stages/render-tex.js'); /** * Build. */ var metalsmith = Metalsmith(__dirname) .source('./src') .destination('./site') // Disable posting of drafts .use(drafts()) .use(registerHelpers({ directory: "./helpers" })) // Generate Cache-Busted CSS files .use(fingerprint({ pattern: 'css/*.css' })) // Load metadata: CV, Lab Members/Affiliates, and Pubs // Required for buildPubs .use(metadata({ okennedy: "metadata/okennedy.json", odinLab: "metadata/lab.json", altPubs: "metadata/publications.json", })) // Helper Stage: Render Publication/Grant Details (required for inline rendering) .use(buildMembers()) .use(buildPubs()) .use(buildGrants()) // Extract Path to Root (required for inline rendering) .use(rootpath()) // Extract Dates from Filenames (required for inline rendering) .use(filenamedate(false)) // Render Page-Specific Handlebars .use(inplace({ engine: "handlebars" })) // Render Markdown .use(markdown({ pattern: "**/*.md" })) // Load Path Information (Must come After Markdown Rendering) .use(paths({ property: "paths" })) // Group News Article Collections .use(collections({ news: { pattern: 'news/*.html', sortBy: 'date', reverse: true, limit: 5 }, rants: { pattern: 'rants/*.html', sortBy: 'date', reverse: true, limit: 3 } })) // Render News Article Headers .use(branch('rants/**/*.html') .use(layouts({ engine: "handlebars", default: "article.hbs" })) ) // Render Lab Member Metadata .use(branch(['people/*.html', '!**/index.html']) .use(layouts({ engine: "handlebars", default: "member.hbs" })) ) // Final Render Pass .use(branch('news/**/*.html') .use(layouts({ engine: "handlebars", default: "article.hbs" })) ) // Render HTML .use(branch('**/*.html') // Render LaTeX inlined into the HTML .use(renderTeX()) // Assign a mimir-specific layout to the mimir subdirectory .use(branch('research/mimir/*.html') .use(function(files, smith, done) { for(i in files){ files[i].layout = 'mimir.hbs' } done(); }) ) // Render outer layouts .use(layouts({ engine: "handlebars", default: "default.hbs", directory: "layouts", partials: "partials" })) ) // Validate .use(linkchecker({ allowRegex: /^(\/resources|\/slides)/, allowRedirect: true })) // Compress .use(uglify()) // Compile .build(function(err){ if (err) throw err; });