Поиск начальных и конечных тегов в пользовательской 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, которое является поверхностной поверхностью для редактирования текста, но на самом деле представляет собой шаблонную упорядоченную модель, которая реагирует на поведение пользователя.

Другие вопросы по тегам