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