§ 7.5 FB2Fix

We use cookies. Read the Privacy and Cookie Policy

§ 7.5 FB2Fix

Как следует из названия, основная задача этой утилиты — полная проверка FB2-файлов на валидность с возможностью их коррекции. Кроме того, автор, скрывшийся под претенциозным псевдонимом Gremlin II, наделил программу «талантами» работать с архивами, в том числе RAR и вложенными ZIP, использовать пользовательские спецификации XSD, транслитерировать имена файлов и переименовывать их по шаблону, заменять «непечатные» символов, автоматически конвертировать жанры из версии 2.0 в версию 2.1, и даже перекодировать книжки. Отдельным пунктом значится приведение в порядок невалидных книг из библиотеки Либрусек.

Возможна обработка как отдельных файлов, так и целых каталогов.

Утилита выполняет полную проверку на соответстие xml-файла книги спецификации (schema) FB2. Если книга не проходит проверку на валидность, FB2Fix пытается исправить ее. Это производится следующим образом. Вначале производится проверка всех тэгов. Не закрытые (или же лишенные открывающего дескриптора) тэги — закрываются. Также софтина пытается разобраться, с «висящими» в тексте символами «<» и «>» на предмет, элементы ли это тэгов или же просто огрехи работы конвертора. При этом программа, как и все «ишкуштвенные интилекты» не застрахована от ошибок. Отсюда мораль: после правки «проблемного» файла не пожалеть пару минут на сличение результата с оригиналом.

Все признанные огрехами «<» и «>» в тексте заменяются на &lt; и &gt;, как и положено по спецификации. Символы с кодами от 01 до 08 заменяются на «-», символы 0b, 0c и 0e — 0x1f на « ».

Сама утилита представляет собой консольное приложение. То есть, запуск ее возможен посредством использования командной строки («Command Prompt») с передачей рабочих параметров через нее.

Несмотря на это, для работы FB2Fix требуется наличие в системе Micro$oft .NET Framework 2.0. Также софтина может работать под Linux (с установленным Mono и пакет(ами) libmono-i18n{1,2}.0-cil).

Давайте познакомимся с FB2Fix поближе.

Скачайте и распакуйте архив в папку, Например, C:FB2TOOLSFB2FIX.

Создайте на диске (лучше в корне) две рабочие папки. Например INBOOK и OUTBOOK.

Войдите в папку FB2FIX. Для удобства, лучше все эти операции проделывать в каком-нибудь консольном файл-менеджере, например, Far Manager.

Забросьте в папку INBOOK с десяток книг FB2.

Теперь давайте запустим FB2Fix.

Вот так:

FB2Fix.exe D:INBOOK /output:D:OUTBOOK

Когда утилита отработает, загляните в папку OUTBOOK. Вы обнаружите там две папки — Bad и Good. Как нетрудно догадаться, первая предназначена для книг, которые не прошли проверку и, к тому же, их не удалось исправить. В папку Good отправляются все остальные.

Итак, алгоритм работы в общих чертах ясен. Кладем книги, нуждающиеся в проверке, в папку INBOOK и запускаем программу. Кстати, выходную папку можно и не указывать, тогда директории Bad и Good будут созданы в той же папке, где находится FB2Fix.

К сожалению, для тестирования программы мне просто неоткуда было взять подходящее количество невалидных книг, так что пришлось импровизировать. То есть создавать файлы с ошибками вручную.

Незакрытый тэг body оказался проге не по зубам. Тэги descripion и cite она «исправила», вставив закрывающий тэг в самый конец файла. И перед удаленным открывающим тэгом <p> корректор спасовал. А вот с конструкцией <strong><emphasis></strong></emphasis> программа справилась «на ура». Незакрытые тэги <stanza> <p> FB2Fix также исправил как положено. А незакрытый тэг <i> софтина просто удалила.

В то же время FB2Fix позволяет себе «не замечать» некритичные ошибки. Например, неправильно оформленные сноски, когда метка поставлена не на секцию, а на ее заголовок, или вообще абзац.

В description успешно прошедшей проверку книги добавляется строка

<custom-info info-type="fb2fix-status">Passed</custom-info>

а в случае внесения правок версия книги увеличивается на 0.1. Правда, почему-то не всегда.

При повторном прогоне все работает корректно: строка в custom-info «размножаться» не будет.

В общем, если сделать скидку на «искусственность» тестирования (ну какой такой конвертор создаст fb-шку c незакрытым body или description) то можно признать, что со своими обязанностями корректор справляется вполне успешно.

Теперь пройдемся по ключам программы. Их не так уж и много, но все же может показаться, что больше, чем нужно. Некоторые ключи имеют сокращенную форму.

Ключ /compress[+|-] (сокращенная форма /c) — позволяет разрешить/запретить сжатие книжек «на выходе» алгоритмом ZIP. По умолчанию сжатие разрешено. Таким образом

FB2Fix.exe D:INBOOK /c-

заставит FB2Fix записывать прошедшие обработку книжки в неупакованном виде.

Просматривая обработанные книжки, вы можете заметить, что заголовок книги отформатирован отступами. За эту фичу отвечает ключ /indentheader[+|-]. Как можно догадаться, по умолчанию опция включена.

Можно также заставить FB2Fix аналогично форматировать body книги. При помощи ключа /indentbody[+|-]. Само собой, со значением «+».

FB2Fix.exe D:INBOOKmybook2.fb2 /indentbody+

Как уже говорилось, версия документа, в случае внесения правок, увеличивается на 0.1. Если понадобится отключить эту опцию, то вам поможет ключ /incversion[+|-]. С модификатором «-».

Ключ /dtd:<строка> позволяет выбрать альтернативную DTD FB2. Значение по умолчанию — fb2.dtd.

Следующая интересная фича — перекодировка! По умолчанию FB2Fix сохраняет книжки, используя кодовую таблицу UTF-8. Использование ключа /encoding:<строка> заставит FB2Fix сохранять «выходные» книги в определенной кодировке. Так, например при использовании,

FB2Fix.exe D:INBOOK /encoding:windows-1251

книжки «на выходе» будут в кодировке Win-1251.

Кроме «windows-1251» поддерживаются значения «utf-8», «utf-16», а также «koi8r».

Если вам вдруг понадобится отказаться от конвертации старых жанров FB2 2.0 в 2.1 достаточно использовать ключ /mapgenres[+|-] с модификатором «-»

Между прочим, конвертация жаноров — настраиваемая. Ее конфигурация содержится в файле genrestransfer.xml. Устройство его весьма незамысловато. Каждому поджанру отведена вот такая секция.

<subgenre value="prose_history">

  <genre-descr lang="en" title="Historical Prose"/>

  <genre-descr lang="ru" title="Историческая Проза"/>

  <genre-alt value="literature_history" format="fb2.0"/>

  <genre-alt value="literature_critic" format="fb2.0"/>

</subgenre>

Понятно, что значения указанные в атрибуте value тэга genre-alt будут заменены на аналогичное значение тэга subgenre.

Можно сделать свою конфигурацию и вызывать ее при помощи ключа /genres:<строка>.

Использование ключа /validate[+|-] с модификатором «+» вынудит FB2Fix использовать для проверки книг альтернативную XSD-схему. А указать имя файла этой схемы поможет ключ /xsd:<строка>.

Следующий важный ключ — /rename[+|-]. С модификатором «+» он велит FB2Fix переименовывать файлы, причем с сортировкой. И не абы-как, а согласно установке-паттерну.

По умолчанию этот паттерн равен:

[*NLA*]*NL*[ *NM*] *NF*[ *NN*]*NL* *BN*[(*SN* - *SII*)]

Синтаксис подстановок, полностью заимствован из утилиты переименования файлов для библиотекаря FBLibrary.

Поскольку заимствование оказалось творческое, с дополнениями, приведем здесь расшифровку подстановок полностью.

*NLA*, *NFA*, *NMA* — первая буква соответственно фамилии, имени, отчества автора книги.

*NL*, *NF*, *NM*, *NN* — соответственно фамилия, имя, отчество, ник автора.

*BN* — название книги.

*SN* — название серии. Остро не хватает обработки подсерий…

*SI*, *SII*, *SIII* — номер серии. В подстановках *SII* и *SIII* этот номер приводится к двух- и трехзначному соответственно, путем добавления нулей. Т.е. номер 7 будет включен в состав имени файла как «007».

*GNR*, *GNE* — название жанра, по-русски или по-английски.

Символ «», как вы уже догадались, служит разделителем папок. А квадратные скобки объединяют фрагменты паттерна. Нет, к примеру, отчества, значит, не нужен и пробел перед ним. Нет серии — скобки не должны стать мусором в имени файла…

Само собой, можно указать пользовательский паттерн. При помощи ключа /pattern:<строка>.

К примеру, вот такой паттерн:

*NL* *NF**SN*[*SII* - ]*BN* {*NF* *NL*}

раскассирует книги в папки «фамилия-имя автора». Для серий будут созданы вложенные папки. Имя файла будет представлять собой номер-в-серии_название_{имя-фамилия автора}. Немного непривычно, но очень удобно. Особенно, учитывая ограниченнную отображаемую длину имени  файла…

Для настройки переименования имеются вот такие ключи:

/translify[+|-]. С модификатором «-» он запретит FB2Fix транслитерировать имена файлов. Т.е. если книга русскоязычная, то и имя файла будет, как полагается, кириллицей.

/upper[+|-]. С модификатором «+» указывает FB2Fix использовать только в именах файлов и папок только заглавные буквы.

/lower[+|-]. Аналогично предыдущему, но будут использоваться только строчные буквы.

/replacechar:<строка>. Заменяет символ «пробел» в именах файлов на значение <строка>. По умолчанию оно равно «_»

/maxlength:<целое число>. Ограничивает длину имени файла. По умолчанию это значение равняется -1, что, как нетрудно догадаться, отключает эту функцию.

/strict[+|-]. Включает «жесткий» режим для имен файлов. По умолчанию отключено. В этом режиме из имени удаляются все символы, кроме алфавитно-цифровых и символов /[]()<>-_*, . Между прочим, хорошая вещь. Позволяет избавиться от лишних точек в именах файлов, если, например имя автора сокращено (допустим, не Алексей, а А.).

Пару примеров на закуску. Вот эта последовательность ключей позволяет сохранять выходные файлы в «альдебарановском» стандарте (фамилия_имя_название)

FB2Fix.exe C:INBK /lower+ /strict+ /rename+ /pattern:"*NL* *NF* *BN*"

А эта — в старом стандарте Fenzin (Фамилия_Название_(Серия-№)

FB2Fix.exe C:INBK /rename+ /pattern:"*NL* *BN*[ (*SN* - *SI*)]"

Следующая группа ключей относится к протоколированию работы программы. Ключ /logfile:<строка> указывает имя файла для текстового протокола (лога). Если такой файл ужет существует, протокол будет дописан в его конец. А ключ /loglevel:<фиксированная строка> (короткая форма /l). определяет тип сообщений выводимых в этот файл. Предусмотрены варианты Off (никакие), Critical (критические), Error (ошибки), Warning (предупреждения), Information (нормальные) и Verbose.

Следующий у нас — ключ /recurse[+|-] (короткая форма /r). Использованный с модификатором «-» он запретит программе заглядывать в поддиректории, если таковые во входной папке имеются.

Ключ /force[+|-], употребленный с модификатором «+» заставит FB2 повторно обрабатывать файлы, уже прошедшие проверку.

C ключом /output:<строка>, указывающем программе путь для выходных файлов, вы познакомились в самом начале. Добавлю лишь, что он имеет короткую форму /o.

А если во входной папке имеется какой-нибудь файл или  папка, трогать которые не нужно, их достаточно указать ключу /exclude:<строка>. Ключ имеет короткую форму — /e.

И последнее. Строку с ключами можно записать в так называемый «файл ответов» (response file). И потом вызывать ее при помощи ключевого символа @.

Отмечу что имеется «файл ответов» по умолчанию — fb2fix.rsp. Ключи-опции, внесенные туда должны исполняться автоматически при любом вызове программы.

Должны — но не исполняются. И заявленный в комментариях в начале fb2fix.rsp ключ /noconfig также не работает. Очевидно, в последней версии эта фича попросту отключена. Файл fb2fix.rsp отныне вызывается только через «@».

И приоритеты более не работают. Если в .rsp-файле прописано «/translify-», а в командную строку добавить «/translify+» программа выругается, дескать, дублирвание ключей и выплюнет на экран содержимое встроенного help.

В свете этих фактов становится непонятно, для чего тогда большинство ключей имеют два аргумента «+» и «-». Исправно работающих, между прочим.

Приверженцы графического интерфейса, могут использовать специальную программу-оболочку — shell, которая избавит их от необходимости вручную прописывать длиннющие заклинания ключей и модификаторов.

При первом запуске оболочка запросит у вас местонахождение исполняемого файла FB2Fix, а также предложит настроить несколько базовых опций, назначение которых ясно из самих названий. Настройки, предложенные по умолчанию, вполне годятся для работы. Можно лишь поставить галочку возле «Разрешить ручное редактирование командной строки». Кстати, повторное изменение базовых опций не предусмотрено. Это возможно лишь после удаления файла FFShell.ini.

Выбор исходной папки с книгами осуществляется простым щелчком мыши в левом поле рабочего окна. При помощи Shift и Ctrl можно выбрать сразу несколько папок.

Справа отображается содержимое папок Good и Bad.

Под «входным» и «выходными» полями видна подготовленная оболочкой командная строка. Кнопка с зеленым треугольничком запускает ее на исполнение.

Левее кнопки пуска притулилась кнопка настроек. Щелкнув по ней, мы вызовем окно, с большим количеством опций, каждая из которых эквивалентна определенному ключу FB2Fix (предусмотрена даже всплывающая подсказка). Любая поставленная галочка тут же добавляет соответствующий ключ в командную строку. Здесь же можно сохранить настройки в файл .rsp.

Резюме. Если не считать правку книг, созданных с помощью злосчастного Librusec toolkit, можно с уверенностью сказать, что областью применения FB2Fix станет проверка и исправление книг, созданных при помощи различных «самоклепанных» конверторов. Наподобие описанных в § 3.7. Кроме того, софтина неплохо смотрится  в качестве сортировщика-перекодировщика, хотя до скриптовых настроек booki ей, конечно, далековато. Тем паче, что упомянутый booki до сих пор не умеет именовать файлы латиницей.