xref: /plugin/combo/syntax/unit.php (revision 007225e5fb2d3f64edaccd3bd447ca26effb9d68)
1*007225e5Sgerardnico<?php
2*007225e5Sgerardnico/**
3*007225e5Sgerardnico * Plugin Webcode: Show webcode (Css, HTML) in a iframe
4*007225e5Sgerardnico *
5*007225e5Sgerardnico * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*007225e5Sgerardnico * @author     Nicolas GERARD
7*007225e5Sgerardnico */
8*007225e5Sgerardnico
9*007225e5Sgerardnico// must be run within Dokuwiki
10*007225e5Sgerardnicouse ComboStrap\PluginUtility;
11*007225e5Sgerardnico
12*007225e5Sgerardnicoif (!defined('DOKU_INC')) die();
13*007225e5Sgerardnicorequire_once(__DIR__ . '/../class/PluginUtility.php');
14*007225e5Sgerardnico
15*007225e5Sgerardnico/**
16*007225e5Sgerardnico * All DokuWiki plugins to extend the parser/rendering mechanism
17*007225e5Sgerardnico * need to inherit from this class
18*007225e5Sgerardnico *
19*007225e5Sgerardnico * Format
20*007225e5Sgerardnico *
21*007225e5Sgerardnico * syntax_plugin_PluginName_PluginComponent
22*007225e5Sgerardnico */
23*007225e5Sgerardnicoclass syntax_plugin_combo_unit extends DokuWiki_Syntax_Plugin
24*007225e5Sgerardnico{
25*007225e5Sgerardnico
26*007225e5Sgerardnico
27*007225e5Sgerardnico
28*007225e5Sgerardnico
29*007225e5Sgerardnico    private static function getTag()
30*007225e5Sgerardnico    {
31*007225e5Sgerardnico        return PluginUtility::getTagName(get_called_class());
32*007225e5Sgerardnico    }
33*007225e5Sgerardnico
34*007225e5Sgerardnico    /*
35*007225e5Sgerardnico     * What is the type of this plugin ?
36*007225e5Sgerardnico     * This a plugin categorization
37*007225e5Sgerardnico     * This is only important for other plugin
38*007225e5Sgerardnico     * See @getAllowedTypes
39*007225e5Sgerardnico     */
40*007225e5Sgerardnico    public function getType()
41*007225e5Sgerardnico    {
42*007225e5Sgerardnico        return 'formatting';
43*007225e5Sgerardnico    }
44*007225e5Sgerardnico
45*007225e5Sgerardnico
46*007225e5Sgerardnico    // Sort order in which the plugin are applied
47*007225e5Sgerardnico    public function getSort()
48*007225e5Sgerardnico    {
49*007225e5Sgerardnico        return 168;
50*007225e5Sgerardnico    }
51*007225e5Sgerardnico
52*007225e5Sgerardnico    /**
53*007225e5Sgerardnico     *
54*007225e5Sgerardnico     * @return array
55*007225e5Sgerardnico     * The plugin type that are allowed inside
56*007225e5Sgerardnico     * this node (All !)
57*007225e5Sgerardnico     * Otherwise the node that are in the matched content are not processed
58*007225e5Sgerardnico     */
59*007225e5Sgerardnico    function getAllowedTypes() {
60*007225e5Sgerardnico        return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
61*007225e5Sgerardnico
62*007225e5Sgerardnico    }
63*007225e5Sgerardnico
64*007225e5Sgerardnico    /**
65*007225e5Sgerardnico     * Handle the node
66*007225e5Sgerardnico     * @return string
67*007225e5Sgerardnico     * See
68*007225e5Sgerardnico     * https://www.dokuwiki.org/devel:syntax_plugins#ptype
69*007225e5Sgerardnico     */
70*007225e5Sgerardnico    function getPType(){ return 'block';}
71*007225e5Sgerardnico
72*007225e5Sgerardnico    // This where the addEntryPattern must bed defined
73*007225e5Sgerardnico    public function connectTo($mode)
74*007225e5Sgerardnico    {
75*007225e5Sgerardnico        // This define the DOKU_LEXER_ENTER state
76*007225e5Sgerardnico        $pattern = PluginUtility::getContainerTagPattern(self::getElementName());
77*007225e5Sgerardnico        $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
78*007225e5Sgerardnico
79*007225e5Sgerardnico    }
80*007225e5Sgerardnico
81*007225e5Sgerardnico    public function postConnect()
82*007225e5Sgerardnico    {
83*007225e5Sgerardnico        // We define the DOKU_LEXER_EXIT state
84*007225e5Sgerardnico        $this->Lexer->addExitPattern('</' . self::getElementName() . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
85*007225e5Sgerardnico
86*007225e5Sgerardnico    }
87*007225e5Sgerardnico
88*007225e5Sgerardnico
89*007225e5Sgerardnico    /**
90*007225e5Sgerardnico     * Handle the match
91*007225e5Sgerardnico     * You get the match for each pattern in the $match variable
92*007225e5Sgerardnico     * $state says if it's an entry, exit or match pattern
93*007225e5Sgerardnico     *
94*007225e5Sgerardnico     * This is an instruction block and is cached apart from the rendering output
95*007225e5Sgerardnico     * There is two caches levels
96*007225e5Sgerardnico     * This cache may be suppressed with the url parameters ?purge=true
97*007225e5Sgerardnico     */
98*007225e5Sgerardnico    public function handle($match, $state, $pos, Doku_Handler $handler)
99*007225e5Sgerardnico    {
100*007225e5Sgerardnico        switch ($state) {
101*007225e5Sgerardnico
102*007225e5Sgerardnico            case DOKU_LEXER_ENTER :
103*007225e5Sgerardnico
104*007225e5Sgerardnico                // Suppress the tag name
105*007225e5Sgerardnico                $match = utf8_substr($match, strlen(self::getTag()) + 1, -1);
106*007225e5Sgerardnico                $parameters = PluginUtility::parse2HTMLAttributes($match);
107*007225e5Sgerardnico                return array($state, $parameters);
108*007225e5Sgerardnico
109*007225e5Sgerardnico                break;
110*007225e5Sgerardnico
111*007225e5Sgerardnico            case DOKU_LEXER_UNMATCHED :
112*007225e5Sgerardnico
113*007225e5Sgerardnico
114*007225e5Sgerardnico
115*007225e5Sgerardnico                //
116*007225e5Sgerardnico                // The nested authorized plugin are given in the function
117*007225e5Sgerardnico                // getAllowedTypes
118*007225e5Sgerardnico                //
119*007225e5Sgerardnico                // cdata  means normal text ??? See xhtml.php function cdata
120*007225e5Sgerardnico                // What it does exactly, I don't know
121*007225e5Sgerardnico                // but as we want to process the content
122*007225e5Sgerardnico                // we need to add a call to the lexer to go further
123*007225e5Sgerardnico                // Comes from the wrap plugin
124*007225e5Sgerardnico                $handler->_addCall('cdata', array($match), $pos, null);
125*007225e5Sgerardnico                break;
126*007225e5Sgerardnico
127*007225e5Sgerardnico            case DOKU_LEXER_EXIT:
128*007225e5Sgerardnico
129*007225e5Sgerardnico                return array($state, '');
130*007225e5Sgerardnico                break;
131*007225e5Sgerardnico
132*007225e5Sgerardnico        }
133*007225e5Sgerardnico
134*007225e5Sgerardnico    }
135*007225e5Sgerardnico
136*007225e5Sgerardnico    /**
137*007225e5Sgerardnico     * Render the output
138*007225e5Sgerardnico     * @param string $format
139*007225e5Sgerardnico     * @param Doku_Renderer $renderer
140*007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
141*007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
142*007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
143*007225e5Sgerardnico     *
144*007225e5Sgerardnico     *
145*007225e5Sgerardnico     */
146*007225e5Sgerardnico    function render($format, Doku_Renderer $renderer, $data)
147*007225e5Sgerardnico    {
148*007225e5Sgerardnico        // The $data variable comes from the handle() function
149*007225e5Sgerardnico        //
150*007225e5Sgerardnico        // $mode = 'xhtml' means that we output html
151*007225e5Sgerardnico        // There is other mode such as metadata, odt
152*007225e5Sgerardnico        if ($format == 'xhtml') {
153*007225e5Sgerardnico
154*007225e5Sgerardnico            /**
155*007225e5Sgerardnico             * To help the parser recognize that _xmlEntities is a function of Doku_Renderer_xhtml
156*007225e5Sgerardnico             * and not of Doku_Renderer
157*007225e5Sgerardnico             *
158*007225e5Sgerardnico             * @var Doku_Renderer_xhtml $renderer
159*007225e5Sgerardnico             */
160*007225e5Sgerardnico
161*007225e5Sgerardnico            list($state, $parameters) = $data;
162*007225e5Sgerardnico            switch ($state) {
163*007225e5Sgerardnico
164*007225e5Sgerardnico                case DOKU_LEXER_ENTER :
165*007225e5Sgerardnico
166*007225e5Sgerardnico                    $renderer->doc .= '<div class="webcomponent_'.self::getTag() .'"';
167*007225e5Sgerardnico                    // Normally none
168*007225e5Sgerardnico                    if ($parameters['display']){
169*007225e5Sgerardnico                        $renderer->doc .= ' style="display:'.$parameters['display'].'" ';
170*007225e5Sgerardnico                    }
171*007225e5Sgerardnico                    $renderer->doc .= '>';
172*007225e5Sgerardnico                    break;
173*007225e5Sgerardnico
174*007225e5Sgerardnico
175*007225e5Sgerardnico                case DOKU_LEXER_EXIT :
176*007225e5Sgerardnico
177*007225e5Sgerardnico                    $renderer->doc .= '</div>';
178*007225e5Sgerardnico                    break;
179*007225e5Sgerardnico            }
180*007225e5Sgerardnico
181*007225e5Sgerardnico            return true;
182*007225e5Sgerardnico        }
183*007225e5Sgerardnico        return false;
184*007225e5Sgerardnico    }
185*007225e5Sgerardnico
186*007225e5Sgerardnico    public static function getElementName()
187*007225e5Sgerardnico    {
188*007225e5Sgerardnico        return PluginUtility::getTagName(get_called_class());
189*007225e5Sgerardnico    }
190*007225e5Sgerardnico
191*007225e5Sgerardnico}
192