xref: /plugin/mikioplugin/syntax/core.php (revision 17e6d63900b7250e4c2aa308b63914ffea16ab55)
1*17e6d639SJames Collins<?php
2*17e6d639SJames Collins/**
3*17e6d639SJames Collins * Mikio Core Syntax Plugin
4*17e6d639SJames Collins *
5*17e6d639SJames Collins * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*17e6d639SJames Collins * @author     James Collins <james.collins@outlook.com.au>
7*17e6d639SJames Collins */
8*17e6d639SJames Collins
9*17e6d639SJames Collinsif (!defined('DOKU_INC')) die();
10*17e6d639SJames Collinsif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
11*17e6d639SJames Collins
12*17e6d639SJames Collins
13*17e6d639SJames Collinsclass syntax_plugin_mikioplugin_core extends DokuWiki_Syntax_Plugin {
14*17e6d639SJames Collins    public $pattern_entry       = '';
15*17e6d639SJames Collins    public $pattern_exit        = '';
16*17e6d639SJames Collins    public $tag                 = '';
17*17e6d639SJames Collins    public $noEndTag            = false;
18*17e6d639SJames Collins    public $defaults            = array();
19*17e6d639SJames Collins    public $options             = array();
20*17e6d639SJames Collins    public $values              = array();
21*17e6d639SJames Collins    public $incClasses          = array('shadow');
22*17e6d639SJames Collins
23*17e6d639SJames Collins
24*17e6d639SJames Collins    function __construct() {
25*17e6d639SJames Collins        if(count($this->incClasses) > 0) {
26*17e6d639SJames Collins            $this->options = array_merge($this->options, $this->incClasses);
27*17e6d639SJames Collins        }
28*17e6d639SJames Collins    }
29*17e6d639SJames Collins
30*17e6d639SJames Collins    public function getType() {
31*17e6d639SJames Collins        return 'formatting';
32*17e6d639SJames Collins    }
33*17e6d639SJames Collins
34*17e6d639SJames Collins
35*17e6d639SJames Collins    public function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); }
36*17e6d639SJames Collins    public function getSort(){ return 32; }
37*17e6d639SJames Collins
38*17e6d639SJames Collins
39*17e6d639SJames Collins    public function connectTo($mode) {
40*17e6d639SJames Collins        if($this->pattern_entry == '' && $this->tag != '') {
41*17e6d639SJames Collins            if($this->noEndTag) {
42*17e6d639SJames Collins                $this->pattern_entry = '<(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ').*?>';
43*17e6d639SJames Collins            } else {
44*17e6d639SJames Collins                $this->pattern_entry = '<(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ').*?>(?=.*?</(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ')>)';
45*17e6d639SJames Collins            }
46*17e6d639SJames Collins        }
47*17e6d639SJames Collins
48*17e6d639SJames Collins        if($this->pattern_entry != '') {
49*17e6d639SJames Collins            if($this->noEndTag) {
50*17e6d639SJames Collins                $this->Lexer->addSpecialPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_'.$this->getPluginComponent());
51*17e6d639SJames Collins            } else {
52*17e6d639SJames Collins                $this->Lexer->addEntryPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_'.$this->getPluginComponent());
53*17e6d639SJames Collins            }
54*17e6d639SJames Collins        }
55*17e6d639SJames Collins    }
56*17e6d639SJames Collins
57*17e6d639SJames Collins
58*17e6d639SJames Collins    public function postConnect() {
59*17e6d639SJames Collins        if(!$this->noEndTag) {
60*17e6d639SJames Collins            if($this->pattern_exit == '' && $this->tag != '') {
61*17e6d639SJames Collins                $this->pattern_exit = '</(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ')>';
62*17e6d639SJames Collins            }
63*17e6d639SJames Collins
64*17e6d639SJames Collins            if($this->pattern_exit != '') {
65*17e6d639SJames Collins                $this->Lexer->addExitPattern($this->pattern_exit, 'plugin_mikioplugin_'.$this->getPluginComponent());
66*17e6d639SJames Collins            }
67*17e6d639SJames Collins        }
68*17e6d639SJames Collins    }
69*17e6d639SJames Collins
70*17e6d639SJames Collins    public function handle($match, $state, $pos, Doku_Handler $handler){
71*17e6d639SJames Collins        switch($state) {
72*17e6d639SJames Collins            case DOKU_LEXER_ENTER:
73*17e6d639SJames Collins            case DOKU_LEXER_SPECIAL:
74*17e6d639SJames Collins                $optionlist = preg_split('/\s(?=([^"]*"[^"]*")*[^"]*$)/', substr($match, strlen($this->tag) + 1, -1));
75*17e6d639SJames Collins
76*17e6d639SJames Collins                $options_clean = array();
77*17e6d639SJames Collins
78*17e6d639SJames Collins                $options = array();
79*17e6d639SJames Collins                foreach($optionlist as $item) {
80*17e6d639SJames Collins                    $i = strpos($item, '=');
81*17e6d639SJames Collins                    if($i !== false) {
82*17e6d639SJames Collins                        $value = substr($item, $i + 1);
83*17e6d639SJames Collins
84*17e6d639SJames Collins                        if(substr($value, 0, 1) == '"') $value = substr($value, 1);
85*17e6d639SJames Collins                        if(substr($value, -1) == '"') $value = substr($value, 0, -1);
86*17e6d639SJames Collins
87*17e6d639SJames Collins                        $options[substr($item, 0, $i)] = $value;
88*17e6d639SJames Collins                    } else {
89*17e6d639SJames Collins                        $options[$item] = true;
90*17e6d639SJames Collins                    }
91*17e6d639SJames Collins                }
92*17e6d639SJames Collins
93*17e6d639SJames Collins                foreach($this->options as $item => $value) {
94*17e6d639SJames Collins                    if(is_string($value)) {
95*17e6d639SJames Collins                        if(array_key_exists($value, $options)) {
96*17e6d639SJames Collins                            $options_clean[$value] = $options[$value];
97*17e6d639SJames Collins                        } else {
98*17e6d639SJames Collins                            $options_clean[$value] = false;
99*17e6d639SJames Collins                        }
100*17e6d639SJames Collins                    } else if(is_array($value)) {
101*17e6d639SJames Collins                        foreach($value as $avalue) {
102*17e6d639SJames Collins                            if(array_key_exists($avalue, $options)) {
103*17e6d639SJames Collins                                $options_clean[$item] = $avalue;
104*17e6d639SJames Collins                            }
105*17e6d639SJames Collins                        }
106*17e6d639SJames Collins                    }
107*17e6d639SJames Collins                }
108*17e6d639SJames Collins
109*17e6d639SJames Collins                foreach($this->defaults as $item => $value) {
110*17e6d639SJames Collins                    if(array_key_exists($item, $options_clean) == false) {
111*17e6d639SJames Collins                        $options_clean[$item] = $value;
112*17e6d639SJames Collins                    }
113*17e6d639SJames Collins                }
114*17e6d639SJames Collins
115*17e6d639SJames Collins                $this->values = $options_clean;
116*17e6d639SJames Collins
117*17e6d639SJames Collins                return array($state, $options_clean);
118*17e6d639SJames Collins
119*17e6d639SJames Collins            case DOKU_LEXER_UNMATCHED:
120*17e6d639SJames Collins                return array($state, $match);
121*17e6d639SJames Collins
122*17e6d639SJames Collins            case DOKU_LEXER_EXIT:
123*17e6d639SJames Collins                return array($state, '');
124*17e6d639SJames Collins        }
125*17e6d639SJames Collins
126*17e6d639SJames Collins        return array();
127*17e6d639SJames Collins    }
128*17e6d639SJames Collins
129*17e6d639SJames Collins
130*17e6d639SJames Collins    public function render_lexer_enter(Doku_Renderer $renderer, $data) {
131*17e6d639SJames Collins
132*17e6d639SJames Collins    }
133*17e6d639SJames Collins
134*17e6d639SJames Collins
135*17e6d639SJames Collins    public function render_lexer_unmatched(Doku_Renderer $renderer, $data) {
136*17e6d639SJames Collins        $renderer->doc .= $renderer->_xmlEntities($data);
137*17e6d639SJames Collins    }
138*17e6d639SJames Collins
139*17e6d639SJames Collins
140*17e6d639SJames Collins    public function render_lexer_exit(Doku_Renderer $renderer, $data) {
141*17e6d639SJames Collins
142*17e6d639SJames Collins    }
143*17e6d639SJames Collins
144*17e6d639SJames Collins
145*17e6d639SJames Collins    public function render_lexer_special(Doku_Renderer $renderer, $data) {
146*17e6d639SJames Collins
147*17e6d639SJames Collins    }
148*17e6d639SJames Collins
149*17e6d639SJames Collins
150*17e6d639SJames Collins    public function render($mode, Doku_Renderer $renderer, $data) {
151*17e6d639SJames Collins        if($mode == 'xhtml'){
152*17e6d639SJames Collins            list($state,$match) = $data;
153*17e6d639SJames Collins
154*17e6d639SJames Collins            switch ($state) {
155*17e6d639SJames Collins                case DOKU_LEXER_ENTER:
156*17e6d639SJames Collins                    $this->render_lexer_enter($renderer, $match);
157*17e6d639SJames Collins                    return true;
158*17e6d639SJames Collins
159*17e6d639SJames Collins                case DOKU_LEXER_UNMATCHED :
160*17e6d639SJames Collins                    $this->render_lexer_unmatched($renderer, $match);
161*17e6d639SJames Collins                    return true;
162*17e6d639SJames Collins
163*17e6d639SJames Collins                case DOKU_LEXER_EXIT :
164*17e6d639SJames Collins                    $this->render_lexer_exit($renderer, $match);
165*17e6d639SJames Collins                    return true;
166*17e6d639SJames Collins
167*17e6d639SJames Collins                    case DOKU_LEXER_SPECIAL:
168*17e6d639SJames Collins                        $this->render_lexer_special($renderer, $match);
169*17e6d639SJames Collins                        return true;
170*17e6d639SJames Collins            }
171*17e6d639SJames Collins
172*17e6d639SJames Collins            return true;
173*17e6d639SJames Collins        }
174*17e6d639SJames Collins
175*17e6d639SJames Collins        return false;
176*17e6d639SJames Collins    }
177*17e6d639SJames Collins
178*17e6d639SJames Collins
179*17e6d639SJames Collins    public function buildClassString($options, $classes, $prefix) {
180*17e6d639SJames Collins        $s = array();
181*17e6d639SJames Collins
182*17e6d639SJames Collins        foreach($classes as $item) {
183*17e6d639SJames Collins            if(array_key_exists($item, $options) && $options[$item] !== false) {
184*17e6d639SJames Collins                $classname = $item;
185*17e6d639SJames Collins
186*17e6d639SJames Collins                if(is_string($options[$item])) {
187*17e6d639SJames Collins                    $classname = $options[$item];
188*17e6d639SJames Collins                }
189*17e6d639SJames Collins
190*17e6d639SJames Collins                if(is_string($prefix)) {
191*17e6d639SJames Collins                    $classname = $prefix . $classname;
192*17e6d639SJames Collins                } else if(is_array($prefix)) {
193*17e6d639SJames Collins                    foreach($prefix as $pitem => $pvalue) {
194*17e6d639SJames Collins                        if(is_string($pvalue)) {
195*17e6d639SJames Collins                            if($pvalue == $item) {
196*17e6d639SJames Collins                                if(is_string($options[$item])) {
197*17e6d639SJames Collins                                    $classname = $pitem . $options[$item];
198*17e6d639SJames Collins                                } else {
199*17e6d639SJames Collins                                    $classname = $pitem . $item;
200*17e6d639SJames Collins                                }
201*17e6d639SJames Collins                            }
202*17e6d639SJames Collins                        }
203*17e6d639SJames Collins
204*17e6d639SJames Collins                        if(is_array($pvalue)) {
205*17e6d639SJames Collins                            foreach($pvalue as $ppitem) {
206*17e6d639SJames Collins                                if($ppitem == $item) {
207*17e6d639SJames Collins                                    if(is_string($options[$item])) {
208*17e6d639SJames Collins                                        $classname = $pitem . $options[$item];
209*17e6d639SJames Collins                                    } else {
210*17e6d639SJames Collins                                        $classname = $pitem . $item;
211*17e6d639SJames Collins                                    }
212*17e6d639SJames Collins                                }
213*17e6d639SJames Collins                            }
214*17e6d639SJames Collins                        }
215*17e6d639SJames Collins                    }
216*17e6d639SJames Collins                }
217*17e6d639SJames Collins
218*17e6d639SJames Collins                $s[] = $classname;
219*17e6d639SJames Collins            }
220*17e6d639SJames Collins        }
221*17e6d639SJames Collins
222*17e6d639SJames Collins        foreach($this->incClasses as $item) {
223*17e6d639SJames Collins            if(array_key_exists($item, $options) && $options[$item] == true) $s[] = $item;
224*17e6d639SJames Collins        }
225*17e6d639SJames Collins
226*17e6d639SJames Collins        $s = ' ' . implode(' ', $s);
227*17e6d639SJames Collins        return $s;
228*17e6d639SJames Collins    }
229*17e6d639SJames Collins
230*17e6d639SJames Collins
231*17e6d639SJames Collins    public function getMediaFile($str) {
232*17e6d639SJames Collins        $i = strpos($str, '?');
233*17e6d639SJames Collins        if($i !== false) $str = substr($str, 0, $i);
234*17e6d639SJames Collins
235*17e6d639SJames Collins        $str = preg_replace('/[^\da-zA-Z:_.]+/', '', $str);
236*17e6d639SJames Collins
237*17e6d639SJames Collins        return(tpl_getMediaFile(array($str), false));
238*17e6d639SJames Collins    }
239*17e6d639SJames Collins
240*17e6d639SJames Collins
241*17e6d639SJames Collins    public function setAttr(&$attrList, $attr, $data, $newAttrName='', $newAttrVal='') {
242*17e6d639SJames Collins        if(array_key_exists($attr, $data) && $data[$attr] !== false) {
243*17e6d639SJames Collins            $value = $data[$attr];
244*17e6d639SJames Collins
245*17e6d639SJames Collins            if($newAttrName != '') $attr = $newAttrName;
246*17e6d639SJames Collins            if($newAttrVal != '') {
247*17e6d639SJames Collins                $newAttrVal = str_replace('%%VALUE%%', $value, $newAttrVal);
248*17e6d639SJames Collins                if(strpos($newAttrVal, '%%MEDIA%%') !== false) {
249*17e6d639SJames Collins                    $newAttrVal = str_replace('%%MEDIA%%', $this->getMediaFile($value), $newAttrVal);
250*17e6d639SJames Collins                }
251*17e6d639SJames Collins
252*17e6d639SJames Collins                $value = $newAttrVal;
253*17e6d639SJames Collins            }
254*17e6d639SJames Collins
255*17e6d639SJames Collins            $attrList[$attr] = $value;
256*17e6d639SJames Collins        }
257*17e6d639SJames Collins    }
258*17e6d639SJames Collins
259*17e6d639SJames Collins
260*17e6d639SJames Collins    public function listAttr($attrName, $attrs) {
261*17e6d639SJames Collins        $s = '';
262*17e6d639SJames Collins
263*17e6d639SJames Collins        if(count($attrs) > 0) {
264*17e6d639SJames Collins            foreach($attrs as $item => $value) {
265*17e6d639SJames Collins                $s .= $item . ':' . $value . ';';
266*17e6d639SJames Collins            }
267*17e6d639SJames Collins
268*17e6d639SJames Collins            $s = $attrName . '="' . $s . '" ';
269*17e6d639SJames Collins        }
270*17e6d639SJames Collins
271*17e6d639SJames Collins        return $s;
272*17e6d639SJames Collins    }
273*17e6d639SJames Collins
274*17e6d639SJames Collins
275*17e6d639SJames Collins    public function syntaxRender(Doku_Renderer $renderer, $className, $text) {
276*17e6d639SJames Collins        $class = new $className;
277*17e6d639SJames Collins
278*17e6d639SJames Collins        $class->render_lexer_enter($renderer, null);
279*17e6d639SJames Collins        $renderer->doc .= $text;
280*17e6d639SJames Collins        $class->render_lexer_exit($renderer, null);
281*17e6d639SJames Collins    }
282*17e6d639SJames Collins}