К сожалению, для тестирования программы мне просто неоткуда было взять подходящее количество невалидных книг, так что пришлось импровизировать. То есть создавать файлы с ошибками вручную.
Незакрытый тэг 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 сохраняет книжки в Использование ключа /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.