Поиск начальных и конечных тегов в пользовательской HTML-подобной структуре
Я работаю над движком шаблонов HTML в C#. Я хочу добиться некоторых из тех же функциональных возможностей, что и библиотеки, такие как 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 ответ
По моему мнению, синтаксический анализ - это очень функциональные вещи: регулярное выражение некоторых символов <>, синтаксический анализ тега, повторение символов, регулярное выражение следующего <>, получение содержимого между тегами, скрытое в строку... и т. Д. и т. д.
Этот функциональный подход "разбирать каждый раз, когда вы добавляете символ", на мой взгляд, является побочным продуктом запроса текстового редактора для выполнения таких задач, как распознавание тегов, подсветка синтаксиса и т. Д. Проще говоря, цель текстового редактора "ожидалось, что" модельный "объект будет панелью, полной символов Юникода, о которых он может не знать, и мы привыкли заставлять его" становиться интеллектуальным "в отношении объектной модели.
Я разрабатывал свою собственную версию того, над чем вы работаете, поигравшись с HTML-тегами "Сделай мне больно" внутри редактора Monarch (что, возможно, 1. лучшее из того, что мы можем сделать в 2017 году, и 2. тупо сложное).
Я подхожу к этому не как к текстовому редактору, а как к представлению в смысле MVC, которое является поверхностной поверхностью для редактирования текста, но на самом деле представляет собой шаблонную упорядоченную модель, которая реагирует на поведение пользователя.