PmWiki中的多行标记

时间:2018-03-04 21:29:38

标签: php markup pmwiki

假设我想创建标记来转换它: 一些文字。 SHOUTY您好。还有一些文字。 进入这个: 一些文字。你好!还有一些文字。 我会用以下PHP来做到这一点: 标记('SHOUTY','指令',   '/SHOUTY\\s*(.+?)\\./gs',   'MarkupSHOUTY'); function MarkupSHOUTY($ matches){   return mb_strtoupper($ matches [1])。 '!'; } 这适用于上面的天真测试用例,但在实际使用中失败: 这是SHOUTY斯巴达。 SHOUTY他拿着他的vorpal剑: 很长一段时间他寻找的男人的敌人 - 所以他在Tumtum树上休息了, 想了一会儿。 不要按按钮。 SHOUTY不要按它。 变 这是斯巴达! SHOUTY他拿着他的vorpal剑: 很长一段时间他寻找的男人的敌人 - 所以他在Tumtum树上休息了, 想了一会儿。 不要按按钮。不要按它! 如何在PmWiki中创建多行标记?

1 个答案:

答案 0 :(得分:1)

正如您已经猜到的,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

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

将此应用于您的案例

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

因此,为了在多行上发生,应该指示在行分割之前使用,例如:

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