Skip to content

Instantly share code, notes, and snippets.

@soomtong
Last active December 16, 2015 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save soomtong/5465411 to your computer and use it in GitHub Desktop.
Save soomtong/5465411 to your computer and use it in GitHub Desktop.
Simple iteration tag for swig template
/*
checkout this
http://paularmstrong.github.io/swig/docs/#tags-custom
setup like below
// set template engine
var swig = require('swig');
var swigFilter = require('./swigFilter');
var swigTag = require('./swigTag');
app.engine('html', swig.renderFile);
swig.setFilter('substring', swigFilter.substring);
swig.setFilter('printDate', swigFilter.printDate);
swig.setTag('iterate', swigTag.iterate.parse, swigTag.iterate.compile, swigTag.iterate.ends);
swig.setDefaults({
cache: false // default 'memory'
});
use :
{% set stYear = 1950 %}
{% set edYear = 1999 %}
{% iterate item from stYear to edYear %}
<option value="{{ item }}">{{ item }}</option>
{% enditerate %}
*/
exports.iterate = {
parse : function (str, line, parser, types, stack) {
var nameSet;
parser.on(types.NUMBER, function (token) {
throw new Error('Unexpected number "' + token.match + '" on line ' + line + '.');
});
parser.on(types.VAR, function (token) {
if (token.match === 'from' || token.match === 'to') {
return;
}
nameSet = token.match;
this.out.push(
// Prevent the set from spilling into global scope
'_ctx.' + nameSet
);
});
return true;
},
compile: function (compiler, args, content, parents, options, blockName) {
var output =[
'(function () {\n',
' var __iterFrom = ' + args[1] + ';\n',
' var __iterTo = ' + args[2] + ';\n',
' for (var i = Number(__iterFrom); i <= Number(__iterTo); i++) {\n',
' ' + args[0] + ' = i;\n',
' ' + compiler(content),
' }\n',
'})();\n'
].join('');
return output;
},
ends: true
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment