117e6d639SJames Collins<?php 20e73f855Snomadjimbob 317e6d639SJames Collins/** 417e6d639SJames Collins * Mikio Core Syntax Plugin 517e6d639SJames Collins * 67935713eSJames Collins * @link http://github.com/nomadjimbob/mikioplugin 717e6d639SJames Collins * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 817e6d639SJames Collins * @author James Collins <james.collins@outlook.com.au> 917e6d639SJames Collins */ 10b007ca42SJames Collinsif (!defined('DOKU_INC')) { die(); 11b007ca42SJames Collins} 12b007ca42SJames Collinsif (!defined('DOKU_PLUGIN')) { define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 13b007ca42SJames Collins} 1417e6d639SJames Collins 153a0ad8d3SJames Collinsrequire_once __DIR__.'/../disabled-tags.php'; 167f46de55SJames Collins 177935713eSJames Collinsdefine('MIKIO_LEXER_AUTO', 0); 187935713eSJames Collinsdefine('MIKIO_LEXER_ENTER', 1); 197935713eSJames Collinsdefine('MIKIO_LEXER_EXIT', 2); 207935713eSJames Collinsdefine('MIKIO_LEXER_SPECIAL', 3); 2117e6d639SJames Collins 227935713eSJames Collinsclass syntax_plugin_mikioplugin_core extends DokuWiki_Syntax_Plugin 237935713eSJames Collins{ 2417e6d639SJames Collins public $pattern_entry = ''; 253deaf3a5SJames Collins public $pattern = ''; 2617e6d639SJames Collins public $pattern_exit = ''; 2717e6d639SJames Collins public $tag = ''; 287f46de55SJames Collins public $requires_tag = ''; 297935713eSJames Collins public $hasEndTag = true; 3017e6d639SJames Collins public $options = array(); 31*2625d0caSJames Collins public $isContainer = false; 327935713eSJames Collins 337935713eSJames Collins protected $tagPrefix = ''; //'mikio-'; 347935713eSJames Collins protected $classPrefix = 'mikiop-'; 357935713eSJames Collins protected $elemClass = 'mikiop'; 367935713eSJames Collins 377935713eSJames Collins private $values = array(); 3817e6d639SJames Collins 3917e6d639SJames Collins 400e73f855Snomadjimbob function __construct() 410e73f855Snomadjimbob { 422d897619SJames Collins } 432d897619SJames Collins 442d897619SJames Collins public function isDisabled() 452d897619SJames Collins { 467f46de55SJames Collins global $mikio_disabled_tags; 477f46de55SJames Collins 487f46de55SJames Collins if (isset($mikio_disabled_tags) === true) { 492d897619SJames Collins if(array_key_exists($this->tag, $mikio_disabled_tags) === true && $mikio_disabled_tags[$this->tag] === true) { 502d897619SJames Collins return true; 517f46de55SJames Collins } 527f46de55SJames Collins 537f46de55SJames Collins // check requirements 547f46de55SJames Collins if($this->requires_tag !== '') { 552d897619SJames Collins if(array_key_exists($this->requires_tag, $mikio_disabled_tags) === true && $mikio_disabled_tags[$this->requires_tag] === true) { 562d897619SJames Collins return true; 577f46de55SJames Collins } 587f46de55SJames Collins } 597f46de55SJames Collins } 602d897619SJames Collins 612d897619SJames Collins return false; 620e73f855Snomadjimbob } 632d897619SJames Collins 640e73f855Snomadjimbob public function getType() 650e73f855Snomadjimbob { 66*2625d0caSJames Collins return $this->isContainer ? 'container' : 'formatting'; 670e73f855Snomadjimbob } 680e73f855Snomadjimbob public function getAllowedTypes() 690e73f855Snomadjimbob { 70*2625d0caSJames Collins return $this->isContainer ? array('formatting','substition','disabled','container','protected','paragraphs') : array('formatting', 'substition', 'disabled', 'paragraphs'); 710e73f855Snomadjimbob } 727935713eSJames Collins // public function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); } 730e73f855Snomadjimbob public function getSort() 740e73f855Snomadjimbob { 750e73f855Snomadjimbob return 32; 760e73f855Snomadjimbob } 770e73f855Snomadjimbob public function getPType() 780e73f855Snomadjimbob { 790e73f855Snomadjimbob return 'stack'; 800e73f855Snomadjimbob } 8117e6d639SJames Collins 8217e6d639SJames Collins 837935713eSJames Collins public function connectTo($mode) 847935713eSJames Collins { 852d897619SJames Collins if($this->isDisabled() == true) { 862d897619SJames Collins return; 872d897619SJames Collins } 882d897619SJames Collins 8917e6d639SJames Collins if ($this->pattern_entry == '' && $this->tag != '') { 907935713eSJames Collins if ($this->hasEndTag) { 9161729b71SJames Collins $this->pattern_entry = '<(?i:' . $this->tagPrefix . $this->tag . ')(?=[ >])(?:".*?"|.*?)*?>(?=.*?</(?i:' . $this->tagPrefix . $this->tag . ')>)'; 9217e6d639SJames Collins } else { 9361729b71SJames Collins $this->pattern_entry = '<(?i:' . $this->tagPrefix . $this->tag . ')(?:".*?"|.*?)*?>'; 9417e6d639SJames Collins } 9517e6d639SJames Collins } 9617e6d639SJames Collins 9717e6d639SJames Collins if ($this->pattern_entry != '') { 987935713eSJames Collins if ($this->hasEndTag) { 9917e6d639SJames Collins $this->Lexer->addEntryPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_' . $this->getPluginComponent()); 1007935713eSJames Collins } else { 1017935713eSJames Collins $this->Lexer->addSpecialPattern($this->pattern_entry, $mode, 'plugin_mikioplugin_' . $this->getPluginComponent()); 1027935713eSJames Collins } 10317e6d639SJames Collins } 10417e6d639SJames Collins } 1053deaf3a5SJames Collins 10617e6d639SJames Collins 1077935713eSJames Collins public function postConnect() 1087935713eSJames Collins { 1097935713eSJames Collins if ($this->hasEndTag) { 11017e6d639SJames Collins if ($this->pattern_exit == '' && $this->tag != '') { 1117935713eSJames Collins $this->pattern_exit = '</(?i:' . $this->tagPrefix . $this->tag . ')>'; 11217e6d639SJames Collins } 11317e6d639SJames Collins 11417e6d639SJames Collins if ($this->pattern_exit != '') { 11517e6d639SJames Collins $this->Lexer->addExitPattern($this->pattern_exit, 'plugin_mikioplugin_' . $this->getPluginComponent()); 11617e6d639SJames Collins } 11717e6d639SJames Collins } 11817e6d639SJames Collins } 11917e6d639SJames Collins 1207935713eSJames Collins public function handle($match, $state, $pos, Doku_Handler $handler) 1217935713eSJames Collins { 1222d897619SJames Collins if($this->isDisabled() != true) { 12317e6d639SJames Collins switch ($state) { 12417e6d639SJames Collins case DOKU_LEXER_ENTER: 12517e6d639SJames Collins case DOKU_LEXER_SPECIAL: 126c5f7fed6SJames Collins $match_fix = preg_replace('/\s*=\s*/', '=', trim(substr($match, strlen($this->tagPrefix . $this->tag) + 1, -1))); 127c5f7fed6SJames Collins $optionlist = preg_split('/\s(?=([^"]*"[^"]*")*[^"]*$)/', $match_fix); 12817e6d639SJames Collins 12917e6d639SJames Collins $options = array(); 13017e6d639SJames Collins foreach ($optionlist as $item) { 13117e6d639SJames Collins $i = strpos($item, '='); 13217e6d639SJames Collins if ($i !== false) { 13317e6d639SJames Collins $value = substr($item, $i + 1); 13417e6d639SJames Collins 135b007ca42SJames Collins if (substr($value, 0, 1) == '"') { $value = substr($value, 1); 136b007ca42SJames Collins } 137b007ca42SJames Collins if (substr($value, -1) == '"') { $value = substr($value, 0, -1); 138b007ca42SJames Collins } 13917e6d639SJames Collins 14017e6d639SJames Collins $options[substr($item, 0, $i)] = $value; 14117e6d639SJames Collins } else { 14217e6d639SJames Collins $options[$item] = true; 14317e6d639SJames Collins } 14417e6d639SJames Collins } 14517e6d639SJames Collins 1467935713eSJames Collins if (count($this->options) > 0) { 14731359b6fSJames Collins $options_clean = $this->cleanOptions($options); 1487935713eSJames Collins } else { 1497935713eSJames Collins $options_clean = $options; 1507935713eSJames Collins } 15131359b6fSJames Collins 15231359b6fSJames Collins $this->values = $options_clean; 15331359b6fSJames Collins 15431359b6fSJames Collins return array($state, $options_clean); 15531359b6fSJames Collins 1563deaf3a5SJames Collins case DOKU_LEXER_MATCHED: 1573deaf3a5SJames Collins return array($state, $match); 1583deaf3a5SJames Collins 15931359b6fSJames Collins case DOKU_LEXER_UNMATCHED: 16031359b6fSJames Collins return array($state, $match); 16131359b6fSJames Collins 16231359b6fSJames Collins case DOKU_LEXER_EXIT: 163f4aa5cdcSJames Collins return array($state, $this->values); 16431359b6fSJames Collins } 1652d897619SJames Collins } 16631359b6fSJames Collins 16731359b6fSJames Collins return array(); 16831359b6fSJames Collins } 16931359b6fSJames Collins 17031359b6fSJames Collins 1717935713eSJames Collins /* 1727935713eSJames Collins * clean element options to only supported attributes, setting defaults if required 1737935713eSJames Collins * 1747935713eSJames Collins * @param $options options passed to element 1757935713eSJames Collins * @return array of options supported with default set 1767935713eSJames Collins */ 1777935713eSJames Collins protected function cleanOptions($data, $options = null) 1787935713eSJames Collins { 1797935713eSJames Collins $optionsCleaned = array(); 18031359b6fSJames Collins 181b007ca42SJames Collins if ($options == null) { $options = $this->options; 182b007ca42SJames Collins } 1837935713eSJames Collins 1847935713eSJames Collins // Match DokuWiki passed options to syntax options 1857935713eSJames Collins foreach ($data as $optionKey => $optionValue) { 1867935713eSJames Collins foreach ($options as $syntaxKey => $syntaxValue) { 1877935713eSJames Collins if (strcasecmp($optionKey, $syntaxKey) == 0) { 1887935713eSJames Collins if (array_key_exists('type', $options[$syntaxKey])) { 1897935713eSJames Collins $type = $options[$syntaxKey]['type']; 1907935713eSJames Collins 1917935713eSJames Collins switch ($type) { 1927935713eSJames Collins case 'boolean': 1937935713eSJames Collins $optionsCleaned[$syntaxKey] = filter_var($optionValue, FILTER_VALIDATE_BOOLEAN); 1947935713eSJames Collins break; 1957935713eSJames Collins case 'number': 1967935713eSJames Collins $optionsCleaned[$syntaxKey] = filter_var($optionValue, FILTER_VALIDATE_INT); 1977935713eSJames Collins break; 1987935713eSJames Collins case 'float': 1997935713eSJames Collins $optionsCleaned[$syntaxKey] = filter_var($optionValue, FILTER_VALIDATE_FLOAT); 2007935713eSJames Collins break; 2017935713eSJames Collins case 'text': 2027935713eSJames Collins $optionsCleaned[$syntaxKey] = $optionValue; 2037935713eSJames Collins break; 2047935713eSJames Collins case 'size': 2057935713eSJames Collins $s = strtolower($optionValue); 2067935713eSJames Collins $i = ''; 2077935713eSJames Collins if (substr($s, -3) == 'rem') { 2087935713eSJames Collins $i = substr($s, 0, -3); 2097935713eSJames Collins $s = 'rem'; 2107935713eSJames Collins } elseif (substr($s, -2) == 'em') { 2117935713eSJames Collins $i = substr($s, 0, -2); 2127935713eSJames Collins $s = 'em'; 2130e73f855Snomadjimbob } elseif (substr($s, -2) == 'px') { 2147935713eSJames Collins $i = substr($s, 0, -2); 2157935713eSJames Collins $s = 'px'; 2160e73f855Snomadjimbob } elseif (substr($s, -1) == '%') { 2177935713eSJames Collins $i = substr($s, 0, -1); 2187935713eSJames Collins $s = '%'; 2190e73f855Snomadjimbob } else { 22018e323fdSJames Collins if ($s != 'auto') { 2217935713eSJames Collins $i = filter_var($s, FILTER_VALIDATE_INT); 222b007ca42SJames Collins if ($i == '') { $i = '1'; 223b007ca42SJames Collins } 2247935713eSJames Collins $s = 'rem'; 2257935713eSJames Collins } 22618e323fdSJames Collins } 2277935713eSJames Collins 2287935713eSJames Collins $optionsCleaned[$syntaxKey] = $i . $s; 2297935713eSJames Collins break; 23018e323fdSJames Collins case 'multisize': 23118e323fdSJames Collins $val = ''; 23218e323fdSJames Collins $parts = explode(' ', $optionValue); 23318e323fdSJames Collins foreach ($parts as &$part) { 23418e323fdSJames Collins $s = strtolower($part); 23518e323fdSJames Collins $i = ''; 23618e323fdSJames Collins if (substr($s, -3) == 'rem') { 23718e323fdSJames Collins $i = substr($s, 0, -3); 23818e323fdSJames Collins $s = 'rem'; 23918e323fdSJames Collins } elseif (substr($s, -2) == 'em') { 24018e323fdSJames Collins $i = substr($s, 0, -2); 24118e323fdSJames Collins $s = 'em'; 2420e73f855Snomadjimbob } elseif (substr($s, -2) == 'px') { 24318e323fdSJames Collins $i = substr($s, 0, -2); 24418e323fdSJames Collins $s = 'px'; 2450e73f855Snomadjimbob } elseif (substr($s, -2) == 'fr') { 2462608c53cSJames Collins $i = substr($s, 0, -2); 2472608c53cSJames Collins $s = 'fr'; 2480e73f855Snomadjimbob } elseif (substr($s, -1) == '%') { 24918e323fdSJames Collins $i = substr($s, 0, -1); 25018e323fdSJames Collins $s = '%'; 2510e73f855Snomadjimbob } else { 25218e323fdSJames Collins if ($s != 'auto') { 25318e323fdSJames Collins $i = filter_var($s, FILTER_VALIDATE_INT); 254b007ca42SJames Collins if ($i === '') { $i = '1'; 255b007ca42SJames Collins } 25618e323fdSJames Collins if ($i != 0) { 25718e323fdSJames Collins $s = 'rem'; 25818e323fdSJames Collins } else { 25918e323fdSJames Collins $s = ''; 26018e323fdSJames Collins } 26118e323fdSJames Collins } 26218e323fdSJames Collins } 26318e323fdSJames Collins 26418e323fdSJames Collins $part = $i . $s; 26518e323fdSJames Collins } 26618e323fdSJames Collins 26718e323fdSJames Collins $optionsCleaned[$syntaxKey] = implode(' ', $parts); 26818e323fdSJames Collins break; 2697935713eSJames Collins case 'color': 2707935713eSJames Collins if (strlen($optionValue) == 3 || strlen($optionValue) == 6) { 2717935713eSJames Collins preg_match('/([[:xdigit:]]{3}){1,2}/', $optionValue, $matches); 2727935713eSJames Collins if (count($matches) > 1) { 2737935713eSJames Collins $optionsCleaned[$syntaxKey] = '#' . $matches[0]; 2740e73f855Snomadjimbob } else { 2750e73f855Snomadjimbob $optionsCleaned[$syntaxKey] = $optionValue; 2767935713eSJames Collins } 27717e6d639SJames Collins } else { 2787935713eSJames Collins $optionsCleaned[$syntaxKey] = $optionValue; 27917e6d639SJames Collins } 2807935713eSJames Collins break; 2817935713eSJames Collins case 'url': 2827935713eSJames Collins $optionsCleaned[$syntaxKey] = $this->buildLink($optionValue); 2837935713eSJames Collins break; 2847935713eSJames Collins case 'media': 2857935713eSJames Collins $optionsCleaned[$syntaxKey] = $this->buildMediaLink($optionValue); 2867935713eSJames Collins break; 2877935713eSJames Collins case 'choice': 2887935713eSJames Collins if (array_key_exists('data', $options[$syntaxKey])) { 2897935713eSJames Collins foreach ($options[$syntaxKey]['data'] as $choiceKey => $choiceValue) { 29018e323fdSJames Collins if (strcasecmp($optionValue, $choiceKey) == 0) { 29118e323fdSJames Collins $optionsCleaned[$syntaxKey] = $choiceKey; 29218e323fdSJames Collins break; 29318e323fdSJames Collins } 29418e323fdSJames Collins 2957935713eSJames Collins if (is_array($choiceValue)) { 2967935713eSJames Collins foreach ($choiceValue as $choiceItem) { 2977935713eSJames Collins if (strcasecmp($optionValue, $choiceItem) == 0) { 2987935713eSJames Collins $optionsCleaned[$syntaxKey] = $choiceKey; 2997935713eSJames Collins break 2; 30017e6d639SJames Collins } 30117e6d639SJames Collins } 302ebb7bc5aSJames Collins } else { 3037935713eSJames Collins if (strcasecmp($optionValue, $choiceValue) == 0) { 3047935713eSJames Collins $optionsCleaned[$syntaxKey] = $choiceValue; 3057935713eSJames Collins break; 3067935713eSJames Collins } 3077935713eSJames Collins } 3087935713eSJames Collins } 3097935713eSJames Collins } 3107935713eSJames Collins break; 3117935713eSJames Collins case 'set': 3127935713eSJames Collins if (array_key_exists('option', $options[$syntaxKey]) && array_key_exists('data', $options[$syntaxKey])) { 3137935713eSJames Collins $optionsCleaned[$options[$syntaxKey]['option']] = $options[$syntaxKey]['data']; 3147935713eSJames Collins } 3157935713eSJames Collins break; 3167935713eSJames Collins } 317ebb7bc5aSJames Collins } 31817e6d639SJames Collins 3197935713eSJames Collins break; 3207935713eSJames Collins } 3217935713eSJames Collins } 3229a439316SJames Collins } 3239a439316SJames Collins 3248606964bSJames Collins $customStyles = []; 325ec319cf1SJames Collins 3269a439316SJames Collins foreach ($data as $optionKey => $optionValue) { 327ec319cf1SJames Collins if (!array_key_exists($optionKey, $optionsCleaned)) { 3288606964bSJames Collins if($optionValue === true && $this->customStyleExists($optionKey)) { 329f51f4f12SJames Collins $customStyles[] = $optionKey; 3308606964bSJames Collins } 3318606964bSJames Collins 332ec319cf1SJames Collins foreach ($options as $syntaxKey => $syntaxValue) { 333ec319cf1SJames Collins if (array_key_exists('type', $options[$syntaxKey])) { 33454ee1cccSJames Collins if (array_key_exists('data', $options[$syntaxKey]) && is_array($options[$syntaxKey]['data'])) { 335ec319cf1SJames Collins foreach ($options[$syntaxKey]['data'] as $choiceKey => $choiceValue) { 336ec319cf1SJames Collins if (is_array($choiceValue)) { 337ec319cf1SJames Collins if (in_array($optionKey, $choiceValue)) { 338ec319cf1SJames Collins $optionsCleaned[$syntaxKey] = $choiceKey; 339ec319cf1SJames Collins } 340ec319cf1SJames Collins } else { 341ec319cf1SJames Collins if (strcasecmp($choiceValue, $optionKey) == 0) { 342ec319cf1SJames Collins $optionsCleaned[$syntaxKey] = $choiceValue; 343ec319cf1SJames Collins } 344ec319cf1SJames Collins } 345ec319cf1SJames Collins } 346ec319cf1SJames Collins } 347ec319cf1SJames Collins } 3487935713eSJames Collins } 3497935713eSJames Collins } 3507935713eSJames Collins } 35117e6d639SJames Collins 3528606964bSJames Collins if(array_key_exists('type', $options) === true 3538606964bSJames Collins && array_key_exists('type', $optionsCleaned) === false 35461729b71SJames Collins && count($customStyles) > 0 35561729b71SJames Collins ) { 3568606964bSJames Collins $optionsCleaned['type'] = $customStyles[0]; 3578606964bSJames Collins } 3588606964bSJames Collins 3597935713eSJames Collins // Add in syntax options that are missing 3607935713eSJames Collins foreach ($options as $optionKey => $optionValue) { 3617935713eSJames Collins if (!array_key_exists($optionKey, $optionsCleaned)) { 3627935713eSJames Collins if (array_key_exists('default', $options[$optionKey])) { 3637935713eSJames Collins switch ($options[$optionKey]['type']) { 3647935713eSJames Collins case 'boolean': 3657935713eSJames Collins $optionsCleaned[$optionKey] = filter_var($options[$optionKey]['default'], FILTER_VALIDATE_BOOLEAN); 3667935713eSJames Collins break; 3677935713eSJames Collins case 'number': 3687935713eSJames Collins $optionsCleaned[$optionKey] = filter_var($options[$optionKey]['default'], FILTER_VALIDATE_INT); 3697935713eSJames Collins break; 3707935713eSJames Collins default: 3717935713eSJames Collins $optionsCleaned[$optionKey] = $options[$optionKey]['default']; 3727935713eSJames Collins break; 3737935713eSJames Collins } 3747935713eSJames Collins } 3757935713eSJames Collins } 37617e6d639SJames Collins } 37717e6d639SJames Collins 3787935713eSJames Collins return $optionsCleaned; 37917e6d639SJames Collins } 38017e6d639SJames Collins 3817935713eSJames Collins /* Lexer renderers */ 3820e73f855Snomadjimbob protected function render_lexer_enter(Doku_Renderer $renderer, $data) 3830e73f855Snomadjimbob { 3840e73f855Snomadjimbob } 3850e73f855Snomadjimbob protected function render_lexer_unmatched(Doku_Renderer $renderer, $data) 3860e73f855Snomadjimbob { 387*2625d0caSJames Collins if($this->isContainer) { 388*2625d0caSJames Collins return false; 389*2625d0caSJames Collins } 390*2625d0caSJames Collins 3910e73f855Snomadjimbob $renderer->doc .= $renderer->_xmlEntities($data); 3920e73f855Snomadjimbob } 3930e73f855Snomadjimbob protected function render_lexer_exit(Doku_Renderer $renderer, $data) 3940e73f855Snomadjimbob { 3950e73f855Snomadjimbob } 3960e73f855Snomadjimbob protected function render_lexer_special(Doku_Renderer $renderer, $data) 3970e73f855Snomadjimbob { 3980e73f855Snomadjimbob } 3990e73f855Snomadjimbob protected function render_lexer_match(Doku_Renderer $renderer, $data) 4000e73f855Snomadjimbob { 4010e73f855Snomadjimbob } 40217e6d639SJames Collins 4037935713eSJames Collins /* Renderer */ 4047935713eSJames Collins public function render($mode, Doku_Renderer $renderer, $data) 4057935713eSJames Collins { 4062d897619SJames Collins if ($mode == 'xhtml' && $this->isDisabled() != true) { 40717e6d639SJames Collins list($state, $match) = $data; 40817e6d639SJames Collins 40917e6d639SJames Collins switch ($state) { 41017e6d639SJames Collins case DOKU_LEXER_ENTER: 41117e6d639SJames Collins $this->render_lexer_enter($renderer, $match); 41217e6d639SJames Collins return true; 41317e6d639SJames Collins 41417e6d639SJames Collins case DOKU_LEXER_UNMATCHED: 41517e6d639SJames Collins $this->render_lexer_unmatched($renderer, $match); 41617e6d639SJames Collins return true; 41717e6d639SJames Collins 4183deaf3a5SJames Collins case DOKU_LEXER_MATCHED: 4193deaf3a5SJames Collins $this->render_lexer_match($renderer, $match); 4203deaf3a5SJames Collins return true; 4213deaf3a5SJames Collins 42217e6d639SJames Collins case DOKU_LEXER_EXIT: 42317e6d639SJames Collins $this->render_lexer_exit($renderer, $match); 42417e6d639SJames Collins return true; 42517e6d639SJames Collins 42617e6d639SJames Collins case DOKU_LEXER_SPECIAL: 42717e6d639SJames Collins $this->render_lexer_special($renderer, $match); 42817e6d639SJames Collins return true; 42917e6d639SJames Collins } 43017e6d639SJames Collins 43117e6d639SJames Collins return true; 43217e6d639SJames Collins } 43317e6d639SJames Collins 43417e6d639SJames Collins return false; 43517e6d639SJames Collins } 43617e6d639SJames Collins 4377935713eSJames Collins /* 4387935713eSJames Collins * return a class list with mikiop- prefix 4397935713eSJames Collins * 4407935713eSJames Collins * @param $options options of syntax element. Options with key 'class'=true are automatically added 4417935713eSJames Collins * @param $classes classes to build from options as array 4427935713eSJames Collins * @param $inclAttr include class="" in the return string 4439d56a2c2SJames Collins * @param $optionsTemplate allow a different options template instead of $this->options (for findTags) 4447935713eSJames Collins * @return a string of classes from options/classes variable 4457935713eSJames Collins */ 4469d56a2c2SJames Collins public function buildClass($options = null, $classes = null, $inclAttr = false, $optionsTemplate = null) 4477935713eSJames Collins { 44817e6d639SJames Collins $s = array(); 44917e6d639SJames Collins 4507935713eSJames Collins if (is_array($options)) { 451b007ca42SJames Collins if ($classes == null) { $classes = array(); 452b007ca42SJames Collins } 453b007ca42SJames Collins if ($optionsTemplate == null) { $optionsTemplate = $this->options; 454b007ca42SJames Collins } 45517e6d639SJames Collins 4569d56a2c2SJames Collins foreach ($optionsTemplate as $key => $value) { 457b007ca42SJames Collins if (array_key_exists('class', $value) && $value['class'] == true) { 458f51f4f12SJames Collins $classes[] = $key; 45917e6d639SJames Collins } 46017e6d639SJames Collins } 46117e6d639SJames Collins 4627935713eSJames Collins foreach ($classes as $class) { 463b007ca42SJames Collins if (array_key_exists($class, $options) && $options[$class] !== false && $options[$class] != '') { 4647935713eSJames Collins $prefix = $this->classPrefix; 4657935713eSJames Collins 4669d56a2c2SJames Collins if (array_key_exists($class, $optionsTemplate) && array_key_exists('prefix', $optionsTemplate[$class])) { 4679d56a2c2SJames Collins $prefix .= $optionsTemplate[$class]['prefix']; 46817e6d639SJames Collins } 4697935713eSJames Collins 470b007ca42SJames Collins if (array_key_exists($class, $optionsTemplate) && array_key_exists('classNoSuffix', $optionsTemplate[$class]) && $optionsTemplate[$class]['classNoSuffix'] == true) { 4712f5b9ce6SJames Collins $s[] = $prefix . $class; 4722f5b9ce6SJames Collins } else { 473b007ca42SJames Collins $s[] = $prefix . $class . ($options[$class] !== true ? '-' . $options[$class] : ''); 47417e6d639SJames Collins } 47517e6d639SJames Collins } 4762f5b9ce6SJames Collins } 477a007b54fSJames Collins } 47817e6d639SJames Collins 4797935713eSJames Collins $s = implode(' ', $s); 480b007ca42SJames Collins if ($s != '') { $s = ' ' . $s; 481b007ca42SJames Collins } 4828f786230SJames Collins 483b007ca42SJames Collins if ($inclAttr) { $s = ' classes="' . $s . '"'; 484b007ca42SJames Collins } 4856cfe6dadSJames Collins 486ad1dae96SJames Collins return $s; 487ad1dae96SJames Collins } 48817e6d639SJames Collins 4897935713eSJames Collins 4907935713eSJames Collins 4917935713eSJames Collins 4927935713eSJames Collins /* 4937935713eSJames Collins * build style string 4947935713eSJames Collins * 4957935713eSJames Collins * @param $list style list as key => value. Empty values are not included 4967935713eSJames Collins * @param $inclAttr include style="" in the return string 4977935713eSJames Collins * @return style list string 4987935713eSJames Collins */ 4997935713eSJames Collins public function buildStyle($list, $inclAttr = false) 5007935713eSJames Collins { 5017935713eSJames Collins $s = ''; 5027935713eSJames Collins 5037935713eSJames Collins if (is_array($list) && count($list) > 0) { 5045ee48ca8SJames Collins // expand text-decoration 5055ee48ca8SJames Collins if(array_key_exists('text-decoration', $list)) { 5065ee48ca8SJames Collins // Define the possible values for each property 5075ee48ca8SJames Collins $decorations = array('underline', 'overline', 'line-through'); 5085ee48ca8SJames Collins $styles = array('solid', 'double', 'dotted', 'dashed', 'wavy'); 5095ee48ca8SJames Collins // Split the shorthand string into parts 5105ee48ca8SJames Collins $parts = explode(' ', $list['text-decoration']); 5115ee48ca8SJames Collins 5125ee48ca8SJames Collins // Initialize the variables to hold the property values 5135ee48ca8SJames Collins $decoration = ''; 5145ee48ca8SJames Collins $style = ''; 5155ee48ca8SJames Collins $color = ''; 5165ee48ca8SJames Collins $thickness = ''; 5175ee48ca8SJames Collins 5185ee48ca8SJames Collins // Process each part of the shorthand string 5195ee48ca8SJames Collins foreach ($parts as $part) { 5205ee48ca8SJames Collins if (in_array($part, $decorations)) { 5215ee48ca8SJames Collins $decoration = $part; 5225ee48ca8SJames Collins } elseif (in_array($part, $styles)) { 5235ee48ca8SJames Collins $style = $part; 5245ee48ca8SJames Collins } elseif (preg_match('/^\d+(px|em|rem|%)$/', $part)) { 5255ee48ca8SJames Collins $thickness = $part; 5265ee48ca8SJames Collins } elseif (preg_match('/^#[0-9a-fA-F]{6}$|^[a-zA-Z]+$/', $part)) { 5275ee48ca8SJames Collins $color = $part; 5285ee48ca8SJames Collins } 5295ee48ca8SJames Collins } 5305ee48ca8SJames Collins 5315ee48ca8SJames Collins // Build the completed style string 5325ee48ca8SJames Collins unset($list['text-decoration']); 53361729b71SJames Collins if ($decoration) { $list['text-decoration'] = trim($decoration); 53461729b71SJames Collins } 53561729b71SJames Collins if ($style) { $list['text-decoration-style'] = trim($style); 53661729b71SJames Collins } 53761729b71SJames Collins if ($color) { $list['text-decoration-color'] = trim($color); 53861729b71SJames Collins } 53961729b71SJames Collins if ($thickness) { $list['text-decoration-thickness'] = trim($thickness); 54061729b71SJames Collins } 5415ee48ca8SJames Collins } 5425ee48ca8SJames Collins 5437935713eSJames Collins foreach ($list as $key => $value) { 5447935713eSJames Collins if ($value != '') { 5457935713eSJames Collins $s .= $key . ':' . $value . ';'; 5467935713eSJames Collins } 5477935713eSJames Collins } 5487935713eSJames Collins } 5497935713eSJames Collins 5507935713eSJames Collins if ($s != '' && $inclAttr) { 5517935713eSJames Collins $s = ' style="' . $s . '"'; 5527935713eSJames Collins } 5537935713eSJames Collins 5547935713eSJames Collins return $s; 5557935713eSJames Collins } 5567935713eSJames Collins 5577935713eSJames Collins 5587935713eSJames Collins public function buildTooltipString($options) 5597935713eSJames Collins { 560a401c3b7SJames Collins $dataPlacement = 'top'; 561a401c3b7SJames Collins $dataHtml = false; 562a401c3b7SJames Collins $title = ''; 563a401c3b7SJames Collins 564a401c3b7SJames Collins if ($options != null) { 565a401c3b7SJames Collins if (array_key_exists('tooltip-html-top', $options) && $options['tooltip-html-top'] != '') { 566a401c3b7SJames Collins $title = $options['tooltip-html-top']; 567a401c3b7SJames Collins $dataPlacement = 'top'; 568a401c3b7SJames Collins } 569a401c3b7SJames Collins 570a401c3b7SJames Collins if (array_key_exists('tooltip-html-left', $options) && $options['tooltip-html-left'] != '') { 571a401c3b7SJames Collins $title = $options['tooltip-html-left']; 572a401c3b7SJames Collins $dataPlacement = 'left'; 573a401c3b7SJames Collins } 574a401c3b7SJames Collins 575a401c3b7SJames Collins if (array_key_exists('tooltip-html-bottom', $options) && $options['tooltip-html-bottom'] != '') { 576a401c3b7SJames Collins $title = $options['tooltip-html-bottom']; 577a401c3b7SJames Collins $dataPlacement = 'bottom'; 578a401c3b7SJames Collins } 579a401c3b7SJames Collins 580a401c3b7SJames Collins if (array_key_exists('tooltip-html-right', $options) && $options['tooltip-html-right'] != '') { 581a401c3b7SJames Collins $title = $options['tooltip-html-right']; 582a401c3b7SJames Collins $dataPlacement = 'right'; 583a401c3b7SJames Collins } 584a401c3b7SJames Collins 585a401c3b7SJames Collins if (array_key_exists('tooltip-top', $options) && $options['tooltip-top'] != '') { 586a401c3b7SJames Collins $title = $options['tooltip-top']; 587a401c3b7SJames Collins $dataPlacement = 'top'; 588a401c3b7SJames Collins } 589a401c3b7SJames Collins 590a401c3b7SJames Collins if (array_key_exists('tooltip-left', $options) && $options['tooltip-left'] != '') { 591a401c3b7SJames Collins $title = $options['tooltip-left']; 592a401c3b7SJames Collins $dataPlacement = 'left'; 593a401c3b7SJames Collins } 594a401c3b7SJames Collins 595a401c3b7SJames Collins if (array_key_exists('tooltip-bottom', $options) && $options['tooltip-bottom'] != '') { 596a401c3b7SJames Collins $title = $options['tooltip-bottom']; 597a401c3b7SJames Collins $dataPlacement = 'bottom'; 598a401c3b7SJames Collins } 599a401c3b7SJames Collins 600a401c3b7SJames Collins if (array_key_exists('tooltip-right', $options) && $options['tooltip-right'] != '') { 601a401c3b7SJames Collins $title = $options['tooltip-right']; 602a401c3b7SJames Collins $dataPlacement = 'right'; 603a401c3b7SJames Collins } 604a401c3b7SJames Collins 605a401c3b7SJames Collins if (array_key_exists('tooltip-html', $options) && $options['tooltip-html'] != '') { 606a401c3b7SJames Collins $title = $options['tooltip-html']; 607a401c3b7SJames Collins $dataPlacement = 'top'; 608a401c3b7SJames Collins } 609a401c3b7SJames Collins 610a401c3b7SJames Collins if (array_key_exists('tooltip', $options) && $options['tooltip'] != '') { 611a401c3b7SJames Collins $title = $options['tooltip']; 612a401c3b7SJames Collins $dataPlacement = 'top'; 613a401c3b7SJames Collins } 614a401c3b7SJames Collins } 615a401c3b7SJames Collins 616a401c3b7SJames Collins if ($title != '') { 617a401c3b7SJames Collins return ' data-toggle="tooltip" data-placement="' . $dataPlacement . '" ' . ($dataHtml == true ? 'data-html="true" ' : '') . 'title="' . $title . '" '; 618a401c3b7SJames Collins } 619a401c3b7SJames Collins 620a401c3b7SJames Collins return ''; 621a401c3b7SJames Collins } 622a401c3b7SJames Collins 6237935713eSJames Collins /* 6247935713eSJames Collins * convert the URL to a DokuWiki media link (if required) 6257935713eSJames Collins * 6267935713eSJames Collins * @param $url url to parse 6277935713eSJames Collins * @return url string 6287935713eSJames Collins */ 6297935713eSJames Collins public function buildMediaLink($url) 6307935713eSJames Collins { 6317935713eSJames Collins $i = strpos($url, '?'); 632b007ca42SJames Collins if ($i !== false) { $url = substr($url, 0, $i); 633b007ca42SJames Collins } 63417e6d639SJames Collins 63566f3b00dSJames Collins $url = preg_replace('/[^\da-zA-Z:_.-]+/', '', $url); 63617e6d639SJames Collins 637b007ca42SJames Collins return (tpl_getMediaFile(array($url), false)); 63817e6d639SJames Collins } 63917e6d639SJames Collins 64017e6d639SJames Collins 6417935713eSJames Collins /* 6427935713eSJames Collins * returns either a url or dokuwiki link 6437935713eSJames Collins * 6447935713eSJames Collins * @param $url link to build from 6457935713eSJames Collins * @return built link 6467935713eSJames Collins */ 6477935713eSJames Collins public function buildLink($url) 6487935713eSJames Collins { 6497935713eSJames Collins $i = strpos($url, '://'); 650b007ca42SJames Collins if ($i !== false || substr($url, 0, 1) == '#') { return $url; 651b007ca42SJames Collins } 652f1a539d8SJames Collins 6537935713eSJames Collins return wl($url); 654f1a539d8SJames Collins } 655f1a539d8SJames Collins 6567935713eSJames Collins /* 6577935713eSJames Collins * Call syntax renderer of mikio syntax plugin 6587935713eSJames Collins * 6597935713eSJames Collins * @param $renderer DokuWiki renderer object 6607935713eSJames Collins * @param $className mikio syntax class to call 6617935713eSJames Collins * @param $text unmatched text to pass outside of lexer. Only used when $lexer=MIKIO_LEXER_AUTO 6627935713eSJames Collins * @param $data tag options to pass to syntax class. Runs through cleanOptions to validate first 6637935713eSJames Collins * @param $lexer which lexer to call 6647935713eSJames Collins */ 6657935713eSJames Collins public function syntaxRender(Doku_Renderer $renderer, $className, $text, $data = null, $lexer = MIKIO_LEXER_AUTO) 6667935713eSJames Collins { 66703f82c7cSnomadjimbob $className = 'syntax_plugin_mikioplugin_' . str_replace('-', '', $className); 6687935713eSJames Collins 6697935713eSJames Collins if (class_exists($className)) { 67017e6d639SJames Collins $class = new $className; 67117e6d639SJames Collins 672b007ca42SJames Collins if (!is_array($data)) { $data = array(); 673b007ca42SJames Collins } 67431359b6fSJames Collins 67518e323fdSJames Collins 6767935713eSJames Collins if (count($class->options) > 0) { 67718e323fdSJames Collins $data = $class->cleanOptions($data, $class->options); 6787935713eSJames Collins } 67931359b6fSJames Collins 6807935713eSJames Collins switch ($lexer) { 6817935713eSJames Collins case MIKIO_LEXER_AUTO: 6827935713eSJames Collins if ($class->hasEndTag) { 683b007ca42SJames Collins if (method_exists($class, 'render_lexer_enter')) { $class->render_lexer_enter($renderer, $data); 684b007ca42SJames Collins } 68517e6d639SJames Collins $renderer->doc .= $text; 686b007ca42SJames Collins if (method_exists($class, 'render_lexer_exit')) { $class->render_lexer_exit($renderer, $data); 687b007ca42SJames Collins } 6887935713eSJames Collins } else { 689b007ca42SJames Collins if (method_exists($class, 'render_lexer_special')) { $class->render_lexer_special($renderer, $data); 690b007ca42SJames Collins } 6917935713eSJames Collins } 6927935713eSJames Collins 6937935713eSJames Collins break; 6947935713eSJames Collins case MIKIO_LEXER_ENTER: 695b007ca42SJames Collins if (method_exists($class, 'render_lexer_enter')) { $class->render_lexer_enter($renderer, $data); 696b007ca42SJames Collins } 6977935713eSJames Collins break; 6987935713eSJames Collins case MIKIO_LEXER_EXIT: 699b007ca42SJames Collins if (method_exists($class, 'render_lexer_exit')) { $class->render_lexer_exit($renderer, $data); 700b007ca42SJames Collins } 7017935713eSJames Collins break; 7027935713eSJames Collins case MIKIO_LEXER_SPECIAL: 703b007ca42SJames Collins if (method_exists($class, 'render_lexer_special')) { $class->render_lexer_special($renderer, $data); 704b007ca42SJames Collins } 7057935713eSJames Collins break; 7067935713eSJames Collins } 70717e6d639SJames Collins } 70817e6d639SJames Collins } 709ebb7bc5aSJames Collins 7102f5b9ce6SJames Collins 7110e73f855Snomadjimbob protected function callMikioTag($className, $data) 7120e73f855Snomadjimbob { 71318e323fdSJames Collins // $className = 'syntax_plugin_mikioplugin_'.$className; 7142f5b9ce6SJames Collins 7152f5b9ce6SJames Collins 71618e323fdSJames Collins // if(class_exists($className)) { 71718e323fdSJames Collins //$class = new $className; 71818e323fdSJames Collins if (!plugin_isdisabled('mikioplugin')) { 71918e323fdSJames Collins $class = plugin_load('syntax', 'mikioplugin_' . $className); 72018e323fdSJames Collins // echo '^^'.$className.'^^'; 72118e323fdSJames Collins 72218e323fdSJames Collins 723b007ca42SJames Collins if (method_exists($class, 'mikioCall')) { return $class->mikioCall($data); 724b007ca42SJames Collins } 7252f5b9ce6SJames Collins } 7262f5b9ce6SJames Collins 72718e323fdSJames Collins // } 72818e323fdSJames Collins 7292f5b9ce6SJames Collins return ''; 7302f5b9ce6SJames Collins } 7312f5b9ce6SJames Collins 7322f5b9ce6SJames Collins 7330e73f855Snomadjimbob protected function callMikioOptionDefault($className, $option) 7340e73f855Snomadjimbob { 735f003e4a8SJames Collins $className = 'syntax_plugin_mikioplugin_' . $className; 736f003e4a8SJames Collins 737f003e4a8SJames Collins if (class_exists($className)) { 738f003e4a8SJames Collins $class = new $className; 739f003e4a8SJames Collins 740f003e4a8SJames Collins if (array_key_exists($option, $class->options) && array_key_exists('default', $class->options[$option])) { 741f003e4a8SJames Collins return $class->options[$option]['default']; 742f003e4a8SJames Collins } 743f003e4a8SJames Collins } 744f003e4a8SJames Collins 745f003e4a8SJames Collins return ''; 746f003e4a8SJames Collins } 747f003e4a8SJames Collins 748f003e4a8SJames Collins 7490e73f855Snomadjimbob protected function buildTooltip($text) 7500e73f855Snomadjimbob { 7512f5b9ce6SJames Collins if ($text != '') { 7522f5b9ce6SJames Collins return ' data-tooltip="' . $text . '"'; 7532f5b9ce6SJames Collins } 7542f5b9ce6SJames Collins 7552f5b9ce6SJames Collins return ''; 7562f5b9ce6SJames Collins } 7572f5b9ce6SJames Collins 7587935713eSJames Collins /* 7597935713eSJames Collins * Create array with passed elements and include them if their values are not empty 7607935713eSJames Collins * 7617935713eSJames Collins * @param ... array items 7627935713eSJames Collins */ 7630e73f855Snomadjimbob protected function arrayRemoveEmpties($items) 7640e73f855Snomadjimbob { 7657935713eSJames Collins $result = array(); 7667935713eSJames Collins 7677935713eSJames Collins foreach ($items as $key => $value) { 7687935713eSJames Collins if ($value != '') { 7697935713eSJames Collins $result[$key] = $value; 7707935713eSJames Collins } 7717935713eSJames Collins } 7727935713eSJames Collins 7737935713eSJames Collins return $result; 7747935713eSJames Collins } 7757935713eSJames Collins 7767935713eSJames Collins public function getFirstArrayKey($data) 7777935713eSJames Collins { 778ebb7bc5aSJames Collins if (!function_exists('array_key_first')) { 779ebb7bc5aSJames Collins foreach ($data as $key => $unused) { 780ebb7bc5aSJames Collins return $key; 781ebb7bc5aSJames Collins } 782ebb7bc5aSJames Collins } 783ebb7bc5aSJames Collins 784ebb7bc5aSJames Collins return array_key_first($data); 785ebb7bc5aSJames Collins } 7867935713eSJames Collins 7877935713eSJames Collins 7887935713eSJames Collins /* 7897935713eSJames Collins * add common options to options 7907935713eSJames Collins * 7917935713eSJames Collins * @param $typelist common option to add 7927935713eSJames Collins * @param $options save in options 7937935713eSJames Collins */ 7940e73f855Snomadjimbob public function addCommonOptions($typelist) 7950e73f855Snomadjimbob { 7967935713eSJames Collins $types = explode(' ', $typelist); 7977935713eSJames Collins foreach ($types as $type) { 7987935713eSJames Collins if (strcasecmp($type, 'shadow') == 0) { 7990e73f855Snomadjimbob $this->options['shadow'] = array( 8000e73f855Snomadjimbob 'type' => 'choice', 8017935713eSJames Collins 'data' => array('large' => array('shadow-large', 'shadow-lg'), 'small' => array('shadow-small', 'shadow-sm'), true), 8027935713eSJames Collins 'default' => '', 8030e73f855Snomadjimbob 'class' => true 8040e73f855Snomadjimbob ); 8057935713eSJames Collins } 8067935713eSJames Collins 8077935713eSJames Collins if (strcasecmp($type, 'width') == 0) { 8080e73f855Snomadjimbob $this->options['width'] = array( 8090e73f855Snomadjimbob 'type' => 'size', 8100e73f855Snomadjimbob 'default' => '' 8110e73f855Snomadjimbob ); 8127935713eSJames Collins } 8137935713eSJames Collins 8147935713eSJames Collins if (strcasecmp($type, 'height') == 0) { 8150e73f855Snomadjimbob $this->options['height'] = array( 8160e73f855Snomadjimbob 'type' => 'size', 8170e73f855Snomadjimbob 'default' => '' 8180e73f855Snomadjimbob ); 8197935713eSJames Collins } 8207935713eSJames Collins 82118e323fdSJames Collins if (strcasecmp($type, 'text-color') == 0) { 8220e73f855Snomadjimbob $this->options['text-color'] = array( 8230e73f855Snomadjimbob 'type' => 'color', 8240e73f855Snomadjimbob 'default' => '' 8250e73f855Snomadjimbob ); 82618e323fdSJames Collins } 82718e323fdSJames Collins 8287935713eSJames Collins if (strcasecmp($type, 'type') == 0) { 8290e73f855Snomadjimbob $this->options['type'] = array( 8300e73f855Snomadjimbob 'type' => 'text', 831e84ad5e7SJames Collins 'data' => array('primary', 'secondary', 'success', 'danger', 'warning', 'info', 'light', 'dark', 'outline-primary', 'outline-secondary', 'outline-success', 'outline-danger', 'outline-warning', 'outline-info', 'outline-light', 'outline-dark'), 8327935713eSJames Collins 'default' => '', 8330e73f855Snomadjimbob 'class' => true 8340e73f855Snomadjimbob ); 8357935713eSJames Collins } 8367935713eSJames Collins 8377935713eSJames Collins if (strcasecmp($type, 'text-align') == 0) { 8380e73f855Snomadjimbob $this->options['text-align'] = array( 8390e73f855Snomadjimbob 'type' => 'choice', 8407935713eSJames Collins 'data' => array('left' => array('text-left'), 'center' => array('text-center'), 'right' => array('text-right')), 8417935713eSJames Collins 'default' => '', 8420e73f855Snomadjimbob 'class' => true 8430e73f855Snomadjimbob ); 8447935713eSJames Collins } 8457935713eSJames Collins 8467935713eSJames Collins if (strcasecmp($type, 'align') == 0) { 8470e73f855Snomadjimbob $this->options['align'] = array( 8480e73f855Snomadjimbob 'type' => 'choice', 8497935713eSJames Collins 'data' => array('left' => array('align-left'), 'center' => array('align-center'), 'right' => array('align-right')), 8507935713eSJames Collins 'default' => '', 8510e73f855Snomadjimbob 'class' => true 8520e73f855Snomadjimbob ); 8537935713eSJames Collins } 8542f5b9ce6SJames Collins 8552f5b9ce6SJames Collins if (strcasecmp($type, 'tooltip') == 0) { 8560e73f855Snomadjimbob $this->options['tooltip'] = array( 8570e73f855Snomadjimbob 'type' => 'text', 8582f5b9ce6SJames Collins 'default' => '', 8592f5b9ce6SJames Collins 'class' => true, 8600e73f855Snomadjimbob 'classNoSuffix' => true 8610e73f855Snomadjimbob ); 8622f5b9ce6SJames Collins } 86318e323fdSJames Collins 86418e323fdSJames Collins if (strcasecmp($type, 'vertical-align') == 0) { 8650e73f855Snomadjimbob $this->options['vertical-align'] = array( 8660e73f855Snomadjimbob 'type' => 'choice', 867f53eef0bSJames Collins 'data' => array('top' => array('align-top'), 'middle' => array('align-middle'), 'bottom' => array('align-bottom'), 'justify' => array('align-justify')), 86818e323fdSJames Collins 'default' => '', 8690e73f855Snomadjimbob 'class' => true 8700e73f855Snomadjimbob ); 87118e323fdSJames Collins } 87218e323fdSJames Collins 87318e323fdSJames Collins if (strcasecmp($type, 'links-match') == 0) { 8740e73f855Snomadjimbob $this->options['links-match'] = array( 8750e73f855Snomadjimbob 'type' => 'boolean', 87618e323fdSJames Collins 'default' => 'false', 8770e73f855Snomadjimbob 'class' => true 8780e73f855Snomadjimbob ); 87918e323fdSJames Collins } 8807935713eSJames Collins } 8817935713eSJames Collins } 8827935713eSJames Collins 8837935713eSJames Collins 8847935713eSJames Collins /* 8857935713eSJames Collins * Find HTML tags in string. Parse tags options. Used in parsing subtags 8867935713eSJames Collins * 8877935713eSJames Collins * @param $tagName tagName to search for. Name is exclusive 8887935713eSJames Collins * @param $content search within content 8897935713eSJames Collins * @param $options parse options similar to syntax element options 890f0df6cccSJames Collins * @param $hasEndTag tagName search also looks for an end tag 8917935713eSJames Collins * @return array of tags containing 'options' => array of 'name' => 'value', 'content' => content inside the tag 8927935713eSJames Collins */ 8930e73f855Snomadjimbob protected function findTags($tagName, $content, $options, $hasEndTag = true) 8940e73f855Snomadjimbob { 8958127a956SJames Collins $items = []; 8968127a956SJames Collins $tn = preg_quote($tagName, '/'); 8977935713eSJames Collins 8988127a956SJames Collins $search = $hasEndTag 8998127a956SJames Collins ? '/<(?i:' . $tn . ')(?P<attrs>.*?)>(?P<body>.*?)<\/(?i:' . $tn . ')>/s' 9008127a956SJames Collins : '/<(?i:' . $tn . ')(?P<attrs>.*?)>/s'; 901f0df6cccSJames Collins 9028127a956SJames Collins if (preg_match_all($search, $content, $m)) { 9038127a956SJames Collins $n = count($m['attrs']); 9048127a956SJames Collins for ($i = 0; $i < $n; $i++) { 9058127a956SJames Collins $rawAttrs = trim($m['attrs'][$i] ?? ''); 9068127a956SJames Collins $body = $hasEndTag ? ($m['body'][$i] ?? '') : ''; 9078127a956SJames Collins $item = ['options' => [], 'content' => $this->render_text($body)]; 9087935713eSJames Collins 9098127a956SJames Collins $optionlist = $rawAttrs === '' ? [] : 9108127a956SJames Collins preg_split('/\s(?=([^"]*"[^"]*")*[^"]*$)/', $rawAttrs); 9117935713eSJames Collins 9127935713eSJames Collins foreach ($optionlist as $option) { 9138127a956SJames Collins if ($option === '') continue; 9147935713eSJames Collins $j = strpos($option, '='); 9157935713eSJames Collins if ($j !== false) { 9168127a956SJames Collins $value = trim($option, " \t\n\r\0\x0B"); 9178127a956SJames Collins $value = substr($value, $j + 1); 9188127a956SJames Collins $value = trim($value, '"'); 9197935713eSJames Collins $item['options'][substr($option, 0, $j)] = $value; 9207935713eSJames Collins } else { 9217935713eSJames Collins $item['options'][$option] = true; 9227935713eSJames Collins } 9237935713eSJames Collins } 9247935713eSJames Collins 9253cbf07a0SJames Collins $item['options'] = $this->cleanOptions($item['options'], $options); 9267935713eSJames Collins $items[] = $item; 9277935713eSJames Collins } 9287935713eSJames Collins } 9297935713eSJames Collins 9307935713eSJames Collins return $items; 9317935713eSJames Collins } 9328606964bSJames Collins 9338606964bSJames Collins /* 9348606964bSJames Collins * Check if a custom style exists in styles.less 9358606964bSJames Collins * 9368606964bSJames Collins * @param $name The style name to search foe 9378606964bSJames Collins * @return true if the style name exists 9388606964bSJames Collins */ 9398606964bSJames Collins protected function customStyleExists($name) 9408606964bSJames Collins { 9418606964bSJames Collins $stylePath = __DIR__.'/../styles/styles.less'; 9428606964bSJames Collins 9438606964bSJames Collins if(file_exists($stylePath)) { 9448606964bSJames Collins $styleData = file_get_contents($stylePath); 9458606964bSJames Collins $searchString = '._mikiop-custom-type('.$name.');'; 9468606964bSJames Collins 9478606964bSJames Collins return (strpos($styleData, $searchString) !== false); 9488606964bSJames Collins } 9498606964bSJames Collins 9508606964bSJames Collins return false; 9518606964bSJames Collins } 952becd90d5SJames Collins 953becd90d5SJames Collins /* 954becd90d5SJames Collins * Convert a string to include HTML code based on markdown 955becd90d5SJames Collins * 956becd90d5SJames Collins * @param $text The text to style 957becd90d5SJames Collins * @return The styled text 958becd90d5SJames Collins */ 959becd90d5SJames Collins public function applyMarkdownEffects($text) 960becd90d5SJames Collins { 961becd90d5SJames Collins // Emphasis * Strong 962becd90d5SJames Collins $regex = '/(?<!\*)\*\*\*([^*]+)\*\*\*(?!\*)/'; 963becd90d5SJames Collins $replacement = '<em><strong>$1</strong></em>'; 964becd90d5SJames Collins $text = preg_replace($regex, $replacement, $text); 965becd90d5SJames Collins 966becd90d5SJames Collins // Strong 967becd90d5SJames Collins $regex = '/(?<!\*)\*\*([^*]+)\*\*(?!\*)/'; 968becd90d5SJames Collins $replacement = '<strong>$1</strong>'; 969becd90d5SJames Collins $text = preg_replace($regex, $replacement, $text); 970becd90d5SJames Collins 971becd90d5SJames Collins // Emphasis 972becd90d5SJames Collins $regex = '/(?<!\*)\*([^*]+)\*(?!\*)/'; 973becd90d5SJames Collins $replacement = '<em>$1</em>'; 974becd90d5SJames Collins $text = preg_replace($regex, $replacement, $text); 975becd90d5SJames Collins 976becd90d5SJames Collins return $text; 977becd90d5SJames Collins } 97831359b6fSJames Collins} 979