xref: /plugin/struct/syntax/cloud.php (revision 0549dcc5bc88d4f9d923acdd09931d8d51be7097)
1fa04b28cSMichael Grosse<?php
2d6d97f60SAnna Dabrowska
3fa04b28cSMichael Grosse/**
4fa04b28cSMichael Grosse * DokuWiki Plugin struct (Syntax Component)
5fa04b28cSMichael Grosse *
6fa04b28cSMichael Grosse * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7fa04b28cSMichael Grosse * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
8fa04b28cSMichael Grosse */
9fa04b28cSMichael Grosse
10*0549dcc5SAndreas Gohruse dokuwiki\plugin\struct\meta\AggregationCloud;
11fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser;
120699ff47SMichael Grosseuse dokuwiki\plugin\struct\meta\SearchCloud;
13fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException;
14fa04b28cSMichael Grosse
15d6d97f60SAnna Dabrowskaclass syntax_plugin_struct_cloud extends DokuWiki_Syntax_Plugin
16d6d97f60SAnna Dabrowska{
17fa04b28cSMichael Grosse    /**
18fa04b28cSMichael Grosse     * @return string Syntax mode type
19fa04b28cSMichael Grosse     */
20d6d97f60SAnna Dabrowska    public function getType()
21d6d97f60SAnna Dabrowska    {
22fa04b28cSMichael Grosse        return 'substition';
23fa04b28cSMichael Grosse    }
24*0549dcc5SAndreas Gohr
25fa04b28cSMichael Grosse    /**
26fa04b28cSMichael Grosse     * @return string Paragraph type
27fa04b28cSMichael Grosse     */
28d6d97f60SAnna Dabrowska    public function getPType()
29d6d97f60SAnna Dabrowska    {
30fa04b28cSMichael Grosse        return 'block';
31fa04b28cSMichael Grosse    }
32*0549dcc5SAndreas Gohr
33fa04b28cSMichael Grosse    /**
34fa04b28cSMichael Grosse     * @return int Sort order - Low numbers go before high numbers
35fa04b28cSMichael Grosse     */
36d6d97f60SAnna Dabrowska    public function getSort()
37d6d97f60SAnna Dabrowska    {
38fa04b28cSMichael Grosse        return 151;
39fa04b28cSMichael Grosse    }
40fa04b28cSMichael Grosse
41fa04b28cSMichael Grosse    /**
42fa04b28cSMichael Grosse     * Connect lookup pattern to lexer.
43fa04b28cSMichael Grosse     *
44fa04b28cSMichael Grosse     * @param string $mode Parser mode
45fa04b28cSMichael Grosse     */
46d6d97f60SAnna Dabrowska    public function connectTo($mode)
47d6d97f60SAnna Dabrowska    {
48fa04b28cSMichael Grosse        $this->Lexer->addSpecialPattern('----+ *struct cloud *-+\n.*?\n----+', $mode, 'plugin_struct_cloud');
49fa04b28cSMichael Grosse    }
50fa04b28cSMichael Grosse
51fa04b28cSMichael Grosse    /**
52fa04b28cSMichael Grosse     * Handle matches of the struct syntax
53fa04b28cSMichael Grosse     *
54fa04b28cSMichael Grosse     * @param string $match The match of the syntax
55fa04b28cSMichael Grosse     * @param int $state The state of the handler
56fa04b28cSMichael Grosse     * @param int $pos The position in the document
57fa04b28cSMichael Grosse     * @param Doku_Handler $handler The handler
58fa04b28cSMichael Grosse     * @return array Data for the renderer
59fa04b28cSMichael Grosse     */
60d6d97f60SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
61d6d97f60SAnna Dabrowska    {
62fa04b28cSMichael Grosse        global $conf;
63fa04b28cSMichael Grosse        $lines = explode("\n", $match);
64fa04b28cSMichael Grosse        array_shift($lines);
65fa04b28cSMichael Grosse        array_pop($lines);
66b3e6d4a4SMichael Grosse
67fa04b28cSMichael Grosse        try {
68fa04b28cSMichael Grosse            $parser = new ConfigParser($lines);
69fa04b28cSMichael Grosse            $config = $parser->getConfig();
70fa04b28cSMichael Grosse            return $config;
71fa04b28cSMichael Grosse        } catch (StructException $e) {
72fa04b28cSMichael Grosse            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
73fa04b28cSMichael Grosse            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
74fa04b28cSMichael Grosse            return null;
75fa04b28cSMichael Grosse        }
76fa04b28cSMichael Grosse    }
77fa04b28cSMichael Grosse
78fa04b28cSMichael Grosse    /**
79fa04b28cSMichael Grosse     * Render xhtml output or metadata
80fa04b28cSMichael Grosse     *
81fa04b28cSMichael Grosse     * @param string $mode Renderer mode (supported modes: xhtml)
82fa04b28cSMichael Grosse     * @param Doku_Renderer $renderer The renderer
83fa04b28cSMichael Grosse     * @param array $data The data from the handler() function
84fa04b28cSMichael Grosse     * @return bool If rendering was successful.
85fa04b28cSMichael Grosse     */
86d6d97f60SAnna Dabrowska    public function render($mode, Doku_Renderer $renderer, $data)
87d6d97f60SAnna Dabrowska    {
88fa04b28cSMichael Grosse        if ($mode != 'xhtml') return false;
89fa04b28cSMichael Grosse        if (!$data) return false;
90b3e6d4a4SMichael Grosse        if (!empty($data['filter'])) {
91b3e6d4a4SMichael Grosse            msg($this->getLang('Warning: no filters for cloud'), -1);
92b3e6d4a4SMichael Grosse        }
93fa04b28cSMichael Grosse        global $INFO, $conf;
94fa04b28cSMichael Grosse        try {
950699ff47SMichael Grosse            $search = new SearchCloud($data);
968026d0b1SMichael Grosse            $cloud = new AggregationCloud($INFO['id'], $mode, $renderer, $search);
978026d0b1SMichael Grosse            $cloud->render();
98fa04b28cSMichael Grosse            if ($mode == 'metadata') {
99fa04b28cSMichael Grosse                /** @var Doku_Renderer_metadata $renderer */
100fa04b28cSMichael Grosse                $renderer->meta['plugin']['struct']['hasaggregation'] = $search->getCacheFlag();
101fa04b28cSMichael Grosse            }
102fa04b28cSMichael Grosse        } catch (StructException $e) {
103fa04b28cSMichael Grosse            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
104fa04b28cSMichael Grosse            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
105fa04b28cSMichael Grosse        }
106fa04b28cSMichael Grosse
107fa04b28cSMichael Grosse        return true;
108fa04b28cSMichael Grosse    }
109fa04b28cSMichael Grosse}
110fa04b28cSMichael Grosse
111fa04b28cSMichael Grosse// vim:ts=4:sw=4:et:
112