xref: /plugin/pagetemplater/action.php (revision bed95f501c3380bd8f6b2ed6cecfc23b888cf344)
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