Skip to content

Генерация статей из XML

19/01/2011

Пока у меня небольшой перерыв в статьях про Node.js — я делаю параллельно два довольно сложных проекта на Ноде, которые я потом опишу — я хочу описать свою систему генерации разметки статей. Изначально она выросла из необходимости размещать статью в двух блогах с немного различающимся синтаксисом: nodejs.ru и Механический мир.

Система работает на основе XML + XSLT, для XSL-преобразования применяется Apache Xalan. Статья изначально пишется в XML, и потом преобразуется в два варианта двумя разными файлами XSL. Основное различие между ними — способ отображения исходного кода и создание ссылок на другие статьи.

Сама статья начинается с XML-заготовки, в которую вписан заголовок, пара секций и список дополнительных ссылок. Заготовку я внес в шаблоны IDE и создаю просто через «Новый файл». После того как статья дописана, я отправляю её в xalan дважды — с двумя разными XSL-файлами, получая на выходе два HTML-файла, содержимое которых как раз размещается на блогах.

Исходный код

Собственно, из за этого я и начал заниматься XSLT. Раньше при переносе статьи мне приходилось вручную переделывать включенные в неё фрагменты исходного кода, чтобы они нормально отображались на nodejs.ru (там используется немного другой плагин для подсветки). На wordpress.com код размещается так:

[sourcecode lang="JavaScript" line="5" highlight="25"]
...
[/sourcecode]

Свойство line указывает с какой строки начинать нумерацию (если я размещаю фрагмент большого файла), highlight — какие строки выделить. На nodejs.ru код будет размещаться так:

<pre lang="JavaScript" escaped="true" line="5">
...
</pre>

На nodejs.ru, насколько я знаю, нет возможности подсветить некоторые строки отдельно. Это неудобно, но в принципе терпимо. Кроме того, если используется свойство escaped со значением true, HTML-entities в коде должны быть преобразованы к текстовому виду (например, & в &amp;).

Другие преобразования

Когда я доделал часть отвечающую за подсветку, мне показалось слишком накладным использовать XML+XSLT только ради преобразования одного тега. Поэтому кроме этого выполняются другие преобразования:

  • Ссылки на другие статьи остаются относительными на wordpress.org (например /2009/12/16/git-on-windows/) и становятся абсолютными на nodejs.ru
  • Элементы вида <github-user>kurokikaze</github-user> и <github-project>kurokikaze/limestone</github-project> преобразуются в ссылки на профиль/проект на Github — это было сделано просто из любопытства. То же самое для тегов habrauser и habrapost
  • Список «Ссылки по теме» собирается, подчищается и форматируется аккуратным списком
  • В конец поста для node.js добавляется стандартная ссылка «Источник: Механический мир»

В целом изучить на досуге XSLT было довольно познавательно. XSLT мне уже один раз здорово пригодился (при разборке дампа Wikipedia), наверняка и в будущем ему найдётся применение. Эти два файла XSLT я продолжу использовать для форматирования статей, и буду улучшать их по мере необходимости.

Ссылки по теме:

P.S.: так как эта статья не относится непосредственно к Node.js и не будет опубликована на nodejs.ru, она пишется в Notepad++ сразу в виде HTML для WordPress.com:)

3 комментария
  1. Вот, именно о таком инструменте в ядре блога я и говорил🙂

    • Ну для одного блога это имхо чересчур. Я то этим заморочился как раз из за двух разных представлений ) Showdown.js не сгодится разве?

      • Для одного это делать не стоит, согласен, но если делать кросспосты, то нужен инстурмент, позволяющий по какой-т оодной исходной разметке делать тексты для всех блогов, которые нужно синхронизовать. так что лучше всего какая-то семантическая разметка + немного HTML. Ведь кроме различных уровней заголовков могут быть специфичные теги в каждом блоге, вроде или vs . Ырщцвщцтюоы подойдёт, это же и есть markdown с небольшими изменениями.

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

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: