marko/compiler/lib/taglib-loader.js
2014-01-30 23:21:26 -08:00

86 lines
2.4 KiB
JavaScript

var fs = require('fs');
var nodePath = require('path');
var Taglib = require('./Taglib');
var cache = {};
var forEachEntry = require('raptor-util').forEachEntry;
function invokeHandlers(config, handlers, path) {
if (!config) {
throw new Error('"config" argument is required');
}
if (typeof config !== 'object') {
throw new Error('Object expected for ' + path);
}
for (var k in config) {
if (config.hasOwnProperty(k)) {
var handler = handlers[k];
if (!handler) {
throw new Error('Invalid option of "' + k + '" for ' + path + '. Allowed: ' + Object.keys(handlers).join(', '));
}
try {
handler(config[k]);
}
catch(e) {
if (!e.invokeHandlerError) {
var error = new Error('Error while applying option of "' + k + '" for ' + path + '. Exception: ' + (e.stack || e));
error.invokeHandlerError = e;
throw error;
}
else {
throw e;
}
}
}
}
}
function load(path) {
if (cache[path]) {
return cache[path];
}
var src = fs.readFileSync(path, {encoding: 'utf8'});
var taglib = new Taglib(path);
var dirname = nodePath.dirname(path);
invokeHandlers(JSON.parse(src), {
'aliases': function(aliases) {
aliases.forEach(function(alias) {
taglib.addAlias(alias);
});
},
'import-tags': function(tags) {
forEachEntry(tags, function(tagName, path) {
// path = nodePath.resolve(dirname, path);
// if (!fs.existsSync(path)) {
// throw new Error('Tag at path "' + path + '" does not exist');
// }
});
}
}, path);
taglib.id = path;
cache[path] = taglib;
return taglib;
}
function loadTaglibXml(taglibXml, path) {
var TaglibXmlLoader = require('./TaglibXmlLoader');
var taglib = TaglibXmlLoader.load(taglibXml, path);
taglib.id = path;
return taglib;
}
function loadTaglibXmlFromFile(path) {
var src = fs.readFileSync(path, {encoding: 'utf8'});
return loadTaglibXml(src, path);
}
exports.load = load;
exports.loadTaglibXml = loadTaglibXml;
exports.loadTaglibXmlFromFile = loadTaglibXmlFromFile;