ru:devel:parser
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версияПоследняя версияСледующая версия справа и слева | ||
ru:devel:parser [2015-10-23 12:50] – [Обсуждение] 178.213.240.13 | ru:devel:parser [2016-07-27 23:03] – [Обработчик] 93.74.81.132 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | ====== Парсер «ДокуВики» ====== | + | ====== Парсер «Докувики» ====== |
- | В этом документе излагаются детали функционирования парсера «[[ru: | + | В этом документе излагаются детали функционирования парсера «[[ru: |
===== Обзор ===== | ===== Обзор ===== | ||
- | Парсер разбивает процесс трансформации исходного документа «ДокуВики» в финальный выходной документ (обычно XHTML) на дискретные стадии. Каждая стадия представлена одним или несколькими PHP-классами. | + | Парсер разбивает процесс трансформации исходного документа «Докувики» в финальный выходной документ (обычно XHTML) на дискретные стадии. Каждая стадия представлена одним или несколькими PHP-классами. |
В общем рассмотрении этими элементами являются; | В общем рассмотрении этими элементами являются; | ||
- | - Лексический анализатор((__L__exer относится к классу '' | + | - Лексический анализатор((__L__exer относится к классу '' |
- Обработчик((__H__andler относится к классу '' | - Обработчик((__H__andler относится к классу '' | ||
- | - Собственно парсер((__P__arser относится к классу '' | + | - Собственно парсер((__P__arser относится к классу '' |
- Преобразователь((__R__enderer (:!: от «to render» //в значении// | - Преобразователь((__R__enderer (:!: от «to render» //в значении// | ||
Строка 62: | Строка 62: | ||
=== Необходимость в состояниях === | === Необходимость в состояниях === | ||
- | Синтаксис вики, используемый в «ДокуВики», содержит разметку, | + | Синтаксис вики, используемый в «Докувики», содержит разметку, |
Анализатор обеспечивает «осведомлённость о состояниях», | Анализатор обеспечивает «осведомлённость о состояниях», | ||
Строка 112: | Строка 112: | ||
Используется, | Используется, | ||
- | Это наиболее наглядно видно из разбора парсером синтаксиса списков. Синтаксис списков выглядит в «ДокуВики» следующим образом; | + | Это наиболее наглядно видно из разбора парсером синтаксиса списков. Синтаксис списков выглядит в «Докувики» следующим образом; |
< | < | ||
Строка 145: | Строка 145: | ||
== mapHandler == | == mapHandler == | ||
- | Позволяет особому режиму быть прикреплённым к методу с разными наименованиями в обработчике. Это может быть полезным, | + | Позволяет особому режиму быть прикреплённым к методу с разными наименованиями в обработчике. Это может быть полезным, |
<code php> | <code php> | ||
Строка 165: | Строка 165: | ||
=== Синтаксические ошибки и состояния === | === Синтаксические ошибки и состояния === | ||
- | Для предотвращение «плохо форматируемой» (особенно при пропуске закрывающих тэгов) разметки, | + | Для предотвращение «плохо форматируемой» (особенно при пропуске закрывающих тэгов) разметки, |
<code php> | <code php> | ||
Строка 187: | Строка 187: | ||
* '' | * '' | ||
* '' | * '' | ||
- | * '' | + | * '' |
* '' | * '' | ||
* '' | * '' | ||
Строка 221: | Строка 221: | ||
</ | </ | ||
- | **Замечание: | + | **Замечание: |
Аргументы, | Аргументы, | ||
Строка 330: | Строка 330: | ||
-'' | -'' | ||
-'' | -'' | ||
- | -'' | + | -'' |
-'' | -'' | ||
-'' | -'' | ||
Строка 346: | Строка 346: | ||
==== Парсер ==== | ==== Парсер ==== | ||
- | Парсер играет роль переднего рубежа для внешнего кода и устанавливает для лексического анализатора паттерны и режимы, | + | Парсер играет роль переднего рубежа для внешнего кода и устанавливает для лексического анализатора паттерны и режимы, |
Использование парсера в общем случае выглядит следущим образом: | Использование парсера в общем случае выглядит следущим образом: | ||
Строка 869: | Строка 869: | ||
**Замечание: | **Замечание: | ||
- | Пример массив инструкций страницы с описанием [[ru:wiki: | + | Пример массив инструкций страницы с описанием [[wiki: |
==== Преобразователь ==== | ==== Преобразователь ==== | ||
Строка 903: | Строка 903: | ||
Он используется для документирования преобразователя, | Он используется для документирования преобразователя, | ||
- | Основной принцип того, как инструкции, | + | Основной принцип того, как инструкции, |
Во фрагменте преобразователя, | Во фрагменте преобразователя, | ||
Строка 994: | Строка 994: | ||
==== Основной вызов ==== | ==== Основной вызов ==== | ||
- | Чтобы вызвать парсер со // | + | Чтобы вызвать парсер со // |
<code php> | <code php> | ||
Строка 1059: | Строка 1059: | ||
$Renderer = & new Doku_Renderer_XHTML(); | $Renderer = & new Doku_Renderer_XHTML(); | ||
- | # Здесь загрузите в преобразователь данные типа смайлов | + | # Здесь загрузите в преобразователь данные |
// Проходимся по всем инструкциям | // Проходимся по всем инструкциям | ||
Строка 1086: | Строка 1086: | ||
$Parser-> | $Parser-> | ||
- | // Загружаем режимы, | + | // Загружаем режимы, |
+ | // которая может быть принята за заголовок | ||
$Parser-> | $Parser-> | ||
$Parser-> | $Parser-> | ||
Строка 1110: | Строка 1111: | ||
$instructions = $Parser-> | $instructions = $Parser-> | ||
- | // Используем эти переменные, | + | // Используем эти переменные, |
+ | // находимся ли мы внутри необходимого фрагмента | ||
$inSection = FALSE; | $inSection = FALSE; | ||
$startPos = 0; | $startPos = 0; | ||
Строка 1148: | Строка 1150: | ||
==== Управление входными файлами с данными в шаблонах ==== | ==== Управление входными файлами с данными в шаблонах ==== | ||
- | «ДокуВики» хранит части некоторых шаблонов во внешних файлах (например, | + | «Докувики» хранит части некоторых шаблонов во внешних файлах (например, |
Каждый подходящий режим принимает простой список элементов, | Каждый подходящий режим принимает простой список элементов, | ||
Строка 1225: | Строка 1227: | ||
</ | </ | ||
- | **Замечание: | + | **Замечание: |
==== Проверка ссылок на спам ==== | ==== Проверка ссылок на спам ==== | ||
Строка 1407: | Строка 1409: | ||
==== Добавление синтаксической конструкции ==== | ==== Добавление синтаксической конструкции ==== | ||
- | **Предупреждение: | + | **Предупреждение: |
Простая задача по модификации парсера: | Простая задача по модификации парсера: | ||
Строка 1471: | Строка 1473: | ||
// ... | // ... | ||
| | ||
- | // $match - строка, | + | // $match - строка, |
+ | // | ||
// $state идентифицирует тип совпадения (см. выше) | // $state идентифицирует тип совпадения (см. выше) | ||
// $pos - индекс байта первого символа совпадения в исходном документе | // $pos - индекс байта первого символа совпадения в исходном документе | ||
Строка 1493: | Строка 1496: | ||
$this-> | $this-> | ||
| | ||
- | // Если у закладки нет годного имени, пропускаем | + | // Если у закладки нет годного имени, |
- | // through unmodified as plain text (cdata) | + | // |
} else { | } else { | ||
| | ||
Строка 1748: | Строка 1751: | ||
Этот синтаксис позволяет искать страницы вики и находить вопросы, | Этот синтаксис позволяет искать страницы вики и находить вопросы, | ||
- | Особенностью данного синтаксиса является то, что он должен отображаться в отдельном блоке документа (например, | + | Особенностью данного синтаксиса является то, что он должен отображаться в отдельном блоке документа (например, |
Режим парсера для этого синтаксиса может быть таким: | Режим парсера для этого синтаксиса может быть таким: | ||
Строка 1993: | Строка 1996: | ||
[[http:// | [[http:// | ||
- | Для парсера «ДокуВики» тесты проводились по всем внедряемым синтаксическим конструкциям, | + | Для парсера «Докувики» тесты проводились по всем внедряемым синтаксическим конструкциям, |
- | Чтобы запустить тесты, вам следует модифицировать файл '' | + | Чтобы запустить тесты, вам следует модифицировать файл '' |
Некоторые заметки и рекомендации: | Некоторые заметки и рекомендации: | ||
Строка 2127: | Строка 2130: | ||
После таблицы | После таблицы | ||
- | Без сканирования текста множества раз (некая разновидность «предварительных» операций, | + | Без сканирования текста множества раз (некая разновидность «предварительных» операций, |
==== Проблемы списков, | ==== Проблемы списков, | ||
Строка 2171: | Строка 2174: | ||
</ | </ | ||
- | Если бы поведение было бы таким же, как в оригинальном парсере «ДокуВики», преобразование было бы таким: | + | Если бы поведение было бы таким же, как в оригинальном парсере «Докувики», преобразование было бы таким: |
До заголовка есть | До заголовка есть | ||
Строка 2206: | Строка 2209: | ||
===== Обсуждение ===== | ===== Обсуждение ===== | ||
- | Спасибо за перевод! :-) :-* | + | Спасибо за перевод! :-) |
ru/devel/parser.txt · Последнее изменение: 2016-07-27 23:05 — 93.74.81.132