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(' ', 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