Набла:Парсинг файлов «Гаранта»
Файл правил[]
Файл с правилами рассчитан на то, что он может быть единым для большого числа документов.
Общая структура файла правил[]
Файл обрабатывается построчно, пустые строки игнорируются. Игнорируются также строки комментариев и комментарии в конце строк (см. #Комментарии).
Файл рассматривается как последовательность разделов, каждый из которых начинается с заголовка — строки вида
- =КлючРаздела
Строки раздела имеют вид:
- КлючПараметра ЗначениеПараметра
или, в некоторых случаях:
- Спецификатор>КлючПараметра ЗначениеПараметра
- СпецификаторФормата:КлючПараметра ЗначениеПараметра
- СпецификаторФормата:Спецификатор>КлючПараметра ЗначениеПараметра
Регистр символов в ключах обычно неважен. Ключи распознаются по первым буквам (обычно по двум).
Значение параметра чувствительно к регистру, если оно заключено в двойные кавычки ("""). Двойные кавычки необходимы также в тех случаях, когда значение параметра содержит не только буквенно-цифровые символы.
В некоторых разделах, где ключ параметра может быть произвольным значением, для его записи применяются те же правила, что и для значения параметра (заключение ключа двойные кавычки позволяет расширить набор символов и сохранять регистр).
Спецификатор формата[]
Спецификатор формата определяет, что правило применимо лишь для определенных форматов выходного файла. Он имеет вид последовательности символов «s» (справочник), «е» (энциклопедия), «h» (сайт справочника), «c» (сайт клерка), «f» (fb2).
Комментарии[]
Символы в строке, расположенные после символов «#», «;», «//», игнорируются.
Раздел «=НАСТРОЙКИ»[]
Раздел предназначен для задания самых общих параметров парсера. Как правило, эти параметры задаются раз и навсегда.
| команда | назначение | значение по умолчанию | пример |
|---|---|---|---|
| префикс | имя пространства имен вики, в котором будут размещаться документы. Двоеточие после имени пространства можно не указывать. | НПА | префикс Документ |
| участник | имя участника, который указывается в качестве автора текста. | WikiSysop | участник Dza |
| название | название сайта, указываемое в заголовке файла импорта в вики. Назначение названия в этом файле неизвестно. | бессмысленное | название "Русская Википедия" |
| адрес | адрес (URL) сайта, указываемый в заголовке файла импорта. Назначение URL в этом файле неизвестно. | бессмысленное | адрес "http://ru.wikipedia.org" |
| журнал | определяет, открывать ли окно с журналом после завершения обработки. Возможные значения — «да» и «нет». По умолчанию журнал открывается. Для открытия используется программа, ассоциированная с расширением «.log» в MS Windows (обычно это «Блокнот»). | да | журнал нет |
| отладка | задает номер строки исходного файла, с обработки которой включается режим подробного протоколирования. Действует только при установке соответствующего флага в диалоге. | 1 | - |
| отладка таблиц | включает выдачу информации о таблицах при включенном режиме подробного протоколирования | нет | - |
| формат | формат выходного файла (допустимые значения «справочник», «энциклопедия», «html», «klerk», «fb2». | справочник | формат энц |
Раздел «=ДОКУМЕНТ»[]
Для каждого обрабатываемого документа в общем файле правил должен иметься раздел «=Документ». Ключевым параметром, по которому устанавливается связь между файлом «Гаранта» и относящимися к нему описаниями в общем файле правил, является уникальный номер документа, который задается в файле «Гарант» в реквизите <p:Handle v="номер"> блока <c:Document>. (Парсер сообщает этот номер при попытке обработки документа, для которого раздела «=Документ» не существует.)
Альтернативным методом, не требующим выяснения уникального номера документа, является создание частного файла правил, который устанавливает связь между документом и применимыми к нему правилами по имени файла с документом (заменой расширения на «.rules»).
| команда | назначение | пример |
|---|---|---|
| номер | уникальный номер документа в системе «Гарант» (см. выше). Допускается многократное использование команды (так как «Гарант» использует разные номера для разных редакций документа). | номер 10155678 |
| обозначение | уникальное обозначение документа, которое может использоваться вместо номера для ссылки на документ в правилах | обозначение ГК |
| группа | обозначение, которое может применяться в правилах для ссылки на несколько документов с одинаковыми свойствами (то есть одно и то же обозначение группы может использоваться у нескольких документов). Документ может относиться к нескольким группам (в этом случае команда «группа» должна быть указана несколько раз), либо не относиться ни к одной. | группа законы |
| название | название документа, которое используется при именовании страниц. Использование названия для вики-страниц накладывает ограничения на максимальную длину строки (254 байта, что с учетом Юникода означает 127 русских букв); при необходимости здесь указывается «урезанное» название, а в команде «полное» — официальное название документа | название "О трудовых книжках (постановление Правительства РФ от 16.04.2003 № 225)" |
| полное | полное официальное название документа (если оно по техническим причинам не могла быть указано в команде «название»). По умолчанию совпадает с указанным в команде «название». | полное "Об утверждении форм и требований к оформлению документов, используемых при государственной регистрации юридических лиц, а также физических лиц в качестве индивидуальных предпринимателей (постановление Правительства РФ от 19.06.2002 № 439)" |
Раздел «=КОРРЕКТИРОВКИ»[]
- спецификаторы применения
- заголовок id
- текст id
- id альтернативный текст заголовка
- что на-что
- блок id — превращает блок из промежуточного в структурный
- id требуют индивидуального спецификатора применения (для)
Раздел «=СТРУКТУРА»[]
| команда | назначение | пример |
|---|---|---|
| обозначение | идентификатор раздела, используемый при ссылках на него. Параметр необязательный, используется лишь в связи со ссылками из других разделов «=СТРУКТУРА» (в команде «подсчет») | обозначение Статьи |
| для | номер документа (обозначение документа, обозначение группы), к которому применим раздел; команда может использоваться многократно | для ГК |
| кроме | номер документа (обозначение документа, обозначение группы), к которому неприменим раздел; команда может использоваться многократно | кроме КоАП |
| уровень[1] | уровни заголовков, к которым применим документ (в формате набора цифр от1 до 9, не разделенных никакими знаками, включая пробелы) | уровень 23456789 |
| раздел[1] | наименование раздела документа, внутри которого применимо данное правило | раздел "Порядок применения плана счетов бюджетного учета" |
| шаблон | регулярное выражение, которое сопоставляется с текстом заголовка в документе. Заголовки перед сопоставлением с шаблоном нормализуются (HTML-entity преобразуются в символы, неразрывные пробелы и переводы строки заменяются на обычные пробелы) | шаблон "Статья ([\d]+(\.[\d]+)*(-\d)?)(\.\s*|\s+)([^\d].+)" # в КоАП есть статья 19.7.5-1 :-) |
| номер | заготовка нумерационной части заголовка, использующая результаты сопоставления заголовка с регулярным выражением из команды «шаблон» (в качестве символов подстановки используются $1..$9) | номер "Статья $1" |
| название | заготовка именной части заголовка, использующая результаты сопоставления заголовка с регулярным выражением из команды «шаблон» (в качестве символов подстановки используются $1..$9) | название "$5" |
| счетчик | заготовка получаемого из заголовка собственно номера (отличается от «нумерационной части» отсутствием родового слова вроде «глава» или «статья»), использующая результаты сопоставления заголовка с регулярным выражением из команды «шаблон» (в качестве символов подстановки используются $1..$9) | счетчик "$1" |
| страница[1] | признак того, что данный заголовок приводит формирует новую вики-страницу. Возможные значения — «да» или «нет». По умолчанию «нет» | страница да |
| заголовок[1] | заготовка заголовка страницы, использующая следующие метасимволы: $N2..$N9 — Х |
|
| оглавление[1] | ||
| один или одна | ||
| много | ||
| подсчет[1] | ||
| текст | ||
- — «для УказаниеНаДокумент» — задает номер документа (обозначение документа, обозначение группы), к которому применим раздел; команда может использоваться многократно;
- — «кроме НомерДокумента» — задает номер документа (обозначение документа, обозначение группы), к которому неприменим раздел; команда может использоваться многократно;
- — «обозначение ОбозначениеПравила» — идентификатор правила, используемый при ссылках на него
- — «уровень НомераУровней» — задает уровни заголовков, к которым применим документ (в формате набора цифр от1 до 9, не разделенных никакими знаками, включая пробелы)
- — «раздел НазваниеРаздела» — применять правило только к разделу с указанным именем (??? номером???) или его детям.
- — «шаблон ШаблонРазбора» — регулярное выражение, которое сопоставляется с текстом заголовка в документе. Используются нормализованные заголовки (без HTML-entity и с заменой неразрывных пробелов и переводов строки на обычные пробелы)
- — «номер ШаблонРезультата» — нумерационная часть по результатам разбора заголовка регулярным выражением (подстановки — $x)
- — «название ШаблонРезультата» — именная часть по результатам разбора заголовка регулярным выражением (подстановки — $x)
- — «страница Параметр» — допускаются значения параметра «да» или «нет» — создавать ли при появлении такого заголовка новую страницу вики
- — «заголовок ШаблонЗаголовка» — специальный образец для формирования заголовка страницы; обязателен при «страница новая»
- — «оглавление Параметр» — Параметр означает самый высокий уровень оглавления, куда включается данный заголовок; по умолчанию 1 (то есть присутствует во всех оглавлениях)
В ШаблонеЗаголовка могут использоваться подстановочные переменные $Nx, $Ty и $Sх (x=2..9, y=1..9), обозначающие соответственно нумерационную часть заголовка соответствующего уровня, именную часть и последовательность нумерационных частей уровней (с указанного до текущего; разделяются двоеточиями). «9» всегда означает текущий уровень. Дополнительно есть переменная $H0 — заголовок вышестоящей страницы.
У параметров «уровень», «заголовок», «страница», «оглавление» допускаются спецификаторы
Для сопоставления с шаблоном текст заголовка документа нормализуется (переводы строки и неразрывные пробелы заменяются пробелами)
ДОБАВЛЯЕМ
- подсчет ОбозначениеПравила — указанное правило будет использоваться для отбора показываемого диапазона номеров во всех нижестоящих разделах (типично «подсчет СТАТЬИ»). Подсчет должен допускать спецификатор
- счетчик ШаблонРезультата — отличается от параметра «номер» отсутствием родового слова (то есть это действительно только номер). Параметр обязателен, если на это правило ссылаются из параметра «подсчет»
- одно ЕДЧисло — «ст.» — для построения диапазонов
- много МнЧисло — «ст.ст.» — для построения диапазонов
Раздел «=»[]
| команда | назначение | пример |
|---|---|---|
Раздел «=»[]
| команда | назначение | пример |
|---|---|---|
Раздел «=СТРУКТУРА»[]
# Раздел "=НАСТРОЙКИ" # предназначен для задания общих параметров # Параметры # — "префикс ИмяПространства" — задает имя пространства для документов (без двоеточия) # — "участник ИмяУчастника" — имя, которое указывается в качестве автора текста # — "название НазваниеСайта" — текстовая строка - имя сайта (для заголовка импорта) # — "адрес АдресСайта" — текстовая строка - URL сайта (для заголовка импорта) # — "отладка да" - принудительный режим подробного вывода # — "журнал ДаНет" — открытие файла журнала при завершении обработки # Раздел "=ДОКУМЕНТ" # Описывает параметры конкретного документа # Параметры # — "номер НомерДокумента" — задает номер документа, к которому относится раздел # — "обозначение ОбозначениеДокумента" — обозначение, которое может использоваться вместо номера в последующих разделах # - "название НазваниеДокумента" # — "полное ПолноеНазвание" # — "группа ОбозначениеГруппы" - обозначение, которое может применяться вместо номера для нескольких документов; команда может использоваться многократно. # Раздел "=СТРУКТУРА" # предназначен для описания правил разбора заголовков в документе # Параметры # — "для УказаниеНаДокумент" — задает номер документа (обозначение документа, обозначение группы), к которому применим раздел; команда может использоваться многократно; # — "кроме НомерДокумента" — задает номер документа (обозначение документа, обозначение группы), к которому неприменим раздел; команда может использоваться многократно; # — "уровень НомераУровней" — задает уровни заголовков, к которым применим документ (в формате набора цифр от1 до 9, не разделенных никакими знаками, включая пробелы) # — "образец ШаблонРазбора" — регулярное выражение, которое сопоставляется с текстом заголовка в документе. Используются нормализованные заголовки (без HTML-entity и с заменой неразрывных пробелов и переводов строки на обычные пробелы) # — "номер ШаблонРезультата" — нумерационная часть по результатам разбора заголовка регулярным выражением (подстановки - $x) # — "название ШаблонРезультата" — именная часть по результатам разбора заголовка регулярным выражением (подстановки - $x) # — "извлечь ШаблонИзвлечения" — регулярное выражение, с которым сопоставляется название блока "p:ShortName", проставляемое редакторами Гаранта. Первый результат сопоставления ($1) # будет толковаться как созданный редакторами диапазон номеров входящих в раздел статей/пунктов. # — "страница Параметр" — допускаются значения параметра "да" или "нет" — создавать ли при появлении такого заголовка новую страницу вики # — "заголовок ШаблонЗаголовка" — специальный образец для формирования заголовка страницы; обязателен при "страница новая" # - "оглавление Параметр" - Параметр означает самый высокий уровень оглавления, куда включается данный заголовок; по умолчанию 1 (т.е. присутствует во всех оглавлениях) # В ШаблонеЗаголовка могут использоваться подстановочные переменные $Nx, $Ty и $Sх (x=2..9, y=1..9), обозначающие соответственно нумерационную часть заголовка соответствующего уровня, # именную часть и последовательность нумерационных частей уровней (с указанного до текущего; разделяются двоеточиями). "9" всегда означает текущий уровень. Дополнительно есть переменная # $H0 — заголовок вышестоящей страницы. # У параметров "уровень", "заголовок", "страница", "оглавление" допускаются спецификаторы # Для сопоставления с шаблоном текст заголовка документа нормализуется (переводы строки и неразрывные пробелы заменяются пробелами) # Раздел "=КОРРЕКТИРОВКИ" # предназначен для корректировки стилей текстовых абзацев # Параметры # — "для НомерДокумента" — задает номер документа, к которому применим раздел # — "заголовок ИдентификаторАбзаца" — указывает идентификатор абзаца, который должен рассматриваться как заголовок; команда может использоваться многократно # — "текст ИдентификаторАбзаца" — указывает идентификатор абзаца, который должен рассматриваться как текст, а не как заголовок (сохраняется форматирование, но не учитывается в иерархии); # команда может использоваться многократно # — "ЗаменяемыйТекст ЗаменяющийТекст" — используется для подстановки объектов (формул). Команда может использоваться многократно # Раздел "=СОКРАЩЕНИЯ" # предназначен для корректировки избыточно длинных названий страниц # Параметры # — "для НомерДокумента" — задает номер документа, к которому применим раздел # — "НастоящееНазвание СокращенноеНазвание". Команда может использоваться многократно. Замечание: "Настоящее" название проверяется после замены HTML-entity и применения правил раздела "Оформление", сокращенное название также должно быть оформлено уже правильно. Попытки замен делаются поочередно по отношению к нумерационной и именной части названия. # Раздел "=ОФОРМЛЕНИЕ" # предназначен для корректировки пунктуации # Параметры: # — "ЗаменяемыйТекст ЗаменяющийТекст" — регулярное выражение и замена для исправления пунктуации (подстановки - \x) # возможно использование спецификатора
Проблемы парсера[]
При работе с HTML OpenOffice при двух последовательных pre (/pre — pre) автоматически добавляется отступ 0.5 см после абзаца. Если делать pre на весь текст, то такого нет, но формировать такое неудобно. Пока оставил as is
Рисунки[]
Применяем декодер base64, получается файл формата png.