Многострочная разметка в 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?

2

Решение

Как вы уже догадались, преобразование разметки 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');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]