mikiwiki
Язык разметки исходных текстов

Формат mwiki предназначен для разметки текстовых файлов для последующей конвертации их в различные форматы: HTML, LaTeX, manpage,...

История

Формат mwiki разработан Михаилом Улановым для собственных нужд. Изначально формат создавался для написания отчёта о велосипедном путешествии. Основными требованиями, предъявляемыми к формату были:

  • удобство редактирования в текстовом редакторе;
  • лёгкость конвертирования в различные форматы, в частности в HTML и в LaTeX;
  • по возможности совместимость с wikipedia и mediawiki.

В качестве отправной точки был выбран wiki-формат, используемый в проекте mediawiki, однако он был подвергнут некоторым улучшениям.

По ходу написания отчёта формат постоянно совершенствовался. В дальнейшем формат использовался для написания не только отчётов о путешествиях, но и разнообразной технической документации, моей домашней странички.

Базовая разметка

Комментарии

Строки файла, начинающиеся с символа "#" считаются комментарием и игнорируются. При этом после символа "#" не должно быть пробела и символов "#", "*", ":", иначе строка будет интерпретирована как элемент нумерованного списка (для совместимости с mediawiki). Также комментариями не считаются директивы препроцессора #warn, #define, #if, #else, #endif, #raw, #endraw, #include.

При необходимости "закомментировать" большой многострочный фрагмент текста можно воспользоваться директивами препроцессора #if 0 и #endif:

#if 0
текст,
который нужно закомментировать
#endif

Абзацы и переносы строк

Для разделения абзацев используется пустая строка, точно так же как в разметке mediawiki или LaTeX.

Если необходимо начать новую строку, не прерывая абзац, используется символ "~" в начале строки, например:

В этом абзаце
осуществляется перевод строки здесь:
~продолжение абзаца на новой строке.
Это — начало нового абзаца

Строки входного файла можно "склеивать" в одну строку, размещая символ \ в конце первой и последующих строк. Например, текст элемента списка должен располагаться на одной строке входного файла.

* длинный элемент \
списка не поместился \
на одной строке
* второй элемент

Заголовки

Заголовки и подзаголовки выделяются символами "=". Чем больше символов "=", тем более вложен подзаголовок. Например:

= Заголовок книги =
== Заголовок главы ==
=== Подзаголовок ===

В отличие от mediawiki, закрывающие символы "=" ставить необязательно.

Заголовок должен распологаться на одной строке входного файла. При необходимости переноса строк во входном файле можно использовать символ \ в конце строки:

== Длинный заголовок \
не поместился \
на одной строке

Заголовок первого уровня (определённый с одним символом "=") не включается в оглавление, формируемое командой ${tableofcontents}, но устанавливает переменную ${title}, которая используется при формировании заголовка в формате HTML и титульного листа в формате LaTeX.

Возможно задание подзаголовка без формирования раздела:

~~ Подзаголовок ~~

Завершающие символы "~~" также необязательны.

Альтернативный способ задания подзаголовка:

=== Заголовок ===
===~ Подзаголовок ~===

Подзаголовок первого уровня (определённый последовательностью "=~") устанавливает переменную ${subtitle}, которая используется при формировании заголовка в формате HTML и титульного листа в формате LaTeX.

Форматирование текста

Полужирный и курсивный текст кодируется различным количеством апострофов, так же как в mediawiki.

'''полужирный текст'''
''курсив''
'''''полужирный курсив'''''

Существует альтернативная возможность для обозначения полужирного, курсивного, подчёркнутого, перечёркнутого и моноширинного текста:

{*полужирный текст*}
{/курсив/}
{_подчёркивание_}
{-перечёркивание-}
{|моноширинный текст|}

В этом случае "закрывающий" символ перед закрывающей фигурной скобкой не обязателен, например можно написать так:

{_подчёркивание}

Верхние и нижние индексы задаются комбинациями ^{индекс} и _{индекс} соответственно, например:

L_{Iso}=2×10^{50} erg/s

В отличие от TeX'а индекс нужно заключать в фигурные скобки, даже если он состоит из одного символа.

Специальные символы и сочетания символов

Неразрывный пробел обозначается символом "~", аналогично TeX'у. При необходимости вставить в текст сам символ "~", необходимо его заэкранировать: \~. В некоторых случаях mwiki самостоятельно заменяет пробел на неразрывный (см. раздел ???). Также в качестве неразрывного пробела можно использовать символ с кодом U+00A0.

Преформатированный текст

Также как и в mediawiki, пробел в начале строки обозначает преформатированный моноширинный текст. При необходимости вставить пустую строку в преформатированный текст, используйте строку из символа "~":

 Это первая строка преформатированного текста.
 Это вторая строка.
 ~
 Это строка после пустой строки.

Внутри блока преформатированного текста не работают никакие команды форматирования, кроме подстановки значений переменных.

Ссылки

Гиперссылки задаются двойными квадратными скобками. При необходимости можно задать текст ссылки:

[[URL]]
[[URL Текст ссылки]]

Существует сокращённый формат ссылок на статьи Википедии и Луркморе. При этом необязательный текст ссылки отделяется вертикальной чертой.

[[:w:Wikipedia article|текст ссылки]]
[[:r:Статья в русской википедии]]
[[:l:Статья на lurkmore|текст ссылки]]

Можно задавать ссылки на внешние ресурсы в одинарных квадратных скобках (для совместимости с mediawiki), но при этом обязательно указывать протокол http:, ftp: или mailto:

[http://www.wikipedia.org Википедия]
[ftp://ftp.sunet.se]

Списки

Поддерживаются нумерованные, ненумерованные списки, списки с отступом, списки определений, совместимые с mediawiki. Поддерживается неограниченная вложенность списков. Текст нумерованного списка должен быть отделён от значка "#" хотя бы одним пробелом, чтобы он не посчитался комментарием.

* Ненумерованный
* Список
# Нумерованный
# Cписок
* Вложенные списки
*# Номер 1
*# Номер 2
* Второй вложенный список
*# Номер 1
*# Номер 2
;Термин:Определение
: Просто строка с отступом
:: С двойным отступом

Текст элемента списка должен распологаться на одной строке входного файла. При необходимости переноса строк во входном файле можно использовать символ \ в конце строки:

* длинный элемент \
списка не поместился \
на одной строке

Нумерованные заголовки и абзацы

Используя сочетание символа "%" и точек можно задать автоматическую нумерацию заголовков и подзаголовков. Каждый символ "%" будет заменён на соответствующее число. Если не ставить точку после символа "%", то после номера раздела точки не будет (ГОСТ 2.105-95 Общие требования к текстовым документам).

== %. Нумерованый заголовок
=== %.%. Подзаголовок
== % Заголовок без точки после номера

Подобным образом осуществляется и нумерация абзацев:

== % Заголовок (1)
% Нумерованный абзац (1.1)
=== %.% Подзаголовок (1.2)
% Нумерованный абзац (1.2.1)
% Нумерованный абзац (1.2.2)
%.% Подпункт (1.2.2.1)

При этом нумерация абзацев (пунктов) и заголовков сквозная, а к номеру пункта автоматически добавляется номер соответсвующего заголовка.

Между символами % ставить точки необязательно. Важно только количество символов % и наличие или отсутствие точки в конце номера, чем определяется, будет ли поставлена точка после номера в выходном файле. Таким образом, следующие две записи эквивалентны:

== %.% Заголовок
== %% Заголовок

Нумерованные абзацы отличаются от нумерованных списков тем, что во-первых, нумерация абзацев привязана к нумерации заголовков, во-вторых нумерованный абзац является полноценным абзацем: может состоять из нескольких строк и форматируется как абзац, в то время как списки обычно форматируются с дополнительным отступом слева.

При ссылке на нумерованный заголовок или абзац в текст ссылки автоматически вставляется номер заголовка или абзаца (без конечной точки), например приведённая ниже ссылка даст на выходе "Смотри п.1.1 в разделе 1".

== %. Заголовок ${label sec}
%. Пункт ${label point}
Смотри п.${ref point} в разделе ${ref sec}.

Картинки

Картинки задаются в квадратных скобках. Если картинка не является фотографией из альбома, то перед именем файла картинки необходимо поставить один из символов "!", ",", ";", ">". После имени файла можно опционально указать ссылку, по которой будет осуществлять переход по клику на картинке.

Просто картинка:

[!image.png url/link.html]

Картинка снабжается подписью с номером рисунка (только в режиме LaTeX, иначе аналогично "!"):

[,image.png]

Картинка растягивается по ширине колонки текста (только в режиме LaTeX, иначе аналогично "!"):

[;image.png]

Картинка, выровненная по правому краю:

[>image.png]

Дополнительные возможности

Препроцессор

#warn, #warning, #error

Директивы #warn и #warning являются синонимами. Текст, указанный в директиве выводится в поток STDERR.

Директива #error выводит указанный текст в поток STDERR и аварийно завершает работу конвертера.

В выводимом тексте допускается использовать переменные, но не макросы. Например:

#warning Output format is html.

#define

Директива #define позволяет определять переменные.

#define sun Солнце
#define var1 Пусть всегда светит ${sun}
#define var2

Подробнее см. раздел ???.

#if, #else, #endif

Директивы позволяют осуществлять условную конверсию исходного текста. Если значение аргумента директивы #if является истиной, то обработке подвергается текст до последующей директивы #else или #endif. Если значение ложно или неопределено, то обрабатывается только текст между директивами #else и #endif.

При помощи конструкции

#if 0
  строка
  строка
#endif

можно организовывать многострочные комментарии.

#raw, #endraw

Текст, заключенный между директивами #raw и #endraw включается в выходной файл без каких-либо преобразований. Не подставляются даже значения переменных.

#include (TODO)

Файл, указанный в аргументе директивы #include включается в обработку в месте указания директивы.

Переменные

Определение и использование переменных

Существует возможность использовать в тексте переменные. Переменные определяются при помощи конструкции

#define name value

Значение переменной можно не задавать, в этом случае оно полагается равным "1".

Также можно задать значение переменной в командной строке mwiki при помощи опции -D, в этом случае значение переменной указывать необходимо:

mwiki -D var1=value1 -D var2=1 -D var3=value3

Если переменная определена и во входном файле, и в командной строке, то приоритет имеет определение во входном файле.

Используются переменные при помощи конструкции ${var}, В конструкции #if допускается использование переменных без ${}, например следующие конструкции эквивалентны:

#if html
#if $var{html}

Специальные переменные

Приведённые ниже переменные определяются программой mwiki, а также могут определяться и переопределяться пользователем во входном файле:

format
Выходной формат. Принимает значения "html" или "latex". Определяется опцией --format.
html
Значение равно "1", в случае если выходной формат HTML. Иначе значение не определено.
latex
Значение равно "1", в случае если выходной формат LaTeX. Иначе значение не определено.
filename
Имя входного файла. (TODO)
linenumber
Номер текущей строки входного файла.
title
Заголовок текста. Может определяться пользователем. В формате HTML выводится в тэге <title>. И в начале текста в тэге <h1>. В формате LaTeX выводится на титульном листе. Переменная title устанавливается при задании заголовка первого уровня (конструкция =Заголовок=).
subtitle
Подзаголовок текста. Может определяться пользователем. В формате HTML выводится после заголовка. В формате LaTeX выводится на титульном листе. Переменная subtitle устанавливается при задании подзаголовка первого уровня (конструкция =~Подзаголовок~=).
author
Автор текста. Может определяться пользователем. В формате HTML выводится после заголовка. В формате LaTeX выводится на титульном листе.
date
Дата написания текста. Может определяться пользователем. В формате HTML выводится после заголовка. В формате LaTeX выводится на титульном листе.
lang
Двухбуквенный код языка документа. В формате HTML указывается в тэге <html lang="ru">. В формате LaTeX используется для выбора языка в пакете babel. Также используется для задания языка специальных секций, напимер "Содержание" и "Индекс".
stylesheet
Файл css, ссылка на который включается в HTML-вывод. Может определяться пользователем. Можно указать несколько файлов, разделяя их запятыми. (!!!TODO!!!)
reftype
Тип ссылок. Может принимать значение "name" или "num". Значение по умолчанию в режиме HTML: name, в режиме LaTex: num. Более подробно о типах ссылок говорится в разделе ???.

Примеры использования препроцессора и переменных

#if html
<img src="smile.png" />
#else
#warn Ошибка в файле ${filename} в строке ${linenumber}
#endif

Экранирование

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

  • Обратная косая черта (\) требует экранирования всегда.
  • Одиночные фигурные скобки ({, }) требуют экранирования только в конструкциях выбора типа шрифта ({/, {*, {_, {|, {-) и верхних и нижних индексов (_{}, ^{}), причём в последнем случае достаточно заэкранировать либо только символ _ или ^, либо только фигурные скобки. В остальных случаях одиночные фигурные скобки экранирования не требуют.
  • Знак доллара ($) требует экранирования перед фигурной скобкой (${).
  • Одинарные квадратные скобки ([, ]) используются либо для задания внутри абзаца ссылок, совместимых с mediawiki (в этом случае содержимое скобок должно начинатсья с ftp:, http:, https:, mailto:), либо для задания картинок вне абзаца. В остальных случаях экранирование фигурных скобок не требуется.
  • Двойные квадратные скобки ([[, ]]) требуют экранирования всегда.
  • Тильда (~) требует экранирования всегда.
  • Экранирование символов #, *, : требуется только при использовании их в начале строки, когда они могут быть расценены как определение элемента списка.
  • Экранирование символа % требуется только при использовании его в начале строки, когда он может быть расценен как номер абзаца или заголовка.
  • Одинарные апострофы (') экранирования не требуют, двойные и более требуют.
  • Кавычка (") не требуют экранирования.

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

Режим NAKED

При указании опции --naked mwiki не формирует заголовки и хвост файла. Полученный в результате файл можно включать внутрь другого HTML-файла внутрь секции <html> (в режиме HTML) или внутрь другого LaTeX файла (в режиме LATEX).

Шаблоны

Шаблоны используются при помощи конструкции

${<имя_шаблона><разделитель><аргумент1><разделитель><аргумент2>}

Метки и ссылки

${label:labels}

${name:метка} и ${label:метка} являются синонимами и задают метку, на которую в дальнейшем можно ссылаться. В случае выходного формата HTML создаётся тэг <a name="метка"> и атрибут id="метка" у соответствующего заголовка или абзаца, что позволяет ссылаться на эту метку из других файлов.

${ref:метка}, ${numref:метка}, ${nameref:метка} позволяют ссылаться на элемент текста, ранее помеченный меткой ${name:метка} или ${label:метка}.

Ссылки бывают числовыми и текстовыми. Пример числовой ссылки: подробности приведены в пункте 5.3. Пример текстовой ссылки: подробности приведены в разделе "Подробности".

${numref:метка} задаёт числовую ссылку, ${nameref:метка} — текстовую. ${ref:метка} задаёт числовую или текстовую ссылку, в зависимости от переменной ${reftype}, которая может принимать значения "num" или "name". Для выходного формата HTML значение ${reftype} по умолчанию равно "name", для формата LaTeX -- "num".

Число для числовой ссылки определяется ближайщим нумеровынным элементом, который предшествует соответствующей метке ${name} или ${label}. Текст для текстовой ссылки определяется ближайщим заголовком, который предшествует соответствующей метке, либо задаётся явно вторым аргументом метки: ${name:метка:Текст} или ${label:метка:Текст}.

Шаблоны, общие для всех выходных форматов

Шаблон ${tableofcontents} формирует оглавление. Если указан числовой аргумент, например ${tableofcontents 3} то в оглавление включаются только заголовки до указанного уровня.

Фотографии

Координаты

Отличия от mediawiki

В mediawiki можно использовать произвольную HTML-разметку, например <br>, <tt>, &nbsp;. Так как mwiki не является HTML-ориентированной, никакие HTML-тэги не поддерживаются.

Опции программы mwiki

--header-counters (TODO)

Опция задаёт принудительную нумерацию разделов. Даже если у заголовка раздела нет признака нумерованности (символов %), разделы автоматически нумеруются. Таким образом, следующее определение заголовков:

== Заголовок
=== Подзаголовок
=== Подзаголовок

Будет рассматриваться, как определённое так:

== % Заголовок
=== %% Подзаголовок
=== %% Подзаголовок

--hardnumbering (TODO)

Режим "жесткой" нумерации разделов в формате LaTeX. По умолчанию mwiki отдаёт нумерацию разделов "на откуп" LaTeX'у. Если же задана эта опция, то нумерацию разделов, пунктов и ссылок на них осуществляет сам mwiki. Этот режим может быть полезен, если необходимо сделать документ в разных выходных форматах со строго одинаковой нумерацией.

Особенности выходных форматов

html

Используемые стилевые классы

latex

Нумерованные заголовки и абзацы

plain

Опции командной строки программы mwiki

--format
формат выходного файла: html, latex или plain
-D,--define
определение переменных
--naked
не выводить заголовки
--norefs
Отключить ссылки (${ref}). Если ссылки не используются, то опция позволяет ускорить преобразование файла, т.к. для обработки ссылок необходим двойной проход по исходному файлу.

Лайт-версия

Существует облегчённая версия программы mwiki, которая называется mwiki-lite.

Облегчённая версия не использует никаких модулей perl, что позволяет ей работать с приемлимой скоростью на оборудовании с ограниченными возможностями, например на роутере в среде openwrt.

В облегчённой версии используется упрощённый алгоритм чтения и парсинга строк, который экономит память, но проводит к некоторым ограничениям.

Ограничения mwiki-lite:

  • выходной формат — только html
  • принудительно включена опция --naked
  • не поддерживаются ссылки ${ref}
  • не поддерживается оглавление ${tableofcontents}

mwiki-lite эквивалентна запуску mwiki со следующими параметрами:

mwiki --format=html --naked --norefs

© 2009 - 2014 Михаил Уланов, mulanov@gmail·com