14cadd4f8SNickeau<?php 24cadd4f8SNickeau 34cadd4f8SNickeauuse ComboStrap\PluginUtility; 4*04fd306cSNickeauuse ComboStrap\Site; 54cadd4f8SNickeau 64cadd4f8SNickeau 74cadd4f8SNickeau/** 84cadd4f8SNickeau * 94cadd4f8SNickeau * Known as code 104cadd4f8SNickeau * https://spec.commonmark.org/0.30/#code-spans 114cadd4f8SNickeau * 124cadd4f8SNickeau * note supported but specific highlight is done with two `==` 134cadd4f8SNickeau * in some processor 144cadd4f8SNickeau * https://www.markdownguide.org/extended-syntax/#highlight 154cadd4f8SNickeau * 164cadd4f8SNickeau */ 174cadd4f8SNickeauclass syntax_plugin_combo_highlightmd extends DokuWiki_Syntax_Plugin 184cadd4f8SNickeau{ 194cadd4f8SNickeau 204cadd4f8SNickeau 214cadd4f8SNickeau const TAG = "highlightmd"; 224cadd4f8SNickeau // Only on one line 234cadd4f8SNickeau 244cadd4f8SNickeau /** 254cadd4f8SNickeau * Only on one line, otherwise 264cadd4f8SNickeau * if it's not closed, it will eat all other syntaqx 274cadd4f8SNickeau */ 28*04fd306cSNickeau const ENTRY_PATTERN = "`[^`\n]*(?=`)(?!\n)"; 294cadd4f8SNickeau 304cadd4f8SNickeau const EXIT_PATTERN = "`"; 314cadd4f8SNickeau const CANONICAL = self::TAG; 324cadd4f8SNickeau 334cadd4f8SNickeau public function getSort(): int 344cadd4f8SNickeau { 354cadd4f8SNickeau 364cadd4f8SNickeau return 200; 374cadd4f8SNickeau } 384cadd4f8SNickeau 394cadd4f8SNickeau public function getType(): string 404cadd4f8SNickeau { 414cadd4f8SNickeau return 'formatting'; 424cadd4f8SNickeau } 434cadd4f8SNickeau 444cadd4f8SNickeau 454cadd4f8SNickeau /** 464cadd4f8SNickeau * 474cadd4f8SNickeau * How Dokuwiki will add P element 484cadd4f8SNickeau * 494cadd4f8SNickeau * * 'normal' - The plugin can be used inside paragraphs (inline) 504cadd4f8SNickeau * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 514cadd4f8SNickeau * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 524cadd4f8SNickeau * 534cadd4f8SNickeau * @see DokuWiki_Syntax_Plugin::getPType() 544cadd4f8SNickeau * 554cadd4f8SNickeau * This is the equivalent of inline or block for css 564cadd4f8SNickeau */ 574cadd4f8SNickeau public function getPType(): string 584cadd4f8SNickeau { 594cadd4f8SNickeau return 'normal'; 604cadd4f8SNickeau } 614cadd4f8SNickeau 624cadd4f8SNickeau /** 634cadd4f8SNickeau * @return array 644cadd4f8SNickeau * Allow which kind of plugin inside 654cadd4f8SNickeau * 664cadd4f8SNickeau * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs') 674cadd4f8SNickeau * because we manage self the content and we call self the parser 684cadd4f8SNickeau * 694cadd4f8SNickeau * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php 704cadd4f8SNickeau */ 714cadd4f8SNickeau function getAllowedTypes(): array 724cadd4f8SNickeau { 734cadd4f8SNickeau return array('formatting', 'substition', 'protected', 'disabled'); 744cadd4f8SNickeau } 754cadd4f8SNickeau 764cadd4f8SNickeau 774cadd4f8SNickeau public function connectTo($mode) 784cadd4f8SNickeau { 794cadd4f8SNickeau 804cadd4f8SNickeau $this->Lexer->addEntryPattern(self::ENTRY_PATTERN, $mode, PluginUtility::getModeFromTag($this->getPluginComponent())); 814cadd4f8SNickeau 824cadd4f8SNickeau 834cadd4f8SNickeau } 844cadd4f8SNickeau 854cadd4f8SNickeau public function postConnect() 864cadd4f8SNickeau { 874cadd4f8SNickeau 884cadd4f8SNickeau $this->Lexer->addExitPattern(self::EXIT_PATTERN, PluginUtility::getModeFromTag($this->getPluginComponent())); 894cadd4f8SNickeau 904cadd4f8SNickeau } 914cadd4f8SNickeau 924cadd4f8SNickeau 934cadd4f8SNickeau /** 944cadd4f8SNickeau * Handle the syntax 954cadd4f8SNickeau * 964cadd4f8SNickeau * At the end of the parser, the `section_open` and `section_close` calls 97*04fd306cSNickeau * are created in {@link action_plugin_combo_instructionspostprocessing} 984cadd4f8SNickeau * and the text inside for the toc is captured 994cadd4f8SNickeau * 1004cadd4f8SNickeau * @param string $match 1014cadd4f8SNickeau * @param int $state 1024cadd4f8SNickeau * @param int $pos 1034cadd4f8SNickeau * @param Doku_Handler $handler 1044cadd4f8SNickeau * @return array 1054cadd4f8SNickeau */ 1064cadd4f8SNickeau public function handle($match, $state, $pos, Doku_Handler $handler): array 1074cadd4f8SNickeau { 1084cadd4f8SNickeau switch ($state) { 1094cadd4f8SNickeau 1104cadd4f8SNickeau case DOKU_LEXER_EXIT: 1114cadd4f8SNickeau case DOKU_LEXER_ENTER: 1124cadd4f8SNickeau 1134cadd4f8SNickeau $content = substr($match, 1); 1144cadd4f8SNickeau return array( 1154cadd4f8SNickeau PluginUtility::STATE => $state, 1164cadd4f8SNickeau PluginUtility::PAYLOAD => $content, 1174cadd4f8SNickeau ); 1184cadd4f8SNickeau case DOKU_LEXER_UNMATCHED : 1194cadd4f8SNickeau 1204cadd4f8SNickeau return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler); 1214cadd4f8SNickeau 1224cadd4f8SNickeau } 1234cadd4f8SNickeau return array(); 1244cadd4f8SNickeau } 1254cadd4f8SNickeau 1264cadd4f8SNickeau public function render($format, Doku_Renderer $renderer, $data): bool 1274cadd4f8SNickeau { 1284cadd4f8SNickeau 1294cadd4f8SNickeau switch ($format) { 1304cadd4f8SNickeau case "xhtml": 1314cadd4f8SNickeau /** 1324cadd4f8SNickeau * @var Doku_Renderer_xhtml $renderer 1334cadd4f8SNickeau */ 1344cadd4f8SNickeau $state = $data[PluginUtility::STATE]; 1354cadd4f8SNickeau switch ($state) { 1364cadd4f8SNickeau 1374cadd4f8SNickeau case DOKU_LEXER_ENTER: 1384cadd4f8SNickeau $renderer->doc .= syntax_plugin_combo_highlightwiki::getOpenTagHighlight(self::TAG) . $data[PluginUtility::PAYLOAD]; 1394cadd4f8SNickeau return true; 1404cadd4f8SNickeau case DOKU_LEXER_UNMATCHED: 1414cadd4f8SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 1424cadd4f8SNickeau return true; 1434cadd4f8SNickeau case DOKU_LEXER_EXIT: 1444cadd4f8SNickeau $renderer->doc .= "</mark>"; 1454cadd4f8SNickeau return true; 1464cadd4f8SNickeau 1474cadd4f8SNickeau } 1484cadd4f8SNickeau break; 1494cadd4f8SNickeau case "metadata": 1504cadd4f8SNickeau /** 1514cadd4f8SNickeau * @var Doku_Renderer_metadata $renderer 1524cadd4f8SNickeau */ 1534cadd4f8SNickeau $state = $data[PluginUtility::STATE]; 1544cadd4f8SNickeau switch ($state) { 1554cadd4f8SNickeau case DOKU_LEXER_ENTER: 1564cadd4f8SNickeau $renderer->doc .= $data[PluginUtility::PAYLOAD]; 1574cadd4f8SNickeau return true; 1584cadd4f8SNickeau case DOKU_LEXER_UNMATCHED: 1594cadd4f8SNickeau $renderer->doc .= PluginUtility::renderUnmatched($data); 1604cadd4f8SNickeau } 1614cadd4f8SNickeau break; 1624cadd4f8SNickeau } 1634cadd4f8SNickeau 1644cadd4f8SNickeau return false; 1654cadd4f8SNickeau } 1664cadd4f8SNickeau 1674cadd4f8SNickeau 1684cadd4f8SNickeau} 169