1

有一些关于 Html 转义的帖子包括这个,但这对我不起作用。如果我有一个简单的模板,例如:

<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();
}

返回以下内容:

&lt;html&gt;&lt;body&gt;Chalk &amp; Cheese&lt;/body&gt;&lt;/html&gt;

它逃脱了一切。

如何仅转义添加到模板中的字段?

4

2 回答 2

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# 不是很好 :) 但我希望我已经为您指出了正确的方向。

于 2013-07-22T21:48:55.777 回答
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);
        }
    }
}
于 2016-01-11T15:48:25.450 回答