2013-07-15 37 views
1

有幾個職位,包括this關於Html轉義,但這不適合我。如果我有這樣一個簡單的模板:如何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; 

它逃脫了一切。

我該如何逃避只添加到模板的字段?

回答

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#是不是很好:)但我希望我已經指出你正確的方向。

+0

謝謝,我會給這個去。有人認爲我覺得難以確定文檔適用的stringtemplate版本。從你的鏈接看起來是v2.2 +希望它在v4中沒有改變...另外,從你的例子我認爲它應該是 $ field; format =「htmlTag」$。 –

+0

是的我認爲你是對的我已經用正確的ST語法更新了答案。一般來說,對於任何版本都沒有語言參考。我進入了以我期望它的工作方式編寫語法的情況,並且它沒有,因爲語言不支持這種方式。我同意很難去「正確」的方式語法,但只要在舊版本中有一個功能,我確信在將來的版本中仍然會有不同的語法。 P.S:ST4似乎也有相同的語法:[link](http://www.antlr.org/wiki/display/ST4/Renderers) – Har

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); 
     } 
    } 
} 
相關問題