Артефакт

Комплектация библиотеки файлами FB2 / 30 ноября 2020 г.

Постановка задачи

В стародавние времена основным форматом библиотеки был назначен .doc. Это, с моей точки зрения, большой ошибкой не было (кроме того, FBReaderу вообще всё равно, какие файлы открывать), а вот то, что в качестве формата архивов я выбрал .rar, оказалось не лучшим решением. В любом случае надо как-то осовремениваться, а заодно исправлять недочёты и неоднородности в системе, коих масса.

Что больше всего изменилось за это время, так это сам интернет. Он перестал быть иногда подключаемой сетью, из которой можно было что-то стянуть и потом употребить под одеялом: он превратился в постоянно используемый сервис, доступный всегда и везде, к которому можно обращаться по мере необходимости. Когда-то мегабайтную песню в формате MP3 качали по дайал-апу неделями, теперь фильм скачивают за секунды. Но это так, лирика, однако же она наводит на мысль о том, что функцию чтения в онлайне в библиотеке сделать стоит. Теперь это имеет смысл. После того, разумеется, как добавим .fb2.

Новым правилом устанавливается следующее: все имеющиеся .docи должны быть переведены в .docx, и к каждому должен прилагаться файл .fb2.

Задача «переезда» авторских разделов в новый формат сводится к следующему:

  1. Берём все присутствующие в библиотеке архивы с текстами текущего автора, разархивируем и правильно их именуем (см. ниже).
  2. Конвертируем все документы в .docx, если они ещё не там.
  3. Комплектуем их текстами в формате .fb2.
  4. Архивируем всё обратно.
  5. Редактируем авторские конфиги. Что это такое, объясню ниже.

Для того, чтобы справиться с этими 5 этапами, нужно запастись малой толикой терпения и внимательности, инсталлировать пару программ, а также приобрести кучу полезных для работы с текстом навыков и сформировать некоторое количество предназначенных для автоматизации процесса инструментов. Если желания всерьёз заниматься подобной ерундой у вас не наблюдается, давайте расстанемся сейчас, а не через месяц, когда выяснится, что мотать друг другу нервы мы умеем, а работать вместе — нет.

Кстати, вы можете не только добавить на страницу любимого автора .fb2-версии имеющихся текстов, но и поискать недостающие его труды, найти переводы на другие языки (это как раз и есть профиль библиотеки, если вдруг кто-то не помнит), составить краткую биографию. Кто-то будет против? Только не я :) Скажите, что хотите этим заняться, и я объясню, что надо делать. Могу вообще сделать вас ведущим авторской страницы, развлекайтесь как пожелаете. Ну, в разумных пределах, конечно! :)

Инструменты

MS Office + VBA

Думаю, это есть у всех. Если вы привыкли к альтернативным офисными программам, можно сразу попрощаться, т. к. я очень сомневаюсь, что вы захотите делать всё вручную или переписывать макросы на другой языке. Я пользуюсь Office 2007, на который у меня есть лицензия, и обновлять который пока не собираюсь. Заодно могу порекомендовать замечательную китайскую программку Classic Menu for Office 2007, которую можно или купить тут или скачать с любого трекера. Если кому и нравится Blue ribbon, то это пока не я, хотя, конечно, всё дело в привычке.

Python

Язык программирования, на который я только что переписал библиотечные скрипты (раньше все они были на Perlе). Качать отсюда. Жмёте на жёлтую кнопку «Download Python 3.9.0», скачиваете инсталлятор, запускаете его, включаете галочки «Install launcher for all users» и «Add Python to Path», после чего выбираете «Customize installation». В качестве каталога для установки выбираете «C:\Python39\» и не забываете указать, что нужно поставить менеджер пакетов pip. После установки поочерёдно запускаете в командной строке

python -m pip install --upgrade pip
pip install pypiwin32
pip install unidecode

Это — те пакеты, которые на данный момент используются в библоотечных скриптах и которые не входят в стандартную поставку Python.

Calibre

Программа для каталогизации и конвертирования электронных книг. Качать отсюда. Полезная штука.

WinRAR

Архиватор. Удобен, бесплатен, позволяет удобно архивировать в том числе и .zip-ы. Качать отсюда. Можно и без него, но я в дальнейшем буду ссылаться именно на его особенности. Опять же, часть книжек упакована в .rar, от этого надо уходить.

Мои скрипты и макросы

Предупреждаю сразу, Я НЕ ПРОГРАММИСТ, поэтому комментировать мой код не нужно, если только вы не заметили принципиальную ошибку. Да, он собран из кусков сомнительного происхождения, состоит из говна и палок, но он РАБОТАЕТ и меня вполне устраивает. Пуристам рекомендую переписать всё по науке (на питоне, конечно) и прислать мне, жирное и увесистое спасибо гарантирую.

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

Скрипты. Как установить: разархивировать в какую-то папку с удобным названием и местоположением. Кириллицы и пробелов в путях нам не надо, C:\Users\Вася и так далее работать, скорее всего, не будет. C:\Scripts звучит гораздо лучше. Антивирус может орать что-то неприличное, но это неважно, вирусов в коде нет, можете мне поверить :) Windows Defender может тоже возмутиться и сослать скрипты в карантин, откуда они возвращаются по allow.

Макросы. Как установить: если предположить, что у вас в Office нет ни одного самодельного макроса, то дорожка примерно следующая. Идёте в Tools | Macro | Record Macro (или как там оно звучит в новом интерфейсе: я не в курсе, к сожалению), соглашаетесь с именем нового макроса (по умолчанию Macro1, хотя при желании его можно как угодно менять), совершаете пару бессмысленных действий (Select all или что-то похожее: важно, чтобы макрос Macro1 всё-таки в каком-то виде записался, если ничего не делать — он не появится), после чего делаете Tools | Macro | Stop recording. Открываем в блокноте файл macro.txt, переключаем раскладку клавиатуры на русский язык (это важно!), открываем Word, если он был закрыт, идём в Tools | Macro | Macros, выделяем там одинокий Macro1 и жмём Edit. Открывается окошко VBA. В нём тоже обязательно переключаемся на русский (это важно!), идём назад в блокнот, там выделяем всё (Ctrl + A, если вы вдруг забыли эту комбинацию) и нажимаем Ctrl + C (скопировать), в окошке с VBA тоже всё выделяем и жмём Ctrl + V (вставить). После этого нажимаем на иконку дискеты для сохранения (ну, или Ctrl + S) и закрываем всё открытое, процедура завершена успешно. Если теперь в Tools | Macro | Macros вы увидите длинный список макросов с подозрительными названиями, всё в порядке. Впрочем, попробуйте запустить какой-то макрос: если вылезет окошко с предупреждением о запрете запуска чего-нибудь в вашей системе, надо изменить настройки безопасности, ссылка на соответствующий пункт меню будет прямо в этом окошке. Вроде бы всё.

Процесс

1. Скачиваем от меня все файлы выбранного автора и файл конфигурации. Скачиваем из доступных вам источников недостающие файлы (формат .fb2). Говорю сразу, угрызений совести по поводу «воровства» файлов с разных полезных сайтов у меня нет, поскольку в большинстве нынешних библиотек есть множество книжек, утащенных с Артефакта.

2. Извлекаем все файлы из архивов, можно сразу в папку со скриптами. Если есть WinRAR, выделяем все архивы и в контекстном меню выбираем Extract here. Сами архивы удаляем. Лучше сразу сделать резервную копию во вложенную папку _backup (подчёркивание нужно для того, чтобы папка была всегда сверху в рабочей директории).

3. Смотрим на названия файлов. Должно быть что-то вроде «Автор Авторов -- Книга книжкина.doc». Разделитель — строго два дефиса и пробелы (это важно для работы скриптов), если автор где-то дан на другом языке или транслитом — переименуйте по-русски, а в название текста лучше впечатать нормальное тире, если оно там нужно (Alt + 0151), нормальные кавычки... и вообще см. третий абзац с конца статьи. Далее запускаем скрипт _cnv.py, он конвертирует документы .doc (а также .txt и .rtf) в новый формат .docx, а заодно прописывает автора и название в свойства документов Word, это особенно важно, если вы потом захотите конвертировать текст в .fb2 при помощью Calibre. Имейте в виду, что вордовские макросы уже должны присутствовать в системе, иначе скрипт выдаст ошибку и закроется: дело в том, что он запускает Word и прогоняет в нём пару макросов, а обработка ошибок по факту отсутствия макросов пока не сделана. Да, и если вдруг файл .doc или сам архив оказались повреждёнными, можно заменить книжку на версию из Флибусты, но есть нюанс: в этом случае предварительно нужно открыть .rtf и сделать так, чтобы первым абзацем стояло название текста, а вторым имя автора, иначе свойства документа пропишутся неправильно. После того, как конвертация закончена, было бы неплохо проверить, на месте ли метаданные и верны ли они (File | View document properties).

4. Внимательно смотрим на полученные файлы .docx и исправляем их имена, если это необходимо. Имя/фамилия автора, пробел, два дефиса, пробел, название текста. Названия можно ёфицировать, если есть желание: по крайней мере, я так делаю. Если название заканчивается многоточием, всего там должно стоять 4 точки (три точки одним символом, как это сейчас модно, ни в коем случае нельзя использовать: в самих текстах, кстати, тоже). Если в иностранных названиях есть апостроф, желательно поменять его на Alt + 146, кавычки тоже должны быть нормальными «ёлочками» или «лапками». Ещё один момент: буквы «і» и «ґ» в украинских текстах — это совсем не то, что латинское «i» и русское «г», у этих символов другие коды, имейте в виду. Самое же важное — расстановка языковых постфиксов у текстов на иностранных языках. Это значит, что все иностранные тексты должны носить примерно такое название: «Рей Бредбери -- The October Game.ENG.docx». Перед расширением обязательно ставьте точку и трёхбуквенный код языка прописной латиницей. Если у данного автора тексты на разных языках, нужно во избежание путаницы кодифицировать их все, поставив, например, дополнительное расширение .RUS (файл «Пол Андерсон -- Tombu.docx»: на каком языке написан текст? Без подсказки не понять :). Коды на сегодняшний день такие:

 «ENG» — английский, «ARA» — арабский, «BEL» — белорусский, «BUL» — болгарский, «HUN» — венгерский, «DUT» — голландский, «GRE» — греческий, «GEO» — грузинский, «DAN» — датский, «HEB» — иврит, «YID» — идиш, «SPA» — испанский, «ITA» — итальянский, «LAT» — латинский, «LIT» — литовский, «LTV» — латышский, «GER» — немецкий, «NOR» — норвежский, «POL» — польский, «POR» — португальский, «ROM» — румынский, «SAN» — санскрит, «ENO» — староанглийский, «NOO» — старонорвежский, «RUO» — старославянский, «TUR» — турецкий, «UZB» — узбекский, «UKR» — украинский, «FIN» — финский, «FRE» — французский, «CRO» — хорватский, «ROM» — румынский, «CZE» — чешский, «SWE» — шведский, «ESP» — эсперанто, «EST» — эстонский, «JAP» — японский. Все буквы обязательно прописные!

5. Если вы скачиваете файлы из каких-то внешних по отношению к библиотеке источников, их названия могут выглядеть примерно как «Zlobnikov_Rustam_Tri_Korochki_Khleba.fb2» и «Zlobnikov_Rustam_Tri_Korochki_Khleba.rtf», и в этом случае вам придётся вручную их переименовать. Этот процесс можно немного упростить. В архиве присутствует скрипт _ren.py, он как раз предназначен для массового переименования файлов любого из трёх «предварительных» форматов. Делается это вот как: вы открываете файл _ren.py (открыть его можно любым текстовым редактором, главное — чтобы тот поддерживал Unicode: если что, обычный Блокнот (Notepad) его поддерживает), в 8 и 9 строках которого задаются значения переменных var1 и var2. Их при необходимости и нужно отредактировать: замене подлежит содержимое кавычек, сами кавычки при этом трогать не нужно. «Zlobnikov_Rustam_» — то, что надо заменить, «Рустам Злобников -- » — то, на что меняем. Теперь закрываем файл, запускаем его двойным щелчком. Любые файлы трёх названных форматов, которые находятся в рабочей директории и в именах которых присутствует шаблон, задаваемый переменной var1 (В данном случае«Zlobnikov_Rustam_», переименовываются, и теперь указанные в качестве примера файлы называются «Рустам Злобников -- Tri_Korochki_Khleba.rtf» и «Рустам Злобников -- Tri_Korochki_Khleba.fb2». Далее открываем .rtf, копируем из текста название и вставляем его вместо нынешнего транслита. Ещё раз напомню: настоятельно советую иметь копию рабочих файлов (лучше создавать её перед каждый выполняемым в первый раз шагом), так как уничтожить или испортить их с помощью неправильно отредактированного скрипта можно в одно движение. Да, отдельно надо обговорить случай книжных серий. Я предлагаю именовать их следующим образом: «Сергей Лукьяненко -- ЛО2. Фальшивые зеркала». Серия, как вы помните, называется «Лабиринт отражений», номер текущей книги в ней — второй. И вам (да и мне) удобно, т. к. книжки одной серии при сортировке окажутся рядом, и главным библиотечным скриптам потом легче будет :) Сокращение пишем прописными, после него точка и пробел до собственно названия. Ещё один момент, на котором я хотел бы остановиться отдельно: скрипт для переименования (_ren.py) не работает с документами .docx, это сделано намеренно, заканчивайте все переименования до того, как начнёте конвертацию.

6. Если вдруг вам пришлось брать повреждённые или отсутствующие тексты из других библиотек, может оказаться, что их нужно отредактировать. Здесь я этот процесс описывать не буду, спрашивайте — расскажу всё подробно.

7. Итак, к каждому .docxу нужно найти соответствующий ему .fb2. Как вы это будете делать — вопрос совершенно отдельный. Сперва лучше спросить у меня, прислав в письме имя автора и названия отсутствующих текстов (для генерации списка есть специальный скрипт _lst_fb2.py, который создаёт файл lost.txt). Если никто из нас не смог их отыскать — в самом крайнем случае можно получить их из .docx с помощью Calibre. Процесс простейший, останавливаться на нём не буду, замечу только, что перед конвертацией обязательно нужно прописать в файле метатеги, а потом вставить обложку, Calibre позволяет сделать это в полуавтоматическом режиме: имена и названия впишете сами, а обложку он стянет из интернета. Другое дело, что в результате получится у вас так называемая «калибрятина», т. е. файл без надлежащей разметки, хотя и вполне читабельный. Впрочем, ничего особенно страшного в этом нет, но если вы можете эту самую разметку внести — пожалуйста, сделайте это. После того, как файл так или иначе получен, ему надо дать имя: точно такое же, как имя соответствующего ему .docxа, это важно. На выходе данного этапа имеем пары .docx — .fb2 с одинаковыми (символ в символ) названиями.

8. Теперь переходим к архивации. Когда пары файлов готовы, смело запускайте скрипт _arc_lst.py. Он архивирует все книги, отсекает имя автора и конвертирует названия архивов в транслит, после чего создаёт файл list.txt, в которые вписывает строки конфигурации, относящиеся к файлам, с которыми мы только что имели дело. Названия текстов, вписываемые в конфиг, при этом тоже обрабатываются: все «нестандартные» символы в них переводятся в HTML entities (напр., «ç») во имя правильного отображения на страницах библиотеки. Вам остаётся скопировать строки из list.txt в имеющийся файл конфигурации автора. Помните про алфавитную сортировку и про то, что серии (как папки в Проводнике (Windows explorer)) идут в общем списке первыми. Как прописывать серии — см. ниже, в п. 9.в.

9. Файл конфигурации. В нём бывают записи (строки) следующего вида:

а) <file nam="Виктор¤Зубов" aon="" lng="RUS" vis="1" gnr="0">

Это — главная строка конфигурации автора. Параметр «nam» (имя) означает полное имя автора по-русски, символ «¤» в нём заменяет пробел в том месте, где цепочку имён можно разорвать при алфавитной сортировке («Эдгар Аллан¤По»); параметр «aon» (имя на языке, на котором автор пишет/писал) — если в нём встречаются символы за пределами базовой таблицы, их нужно переводить в десятичные entities (напр. «&#39770;») с помощью макроса WebChars. Параметр «lng» (языке, на котором автор пишет/писал) кодируется, как указано в пункте 4; параметр «vis» (visibility, т. е. доступность книг автора в библиотеке) по умолчанию «1»; на параметр «gnr» (жанр) не обращайте внимания. Поскольку вы, как правило, работаете с авторами, которые были добавлены в библиотеку до вас, эту строку редактировать не нужно.

б) <text></text>

В этот контейнер заключается краткая биография автора. Технически она должна представлять собой один абзац, разрыв строки обеспечивается тегами <br>, все символы за пределами базовой таблицы переводятся в десятичные entities. Если вы не пишете биографию, просто не трогайте эту часть. Если пишете, вам пригодится имеющийся в общем комплекте макрос bio.

в) <group vis="1" nam="Как я кусал волка за бочок">

Тег <group> описывает серию текстов. Что такое «vis», вы уже знаете, что такое «nam», тоже должно быть понятно, напомню только о том. что все символы за пределами... см. предыдущий пункт :). Вставив в открывающий тег название серии, не забудьте удалить его (названия) сокращённую версию из названий входящих в серию книг (оставив при этом номер книги в серии), строки с которыми находятся между открывающим и закрывающим тегами (помните, что за последней книгой серии отдельной строкой всегда должен следовать закрывающий тег </group>). Обратите внимание: если вы встретили в параметре «nam» конструкцию типа «Северный варвар#Конан — 1», не сочтите её ошибкой: при генерации HTML она развернётся в «Северный варвар (Конан — 1)», как это бывает в случае в альтернативными названиями текстов.

г) <book lvl="1" dat="201105" vis="1" lng="RUS" nam="Первый подход к хищнику — операция «Р-р» lnk="KYAK1._Pervy_podkhod_k_khishchkiky.zip">

Это тег собственно книги. Тут надо много чего объяснять.

Параметр «lvl» — уровень отступа от левого края страницы. Если мы имеем дело с одиночной (несерийной) книжкой, то он равен нулю. Если это перевод какой-то книги, которая расположена в списке позицией выше (я веду речь об оригинале, который обязательно идёт первым и с нулевым отступом), то отступ единица. Если что-то из перечисленного входит в серию, добавьте ещё единицу.

Параметр «dat» (дата) — дата добавления книги в библиотеку. Если хоть что-то менялось — указывайте сегодняшнюю дату в формате YYMMDD, но вообще скрипт _arc_lst.py вставляет её автоматически.

С параметром «vis», надеюсь, по-прежнему всё понятно, вам его трогать не нужно, он зарезервирован для случаев, когда книга «снимается с доступа по требованию». Оставьте его в том виде, в котором нашли, даже если добавляете .fb2 к этой самой книге.

Параметр «lng» кодирует язык текста. Если в книгах, с которыми вы работали, присутствует код языка, то он будет автоматически вставлен сюда скриптом_arc_lst.py: если код языка отсутствует, текст будет помечена как русский.

Параметр «nam» содержит название текста, всякие разные нестандартные символы автоматически переводятся скриптом в entities. Не забывайте при необходимости удалять отсюда сокращённые названия серий, оставляя номера книг в серии. О синтаксисе типа «Северный варвар#Конан — 1» сказано шестью абзацами выше в описании тега <group>.

Параметр «lnk» содержит ссылку или ссылки на архивы с книгами. Приведённый пример описывает ситуацию, когда в библиотеке некий текст имеется только в формате .docx, а если имеются оба текста, как оно и должно быть в результате вашей полезной деятельности, то перечислить нужно оба архива, .fb2 обязательно первым, в качестве символа-разделителя использовать вертикальную черту («|»). То есть мы получим «lnk="KYAK1._Pervy_podkhod_k_khishchkiky.fb2.zip|KYAK1._Pervy_podkhod_k_khishchkiky.zip"». Напоминаю, что часть «KYAK1» взялась из сокращённого названия серии, в которую входит текст («Как я кусал волка за бочок») с номером текста в ней, переведённого в транслит, а конец названия, не слишком важный для идентификации текста, я отбросил, чтобы название файла было покороче. Скрипт, опять же, делает всё это автоматически, но проверить и при необходимости исправить ошибки всё равно нужно.

На всякий случай ещё раз о символах. Неразрывный пробел кодируется как «&nbsp;», тире (перед которым обязательно стоит упомянутый неразрывный пробел) как «&#151;», кавычки-«ёлочки» («») как «&#171;» и «&#187;», «лапки» („“) как «&#132;» и «&#147;», английские двойные кавычки (“”) как «&#147;» и «&#148;», одинарные (‘’) как «&#145;» и «&#146;», апостроф («’») как «&#146;». Собственно, это всё запоминается за 5 минут. Добавлю, что в языках, отличных от русского, правила расстановки знаков препинания могут существенно отличаться, что обязательно нужно принимать в расчёт.

Немного о блоке <text>...</text>, то есть о краткой биографии автора. Она пишется в определённом формате (см. хотя бы это) и должна быть небольшой, т. к. книги на авторской странице хочется видеть сразу, а не после долгой прокрутки, но одновременно по возможности должна покрывать все значимые факты. Если чувствуете в себе силы произвести на свет что-то подобное — вперёд!

Итак, главное, что мне от вас нужно — правильно поименованные и заархивированные файлы книг (напоминаю: парные, .docx + .fb2), которые верно описаны в файле конфигурации. Отправляете перечисленное, и эту часть работы можно считать законченной. Разумеется, это только малая часть того, что происходит с книгами в билиотеке. Хотите знать, что ещё? Задавайте вопросы! :)

Дополнение 1: я написал скрипт валидации конфигов, называется он _lib_val.py. Инструкции в комментариях.

Дополнение 2: написан скрипт _fix_lng.py, предназначенный для исправления ситуаций, когда конфиг ссылается на множество архивов, в названии которых нет кода языка. Исправляется и конфиг, и файлы. Инструкция, как водится, в комментариях.

Новости раздела

18 ноября 2020 г.
Комплектация библиотеки файлами .fb2

Ещё на сайте

Библиотека
Языки
Друзья
Канада
Авторский угол

Интернет

CPAN
Citforum
W3C.org
useit.com
Типомания
Code Charts
ру/ководство
Лаборатория dk
WebReference.com
Спецификация Perl
Заметки HTML-кодера
Анатомия Adobe Photoshop
The Apache Software Foundation


Рейтинг@Mail.ru

wordpress statistics

Рейтинг@Mail.ru