xref: /plugin/mikioplugin/syntax/core.php (revision f1a539d8b38d5908a246e1fe59c7c774199e9f86)
117e6d639SJames Collins<?php
217e6d639SJames Collins/**
317e6d639SJames Collins * Mikio Core Syntax Plugin
417e6d639SJames Collins *
517e6d639SJames Collins * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
617e6d639SJames Collins * @author     James Collins <james.collins@outlook.com.au>
717e6d639SJames Collins */
817e6d639SJames Collins
917e6d639SJames Collinsif (!defined('DOKU_INC')) die();
1017e6d639SJames Collinsif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
1117e6d639SJames Collins
1217e6d639SJames Collins
1317e6d639SJames Collinsclass syntax_plugin_mikioplugin_core extends DokuWiki_Syntax_Plugin {
1417e6d639SJames Collins    public $pattern_entry       = '';
1517e6d639SJames Collins    public $pattern_exit        = '';
1617e6d639SJames Collins    public $tag                 = '';
1717e6d639SJames Collins    public $noEndTag            = false;
1817e6d639SJames Collins    public $defaults            = array();
1917e6d639SJames Collins    public $options             = array();
2017e6d639SJames Collins    public $values              = array();
2117e6d639SJames Collins    public $incClasses          = array('shadow');
2217e6d639SJames Collins
2317e6d639SJames Collins
2417e6d639SJames Collins    function __construct() {
2517e6d639SJames Collins        if(count($this->incClasses) > 0) {
2617e6d639SJames Collins            $this->options = array_merge($this->options, $this->incClasses);
2717e6d639SJames Collins        }
2817e6d639SJames Collins    }
2917e6d639SJames Collins
3017e6d639SJames Collins    public function getType() {
3117e6d639SJames Collins        return 'formatting';
3217e6d639SJames Collins    }
3317e6d639SJames Collins
3417e6d639SJames Collins
3517e6d639SJames Collins    public function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); }
3617e6d639SJames Collins    public function getSort(){ return 32; }
3717e6d639SJames Collins
3817e6d639SJames Collins
3917e6d639SJames Collins    public function connectTo($mode) {
4017e6d639SJames Collins        if($this->pattern_entry == '' && $this->tag != '') {
4117e6d639SJames Collins            if($this->noEndTag) {
4217e6d639SJames Collins                $this->pattern_entry = '<(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ').*?>';
4317e6d639SJames Collins            } else {
4417e6d639SJames Collins                $this->pattern_entry = '<(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ').*?>(?=.*?</(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ')>)';
4517e6d639SJames Collins            }
4617e6d639SJames Collins        }
4717e6d639SJames Collins
4817e6d639SJames Collins        if($this->pattern_entry != '') {
4917e6d639SJames Collins            if($this->noEndTag) {
5017e6d639SJames Collins                $this->Lexer->addSpecialPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_'.$this->getPluginComponent());
5117e6d639SJames Collins            } else {
5217e6d639SJames Collins                $this->Lexer->addEntryPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_'.$this->getPluginComponent());
5317e6d639SJames Collins            }
5417e6d639SJames Collins        }
5517e6d639SJames Collins    }
5617e6d639SJames Collins
5717e6d639SJames Collins
5817e6d639SJames Collins    public function postConnect() {
5917e6d639SJames Collins        if(!$this->noEndTag) {
6017e6d639SJames Collins            if($this->pattern_exit == '' && $this->tag != '') {
6117e6d639SJames Collins                $this->pattern_exit = '</(?:' . strtoupper($this->tag) . '|' . strtolower($this->tag) . ')>';
6217e6d639SJames Collins            }
6317e6d639SJames Collins
6417e6d639SJames Collins            if($this->pattern_exit != '') {
6517e6d639SJames Collins                $this->Lexer->addExitPattern($this->pattern_exit, 'plugin_mikioplugin_'.$this->getPluginComponent());
6617e6d639SJames Collins            }
6717e6d639SJames Collins        }
6817e6d639SJames Collins    }
6917e6d639SJames Collins
7017e6d639SJames Collins    public function handle($match, $state, $pos, Doku_Handler $handler){
7117e6d639SJames Collins        switch($state) {
7217e6d639SJames Collins            case DOKU_LEXER_ENTER:
7317e6d639SJames Collins            case DOKU_LEXER_SPECIAL:
7417e6d639SJames Collins                $optionlist = preg_split('/\s(?=([^"]*"[^"]*")*[^"]*$)/', substr($match, strlen($this->tag) + 1, -1));
7517e6d639SJames Collins
7617e6d639SJames Collins                $options_clean = array();
7717e6d639SJames Collins
7817e6d639SJames Collins                $options = array();
7917e6d639SJames Collins                foreach($optionlist as $item) {
8017e6d639SJames Collins                    $i = strpos($item, '=');
8117e6d639SJames Collins                    if($i !== false) {
8217e6d639SJames Collins                        $value = substr($item, $i + 1);
8317e6d639SJames Collins
8417e6d639SJames Collins                        if(substr($value, 0, 1) == '"') $value = substr($value, 1);
8517e6d639SJames Collins                        if(substr($value, -1) == '"') $value = substr($value, 0, -1);
8617e6d639SJames Collins
8717e6d639SJames Collins                        $options[substr($item, 0, $i)] = $value;
8817e6d639SJames Collins                    } else {
8917e6d639SJames Collins                        $options[$item] = true;
9017e6d639SJames Collins                    }
9117e6d639SJames Collins                }
9217e6d639SJames Collins
9317e6d639SJames Collins                foreach($this->options as $item => $value) {
9417e6d639SJames Collins                    if(is_string($value)) {
9517e6d639SJames Collins                        if(array_key_exists($value, $options)) {
9617e6d639SJames Collins                            $options_clean[$value] = $options[$value];
9717e6d639SJames Collins                        } else {
9817e6d639SJames Collins                            $options_clean[$value] = false;
9917e6d639SJames Collins                        }
10017e6d639SJames Collins                    } else if(is_array($value)) {
10117e6d639SJames Collins                        foreach($value as $avalue) {
10217e6d639SJames Collins                            if(array_key_exists($avalue, $options)) {
10317e6d639SJames Collins                                $options_clean[$item] = $avalue;
10417e6d639SJames Collins                            }
10517e6d639SJames Collins                        }
10617e6d639SJames Collins                    }
10717e6d639SJames Collins                }
10817e6d639SJames Collins
10917e6d639SJames Collins                foreach($this->defaults as $item => $value) {
11017e6d639SJames Collins                    if(array_key_exists($item, $options_clean) == false) {
11117e6d639SJames Collins                        $options_clean[$item] = $value;
11217e6d639SJames Collins                    }
11317e6d639SJames Collins                }
11417e6d639SJames Collins
11517e6d639SJames Collins                $this->values = $options_clean;
11617e6d639SJames Collins
11717e6d639SJames Collins                return array($state, $options_clean);
11817e6d639SJames Collins
11917e6d639SJames Collins            case DOKU_LEXER_UNMATCHED:
12017e6d639SJames Collins                return array($state, $match);
12117e6d639SJames Collins
12217e6d639SJames Collins            case DOKU_LEXER_EXIT:
12317e6d639SJames Collins                return array($state, '');
12417e6d639SJames Collins        }
12517e6d639SJames Collins
12617e6d639SJames Collins        return array();
12717e6d639SJames Collins    }
12817e6d639SJames Collins
12917e6d639SJames Collins
13017e6d639SJames Collins    public function render_lexer_enter(Doku_Renderer $renderer, $data) {
13117e6d639SJames Collins
13217e6d639SJames Collins    }
13317e6d639SJames Collins
13417e6d639SJames Collins
13517e6d639SJames Collins    public function render_lexer_unmatched(Doku_Renderer $renderer, $data) {
13617e6d639SJames Collins        $renderer->doc .= $renderer->_xmlEntities($data);
13717e6d639SJames Collins    }
13817e6d639SJames Collins
13917e6d639SJames Collins
14017e6d639SJames Collins    public function render_lexer_exit(Doku_Renderer $renderer, $data) {
14117e6d639SJames Collins
14217e6d639SJames Collins    }
14317e6d639SJames Collins
14417e6d639SJames Collins
14517e6d639SJames Collins    public function render_lexer_special(Doku_Renderer $renderer, $data) {
14617e6d639SJames Collins
14717e6d639SJames Collins    }
14817e6d639SJames Collins
14917e6d639SJames Collins
15017e6d639SJames Collins    public function render($mode, Doku_Renderer $renderer, $data) {
15117e6d639SJames Collins        if($mode == 'xhtml'){
15217e6d639SJames Collins            list($state,$match) = $data;
15317e6d639SJames Collins
15417e6d639SJames Collins            switch ($state) {
15517e6d639SJames Collins                case DOKU_LEXER_ENTER:
15617e6d639SJames Collins                    $this->render_lexer_enter($renderer, $match);
15717e6d639SJames Collins                    return true;
15817e6d639SJames Collins
15917e6d639SJames Collins                case DOKU_LEXER_UNMATCHED :
16017e6d639SJames Collins                    $this->render_lexer_unmatched($renderer, $match);
16117e6d639SJames Collins                    return true;
16217e6d639SJames Collins
16317e6d639SJames Collins                case DOKU_LEXER_EXIT :
16417e6d639SJames Collins                    $this->render_lexer_exit($renderer, $match);
16517e6d639SJames Collins                    return true;
16617e6d639SJames Collins
16717e6d639SJames Collins                    case DOKU_LEXER_SPECIAL:
16817e6d639SJames Collins                        $this->render_lexer_special($renderer, $match);
16917e6d639SJames Collins                        return true;
17017e6d639SJames Collins            }
17117e6d639SJames Collins
17217e6d639SJames Collins            return true;
17317e6d639SJames Collins        }
17417e6d639SJames Collins
17517e6d639SJames Collins        return false;
17617e6d639SJames Collins    }
17717e6d639SJames Collins
17817e6d639SJames Collins
17917e6d639SJames Collins    public function buildClassString($options, $classes, $prefix) {
18017e6d639SJames Collins        $s = array();
18117e6d639SJames Collins
18217e6d639SJames Collins        foreach($classes as $item) {
18317e6d639SJames Collins            if(array_key_exists($item, $options) && $options[$item] !== false) {
18417e6d639SJames Collins                $classname = $item;
18517e6d639SJames Collins
18617e6d639SJames Collins                if(is_string($options[$item])) {
18717e6d639SJames Collins                    $classname = $options[$item];
18817e6d639SJames Collins                }
18917e6d639SJames Collins
19017e6d639SJames Collins                if(is_string($prefix)) {
19117e6d639SJames Collins                    $classname = $prefix . $classname;
19217e6d639SJames Collins                } else if(is_array($prefix)) {
19317e6d639SJames Collins                    foreach($prefix as $pitem => $pvalue) {
19417e6d639SJames Collins                        if(is_string($pvalue)) {
19517e6d639SJames Collins                            if($pvalue == $item) {
19617e6d639SJames Collins                                if(is_string($options[$item])) {
19717e6d639SJames Collins                                    $classname = $pitem . $options[$item];
19817e6d639SJames Collins                                } else {
19917e6d639SJames Collins                                    $classname = $pitem . $item;
20017e6d639SJames Collins                                }
20117e6d639SJames Collins                            }
20217e6d639SJames Collins                        }
20317e6d639SJames Collins
20417e6d639SJames Collins                        if(is_array($pvalue)) {
20517e6d639SJames Collins                            foreach($pvalue as $ppitem) {
20617e6d639SJames Collins                                if($ppitem == $item) {
20717e6d639SJames Collins                                    if(is_string($options[$item])) {
20817e6d639SJames Collins                                        $classname = $pitem . $options[$item];
20917e6d639SJames Collins                                    } else {
21017e6d639SJames Collins                                        $classname = $pitem . $item;
21117e6d639SJames Collins                                    }
21217e6d639SJames Collins                                }
21317e6d639SJames Collins                            }
21417e6d639SJames Collins                        }
21517e6d639SJames Collins                    }
21617e6d639SJames Collins                }
21717e6d639SJames Collins
21817e6d639SJames Collins                $s[] = $classname;
21917e6d639SJames Collins            }
22017e6d639SJames Collins        }
22117e6d639SJames Collins
22217e6d639SJames Collins        foreach($this->incClasses as $item) {
22317e6d639SJames Collins            if(array_key_exists($item, $options) && $options[$item] == true) $s[] = $item;
22417e6d639SJames Collins        }
22517e6d639SJames Collins
22617e6d639SJames Collins        $s = ' ' . implode(' ', $s);
22717e6d639SJames Collins        return $s;
22817e6d639SJames Collins    }
22917e6d639SJames Collins
23017e6d639SJames Collins
23117e6d639SJames Collins    public function getMediaFile($str) {
23217e6d639SJames Collins        $i = strpos($str, '?');
23317e6d639SJames Collins        if($i !== false) $str = substr($str, 0, $i);
23417e6d639SJames Collins
23517e6d639SJames Collins        $str = preg_replace('/[^\da-zA-Z:_.]+/', '', $str);
23617e6d639SJames Collins
23717e6d639SJames Collins        return(tpl_getMediaFile(array($str), false));
23817e6d639SJames Collins    }
23917e6d639SJames Collins
24017e6d639SJames Collins
241*f1a539d8SJames Collins    public function getLink($str) {
242*f1a539d8SJames Collins        $i = strpos($str, '://');
243*f1a539d8SJames Collins        if($i !== false) return $str;
244*f1a539d8SJames Collins
245*f1a539d8SJames Collins        return wl($str);
246*f1a539d8SJames Collins    }
247*f1a539d8SJames Collins
248*f1a539d8SJames Collins
24917e6d639SJames Collins    public function setAttr(&$attrList, $attr, $data, $newAttrName='', $newAttrVal='') {
25017e6d639SJames Collins        if(array_key_exists($attr, $data) && $data[$attr] !== false) {
25117e6d639SJames Collins            $value = $data[$attr];
25217e6d639SJames Collins
25317e6d639SJames Collins            if($newAttrName != '') $attr = $newAttrName;
25417e6d639SJames Collins            if($newAttrVal != '') {
25517e6d639SJames Collins                $newAttrVal = str_replace('%%VALUE%%', $value, $newAttrVal);
25617e6d639SJames Collins                if(strpos($newAttrVal, '%%MEDIA%%') !== false) {
25717e6d639SJames Collins                    $newAttrVal = str_replace('%%MEDIA%%', $this->getMediaFile($value), $newAttrVal);
25817e6d639SJames Collins                }
25917e6d639SJames Collins
26017e6d639SJames Collins                $value = $newAttrVal;
26117e6d639SJames Collins            }
26217e6d639SJames Collins
26317e6d639SJames Collins            $attrList[$attr] = $value;
26417e6d639SJames Collins        }
26517e6d639SJames Collins    }
26617e6d639SJames Collins
26717e6d639SJames Collins
26817e6d639SJames Collins    public function listAttr($attrName, $attrs) {
26917e6d639SJames Collins        $s = '';
27017e6d639SJames Collins
27117e6d639SJames Collins        if(count($attrs) > 0) {
27217e6d639SJames Collins            foreach($attrs as $item => $value) {
27317e6d639SJames Collins                $s .= $item . ':' . $value . ';';
27417e6d639SJames Collins            }
27517e6d639SJames Collins
27617e6d639SJames Collins            $s = $attrName . '="' . $s . '" ';
27717e6d639SJames Collins        }
27817e6d639SJames Collins
27917e6d639SJames Collins        return $s;
28017e6d639SJames Collins    }
28117e6d639SJames Collins
28217e6d639SJames Collins
28317e6d639SJames Collins    public function syntaxRender(Doku_Renderer $renderer, $className, $text) {
28417e6d639SJames Collins        $class = new $className;
28517e6d639SJames Collins
28617e6d639SJames Collins        $class->render_lexer_enter($renderer, null);
28717e6d639SJames Collins        $renderer->doc .= $text;
28817e6d639SJames Collins        $class->render_lexer_exit($renderer, null);
28917e6d639SJames Collins    }
29017e6d639SJames Collins}