Website/node_modules/metalsmith-metadata/lib/index.js
2015-12-02 18:54:12 -05:00

58 lines
1.2 KiB
JavaScript

var path = require('path');
var extname = path.extname;
var yaml = require('js-yaml');
/**
* Expose `plugin`.
*/
module.exports = plugin;
/**
* Supported metadata parsers.
*/
var parsers = {
'.json': JSON.parse,
'.yaml': yaml.safeLoad,
'.yml': yaml.safeLoad
};
/**
* Metalsmith plugin to hide drafts from the output.
*
* @param {Object} opts
* @return {Function}
*/
function plugin(opts){
opts = opts || {};
return function(files, metalsmith, done){
var metadata = metalsmith.metadata();
var exts = Object.keys(parsers);
for (var key in opts) {
var file = opts[key].replace(/(\/|\\)/g, path.sep);
var ext = extname(file);
if (!~exts.indexOf(ext)) throw new Error('unsupported metadata type "' + ext + '"');
if (!metadata[key] || files[file]) {
if (!files[file]) throw new Error('file "' + file + '" not found');
var parse = parsers[ext];
var str = files[file].contents.toString();
delete files[file];
try {
var data = parse(str);
} catch (e) {
return done(new Error('malformed data in "' + file + '"'));
}
metadata[key] = data;
}
}
done();
};
}