Директива include с переменной страницы не работает внутри разметки

У меня есть некоторые разметки, такие как:

Markup('talk', '<include',
  '/\\(:talk:\\)/i',
  'MarkupTalk');
function MarkupTalk($m) {
  return 'Talk page: (:include {$BaseName}-talk:)'
}

но когда я использую это, это ничего не делает!

Example text (:talk:) more text

выходы

<div id="wikitext">
<p>Example text Talk page:  more text</p>

почти как если бы (:include:) директива это комментарий! Это похоже на (:include:) не работает, когда определено в другой разметке.

Как я могу сделать эту работу правильно?

1 ответ

Причина того, что это не работает должным образом, заключается в том, что ваша разметка:

talk             <include         B>=><            

оценивается после одной из его зависимостей:

{$var}           >$[phrase]       B=>>             

Чтобы исправить это, вы можете изменить, когда ваша разметка оценивается:

Markup('talk', '<{$var}',
  '/\\(:talk:\\)/i',
  'MarkupTalk');

но это может быть нежелательно, если у вас есть какая-либо разметка, которая выводит ("зависит от") вашу. Вместо этого вы можете изменить свою функцию, чтобы использовать PageVar() функция, как отмечено в PmWiki.PageVariables, вот так:

function MarkupTalk($m) {
  global $pagename;
  $pagename = ResolvePageName($pagename);
  return 'Talk page: (:include '. PageVar($pagename, '$BaseName') .'-talk:)'
}

Это удаляет {$var} как зависимость и позволяет безопасно разметить вашу разметку после {$var} является.

Другие вопросы по тегам