/**
* Id: template
* */
(function() {
function escapeHtml(str) {
return str
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}
function compile(strTpl) {
var fn = new Function('viewData, escape',
"var _view = []; function print() { _view.push.apply(_view, arguments); } with (viewData) { _view.push('"
+ String(strTpl).replace(/(?:^|%>)[\s\S]+?(?:$|<%)/g, function($0) {
return $0
.split('\\').join('\\\\')
.split("'").join("\\'")
.split('\r').join('\\r')
.split('\n').join('\\n');
})
.replace(/<%=([\s\S]+?)%>/g, "', $1, '")
.replace(/<%:([\s\S]+?)%>/g, "', escape([$1].join('')), '")
.split('<%').join("'); ")
.split('%>').join("; _view.push('")
+ "'); } return _view;");
return function(viewData, escape) {
return fn.call(this, viewData || {}, escape || escapeHtml).join('');
};
}
exports.compile = compile;
})();
Понимает вставки <% code %>, <%= val %>, <%: val %>.
В последней подставляемое значение пропускается по умолчанию через escapeHtml, можно использовать свою функцию отправляя ее вторым аргументом:
function myEscape(str) {
return str.replace(/5/g, '[5]');
}
alert(
compile('<html><body><%:x%></body></html>')({x: 12589546}, myEscape)
);// <html><body>12[5]89[5]46</body></html>
Критика, вопросы и т. д., прошу
![](images/smilies/smile.gif)
.