PmWiki 中的多行标记

Multi-line markup in 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 中创建多行标记?

正如您已经猜到的那样,PmWiki 标记到 html 的转换是一个多阶段过程,包括应用一组有序的正则表达式匹配和文本替换。

一些理论考虑

Markup($name, $when, $pattern, $replace) 函数(在 pmwiki.php 中)负责定义转换管道本身并使用预定义规则(在 stdmarkup.php 中)和您自己的规则填充它在 Local Configuration Files.

中提供

Custom Markup 文档页面将预定义阶段描述为:

_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

根据 function 文档,Markup() 参数定义为:

$name

字符串命名插入的规则。如果已存在同名规则,则忽略此规则。

$when

此字符串用于控制何时相对于其他规则应用规则。 "<xyz" 的规范表示在名为 "xyz" 的规则之前应用此规则,而 ">xyz" 表示在规则 "xyz" 之后应用此规则。有关规则顺序的更多详细信息,请参阅 CustomMarkup

$pattern

此字符串是一个正则表达式,翻译引擎使用它来查找标记源中此规则的出现。

$replace

此字符串将在匹配发生时替换匹配的文本,或者将 return 替换文本的函数名称。

将此应用于您的案例

"directives" 指定为 $when 占位符会导致将标记规则应用于文本 它已经被拆分成行之后。

因此,为了发生在多行,应该在行拆分之前指示工作,如:

Markup('SHOUTY', '<split',
  '/SHOUTY\s*(.+?)\./gs',
  'MarkupSHOUTY');