xref: /plugin/combo/syntax/strong.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeauuse ComboStrap\PluginUtility;
4*04fd306cSNickeauuse ComboStrap\TagAttribute\Boldness;
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeau/**
8*04fd306cSNickeau *
9*04fd306cSNickeau * Taking over {@link \dokuwiki\Parsing\ParserMode\Formatting strong}
10*04fd306cSNickeau *
11*04fd306cSNickeau * * To disallow the preformatted mode
12*04fd306cSNickeau * * To add the one line constraint
13*04fd306cSNickeau *
14*04fd306cSNickeau */
15*04fd306cSNickeauclass syntax_plugin_combo_strong extends DokuWiki_Syntax_Plugin
16*04fd306cSNickeau{
17*04fd306cSNickeau
18*04fd306cSNickeau
19*04fd306cSNickeau    const TAG = "strong";
20*04fd306cSNickeau    /**
21*04fd306cSNickeau     * Explanation
22*04fd306cSNickeau     *   * `\n?` to take over the listblock {@link \dokuwiki\Parsing\ParserMode\Listblock}
23*04fd306cSNickeau     *
24*04fd306cSNickeau     *   * Only on one line
25*04fd306cSNickeau     *
26*04fd306cSNickeau     */
27*04fd306cSNickeau    const ENTRY_PATTERN = "[ \t]*\*\*(?=[^\n]*\*\*)(?!\n)";
28*04fd306cSNickeau    const EXIT_PATTERN = "\*\*";
29*04fd306cSNickeau
30*04fd306cSNickeau    const CANONICAL = Boldness::CANONICAL;
31*04fd306cSNickeau
32*04fd306cSNickeau
33*04fd306cSNickeau    public function getSort(): int
34*04fd306cSNickeau    {
35*04fd306cSNickeau        /**
36*04fd306cSNickeau         * It's 9
37*04fd306cSNickeau         *
38*04fd306cSNickeau         * Before the 10 of {@link \dokuwiki\Parsing\ParserMode\Listblock}
39*04fd306cSNickeau         * Before the original of 70
40*04fd306cSNickeau         * {@link \dokuwiki\Parsing\ParserMode\Formatting}
41*04fd306cSNickeau         */
42*04fd306cSNickeau        return 9;
43*04fd306cSNickeau    }
44*04fd306cSNickeau
45*04fd306cSNickeau    public function getType(): string
46*04fd306cSNickeau    {
47*04fd306cSNickeau        return 'formatting';
48*04fd306cSNickeau    }
49*04fd306cSNickeau
50*04fd306cSNickeau
51*04fd306cSNickeau    /**
52*04fd306cSNickeau     *
53*04fd306cSNickeau     * How Dokuwiki will add P element
54*04fd306cSNickeau     *
55*04fd306cSNickeau     *  * 'normal' - The plugin can be used inside paragraphs (inline)
56*04fd306cSNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
57*04fd306cSNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
58*04fd306cSNickeau     *
59*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
60*04fd306cSNickeau     *
61*04fd306cSNickeau     * This is the equivalent of inline or block for css
62*04fd306cSNickeau     */
63*04fd306cSNickeau    public function getPType(): string
64*04fd306cSNickeau    {
65*04fd306cSNickeau        return 'normal';
66*04fd306cSNickeau    }
67*04fd306cSNickeau
68*04fd306cSNickeau    /**
69*04fd306cSNickeau     * @return array
70*04fd306cSNickeau     * Allow which kind of plugin inside
71*04fd306cSNickeau     *
72*04fd306cSNickeau     * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
73*04fd306cSNickeau     * because we manage self the content and we call self the parser
74*04fd306cSNickeau     *
75*04fd306cSNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
76*04fd306cSNickeau     */
77*04fd306cSNickeau    function getAllowedTypes(): array
78*04fd306cSNickeau    {
79*04fd306cSNickeau        return array('formatting', 'substition', 'protected', 'disabled');
80*04fd306cSNickeau    }
81*04fd306cSNickeau
82*04fd306cSNickeau
83*04fd306cSNickeau    public function connectTo($mode)
84*04fd306cSNickeau    {
85*04fd306cSNickeau
86*04fd306cSNickeau        $this->Lexer->addEntryPattern(self::ENTRY_PATTERN, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
87*04fd306cSNickeau
88*04fd306cSNickeau
89*04fd306cSNickeau    }
90*04fd306cSNickeau
91*04fd306cSNickeau    public function postConnect()
92*04fd306cSNickeau    {
93*04fd306cSNickeau
94*04fd306cSNickeau        $this->Lexer->addExitPattern(self::EXIT_PATTERN, PluginUtility::getModeFromTag($this->getPluginComponent()));
95*04fd306cSNickeau
96*04fd306cSNickeau    }
97*04fd306cSNickeau
98*04fd306cSNickeau
99*04fd306cSNickeau    /**
100*04fd306cSNickeau     * Handle the syntax
101*04fd306cSNickeau     *
102*04fd306cSNickeau     * At the end of the parser, the `section_open` and `section_close` calls
103*04fd306cSNickeau     * are created in {@link action_plugin_combo_instructionspostprocessing}
104*04fd306cSNickeau     * and the text inside for the toc is captured
105*04fd306cSNickeau     *
106*04fd306cSNickeau     * @param string $match
107*04fd306cSNickeau     * @param int $state
108*04fd306cSNickeau     * @param int $pos
109*04fd306cSNickeau     * @param Doku_Handler $handler
110*04fd306cSNickeau     * @return array
111*04fd306cSNickeau     */
112*04fd306cSNickeau    public function handle($match, $state, $pos, Doku_Handler $handler): array
113*04fd306cSNickeau    {
114*04fd306cSNickeau        switch ($state) {
115*04fd306cSNickeau
116*04fd306cSNickeau            case DOKU_LEXER_EXIT:
117*04fd306cSNickeau            case DOKU_LEXER_ENTER:
118*04fd306cSNickeau                $beforeSpaces = str_replace("**", "", $match);
119*04fd306cSNickeau                return array(
120*04fd306cSNickeau                    PluginUtility::STATE => $state,
121*04fd306cSNickeau                    PluginUtility::PAYLOAD => $beforeSpaces
122*04fd306cSNickeau                );
123*04fd306cSNickeau            case DOKU_LEXER_UNMATCHED :
124*04fd306cSNickeau
125*04fd306cSNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
126*04fd306cSNickeau
127*04fd306cSNickeau        }
128*04fd306cSNickeau        return array();
129*04fd306cSNickeau    }
130*04fd306cSNickeau
131*04fd306cSNickeau    public function render($format, $renderer, $data): bool
132*04fd306cSNickeau    {
133*04fd306cSNickeau
134*04fd306cSNickeau        switch ($format) {
135*04fd306cSNickeau            case "xhtml":
136*04fd306cSNickeau            {
137*04fd306cSNickeau                /**
138*04fd306cSNickeau                 * @var Doku_Renderer_xhtml $renderer
139*04fd306cSNickeau                 */
140*04fd306cSNickeau                $state = $data[PluginUtility::STATE];
141*04fd306cSNickeau                switch ($state) {
142*04fd306cSNickeau
143*04fd306cSNickeau                    case DOKU_LEXER_ENTER:
144*04fd306cSNickeau
145*04fd306cSNickeau                        $renderer->doc .= $data[PluginUtility::PAYLOAD] . "<strong>";
146*04fd306cSNickeau                        return true;
147*04fd306cSNickeau                    case DOKU_LEXER_UNMATCHED:
148*04fd306cSNickeau                        $renderer->doc .= PluginUtility::renderUnmatched($data);
149*04fd306cSNickeau                        return true;
150*04fd306cSNickeau                    case DOKU_LEXER_EXIT:
151*04fd306cSNickeau                        $renderer->doc .= "</strong>";
152*04fd306cSNickeau                        return true;
153*04fd306cSNickeau
154*04fd306cSNickeau                }
155*04fd306cSNickeau                break;
156*04fd306cSNickeau            }
157*04fd306cSNickeau            case "metadata":
158*04fd306cSNickeau                /**
159*04fd306cSNickeau                 * For the automatic description, we render
160*04fd306cSNickeau                 * only the un-match
161*04fd306cSNickeau                 *
162*04fd306cSNickeau                 * @var Doku_Renderer_metadata $renderer
163*04fd306cSNickeau                 */
164*04fd306cSNickeau                $state = $data[PluginUtility::STATE];
165*04fd306cSNickeau                if ($state == DOKU_LEXER_UNMATCHED) {
166*04fd306cSNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
167*04fd306cSNickeau                }
168*04fd306cSNickeau                break;
169*04fd306cSNickeau        }
170*04fd306cSNickeau
171*04fd306cSNickeau        return false;
172*04fd306cSNickeau    }
173*04fd306cSNickeau
174*04fd306cSNickeau
175*04fd306cSNickeau}
176