Алексей Федорчук
Начну с условий задачи. Дано: некий материал, объёмом около 2 печатных листов (примерно 80 тысяч символов). В формате, разумеется, MS Word’а чёрти какой версии, но понимаемом, например, LibreOffice. Текст достаточно просто отформатирован, разделяется на несколько глав, никак, однако, не размеченных к качестве заголовков. Требуется: привести его к форме, пригодной для размещения на сайте, работающем на движке WordPress, с минимальными затратами сил и времени.
Напрашивающееся решение — считать исходный файл в LibreOffice Writer’е и экспортировать его в HTML — буде далеко не оптимальным: полученный таким образом код будет довольно страшненьким и избыточным, ибо будет дублировать обеспечиваемое движком WP обрамление (DOCTYPE, charset и так далее).
Как ни странно, в данном конкретном случае (очень просто отформатированного документа) приемлемым окажется ещё более простой вариант — Copy&Paste LibreOffice Writer’а в окно редактирования WP, переключённого в текстовый (не визуальный) режим. Это гарантирует от появления «паразитных» тегов, однако всю дальнейшую работу (например, по разметке рубрик) придётся проделывать вручную.
Так что я опишу некий абстрактный метод действий в общем случае — хотя в случае конкрентном некоторые из последующих действий могут показаться избыточными. Который предполагает, что скопированный из LibreOffice Writer’а текст вставляется сначала в текстовый редактор. Какой? По причинам, о которых будет сказано в одном из последующих очерков, редактор может быть любым их числа продвинутых — например, Geany, Komodo Edit или Kate. Я в данном случае остановился на первом из этого списка.
Теперь надо расставить теги заголовков для глав, например, <h2></h2>. Это можно сделать автоматически, поиском и глобальной заменой во всём документе, используя Escape-последовательности, благо Geany поддерживает и их, и регулярные выражения. Однако я, параллельно с этим, просто читал текст — не редактирования ради, а исключительно удовольствия души для. И потому пошёл по пути полуавтоматическому, вставляя тег заголовка, когда доходил до очередной главы, с помощью очень простого макроса — Geany поддерживает возможность создания оных просто протоколированием действий. И потому набор макросов для ввода самых употребимых тегов HTML был заготовлен у меня с давних пор.
И, как выяснилось, полуавтоматический путь оказался правильным. Потому что, дойдя до третьей главы, я понял: размещать этот текст надо не целиком, а постранично, в соответствие с главам. Для чего исходник следовало разбить на соответствующее количество фрагментов, сиречь файлов. Очевидный метод решения этой задачи — очевиден вследствие своей очевидности: пооткрывать пустых файлов по количеству фрагментов. А затем копипастить в них соответствующие фрагменты из исходника.
Метод простой и не требующий напряжения, но уж больно скучный. Потому что можно вспомнить три обстоятельства:
- обрабатывать тексты в формате plain text можно не только в текстовом редакторе, но и с помощью подходящих утилит командной строки (далее — утилит CLI);
- в текстовом редакторе Geany (и, кстати, в Kate, но, увы, не в Komodo Edit) имеется встроенный терминал, который можно синхронизировать с текущим документом;
- среди утилит CLI есть одна, которая специально предназначена для разбиения файла на фрагменты, границы которых определяются (почти) произвольным образом.
Имя этой утилите — csplit
, и в данном случае её, предварительно синхронизировав пути документа и терминала, можно применить в такой форме:
$ csplit -f moscva60- moskva-60e.txt '/^<h2>/' '{*}'
Результат во встроенном терминале будет выглядеть так:
$ ls [krotkov/moskva-60e] moscva60-00 moscva60-02 moscva60-04 moscva60-06 moscva60-08 moscva60-01 moscva60-03 moscva60-05 moscva60-07 moskva-60e.txt
Нетрудно догадаться, что moskva-60e.txt
— это исходный текст, файлы от moscva60-01
до moscva60-08
включают в себя главы соответствующих номеров, а файл moscva60-00
— вступительную часть вне рубрик.
Очевидно, что к циклу из девяти страниц не худо бы добавить оглавление. И это делается, не отходя от кассы терминала, такой командой:
$ echo 'Оглавдение' > moscva60-content
В результате чего к списку файлов текущего каталога добавляется ещё один, moscva60-content
. Пока — пустой, если не считать строки заголовка. Но превратить его в болвану оглавления не трудно — понадобится только серия команд вида
$ less moscva60-01 | head -n 1 >> moscva60-content
И так далее. В результате к файлу moscva60-content
будут добавлены первые строки их файлов >moscva60-01
, то есть названия глав (в данном случае — просто глава 1, глава 2 и так далее).
За всеми стадиями процесса можно наблюдать в (почти) реальном времени — и во встроенном терминале, и в дереве файлов проекта — Geany предоставляет и ту, и другую возможность:
Теперь остаётся только навести на содержимое полученной серии файлов последний глянец уже непосредственно в текстовом редакторе, разместить их на сайте и проставить в оглавлении ссылки на соответствующие страницы. После чего — дело в шляпе.
Описанное выше — ни в коем случае не догма, и даже не руководство к действию. А лишь достаточно элементарный пример того, как можно работать с уже готовым материалом в формате plain text, чередуя применение функций текстового редактора и команд шелла. Ну а вопросы выбора редактора и оболочки будут рассмотрены в последующих очерках данного цикла. Однако прежде всего, уже в следующем, очерке, я приведу обоснование того, почему всё-таки — редактор, а не процессор.
Для вордпресса есть Mammoth .docx converter, для линукса docx2txt | txt2html | xclip или тот же мammoth. Небольшой скрипт плюс сервис-меню для дельфина-немо-наутилуса и достаточно ПКМ на *.docx, чтобы получить папку с необходимыми файлами. Расширение Itsalltext для лисы позволяет редактировать содержимое любого текстового поля браузера в любом редакторе на компе.
Serg B, устанавливать плагины ради разовой операции…
И потом, как показывает практика, плагин как мёд: сегодня он есть, завтра его нет, и в обновлённой версии WP не работает :)
[quote]less moscva60-01 | head -n 1 >> moscva60-content[/quote]
Можно проще:[code]head -n 1 moscva60-01 >> moscva60-content[/code]
Lazhu, да, в общем случае верно. Спасибо. Просто у меня в Zsh и первая конструкция не намного сложней:
$ < moscva60-01 H -n 1 >> куда_надо