version=pmwiki-2.1.5 ordered=1 urlencoded=1 agent=Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418 (KHTML, like Gecko) Safari/417.9.2 author=Pico csum=Added audience id host=66.108.51.56 name=PmWiki.FmtPageName rev=11 targets=PmWiki.Functions,PmWiki.Variables,PmWiki.Internationalizations text=%25audience%25 admins (advanced)%0aThis page describes an internal function in PmWiki's engine called%0a[@FmtPageName()@]. The contents are not intended for those with a weak heart%0a;-)%0a%0aAlso see: [[PmWiki.Functions]]%0a%0a!![[#FmtPageName]] [@FmtPageName@]($fmt, $pagename)%0a%0a[[#FmtPageName-desc]]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.%0a%0aThe function [@FmtPageName()@] applies internationalization-substitutions%0aand $Variable-substitions to the string $fmt under the assumption that the%0acurrent page is $pagename.%0a%0aThe substitutions goes as follows:%0a%0a# Replace any sequences of the form [@$XyzFmt@] with value of any \%0a corresponding global variable.%0a# Process the string for any [@$[...]@] phrases (internationalized phrase), \%0a using the currently loaded translation tables.%0a# Perform any pattern replacements from the array $FmtP. Typically \%0a this is used to handle things like $Name and $Group etc that are \%0a specific to the name of the current page.%0a# If $EnablePathInfo isn't set, convert [@URIs@] to use the syntax \%0a $ScriptUrl?n=%3cGroup>.%3cName> instead of $ScriptUrl/%3cGroup>/%3cName>.%0a# Replace any $-sequences with global variables (caching as needed) \%0a of the same name (in reverse alphabetical order) *%0a# Replace any $-sequences with values out of the array $FmtV.%0a%0aNote that [@FmtPageName@]() is automatically aware of any global%0avariables. However, since modifying global variables may be expensive, the%0aarray $FmtV exists as a way to avoid rebuilding the variable cache for%0avalues that change frequently.%0a%0a%0aTo be very specific, here's what Pm wrote regarding different ways of%0adefining a variable that can be used by FmtPageName (when it is formatting a%0astring):%0a%0a* Set a global variable. FmtPageName() automatically performs \%0a substitution on all global variables that aren't arrays. \%0a If the variable is going to change value over repeated calls \%0a to FmtPageName, it's probably better to use $FmtV as in the next item.%0a%0a* Set a value in the $FmtV array. $FmtV['$MyVariable']='something' \%0a means to replace instances of '$MyVariable' with 'something'. \%0a Use this for variables that change value frequently over \%0a multiple calls to FmtPageName. %0a%0a* Set a pattern/replacement in the $FmtP array. This is normally \%0a done for substitutions that have to be dynamic somehow based on \%0a the pagename being referenced, such as '$Title', '$Group', '$Name', \%0a '$PageUrl', etc.%0a%0aAlso see: [[Cookbook:Functions#FmtPageName]]%0a%0aFinally, here's something else Pm wrote that is related and explains%0awhy we have this function:%0a%0a-> In order to produce its output, PmWiki has to do a variety of string \%0a substitutions:%0a%0a## Generating the full name, group, title, or url of a page \%0a (other than the currently displayed page)%0a## Substituting the values of global variables%0a## Performing internationalization substitutions%0a## Converting $ScriptUrl/$Group/$Name to $ScriptUrl?n=$Group.$Name \%0a for sites that cannot handle PATH_INFO urls%0a## Other substitutions needed by specific functions%0a %0a-> PmWiki centralizes all of that substitute-a-dynamic-value-in-a-string \%0a into the FmtPageName() subroutine. Because some things are extremely \%0a dynamic, such as the url or group for an arbitrary page that is not the \%0a current one, those things cannot be simple global PHP variables. Or, if \%0a they do become global variables, they're variables that cannot be \%0a trusted to hold a value for very long because some other routine (that \%0a may happen to be formatting a string for a different page) will come \%0a along and change that global variable for whatever it happens to be doing.%0a%0a-> A limited set of $-substitutions -- basically anything that \%0a corresponds to a page attribute -- are not PHP variables and \%0a are only available through the FmtPageName() subroutine. \%0a The complete set of these special substitutions is $Group, \%0a $Name, $FullName, $PageUrl, $Title, $Titlespaced, $Namespaced, \%0a $Groupspaced, $LastModifiedBy, $LastModifiedHost, and $LastModified. \%0a These items cannot just be standard PHP variables because often\%0a PmWiki needs to obtain the url, name, group, title, etc. of a page \%0a other than the one currently being viewed by a browser.%0a%0a-> At the moment, $Title, $LastModified, $LastModifiedBy, and \%0a $LastModifiedHost can only work if the page's attributes have been \%0a loaded and cached using the `PCache function. So, to get\%0a at these values one must typically do:%0a%0a-> [@%0a$page = `ReadPage($pagename);%0aPCache($pagename, $page);%0a$pvar = `FmtPageName('$Title', $pagename);%0a$pvar = `FmtPageName('$`LastModifiedBy', $pagename);%0a@]%0a%0a!! Source code for [@FmtPageName()@]%0a%0aNote: The source code below was taken from "pmwiki-2.0.beta55", while the%0acurrent version is {$Version}.%0a%0a-> [@%0a## FmtPageName handles $[internationalization] and $Variable%0a## substitutions in strings based on the $pagename argument.%0afunction FmtPageName($fmt,$pagename) {%0a # Perform $-substitutions on $fmt relative to page given by $pagename%0a global $GroupPattern, $NamePattern, $EnablePathInfo, $ScriptUrl,%0a $GCount, $UnsafeGlobals, $FmtV, $FmtP, $PCache, $AsSpacedFunction;%0a if (strpos($fmt,'$')===false) return $fmt;%0a $fmt = preg_replace('/\\$([A-Z]\\w*Fmt)\\b/e','$GLOBALS[\'$1\']',$fmt);%0a $fmt = preg_replace('/\\$\\[(?>([^\\]] ))\\]/e',"XL(PSS('$1'))",$fmt);%0a $match = array('','$Group','$Name');%0a if (preg_match("/^($GroupPattern)[\\/.]($NamePattern)\$/", $pagename, $m))%0a $match = $m;%0a $fmt = preg_replace(array_keys($FmtP),array_values($FmtP),$fmt);%0a $fmt = preg_replace('!\\$ScriptUrl/([^?#\'"\\s%3c>] )!e',%0a (@$EnablePathInfo) ? "'$ScriptUrl/'.PUE('$1')" :%0a "'$ScriptUrl?n='.str_replace('/','.',PUE('$1'))",%0a $fmt);%0a if (strpos($fmt,'$')===false) return $fmt;%0a static $g;%0a if ($GCount != count($GLOBALS) count($FmtV)) {%0a $g = array();%0a foreach($GLOBALS as $n=>$v) {%0a if (is_array($v) || is_object($v) ||%0a isset($FmtV["\$$n"]) || in_array($n,$UnsafeGlobals)) continue;%0a $g["\$$n"] = $v;%0a }%0a $GCount = count($GLOBALS) count($FmtV);%0a krsort($g); reset($g);%0a }%0a $fmt = str_replace(array_keys($g),array_values($g),$fmt);%0a $fmt = str_replace(array_keys($FmtV),array_values($FmtV),$fmt);%0a return $fmt;%0a}%0a@] time=1146912078