Krasimir によって構築された完璧なJavaScript テンプレート エンジンを見つけました。まさに私が必要としていたものです。
テンプレート エンジンはうまく機能しますが、当然のことながら、それを少しハッキングして、いくつかの機能を追加したいという衝動を抑えることができませんでした。
残念ながら、一部のコードを理解するのに問題があります。
コードは次のとおりです。
var TemplateEngine = function(html, options) {
var re = /<%([^%>]+)?%>/g,
reExp = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g,
code = 'var r=[];\n',
cursor = 0,
match;
var add = function(line, js) {
/* --begin problem */
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
/* --end problem */
return add;
};
while (match = re.exec(html)) {
add(html.slice(cursor, match.index))(match[1], true);
cursor = match.index + match[0].length;
}
add(html.substr(cursor, html.length - cursor));
code += 'return r.join("");';
return new Function(code.replace(/[\r\t\n]/g, '')).apply(options);
};
ここに私が理解できない行があります:
js ? (code += line.match(reExp) ? line + '\n' : 'r.push(' + line + ');\n') : (code += line != '' ? 'r.push("' + line.replace(/"/g, '\\"') + '");\n' : '');
私はJavaScriptを初めて使用するわけではありませんが、これは奇妙に見えるコードであり、私が知っていることから、左手代入のない三項演算子です(間違っている場合は修正してください)。三項演算子を条件文に変換しようとしました。
これは私がこれまでに持っているものです:
if(js) {
if(code += line.match(reExp)) {
line += '\n';
} else {
line += 'r.push(' + line + ');\n';
}
} else {
if(code += line !== '') {
line += 'r.push("' + line.replace(/"/g, '\\"') + '");\n';
} else {
line += "";
}
}
これは失敗し、「Uncaught SyntaxError: Unexpected token if」というエラーがスローされました
このコードを条件付きステートメントに変換するのを手伝ってくれる人はいますか? また、コードが何をするかについて説明してくれますか?
また、好奇心から、IE8 がこのコードをサポートしているかどうか教えてもらえますか?
注: IE8 のサポートは気にしません。このテンプレート エンジンが IE8 をサポートしているかどうかを知りたいだけです。
Krasimir のWeb サイトまたは Krasimir のGithubでテンプレート エンジンを見つけることができます。