xref: /plugin/include/syntax/include.php (revision 61053b0410e7270611fe8e396b5a81b1441e1a07)
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