mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
88 lines
1.9 KiB
JavaScript
88 lines
1.9 KiB
JavaScript
'use strict';
|
|
|
|
var safeVarName = require('./safeVarName');
|
|
var ok = require('assert').ok;
|
|
|
|
class MacrosContext {
|
|
constructor() {
|
|
this._byName = {};
|
|
}
|
|
|
|
isMacro(name) {
|
|
if (!name) {
|
|
return false;
|
|
}
|
|
|
|
if (name.type === 'Literal') {
|
|
name = name.value;
|
|
}
|
|
|
|
return this._byName.hasOwnProperty(name);
|
|
}
|
|
|
|
getRegisteredMacro(name) {
|
|
return this._byName[name];
|
|
}
|
|
|
|
registerMacro(name, params) {
|
|
ok(name, '"name" is required');
|
|
ok(typeof name === 'string', '"name" should be a string');
|
|
if (params == null) {
|
|
params = [];
|
|
|
|
} else {
|
|
ok(Array.isArray(params), '"params" should be an array');
|
|
}
|
|
|
|
|
|
var hasOut = false;
|
|
var hasRenderBody = false;
|
|
params.forEach((param) => {
|
|
if (param === 'out') {
|
|
hasOut = true;
|
|
} else if (param === 'renderBody') {
|
|
hasRenderBody = true;
|
|
}
|
|
});
|
|
|
|
if (!hasOut) {
|
|
params.push('out');
|
|
}
|
|
|
|
if (!hasRenderBody) {
|
|
params.push('renderBody');
|
|
}
|
|
|
|
var paramIndexes = {};
|
|
params.forEach((param, i) => {
|
|
paramIndexes[param] = i;
|
|
|
|
if (param === 'out') {
|
|
hasOut = true;
|
|
} else if (param === 'renderBody') {
|
|
hasRenderBody = true;
|
|
}
|
|
});
|
|
|
|
var functionName = 'macro_' + safeVarName(name);
|
|
|
|
var macroDef = {
|
|
name: name,
|
|
params: params,
|
|
functionName: functionName,
|
|
getParamIndex: function(param) {
|
|
return paramIndexes[param];
|
|
}
|
|
};
|
|
|
|
this._byName[name] = macroDef;
|
|
|
|
return macroDef;
|
|
}
|
|
}
|
|
|
|
function createMacrosContext() {
|
|
return new MacrosContext();
|
|
}
|
|
|
|
exports.createMacrosContext = createMacrosContext; |