* Author: Reini Urban * See also: http://meta.wikimedia.org/wiki/Help:Template * Parameter expansion: * vars="var1=value1&var2=value2" * * Predefined variables automatically expanded if existing: * pagename * mtime - last modified date + time * ctime - creation date + time * author - last author * owner * creator - first author * SERVER_URL, DATA_PATH, SCRIPT_NAME, BASE_URL * * Future: * - Maybe support a mediawiki-style syntax extension which maps {{TemplateFilm|title=rurban|year=1999}} to - .. */ class WikiPlugin_Template extends WikiPlugin { function getName() { return _("Template"); } function getDescription() { return _("Parametrized page inclusion."); } function getVersion() { return preg_replace("/[Revision: $]/", '', "\$Revision: 1.1 $"); } function getDefaultArguments() { return array( 'page' => false, // the page to include 'vars' => false, 'rev' => false, // the revision (defaults to most recent) 'section' => false, // just include a named section 'sectionhead' => false // when including a named section show the heading ); } function getWikiPageLinks($argstr, $basepage) { extract($this->getArgs($argstr)); if ($page) { // Expand relative page names. $page = new WikiPageName($page, $basepage); } if (!$page or !$page->name) return false; return array($page->name); } function run($dbi, $argstr, &$request, $basepage) { extract($this->getArgs($argstr, $request)); if ($page) { // Expand relative page names. $page = new WikiPageName($page, $basepage); $page = $page->name; } if (!$page) { return $this->error(_("no page specified")); } // Protect from recursive inclusion. A page can include itself once static $included_pages = array(); if (in_array($page, $included_pages)) { return $this->error(sprintf(_("recursive inclusion of page %s"), $page)); } $p = $dbi->getPage($page); if ($rev) { $r = $p->getRevision($rev); if (!$r) { return $this->error(sprintf(_("%s(%d): no such revision"), $page, $rev)); } } else { $r = $p->getCurrentRevision(); } $initial_content = $r->getPackedContent(); $c = explode("\n", $initial_content); if ($section) { $c = extractSection($section, $c, $page, $quiet, $sectionhead); $initial_content = implode("\n", $c); } if (preg_match('/%%\w+%%/', $initial_content)) // need variable expansion { $var = array(); if (!empty($vars)) { foreach (split("&",$vars) as $pair) { list($key,$val) = split("=",$pair); $var[$key] = $val; } } $thispage = $dbi->getPage($basepage); // pagename is not overridable if (empty($var['pagename'])) $var['pagename'] = $page; // those are overridable if (empty($var['mtime']) and preg_match('/%%mtime%%/', $initial_content)) { $thisrev = $thispage->getCurrentRevision(false); $var['mtime'] = $GLOBALS['WikiTheme']->formatDateTime($thisrev->get('mtime')); } if (empty($var['ctime']) and preg_match('/%%ctime%%/', $initial_content)) { if ($first = $thispage->getRevision(1,false)) $var['ctime'] = $GLOBALS['WikiTheme']->formatDateTime($first->get('mtime')); } if (empty($var['author']) and preg_match('/%%author%%/', $initial_content)) $var['author'] = $thispage->getAuthor(); if (empty($var['owner']) and preg_match('/%%owner%%/', $initial_content)) $var['owner'] = $thispage->getOwner(); if (empty($var['creator']) and preg_match('/%%creator%%/', $initial_content)) $var['creator'] = $thispage->getCreator(); foreach (array("SERVER_URL", "DATA_PATH", "SCRIPT_NAME", "BASE_URL") as $c) { // constants are not overridable if (preg_match('/%%'.$c.'%%/', $initial_content)) $var[$c] = constant($c); } foreach ($var as $key => $val) { $initial_content = preg_replace("/%%$key%%/", $val, $initial_content); } } array_push($included_pages, $page); include_once('lib/BlockParser.php'); $content = TransformText($initial_content, $r->get('markup'), $page); array_pop($included_pages); return HTML::div(array('class' => 'template'), $content); } }; // $Log: not supported by cvs2svn $ // For emacs users // Local Variables: // mode: php // tab-width: 8 // c-basic-offset: 4 // c-hanging-comment-ender-p: nil // indent-tabs-mode: nil // End: ?>