xref: /plugin/struct/syntax/cloud.php (revision 7923cdacab81de55732b2931695bdc6734571b7e)
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*7234bfb1Ssplitbrainuse dokuwiki\Extension\SyntaxPlugin;
110549dcc5SAndreas Gohruse dokuwiki\plugin\struct\meta\AggregationCloud;
12fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\ConfigParser;
130699ff47SMichael Grosseuse dokuwiki\plugin\struct\meta\SearchCloud;
14fa04b28cSMichael Grosseuse dokuwiki\plugin\struct\meta\StructException;
15fa04b28cSMichael Grosse
16*7234bfb1Ssplitbrainclass syntax_plugin_struct_cloud extends SyntaxPlugin
17d6d97f60SAnna Dabrowska{
18fa04b28cSMichael Grosse    /**
19fa04b28cSMichael Grosse     * @return string Syntax mode type
20fa04b28cSMichael Grosse     */
21d6d97f60SAnna Dabrowska    public function getType()
22d6d97f60SAnna Dabrowska    {
23fa04b28cSMichael Grosse        return 'substition';
24fa04b28cSMichael Grosse    }
250549dcc5SAndreas Gohr
26fa04b28cSMichael Grosse    /**
27fa04b28cSMichael Grosse     * @return string Paragraph type
28fa04b28cSMichael Grosse     */
29d6d97f60SAnna Dabrowska    public function getPType()
30d6d97f60SAnna Dabrowska    {
31fa04b28cSMichael Grosse        return 'block';
32fa04b28cSMichael Grosse    }
330549dcc5SAndreas Gohr
34fa04b28cSMichael Grosse    /**
35fa04b28cSMichael Grosse     * @return int Sort order - Low numbers go before high numbers
36fa04b28cSMichael Grosse     */
37d6d97f60SAnna Dabrowska    public function getSort()
38d6d97f60SAnna Dabrowska    {
39fa04b28cSMichael Grosse        return 151;
40fa04b28cSMichael Grosse    }
41fa04b28cSMichael Grosse
42fa04b28cSMichael Grosse    /**
43fa04b28cSMichael Grosse     * Connect lookup pattern to lexer.
44fa04b28cSMichael Grosse     *
45fa04b28cSMichael Grosse     * @param string $mode Parser mode
46fa04b28cSMichael Grosse     */
47d6d97f60SAnna Dabrowska    public function connectTo($mode)
48d6d97f60SAnna Dabrowska    {
49fa04b28cSMichael Grosse        $this->Lexer->addSpecialPattern('----+ *struct cloud *-+\n.*?\n----+', $mode, 'plugin_struct_cloud');
50fa04b28cSMichael Grosse    }
51fa04b28cSMichael Grosse
52fa04b28cSMichael Grosse    /**
53fa04b28cSMichael Grosse     * Handle matches of the struct syntax
54fa04b28cSMichael Grosse     *
55fa04b28cSMichael Grosse     * @param string $match The match of the syntax
56fa04b28cSMichael Grosse     * @param int $state The state of the handler
57fa04b28cSMichael Grosse     * @param int $pos The position in the document
58fa04b28cSMichael Grosse     * @param Doku_Handler $handler The handler
59fa04b28cSMichael Grosse     * @return array Data for the renderer
60fa04b28cSMichael Grosse     */
61d6d97f60SAnna Dabrowska    public function handle($match, $state, $pos, Doku_Handler $handler)
62d6d97f60SAnna Dabrowska    {
63fa04b28cSMichael Grosse        global $conf;
64fa04b28cSMichael Grosse        $lines = explode("\n", $match);
65fa04b28cSMichael Grosse        array_shift($lines);
66fa04b28cSMichael Grosse        array_pop($lines);
67b3e6d4a4SMichael Grosse
68fa04b28cSMichael Grosse        try {
69fa04b28cSMichael Grosse            $parser = new ConfigParser($lines);
70fa04b28cSMichael Grosse            $config = $parser->getConfig();
71fa04b28cSMichael Grosse            return $config;
72fa04b28cSMichael Grosse        } catch (StructException $e) {
73fa04b28cSMichael Grosse            msg($e->getMessage(), -1, $e->getLine(), $e->getFile());
74fa04b28cSMichael Grosse            if ($conf['allowdebug']) msg('<pre>' . hsc($e->getTraceAsString()) . '</pre>', -1);
75fa04b28cSMichael Grosse            return null;
76fa04b28cSMichael Grosse        }
77fa04b28cSMichael Grosse    }
78fa04b28cSMichael Grosse
79fa04b28cSMichael Grosse    /**
80fa04b28cSMichael Grosse     * Render xhtml output or metadata
81fa04b28cSMichael Grosse     *
82fa04b28cSMichael Grosse     * @param string $mode Renderer mode (supported modes: xhtml)
83fa04b28cSMichael Grosse     * @param Doku_Renderer $renderer The renderer
84fa04b28cSMichael Grosse     * @param array $data The data from the handler() function
85fa04b28cSMichael Grosse     * @return bool If rendering was successful.
86fa04b28cSMichael Grosse     */
87d6d97f60SAnna Dabrowska    public function render($mode, Doku_Renderer $renderer, $data)
88d6d97f60SAnna Dabrowska    {
89fa04b28cSMichael Grosse        if ($mode != 'xhtml') return false;
90fa04b28cSMichael Grosse        if (!$data) return false;
91fa04b28cSMichael Grosse        global $INFO, $conf;
92fa04b28cSMichael Grosse        try {
930699ff47SMichael Grosse            $search = new SearchCloud($data);
948026d0b1SMichael Grosse            $cloud = new AggregationCloud($INFO['id'], $mode, $renderer, $search);
95af0ce8d2SAndreas Gohr            $cloud->startScope();
968026d0b1SMichael Grosse            $cloud->render();
97af0ce8d2SAndreas Gohr            $cloud->finishScope();
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