Справочная информация:
Я пытаюсь реализовать простой (?) Язык разметки, который будет использоваться для написания романов.
Это сильно отличается от обычных разметок, поскольку семантика сосредоточена на разных примитивахВ частности, прямая речь далеко не похожа на список.
Базовая структура хорошо известна: @part{title}
, @chapter{title}
и @scene[{title}]
имеют обычные значения, а двойные - \n
указываютразрыв абзаца.
Особенности включают в себя:
- @ speach [динамик] {высказывание, возможно, сложное}
- @ стресс {что-то, что должно быть визуально улучшено}
- @ standout {какая-то часть, которая должна иметь другое визуальное улучшение}
- @ цитата [оригинальный автор] {возможно длинная цитата блока}
Это должно быть проанализированои переведены в различные выходные форматы (например, html и LaTeX).
У меня есть pyparsing
грамматика, способная анализировать нетривиальные входные данные.
Проблема заключается в создании абзацев для HTML:
Какуказанный абзац заканчивается двойным переводом строки, но по существу начинается с конца предыдущего абзаца, если только некоторые элементы верхнего уровня (например: @chapter
) не вмешиваются в разрыв последовательности.
Первая наивная попытка заключалась в накоплении фрагментов текста вглобальный буфер и выделять их в выбранных точках;эта логика работает логически, но, кажется, pyparsing
вызывает это ParseActions
несколько раз, поэтому мой глобальный буфер заканчивает тем, что содержит один и тот же фрагмент.
Я не нашел способа избежать такого дублирования илипометьте «начало абзаца» таким образом, чтобы я мог вернуться к нему позже, чтобы сгенерировать хорошо известный <p>Long line, maybe containing @speech{possibly nested with @standout{!} and other constructs}</p>
(конечно, @standout
должен отображаться на <b>!</b>
и @speech
на некоторый конкретный <div class="speech"></div>
)
Какова «лучшая практика» для решения подобных проблем?
Примечание: генерация кода LaTeX гораздо менее проблематична, поскольку абзацы просто завершаются (как в разметке) либо с пустымлиния или с \par
.