xref: /plugin/mikioplugin/syntax/core.php (revision 2625d0cacd0f159fa4fb7c9d691615015291f7fd)
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