Многострочная разметка в PmWiki
Допустим, я хочу создать разметку для преобразования этого:
Some text. SHOUTY Hello. Some more text.
в это:
Some text. HELLO! Some more text.
Я бы сделал это со следующим PHP:
Markup('SHOUTY', 'directives',
'/SHOUTY\\s*(.+?)\\./gs',
'MarkupSHOUTY');
function MarkupSHOUTY($matches) {
return mb_strtoupper($matches[1]) . '!';
}
Это работает для наивного тестового примера, описанного выше, но не помогает при реальном использовании:
This is SHOUTY Sparta.
SHOUTY He took his vorpal sword in hand:
Long time the manxome foe he sought --
So rested he by the Tumtum tree,
And stood awhile in thought.
Don't press the button. SHOUTY Don't press it.
становится
This is SPARTA!
SHOUTY He took his vorpal sword in hand:
Long time the manxome foe he sought --
So rested he by the Tumtum tree,
And stood awhile in thought.
Don't press the button. DON'T PRESS IT!
Как я могу создать многострочную разметку в PmWiki?
1 ответ
Как вы уже догадались, преобразование разметки PmWiki в html - это несколько этапов, состоящих в применении упорядоченного набора совпадений регулярных выражений и замен текста.
Некоторые теоретические соображения
Markup($name, $when, $pattern, $replace)
функция (в pmwiki.php
) отвечает за определение самого конвейера преобразования и заполнение его обоими предопределенными правилами (в stdmarkup.php
) и ваши собственные правила, которые вы можете указать в файлах локальной конфигурации.
Страница документации по пользовательской разметке описывает предопределенные фазы следующим образом:
_begin start of translation
{$var} Page Text Variables happen here.
fulltext translations to be performed on the full text
split conversion of the full markup text into lines to be processed
directives directive processing
inline inline markups
links conversion of links, url-links, and WikiWords
block block markups
style style handling
_end end of translation
Согласно документации по функции, Markup()
параметры определяются как:
$name
Строка именует правило, которое вставлено. Если правило с таким именем уже существует, то это правило игнорируется.
$when
Эта строка используется для контроля, когда правило должно применяться относительно других правил. Спецификация "<xyz"
говорит, что применять это правило до правила по имени "xyz"
, в то время как ">xyz"
говорит, что применять это правило после правила "xyz"
, См. CustomMarkup для более подробной информации о порядке правил.
$pattern
Эта строка является регулярным выражением, которое используется механизмом перевода для поиска вхождений этого правила в источнике разметки.
$replace
Эта строка будет заменять сопоставленный текст при совпадении или имя функции, которая будет возвращать замещающий текст.
Применяя это к вашему делу
Определение "directives"
как $when
заполнитель приводит к тому, что правило разметки применяется к тексту после того, как он уже разбит на строки.
Поэтому, чтобы иметь место в нескольких строках, его следует проинструктировать работать до разбиения строки, например:
Markup('SHOUTY', '<split',
'/SHOUTY\\s*(.+?)\\./gs',
'MarkupSHOUTY');