xref: /plugin/addnewpage/syntax.php (revision c2f9de420f64eb148a4cd5427dffdf932b5cae5a)
15ad1ba23SRobert McLeod<?php
2*c2f9de42SSam Wilson
3*c2f9de42SSam Wilson// must be run within Dokuwiki
4*c2f9de42SSam Wilsonif (!defined('DOKU_INC')) die();
5*c2f9de42SSam Wilson
65ad1ba23SRobert McLeodif (!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../../') . '/');
75ad1ba23SRobert McLeodif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
85ad1ba23SRobert McLeodrequire_once(DOKU_PLUGIN . 'syntax.php');
95ad1ba23SRobert McLeod
10*c2f9de42SSam Wilson/**
11*c2f9de42SSam Wilson * Add-New-Page Plugin: a simple form for adding new pages.
12*c2f9de42SSam Wilson *
13*c2f9de42SSam Wilson * @license  GPL 2 (http://www.gnu.org/licenses/gpl.html)
14*c2f9de42SSam Wilson * @author   iDO <ido@idotech.info>
15*c2f9de42SSam Wilson * @author   Sam Wilson <sam@samwilson.id.au>
16*c2f9de42SSam Wilson */
175ad1ba23SRobert McLeodclass syntax_plugin_addnewpage extends DokuWiki_Syntax_Plugin {
18*c2f9de42SSam Wilson
19*c2f9de42SSam Wilson    /**
20*c2f9de42SSam Wilson     * Get some information about this plugin.
21*c2f9de42SSam Wilson     *
22*c2f9de42SSam Wilson     * @return array The info array.
23*c2f9de42SSam Wilson     */
245ad1ba23SRobert McLeod    function getInfo() {
255ad1ba23SRobert McLeod        return array(
265ad1ba23SRobert McLeod            'author' => 'iDo',
275ad1ba23SRobert McLeod            'email' => 'ido@idotech.info',
28*c2f9de42SSam Wilson            'date' => '2013-02-14',
295ad1ba23SRobert McLeod            'name' => 'addnewpage',
30*c2f9de42SSam Wilson            'desc' => 'Adds a "new page form" to any wiki page.',
31*c2f9de42SSam Wilson            'url' => 'https://wiki.dokuwiki.org/plugin:addnewpage',
325ad1ba23SRobert McLeod        );
335ad1ba23SRobert McLeod    }
345ad1ba23SRobert McLeod
35*c2f9de42SSam Wilson    function getType() { return 'substition'; }
365ad1ba23SRobert McLeod
37*c2f9de42SSam Wilson    function getPType() { return 'block'; }
385ad1ba23SRobert McLeod
39*c2f9de42SSam Wilson    function getSort() { return 199; }
405ad1ba23SRobert McLeod
415ad1ba23SRobert McLeod    function connectTo($mode) {
425ad1ba23SRobert McLeod        $this->Lexer->addSpecialPattern('\{\{NEWPAGE[^\}]*\}\}', $mode, 'plugin_addnewpage');
435ad1ba23SRobert McLeod    }
445ad1ba23SRobert McLeod
455ad1ba23SRobert McLeod    function handle($match, $state, $pos, &$handler) {
465ad1ba23SRobert McLeod        $ns = substr($match, 10, -2);  // strip markup
475ad1ba23SRobert McLeod        return array($ns); // use an array here
485ad1ba23SRobert McLeod    }
495ad1ba23SRobert McLeod
50*c2f9de42SSam Wilson    /**
51*c2f9de42SSam Wilson     * Create the new-page form.
52*c2f9de42SSam Wilson     *
53*c2f9de42SSam Wilson     * @return boolean
54*c2f9de42SSam Wilson     */
555ad1ba23SRobert McLeod    function render($mode, &$renderer, $data) {
565ad1ba23SRobert McLeod        global $lang;
575ad1ba23SRobert McLeod        $renderer->info['cache'] = false;
585ad1ba23SRobert McLeod        $data = $data[0]; // get data back from the array
595ad1ba23SRobert McLeod
605ad1ba23SRobert McLeod        if ($mode == 'xhtml') {
61*c2f9de42SSam Wilson            $ns_select = $this->_makecombo($data);
62*c2f9de42SSam Wilson            if ($ns_select == $this->getLang('nooption')) {
63*c2f9de42SSam Wilson                $renderer->doc .= (!$this->getConf('addpage_hideACL')) ? $ns_select : '';
645ad1ba23SRobert McLeod                return true;
655ad1ba23SRobert McLeod            }
665ad1ba23SRobert McLeod
67*c2f9de42SSam Wilson            $button_val = ((@$this->getLang('okbutton')) ? $this->getLang('okbutton') : 'ok');
68*c2f9de42SSam Wilson            $form = '<div class="addnewpage">'.DOKU_LF
69*c2f9de42SSam Wilson                .DOKU_TAB.'<form name="addnewpage" method="post" accept-charset="'.$lang['encoding'].'">'.DOKU_LF
70*c2f9de42SSam Wilson                .DOKU_TAB.DOKU_TAB.$ns_select.DOKU_LF
71*c2f9de42SSam Wilson                .DOKU_TAB.DOKU_TAB.'<input class="edit" type="text" name="title" size="20" maxlength="255" tabindex="2" />'.DOKU_LF
72*c2f9de42SSam Wilson                .DOKU_TAB.DOKU_TAB.'<input class="button" type="submit" value="'.$button_val.'" tabindex="3" />'.DOKU_LF
73*c2f9de42SSam Wilson                .DOKU_TAB.'</form>'.DOKU_LF
74*c2f9de42SSam Wilson                .'</div>';
75*c2f9de42SSam Wilson            $renderer->doc .= $form;
765ad1ba23SRobert McLeod
775ad1ba23SRobert McLeod            return true;
785ad1ba23SRobert McLeod        }
795ad1ba23SRobert McLeod        return false;
805ad1ba23SRobert McLeod    }
81*c2f9de42SSam Wilson
825ad1ba23SRobert McLeod    /**
835ad1ba23SRobert McLeod     * Parse namespace request
845ad1ba23SRobert McLeod     *
855ad1ba23SRobert McLeod     * @author  Samuele Tognini <samuele@cli.di.unipi.it>
865ad1ba23SRobert McLeod     */
875ad1ba23SRobert McLeod    function _parse_ns($ns) {
885ad1ba23SRobert McLeod        global $ID;
895ad1ba23SRobert McLeod        $ns = preg_replace("/^\.(:|$)/", dirname(str_replace(':', '/', $ID)) . "$1", $ns);
905ad1ba23SRobert McLeod        $ns = str_replace("/", ":", $ns);
915ad1ba23SRobert McLeod        $ns = cleanID($ns);
925ad1ba23SRobert McLeod        return $ns;
935ad1ba23SRobert McLeod    }
94*c2f9de42SSam Wilson
95*c2f9de42SSam Wilson    /**
96*c2f9de42SSam Wilson     * Create the HTML Select element for namespace selection.
97*c2f9de42SSam Wilson     *
98*c2f9de42SSam Wilson     * @global string $ID The page ID
99*c2f9de42SSam Wilson     * @param string|false $data The destination namespace, or false if none provided.
100*c2f9de42SSam Wilson     * @return string Select element with appropriate NS selected.
101*c2f9de42SSam Wilson     */
1025ad1ba23SRobert McLeod    function _makecombo($data) {
1035ad1ba23SRobert McLeod        global $ID;
1045ad1ba23SRobert McLeod
1055ad1ba23SRobert McLeod        $hide = $this->getConf('addpage_hide');
1065ad1ba23SRobert McLeod
107*c2f9de42SSam Wilson        if (($data != "") && ($hide)) {
1085ad1ba23SRobert McLeod            return '<input type="hidden" name="np_cat" id="np_cat" value="'.$this->_parse_ns($data).'"/>';
109*c2f9de42SSam Wilson        }
1105ad1ba23SRobert McLeod
1115ad1ba23SRobert McLeod        $ns = explode(':', $ID);
1125ad1ba23SRobert McLeod        array_pop($ns);
1135ad1ba23SRobert McLeod        $ns = implode(':', $ns);
1145ad1ba23SRobert McLeod
1155ad1ba23SRobert McLeod        $r = $this->_getnslist("");
1165ad1ba23SRobert McLeod        $ret = '<select class="edit" id="np_cat" name="np_cat" tabindex="1">';
1175ad1ba23SRobert McLeod
1185ad1ba23SRobert McLeod        $someopt=false;
1195ad1ba23SRobert McLeod
1205ad1ba23SRobert McLeod        if ($this->getConf('addpage_showroot')) {
121*c2f9de42SSam Wilson            $root_disabled = (auth_quickaclcheck($data.":") < AUTH_CREATE);
1225ad1ba23SRobert McLeod            if ($data=='') {
1235ad1ba23SRobert McLeod                if (!$root_disabled) {
1245ad1ba23SRobert McLeod                    $ret.='<option '.(($ns=='')?'selected="true"':'').' value="">'.((@$this->getLang('namespaceRoot'))?$this->getLang('namespaceRoot'):'top').'</option>';
1255ad1ba23SRobert McLeod                    $someopt=true;
1265ad1ba23SRobert McLeod                }
1275ad1ba23SRobert McLeod            } else {
1285ad1ba23SRobert McLeod                if (!$root_disabled) {
1295ad1ba23SRobert McLeod                    $ret.='<option '.(($ns==$data)?'selected="true"':'').' value="'.$data.'">'.$data.'</option>';
1305ad1ba23SRobert McLeod                    $someopt=true;
1315ad1ba23SRobert McLeod                }
132*c2f9de42SSam Wilson            }
133*c2f9de42SSam Wilson        }
1345ad1ba23SRobert McLeod
1355ad1ba23SRobert McLeod        foreach ($r as $k => $v) {
136*c2f9de42SSam Wilson            if ($data != '') {
137*c2f9de42SSam Wilson                if (strpos(":" . $v, ":" . $data . ":") === false) {
138*c2f9de42SSam Wilson                    continue;
139*c2f9de42SSam Wilson                }
140*c2f9de42SSam Wilson            }
1415ad1ba23SRobert McLeod            if (auth_quickaclcheck($v . ":") < AUTH_CREATE) continue;
1425ad1ba23SRobert McLeod            $vv = explode(':', $v);
1435ad1ba23SRobert McLeod            $vv = str_repeat('&nbsp;&nbsp;', substr_count($v, ':')) . $vv[count($vv) - 1];
1445ad1ba23SRobert McLeod            $ret.='<option ' . (($ns == $v) ? 'selected="true"' : '') . ' value="' . $v . '">' . $vv . '</option>';
1455ad1ba23SRobert McLeod            $someopt = true;
1465ad1ba23SRobert McLeod        }
1475ad1ba23SRobert McLeod        $ret.='</select>';
1485ad1ba23SRobert McLeod        if (!$someopt) $ret = $this->getLang('nooption');
1495ad1ba23SRobert McLeod
1505ad1ba23SRobert McLeod        return $ret;
1515ad1ba23SRobert McLeod    }
152*c2f9de42SSam Wilson
1535ad1ba23SRobert McLeod    function _getnslist($tns = '') {
1545ad1ba23SRobert McLeod        require_once(DOKU_INC . 'inc/search.php');
1555ad1ba23SRobert McLeod        global $conf;
156*c2f9de42SSam Wilson        if ($tns == '') $tns = $conf['datadir'];
157*c2f9de42SSam Wilson        if (!is_dir($tns)) $tns = str_replace(':', '/', $tns);
1585ad1ba23SRobert McLeod        $data = array();
1595ad1ba23SRobert McLeod        $exclude = $this->getConf('addpage_exclude');
1605ad1ba23SRobert McLeod
161*c2f9de42SSam Wilson        if ($exclude == "") $exclude = array();
162*c2f9de42SSam Wilson        else $exclude = @explode(';', strtolower($exclude));
1635ad1ba23SRobert McLeod
1645ad1ba23SRobert McLeod        search($data, $tns, 'search_index', array('ns' => ''));
1655ad1ba23SRobert McLeod
1665ad1ba23SRobert McLeod        $data2 = array();
1675ad1ba23SRobert McLeod        foreach ($data as $k => $v) {
1685ad1ba23SRobert McLeod            if ($v['type'] == 'd') {
1695ad1ba23SRobert McLeod                if (!in_array(strtolower($v['id']), $exclude)) {
1705ad1ba23SRobert McLeod                    array_push($data2, $v['id']);
1715ad1ba23SRobert McLeod                    $r = $this->_getnslist($tns . '/' . $v['id']);
1725ad1ba23SRobert McLeod                    foreach ($r as $vv) {
173*c2f9de42SSam Wilson                        if (!in_array(strtolower($vv), $exclude)) {
1745ad1ba23SRobert McLeod                            array_push($data2, $v['id'] . ':' . $vv);
1755ad1ba23SRobert McLeod                        }
1765ad1ba23SRobert McLeod                    }
1775ad1ba23SRobert McLeod                }
1785ad1ba23SRobert McLeod            }
179*c2f9de42SSam Wilson        }
1805ad1ba23SRobert McLeod        return $data2;
1815ad1ba23SRobert McLeod    }
182*c2f9de42SSam Wilson
1835ad1ba23SRobert McLeod}
184