Многострочная разметка в 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');
Другие вопросы по тегам