在自定义类似HTML的结构

时间:2017-03-09 18:59:31

标签: c# html templating templating-engine

我正在使用C#中的HTML模板引擎。我希望实现一些与Handlebars.Net(Handlebars.js的C#实现)之类的库相同的功能,除了使用基本的字符串操作(查找/替换)而不是完整的编译器。

语法如下:

{{#each item in items}}

    <li>{{item.Name}}</li>

{{/each}}

我希望用Regex进行简单的字符串替换,但我意识到Regex在这方面会有缺点,比如在下面的例子中查找结束标记(它会找到第一个嵌入{{/ each}}而不是解析第一个标签时的最后一个):

{{#each item in items}} //while parsing this tag...

  <p>{{item.Name}}'s Hobbies:</p>

  <ul>
    {{#each hobby in item}}

      <li>{{hobby.Name}}</li>

    {{/each}} //this end tag would be found first
  </ul>

{{/each}} //rather than this one

我需要找到任何给定“标记”的开头和结尾(例如{{#each}} ... {{/ each}})并从中创建一个类似DOM的结构以便解析每个标签的内容。 “DOM”可以有多个嵌入彼此内部的标签(想想嵌入的foreach循环x4)。实现这一目标的好方法是什么?

1 个答案:

答案 0 :(得分:0)

在我看来,解析是非常功能性的东西:正则表达式一些字符&lt;&gt ;,解析为标记,迭代字符,正则表达式下一个&lt;&gt;,获取内容在标签之间,隐藏到字符串......等。等等。

在我看来,这个功能性,解析 - 每次添加一个字符的方法是要求文本编辑器执行标签识别,语法突出显示等任务的副产品。最简单的说,一个文本编辑的“目的”是期望一个“模型”对象是一个充满unicode角色的面板,它可能是幸福无知的,而且我们已经习惯于强迫它变得对对象模型“变得聪明”。

在Monarch编辑器内部使用“伤害我很多”的HTML标签后,我一直在设计我自己正在制作的版本(这可能是2017年我们可以做的最好的事情.2。愚蠢地复杂。)

我接近它的方式不是作为文本编辑器,而是作为MVC意义上的视图,表面上是一个文本编辑表面,但实际上是一个模板化的有序模型,它对用户行为有反应。