xref: /plugin/struct/syntax/list.php (revision d6d97f6064c3b0f90310be8341edc9585520ee54)
1549a0837SAndreas Gohr<?php
2*d6d97f60SAnna Dabrowska
3549a0837SAndreas Gohr/**
4549a0837SAndreas Gohr * DokuWiki Plugin struct (Syntax Component)
5549a0837SAndreas Gohr *
6549a0837SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7549a0837SAndreas Gohr * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
8549a0837SAndreas Gohr */
9549a0837SAndreas Gohr
10ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\AggregationList;
11ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser;
12ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\SearchConfig;
13ea5ad12aSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException;
14ea5ad12aSMichael Grosse
15549a0837SAndreas Gohr// must be run within Dokuwiki
16549a0837SAndreas Gohrif (!defined('DOKU_INC')) die();
17549a0837SAndreas Gohr
18*d6d97f60SAnna Dabrowskaclass syntax_plugin_struct_list extends DokuWiki_Syntax_Plugin
19*d6d97f60SAnna Dabrowska{
20ea5ad12aSMichael Grosse
21ea5ad12aSMichael Grosse    /** @var string which class to use for output */
22ea5ad12aSMichael Grosse    protected $tableclass = AggregationList::class;
23ea5ad12aSMichael Grosse
24549a0837SAndreas Gohr    /**
25549a0837SAndreas Gohr     * @return string Syntax mode type
26549a0837SAndreas Gohr     */
27*d6d97f60SAnna Dabrowska    public function getType()
28*d6d97f60SAnna Dabrowska    {
29ea5ad12aSMichael Grosse        return 'substition';
30549a0837SAndreas Gohr    }
31549a0837SAndreas Gohr    /**
32549a0837SAndreas Gohr     * @return string Paragraph type
33549a0837SAndreas Gohr     */
34*d6d97f60SAnna Dabrowska    public function getPType()
35*d6d97f60SAnna Dabrowska    {
36ea5ad12aSMichael Grosse        return 'block';
37549a0837SAndreas Gohr    }
38549a0837SAndreas Gohr    /**
39549a0837SAndreas Gohr     * @return int Sort order - Low numbers go before high numbers
40549a0837SAndreas Gohr     */
41*d6d97f60SAnna Dabrowska    public function getSort()
42*d6d97f60SAnna Dabrowska    {
43ea5ad12aSMichael Grosse        return 155;
44549a0837SAndreas Gohr    }
45549a0837SAndreas Gohr
46549a0837SAndreas Gohr    /**
47549a0837SAndreas Gohr     * Connect lookup pattern to lexer.
48549a0837SAndreas Gohr     *
49549a0837SAndreas Gohr     * @param string $mode Parser mode
50549a0837SAndreas Gohr     */
51*d6d97f60SAnna Dabrowska    public function connectTo($mode)
52*d6d97f60SAnna Dabrowska    {
53ea5ad12aSMichael Grosse        $this->Lexer->addSpecialPattern('----+ *struct list *-+\n.*?\n----+', $mode, 'plugin_struct_list');
54549a0837SAndreas Gohr    }
55549a0837SAndreas Gohr
56549a0837SAndreas Gohr    /**
57549a0837SAndreas Gohr     * Handle matches of the struct syntax
58549a0837SAndreas Gohr     *
59549a0837SAndreas Gohr     * @param string $match The match of the syntax
60549a0837SAndreas Gohr     * @param int    $state The state of the handler
61549a0837SAndreas Gohr     * @param int    $pos The position in the document
62549a0837SAndreas Gohr     * @param Doku_Handler    $handler The handler
63549a0837SAndreas Gohr     * @return array Data for the renderer
64549a0837SAndreas Gohr     */
65*d6d97f60SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
66*d6d97f60SAnna Dabrowska    {
67ea5ad12aSMichael Grosse        global $conf;
68549a0837SAndreas Gohr
69ea5ad12aSMichael Grosse        $lines = explode("\n", $match);
70ea5ad12aSMichael Grosse        array_shift($lines);
71ea5ad12aSMichael Grosse        array_pop($lines);
72ea5ad12aSMichael Grosse
73ea5ad12aSMichael Grosse        try {
74ea5ad12aSMichael Grosse            $parser = new ConfigParser($lines);
75ea5ad12aSMichael Grosse            $config = $parser->getConfig();
76ea5ad12aSMichael Grosse            return $config;
77ea5ad12aSMichael Grosse        } catch (StructException $e) {
78ea5ad12aSMichael Grosse            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
79ea5ad12aSMichael Grosse            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
80ea5ad12aSMichael Grosse            return null;
81ea5ad12aSMichael Grosse        }
82ea5ad12aSMichael Grosse    }
83ea5ad12aSMichael Grosse
84ea5ad12aSMichael Grosse    /**
85ea5ad12aSMichael Grosse     * Checks for options that do not work in a list aggregation
86ea5ad12aSMichael Grosse     *
87ea5ad12aSMichael Grosse     * @param array $config
88ea5ad12aSMichael Grosse     */
89*d6d97f60SAnna Dabrowska    protected function checkForInvalidOptions($config)
90*d6d97f60SAnna Dabrowska    {
91ea5ad12aSMichael Grosse        $illegal = ['dynfilters', 'summarize', 'rownumbers', 'widths', 'summary'];
92ea5ad12aSMichael Grosse        foreach ($illegal as $illegalOption)
93ea5ad12aSMichael Grosse        if (!empty($config[$illegalOption])) {
94ea5ad12aSMichael Grosse            throw new StructException('illegal option', $illegalOption);
95ea5ad12aSMichael Grosse        }
96549a0837SAndreas Gohr    }
97549a0837SAndreas Gohr
98549a0837SAndreas Gohr    /**
99549a0837SAndreas Gohr     * Render xhtml output or metadata
100549a0837SAndreas Gohr     *
101549a0837SAndreas Gohr     * @param string         $mode      Renderer mode (supported modes: xhtml)
102549a0837SAndreas Gohr     * @param Doku_Renderer  $renderer  The renderer
103549a0837SAndreas Gohr     * @param array          $data      The data from the handler() function
104549a0837SAndreas Gohr     * @return bool If rendering was successful.
105549a0837SAndreas Gohr     */
106*d6d97f60SAnna Dabrowska    public function render($mode, Doku_Renderer $renderer, $data)
107*d6d97f60SAnna Dabrowska    {
108549a0837SAndreas Gohr        if ($mode != 'xhtml') return false;
109ea5ad12aSMichael Grosse        if (!$data) return false;
110ea5ad12aSMichael Grosse        global $INFO;
111ea5ad12aSMichael Grosse        global $conf;
112ea5ad12aSMichael Grosse
113ea5ad12aSMichael Grosse        try {
114ea5ad12aSMichael Grosse            $this->checkForInvalidOptions($data);
115ea5ad12aSMichael Grosse            $search = new SearchConfig($data);
116ea5ad12aSMichael Grosse
117ea5ad12aSMichael Grosse            /** @var AggregationList $list */
118ea5ad12aSMichael Grosse            $list = new $this->tableclass($INFO['id'], $mode, $renderer, $search);
119ea5ad12aSMichael Grosse            $list->render();
120ea5ad12aSMichael Grosse
121ea5ad12aSMichael Grosse            if ($mode == 'metadata') {
122ea5ad12aSMichael Grosse                /** @var Doku_Renderer_metadata $renderer */
123ea5ad12aSMichael Grosse                $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
124ea5ad12aSMichael Grosse            }
125ea5ad12aSMichael Grosse        } catch (StructException $e) {
126ea5ad12aSMichael Grosse            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
127ea5ad12aSMichael Grosse            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
128ea5ad12aSMichael Grosse        }
129549a0837SAndreas Gohr
130549a0837SAndreas Gohr        return true;
131549a0837SAndreas Gohr    }
132549a0837SAndreas Gohr}
133549a0837SAndreas Gohr
134549a0837SAndreas Gohr// vim:ts=4:sw=4:et:
135