xref: /plugin/combo/syntax/highlightmd.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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