xref: /plugin/addnewpage/syntax.php (revision 58a4331aba22955e16abf627f6899cc4f1fd8bc5)
15ad1ba23SRobert McLeod<?php
2c2f9de42SSam Wilson
3c2f9de42SSam Wilson// must be run within Dokuwiki
4c2f9de42SSam Wilsonif(!defined('DOKU_INC')) die();
5c2f9de42SSam Wilson
6c2f9de42SSam Wilson/**
7c2f9de42SSam Wilson * Add-New-Page Plugin: a simple form for adding new pages.
8c2f9de42SSam Wilson *
9c2f9de42SSam Wilson * @license  GPL 2 (http://www.gnu.org/licenses/gpl.html)
10c2f9de42SSam Wilson * @author   iDO <ido@idotech.info>
11c2f9de42SSam Wilson * @author   Sam Wilson <sam@samwilson.id.au>
12c2f9de42SSam Wilson */
135ad1ba23SRobert McLeodclass syntax_plugin_addnewpage extends DokuWiki_Syntax_Plugin {
14c2f9de42SSam Wilson
15c2f9de42SSam Wilson    /**
16d49bfc3cSGerrit Uitslag     * Syntax Type
17c2f9de42SSam Wilson     */
18*58a4331aSGerrit Uitslag    function getType() {
19*58a4331aSGerrit Uitslag        return 'substition';
20*58a4331aSGerrit Uitslag    }
215ad1ba23SRobert McLeod
22d49bfc3cSGerrit Uitslag    /**
23d49bfc3cSGerrit Uitslag     * Paragraph Type
24d49bfc3cSGerrit Uitslag     */
25*58a4331aSGerrit Uitslag    function getPType() {
26*58a4331aSGerrit Uitslag        return 'block';
27*58a4331aSGerrit Uitslag    }
285ad1ba23SRobert McLeod
29d49bfc3cSGerrit Uitslag    /**
30d49bfc3cSGerrit Uitslag     * @return int
31d49bfc3cSGerrit Uitslag     */
32*58a4331aSGerrit Uitslag    function getSort() {
33*58a4331aSGerrit Uitslag        return 199;
34*58a4331aSGerrit Uitslag    }
355ad1ba23SRobert McLeod
36d49bfc3cSGerrit Uitslag    /**
37d49bfc3cSGerrit Uitslag     * @param string $mode
38d49bfc3cSGerrit Uitslag     */
395ad1ba23SRobert McLeod    function connectTo($mode) {
405ad1ba23SRobert McLeod        $this->Lexer->addSpecialPattern('\{\{NEWPAGE[^\}]*\}\}', $mode, 'plugin_addnewpage');
415ad1ba23SRobert McLeod    }
425ad1ba23SRobert McLeod
43d49bfc3cSGerrit Uitslag    /**
44d49bfc3cSGerrit Uitslag     * Handler to prepare matched data for the rendering process
45d49bfc3cSGerrit Uitslag     *
46d49bfc3cSGerrit Uitslag     * @param   string       $match   The text matched by the patterns
47d49bfc3cSGerrit Uitslag     * @param   int          $state   The lexer state for the match
48d49bfc3cSGerrit Uitslag     * @param   int          $pos     The character position of the matched text
49d49bfc3cSGerrit Uitslag     * @param   Doku_Handler $handler The Doku_Handler object
50d49bfc3cSGerrit Uitslag     * @return  array Return an array with all data you want to use in render
51d49bfc3cSGerrit Uitslag     */
52d49bfc3cSGerrit Uitslag    function handle($match, $state, $pos, Doku_Handler $handler) {
535ad1ba23SRobert McLeod        $ns = substr($match, 10, -2); // strip markup
54b15dc815SSam Wilson        return array($ns);
555ad1ba23SRobert McLeod    }
565ad1ba23SRobert McLeod
57c2f9de42SSam Wilson    /**
58c2f9de42SSam Wilson     * Create the new-page form.
59c2f9de42SSam Wilson     *
60d49bfc3cSGerrit Uitslag     * @param   $mode     string        output format being rendered
61d49bfc3cSGerrit Uitslag     * @param   $renderer Doku_Renderer the current renderer object
62d49bfc3cSGerrit Uitslag     * @param   $data     array         data created by handler()
63d49bfc3cSGerrit Uitslag     * @return  boolean                 rendered correctly?
64c2f9de42SSam Wilson     */
65d49bfc3cSGerrit Uitslag    function render($mode, Doku_Renderer $renderer, $data) {
665ad1ba23SRobert McLeod        global $lang;
675ad1ba23SRobert McLeod        $renderer->info['cache'] = false;
685ad1ba23SRobert McLeod        $data = $data[0]; // get data back from the array
695ad1ba23SRobert McLeod
705ad1ba23SRobert McLeod        if($mode == 'xhtml') {
71c2f9de42SSam Wilson            $ns_select = $this->_makecombo($data);
72c2f9de42SSam Wilson            if($ns_select == $this->getLang('nooption')) {
73c2f9de42SSam Wilson                $renderer->doc .= (!$this->getConf('addpage_hideACL')) ? $ns_select : '';
745ad1ba23SRobert McLeod                return true;
755ad1ba23SRobert McLeod            }
765ad1ba23SRobert McLeod
77c2f9de42SSam Wilson            $button_val = ((@$this->getLang('okbutton')) ? $this->getLang('okbutton') : 'ok');
78c2f9de42SSam Wilson            $form = '<div class="addnewpage">' . DOKU_LF
79447a4886SSam Wilson                . DOKU_TAB . '<form name="addnewpage" method="get" action="' . DOKU_BASE . DOKU_SCRIPT . '" accept-charset="' . $lang['encoding'] . '">' . DOKU_LF
80c2f9de42SSam Wilson                . DOKU_TAB . DOKU_TAB . $ns_select . DOKU_LF
81c2f9de42SSam Wilson                . DOKU_TAB . DOKU_TAB . '<input class="edit" type="text" name="title" size="20" maxlength="255" tabindex="2" />' . DOKU_LF
82447a4886SSam Wilson                . DOKU_TAB . DOKU_TAB . '<input type="hidden" name="do" value="edit" />' . DOKU_LF
83447a4886SSam Wilson                . DOKU_TAB . DOKU_TAB . '<input type="hidden" name="id" />' . DOKU_LF
84c2f9de42SSam Wilson                . DOKU_TAB . DOKU_TAB . '<input class="button" type="submit" value="' . $button_val . '" tabindex="3" />' . DOKU_LF
85c2f9de42SSam Wilson                . DOKU_TAB . '</form>' . DOKU_LF
86c2f9de42SSam Wilson                . '</div>';
87c2f9de42SSam Wilson            $renderer->doc .= $form;
885ad1ba23SRobert McLeod
895ad1ba23SRobert McLeod            return true;
905ad1ba23SRobert McLeod        }
915ad1ba23SRobert McLeod        return false;
925ad1ba23SRobert McLeod    }
93c2f9de42SSam Wilson
945ad1ba23SRobert McLeod    /**
955ad1ba23SRobert McLeod     * Parse namespace request
965ad1ba23SRobert McLeod     *
975ad1ba23SRobert McLeod     * @author Samuele Tognini <samuele@cli.di.unipi.it>
98a98ad79cSSam Wilson     * @author Michael Braun <michael-dev@fami-braun.de>
995ad1ba23SRobert McLeod     */
1005ad1ba23SRobert McLeod    function _parse_ns($ns) {
1015ad1ba23SRobert McLeod        global $ID;
10205e1bc90SMichael Braun        if($ns == "@PAGE@") return $ID;
10305e1bc90SMichael Braun        if($ns == "@NS@") return getNS($ID);
1045ad1ba23SRobert McLeod        $ns = preg_replace("/^\.(:|$)/", dirname(str_replace(':', '/', $ID)) . "$1", $ns);
1055ad1ba23SRobert McLeod        $ns = str_replace("/", ":", $ns);
1065ad1ba23SRobert McLeod        $ns = cleanID($ns);
1075ad1ba23SRobert McLeod        return $ns;
1085ad1ba23SRobert McLeod    }
109c2f9de42SSam Wilson
110c2f9de42SSam Wilson    /**
111c2f9de42SSam Wilson     * Create the HTML Select element for namespace selection.
112c2f9de42SSam Wilson     *
113c2f9de42SSam Wilson     * @global string $ID The page ID
1148fad05fbSSam Wilson     * @param string|false $dest_ns The destination namespace, or false if none provided.
115c2f9de42SSam Wilson     * @return string Select element with appropriate NS selected.
116c2f9de42SSam Wilson     */
117d36b62c6SSam Wilson    function _makecombo($dest_ns) {
1185ad1ba23SRobert McLeod        global $ID;
1195ad1ba23SRobert McLeod
1208fad05fbSSam Wilson        // If a NS has been provided:
1218fad05fbSSam Wilson        // Whether to hide the NS selection (otherwise, show only subnamespaces).
1225ad1ba23SRobert McLeod        $hide = $this->getConf('addpage_hide');
1235ad1ba23SRobert McLeod
1248fad05fbSSam Wilson        // Whether the user can create pages in the provided NS (or root, if no
1258fad05fbSSam Wilson        // destination NS has been set.
1268fad05fbSSam Wilson        $can_create = (auth_quickaclcheck($dest_ns . ":") >= AUTH_CREATE);
1278fad05fbSSam Wilson
1288fad05fbSSam Wilson        if(!empty($dest_ns) && $hide) {
1298fad05fbSSam Wilson            if($can_create) {
1308fad05fbSSam Wilson                return '<input type="hidden" name="np_cat" id="np_cat" value="' . $this->_parse_ns($dest_ns) . '"/>';
1318fad05fbSSam Wilson            } else {
1328fad05fbSSam Wilson                return $this->getLang('nooption');
1338fad05fbSSam Wilson            }
134c2f9de42SSam Wilson        }
1355ad1ba23SRobert McLeod
1365ad1ba23SRobert McLeod        $ns = explode(':', $ID);
1375ad1ba23SRobert McLeod        array_pop($ns);
1385ad1ba23SRobert McLeod        $ns = implode(':', $ns);
1395ad1ba23SRobert McLeod
140d49bfc3cSGerrit Uitslag        $subnamespaces = $this->_getnslist("");
1415ad1ba23SRobert McLeod        $ret = '<select class="edit" id="np_cat" name="np_cat" tabindex="1">';
1425ad1ba23SRobert McLeod
1438fad05fbSSam Wilson        // Whether the NS select element has any options
1445ad1ba23SRobert McLeod        $someopt = false;
1455ad1ba23SRobert McLeod
1468fad05fbSSam Wilson        // Show root namespace if requested and allowed
1478fad05fbSSam Wilson        if($this->getConf('addpage_showroot') && $can_create) {
1488fad05fbSSam Wilson            if(empty($dest_ns)) {
1498fad05fbSSam Wilson                // If no namespace has been provided, add an option for the root NS.
1508fad05fbSSam Wilson                $option_text = ((@$this->getLang('namespaceRoot')) ? $this->getLang('namespaceRoot') : 'top');
1518fad05fbSSam Wilson                $ret .= '<option ' . (($ns == '') ? 'selected ' : '') . 'value="">' . $option_text . '</option>';
1525ad1ba23SRobert McLeod                $someopt = true;
1535ad1ba23SRobert McLeod            } else {
1548fad05fbSSam Wilson                // If a namespace has been provided, add an option for it.
1558fad05fbSSam Wilson                $ret .= '<option ' . (($ns == $dest_ns) ? 'selected ' : '') . 'value="' . $dest_ns . '">' . $dest_ns . '</option>';
1565ad1ba23SRobert McLeod                $someopt = true;
1575ad1ba23SRobert McLeod            }
158c2f9de42SSam Wilson        }
1595ad1ba23SRobert McLeod
160d49bfc3cSGerrit Uitslag        foreach($subnamespaces as $v) {
161d49bfc3cSGerrit Uitslag            if($dest_ns != '') {
162d49bfc3cSGerrit Uitslag                if(strpos(":" . $v, ":" . $dest_ns . ":") === false) {
163c2f9de42SSam Wilson                    continue;
164c2f9de42SSam Wilson                }
165c2f9de42SSam Wilson            }
1665ad1ba23SRobert McLeod            if(auth_quickaclcheck($v . ":") < AUTH_CREATE) continue;
1675ad1ba23SRobert McLeod            $vv = explode(':', $v);
1685ad1ba23SRobert McLeod            $vv = str_repeat('&nbsp;&nbsp;', substr_count($v, ':')) . $vv[count($vv) - 1];
169e815d9c2SSam Wilson            $ret .= '<option ' . (($ns == $v) ? 'selected ' : '') . 'value="' . $v . '">' . $vv . '</option>';
1705ad1ba23SRobert McLeod            $someopt = true;
1715ad1ba23SRobert McLeod        }
1725ad1ba23SRobert McLeod        $ret .= '</select>';
1735ad1ba23SRobert McLeod        if(!$someopt) $ret = $this->getLang('nooption');
1745ad1ba23SRobert McLeod
1755ad1ba23SRobert McLeod        return $ret;
1765ad1ba23SRobert McLeod    }
177c2f9de42SSam Wilson
178f9dafbcdSSam Wilson    /**
179f9dafbcdSSam Wilson     * Get a list of namespaces below the given namespace.
180f9dafbcdSSam Wilson     * Recursively fetches subnamespaces.
181f9dafbcdSSam Wilson     *
182f9dafbcdSSam Wilson     * @param string $tns The top namespace
183f9dafbcdSSam Wilson     * @return array Multi-dimensional array of all namespaces below $tns
184f9dafbcdSSam Wilson     */
1855ad1ba23SRobert McLeod    function _getnslist($tns = '') {
1865ad1ba23SRobert McLeod        global $conf;
187d49bfc3cSGerrit Uitslag
188c2f9de42SSam Wilson        if($tns == '') $tns = $conf['datadir'];
189f9dafbcdSSam Wilson        if(!is_dir($tns)) $tns = utf8_encodeFN(str_replace(':', '/', $tns));
1905ad1ba23SRobert McLeod        $data = array();
1915ad1ba23SRobert McLeod        $exclude = $this->getConf('addpage_exclude');
1925ad1ba23SRobert McLeod
193c2f9de42SSam Wilson        if($exclude == "") $exclude = array();
194c2f9de42SSam Wilson        else $exclude = @explode(';', strtolower($exclude));
1955ad1ba23SRobert McLeod
1965ad1ba23SRobert McLeod        search($data, $tns, 'search_index', array('ns' => ''));
1975ad1ba23SRobert McLeod
1985ad1ba23SRobert McLeod        $data2 = array();
199d49bfc3cSGerrit Uitslag        foreach($data as $v) {
2005ad1ba23SRobert McLeod            if($v['type'] == 'd') {
2015ad1ba23SRobert McLeod                if(!in_array(strtolower($v['id']), $exclude)) {
2025ad1ba23SRobert McLeod                    array_push($data2, $v['id']);
2035ad1ba23SRobert McLeod                    $r = $this->_getnslist($tns . '/' . $v['id']);
2045ad1ba23SRobert McLeod                    foreach($r as $vv) {
205c2f9de42SSam Wilson                        if(!in_array(strtolower($vv), $exclude)) {
2065ad1ba23SRobert McLeod                            array_push($data2, $v['id'] . ':' . $vv);
2075ad1ba23SRobert McLeod                        }
2085ad1ba23SRobert McLeod                    }
2095ad1ba23SRobert McLeod                }
2105ad1ba23SRobert McLeod            }
211c2f9de42SSam Wilson        }
2125ad1ba23SRobert McLeod        return $data2;
2135ad1ba23SRobert McLeod    }
214c2f9de42SSam Wilson
2155ad1ba23SRobert McLeod}
216