This page describes an internal function in PmWiki's engine called
FmtPageName()
. The contents are not intended for those with a weak heart
;-)
Also see: PmWiki.Functions
FmtPageName
($fmt, $pagename)Returns $fmt
, with $variable and internationalisation substitutions performed, under the assumption that the current page is pagename
. See PmWiki.Variables for an (incomplete) list of available variables, PmWiki.Internationalizations for internationalisation.
The function FmtPageName()
applies internationalization-substitutions
and $Variable-substitions to the string $fmt under the assumption that the
current page is $pagename.
The substitutions goes as follows:
$XyzFmt
with value of any corresponding global variable.
$[...]
phrases (internationalized phrase), using the currently loaded translation tables.
$EnablePathInfo
isn't set, convert URIs
to use the syntax $ScriptUrl?n=<Group>.<Name> instead of $ScriptUrl/<Group>/<Name>.
Note that FmtPageName
() is automatically aware of any global
variables. However, since modifying global variables may be expensive, the
array $FmtV exists as a way to avoid rebuilding the variable cache for
values that change frequently.
To be very specific, here's what Pm wrote regarding different ways of defining a variable that can be used by FmtPageName (when it is formatting a string):
Also see: Cookbook:Functions#FmtPageName
Finally, here's something else Pm wrote that is related and explains why we have this function:
$LastModifiedBy
, $LastModifiedHost, and $LastModified. These items cannot just be standard PHP variables because often PmWiki needs to obtain the url, name, group, title, etc. of a page other than the one currently being viewed by a browser.
$LastModifiedBy
, and $LastModifiedHost can only work if the page's attributes have been loaded and cached using the PCache function. So, to get at these values one must typically do:
$page = `ReadPage($pagename); PCache($pagename, $page); $pvar = `FmtPageName('$Title', $pagename); $pvar = `FmtPageName('$`LastModifiedBy', $pagename);
FmtPageName()
Note: The source code below was taken from "pmwiki-2.0.beta55", while the current version is pmwiki-2.3.1.
## FmtPageName handles $[internationalization] and $Variable ## substitutions in strings based on the $pagename argument. function FmtPageName($fmt,$pagename) { # Perform $-substitutions on $fmt relative to page given by $pagename global $GroupPattern, $NamePattern, $EnablePathInfo, $ScriptUrl, $GCount, $UnsafeGlobals, $FmtV, $FmtP, $PCache, $AsSpacedFunction; if (strpos($fmt,'$')===false) return $fmt; $fmt = preg_replace('/\\$([A-Z]\\w*Fmt)\\b/e','$GLOBALS[\'$1\']',$fmt); $fmt = preg_replace('/\\$\\[(?>([^\\]] ))\\]/e',"XL(PSS('$1'))",$fmt); $match = array('','$Group','$Name'); if (preg_match("/^($GroupPattern)[\\/.]($NamePattern)\$/", $pagename, $m)) $match = $m; $fmt = preg_replace(array_keys($FmtP),array_values($FmtP),$fmt); $fmt = preg_replace('!\\$ScriptUrl/([^?#\'"\\s<>] )!e', (@$EnablePathInfo) ? "'$ScriptUrl/'.PUE('$1')" : "'$ScriptUrl?n='.str_replace('/','.',PUE('$1'))", $fmt); if (strpos($fmt,'$')===false) return $fmt; static $g; if ($GCount != count($GLOBALS) count($FmtV)) { $g = array(); foreach($GLOBALS as $n=>$v) { if (is_array($v) || is_object($v) || isset($FmtV["\$$n"]) || in_array($n,$UnsafeGlobals)) continue; $g["\$$n"] = $v; } $GCount = count($GLOBALS) count($FmtV); krsort($g); reset($g); } $fmt = str_replace(array_keys($g),array_values($g),$fmt); $fmt = str_replace(array_keys($FmtV),array_values($FmtV),$fmt); return $fmt; }
This page may have a more recent version on pmwiki.org: PmWiki:FmtPageName, and a talk page: PmWiki:FmtPageName-Talk.