0

我正在使用 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

为了解析每个标签。“DOM”可以在彼此内部嵌入多个标签(想想嵌入的 foreach 循环 x4)。什么是实现这一目标的好方法?

4

1 回答 1

0

在我看来,解析是非常实用地看待事物:正则表达式一些字符<>,解析为标签,迭代字符,正则表达式下一个<>,获取标签之间的内容,隐藏到字符串......等等。等等等等

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

在玩弄了 Monarch 编辑器中的“伤害我很多”HTML标记之后,我一直在设计我自己的版本(这可能是我们在 2017 年能做的最好的事情和 2。愚蠢的复杂。)

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

于 2017-03-09T20:06:54.700 回答