xref: /plugin/struct/syntax/table.php (revision 34ea6e1056993bf65c34d15d1eb9730d4dfba9af)
1549a0837SAndreas Gohr<?php
261356325SAnna 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
10ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\AggregationTable;
11ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\ConfigParser;
12ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\SearchConfig;
13ba766201SAndreas Gohruse dokuwiki\plugin\struct\meta\StructException;
1415929be2SAndreas Gohr
1561356325SAnna Dabrowskaclass syntax_plugin_struct_table extends DokuWiki_Syntax_Plugin
1661356325SAnna Dabrowska{
173f2a8309SAndreas Gohr
183f2a8309SAndreas Gohr    /** @var string which class to use for output */
193f2a8309SAndreas Gohr    protected $tableclass = AggregationTable::class;
203f2a8309SAndreas Gohr
21549a0837SAndreas Gohr    /**
22549a0837SAndreas Gohr     * @return string Syntax mode type
23549a0837SAndreas Gohr     */
2461356325SAnna Dabrowska    public function getType()
2561356325SAnna Dabrowska    {
2615929be2SAndreas Gohr        return 'substition';
27549a0837SAndreas Gohr    }
283f2a8309SAndreas Gohr
29549a0837SAndreas Gohr    /**
30549a0837SAndreas Gohr     * @return string Paragraph type
31549a0837SAndreas Gohr     */
3261356325SAnna Dabrowska    public function getPType()
3361356325SAnna Dabrowska    {
3415929be2SAndreas Gohr        return 'block';
35549a0837SAndreas Gohr    }
363f2a8309SAndreas Gohr
37549a0837SAndreas Gohr    /**
38549a0837SAndreas Gohr     * @return int Sort order - Low numbers go before high numbers
39549a0837SAndreas Gohr     */
4061356325SAnna Dabrowska    public function getSort()
4161356325SAnna Dabrowska    {
425511bd5bSAndreas Gohr        return 155;
43549a0837SAndreas Gohr    }
44549a0837SAndreas Gohr
45549a0837SAndreas Gohr    /**
46549a0837SAndreas Gohr     * Connect lookup pattern to lexer.
47549a0837SAndreas Gohr     *
48549a0837SAndreas Gohr     * @param string $mode Parser mode
49549a0837SAndreas Gohr     */
5061356325SAnna Dabrowska    public function connectTo($mode)
5161356325SAnna Dabrowska    {
525511bd5bSAndreas Gohr        $this->Lexer->addSpecialPattern('----+ *struct table *-+\n.*?\n----+', $mode, 'plugin_struct_table');
53549a0837SAndreas Gohr    }
54549a0837SAndreas Gohr
55549a0837SAndreas Gohr    /**
56549a0837SAndreas Gohr     * Handle matches of the struct syntax
57549a0837SAndreas Gohr     *
58549a0837SAndreas Gohr     * @param string $match The match of the syntax
59549a0837SAndreas Gohr     * @param int $state The state of the handler
60549a0837SAndreas Gohr     * @param int $pos The position in the document
61549a0837SAndreas Gohr     * @param Doku_Handler $handler The handler
62549a0837SAndreas Gohr     * @return array Data for the renderer
63549a0837SAndreas Gohr     */
6461356325SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
6561356325SAnna Dabrowska    {
66bd363da9SAndreas Gohr        global $conf;
67549a0837SAndreas Gohr
685511bd5bSAndreas Gohr        $lines = explode("\n", $match);
695511bd5bSAndreas Gohr        array_shift($lines);
705511bd5bSAndreas Gohr        array_pop($lines);
715511bd5bSAndreas Gohr
725511bd5bSAndreas Gohr        try {
735511bd5bSAndreas Gohr            $parser = new ConfigParser($lines);
740659dc64SMichael Grosse            $config = $parser->getConfig();
750ceefd5cSAnna Dabrowska
760ceefd5cSAnna Dabrowska            $config = $this->addTypeFilter($config);
770ceefd5cSAnna Dabrowska
780659dc64SMichael Grosse            return $config;
795511bd5bSAndreas Gohr        } catch (StructException $e) {
805511bd5bSAndreas Gohr            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
81bd363da9SAndreas Gohr            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
825511bd5bSAndreas Gohr            return null;
835511bd5bSAndreas Gohr        }
84549a0837SAndreas Gohr    }
85549a0837SAndreas Gohr
86549a0837SAndreas Gohr    /**
87549a0837SAndreas Gohr     * Render xhtml output or metadata
88549a0837SAndreas Gohr     *
89*34ea6e10SAnna Dabrowska     * @param string $format Renderer mode (supported modes: xhtml)
90549a0837SAndreas Gohr     * @param Doku_Renderer $renderer The renderer
91549a0837SAndreas Gohr     * @param array $data The data from the handler() function
92549a0837SAndreas Gohr     * @return bool If rendering was successful.
93549a0837SAndreas Gohr     */
94*34ea6e10SAnna Dabrowska    public function render($format, Doku_Renderer $renderer, $data)
9561356325SAnna Dabrowska    {
965511bd5bSAndreas Gohr        if (!$data) return false;
97*34ea6e10SAnna Dabrowska
98*34ea6e10SAnna Dabrowska        foreach (helper_plugin_struct::BLACKLIST_RENDERER as $blacklisted) {
99*34ea6e10SAnna Dabrowska            if ($renderer instanceof $blacklisted) {
100*34ea6e10SAnna Dabrowska                return true;
101*34ea6e10SAnna Dabrowska            }
102*34ea6e10SAnna Dabrowska        }
103*34ea6e10SAnna Dabrowska
10406fee43aSMichael Grosse        global $INFO;
105bd363da9SAndreas Gohr        global $conf;
10629877279SMichael Große
10715929be2SAndreas Gohr        try {
1085511bd5bSAndreas Gohr            $search = new SearchConfig($data);
109*34ea6e10SAnna Dabrowska            if ($format === 'struct_csv') {
1106ce83f43SAndreas Gohr                // no pagination in export
1116ce83f43SAndreas Gohr                $search->setLimit(0);
1126ce83f43SAndreas Gohr                $search->setOffset(0);
1136ce83f43SAndreas Gohr            }
1146ce83f43SAndreas Gohr
1153f2a8309SAndreas Gohr            /** @var AggregationTable $table */
116*34ea6e10SAnna Dabrowska            $table = new $this->tableclass($INFO['id'], $format, $renderer, $search);
11707993756SAndreas Gohr            $table->render();
11816b7d914SAndreas Gohr
119*34ea6e10SAnna Dabrowska            if ($format === 'metadata') {
12016b7d914SAndreas Gohr                /** @var Doku_Renderer_metadata $renderer */
12116b7d914SAndreas Gohr                $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
12216b7d914SAndreas Gohr            }
1235511bd5bSAndreas Gohr        } catch (StructException $e) {
12415929be2SAndreas Gohr            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
125bd363da9SAndreas Gohr            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
12615929be2SAndreas Gohr        }
12715929be2SAndreas Gohr
128549a0837SAndreas Gohr        return true;
129549a0837SAndreas Gohr    }
1300ceefd5cSAnna Dabrowska
1310ceefd5cSAnna Dabrowska    /**
132c797933dSAnna Dabrowska     * Filter based on primary key columns, applicable in child classes
1330ceefd5cSAnna Dabrowska     *
1340ceefd5cSAnna Dabrowska     * @param array $config
1350ceefd5cSAnna Dabrowska     * @return array
1360ceefd5cSAnna Dabrowska     */
1370ceefd5cSAnna Dabrowska    protected function addTypeFilter($config)
1380ceefd5cSAnna Dabrowska    {
1390ceefd5cSAnna Dabrowska        return $config;
1400ceefd5cSAnna Dabrowska    }
141549a0837SAndreas Gohr}
142