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