xref: /plugin/pagetemplater/action.php (revision a89efe903df1e11bd3515e6954c08a40f2b34b50)
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ßbach
248d79fe1bSGerry Weißbachrequire_once (DOKU_PLUGIN . 'action.php');
258d79fe1bSGerry Weißbachrequire_once(DOKU_INC . 'inc/pageutils.php');
268d79fe1bSGerry Weißbach
278d79fe1bSGerry Weißbachclass action_plugin_pagetemplater extends DokuWiki_Action_Plugin {
288d79fe1bSGerry Weißbach
298d79fe1bSGerry Weißbach    function getInfo(){
308d79fe1bSGerry Weißbach        return array_merge(confToHash(dirname(__FILE__).'/info.txt'), array(
318d79fe1bSGerry Weißbach				'name' => 'Page Templater Action Component',
328d79fe1bSGerry Weißbach		));
338d79fe1bSGerry Weißbach    }
348d79fe1bSGerry Weißbach
358d79fe1bSGerry Weißbach    /**
368d79fe1bSGerry Weißbach     * Register the eventhandlers.
378d79fe1bSGerry Weißbach     */
38d5795404SGerry Weißbach    function register(Doku_Event_Handler $controller) {
398d79fe1bSGerry Weißbach        $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'handle_content_display', array ());
401afaeff3SGerry Weißbach        $controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'handle_meta_data', array ());
418d79fe1bSGerry Weißbach    }
428d79fe1bSGerry Weißbach
438d79fe1bSGerry Weißbach    function handle_content_display(& $event, $params) {
44*a89efe90SGerry Weißbach		global $ACT, $INFO, $TOC, $ID;
458d79fe1bSGerry Weißbach
466af37903SGerry Weißbach		$template = $this->resolve_template();
476af37903SGerry Weißbach		if ( !$template || $ACT != 'show' ) { return; }
488d79fe1bSGerry Weißbach
496af37903SGerry Weißbach		$oldtoc = $TOC;
506af37903SGerry Weißbach		$template = p_wiki_xhtml( $template );
518d79fe1bSGerry Weißbach
528d79fe1bSGerry Weißbach		// set the replacements
538d79fe1bSGerry Weißbach		$replace = $INFO['meta']['templater'];
548d79fe1bSGerry Weißbach		unset($replace['page']);
558d79fe1bSGerry Weißbach		$replace['content'] = $event->data;
56*a89efe90SGerry Weißbach		$replace['page'] = $ID;
57*a89efe90SGerry Weißbach		$replace['namespace'] = getNS($ID);
588d79fe1bSGerry Weißbach
598d79fe1bSGerry Weißbach		$new = $template;
608d79fe1bSGerry Weißbach		foreach (array_keys($replace) as $key) {
618d79fe1bSGerry Weißbach			if ( $new != $template ) { $template = $new; }
628d79fe1bSGerry Weißbach			if ( $key != 'content' && substr($key, 0, 1) == '!' ) {
638d79fe1bSGerry Weißbach				$rkey = substr($key, 1);
644c1d7955SGerry Weißbach				$replace[$key] = p_render('xhtml', p_get_instructions($replace[$key]),$info);
658d79fe1bSGerry Weißbach			} else { $rkey = $key; }
668d79fe1bSGerry Weißbach			$new = str_replace('@@' . strtoupper(trim($rkey)) . '@@', $replace[$key], $template);
67264a5e4eSGerry Weißbach			$new = str_replace(urlencode('@@') . strtoupper(trim($rkey)) . urlencode('@@'), $replace[$key], $new);
688d79fe1bSGerry Weißbach		}
698d79fe1bSGerry Weißbach
708d79fe1bSGerry Weißbach		if ( $new != $event->data ) {
718d79fe1bSGerry Weißbach			$event->data = $new;
728d79fe1bSGerry Weißbach		}
738d79fe1bSGerry Weißbach
746af37903SGerry Weißbach		$TOC = $oldtoc;
756af37903SGerry Weißbach
766af37903SGerry Weißbach		$data = array('xhtml',& $event->data);
776af37903SGerry Weißbach        trigger_event('RENDERER_CONTENT_POSTPROCESS',$data);
786af37903SGerry Weißbach
798d79fe1bSGerry Weißbach		return true;
808d79fe1bSGerry Weißbach    }
818d79fe1bSGerry Weißbach
826af37903SGerry Weißbach    function handle_meta_data(& $event, $params) {
831afaeff3SGerry Weißbach		global $ACT;
846af37903SGerry Weißbach
851afaeff3SGerry Weißbach        $id = getId();
861afaeff3SGerry Weißbach        if ( $id != $event->data['page'] ) { return true; }
871afaeff3SGerry Weißbach		$template = $this->resolve_template( $event->data['current']['templater'] );
881afaeff3SGerry Weißbach		if ( empty( $template) || in_array($template, array( $id, $event->data['page']) ) ) { return true; }
896af37903SGerry Weißbach
901afaeff3SGerry Weißbach        $meta = p_get_metadata( $template, '', METADATA_RENDER_UNLIMITED );
91dda40ffbSGerry Weißbach
92dda40ffbSGerry Weißbach
93dda40ffbSGerry Weißbach        if ( !$event->data['current']['internal'] || !is_array($event->data['current']['internal']) ) $event->data['current']['internal'] = array();
941afaeff3SGerry Weißbach        $event->data['current']['internal'] = array_merge($event->data['current']['internal'], $meta['internal']);
95dda40ffbSGerry Weißbach
96dda40ffbSGerry Weißbach        if ( !$event->data['current']['toc'] || !is_array($event->data['current']['toc']) ) $event->data['current']['toc'] = array();
971afaeff3SGerry Weißbach        $event->data['current']['toc'] = array_merge($event->data['current']['toc'], $meta['toc']);
986af37903SGerry Weißbach
991afaeff3SGerry Weißbach/*
1006af37903SGerry Weißbach
1011afaeff3SGerry Weißbach		$data = array();
1021afaeff3SGerry Weißbach		$data['internal'] = p_get_metadata( $template, 'internal', METADATA_RENDER_UNLIMITED );
1031afaeff3SGerry Weißbach		$data['toc'] = p_get_metadata( $template, 'toc', METADATA_RENDER_UNLIMITED );
1041afaeff3SGerry Weißbach
1051afaeff3SGerry Weißbach        unset($cache_metadata[$ID]);
1061afaeff3SGerry Weißbach        p_set_metadata( $ID, $data );
1071afaeff3SGerry Weißbach        p_read_metadata( $ID, true );
1081afaeff3SGerry Weißbach        $INFO['meta'] = p_get_metadata($ID, null, METADATA_RENDER_UNLIMITED);
1091afaeff3SGerry Weißbach*/
1106af37903SGerry Weißbach		return true;
1116af37903SGerry Weißbach    }
1126af37903SGerry Weißbach
1131afaeff3SGerry Weißbach    private function resolve_template( $templater = array() ) {
1146af37903SGerry Weißbach		global $INFO;
1156af37903SGerry Weißbach
1161afaeff3SGerry Weißbach		$page = empty($INFO['meta']['templater']['page']) ? $templater['page'] : $INFO['meta']['templater']['page'];
1171afaeff3SGerry Weißbach
1186af37903SGerry Weißbach		// are we in an avtive Namespace?
119*a89efe90SGerry Weißbach		$template = $this->_getActiveNamespace();
1201afaeff3SGerry Weißbach
121*a89efe90SGerry Weißbach		if (!$template && empty( $page ) ) { return; }
1226af37903SGerry Weißbach
1236af37903SGerry Weißbach		// check for the template
124*a89efe90SGerry Weißbach		return empty( $page ) ? $template : $page;
1256af37903SGerry Weißbach    }
1266af37903SGerry Weißbach
1278d79fe1bSGerry Weißbach    function _getActiveNamespace() {
1288d79fe1bSGerry Weißbach    	global $ID;
1298d79fe1bSGerry Weißbach    	global $INFO;
1308d79fe1bSGerry Weißbach
1311afaeff3SGerry Weißbach// Removed on 2016-09-14
1321afaeff3SGerry Weißbach//		if (!$INFO['exists'])
1331afaeff3SGerry Weißbach//			return false;
1348d79fe1bSGerry Weißbach
1358d79fe1bSGerry Weißbach    	$pattern = $this->getConf('excluded_pages');
1368d79fe1bSGerry Weißbach		if (strlen($pattern) > 0 && preg_match($pattern, $ID)) {
1378d79fe1bSGerry Weißbach			return false;
1388d79fe1bSGerry Weißbach		}
1398d79fe1bSGerry Weißbach
140*a89efe90SGerry Weißbach        $this->loadPages();
141*a89efe90SGerry Weißbach        foreach ($this->pages as $namespace) {
142*a89efe90SGerry Weißbach			$space = cleanID($namespace[0]);
143*a89efe90SGerry Weißbach            if (trim($space) && (strpos($ID, $space . ':') === 0)) {
144*a89efe90SGerry Weißbach                return resolve_id($namespace[0], $namespace[1]);
1458d79fe1bSGerry Weißbach            }
1468d79fe1bSGerry Weißbach        }
1478d79fe1bSGerry Weißbach
1488d79fe1bSGerry Weißbach        return false;
1498d79fe1bSGerry Weißbach    }
1508d79fe1bSGerry Weißbach
151*a89efe90SGerry Weißbach    private static $pages = null;
152*a89efe90SGerry Weißbach    private function loadPages() {
153*a89efe90SGerry Weißbach        if ( $this->pages != null ) {
154*a89efe90SGerry Weißbach            return;
155*a89efe90SGerry Weißbach        }
156*a89efe90SGerry Weißbach
157*a89efe90SGerry Weißbach        $this->pages = array();
158*a89efe90SGerry Weißbach        $namespaces = explode("\n", $this->getConf('enabled_namespaces'));
159*a89efe90SGerry Weißbach        foreach( $namespaces as $namespace ) {
160*a89efe90SGerry Weißbach
161*a89efe90SGerry Weißbach            if ( strlen(trim($namespace)) == 0 ) { continue; }
162*a89efe90SGerry Weißbach            $this->pages[] = explode("=>", $namespace);
163*a89efe90SGerry Weißbach        }
164*a89efe90SGerry Weißbach    }
1658d79fe1bSGerry Weißbach}
1668d79fe1bSGerry Weißbach
1678d79fe1bSGerry Weißbach//Setup VIM: ex: et ts=4 enc=utf-8 :
168