ПомощьПоГлавам > ПомощьПользователям > КакРедактировать > ПомощьПоПарсерам

Парсеры

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

Схема работы и использование парсеров

Парсеры обрабатывают поток во входном формате и генерируют набор вызовов для генераторов выходного формата («formatter») для получения итоговой страницы. Парсер можно использовать одним из двух способов:

  1. Указание инструкции #format

    Инструкция #format может использоваться для указания МойнМойн, какой парсер должен использоваться для обработки страницы. По умолчанию это парсер вики-разметки Мойн-Мойн — wiki.

  2. Блок с указанным парсером — см. КакФорматировать

    При использовании блока с указанием парсера, он может применяться только к части страницы. Используемый парсер указывается в параметре блока (в синтаксисе wiki — сразу после открывающей конструкции с использованием shebang, в creole — на следующей строке с использованием shebang; shebang используется по аналогии с UNIX, где он используется для указания интерпретатора скриптового файла)

Пример: использование инструкции

Здесь в качестве примера выступает отдельная страница:

#format creole
... **полужирное начертание** ...

Пример: блок с указанием парсера

В данном примере подразумевается, что это — часть вики-страницы:

  • {{{#!csv ,
    а,б,в
    г,д,е
    }}}

Будет отображено как:

  • а б в
    г д е

Вложние блоков с указанием парсера

Существует два способа решения проблемы с вложением блоков:

  • Использовать более трёх фигурных скобок для начала и окончания внешних блоков (при этом, подобные последовательности не должны содержаться внутри блока), например:
    {{{{
    {{{
    ...
    }}}
    }}}}
  • Использовать 3 фигурных скобки и уникальную строку:
    {{{фывапролджэ
    {{{
    ...
    }}}
    фывапролджэ}}}

Для дополнительной информации по разметке см. КакРедактировать.

Парсеры для написания текста вики-страницы

Ряд парсеров предназначен для использования в нормальном тексте страницы (т. е. как документ):

Парсер CSV

Парсер CSV работает с так называемыми разделенными запятыми значениями, но запятая может быть заменена точкой с запятой. Первая строка рассматривается, как разделенные названия колонок, которые отобразятся в полужирном начертании; если таблица не должна содержать шапку, то достаточно оставить пустой первую строку.

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

  • delimiter или separator: delimiter=, задаёт запятую в качестве разделителя полей. Разделитель можно также указывать первым аргументом, не указывая имени параметра.

  • quotechar: quotechar=" позволяет квотировать значения двойными кавычками.

  • show: список столбцов, разделённых запятыми, которые необходимо показывать.

  • hide: список столбцов, разделённых запятыми, которые необходимо исключить из выдачи.

  • autofilter: список столбцов, разделённых запятыми, по которым необходимо разрешить фильтрацию.

  • name: имя набора данных.

  • link: список столбцов, имеющих формат http://example.com/link описание ссылки, нежели просто текста.

  • static_cols, static_vals: столбцы (и значения, соответственно), добавляемые к каждой записи.

  • -N (where N is a number): спрятать столбец с номером N (полезно в случае, когда заголовки столбцов опущены).

Пример использования парсера (см. исходный текст страницы для разметки): фрагмент истории изменений МойнМойн 1.3:

Номер патча Описание Автор
Дата
patch-366 make _normalize_text public method Nir Soffer 2004-11-30 19:11:51 GMT
patch-367 fixed failing test wikiutil: good system page names Nir Soffer 2004-11-30 19:15:52 GMT
patch-368 Fixed DeprecationWarning in RandomPage.py and an unused import in twistedmoin.py Alexander Schremmer 2004-11-30 22:58:44 GMT
patch-369 remove duplicate code in formatter.base Thomas Waldmann 2004-12-01 00:14:21 GMT
patch-370 fixed long int in mig3 Thomas Waldmann 2004-12-01 01:51:50 GMT
patch-371 fixed unicode error on eventlog Nir Soffer 2004-12-01 14:46:29 GMT
patch-372 fixed util.web.makeQueryString and Page.url Nir Soffer 2004-12-01 15:48:55 GMT
patch-373 fixed again non ascii http_referer Nir Soffer 2004-12-01 18:55:28 GMT
patch-374 CSV.py supports different separators now Alexander Schremmer 2004-12-01 23:46:17 GMT
patch-375 improved searchform behavior on Mozilla/Firefox Nir Soffer 2004-12-02 04:57:06 GMT
patch-376 More correct script for actions menu init Nir Soffer 2004-12-02 05:07:58 GMT

ParserBase

ParserBase — это вспомогательный класс парсеров, используемый для подсветки кода.

Парсеру ParserBase можно передать некоторые аргументы, для этого их надо просто добавить после имени парсера. (например, #format python start=10 step=10 numbers=on или #!python numbers=off).

numbers
добавлять нумерацию строк. Значение по умолчанию — 'on' (добавлять). Допустимые значение: 'on', 'off' (нумерация не отображается, но возможность их отобразить добавляется), 'disable' (вообще без нумерации)
start
номер первой строки. Значение по умолчанию — 1.
step
шаг нумерации. Значение по умолчанию — 1.

МойнМойн поставляется с некоторым числом парсеров, описанным ниже:

cplusplus

   1 int main(int argc, char **argv) {
   2   return 0;
   3 }

java

   1 import java.util.Date;
   2 import java.util.Calendar;
   3 
   4 public class IntDate
   5 {
   6   public static Date getDate(String year, String month, String day)
   7     {
   8       // Date(int, int, int) has been deprecated, so use Calendar to
   9       // set the year, month, and day.
  10       Calendar c = Calendar.getInstance();
  11       // Convert each argument to int.
  12       c.set(Integer.parseInt(year),Integer.parseInt(month),Integer.parseInt(day));
  13       return c.getTime();
  14 
  15     }
  16 }

pascal

   1 function TRegEx.Match(const s:string):boolean;
   2 var
   3     l,i : integer;
   4 begin
   5     result := MatchPos(s,l,i);
   6 end;

python

Подсветка кода на Python. Это не наследник ParserBase, но он понимает те же самые аргументы.

   1 def hello():
   2     print "Hello World!"

diff

--- GetText2.py.old     2009-11-04 12:43:24.000000000 +0300
+++ GetText2.py 2009-11-12 14:07:44.000000000 +0300
@@ -21,11 +21,12 @@
     """
     sep = args[0]
     args = unpackLine(args[1:], sep)
-    if args:
-        translation = macro.request.getText(args[0])
-    else:
-        translation = u""
-    message = translation % tuple(args[1:])
+    translation = args and macro.request.getText(args[0]) or u""
 
+    try:
+        message = translation % tuple(args[1:])
+    except TypeError:
+        message = translation % dict([i.split('=',1) for i in args[1:] if '=' in i])
+
     return macro.formatter.text(message)

IRC

Представление логов IRC в виде таблицы.

   1 (23:18) <     jroes> ah
   2 (23:19) <     jroes> hm, i like the way {{{ works, but i was hoping the lines would wrap
   3 (23:21) -!- gpciceri [~gpciceri@host181-130.pool8248.interbusiness.it] has quit [Read error: 110 (Connection timed out)]
   4 (23:36) < ThomasWal> you could also write a parser or processor
   5 (23:38) <     jroes> i could?
   6 (23:38) <     jroes> would that require modification on the moin end though?
   7 (23:38) <     jroes> i cant change the wiki myself :x

ReStructured

См. /ReStructuredText.

XML/XSLT/DocBook

См. ПомощьПоXmlСтраницам.