Как только вы начинаете вводить конструкции управления потоком (if, loop ...) в свой язык шаблонов, вы теряете возможность применять шаблон просто, применяя поиск и замену к вашим переменным.Вам нужно начать синтаксический анализ шаблона, чтобы извлечь части, зависящие от условия, и заново вставить их отдельно, если это потребуется.
Что вы, вероятно, в конечном итоге сделаете, это примените начальный шаг разбора, который превращается:
Template "main" : FOO <if a> BAR </if> QUX
В:
Template "main" : FOO {temp-if-a} QUX
Template "temp" : BAR
Затем, если a
верно, вы бы применили шаблон temp
и сохранили его в переменной {temp-if-a}
во время рендеринга шаблона main
.Если a
равно false, вы не указали бы значение {temp-if-a}
.
Другие структуры потока управления могут быть аналогичным образом реализованы с помощью этой последовательности извлекать-применять независимо-заменять , включая вложенные (просто рекурсивно работайте с алгоритмом приложения шаблона).