PmWiki's markup translation engine is handled by a set of rules; each rule searches for a specific pattern in the markup text and replaces it with some replacement text. Internally, this is accomplished by using PHP's "preg_replace" function.
Rules are added to the translation engine via PmWiki's Markup() function, which looks like
Markup($name, $when, $pattern, $replace);
$name is a unique name (a string) given to the rule,
$when says when the rule should be applied relative to other rules,
$pattern is the pattern to be searched for in the markup text, and
$replace is what the pattern should be replaced with.
For example, here's the code that creates the rule for
''emphasized text'' (in scripts/stdmarkup.php):
Markup("em", "inline", "/''(.*?)''/", "<em>$1</em>");
Basically this statement says to create a rule called "em" to be performed with the other "inline" markups, and the rule replaces any text inside two pairs of single quotes with the same text match not begin/end of strings but also begin/end of lines (i.e., right before/after a newline).
How can the text returned by my markup function be re-processed by the markup engine?
If the result of your markup contains more markup that should be processed, you have two options. First is to select a "when" argument that is processed earlier than the markup in your result. For example, if your markup may return [[links]], your "when" argument could be
"<links" and your markup will be processed before the links markup. The second option is to call the PRR() function in your markup definition or inside your markup function. In this case, after your markup is processed, PmWiki will restart all markups from the beginning.
How do I get started writing recipes and creating my own custom markup?
How do I make a rule that runs once at the end of all other rule processing?
Use this statement instead of the usual
$MarkupFrameBase['posteval']['myfooter'] = "\$out = onetimerule(\$out);";
(:comment included in PmWiki localisation headers and footers :)