14cadd4f8SNickeau<?php 24cadd4f8SNickeau 3*04fd306cSNickeauuse ComboStrap\BrandingColors; 44cadd4f8SNickeauuse ComboStrap\ColorRgb; 5*04fd306cSNickeauuse ComboStrap\ColorSystem; 6*04fd306cSNickeauuse ComboStrap\ExceptionCompile; 7*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 8*04fd306cSNickeauuse ComboStrap\ExecutionContext; 94cadd4f8SNickeauuse ComboStrap\LogUtility; 104cadd4f8SNickeauuse ComboStrap\PluginUtility; 114cadd4f8SNickeauuse ComboStrap\Site; 12*04fd306cSNickeauuse ComboStrap\SiteConfig; 134cadd4f8SNickeauuse ComboStrap\TagAttributes; 144cadd4f8SNickeau 154cadd4f8SNickeau 164cadd4f8SNickeau/** 174cadd4f8SNickeau * 184cadd4f8SNickeau * Taking over {@link \dokuwiki\Parsing\ParserMode\Formatting monospace} 194cadd4f8SNickeau * 204cadd4f8SNickeau * Known as code 214cadd4f8SNickeau * https://spec.commonmark.org/0.30/#code-spans 224cadd4f8SNickeau * 234cadd4f8SNickeau * note supported but specific highlight is done with two `==` 244cadd4f8SNickeau * in some processor 254cadd4f8SNickeau * https://www.markdownguide.org/extended-syntax/#highlight 264cadd4f8SNickeau * 274cadd4f8SNickeau */ 284cadd4f8SNickeauclass syntax_plugin_combo_highlightwiki extends DokuWiki_Syntax_Plugin 294cadd4f8SNickeau{ 304cadd4f8SNickeau 314cadd4f8SNickeau 324cadd4f8SNickeau const TAG = "highlightwiki"; 334cadd4f8SNickeau // Only on one line 344cadd4f8SNickeau const ENTRY_PATTERN = "\x27\x27(?=[^\n]*\x27\x27)(?!\n)"; 354cadd4f8SNickeau 364cadd4f8SNickeau 374cadd4f8SNickeau const CONF_HIGHLIGHT_WIKI_ENABLE = "highlightWikiEnable"; 384cadd4f8SNickeau const CONF_DEFAULT_HIGHLIGHT_WIKI_ENABLE_VALUE = 1; 394cadd4f8SNickeau const EXIT_PATTERN = "\x27\x27"; 404cadd4f8SNickeau 414cadd4f8SNickeau const CANONICAL = self::TAG; 424cadd4f8SNickeau 434cadd4f8SNickeau const HTML_TAG = "mark"; 444cadd4f8SNickeau 454cadd4f8SNickeau public static function getOpenTagHighlight(string $tag): string 464cadd4f8SNickeau { 47*04fd306cSNickeau $config = ExecutionContext::getActualOrCreateFromEnv()->getConfig(); 484cadd4f8SNickeau $htmlTag = self::HTML_TAG; 49*04fd306cSNickeau if (!$config->isBrandingColorInheritanceEnabled()) { 504cadd4f8SNickeau return "<$htmlTag>"; 514cadd4f8SNickeau } 52*04fd306cSNickeau try { 53*04fd306cSNickeau $primaryColor = $config->getPrimaryColor(); 54*04fd306cSNickeau } catch (ExceptionNotFound $e) { 554cadd4f8SNickeau return "<$htmlTag>"; 564cadd4f8SNickeau } 574cadd4f8SNickeau $tagAttributes = TagAttributes::createEmpty($tag); 584cadd4f8SNickeau try { 59*04fd306cSNickeau $colorRgb = ColorSystem::toBackgroundColor($primaryColor); 604cadd4f8SNickeau $tagAttributes->addComponentAttributeValue(ColorRgb::BACKGROUND_COLOR, $colorRgb 614cadd4f8SNickeau ->toRgbHex()); 62*04fd306cSNickeau } catch (ExceptionCompile $e) { 63*04fd306cSNickeau LogUtility::msg("Error on highlight color calculation", self::CANONICAL, $e); 644cadd4f8SNickeau } 65*04fd306cSNickeau 664cadd4f8SNickeau return $tagAttributes->toHtmlEnterTag($htmlTag); 674cadd4f8SNickeau } 684cadd4f8SNickeau 694cadd4f8SNickeau public function getSort(): int 704cadd4f8SNickeau { 714cadd4f8SNickeau /** 724cadd4f8SNickeau * It's 49 (on less than the original of 100) named monospace 734cadd4f8SNickeau * {@link \dokuwiki\Parsing\ParserMode\Formatting} 744cadd4f8SNickeau */ 754cadd4f8SNickeau return 49; 764cadd4f8SNickeau } 774cadd4f8SNickeau 784cadd4f8SNickeau public function getType(): string 794cadd4f8SNickeau { 804cadd4f8SNickeau return 'formatting'; 814cadd4f8SNickeau } 824cadd4f8SNickeau 834cadd4f8SNickeau 844cadd4f8SNickeau /** 854cadd4f8SNickeau * 864cadd4f8SNickeau * How Dokuwiki will add P element 874cadd4f8SNickeau * 884cadd4f8SNickeau * * 'normal' - The plugin can be used inside paragraphs (inline) 894cadd4f8SNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 904cadd4f8SNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 914cadd4f8SNickeau * 924cadd4f8SNickeau * @see DokuWiki_Syntax_Plugin::getPType() 934cadd4f8SNickeau * 944cadd4f8SNickeau * This is the equivalent of inline or block for css 954cadd4f8SNickeau */ 964cadd4f8SNickeau public function getPType(): string 974cadd4f8SNickeau { 984cadd4f8SNickeau return 'normal'; 994cadd4f8SNickeau } 1004cadd4f8SNickeau 1014cadd4f8SNickeau /** 1024cadd4f8SNickeau * @return array 1034cadd4f8SNickeau * Allow which kind of plugin inside 1044cadd4f8SNickeau * 1054cadd4f8SNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 1064cadd4f8SNickeau * because we manage self the content and we call self the parser 1074cadd4f8SNickeau * 1084cadd4f8SNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 1094cadd4f8SNickeau */ 1104cadd4f8SNickeau function getAllowedTypes(): array 1114cadd4f8SNickeau { 1124cadd4f8SNickeau return array('formatting', 'substition', 'protected', 'disabled'); 1134cadd4f8SNickeau } 1144cadd4f8SNickeau 1154cadd4f8SNickeau 1164cadd4f8SNickeau public function connectTo($mode) 1174cadd4f8SNickeau { 118*04fd306cSNickeau $enabled = SiteConfig::getConfValue(self::CONF_HIGHLIGHT_WIKI_ENABLE, self::CONF_DEFAULT_HIGHLIGHT_WIKI_ENABLE_VALUE); 1194cadd4f8SNickeau if ($enabled) { 1204cadd4f8SNickeau $this->Lexer->addEntryPattern(self::ENTRY_PATTERN, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 1214cadd4f8SNickeau } 1224cadd4f8SNickeau 1234cadd4f8SNickeau } 1244cadd4f8SNickeau 1254cadd4f8SNickeau public function postConnect() 1264cadd4f8SNickeau { 1274cadd4f8SNickeau 1284cadd4f8SNickeau $this->Lexer->addExitPattern(self::EXIT_PATTERN, PluginUtility::getModeFromTag($this->getPluginComponent())); 1294cadd4f8SNickeau 1304cadd4f8SNickeau } 1314cadd4f8SNickeau 1324cadd4f8SNickeau 1334cadd4f8SNickeau /** 1344cadd4f8SNickeau * Handle the syntax 1354cadd4f8SNickeau * 1364cadd4f8SNickeau * At the end of the parser, the `section_open` and `section_close` calls 137*04fd306cSNickeau * are created in {@link action_plugin_combo_instructionspostprocessing} 1384cadd4f8SNickeau * and the text inside for the toc is captured 1394cadd4f8SNickeau * 1404cadd4f8SNickeau * @param string $match 1414cadd4f8SNickeau * @param int $state 1424cadd4f8SNickeau * @param int $pos 1434cadd4f8SNickeau * @param Doku_Handler $handler 1444cadd4f8SNickeau * @return array 1454cadd4f8SNickeau */ 1464cadd4f8SNickeau public function handle($match, $state, $pos, Doku_Handler $handler): array 1474cadd4f8SNickeau { 1484cadd4f8SNickeau switch ($state) { 1494cadd4f8SNickeau 1504cadd4f8SNickeau case DOKU_LEXER_EXIT: 1514cadd4f8SNickeau case DOKU_LEXER_ENTER: 1524cadd4f8SNickeau return array( 1534cadd4f8SNickeau PluginUtility::STATE => $state 1544cadd4f8SNickeau ); 1554cadd4f8SNickeau case DOKU_LEXER_UNMATCHED : 1564cadd4f8SNickeau 1574cadd4f8SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 1584cadd4f8SNickeau 1594cadd4f8SNickeau } 1604cadd4f8SNickeau return array(); 1614cadd4f8SNickeau } 1624cadd4f8SNickeau 1634cadd4f8SNickeau public function render($format, $renderer, $data): bool 1644cadd4f8SNickeau { 1654cadd4f8SNickeau 1664cadd4f8SNickeau switch ($format) { 1674cadd4f8SNickeau case "xhtml": 1684cadd4f8SNickeau { 1694cadd4f8SNickeau /** 1704cadd4f8SNickeau * @var Doku_Renderer_xhtml $renderer 1714cadd4f8SNickeau */ 1724cadd4f8SNickeau $state = $data[PluginUtility::STATE]; 1734cadd4f8SNickeau switch ($state) { 1744cadd4f8SNickeau 1754cadd4f8SNickeau case DOKU_LEXER_ENTER: 1764cadd4f8SNickeau $renderer->doc .= self::getOpenTagHighlight(self::TAG); 1774cadd4f8SNickeau return true; 1784cadd4f8SNickeau case DOKU_LEXER_UNMATCHED: 1794cadd4f8SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 1804cadd4f8SNickeau return true; 1814cadd4f8SNickeau case DOKU_LEXER_EXIT: 1824cadd4f8SNickeau $htmlTag = self::HTML_TAG; 1834cadd4f8SNickeau $renderer->doc .= "</$htmlTag>"; 1844cadd4f8SNickeau return true; 1854cadd4f8SNickeau 1864cadd4f8SNickeau } 1874cadd4f8SNickeau break; 1884cadd4f8SNickeau } 1894cadd4f8SNickeau case "metadata": 1904cadd4f8SNickeau /** 1914cadd4f8SNickeau * @var Doku_Renderer_metadata $renderer 1924cadd4f8SNickeau */ 1934cadd4f8SNickeau $state = $data[PluginUtility::STATE]; 1944cadd4f8SNickeau switch ($state) { 1954cadd4f8SNickeau case DOKU_LEXER_UNMATCHED: 1964cadd4f8SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 1974cadd4f8SNickeau } 1984cadd4f8SNickeau break; 1994cadd4f8SNickeau } 2004cadd4f8SNickeau 2014cadd4f8SNickeau return false; 2024cadd4f8SNickeau } 2034cadd4f8SNickeau 2044cadd4f8SNickeau 2054cadd4f8SNickeau} 206