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}