18d79fe1bSGerry Weißbach<?php 28d79fe1bSGerry Weißbach 38d79fe1bSGerry Weißbach/** 48d79fe1bSGerry Weißbach * Select Template Pages for your Content 58d79fe1bSGerry Weißbach * The templates Pages have to have the entry @@CONTENT@@ 68d79fe1bSGerry Weißbach * the template per page can be defined using the META plugin 78d79fe1bSGerry Weißbach * 88d79fe1bSGerry Weißbach * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 98d79fe1bSGerry Weißbach * @author i-net software <tools@inetsoftware.de> 108d79fe1bSGerry Weißbach * @author Gerry Weissbach <gweissbach@inetsoftware.de> 118d79fe1bSGerry Weißbach */ 128d79fe1bSGerry Weißbach 138d79fe1bSGerry Weißbach// must be run within Dokuwiki 148d79fe1bSGerry Weißbachif (!defined('DOKU_INC')) 158d79fe1bSGerry Weißbach die(); 168d79fe1bSGerry Weißbach 178d79fe1bSGerry Weißbachif (!defined('DOKU_LF')) 188d79fe1bSGerry Weißbach define('DOKU_LF', "\n"); 198d79fe1bSGerry Weißbachif (!defined('DOKU_TAB')) 208d79fe1bSGerry Weißbach define('DOKU_TAB', "\t"); 218d79fe1bSGerry Weißbachif (!defined('DOKU_PLUGIN')) 228d79fe1bSGerry Weißbach define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 238d79fe1bSGerry Weißbachrequire_once(DOKU_INC . 'inc/pageutils.php'); 248d79fe1bSGerry Weißbach 258d79fe1bSGerry Weißbachclass action_plugin_pagetemplater extends DokuWiki_Action_Plugin { 268d79fe1bSGerry Weißbach 278d79fe1bSGerry Weißbach /** 288d79fe1bSGerry Weißbach * Register the eventhandlers. 298d79fe1bSGerry Weißbach */ 30d5795404SGerry Weißbach function register(Doku_Event_Handler $controller) { 318d79fe1bSGerry Weißbach $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'handle_content_display', array ()); 321afaeff3SGerry Weißbach $controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'handle_meta_data', array ()); 338d79fe1bSGerry Weißbach } 348d79fe1bSGerry Weißbach 358d79fe1bSGerry Weißbach function handle_content_display(& $event, $params) { 36a89efe90SGerry Weißbach global $ACT, $INFO, $TOC, $ID; 378d79fe1bSGerry Weißbach 386af37903SGerry Weißbach $template = $this->resolve_template(); 396af37903SGerry Weißbach if ( !$template || $ACT != 'show' ) { return; } 408d79fe1bSGerry Weißbach 416af37903SGerry Weißbach $oldtoc = $TOC; 426af37903SGerry Weißbach $template = p_wiki_xhtml( $template ); 438d79fe1bSGerry Weißbach 448d79fe1bSGerry Weißbach // set the replacements 458d79fe1bSGerry Weißbach $replace = $INFO['meta']['templater']; 468d79fe1bSGerry Weißbach unset($replace['page']); 478d79fe1bSGerry Weißbach $replace['content'] = $event->data; 48a89efe90SGerry Weißbach $replace['page'] = $ID; 49a89efe90SGerry Weißbach $replace['namespace'] = getNS($ID); 508d79fe1bSGerry Weißbach 518d79fe1bSGerry Weißbach $new = $template; 528d79fe1bSGerry Weißbach foreach (array_keys($replace) as $key) { 538d79fe1bSGerry Weißbach if ( $new != $template ) { $template = $new; } 548d79fe1bSGerry Weißbach if ( $key != 'content' && substr($key, 0, 1) == '!' ) { 558d79fe1bSGerry Weißbach $rkey = substr($key, 1); 56e7e94c95SGerry Weißbach $replace[$key] = p_render('xhtml', p_get_instructions($replace[$key]),$info); 578d79fe1bSGerry Weißbach } else { $rkey = $key; } 588d79fe1bSGerry Weißbach $new = str_replace('@@' . strtoupper(trim($rkey)) . '@@', $replace[$key], $template); 59264a5e4eSGerry Weißbach $new = str_replace(urlencode('@@') . strtoupper(trim($rkey)) . urlencode('@@'), $replace[$key], $new); 608d79fe1bSGerry Weißbach } 618d79fe1bSGerry Weißbach 628d79fe1bSGerry Weißbach if ( $new != $event->data ) { 638d79fe1bSGerry Weißbach $event->data = $new; 648d79fe1bSGerry Weißbach } 658d79fe1bSGerry Weißbach 666af37903SGerry Weißbach $TOC = $oldtoc; 676af37903SGerry Weißbach 686af37903SGerry Weißbach $data = array('xhtml',& $event->data); 696af37903SGerry Weißbach trigger_event('RENDERER_CONTENT_POSTPROCESS',$data); 706af37903SGerry Weißbach 718d79fe1bSGerry Weißbach return true; 728d79fe1bSGerry Weißbach } 738d79fe1bSGerry Weißbach 746af37903SGerry Weißbach function handle_meta_data(& $event, $params) { 751afaeff3SGerry Weißbach global $ACT; 766af37903SGerry Weißbach 771afaeff3SGerry Weißbach $id = getId(); 781afaeff3SGerry Weißbach if ( $id != $event->data['page'] ) { return true; } 791afaeff3SGerry Weißbach $template = $this->resolve_template( $event->data['current']['templater'] ); 801afaeff3SGerry Weißbach if ( empty( $template) || in_array($template, array( $id, $event->data['page']) ) ) { return true; } 816af37903SGerry Weißbach 821afaeff3SGerry Weißbach $meta = p_get_metadata( $template, '', METADATA_RENDER_UNLIMITED ); 83dda40ffbSGerry Weißbach 84dda40ffbSGerry Weißbach 85dda40ffbSGerry Weißbach if ( !$event->data['current']['internal'] || !is_array($event->data['current']['internal']) ) $event->data['current']['internal'] = array(); 86e7e94c95SGerry Weißbach if ( !is_array($meta['internal']) ) $meta['internal'] = array(); 871afaeff3SGerry Weißbach $event->data['current']['internal'] = array_merge($event->data['current']['internal'], $meta['internal']); 88dda40ffbSGerry Weißbach 89dda40ffbSGerry Weißbach if ( !$event->data['current']['toc'] || !is_array($event->data['current']['toc']) ) $event->data['current']['toc'] = array(); 90e7e94c95SGerry Weißbach if ( !is_array($meta['toc']) ) $meta['toc'] = array(); 91e7e94c95SGerry Weißbach $event->data['current']['toc'] = array_merge($event->data['current']['toc'], $meta['toc']); 926af37903SGerry Weißbach 936af37903SGerry Weißbach return true; 946af37903SGerry Weißbach } 956af37903SGerry Weißbach 961afaeff3SGerry Weißbach private function resolve_template( $templater = array() ) { 976af37903SGerry Weißbach global $INFO; 986af37903SGerry Weißbach 99*bed95f50SGerry Weißbach $page = ''; 100*bed95f50SGerry Weißbach if (isset($INFO['meta']['templater']['page']) && !empty($INFO['meta']['templater']['page'])) { 101*bed95f50SGerry Weißbach $page = $INFO['meta']['templater']['page']; 102*bed95f50SGerry Weißbach } elseif (isset($templater['page']) && !empty($templater['page'])) { 103*bed95f50SGerry Weißbach $page = $templater['page']; 104*bed95f50SGerry Weißbach } 1051afaeff3SGerry Weißbach 1066af37903SGerry Weißbach // are we in an avtive Namespace? 107a89efe90SGerry Weißbach $template = $this->_getActiveNamespace(); 108e7e94c95SGerry Weißbach if ( !$template && empty( $page ) ) return; 1091afaeff3SGerry Weißbach 110a89efe90SGerry Weißbach return empty( $page ) ? $template : $page; 1116af37903SGerry Weißbach } 1126af37903SGerry Weißbach 1138d79fe1bSGerry Weißbach function _getActiveNamespace() { 1148d79fe1bSGerry Weißbach global $ID; 1158d79fe1bSGerry Weißbach global $INFO; 1168d79fe1bSGerry Weißbach 1178d79fe1bSGerry Weißbach $pattern = $this->getConf('excluded_pages'); 1188d79fe1bSGerry Weißbach if (strlen($pattern) > 0 && preg_match($pattern, $ID)) { 1198d79fe1bSGerry Weißbach return false; 1208d79fe1bSGerry Weißbach } 1218d79fe1bSGerry Weißbach 122a89efe90SGerry Weißbach $this->loadPages(); 123*bed95f50SGerry Weißbach foreach (self::$pages as $namespace) { 124a89efe90SGerry Weißbach $space = cleanID($namespace[0]); 125a89efe90SGerry Weißbach if (trim($space) && (strpos($ID, $space . ':') === 0)) { 126*bed95f50SGerry Weißbach return resolve_id($namespace[0], isset($namespace[1]) ? $namespace[1] : ''); 1278d79fe1bSGerry Weißbach } 1288d79fe1bSGerry Weißbach } 1298d79fe1bSGerry Weißbach 1308d79fe1bSGerry Weißbach return false; 1318d79fe1bSGerry Weißbach } 1328d79fe1bSGerry Weißbach 133a89efe90SGerry Weißbach private static $pages = null; 134a89efe90SGerry Weißbach private function loadPages() { 135*bed95f50SGerry Weißbach if ( self::$pages != null ) { 136a89efe90SGerry Weißbach return; 137a89efe90SGerry Weißbach } 138a89efe90SGerry Weißbach 139*bed95f50SGerry Weißbach self::$pages = array(); 140a89efe90SGerry Weißbach $namespaces = explode("\n", $this->getConf('enabled_namespaces')); 141a89efe90SGerry Weißbach foreach( $namespaces as $namespace ) { 142a89efe90SGerry Weißbach 143a89efe90SGerry Weißbach if ( strlen(trim($namespace)) == 0 ) { continue; } 144*bed95f50SGerry Weißbach self::$pages[] = explode("=>", $namespace); 145a89efe90SGerry Weißbach } 146a89efe90SGerry Weißbach } 1478d79fe1bSGerry Weißbach} 1488d79fe1bSGerry Weißbach 1498d79fe1bSGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 : 150