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 = array(); 7717e6d639SJames Collins foreach($optionlist as $item) { 7817e6d639SJames Collins $i = strpos($item, '='); 7917e6d639SJames Collins if($i !== false) { 8017e6d639SJames Collins $value = substr($item, $i + 1); 8117e6d639SJames Collins 8217e6d639SJames Collins if(substr($value, 0, 1) == '"') $value = substr($value, 1); 8317e6d639SJames Collins if(substr($value, -1) == '"') $value = substr($value, 0, -1); 8417e6d639SJames Collins 8517e6d639SJames Collins $options[substr($item, 0, $i)] = $value; 8617e6d639SJames Collins } else { 8717e6d639SJames Collins $options[$item] = true; 8817e6d639SJames Collins } 8917e6d639SJames Collins } 9017e6d639SJames Collins 91*31359b6fSJames Collins $options_clean = $this->cleanOptions($options); 92*31359b6fSJames Collins 93*31359b6fSJames Collins $this->values = $options_clean; 94*31359b6fSJames Collins 95*31359b6fSJames Collins return array($state, $options_clean); 96*31359b6fSJames Collins 97*31359b6fSJames Collins case DOKU_LEXER_UNMATCHED: 98*31359b6fSJames Collins return array($state, $match); 99*31359b6fSJames Collins 100*31359b6fSJames Collins case DOKU_LEXER_EXIT: 101*31359b6fSJames Collins return array($state, ''); 102*31359b6fSJames Collins } 103*31359b6fSJames Collins 104*31359b6fSJames Collins return array(); 105*31359b6fSJames Collins } 106*31359b6fSJames Collins 107*31359b6fSJames Collins 108*31359b6fSJames Collins public function cleanOptions($options) { 109*31359b6fSJames Collins $options_clean = array(); 110*31359b6fSJames Collins 11117e6d639SJames Collins foreach($this->options as $item => $value) { 11217e6d639SJames Collins if(is_string($value)) { 11317e6d639SJames Collins if(array_key_exists($value, $options)) { 11417e6d639SJames Collins $options_clean[$value] = $options[$value]; 11517e6d639SJames Collins } else { 11617e6d639SJames Collins $options_clean[$value] = false; 11717e6d639SJames Collins } 11817e6d639SJames Collins } else if(is_array($value)) { 11917e6d639SJames Collins foreach($value as $avalue) { 12017e6d639SJames Collins if(array_key_exists($avalue, $options)) { 12117e6d639SJames Collins $options_clean[$item] = $avalue; 12217e6d639SJames Collins } 12317e6d639SJames Collins } 12417e6d639SJames Collins } 12517e6d639SJames Collins } 12617e6d639SJames Collins 12717e6d639SJames Collins foreach($this->defaults as $item => $value) { 12817e6d639SJames Collins if(array_key_exists($item, $options_clean) == false) { 12917e6d639SJames Collins $options_clean[$item] = $value; 13017e6d639SJames Collins } 13117e6d639SJames Collins } 13217e6d639SJames Collins 133*31359b6fSJames Collins return $options_clean; 13417e6d639SJames Collins } 13517e6d639SJames Collins 13617e6d639SJames Collins 13717e6d639SJames Collins public function render_lexer_enter(Doku_Renderer $renderer, $data) { 13817e6d639SJames Collins 13917e6d639SJames Collins } 14017e6d639SJames Collins 14117e6d639SJames Collins 14217e6d639SJames Collins public function render_lexer_unmatched(Doku_Renderer $renderer, $data) { 14317e6d639SJames Collins $renderer->doc .= $renderer->_xmlEntities($data); 14417e6d639SJames Collins } 14517e6d639SJames Collins 14617e6d639SJames Collins 14717e6d639SJames Collins public function render_lexer_exit(Doku_Renderer $renderer, $data) { 14817e6d639SJames Collins 14917e6d639SJames Collins } 15017e6d639SJames Collins 15117e6d639SJames Collins 15217e6d639SJames Collins public function render_lexer_special(Doku_Renderer $renderer, $data) { 15317e6d639SJames Collins 15417e6d639SJames Collins } 15517e6d639SJames Collins 15617e6d639SJames Collins 15717e6d639SJames Collins public function render($mode, Doku_Renderer $renderer, $data) { 15817e6d639SJames Collins if($mode == 'xhtml'){ 15917e6d639SJames Collins list($state,$match) = $data; 16017e6d639SJames Collins 16117e6d639SJames Collins switch ($state) { 16217e6d639SJames Collins case DOKU_LEXER_ENTER: 16317e6d639SJames Collins $this->render_lexer_enter($renderer, $match); 16417e6d639SJames Collins return true; 16517e6d639SJames Collins 16617e6d639SJames Collins case DOKU_LEXER_UNMATCHED : 16717e6d639SJames Collins $this->render_lexer_unmatched($renderer, $match); 16817e6d639SJames Collins return true; 16917e6d639SJames Collins 17017e6d639SJames Collins case DOKU_LEXER_EXIT : 17117e6d639SJames Collins $this->render_lexer_exit($renderer, $match); 17217e6d639SJames Collins return true; 17317e6d639SJames Collins 17417e6d639SJames Collins case DOKU_LEXER_SPECIAL: 17517e6d639SJames Collins $this->render_lexer_special($renderer, $match); 17617e6d639SJames Collins return true; 17717e6d639SJames Collins } 17817e6d639SJames Collins 17917e6d639SJames Collins return true; 18017e6d639SJames Collins } 18117e6d639SJames Collins 18217e6d639SJames Collins return false; 18317e6d639SJames Collins } 18417e6d639SJames Collins 18517e6d639SJames Collins 18617e6d639SJames Collins public function buildClassString($options, $classes, $prefix) { 18717e6d639SJames Collins $s = array(); 18817e6d639SJames Collins 18917e6d639SJames Collins foreach($classes as $item) { 19017e6d639SJames Collins if(array_key_exists($item, $options) && $options[$item] !== false) { 19117e6d639SJames Collins $classname = $item; 19217e6d639SJames Collins 19317e6d639SJames Collins if(is_string($options[$item])) { 19417e6d639SJames Collins $classname = $options[$item]; 19517e6d639SJames Collins } 19617e6d639SJames Collins 19717e6d639SJames Collins if(is_string($prefix)) { 19817e6d639SJames Collins $classname = $prefix . $classname; 19917e6d639SJames Collins } else if(is_array($prefix)) { 20017e6d639SJames Collins foreach($prefix as $pitem => $pvalue) { 20117e6d639SJames Collins if(is_string($pvalue)) { 20217e6d639SJames Collins if($pvalue == $item) { 20317e6d639SJames Collins if(is_string($options[$item])) { 20417e6d639SJames Collins $classname = $pitem . $options[$item]; 20517e6d639SJames Collins } else { 20617e6d639SJames Collins $classname = $pitem . $item; 20717e6d639SJames Collins } 20817e6d639SJames Collins } 20917e6d639SJames Collins } 21017e6d639SJames Collins 21117e6d639SJames Collins if(is_array($pvalue)) { 21217e6d639SJames Collins foreach($pvalue as $ppitem) { 21317e6d639SJames Collins if($ppitem == $item) { 21417e6d639SJames Collins if(is_string($options[$item])) { 21517e6d639SJames Collins $classname = $pitem . $options[$item]; 21617e6d639SJames Collins } else { 21717e6d639SJames Collins $classname = $pitem . $item; 21817e6d639SJames Collins } 21917e6d639SJames Collins } 22017e6d639SJames Collins } 22117e6d639SJames Collins } 22217e6d639SJames Collins } 22317e6d639SJames Collins } 22417e6d639SJames Collins 22517e6d639SJames Collins $s[] = $classname; 22617e6d639SJames Collins } 22717e6d639SJames Collins } 22817e6d639SJames Collins 22917e6d639SJames Collins foreach($this->incClasses as $item) { 23017e6d639SJames Collins if(array_key_exists($item, $options) && $options[$item] == true) $s[] = $item; 23117e6d639SJames Collins } 23217e6d639SJames Collins 23317e6d639SJames Collins $s = ' ' . implode(' ', $s); 23417e6d639SJames Collins return $s; 23517e6d639SJames Collins } 23617e6d639SJames Collins 23717e6d639SJames Collins 23817e6d639SJames Collins public function getMediaFile($str) { 23917e6d639SJames Collins $i = strpos($str, '?'); 24017e6d639SJames Collins if($i !== false) $str = substr($str, 0, $i); 24117e6d639SJames Collins 24217e6d639SJames Collins $str = preg_replace('/[^\da-zA-Z:_.]+/', '', $str); 24317e6d639SJames Collins 24417e6d639SJames Collins return(tpl_getMediaFile(array($str), false)); 24517e6d639SJames Collins } 24617e6d639SJames Collins 24717e6d639SJames Collins 248f1a539d8SJames Collins public function getLink($str) { 249f1a539d8SJames Collins $i = strpos($str, '://'); 250f1a539d8SJames Collins if($i !== false) return $str; 251f1a539d8SJames Collins 252f1a539d8SJames Collins return wl($str); 253f1a539d8SJames Collins } 254f1a539d8SJames Collins 255f1a539d8SJames Collins 25617e6d639SJames Collins public function setAttr(&$attrList, $attr, $data, $newAttrName='', $newAttrVal='') { 25717e6d639SJames Collins if(array_key_exists($attr, $data) && $data[$attr] !== false) { 25817e6d639SJames Collins $value = $data[$attr]; 25917e6d639SJames Collins 26017e6d639SJames Collins if($newAttrName != '') $attr = $newAttrName; 26117e6d639SJames Collins if($newAttrVal != '') { 26217e6d639SJames Collins $newAttrVal = str_replace('%%VALUE%%', $value, $newAttrVal); 26317e6d639SJames Collins if(strpos($newAttrVal, '%%MEDIA%%') !== false) { 26417e6d639SJames Collins $newAttrVal = str_replace('%%MEDIA%%', $this->getMediaFile($value), $newAttrVal); 26517e6d639SJames Collins } 26617e6d639SJames Collins 26717e6d639SJames Collins $value = $newAttrVal; 26817e6d639SJames Collins } 26917e6d639SJames Collins 27017e6d639SJames Collins $attrList[$attr] = $value; 27117e6d639SJames Collins } 27217e6d639SJames Collins } 27317e6d639SJames Collins 27417e6d639SJames Collins 27517e6d639SJames Collins public function listAttr($attrName, $attrs) { 27617e6d639SJames Collins $s = ''; 27717e6d639SJames Collins 27817e6d639SJames Collins if(count($attrs) > 0) { 27917e6d639SJames Collins foreach($attrs as $item => $value) { 28017e6d639SJames Collins $s .= $item . ':' . $value . ';'; 28117e6d639SJames Collins } 28217e6d639SJames Collins 28317e6d639SJames Collins $s = $attrName . '="' . $s . '" '; 28417e6d639SJames Collins } 28517e6d639SJames Collins 28617e6d639SJames Collins return $s; 28717e6d639SJames Collins } 28817e6d639SJames Collins 28917e6d639SJames Collins 290*31359b6fSJames Collins public function syntaxRender(Doku_Renderer $renderer, $className, $text, $data=null) { 29117e6d639SJames Collins $class = new $className; 29217e6d639SJames Collins 293*31359b6fSJames Collins if(!is_array($data)) $data = array(); 294*31359b6fSJames Collins 295*31359b6fSJames Collins $data = $class->cleanOptions($data); 296*31359b6fSJames Collins 297*31359b6fSJames Collins if($class->noEndTag) { 298*31359b6fSJames Collins $class->render_lexer_special($renderer, $data); 299*31359b6fSJames Collins } else { 300*31359b6fSJames Collins $class->render_lexer_enter($renderer, $data); 30117e6d639SJames Collins $renderer->doc .= $text; 30217e6d639SJames Collins $class->render_lexer_exit($renderer, null); 30317e6d639SJames Collins } 30417e6d639SJames Collins } 305*31359b6fSJames Collins}