swig
Version:
A simple, powerful, and extendable templating engine for node.js and browsers, similar to Django, Jinja2, and Twig.
110 lines (94 loc) • 2.5 kB
JavaScript
/**
* Set a variable for re-use in the current context. This will over-write any value already set to the context for the given <var>varname</var>.
*
* @alias set
*
* @example
* {% set foo = "anything!" %}
* {{ foo }}
* // => anything!
*
* @example
* // index = 2;
* {% set bar = 1 %}
* {% set bar += index|default(3) %}
* // => 3
*
* @example
* // foods = {};
* // food = 'chili';
* {% set foods[food] = "con queso" %}
* {{ foods.chili }}
* // => con queso
*
* @example
* // foods = { chili: 'chili con queso' }
* {% set foods.chili = "guatamalan insanity pepper" %}
* {{ foods.chili }}
* // => guatamalan insanity pepper
*
* @param {literal} varname The variable name to assign the value to.
* @param {literal} assignement Any valid JavaScript assignement. <code data-language="js">=, +=, *=, /=, -=</code>
* @param {*} value Valid variable output.
*/
exports.compile = function (compiler, args) {
return args.join(' ') + ';\n';
};
exports.parse = function (str, line, parser, types) {
var nameSet = '',
propertyName;
parser.on(types.VAR, function (token) {
if (propertyName) {
// Tell the parser where to find the variable
propertyName += '_ctx.' + token.match;
return;
}
if (!parser.out.length) {
nameSet += token.match;
return;
}
return true;
});
parser.on(types.BRACKETOPEN, function (token) {
if (!propertyName && !this.out.length) {
propertyName = token.match;
return;
}
return true;
});
parser.on(types.STRING, function (token) {
if (propertyName && !this.out.length) {
propertyName += token.match;
return;
}
return true;
});
parser.on(types.BRACKETCLOSE, function (token) {
if (propertyName && !this.out.length) {
nameSet += propertyName + token.match;
propertyName = undefined;
return;
}
return true;
});
parser.on(types.DOTKEY, function (token) {
if (!propertyName && !nameSet) {
return true;
}
nameSet += '.' + token.match;
return;
});
parser.on(types.ASSIGNMENT, function (token) {
if (this.out.length || !nameSet) {
throw new Error('Unexpected assignment "' + token.match + '" on line ' + line + '.');
}
this.out.push(
// Prevent the set from spilling into global scope
'_ctx.' + nameSet
);
this.out.push(token.match);
this.filterApplyIdx.push(this.out.length);
});
return true;
};
exports.block = true;