Класс CommonMark\CQL
(cmark >= 1.1.0)
Введение
CommonMark Query Language - это DSL для описания того, как проходить через дерево узлов CommonMark, реализованное в виде синтаксического анализатора и компилятора для небольшого набора инструкций, и виртуальной машины для выполнения этих инструкций.
Пути:
В наиболее упрощенной форме запрос CQL объединяет следующие пути и /
, чтобы описать, как перемещаться по дереву:
- firstChild
- lastChild
- previous
- next
- parent
/firstChild/lastChild
будет перемещаться к последнему дочернему узлу первого дочернего узла.
Циклы
В CQL может быть задан цикл, например, через дочерние элементы или дочерние элементы к определенному узлу с использованием пути children
или siblings
. Например, /firstChild/children
будет перемещаться по всем дочерним элементам первого дочернего узла.
Подзапросы
CQL можно проинструктировать, как перемещаться, используя подзапрос, такой как [/firstChild]
. Например, /firstChild/children[/firstChild]
перейдет к первому дочернему узлу всех дочерних узлов первого дочернего узла.
Ограничения циклов
Во время цикла CQL может быть проинструктирован ограничивать пройденный путь до узлов определенного типа. Например, /children(BlockQuote)
будет перемещаться к дочерним элементам узла, где типом является BlockQuote
. Следующие типы распознаются (без учета регистра):
- BlockQuote
- List
- Item
- CodeBlock
- HtmlBlock
- CustomBlock
- Paragraph
- Heading
- ThematicBreak
- Text
- SoftBreak
- LineBreak
- Code
- HtmlInline
- CustomInline
- Emphasis
- Strong
- Link
- Image
/children(BlockQuote|List)
будет перемещаться к дочерним элементам узла, где типом является BlockQuote
или List
. Типы или объединения типов, также могут быть отменены. Например, /children(~BlockQuote)
будет перемещаться к дочерним элементам узла, где тип не является BlockQuote
, а /children(~BlockQuote|Paragraph)
будет перемещаться к дочерним узлам, где тип не является BlockQuote
или Paragraph
.
Ограничения путей
CQL можно поручить создать цикл для перемещения к узлу определенного типа по определенному пути. Например, /firstChild(BlockQuote)
перейдет к первому дочернему узлу с типом BlockQuote
. Обратите внимание, что как и другие циклы, для children
и siblings
, этот тип пути может сопровождаться только подзапросом.
Замечания по реализации
Хотя CQL реализован как часть модуля PHP CommonMark, он стоит отдельно от PHP и не использует виртуальную машину PHP или внутреннее представление значений.
Обзор классов
Содержание
- CommonMark\CQL::__construct — Конструктор класса CQL
- CommonMark\CQL::__invoke — Выполнение CQL