xref: /plugin/combo/syntax/unit.php (revision 32b85071e019dd3646a67c17fac4051338e495eb)
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;
11007225e5Sgerardnico
12007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
13007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PluginUtility.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
27*32b85071SNickeau    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     */
60*32b85071SNickeau    function getAllowedTypes()
61*32b85071SNickeau    {
62007225e5Sgerardnico        return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
63*32b85071SNickeau    }
64007225e5Sgerardnico
65*32b85071SNickeau    public function accepts($mode)
66*32b85071SNickeau    {
67*32b85071SNickeau        if (!$this->getConf(syntax_plugin_combo_preformatted::CONF_PREFORMATTED_ENABLE)) {
68*32b85071SNickeau            return PluginUtility::disablePreformatted($mode);
69*32b85071SNickeau        } else {
70*32b85071SNickeau            return true;
71*32b85071SNickeau        }
72007225e5Sgerardnico    }
73007225e5Sgerardnico
74007225e5Sgerardnico    /**
75007225e5Sgerardnico     * Handle the node
76007225e5Sgerardnico     * @return string
77007225e5Sgerardnico     * See
78007225e5Sgerardnico     * https://www.dokuwiki.org/devel:syntax_plugins#ptype
79007225e5Sgerardnico     */
80*32b85071SNickeau    function getPType()
81*32b85071SNickeau    {
82*32b85071SNickeau        return 'block';
83*32b85071SNickeau    }
84007225e5Sgerardnico
85007225e5Sgerardnico    // This where the addEntryPattern must bed defined
86007225e5Sgerardnico    public function connectTo($mode)
87007225e5Sgerardnico    {
88007225e5Sgerardnico        // This define the DOKU_LEXER_ENTER state
89*32b85071SNickeau        $pattern = PluginUtility::getContainerTagPattern(self::TAG);
90007225e5Sgerardnico        $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
91007225e5Sgerardnico
92007225e5Sgerardnico    }
93007225e5Sgerardnico
94007225e5Sgerardnico    public function postConnect()
95007225e5Sgerardnico    {
96007225e5Sgerardnico        // We define the DOKU_LEXER_EXIT state
97*32b85071SNickeau        $this->Lexer->addExitPattern('</' . self::TAG . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
98007225e5Sgerardnico
99007225e5Sgerardnico    }
100007225e5Sgerardnico
101007225e5Sgerardnico
102007225e5Sgerardnico    /**
103007225e5Sgerardnico     * Handle the match
104007225e5Sgerardnico     * You get the match for each pattern in the $match variable
105007225e5Sgerardnico     * $state says if it's an entry, exit or match pattern
106007225e5Sgerardnico     *
107007225e5Sgerardnico     * This is an instruction block and is cached apart from the rendering output
108007225e5Sgerardnico     * There is two caches levels
109007225e5Sgerardnico     * This cache may be suppressed with the url parameters ?purge=true
110*32b85071SNickeau     * @param $match
111*32b85071SNickeau     * @param $state
112*32b85071SNickeau     * @param $pos
113*32b85071SNickeau     * @param Doku_Handler $handler
114*32b85071SNickeau     * @return array
115007225e5Sgerardnico     */
116007225e5Sgerardnico    public function handle($match, $state, $pos, Doku_Handler $handler)
117007225e5Sgerardnico    {
118007225e5Sgerardnico        switch ($state) {
119007225e5Sgerardnico
120007225e5Sgerardnico            case DOKU_LEXER_ENTER :
121007225e5Sgerardnico
122*32b85071SNickeau                $parameters = PluginUtility::getTagAttributes($match);
123*32b85071SNickeau                return array(
124*32b85071SNickeau                    PluginUtility::STATE => $state,
125*32b85071SNickeau                    PluginUtility::ATTRIBUTES => $parameters);
126007225e5Sgerardnico
127007225e5Sgerardnico                break;
128007225e5Sgerardnico
129007225e5Sgerardnico            case DOKU_LEXER_UNMATCHED :
130007225e5Sgerardnico
131*32b85071SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
132007225e5Sgerardnico                break;
133007225e5Sgerardnico
134007225e5Sgerardnico            case DOKU_LEXER_EXIT:
135007225e5Sgerardnico
136*32b85071SNickeau                return array(PluginUtility::STATE => $state);
137007225e5Sgerardnico                break;
138007225e5Sgerardnico
139007225e5Sgerardnico        }
140007225e5Sgerardnico
141007225e5Sgerardnico    }
142007225e5Sgerardnico
143007225e5Sgerardnico    /**
144007225e5Sgerardnico     * Render the output
145007225e5Sgerardnico     * @param string $format
146007225e5Sgerardnico     * @param Doku_Renderer $renderer
147007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
148007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
149007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
150007225e5Sgerardnico     *
151007225e5Sgerardnico     *
152007225e5Sgerardnico     */
153007225e5Sgerardnico    function render($format, Doku_Renderer $renderer, $data)
154007225e5Sgerardnico    {
155007225e5Sgerardnico        // The $data variable comes from the handle() function
156007225e5Sgerardnico        //
157007225e5Sgerardnico        // $mode = 'xhtml' means that we output html
158007225e5Sgerardnico        // There is other mode such as metadata, odt
159007225e5Sgerardnico        if ($format == 'xhtml') {
160007225e5Sgerardnico
161007225e5Sgerardnico            /**
162007225e5Sgerardnico             * To help the parser recognize that _xmlEntities is a function of Doku_Renderer_xhtml
163007225e5Sgerardnico             * and not of Doku_Renderer
164007225e5Sgerardnico             *
165007225e5Sgerardnico             * @var Doku_Renderer_xhtml $renderer
166007225e5Sgerardnico             */
167007225e5Sgerardnico
168*32b85071SNickeau            $state = $data[PluginUtility::STATE];
169007225e5Sgerardnico            switch ($state) {
170007225e5Sgerardnico
171007225e5Sgerardnico                case DOKU_LEXER_ENTER :
172007225e5Sgerardnico
173007225e5Sgerardnico                    $renderer->doc .= '<div class="webcomponent_' . self::getTag() . '"';
174*32b85071SNickeau                    $attributes = $data[PluginUtility::ATTRIBUTES];
175007225e5Sgerardnico                    // Normally none
176*32b85071SNickeau                    if ($attributes['display']) {
177*32b85071SNickeau                        $renderer->doc .= ' style="display:' . $attributes['display'] . '" ';
178007225e5Sgerardnico                    }
179007225e5Sgerardnico                    $renderer->doc .= '>';
180007225e5Sgerardnico                    break;
181007225e5Sgerardnico
182*32b85071SNickeau                case DOKU_LEXER_UNMATCHED:
183*32b85071SNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
184*32b85071SNickeau                    break;
185007225e5Sgerardnico                case DOKU_LEXER_EXIT :
186007225e5Sgerardnico
187007225e5Sgerardnico                    $renderer->doc .= '</div>';
188007225e5Sgerardnico                    break;
189007225e5Sgerardnico            }
190007225e5Sgerardnico
191007225e5Sgerardnico            return true;
192007225e5Sgerardnico        }
193007225e5Sgerardnico        return false;
194007225e5Sgerardnico    }
195007225e5Sgerardnico
196007225e5Sgerardnico    public static function getElementName()
197007225e5Sgerardnico    {
198007225e5Sgerardnico        return PluginUtility::getTagName(get_called_class());
199007225e5Sgerardnico    }
200007225e5Sgerardnico
201007225e5Sgerardnico}
202