wiki:ru/WikiParser

Заметки по архитектуре Wiki

Разбор wiki документа удобно производить в несколько этапов:

  • разделение на строки
  • обработка блочных элементов (параграфы и т.д.)
  • обработку строчных элементов (курсив, подчёркивание и т.д.)

Все элементы могут быть вложенными, причём исключительно вложенными, все открытые элементы закрываются объемлющим элементом даже при отсутствии явного закрытия вложенных элементов.

Блочные элементы

Для блочных элементов уровень вложенности контролируется отступом первой строки блока. Для параграфа возможно использование более сложного правила, когда первая строка может иметь больший отступ нежели строки продолжения. В этом случае используется отступ первой строки ("красная строка").

Поддержка базового блочного элемента - параграфа - по всей видимости должна быть реализована ядром парсера. Все остальные блочные элементы могут быть реализованы в форме подключаемых модулей.

Предполагается поддержка следующих видов блоков:

  • параграф
  • ненумерованный список
  • нумерованный список
  • заголовок
  • блок кода

Строчные элементы

Все строчные элементы обрабатываются подключаемыми модулями.

Обработка состояния модуля разбора

Модуль разбора поддерживает текущее состояние разбора, а подключаемые модули должы иметь возможность предоставлять собственные значения этих состояний, равно как и некоторые команды по обработке стэка состояния.

Подключаемые модули разбора

Для блочных элементов предлагается следующий API подключаемого модуля разбора:

type Block_Parser_Extension is limited interface;

not overriding function Start_Regexp
 (Self : Block_Parser_Extension) return League.Regexps.Regexp is abstract;

not overriding function Create_Handler
 (Self : Block_Parser_Extension) 
    return Block_Handler_Extension'Class is abstract;
type Block_Handler_Extension is limited interface;

Разделение разбора и формирования HTML представления

Разбор и формирование HTML представления желательно разделить. Однако при этом встаёт вопрос взаимодействия компонентов, поскольку модулю расширения анализатора должен соответствовать модуль расширения генератора HTML представления. Если требовать динамического подключения во время исполнения программы, то не понятно как этого эффективным образом. Если такой цели не ставить и предпроложить, что все компоненты конфигурируются в момент написания программы, то можно обойтись более монолитным механизмом, когда каждый модуль расширения будет предоставлять интерфейс генерации документа, а собственно генератор - его реализовывать.

Last modified 6 years ago Last modified on May 25, 2014, 12:58:30 AM
Note: See TracWiki for help on using the wiki.