xref: /plugin/bez/syntax/struct.php (revision 14a1f0a435358d79e2e5814db93baefc0cfe6877)
1*14a1f0a4SSzymon Olewniczak<?php
2*14a1f0a4SSzymon Olewniczak
3*14a1f0a4SSzymon Olewniczakuse \dokuwiki\plugin\bez\mdl\Model;
4*14a1f0a4SSzymon Olewniczakuse \dokuwiki\plugin\bez\struct\BezSearch;
5*14a1f0a4SSzymon Olewniczak
6*14a1f0a4SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\ConfigParser;
7*14a1f0a4SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\AggregationTable;
8*14a1f0a4SSzymon Olewniczakuse dokuwiki\plugin\struct\meta\StructException;
9*14a1f0a4SSzymon Olewniczak
10*14a1f0a4SSzymon Olewniczak// must be run within Dokuwiki
11*14a1f0a4SSzymon Olewniczakif(!defined('DOKU_INC')) die();
12*14a1f0a4SSzymon Olewniczak
13*14a1f0a4SSzymon Olewniczakclass syntax_plugin_bez_struct extends DokuWiki_Syntax_Plugin {
14*14a1f0a4SSzymon Olewniczak
15*14a1f0a4SSzymon Olewniczak    /**
16*14a1f0a4SSzymon Olewniczak     * @return string Syntax mode type
17*14a1f0a4SSzymon Olewniczak     */
18*14a1f0a4SSzymon Olewniczak    public function getType() {
19*14a1f0a4SSzymon Olewniczak        return 'substition';
20*14a1f0a4SSzymon Olewniczak    }
21*14a1f0a4SSzymon Olewniczak
22*14a1f0a4SSzymon Olewniczak    /**
23*14a1f0a4SSzymon Olewniczak     * @return string Paragraph type
24*14a1f0a4SSzymon Olewniczak     */
25*14a1f0a4SSzymon Olewniczak    public function getPType() {
26*14a1f0a4SSzymon Olewniczak        return 'block';
27*14a1f0a4SSzymon Olewniczak    }
28*14a1f0a4SSzymon Olewniczak
29*14a1f0a4SSzymon Olewniczak    /**
30*14a1f0a4SSzymon Olewniczak     * @return int Sort order - Low numbers go before high numbers
31*14a1f0a4SSzymon Olewniczak     */
32*14a1f0a4SSzymon Olewniczak    public function getSort() {
33*14a1f0a4SSzymon Olewniczak        return 155;
34*14a1f0a4SSzymon Olewniczak    }
35*14a1f0a4SSzymon Olewniczak
36*14a1f0a4SSzymon Olewniczak    /**
37*14a1f0a4SSzymon Olewniczak     * Connect lookup pattern to lexer.
38*14a1f0a4SSzymon Olewniczak     *
39*14a1f0a4SSzymon Olewniczak     * @param string $mode Parser mode
40*14a1f0a4SSzymon Olewniczak     */
41*14a1f0a4SSzymon Olewniczak    public function connectTo($mode) {
42*14a1f0a4SSzymon Olewniczak        $this->Lexer->addSpecialPattern('----+ *struct bez *-+\n.*?\n----+', $mode, 'plugin_bez_struct');
43*14a1f0a4SSzymon Olewniczak    }
44*14a1f0a4SSzymon Olewniczak
45*14a1f0a4SSzymon Olewniczak    /**
46*14a1f0a4SSzymon Olewniczak     * Handle matches of the struct syntax
47*14a1f0a4SSzymon Olewniczak     *
48*14a1f0a4SSzymon Olewniczak     * @param string $match The match of the syntax
49*14a1f0a4SSzymon Olewniczak     * @param int $state The state of the handler
50*14a1f0a4SSzymon Olewniczak     * @param int $pos The position in the document
51*14a1f0a4SSzymon Olewniczak     * @param Doku_Handler $handler The handler
52*14a1f0a4SSzymon Olewniczak     * @return array Data for the renderer
53*14a1f0a4SSzymon Olewniczak     */
54*14a1f0a4SSzymon Olewniczak    public function handle($match, $state, $pos, Doku_Handler $handler) {
55*14a1f0a4SSzymon Olewniczak        global $conf;
56*14a1f0a4SSzymon Olewniczak
57*14a1f0a4SSzymon Olewniczak        $lines = explode("\n", $match);
58*14a1f0a4SSzymon Olewniczak        array_shift($lines);
59*14a1f0a4SSzymon Olewniczak        array_pop($lines);
60*14a1f0a4SSzymon Olewniczak
61*14a1f0a4SSzymon Olewniczak        try {
62*14a1f0a4SSzymon Olewniczak            $parser = new ConfigParser($lines);
63*14a1f0a4SSzymon Olewniczak            $config = $parser->getConfig();
64*14a1f0a4SSzymon Olewniczak            return $config;
65*14a1f0a4SSzymon Olewniczak        } catch(StructException $e) {
66*14a1f0a4SSzymon Olewniczak            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
67*14a1f0a4SSzymon Olewniczak            if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
68*14a1f0a4SSzymon Olewniczak            return null;
69*14a1f0a4SSzymon Olewniczak        }
70*14a1f0a4SSzymon Olewniczak    }
71*14a1f0a4SSzymon Olewniczak
72*14a1f0a4SSzymon Olewniczak    /**
73*14a1f0a4SSzymon Olewniczak     * Render xhtml output or metadata
74*14a1f0a4SSzymon Olewniczak     *
75*14a1f0a4SSzymon Olewniczak     * @param string $mode Renderer mode (supported modes: xhtml)
76*14a1f0a4SSzymon Olewniczak     * @param Doku_Renderer $renderer The renderer
77*14a1f0a4SSzymon Olewniczak     * @param array $data The data from the handler() function
78*14a1f0a4SSzymon Olewniczak     * @return bool If rendering was successful.
79*14a1f0a4SSzymon Olewniczak     */
80*14a1f0a4SSzymon Olewniczak    public function render($mode, Doku_Renderer $renderer, $data) {
81*14a1f0a4SSzymon Olewniczak        if($mode != 'xhtml') return true;
82*14a1f0a4SSzymon Olewniczak        if(!$data) return false;
83*14a1f0a4SSzymon Olewniczak        global $INFO;
84*14a1f0a4SSzymon Olewniczak        global $conf;
85*14a1f0a4SSzymon Olewniczak        global $auth;
86*14a1f0a4SSzymon Olewniczak
87*14a1f0a4SSzymon Olewniczak        return true;
88*14a1f0a4SSzymon Olewniczak
89*14a1f0a4SSzymon Olewniczak        try {
90*14a1f0a4SSzymon Olewniczak            $schema = $data['schemas'][0][0];
91*14a1f0a4SSzymon Olewniczak            /** @var Model $model */
92*14a1f0a4SSzymon Olewniczak            $model = new Model($auth, $INFO['client'], $this, $conf);
93*14a1f0a4SSzymon Olewniczak
94*14a1f0a4SSzymon Olewniczak            $factory = $model->factory($schema);
95*14a1f0a4SSzymon Olewniczak            $search = new BezSearch($data, $factory);
96*14a1f0a4SSzymon Olewniczak
97*14a1f0a4SSzymon Olewniczak            /** @var AggregationTable $table */
98*14a1f0a4SSzymon Olewniczak            $table = new AggregationTable($INFO['id'], $mode, $renderer, $search);
99*14a1f0a4SSzymon Olewniczak            $table->render();
100*14a1f0a4SSzymon Olewniczak
101*14a1f0a4SSzymon Olewniczak        } catch(Exception $e) {
102*14a1f0a4SSzymon Olewniczak            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
103*14a1f0a4SSzymon Olewniczak            if($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
104*14a1f0a4SSzymon Olewniczak        }
105*14a1f0a4SSzymon Olewniczak
106*14a1f0a4SSzymon Olewniczak        return true;
107*14a1f0a4SSzymon Olewniczak    }
108*14a1f0a4SSzymon Olewniczak}
109