有一些帖子包括关于Html转义的this,但这对我不起作用。如果我有一个简单的模板,如:
<html><body>$field$</body></html>
我只需要转义字段,而不是整个模板。我创建了一个自定义渲染,它使用System.Web.HttpUtility类来执行字符串的转义:
class HtmlRenderer : IAttributeRenderer
{
public string ToString(object obj, string formatString, System.Globalization.CultureInfo culture)
{
return HttpUtility.HtmlEncode(
new StringRenderer().ToString(obj, formatString, culture));
}
}
一些示例代码用于呈现带有一些数据的模板:
public static string Render()
{
var group = new TemplateGroup('$', '$');
group.RegisterRenderer(typeof(string), new HtmlRenderer());
var template = new Template(group, "<html><body>$field$</body></html>");
template.Add("field", "Chalk & Cheese");
return template.Render();
}
返回以下内容:
<html><body>Chalk & Cheese</body></html>
逃脱了一切。
如何只转义添加到模板的字段?
答案 0 :(得分:1)
我是stringtemplate的新手,但我认为我对如何使其工作有了一个想法,我认为你几乎就在那里,遗失的是你的stringtemplate中的格式选项。 我想你需要的是:
<html><body>$field;format="htmlTag"$</body></html>
使用“htmlTag”标记字符串模板后,您可以注册一个渲染器,就像您上面所做的那样,并按如下方式检查该标记:
public class HtmlRenderer:IAttributeRenderer
{
public string ToString(object obj,string formatString,CultureInfo culture)
{
if(formatString=="htmlEncode")
{ return HttpUtility.HtmlEncode(obj.ToString()); }
return obj.ToString();
}
}
可在此处找到更多信息: http://www.antlr.org/wiki/display/ST/Object+rendering
注意:这是未经测试的,我的C#不是很好:)但我希望我已经指出了正确的方向。
答案 1 :(得分:0)
我建议另一个实现 - 下面。 为什么?请参阅以下位置的默认StringRenderer源代码:https://github.com/antlr/antlrcs/blob/master/Antlr4.StringTemplate/StringRenderer.cs
using System;
using System.Globalization;
using System.Security;
using System.Text;
using System.Web;
using Antlr4.StringTemplate;
class Program
{
static void Main(string[] args)
{
TemplateGroup g = new TemplateGroup('$', '$');
g.RegisterRenderer(typeof(object), new MyTemplateRenderer());
string temp = "<html>$var;format=\"html-encode\"$</html>\n$date;format=\"{0:R}\"$";
Template t = new Template(g, temp);
t.Add("var", "<>");
t.Add("date", DateTime.Now);
Console.WriteLine(t.Render());
Console.ReadLine();
}
}
public class MyTemplateRenderer : IAttributeRenderer
{
public virtual string ToString(object o, string formatString, CultureInfo culture)
{
if (formatString == null) return o.ToString();
switch (formatString) {
case "upper":
return o.ToString().ToUpper(culture);
case "lower":
return o.ToString().ToLower(culture);
case "cap":
string s = o.ToString();
return s.Length > 0 ? Char.ToUpper(s[0], culture) + s.Substring(1) : s;
case "url-encode":
return HttpUtility.UrlEncode(o.ToString(), Encoding.UTF8);
case "xml-encode":
return SecurityElement.Escape(o.ToString());
case "html-encode":
return HttpUtility.HtmlEncode(o);
default:
return String.Format(culture, formatString, o);
}
}
}