PHP Conference Nagoya 2025

Класс 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 или внутреннее представление значений.

Обзор класса

class CommonMark\CQL {
/* Конструктор */
public __construct(string $query)
/* Методы */
public __invoke(CommonMark\Node $root, callable $handler)
}

Содержание

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top