Техника сочинительства. Начну с примера

Алексей Федорчук

Начну с условий задачи. Дано: некий материал, объёмом около 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 предоставляет и ту, и другую возможность:

writong_001

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

Описанное выше — ни в коем случае не догма, и даже не руководство к действию. А лишь достаточно элементарный пример того, как можно работать с уже готовым материалом в формате plain text, чередуя применение функций текстового редактора и команд шелла. Ну а вопросы выбора редактора и оболочки будут рассмотрены в последующих очерках данного цикла. Однако прежде всего, уже в следующем, очерке, я приведу обоснование того, почему всё-таки — редактор, а не процессор.

Техника сочинительства. Начну с примера: 4 комментария

  1. Для вордпресса есть Mammoth .docx converter, для линукса docx2txt | txt2html | xclip или тот же мammoth. Небольшой скрипт плюс сервис-меню для дельфина-немо-наутилуса и достаточно ПКМ на *.docx, чтобы получить папку с необходимыми файлами. Расширение Itsalltext для лисы позволяет редактировать содержимое любого текстового поля браузера в любом редакторе на компе.

  2. Serg B, устанавливать плагины ради разовой операции…
    И потом, как показывает практика, плагин как мёд: сегодня он есть, завтра его нет, и в обновлённой версии WP не работает :)

  3. [quote]less moscva60-01 | head -n 1 >> moscva60-content[/quote]
    Можно проще:[code]head -n 1 moscva60-01 >> moscva60-content[/code]

  4. Lazhu, да, в общем случае верно. Спасибо. Просто у меня в Zsh и первая конструкция не намного сложней:
    $ < moscva60-01 H -n 1 >> куда_надо

Добавить комментарий