Показать сообщение отдельно
  #1 (permalink)  
Старый 08.10.2011, 07:33
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Простой компилятор шаблонов для NodeJS
/**
 * Id: template
 * */

(function() {

function escapeHtml(str) {
	return str
		.replace(/&/g, '&')
		.replace(/</g, '&lt;')
		.replace(/>/g, '&gt;')
		.replace(/"/g, '&quot;')
		.replace(/'/g, '&apos;');
}

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>


Критика, вопросы и т. д., прошу .

Последний раз редактировалось Riim, 08.10.2011 в 08:07.
Ответить с цитированием