これを行うには、次の 2 つのことを行う必要があります。
- クラスの
escape
メソッドは、Template
HTML エンティティをエスケープすることを知っている必要があります
escapeHTML
Prototype.js がString
オブジェクトに追加するメソッドは、引用符を"
エンティティにエンコードするように拡張する必要があります。(そしておそらくもっと。今は単純すぎる...)
これら 2 つの両方は、次のコードで実現できます。
String.prototype.escapeHTML = String.prototype.escapeHTML.wrap(function(proceed){
return proceed().replace(/"/g,'"');
});
Template.addMethods({
evaluateEscapeHTML: function(object) {
if (object && Object.isFunction(object.toTemplateReplacements))
object = object.toTemplateReplacements();
return this.template.gsub(this.pattern, function(match) {
if (object == null) return (match[1] + '');
var before = match[1] || '';
if (before == '\\') return match[2];
var ctx = object, expr = match[3],
pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
match = pattern.exec(expr);
if (match == null) return before;
while (match != null) {
var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1];
ctx = ctx[comp];
if (null == ctx || '' == match[3]) break;
expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
match = pattern.exec(expr);
}
return before + String.interpret(ctx).escapeHTML();
});
}
});
evaluateEscapeHTML
このコードは Prototype.js を拡張し、新しいメソッドを Templatesに追加するため、このコードは1 回実行する必要があり、それ以降はすべてTemplate
新しいevaluateEscapeHTML
メソッドになります。
var template = new Template(
'<div><label>Name: <input name=\"name\" value=\"#{name}\"></label></div>'+
'<div><label>URL: <input name=\"url\" value=\"#{url}\"></label></div>'+
'<div><label>Personal Statement: <input name=\"statement\" value=\"#{statement}\"></label></div>'
);
$('test').update(template.evaluate(data));
これをテストする JSFiddle
ここでは、prototype.js バージョン 1.7 のクラスからメソッド全体を複製する必要があったことに注意してください。これには、メソッドの将来のバージョンが改善された場合、私のコードも改善する必要があるという大きな欠点があります。しかし、これを行うためのより良い方法を見つけることができませんでした。 evaluate
Template
evaluate
evaluate
私が行ったメソッドへの特定の変更は、この行を変更することでした:
return before + String.interpret(ctx);
に:
return before + String.interpret(ctx).escapeHTML();
extend
それがすべてです。そのため、コードの残りの部分を何とかできなかったのはとても残念wrap
です...