wiki:devel:parser
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
wiki:devel:parser [2025/01/17 12:47] – [Парсер] vladpolskiy | wiki:devel:parser [2025/01/17 13:53] (текущий) – [Преобразователь] vladpolskiy | ||
---|---|---|---|
Строка 507: | Строка 507: | ||
</ | </ | ||
- | При настройке лексического анализатора парсер вызывает '' | + | При настройке лексического анализатора парсер вызывает '' |
За счет усложнения понимания настройки лексического анализатора это позволяет сделать код более гибким при добавлении нового синтаксиса. | За счет усложнения понимания настройки лексического анализатора это позволяет сделать код более гибким при добавлении нового синтаксиса. | ||
Строка 515: | Строка 515: | ||
==== Формат данных инструкций ==== | ==== Формат данных инструкций ==== | ||
- | Следующее показывает | + | [[wiki: |
Исходный текст (содержит таблицу): | Исходный текст (содержит таблицу): | ||
Строка 529: | Строка 529: | ||
< | < | ||
- | Array | + | Array( |
- | ( | + | [0] => Array( |
- | [0] => Array | + | |
- | | + | |
[0] => document_start | [0] => document_start | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 0 | [2] => 0 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => p_open | [0] => p_open | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 0 | [2] => 0 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
abc | abc | ||
) | ) | ||
- | |||
[2] => 0 | [2] => 0 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => p_close | [0] => p_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 5 | [2] => 5 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => table_open | [0] => table_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 3 | [0] => 3 | ||
[1] => 2 | [1] => 2 | ||
) | ) | ||
- | |||
[2] => 5 | [2] => 5 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablerow_open | [0] => tablerow_open | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 5 | [2] => 5 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 5 | [2] => 5 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 0 Col 1 | [0] => Row 0 Col 1 | ||
) | ) | ||
- | |||
[2] => 7 | [2] => 7 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 19 | [2] => 19 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 23 | [2] => 23 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 23 | [2] => 23 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 0 Col 2 | [0] => Row 0 Col 2 | ||
) | ) | ||
- | |||
[2] => 24 | [2] => 24 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 36 | [2] => 36 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 41 | [2] => 41 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 41 | [2] => 41 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 0 Col 3 | [0] => Row 0 Col 3 | ||
) | ) | ||
- | |||
[2] => 42 | [2] => 42 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 54 | [2] => 54 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 62 | [2] => 62 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablerow_close | [0] => tablerow_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 63 | [2] => 63 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablerow_open | [0] => tablerow_open | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 63 | [2] => 63 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 63 | [2] => 63 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 1 Col 1 | [0] => Row 1 Col 1 | ||
) | ) | ||
- | |||
[2] => 65 | [2] => 65 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 77 | [2] => 77 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 81 | [2] => 81 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 81 | [2] => 81 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 1 Col 2 | [0] => Row 1 Col 2 | ||
) | ) | ||
- | |||
[2] => 82 | [2] => 82 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 94 | [2] => 94 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 99 | [2] => 99 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_open | [0] => tablecell_open | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => 1 | [0] => 1 | ||
[1] => left | [1] => left | ||
) | ) | ||
- | |||
[2] => 99 | [2] => 99 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => Row 1 Col 3 | [0] => Row 1 Col 3 | ||
) | ) | ||
- | |||
[2] => 100 | [2] => 100 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => | [0] => | ||
) | ) | ||
- | |||
[2] => 112 | [2] => 112 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablecell_close | [0] => tablecell_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 120 | [2] => 120 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => tablerow_close | [0] => tablerow_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 121 | [2] => 121 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => table_close | [0] => table_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 121 | [2] => 121 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => p_open | [0] => p_open | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 121 | [2] => 121 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => cdata | [0] => cdata | ||
- | [1] => Array | + | [1] => Array( |
- | | + | |
[0] => def | [0] => def | ||
) | ) | ||
- | |||
[2] => 122 | [2] => 122 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => p_close | [0] => p_close | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 122 | [2] => 122 | ||
) | ) | ||
- | + | | |
- | | + | |
- | | + | |
[0] => document_end | [0] => document_end | ||
- | [1] => Array | + | [1] => Array() |
- | | + | |
- | | + | |
[2] => 122 | [2] => 122 | ||
) | ) | ||
- | |||
) | ) | ||
</ | </ | ||
- | Верхний уровень массива --- это просто список. Каждый из его дочерних элементов описывает возвратную функцию, | + | Верхний уровень массива --- это просто список. Каждый из его дочерних элементов описывает возвратную функцию, |
=== Единственная инструкция === | === Единственная инструкция === | ||
Строка 960: | Строка 790: | ||
) | ) | ||
- | |||
[2] => 122 | [2] => 122 | ||
) | ) | ||
</ | </ | ||
- | Первый элемент (индекс 0 ) --- это | + | Первый элемент (индекс 0) — это имя метода или функции |
- | Второй элемент (индекс 1) --- сам является массивом, | + | Второй элемент (индекс 1) сам |
- | В этом случае | + | В этом случае |
<code php> | <code php> | ||
Строка 975: | Строка 804: | ||
</ | </ | ||
- | Третий элемент (индекс 2) --- является индексом байта первого символа, | + | Третий элемент (индекс 2) — это индекс байта первого символа, |
- | **Замечание:** метод '' | + | **Примечание**: Метод |
- | Пример массив инструкций страницы с описанием [[wiki: | + | Пример массив инструкций страницы с описанием [[wiki: |
- | ==== Преобразователь ==== | + | ==== Renderer (преобразователь) ==== |
- | Преобразователь --- это класс (или коллекция функций), | + | Renderer (преобразователь) --- это класс (или коллекция функций), |
<code php> | <code php> | ||
Строка 989: | Строка 818: | ||
class Doku_Renderer { | class Doku_Renderer { | ||
- | // snip | + | // вырезка |
| | ||
- | function header($text, | + | |
| | ||
- | function section_open($level) {} | + | |
| | ||
- | function section_close() {} | + | |
| | ||
- | function cdata($text) {} | + | |
| | ||
- | function p_open() {} | + | |
| | ||
- | function p_close() {} | + | |
| | ||
- | function linebreak() {} | + | |
| | ||
- | function hr() {} | + | |
| | ||
- | // snip | + | // вырезка |
} | } | ||
</ | </ | ||
- | Он используется для документирования | + | Он используется для документирования |
- | Основной принцип того, как инструкции, | + | Основной принцип того, как инструкции, |
- | Во фрагменте преобразователя, | + | === Вызов рендерера |
- | === Вызов преобразователя через инструкции === | + | Клиентскому коду, использующему Parser, |
- | + | ||
- | К **клиентскому коду** относится | + | |
<code php> | <code php> | ||
- | // Получить перечень | + | // Получить |
- | $instructions = $Parser-> | + | $instructions = $parser-> |
- | // Создать преобразователь | + | // Создаем рендерер |
- | $Renderer | + | $renderer |
- | // Пройтись по всем | + | // Проходим по инструкциям |
- | foreach ( $instructions as $instruction ) { | + | foreach ($instructions as $instruction) { |
- | | + | // Выполняем обратный вызов |
- | // Выполнить инструкции через преобразователь | + | call_user_func_array([$renderer, $instruction[0]], $instruction[1]); |
- | call_user_func_array(array(&$Renderer, $instruction[0]), | + | |
} | } | ||
</ | </ | ||
- | === Методы | + | === Методы |
- | Ключевыми методами преобразователя | + | Ключевые методы Renderer |
- | * '' | + | * '' |
- | * Возможно, это | + | *Вероятно, это |
- | * '' | + | * '' |
- | * Хотя '' | + | *Хотя '' |
- | * '' | + | * '' |
- | * И '' | + | *Оба изображения |
- | * '' | + | * '' |
- | * '' | + | *Необходимость |
- | * '' | + | * '' |
- | * Технически, только годные '' | + | *Технически |
- | * '' | + | * '' |
- | * Требуется проверить только годные адреса | + | *Должен соответствовать только допустимым URL-адресам общих ресурсов Windows, но в любом |
- | * '' | + | * '' |
- | * '' | + | *'' |
- | * '' | + | * '' |
- | * Здесь проверка | + | *Это не требует |
- | * '' | + | * '' |
- | * '' | + | *'' |
- | Особое внимание | + | Особого внимания требуют методы, которые |
<code html> | <code html> | ||
- | <a href="http:// | + | <a href="https:// |
</ | </ | ||
- | Аргумент '' | + | Аргумент '' |
- | - '' | + | - '' |
- | - строка: в качестве заголовка использована простая тестовая строка; | + | - string: в качестве заголовка использовалась простая текстовая строка |
- | - массив | + | - array (hash): в качестве заголовка использовано изображение. |
- | Если '' | + | Если |
<code php> | <code php> | ||
- | $title = array( | + | $title = [ |
- | // Может быть ' | + | // Может быть ' |
- | ' | + | ' |
| | ||
- | // URL изображения (может быть | + | // URL-адрес |
- | ' | + | ' |
| | ||
- | // Для | + | // Для атрибута |
- | ' | + | ' |
| | ||
- | // ' | + | // ' |
- | ' | + | ' |
| | ||
- | // Ширина в пикселях или | + | // Ширина в пикселях или |
- | ' | + | ' |
| | ||
- | // Высота в пикселях или | + | // Высота в пикселях или |
- | ' | + | ' |
| | ||
- | // Следует ли кэшировать изображение (для внешних изображений)? | + | // Кэшировать |
- | ' | + | ' |
- | ); | + | ]; |
</ | </ | ||
wiki/devel/parser.1737107238.txt.gz · Последнее изменение: — vladpolskiy