marko/compiler/index.js

185 lines
4.6 KiB
JavaScript

'use strict';
var Compiler = require('./Compiler');
var Walker = require('./Walker');
var Parser = require('./Parser');
var HtmlJsParser = require('./HtmlJsParser');
var Builder = require('./Builder');
var extend = require('raptor-util/extend');
var CompileContext = require('./CompileContext');
var globalConfig = require('./config');
var defaults = extend({}, globalConfig);
Object.defineProperty(exports, 'defaultOptions', {
get: function() { return globalConfig; },
enumerable: true,
configurable: false
});
Object.defineProperty(exports, 'config', {
get: function() { return globalConfig; },
enumerable: true,
configurable: false
});
var defaultParser = new Parser(new HtmlJsParser());
var rawParser = new Parser(
new HtmlJsParser({
ignorePlaceholders: true
}),
{
raw: true
});
function configure(newConfig) {
if (!newConfig) {
newConfig = {};
}
extend(globalConfig, defaults);
extend(globalConfig, newConfig);
}
var defaultCompiler = new Compiler({
parser: defaultParser,
builder: Builder.DEFAULT_BUILDER
});
var req = require;
function createBuilder(options) {
return new Builder(options);
}
function createWalker(options) {
return new Walker(options);
}
function compileFile(filename, options, callback) {
var fs = req('fs');
var compiler;
if (typeof options === 'function') {
callback = options;
options = null;
}
if (options) {
compiler = options.compiler;
}
if (!compiler) {
compiler = defaultCompiler;
}
if (callback) {
fs.readFile(filename, {encoding: 'utf8'}, function(err, templateSrc) {
if (err) {
return callback(err);
}
try {
callback(null, compiler.compile(templateSrc, filename, options));
} catch(e) {
callback(e);
}
});
} else {
let templateSrc = fs.readFileSync(filename, {encoding: 'utf8'});
return compiler.compile(templateSrc, filename, options);
}
}
function compile(src, filename, options, callback) {
var compiler;
if (typeof options === 'function') {
callback = options;
options = null;
}
if (options) {
compiler = options.compiler;
}
if (!compiler) {
compiler = defaultCompiler;
}
if (callback) {
try {
callback(null, compiler.compile(src, filename, options));
} catch(e) {
callback(e);
}
} else {
return compiler.compile(src, filename, options);
}
}
function checkUpToDate(templateFile, templateJsFile) {
return false; // TODO Implement checkUpToDate
}
function getLastModified(path, options, callback) {
if (typeof options === 'function') {
callback = options;
options = null;
}
callback(null, -1); // TODO Implement getLastModified
}
function clearCaches() {
exports.taglibLookup.clearCache();
exports.taglibFinder.clearCache();
exports.taglibLoader.clearCache();
}
function parseRaw(templateSrc, filename) {
var context = new CompileContext(templateSrc, filename, Builder.DEFAULT_BUILDER);
return rawParser.parse(templateSrc, context);
}
exports.createBuilder = createBuilder;
exports.compileFile = compileFile;
exports.compile = compile;
exports.parseRaw = parseRaw;
exports.checkUpToDate = checkUpToDate;
exports.getLastModified = getLastModified;
exports.createWalker = createWalker;
exports.builder = Builder.DEFAULT_BUILDER;
exports.configure = configure;
exports.clearCaches = clearCaches;
var taglibLookup = require('./taglib-lookup');
exports.taglibLookup = taglibLookup;
exports.taglibLoader = require('./taglib-loader');
exports.taglibFinder = require('./taglib-finder');
taglibLookup.registerTaglib(require.resolve('../taglibs/core/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/layout/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/html/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/async/marko.json'));
taglibLookup.registerTaglib(require.resolve('../taglibs/cache/marko.json'));
exports.registerTaglib = function(path) {
taglibLookup.registerTaglib(path);
clearCaches();
};
/*
exports.Taglib = require('./Taglib');
exports.lookup = require('./taglib-lookup');
exports.buildLookup = exports.lookup.buildLookup;
exports.registerTaglib = exports.lookup.registerTaglib;
exports.excludeDir = exports.lookup.excludeDir;
exports.clearCaches = function() {
exports.lookup.clearCaches();
require('./taglib-finder').clearCaches();
};
*/