xref: /plugin/autoindex/syntax.php (revision defc90139812cdcbba9497a7883ff3f30a7781d7)
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