Website/build.js

154 lines
3.9 KiB
JavaScript

/**
* Config
*/
process.env.TZ = 'America/New_York'
/**
* Modules
*/
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;
});