Формат 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>, . Так как 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