xref: /plugin/struct/syntax/table.php (revision 61356325e2c5dbdcb8405fa2eb4c34732d79b65f)
1549a0837SAndreas Gohr<?php
2*61356325SAnna 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
1507993756SAndreas Gohr// must be run within Dokuwiki
16549a0837SAndreas Gohrif (!defined('DOKU_INC')) die();
17549a0837SAndreas Gohr
18*61356325SAnna Dabrowskaclass syntax_plugin_struct_table extends DokuWiki_Syntax_Plugin
19*61356325SAnna Dabrowska{
203f2a8309SAndreas Gohr
213f2a8309SAndreas Gohr    /** @var string which class to use for output */
223f2a8309SAndreas Gohr    protected $tableclass = AggregationTable::class;
23d400a5f0SAnna Dabrowska    protected $idColumn = 'pid';
243f2a8309SAndreas Gohr
25549a0837SAndreas Gohr    /**
26549a0837SAndreas Gohr     * @return string Syntax mode type
27549a0837SAndreas Gohr     */
28*61356325SAnna Dabrowska    public function getType()
29*61356325SAnna Dabrowska    {
3015929be2SAndreas Gohr        return 'substition';
31549a0837SAndreas Gohr    }
323f2a8309SAndreas Gohr
33549a0837SAndreas Gohr    /**
34549a0837SAndreas Gohr     * @return string Paragraph type
35549a0837SAndreas Gohr     */
36*61356325SAnna Dabrowska    public function getPType()
37*61356325SAnna Dabrowska    {
3815929be2SAndreas Gohr        return 'block';
39549a0837SAndreas Gohr    }
403f2a8309SAndreas Gohr
41549a0837SAndreas Gohr    /**
42549a0837SAndreas Gohr     * @return int Sort order - Low numbers go before high numbers
43549a0837SAndreas Gohr     */
44*61356325SAnna Dabrowska    public function getSort()
45*61356325SAnna Dabrowska    {
465511bd5bSAndreas Gohr        return 155;
47549a0837SAndreas Gohr    }
48549a0837SAndreas Gohr
49549a0837SAndreas Gohr    /**
50549a0837SAndreas Gohr     * Connect lookup pattern to lexer.
51549a0837SAndreas Gohr     *
52549a0837SAndreas Gohr     * @param string $mode Parser mode
53549a0837SAndreas Gohr     */
54*61356325SAnna Dabrowska    public function connectTo($mode)
55*61356325SAnna Dabrowska    {
565511bd5bSAndreas Gohr        $this->Lexer->addSpecialPattern('----+ *struct table *-+\n.*?\n----+', $mode, 'plugin_struct_table');
57549a0837SAndreas Gohr    }
58549a0837SAndreas Gohr
59549a0837SAndreas Gohr    /**
60549a0837SAndreas Gohr     * Handle matches of the struct syntax
61549a0837SAndreas Gohr     *
62549a0837SAndreas Gohr     * @param string $match The match of the syntax
63549a0837SAndreas Gohr     * @param int $state The state of the handler
64549a0837SAndreas Gohr     * @param int $pos The position in the document
65549a0837SAndreas Gohr     * @param Doku_Handler $handler The handler
66549a0837SAndreas Gohr     * @return array Data for the renderer
67549a0837SAndreas Gohr     */
68*61356325SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
69*61356325SAnna Dabrowska    {
70bd363da9SAndreas Gohr        global $conf;
71549a0837SAndreas Gohr
725511bd5bSAndreas Gohr        $lines = explode("\n", $match);
735511bd5bSAndreas Gohr        array_shift($lines);
745511bd5bSAndreas Gohr        array_pop($lines);
755511bd5bSAndreas Gohr
765511bd5bSAndreas Gohr        try {
775511bd5bSAndreas Gohr            $parser = new ConfigParser($lines);
780659dc64SMichael Grosse            $config = $parser->getConfig();
790ceefd5cSAnna Dabrowska
800ceefd5cSAnna Dabrowska            $config = $this->addTypeFilter($config);
810ceefd5cSAnna Dabrowska
820659dc64SMichael Grosse            return $config;
835511bd5bSAndreas Gohr        } catch (StructException $e) {
845511bd5bSAndreas Gohr            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
85bd363da9SAndreas Gohr            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
865511bd5bSAndreas Gohr            return null;
875511bd5bSAndreas Gohr        }
88549a0837SAndreas Gohr    }
89549a0837SAndreas Gohr
90549a0837SAndreas Gohr    /**
91549a0837SAndreas Gohr     * Render xhtml output or metadata
92549a0837SAndreas Gohr     *
93549a0837SAndreas Gohr     * @param string $mode Renderer mode (supported modes: xhtml)
94549a0837SAndreas Gohr     * @param Doku_Renderer $renderer The renderer
95549a0837SAndreas Gohr     * @param array $data The data from the handler() function
96549a0837SAndreas Gohr     * @return bool If rendering was successful.
97549a0837SAndreas Gohr     */
98*61356325SAnna Dabrowska    public function render($mode, Doku_Renderer $renderer, $data)
99*61356325SAnna Dabrowska    {
1005511bd5bSAndreas Gohr        if (!$data) return false;
10106fee43aSMichael Grosse        global $INFO;
102bd363da9SAndreas Gohr        global $conf;
10329877279SMichael Große
10415929be2SAndreas Gohr        try {
1055511bd5bSAndreas Gohr            $search = new SearchConfig($data);
1066ce83f43SAndreas Gohr            if ($mode == 'struct_csv') {
1076ce83f43SAndreas Gohr                // no pagination in export
1086ce83f43SAndreas Gohr                $search->setLimit(0);
1096ce83f43SAndreas Gohr                $search->setOffset(0);
1106ce83f43SAndreas Gohr            }
1116ce83f43SAndreas Gohr
1123f2a8309SAndreas Gohr            /** @var AggregationTable $table */
113d400a5f0SAnna Dabrowska            $table = new $this->tableclass($INFO['id'], $mode, $renderer, $search, $this->idColumn);
11407993756SAndreas Gohr            $table->render();
11516b7d914SAndreas Gohr
11616b7d914SAndreas Gohr            if ($mode == 'metadata') {
11716b7d914SAndreas Gohr                /** @var Doku_Renderer_metadata $renderer */
11816b7d914SAndreas Gohr                $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
11916b7d914SAndreas Gohr            }
1205511bd5bSAndreas Gohr        } catch (StructException $e) {
12115929be2SAndreas Gohr            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
122bd363da9SAndreas Gohr            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
12315929be2SAndreas Gohr        }
12415929be2SAndreas Gohr
125549a0837SAndreas Gohr        return true;
126549a0837SAndreas Gohr    }
1270ceefd5cSAnna Dabrowska
1280ceefd5cSAnna Dabrowska    /**
1290ceefd5cSAnna Dabrowska     * Filter based on primary key columns
1300ceefd5cSAnna Dabrowska     *
1310ceefd5cSAnna Dabrowska     * @param array $config
1320ceefd5cSAnna Dabrowska     * @return array
1330ceefd5cSAnna Dabrowska     */
1340ceefd5cSAnna Dabrowska    protected function addTypeFilter($config)
1350ceefd5cSAnna Dabrowska    {
1360ceefd5cSAnna Dabrowska        $config['filter'][] = ['%rowid%', '=', (string)\dokuwiki\plugin\struct\meta\AccessTableData::DEFAULT_PAGE_RID, 'AND'];
1370ceefd5cSAnna Dabrowska        return $config;
1380ceefd5cSAnna Dabrowska    }
139549a0837SAndreas Gohr}
140