LXF170:Редактирование текста: Markdown
|
|
|
Содержание |
Конвертируйте свои файлы в Word с командной строки
Коэн Вервлоесем не любит возиться со шрифтами и цветом, когда пишет тексты, и конвертирует свои текстовые файлы в Word в командной строке.
Как писатель, предпочитающий терминал и обычные текстовые файлы, я всегда недолюбливал графические текстовые процессоры, включая OpenOffice.org/LibreOffice Writer и AbiWord. Не то что они плохи – они просто не вписываются в мой рабочий процесс. Я много работаю в терминале и предпочитаю текстовый редактор Vim и почтовый клиент Mutt. Когда я пишу письма в Mutt, то могу даже редактировать их в Vim. Этот подход кажется мне вполне естественным: Vim предназначен для редактирования текста, и любая программа, в процессе работы в которой можно редактировать текст (например, почтовый клиент), должна передавать эту задачу Vim (или другому редактору). Вот я и пишу в Vim письма и статьи, а также исходный код – например, скрипты оболочки, скрипты Ruby и программы на Java.
К сожалению, из-за Vim я в меньшинстве по отношению ко всем пользователям, да и текстовые файлы без разметки сегодня не в моде. Так что некоторые журналы из тех, в которые я пишу, просят меня присылать статьи в файлах Word, в специальном шаблоне Word. Конечно, я упрямо продолжаю писать свои тексты в Vim, а потом создаю новый документ в LibreOffice Writer и начинаю применять шаблон форматирования, которым я должен пользоваться.
Я так поступаю много лет, но извел слишком много времени на ручное форматирование, и несколько месяцев назад, наконец, решил автоматизировать процесс. Я подумал, что это не должно быть слишком сложно, потому что в журналах меня просят пользоваться специальным шаблоном, а у него есть структура. Мне просто нужно создать некую структуру в исходном текстовом файле и придумать способ преобразовать эту исходную структуру в желаемую.
Markdown: структурированный текст
Поэтому наш первый шаг – структурировать исходный текстовый файл. Все эти годы я пользовался некими обозначениями для заголовков, подзаголовков и т. д.; но, немного покопав, обнаружил, что некоторые форматы структурированного текста уже существуют. Популярный пример – Markdown (http://daringfireball.net/projects/markdown/).
Например, можно структурировать текст так:
# Заголовок
## Подзаголовок
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
imperdiet a, venenatis vitae, justo.
### Заголовок третьего уровня
- элемент маркированного списка
- элемент с _выделением_;
- элемент с **сильным выделением**;
- ссылка на [Linux Format](http://www.linuxformat.com/).
Синтаксис говорит сам за себя – привыкнуть к нему можно быстро. И этим форматом можно пользоваться в своем любимом редакторе, а при переходе к другому синтаксису менять редактор не придется. У файлов Markdown нет общепринятого расширения, но многие используют .md или .markdown.
Итак, способ структурирования текстов у нас есть, и нужен способ преобразовывать их в документы Word. Популярная утилита для этой цели – Pandoc (http://johnmacfarlane.net/pandoc), описываемая как «универсальный конвертор документов». Она поддерживает несколько входных форматов, в том числе Markdown, и множество выходных форматов, в том числе DOCX для Microsoft Word и ODT (Open Document Text – текст открытого документа) для OpenOffice.org/LibreOffice. Так как с файлами ODT гораздо проще работать, их мы и примем за выходной формат. Тогда мы сможем изменить формат позже, а вы узнаете кое-что полезное об Open Document Format (формат открытого документа), способное нам пригодиться. Pandoc есть в репозиториях многих дистрибутивов Linux, включая Debian, Ubuntu, Slackware, Arch, Fedora, NixOS и Gentoo, поэтому установить ее очень легко. Правда, учтите, что Pandoc написана на Haskell, и придется устанавливать всю рабочую среду Haskell, а это довольно-таки долго.
Если нужно изменить результат преобразования Pandoc, это делается скриптами Haskell. Незнание Haskell было еще одной причиной выбора ODT: так как ODT по сути представляет собой упакованный в ZIP-архив XML-файл, я смогу работать с ним с помощью XSLT.
Если вас устраивает разметка по умолчанию, можете легко превратить файл Markdown в ODT:
$ pandoc -o document.odt document.md
Взгляните на результат в LibreOffice. Если вы хотите превратить его в файл Word, можете воспользоваться утилитами Unoconv (http://dag.wieers.com/home-made/unoconv), и это будет сделано с помощью OpenOffice.org/LibreOffice:
$ unoconv -f doc document.odt
Результирующий файл document.doc – версия вашего текста для Word. Учтите, что перед конвертацией файла с unoconv нужно закрыть OpenOffice.org или LibreOffice, что не всегда удобно.
Анатомия файла ODT
Если вам не по душе разметка Pandoc по умолчанию, измените ее – и здесь нам придется немного глубже вникнуть в анатомию файла ODT. Одна из причин, по которым я предпочитаю ODT в качестве промежуточного формата в этом преобразовании – в том, что его структуру легко понять, и ею легко управлять. Каждый файл ODT по сути представляет собой ZIP-архив. Смотрите сами:
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
$ unzip -l document.odt
Archive: document.odt
Length Date Time Name
------------ ------ -------
770 01-14-2013 14:34 META-INF/manifest.xml
6860 01-14-2013 14:34 content.xml
0 07-18-2011 08:17 META-INF/
0 07-18-2011 08:01 Thumbnails/
742 03-11-2011 06:28 Thumbnails/thumbnail.png
342 07-18-2011 08:15 meta.xml
39 03-11-2011 06:28 mimetype
306 07-18-2011 08:15 settings.xml
53538 07-18-2011 08:15 styles.xml
-------
62597 9 files
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Нам здесь важнее всего файлы content.xml и styles.xml. В одном хранится содержимое документа в формате XML, а в другом – структура документа в том же формате. Чтобы познакомиться с форматом ODT, распакуйте файл и просмотрите эти XML-файлы в своем любимом текстовом редакторе. styles.xml, наверное, похож на китайскую грамоту, зато синтаксис content.xml очень прост: например, элементы <text:p> используются для абзацев, а <text:h> – для заголовков. Сравните исходный текст Markdown с содержимым content.xml файла ODT, чтобы понять, какие преобразования были выполнены Pandoc.
Можно изменить файлы content.xml и styles.xml, переупаковать файлы в архив, и вы увидите эти изменения в результирующем файле. Конечно, это довольно трудный и подверженный ошибкам способ редактирования файлов ODT (но отличный способ набрать баллов умника!). Главный же наш интерес – в автоматизации данного механизма.
Например, пусть вам не нравится разметка ODT по умолчанию, генерируемая Pandoc. Во многих случаях проблема решается довольно просто. Выберите файл ODT с нужной разметкой, распакуйте его и скопируйте его файл styles.xml. Затем распакуйте файл ODT, созданный Pandoc, и замените его styles.xml на скопированный styles.xml. Переупакуйте файл ODT и откройте его в LibreOffice. Та-дам! Теперь в вашем файле ODT другая разметка.
Трансформеры
Конечно, это не всегда так просто. Например, если текст нужно предоставлять в формате Word с именами стилей, отличающихся от имен стилей по умолчанию, придется конвертировать все имена стилей по умолчанию (например, «Заголовок 1», «Заголовок 2», «Текст» и т. д.) в content.xml в имена стилей шаблона, которому вы должны следовать. В принципе, для этого можно было бы изменить код преобразования в Pandoc, но я не владею Haskell и воспользовался другим решением: обработал content.xml с XSLT (extensible stylesheet language transformations – преобразования расширяемого языка стилей).
В XSLT можно воспользоваться таблицей стилей XSLT, которая определяет, как я собираюсь преобразовать входной файл в формате XML в выходной файл в формате XML. Но я не хочу полностью менять content.xml, а хочу только изменить имена некоторых стилей. Поэтому начну с так называемого тождественного преобразования [identity transform]:
<?xml version=”1.0” ?>
<xsl:stylesheet version=”1.0”
xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”
xmlns:text=”urn:oasis:names:tc:opendocument:xmlns:text:1.0”>
<xsl:template match=”/ | @* | node()”>
<xsl:copy>
<xsl:apply-templates select=”@* | node()” />
</xsl:copy>
</xsl:template>
При тождественном преобразовании все узлы XML с их атрибутами просто копируются, и ничего не меняется. Если же нужно изменить имена некоторых стилей, добавим другой шаблон:
<xsl:template match=”@text:style-name”>
<xsl:attribute name=”text:style-name”>
<xsl:choose>
<xsl:when test=”.=’Heading_20_1’”>Article_20_title</xsl:when>
<xsl:when test=”.=’Heading_20_2’”>Article_20_subtitle</xsl:when>
<xsl:when test=”.=’Text_20_body’”>Article_20_text</xsl:when>
<xsl:otherwise><xsl:value-of select=”.”/></xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
С добавлением этого шаблона таблица стилей копирует все узлы XML с их атрибутами, но когда ей попадается атрибут с именем text:style-name, значение атрибута меняется, если оно равно одному из перечисленных выше. _20_ в именах стилей означает пробел (20 – его шестнадцатеричный код ASCII), потому что, согласно формату файла ODT, во внутренних именах стилей не может быть пробелов.
Чтобы применить таблицу стилей к нашему content.xml, нам понадобится процессор XSLT, например, пакет xsltproc. Воспользоваться им просто:
$ xsltproc -o newcontent.xml stylesheet.xsl content.xml
- Метамодернизм в позднем творчестве В.Г. Сорокина
- ЛитРПГ - последняя отрыжка постмодерна
- "Ричард III и семиотика"
- 3D-визуализация обложки Ridero создаем обложку книги при работе над самиздатом.
- Архитектура метамодерна - говоря о современном искусстве, невозможно не поговорить об архитектуре. В данной статье будет отмечено несколько интересных принципов, характерных для построек "новой волны", столь притягательных и скандальных.
- Литература
- Метамодерн
- Рокер-Прометей против изначального зла в «Песне про советскую милицию» Вени Дркина, Автор: Нина Ищенко, к.ф.н, член Союза Писателей ЛНР - перепубликация из журнала "Топос".
- Как избавиться от комаров? Лучшие типы ловушек.
- Что делать если роблокс вылетает на windows
- Что делать, если ребенок смотрит порно?
- Почему собака прыгает на людей при встрече?
- Какое масло лить в Задний дифференциал (мост) Visco diff 38434AA050
- О чем может рассказать хвост вашей кошки?
- Верветки
- Отчетность бюджетных учреждений при закупках по Закону № 223-ФЗ
- Срок исковой давности как правильно рассчитать
- Дмитрий Патрушев минсельхоз будет ли преемником Путина
- Кто такой Владислав Поздняков? Что такое "Мужское Государство" и почему его признали экстремистским в России?
- Как правильно выбрать машинное масло в Димитровграде?
- Как стать богатым и знаменитым в России?
- Почему фильм "Пипец" (Kick-Ass) стал популярен по всему миру?
- Как стать мудрецом?
- Как правильно установить FreeBSD
- Как стать таким как Путин?
- Где лучше жить - в Димитровграде или в Ульяновске?
- Почему город Димитровград так называется?
- Что такое метамодерн?
- ВАЖНО! Временное ограничение движения автотранспортных средств в Димитровграде
- Тарифы на электроэнергию для майнеров предложено повысить
Здесь код XSLT из файла stylesheet.xsl применяется к файлу content.xml, а результат преобразования сохраняется в файл newcontent.xml.
Так можно изменить в документе многое. Например, один из журналов, в которые я пишу, просит меня пересылать свои текстовые документы в особом шаблоне Word, когда начало текста (первый абзац после заголовка и подзаголовка) оформлено в специальном стиле «лид [lead, вводка]». А в Markdown нет такого стиля. Как же автоматически изменить стиль первого абзаца? Благодаря XSLT это просто. Я просто добавил следующий шаблон XSLT:
<xsl:template match=”text:p[1]”>
<xsl:copy>
<xsl:attribute name=”text:style-name”>Lead</xsl:attribute>
<xsl:apply-templates select=”node()” />
</xsl:copy>
</xsl:template>
Когда моя таблица стилей XSLT встречает первый абзац в content.xml (так как он соответствует XPath-выражению “text:p[1]”), она копирует весь абзац, перед этим заменив имя стиля на Lead. А так как в моем styles.xml стиль Lead задан корректно, результирующий файл ODT выглядит именно так, как должен, при этом его вводка имеет собственный стиль.
Автоматизируем все
Мы приближаемся к завершению этой статьи и уже получили довольно сложную последовательность шагов для преобразования файла Markdown в файл Word с заданной разметкой. Конечно, выполнять эти шаги вручную неинтересно и может привести к ошибкам, поэтому их стоит автоматизировать.
Для этого я воспользовался подходом Makefile в разработке программ. Makefile используется для компиляции исходных файлов и формирования из них исполняемой программы в проектах с открытым исходным кодом, но тот же механизм можно использовать для создания файла Word из файла Markdown. Результирующий файл Makefile выглядит так (внимание: отступы следует выполнять табуляцией, а не пробелами):
XSL = ../../article.xsl
STYLESHEET = ../../styles.xml
TEMP_DIR = output
SOURCE_DOCS = $(wildcard *.md)
INTERMEDIATE_DOCS = $(patsubst%.md, %.odt,$(SOURCE_DOCS))
OUTPUT_DOCS = $(patsubst %.md,%.doc, $(SOURCE_DOCS))
test: $(INTERMEDIATE_DOCS)
all: $(OUTPUT_DOCS)
%.odt: %.md
pandoc -o $@ $<;\
rm -rf $(TEMP_DIR);\
mkdir $(TEMP_DIR);\
unzip $@ -d $(TEMP_DIR);\
xsltproc -o $(TEMP_DIR)/content.xml $(XSL) $(TEMP_DIR)/content.xml;\
cp $(STYLESHEET) $(TEMP_DIR)/styles.xml;\
cd $(TEMP_DIR);\
zip -r $@ .;\
mv $@ ..;
%.doc: %.odt
unoconv -f doc $<
Если вы читали эту статью внимательно, то должны понять логику в этом файле Makefile. Сначала мы определяем несколько переменных, например, с расположением таблицы стилей XSL и файла styles.xml нашего файла шаблона ODT, которым мы должны пользоваться. Мы определяем две цели: test, которая создает файлы ODT для всех файлов Markdown в этом каталоге, и all, которая создает все файлы DOC. Файл ODT создается по файлу Markdown, следуя процедуре, описанной в этой статье: Pandoc создает файл ODT, создается временный каталог, содержимое файла ODT распаковывается в этот каталог, к файлу content.xml применяется таблица стилей XSLT и результат сохраняется в файле content.xml. Файл styles.xml, созданный Pandoc, заменяется на наш styles.xml, и содержимое временного каталога упаковывается. Преобразование из ODT в DOC проще: просто запустите unoconv. Поместив этот файл Makefile в каталог с файлами Markdown, можно набрать make all, и текстовые файлы будут преобразованы в файлы Word с заданной разметкой.
Pandoc расширяет синтаксис Markdown массой дополнительных возможностей – таблицами, картинками с подписями, списками определений, нумерованными списками примеров, верхними и нижними индексами, сносками и т. д. Загляните в файл README Pandoc, чтобы узнать подробности о синтаксисе, а также некоторые интересные параметры команды pandoc.
Лучшее из двух миров
С описанным подходом для создания текстовых документов вы получите лучшее из двух миров. Вы можете писать тексты в любимом текстовом редакторе, но ваши корреспонденты и не подумают, что вы пользуетесь этими странными текстовыми файлами без разметки. И вы сможете продолжать потакать своим навыкам эффективной работы в Linux, например, искать слова с помощью grep или пользоваться системами управления версиями. А ваши корреспонденты будут думать, что вы пользуетесь Microsoft Word, и все будут счастливы... |