(cmark >= 1.1.0)
CommonMark Query Language - это DSL для описания того, как проходить через дерево узлов CommonMark, реализованное в виде синтаксического анализатора и компилятора для небольшого набора инструкций, и виртуальной машины для выполнения этих инструкций.
В наиболее упрощённой форме запрос CQL объединяет следующие пути и /, чтобы описать, как перемещаться по дереву:
/firstChild/lastChild будет перемещаться к последнему дочернему узлу первого дочернего узла.
В CQL может быть задан цикл, например, через дочерние элементы или дочерние элементы к определённому узлу с использованием пути children или siblings. Например, /firstChild/children будет перемещаться по всем дочерним элементам первого дочернего узла.
CQL можно проинструктировать, как перемещаться, используя подзапрос, такой как [/firstChild]. Например, /firstChild/children[/firstChild] перейдёт к первому дочернему узлу всех дочерних узлов первого дочернего узла.
Во время цикла CQL может быть проинструктирован ограничивать пройденный путь до узлов определённого типа. Например, /children(BlockQuote) будет перемещаться к дочерним элементам узла, где типом является BlockQuote. Следующие типы распознаются (без учёта регистра):
/children(BlockQuote|List) будет перемещаться к дочерним элементам узла, где типом является BlockQuote или List. Типы или объединения типов, также могут быть отменены. Например, /children(~BlockQuote) будет перемещаться к дочерним элементам узла, где тип не является BlockQuote, а /children(~BlockQuote|Paragraph) будет перемещаться к дочерним узлам, где тип не является BlockQuote или Paragraph.
CQL можно поручить создать цикл для перемещения к узлу определённого типа по определённому пути. Например, /firstChild(BlockQuote) перейдёт к первому дочернему узлу с типом BlockQuote. Обратите внимание, что как и другие циклы, для children и siblings, этот тип пути может сопровождаться только подзапросом.
Хотя CQL реализован как часть модуля PHP CommonMark, он стоит отдельно от PHP и не использует виртуальную машину PHP или внутреннее представление значений.