10fb48f94SSatoshi Sahara<?php 20fb48f94SSatoshi Sahara 30fb48f94SSatoshi Saharanamespace dokuwiki\Ui; 40fb48f94SSatoshi Sahara 50fb48f94SSatoshi Saharause dokuwiki\Extension\Event; 60fb48f94SSatoshi Saharause dokuwiki\Form\Form; 70fb48f94SSatoshi Sahara 80fb48f94SSatoshi Sahara/** 914548198SSatoshi Sahara * DokuWiki Index Interface 100fb48f94SSatoshi Sahara * 110fb48f94SSatoshi Sahara * @package dokuwiki\Ui 120fb48f94SSatoshi Sahara */ 130fb48f94SSatoshi Saharaclass Index extends Ui 140fb48f94SSatoshi Sahara{ 1514548198SSatoshi Sahara protected $ns; 1614548198SSatoshi Sahara 1714548198SSatoshi Sahara /** 1814548198SSatoshi Sahara * Index Ui constructor 1914548198SSatoshi Sahara * 2014548198SSatoshi Sahara * @param string $ns namespace 2114548198SSatoshi Sahara */ 2214548198SSatoshi Sahara public function __construct($ns = '') 2314548198SSatoshi Sahara { 2414548198SSatoshi Sahara $this->ns = $ns; 2514548198SSatoshi Sahara } 2614548198SSatoshi Sahara 2714548198SSatoshi Sahara 280fb48f94SSatoshi Sahara /** 290fb48f94SSatoshi Sahara * Display page index 300fb48f94SSatoshi Sahara * 310fb48f94SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 320fb48f94SSatoshi Sahara * 330fb48f94SSatoshi Sahara * @return void 340fb48f94SSatoshi Sahara */ 3514548198SSatoshi Sahara public function show() 360fb48f94SSatoshi Sahara { 370fb48f94SSatoshi Sahara global $conf; 380fb48f94SSatoshi Sahara global $ID; 390fb48f94SSatoshi Sahara 4014548198SSatoshi Sahara $ns = cleanID($this->ns); 410fb48f94SSatoshi Sahara if (empty($ns)){ 420fb48f94SSatoshi Sahara $ns = getNS($ID); 430fb48f94SSatoshi Sahara if ($ns === false) $ns = ''; 440fb48f94SSatoshi Sahara } 450fb48f94SSatoshi Sahara $ns = utf8_encodeFN(str_replace(':', '/', $ns)); 460fb48f94SSatoshi Sahara 470fb48f94SSatoshi Sahara // print intro 480fb48f94SSatoshi Sahara print p_locale_xhtml('index'); 490fb48f94SSatoshi Sahara 500fb48f94SSatoshi Sahara print '<div id="index__tree" class="index__tree">'; 510fb48f94SSatoshi Sahara 520fb48f94SSatoshi Sahara $data = array(); 530fb48f94SSatoshi Sahara search($data, $conf['datadir'], 'search_index', array('ns' => $ns)); 54*9c8632b4SSatoshi Sahara print $this->buildIndexList($data); 550fb48f94SSatoshi Sahara 560fb48f94SSatoshi Sahara print '</div>'.DOKU_LF; 570fb48f94SSatoshi Sahara } 580fb48f94SSatoshi Sahara 590fb48f94SSatoshi Sahara /** 60*9c8632b4SSatoshi Sahara * Build html of unordered list of index items 61*9c8632b4SSatoshi Sahara * 62*9c8632b4SSatoshi Sahara * @param array $item 63*9c8632b4SSatoshi Sahara * @return string 64*9c8632b4SSatoshi Sahara */ 65*9c8632b4SSatoshi Sahara public function buildIndexList($data) 66*9c8632b4SSatoshi Sahara { 67*9c8632b4SSatoshi Sahara return html_buildlist($data, 'idx', [$this,'formatListItem'], [$this,'tagListItem']); 68*9c8632b4SSatoshi Sahara } 69*9c8632b4SSatoshi Sahara 70*9c8632b4SSatoshi Sahara /** 710fb48f94SSatoshi Sahara * Index item formatter 720fb48f94SSatoshi Sahara * 730fb48f94SSatoshi Sahara * User function for html_buildlist() 740fb48f94SSatoshi Sahara * 750fb48f94SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 760fb48f94SSatoshi Sahara * 770fb48f94SSatoshi Sahara * @param array $item 780fb48f94SSatoshi Sahara * @return string 790fb48f94SSatoshi Sahara */ 80f9ee77d6SSatoshi Sahara public function formatListItem($item) // RENAMED from html_list_index() 810fb48f94SSatoshi Sahara { 820fb48f94SSatoshi Sahara global $ID, $conf; 830fb48f94SSatoshi Sahara 840fb48f94SSatoshi Sahara // prevent searchbots needlessly following links 850fb48f94SSatoshi Sahara $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? 'rel="nofollow"' : ''; 860fb48f94SSatoshi Sahara 870fb48f94SSatoshi Sahara $html = ''; 880fb48f94SSatoshi Sahara $base = ':'.$item['id']; 890fb48f94SSatoshi Sahara $base = substr($base, strrpos($base,':') +1); 900fb48f94SSatoshi Sahara if ($item['type'] == 'd') { 910fb48f94SSatoshi Sahara // FS#2766, no need for search bots to follow namespace links in the index 920fb48f94SSatoshi Sahara $link = wl($ID, 'idx='. rawurlencode($item['id'])); 930fb48f94SSatoshi Sahara $html .= '<a href="'. $link .'" title="'. $item['id'] .'" class="idx_dir"' . $nofollow .'><strong>'; 940fb48f94SSatoshi Sahara $html .= $base; 950fb48f94SSatoshi Sahara $html .= '</strong></a>'; 960fb48f94SSatoshi Sahara } else { 970fb48f94SSatoshi Sahara // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605 980fb48f94SSatoshi Sahara $html .= html_wikilink(':'.$item['id'], useHeading('navigation') ? null : noNS($item['id'])); 990fb48f94SSatoshi Sahara } 1000fb48f94SSatoshi Sahara return $html; 1010fb48f94SSatoshi Sahara } 1020fb48f94SSatoshi Sahara 1030fb48f94SSatoshi Sahara /** 1040fb48f94SSatoshi Sahara * Index List item 1050fb48f94SSatoshi Sahara * 1060fb48f94SSatoshi Sahara * This user function is used in html_buildlist to build the 1070fb48f94SSatoshi Sahara * <li> tags for namespaces when displaying the page index 1080fb48f94SSatoshi Sahara * it gives different classes to opened or closed "folders" 1090fb48f94SSatoshi Sahara * 1100fb48f94SSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 1110fb48f94SSatoshi Sahara * 1120fb48f94SSatoshi Sahara * @param array $item 1130fb48f94SSatoshi Sahara * @return string html 1140fb48f94SSatoshi Sahara */ 115fbae750bSSatoshi Sahara public function tagListItem($item) // RENAMED from html_li_index() 1160fb48f94SSatoshi Sahara { 1170fb48f94SSatoshi Sahara global $INFO; 1180fb48f94SSatoshi Sahara global $ACT; 1190fb48f94SSatoshi Sahara 1200fb48f94SSatoshi Sahara $class = ''; 1210fb48f94SSatoshi Sahara $id = ''; 1220fb48f94SSatoshi Sahara 1230fb48f94SSatoshi Sahara if ($item['type'] == 'f') { 1240fb48f94SSatoshi Sahara // scroll to the current item 1250fb48f94SSatoshi Sahara if (isset($INFO) && $item['id'] == $INFO['id'] && $ACT == 'index') { 1260fb48f94SSatoshi Sahara $id = ' id="scroll__here"'; 1270fb48f94SSatoshi Sahara $class = ' bounce'; 1280fb48f94SSatoshi Sahara } 1290fb48f94SSatoshi Sahara return '<li class="level'.$item['level'].$class.'" '.$id.'>'; 1300fb48f94SSatoshi Sahara } elseif ($item['open']) { 1310fb48f94SSatoshi Sahara return '<li class="open">'; 1320fb48f94SSatoshi Sahara } else { 1330fb48f94SSatoshi Sahara return '<li class="closed">'; 1340fb48f94SSatoshi Sahara } 1350fb48f94SSatoshi Sahara } 1360fb48f94SSatoshi Sahara 1370fb48f94SSatoshi Sahara} 138