13b37d1dfSAndreas Gohr<?php 23b37d1dfSAndreas Gohr 33b37d1dfSAndreas Gohruse dokuwiki\Utf8\PhpString; 43b37d1dfSAndreas Gohruse dokuwiki\Utf8\Sort; 53b37d1dfSAndreas Gohr 63b37d1dfSAndreas Gohr/** 73b37d1dfSAndreas Gohr * DokuWiki Plugin autoindex (Syntax Component) 83b37d1dfSAndreas Gohr * 93b37d1dfSAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 103b37d1dfSAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 113b37d1dfSAndreas Gohr */ 123b37d1dfSAndreas Gohrclass syntax_plugin_autoindex extends \dokuwiki\Extension\SyntaxPlugin 133b37d1dfSAndreas Gohr{ 143b37d1dfSAndreas Gohr /** @inheritDoc */ 153b37d1dfSAndreas Gohr public function getType() 163b37d1dfSAndreas Gohr { 173b37d1dfSAndreas Gohr return 'substition'; 183b37d1dfSAndreas Gohr } 193b37d1dfSAndreas Gohr 203b37d1dfSAndreas Gohr /** @inheritDoc */ 213b37d1dfSAndreas Gohr public function getSort() 223b37d1dfSAndreas Gohr { 233b37d1dfSAndreas Gohr return 155; 243b37d1dfSAndreas Gohr } 253b37d1dfSAndreas Gohr 263b37d1dfSAndreas Gohr /** @inheritDoc */ 273b37d1dfSAndreas Gohr public function getPType() 283b37d1dfSAndreas Gohr { 293b37d1dfSAndreas Gohr return 'block'; 303b37d1dfSAndreas Gohr } 313b37d1dfSAndreas Gohr 323b37d1dfSAndreas Gohr /** @inheritDoc */ 333b37d1dfSAndreas Gohr public function connectTo($mode) 343b37d1dfSAndreas Gohr { 353b37d1dfSAndreas Gohr $this->Lexer->addSpecialPattern('{{autoindex}}', $mode, 'plugin_autoindex'); 363b37d1dfSAndreas Gohr } 373b37d1dfSAndreas Gohr 383b37d1dfSAndreas Gohr /** @inheritDoc */ 393b37d1dfSAndreas Gohr public function handle($match, $state, $pos, Doku_Handler $handler) 403b37d1dfSAndreas Gohr { 413b37d1dfSAndreas Gohr $data = array(); 423b37d1dfSAndreas Gohr 433b37d1dfSAndreas Gohr return $data; 443b37d1dfSAndreas Gohr } 453b37d1dfSAndreas Gohr 463b37d1dfSAndreas Gohr /** @inheritDoc */ 473b37d1dfSAndreas Gohr public function render($format, Doku_Renderer $renderer, $data) 483b37d1dfSAndreas Gohr { 493b37d1dfSAndreas Gohr global $INFO; 503b37d1dfSAndreas Gohr global $conf; 513b37d1dfSAndreas Gohr 523b37d1dfSAndreas Gohr if ($format === 'metadata') { 533b37d1dfSAndreas Gohr return false; 543b37d1dfSAndreas Gohr } 553b37d1dfSAndreas Gohr 563b37d1dfSAndreas Gohr $opts = [ 573b37d1dfSAndreas Gohr 'listfiles' => true, 583b37d1dfSAndreas Gohr 'pagesonly' => true, 593b37d1dfSAndreas Gohr 'firsthead' => true, 60e04160d9SAndreas Gohr 'depth' => 1, 613b37d1dfSAndreas Gohr ]; 623b37d1dfSAndreas Gohr $data = []; 633b37d1dfSAndreas Gohr $ns = ':' . cleanID(getNS($INFO['id'])); 643b37d1dfSAndreas Gohr $ns = utf8_encodeFN(str_replace(':', '/', $ns)); 653b37d1dfSAndreas Gohr 663b37d1dfSAndreas Gohr search($data, $conf['datadir'], 'search_universal', $opts, $ns, 1, ''); 673b37d1dfSAndreas Gohr uasort($data, [$this, 'titleSort']); 683b37d1dfSAndreas Gohr 693b37d1dfSAndreas Gohr if ($format === 'xhtml') { 703b37d1dfSAndreas Gohr $renderer->doc .= '<div class="plugin_autoindex">'; 713b37d1dfSAndreas Gohr } 723b37d1dfSAndreas Gohr 733b37d1dfSAndreas Gohr $last = ''; 743b37d1dfSAndreas Gohr foreach ($data as $page) { 75c188a273SAndreas Gohr $first = PhpString::strtoupper(PhpString::substr($page['title'], 0, 1)); 763b37d1dfSAndreas Gohr if ($first !== $last) { 773b37d1dfSAndreas Gohr if ($last !== '') { 783b37d1dfSAndreas Gohr $renderer->listu_close(); 793b37d1dfSAndreas Gohr if ($format === 'xhtml') $renderer->doc .= '</div>'; 803b37d1dfSAndreas Gohr } 813b37d1dfSAndreas Gohr 823b37d1dfSAndreas Gohr $last = $first; 833b37d1dfSAndreas Gohr if ($format === 'xhtml') $renderer->doc .= '<div>'; 843b37d1dfSAndreas Gohr $renderer->header($first, 2, 0); 853b37d1dfSAndreas Gohr $renderer->listu_open(); 863b37d1dfSAndreas Gohr } 873b37d1dfSAndreas Gohr 883b37d1dfSAndreas Gohr $renderer->listitem_open(1); 893b37d1dfSAndreas Gohr $renderer->listcontent_open(); 903b37d1dfSAndreas Gohr $renderer->internallink($page['id'], $page['title']); 913b37d1dfSAndreas Gohr $renderer->listcontent_close(); 923b37d1dfSAndreas Gohr $renderer->listitem_close(); 933b37d1dfSAndreas Gohr } 943b37d1dfSAndreas Gohr 953b37d1dfSAndreas Gohr if ($last !== '') { 963b37d1dfSAndreas Gohr $renderer->listu_close(); 97*defc9013SAndreas Gohr if ($format === 'xhtml') $renderer->doc .= '</div>'; 983b37d1dfSAndreas Gohr } 993b37d1dfSAndreas Gohr 1003b37d1dfSAndreas Gohr if ($format === 'xhtml') { 1013b37d1dfSAndreas Gohr $renderer->doc .= '</div>'; 1023b37d1dfSAndreas Gohr } 1033b37d1dfSAndreas Gohr 1043b37d1dfSAndreas Gohr return true; 1053b37d1dfSAndreas Gohr } 1063b37d1dfSAndreas Gohr 1073b37d1dfSAndreas Gohr /** 1083b37d1dfSAndreas Gohr * Custom comparator for sorting by title 1093b37d1dfSAndreas Gohr * 1103b37d1dfSAndreas Gohr * @param array $a 1113b37d1dfSAndreas Gohr * @param array $b 1123b37d1dfSAndreas Gohr * @return int 1133b37d1dfSAndreas Gohr */ 1143b37d1dfSAndreas Gohr public function titleSort($a, $b) 1153b37d1dfSAndreas Gohr { 1163b37d1dfSAndreas Gohr return Sort::strcmp($a['title'], $b['title']); 1173b37d1dfSAndreas Gohr } 1183b37d1dfSAndreas Gohr} 1193b37d1dfSAndreas Gohr 120