Допустим, я хочу создать разметку для преобразования этого:
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?
Как вы уже догадались, преобразование разметки 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');
Других решений пока нет …