xref: /plugin/combo/syntax/unit.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico/**
3007225e5Sgerardnico * Plugin Webcode: Show webcode (Css, HTML) in a iframe
4007225e5Sgerardnico *
5007225e5Sgerardnico * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6007225e5Sgerardnico * @author     Nicolas GERARD
7007225e5Sgerardnico */
8007225e5Sgerardnico
9007225e5Sgerardnico// must be run within Dokuwiki
10007225e5Sgerardnicouse ComboStrap\PluginUtility;
11*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
12007225e5Sgerardnico
13*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php');
14007225e5Sgerardnico
15007225e5Sgerardnico/**
16007225e5Sgerardnico * All DokuWiki plugins to extend the parser/rendering mechanism
17007225e5Sgerardnico * need to inherit from this class
18007225e5Sgerardnico *
19007225e5Sgerardnico * Format
20007225e5Sgerardnico *
21007225e5Sgerardnico * syntax_plugin_PluginName_PluginComponent
22007225e5Sgerardnico */
23007225e5Sgerardnicoclass syntax_plugin_combo_unit extends DokuWiki_Syntax_Plugin
24007225e5Sgerardnico{
25007225e5Sgerardnico
26007225e5Sgerardnico
2732b85071SNickeau    const TAG = "unit";
28007225e5Sgerardnico
29007225e5Sgerardnico
30007225e5Sgerardnico    private static function getTag()
31007225e5Sgerardnico    {
32007225e5Sgerardnico        return PluginUtility::getTagName(get_called_class());
33007225e5Sgerardnico    }
34007225e5Sgerardnico
35007225e5Sgerardnico    /*
36007225e5Sgerardnico     * What is the type of this plugin ?
37007225e5Sgerardnico     * This a plugin categorization
38007225e5Sgerardnico     * This is only important for other plugin
39007225e5Sgerardnico     * See @getAllowedTypes
40007225e5Sgerardnico     */
41007225e5Sgerardnico    public function getType()
42007225e5Sgerardnico    {
43007225e5Sgerardnico        return 'formatting';
44007225e5Sgerardnico    }
45007225e5Sgerardnico
46007225e5Sgerardnico
47007225e5Sgerardnico    // Sort order in which the plugin are applied
48007225e5Sgerardnico    public function getSort()
49007225e5Sgerardnico    {
50007225e5Sgerardnico        return 168;
51007225e5Sgerardnico    }
52007225e5Sgerardnico
53007225e5Sgerardnico    /**
54007225e5Sgerardnico     *
55007225e5Sgerardnico     * @return array
56007225e5Sgerardnico     * The plugin type that are allowed inside
57007225e5Sgerardnico     * this node (All !)
58007225e5Sgerardnico     * Otherwise the node that are in the matched content are not processed
59007225e5Sgerardnico     */
6032b85071SNickeau    function getAllowedTypes()
6132b85071SNickeau    {
62007225e5Sgerardnico        return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
6332b85071SNickeau    }
64007225e5Sgerardnico
6532b85071SNickeau    public function accepts($mode)
6632b85071SNickeau    {
6721913ab3SNickeau
6821913ab3SNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
6921913ab3SNickeau
70007225e5Sgerardnico    }
71007225e5Sgerardnico
72007225e5Sgerardnico    /**
73007225e5Sgerardnico     * Handle the node
74007225e5Sgerardnico     * @return string
75007225e5Sgerardnico     * See
76007225e5Sgerardnico     * https://www.dokuwiki.org/devel:syntax_plugins#ptype
77007225e5Sgerardnico     */
7832b85071SNickeau    function getPType()
7932b85071SNickeau    {
8032b85071SNickeau        return 'block';
8132b85071SNickeau    }
82007225e5Sgerardnico
83007225e5Sgerardnico    // This where the addEntryPattern must bed defined
84007225e5Sgerardnico    public function connectTo($mode)
85007225e5Sgerardnico    {
86007225e5Sgerardnico        // This define the DOKU_LEXER_ENTER state
87*04fd306cSNickeau        $pattern = XmlTagProcessing::getContainerTagPattern(self::TAG);
88007225e5Sgerardnico        $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
89007225e5Sgerardnico
90007225e5Sgerardnico    }
91007225e5Sgerardnico
92007225e5Sgerardnico    public function postConnect()
93007225e5Sgerardnico    {
94007225e5Sgerardnico        // We define the DOKU_LEXER_EXIT state
9532b85071SNickeau        $this->Lexer->addExitPattern('</' . self::TAG . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
96007225e5Sgerardnico
97007225e5Sgerardnico    }
98007225e5Sgerardnico
99007225e5Sgerardnico
100007225e5Sgerardnico    /**
101007225e5Sgerardnico     * Handle the match
102007225e5Sgerardnico     * You get the match for each pattern in the $match variable
103007225e5Sgerardnico     * $state says if it's an entry, exit or match pattern
104007225e5Sgerardnico     *
105007225e5Sgerardnico     * This is an instruction block and is cached apart from the rendering output
106007225e5Sgerardnico     * There is two caches levels
107007225e5Sgerardnico     * This cache may be suppressed with the url parameters ?purge=true
10832b85071SNickeau     * @param $match
10932b85071SNickeau     * @param $state
11032b85071SNickeau     * @param $pos
11132b85071SNickeau     * @param Doku_Handler $handler
11232b85071SNickeau     * @return array
113007225e5Sgerardnico     */
114*04fd306cSNickeau    public function handle($match, $state, $pos, Doku_Handler $handler): array
115007225e5Sgerardnico    {
116007225e5Sgerardnico        switch ($state) {
117007225e5Sgerardnico
118007225e5Sgerardnico            case DOKU_LEXER_ENTER :
119007225e5Sgerardnico
12032b85071SNickeau                $parameters = PluginUtility::getTagAttributes($match);
12132b85071SNickeau                return array(
12232b85071SNickeau                    PluginUtility::STATE => $state,
123*04fd306cSNickeau                    PluginUtility::ATTRIBUTES => $parameters
124*04fd306cSNickeau                );
125007225e5Sgerardnico
126007225e5Sgerardnico            case DOKU_LEXER_UNMATCHED :
127007225e5Sgerardnico
12832b85071SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
129007225e5Sgerardnico
130007225e5Sgerardnico            case DOKU_LEXER_EXIT:
131007225e5Sgerardnico
13232b85071SNickeau                return array(PluginUtility::STATE => $state);
133007225e5Sgerardnico
134007225e5Sgerardnico        }
135*04fd306cSNickeau        return [];
136007225e5Sgerardnico    }
137007225e5Sgerardnico
138007225e5Sgerardnico    /**
139007225e5Sgerardnico     * Render the output
140007225e5Sgerardnico     * @param string $format
141007225e5Sgerardnico     * @param Doku_Renderer $renderer
142007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
143007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
144007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
145007225e5Sgerardnico     *
146007225e5Sgerardnico     *
147007225e5Sgerardnico     */
148007225e5Sgerardnico    function render($format, Doku_Renderer $renderer, $data)
149007225e5Sgerardnico    {
150007225e5Sgerardnico        // The $data variable comes from the handle() function
151007225e5Sgerardnico        //
152007225e5Sgerardnico        // $mode = 'xhtml' means that we output html
153007225e5Sgerardnico        // There is other mode such as metadata, odt
154007225e5Sgerardnico        if ($format == 'xhtml') {
155007225e5Sgerardnico
156007225e5Sgerardnico            /**
157007225e5Sgerardnico             * To help the parser recognize that _xmlEntities is a function of Doku_Renderer_xhtml
158007225e5Sgerardnico             * and not of Doku_Renderer
159007225e5Sgerardnico             *
160007225e5Sgerardnico             * @var Doku_Renderer_xhtml $renderer
161007225e5Sgerardnico             */
162007225e5Sgerardnico
16332b85071SNickeau            $state = $data[PluginUtility::STATE];
164007225e5Sgerardnico            switch ($state) {
165007225e5Sgerardnico
166007225e5Sgerardnico                case DOKU_LEXER_ENTER :
167007225e5Sgerardnico
168007225e5Sgerardnico                    $renderer->doc .= '<div class="webcomponent_' . self::getTag() . '"';
16932b85071SNickeau                    $attributes = $data[PluginUtility::ATTRIBUTES];
170007225e5Sgerardnico                    // Normally none
17132b85071SNickeau                    if ($attributes['display']) {
17232b85071SNickeau                        $renderer->doc .= ' style="display:' . $attributes['display'] . '" ';
173007225e5Sgerardnico                    }
174007225e5Sgerardnico                    $renderer->doc .= '>';
175007225e5Sgerardnico                    break;
176007225e5Sgerardnico
17732b85071SNickeau                case DOKU_LEXER_UNMATCHED:
17832b85071SNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
17932b85071SNickeau                    break;
180007225e5Sgerardnico                case DOKU_LEXER_EXIT :
181007225e5Sgerardnico
182007225e5Sgerardnico                    $renderer->doc .= '</div>';
183007225e5Sgerardnico                    break;
184007225e5Sgerardnico            }
185007225e5Sgerardnico
186007225e5Sgerardnico            return true;
187007225e5Sgerardnico        }
188007225e5Sgerardnico        return false;
189007225e5Sgerardnico    }
190007225e5Sgerardnico
191007225e5Sgerardnico    public static function getElementName()
192007225e5Sgerardnico    {
193007225e5Sgerardnico        return PluginUtility::getTagName(get_called_class());
194007225e5Sgerardnico    }
195007225e5Sgerardnico
196007225e5Sgerardnico}
197