171ec1101SGina Haeussge<?php 271ec1101SGina Haeussge/** 371ec1101SGina Haeussge * Include Plugin: displays a wiki page within another 471ec1101SGina Haeussge * Usage: 571ec1101SGina Haeussge * {{page>page}} for "page" in same namespace 671ec1101SGina Haeussge * {{page>:page}} for "page" in top namespace 771ec1101SGina Haeussge * {{page>namespace:page}} for "page" in namespace "namespace" 871ec1101SGina Haeussge * {{page>.namespace:page}} for "page" in subnamespace "namespace" 971ec1101SGina Haeussge * {{page>page#section}} for a section of "page" 1071ec1101SGina Haeussge * 1171ec1101SGina Haeussge * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 1271ec1101SGina Haeussge * @author Esther Brunner <wikidesign@gmail.com> 1371ec1101SGina Haeussge * @author Christopher Smith <chris@jalakai.co.uk> 1471ec1101SGina Haeussge * @author Gina Häußge, Michael Klier <dokuwiki@chimeric.de> 1571ec1101SGina Haeussge */ 1671ec1101SGina Haeussge 1771ec1101SGina Haeussgeif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/'); 1871ec1101SGina Haeussgeif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); 1971ec1101SGina Haeussgerequire_once(DOKU_PLUGIN.'syntax.php'); 2071ec1101SGina Haeussge 2171ec1101SGina Haeussge/** 2271ec1101SGina Haeussge * All DokuWiki plugins to extend the parser/rendering mechanism 2371ec1101SGina Haeussge * need to inherit from this class 2471ec1101SGina Haeussge */ 2571ec1101SGina Haeussgeclass syntax_plugin_include_include extends DokuWiki_Syntax_Plugin { 2671ec1101SGina Haeussge 27*61053b04SMichael Klier var $helper = null; 28*61053b04SMichael Klier 2971ec1101SGina Haeussge function getInfo() { 3071ec1101SGina Haeussge return array( 3171ec1101SGina Haeussge 'author' => 'Gina Häußge, Michael Klier, Esther Brunner', 3271ec1101SGina Haeussge 'email' => 'dokuwiki@chimeric.de', 334052f233SGina Haeussge 'date' => @file_get_contents(DOKU_PLUGIN . 'blog/VERSION'), 3471ec1101SGina Haeussge 'name' => 'Include Plugin', 3571ec1101SGina Haeussge 'desc' => 'Displays a wiki page (or a section thereof) within another', 3671ec1101SGina Haeussge 'url' => 'http://wiki.splitbrain.org/plugin:include', 3771ec1101SGina Haeussge ); 3871ec1101SGina Haeussge } 3971ec1101SGina Haeussge 4071ec1101SGina Haeussge function getType() { return 'substition'; } 4171ec1101SGina Haeussge function getSort() { return 303; } 4271ec1101SGina Haeussge function getPType() { return 'block'; } 4371ec1101SGina Haeussge 4471ec1101SGina Haeussge function connectTo($mode) { 4571ec1101SGina Haeussge $this->Lexer->addSpecialPattern("{{page>.+?}}", $mode, 'plugin_include_include'); 4671ec1101SGina Haeussge $this->Lexer->addSpecialPattern("{{section>.+?}}", $mode, 'plugin_include_include'); 4771ec1101SGina Haeussge } 4871ec1101SGina Haeussge 4971ec1101SGina Haeussge function handle($match, $state, $pos, &$handler) { 5071ec1101SGina Haeussge 5171ec1101SGina Haeussge $match = substr($match, 2, -2); // strip markup 5271ec1101SGina Haeussge list($match, $flags) = explode('&', $match, 2); 5371ec1101SGina Haeussge 54*61053b04SMichael Klier // break the pattern up into its parts 5571ec1101SGina Haeussge list($include, $id, $section) = preg_split('/>|#/u', $match, 3); 5671ec1101SGina Haeussge return array($include, $id, cleanID($section), explode('&', $flags)); 5771ec1101SGina Haeussge } 5871ec1101SGina Haeussge 5971ec1101SGina Haeussge function render($format, &$renderer, $data) { 6071ec1101SGina Haeussge global $ID; 6171ec1101SGina Haeussge 62*61053b04SMichael Klier list($type, $raw_id, $section, $flags, $lvl, $toc) = $data; 6371ec1101SGina Haeussge 6471ec1101SGina Haeussge $id = $this->_applyMacro($raw_id); 6571ec1101SGina Haeussge $nocache = ($id != $raw_id); 6671ec1101SGina Haeussge 67*61053b04SMichael Klier resolve_pageid(getNS($ID), $id, $exists); // resolve shortcuts 6871ec1101SGina Haeussge 6971ec1101SGina Haeussge if ($nocache) $renderer->info['cache'] = false; // prevent caching 7071ec1101SGina Haeussge if (AUTH_READ > auth_quickaclcheck($id)) return true; // check for permission 7171ec1101SGina Haeussge 72*61053b04SMichael Klier $this->helper =& plugin_load('helper', 'include'); 7371ec1101SGina Haeussge 74*61053b04SMichael Klier $this->helper->setMode($type); 75*61053b04SMichael Klier $this->helper->setFlags($flags); 7671ec1101SGina Haeussge 77*61053b04SMichael Klier if (!$this->helper->setPage(compact('type','id','section','exists'))) { 78*61053b04SMichael Klier return false; 79*61053b04SMichael Klier } 80*61053b04SMichael Klier 81*61053b04SMichael Klier // handle render formats 82*61053b04SMichael Klier switch($format) { 83*61053b04SMichael Klier case 'xhtml': 84*61053b04SMichael Klier 85*61053b04SMichael Klier // check for toc to prepend eventually 86*61053b04SMichael Klier if(!empty($toc)) { 87*61053b04SMichael Klier foreach($toc as $data) { 88*61053b04SMichael Klier $item = array(); 89*61053b04SMichael Klier $item['hid'] = $renderer->_headerToLink($data[0], 'true'); 90*61053b04SMichael Klier $item['title'] = $data[0]; 91*61053b04SMichael Klier $item['type'] = ul; 92*61053b04SMichael Klier $item['level'] = $data[1]; 93*61053b04SMichael Klier array_push($this->helper->toc, $item); 94*61053b04SMichael Klier } 95*61053b04SMichael Klier } 96*61053b04SMichael Klier 97*61053b04SMichael Klier 98*61053b04SMichael Klier $this->helper->setLevel($lvl); 99*61053b04SMichael Klier 100*61053b04SMichael Klier // close current section 101*61053b04SMichael Klier if ($lvl && ($type == 'section')) $renderer->doc .= '</div>'; 102*61053b04SMichael Klier 103*61053b04SMichael Klier // include the page 104*61053b04SMichael Klier $this->helper->renderXHTML($renderer, $info); 105*61053b04SMichael Klier 106*61053b04SMichael Klier // propagate any cache prevention from included pages into this page 107*61053b04SMichael Klier if ($info['cache'] == false) $renderer->info['cache'] = false; 108*61053b04SMichael Klier 109*61053b04SMichael Klier // resume current section 110*61053b04SMichael Klier if ($lvl && ($type == 'section')) $renderer->doc .= '<div class="level'.$lvl.'">'; 111*61053b04SMichael Klier 112*61053b04SMichael Klier return true; 113*61053b04SMichael Klier break; 114*61053b04SMichael Klier 115*61053b04SMichael Klier case 'odt': 11671ec1101SGina Haeussge 11771ec1101SGina Haeussge // current section level 11871ec1101SGina Haeussge $clevel = 0; 11971ec1101SGina Haeussge preg_match_all('|<text:h text:style-name="Heading_20_\d" text:outline-level="(\d)">|i', $renderer->doc, $matches, PREG_SET_ORDER); 12071ec1101SGina Haeussge $n = count($matches) - 1; 12171ec1101SGina Haeussge if ($n > -1) $clevel = $matches[$n][1]; 122*61053b04SMichael Klier $this->helper->setLevel($clevel); 12371ec1101SGina Haeussge 12471ec1101SGina Haeussge // include the page now 125*61053b04SMichael Klier $this->helpeer->renderODT($renderer); 12671ec1101SGina Haeussge 12771ec1101SGina Haeussge return true; 128*61053b04SMichael Klier break; 12971ec1101SGina Haeussge 13071ec1101SGina Haeussge case 'metadata': 131*61053b04SMichael Klier if (!$nocache) { 13271ec1101SGina Haeussge $renderer->meta['relation']['haspart'][$id] = @file_exists(wikiFN($id)); 13371ec1101SGina Haeussge } 13471ec1101SGina Haeussge return true; 135*61053b04SMichael Klier break; 136*61053b04SMichael Klier default; 13771ec1101SGina Haeussge return false; 138*61053b04SMichael Klier break; 13971ec1101SGina Haeussge } 14071ec1101SGina Haeussge } 14171ec1101SGina Haeussge 14271ec1101SGina Haeussge /** 14371ec1101SGina Haeussge * Makes user or date dependent includes possible 14471ec1101SGina Haeussge */ 14571ec1101SGina Haeussge function _applyMacro($id) { 14671ec1101SGina Haeussge global $INFO, $auth; 147efa360b9SGina Haeussge 148efa360b9SGina Haeussge // if we don't have an auth object, do nothing 149efa360b9SGina Haeussge if (!$auth) 150efa360b9SGina Haeussge return $id; 15171ec1101SGina Haeussge 15271ec1101SGina Haeussge $user = $_SERVER['REMOTE_USER']; 15371ec1101SGina Haeussge $userdata = $auth->getUserData($user); 15471ec1101SGina Haeussge $group = $userdata['grps'][0]; 15571ec1101SGina Haeussge 15671ec1101SGina Haeussge $replace = array( 15771ec1101SGina Haeussge '@USER@' => cleanID($user), 15871ec1101SGina Haeussge '@NAME@' => cleanID($INFO['userinfo']['name']), 15971ec1101SGina Haeussge '@GROUP@' => cleanID($group), 16071ec1101SGina Haeussge '@YEAR@' => date('Y'), 16171ec1101SGina Haeussge '@MONTH@' => date('m'), 16271ec1101SGina Haeussge '@DAY@' => date('d'), 16371ec1101SGina Haeussge ); 16471ec1101SGina Haeussge return str_replace(array_keys($replace), array_values($replace), $id); 16571ec1101SGina Haeussge } 16671ec1101SGina Haeussge} 16771ec1101SGina Haeussge// vim:ts=4:sw=4:et:enc=utf-8: 168