mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
212 lines
5.5 KiB
JavaScript
212 lines
5.5 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 CompileContext = require('./CompileContext');
|
|
var InlineCompiler = require('./InlineCompiler');
|
|
var ok = require('assert').ok;
|
|
|
|
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 _compile(src, filename, userOptions, callback) {
|
|
ok(filename, '"filename" argument is required');
|
|
ok(typeof filename === 'string', '"filename" argument should be a string');
|
|
|
|
var options = {};
|
|
|
|
extend(options, globalConfig);
|
|
|
|
if (userOptions) {
|
|
extend(options, userOptions);
|
|
}
|
|
|
|
var compiler = defaultCompiler;
|
|
|
|
var context = new CompileContext(src, filename, compiler.builder, options);
|
|
|
|
if (callback) {
|
|
let compiled;
|
|
|
|
try {
|
|
compiled = compiler.compile(src, context);
|
|
} catch(e) {
|
|
return callback(e);
|
|
}
|
|
|
|
callback(null, compiled.code);
|
|
} else {
|
|
let compiled = compiler.compile(src, context);
|
|
return compiled.code;
|
|
}
|
|
}
|
|
|
|
function compile(src, filename, options, callback) {
|
|
if (typeof options === 'function') {
|
|
callback = options;
|
|
options = null;
|
|
}
|
|
|
|
return _compile(src, filename, options, callback);
|
|
}
|
|
|
|
function compileFile(filename, options, callback) {
|
|
var fs = req('fs');
|
|
|
|
if (typeof options === 'function') {
|
|
callback = options;
|
|
options = null;
|
|
}
|
|
|
|
if (callback) {
|
|
fs.readFile(filename, {encoding: 'utf8'}, function(err, templateSrc) {
|
|
if (err) {
|
|
return callback(err);
|
|
}
|
|
|
|
_compile(templateSrc, filename, options, callback);
|
|
});
|
|
} else {
|
|
let templateSrc = fs.readFileSync(filename, {encoding: 'utf8'});
|
|
return _compile(templateSrc, filename, options, callback);
|
|
}
|
|
}
|
|
|
|
function createInlineCompiler(filename, userOptions) {
|
|
var options = {};
|
|
|
|
extend(options, globalConfig);
|
|
|
|
if (userOptions) {
|
|
extend(options, userOptions);
|
|
}
|
|
|
|
var compiler = defaultCompiler;
|
|
var context = new CompileContext('', filename, compiler.builder, options);
|
|
|
|
return new InlineCompiler(context, compiler);
|
|
}
|
|
|
|
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);
|
|
var parsed = rawParser.parse(templateSrc, context);
|
|
|
|
if (context.hasErrors()) {
|
|
var errors = context.getErrors();
|
|
|
|
var message = 'An error occurred while trying to compile template at path "' + filename + '". Error(s) in template:\n';
|
|
for (var i = 0, len = errors.length; i < len; i++) {
|
|
let error = errors[i];
|
|
message += (i + 1) + ') ' + error.toString() + '\n';
|
|
}
|
|
var error = new Error(message);
|
|
error.errors = errors;
|
|
throw error;
|
|
}
|
|
|
|
return parsed;
|
|
}
|
|
|
|
exports.createBuilder = createBuilder;
|
|
exports.compileFile = compileFile;
|
|
exports.compile = compile;
|
|
exports.parseRaw = parseRaw;
|
|
exports.createInlineCompiler = createInlineCompiler;
|
|
|
|
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');
|
|
|
|
function buildTaglibLookup(dirname) {
|
|
return taglibLookup.buildLookup(dirname);
|
|
}
|
|
|
|
exports.buildTaglibLookup = buildTaglibLookup;
|
|
|
|
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();
|
|
}; |