xref: /plugin/combo/syntax/togglecollapse.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeauuse ComboStrap\PluginUtility;
5*04fd306cSNickeauuse ComboStrap\TagAttributes;
6*04fd306cSNickeauuse ComboStrap\TagAttribute\Toggle;
7*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
8*04fd306cSNickeau
9*04fd306cSNickeauclass syntax_plugin_combo_togglecollapse extends DokuWiki_Syntax_Plugin
10*04fd306cSNickeau{
11*04fd306cSNickeau
12*04fd306cSNickeau    const TAG = "collapse";
13*04fd306cSNickeau    const CANONICAL = syntax_plugin_combo_toggle::CANONICAL;
14*04fd306cSNickeau
15*04fd306cSNickeau
16*04fd306cSNickeau    /**
17*04fd306cSNickeau     * Syntax Type.
18*04fd306cSNickeau     *
19*04fd306cSNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
20*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getType()
21*04fd306cSNickeau     */
22*04fd306cSNickeau    function getType(): string
23*04fd306cSNickeau    {
24*04fd306cSNickeau        return 'substition';
25*04fd306cSNickeau    }
26*04fd306cSNickeau
27*04fd306cSNickeau    /**
28*04fd306cSNickeau     * How Dokuwiki will add P element
29*04fd306cSNickeau     *
30*04fd306cSNickeau     *  * 'normal' - The plugin can be used inside paragraphs
31*04fd306cSNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
32*04fd306cSNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
33*04fd306cSNickeau     *
34*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
35*04fd306cSNickeau     */
36*04fd306cSNickeau    function getPType(): string
37*04fd306cSNickeau    {
38*04fd306cSNickeau        // button or link
39*04fd306cSNickeau        return 'normal';
40*04fd306cSNickeau    }
41*04fd306cSNickeau
42*04fd306cSNickeau    /**
43*04fd306cSNickeau     * @return array
44*04fd306cSNickeau     * Allow which kind of plugin inside
45*04fd306cSNickeau     *
46*04fd306cSNickeau     * array('container', 'baseonly', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
47*04fd306cSNickeau     *
48*04fd306cSNickeau     */
49*04fd306cSNickeau    function getAllowedTypes(): array
50*04fd306cSNickeau    {
51*04fd306cSNickeau        return array('baseonly', 'formatting', 'substition', 'protected', 'disabled');
52*04fd306cSNickeau    }
53*04fd306cSNickeau
54*04fd306cSNickeau    function getSort(): int
55*04fd306cSNickeau    {
56*04fd306cSNickeau        return 201;
57*04fd306cSNickeau    }
58*04fd306cSNickeau
59*04fd306cSNickeau    public
60*04fd306cSNickeau    function accepts($mode): bool
61*04fd306cSNickeau    {
62*04fd306cSNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode)
63*04fd306cSNickeau            && Toggle::disableEntity($mode);
64*04fd306cSNickeau    }
65*04fd306cSNickeau
66*04fd306cSNickeau
67*04fd306cSNickeau    /**
68*04fd306cSNickeau     * Create a pattern that will called this plugin
69*04fd306cSNickeau     *
70*04fd306cSNickeau     * @param string $mode
71*04fd306cSNickeau     * @see Doku_Parser_Mode::connectTo()
72*04fd306cSNickeau     */
73*04fd306cSNickeau    function connectTo($mode)
74*04fd306cSNickeau    {
75*04fd306cSNickeau
76*04fd306cSNickeau        /**
77*04fd306cSNickeau         * Tag only valid in a toggle tag
78*04fd306cSNickeau         */
79*04fd306cSNickeau        if ($mode == PluginUtility::getModeFromTag(syntax_plugin_combo_toggle::TAG)) {
80*04fd306cSNickeau            $pattern = XmlTagProcessing::getContainerTagPattern(self::getTag());
81*04fd306cSNickeau            $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
82*04fd306cSNickeau        }
83*04fd306cSNickeau
84*04fd306cSNickeau
85*04fd306cSNickeau    }
86*04fd306cSNickeau
87*04fd306cSNickeau    function postConnect()
88*04fd306cSNickeau    {
89*04fd306cSNickeau
90*04fd306cSNickeau        $this->Lexer->addExitPattern('</' . self::getTag() . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
91*04fd306cSNickeau
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
95*04fd306cSNickeau    {
96*04fd306cSNickeau
97*04fd306cSNickeau
98*04fd306cSNickeau        switch ($state) {
99*04fd306cSNickeau
100*04fd306cSNickeau            case DOKU_LEXER_ENTER :
101*04fd306cSNickeau
102*04fd306cSNickeau                /**
103*04fd306cSNickeau                 * Default parameters, type definition and parsing
104*04fd306cSNickeau                 */
105*04fd306cSNickeau                $defaultParameters = [];
106*04fd306cSNickeau                $knownTypes = [];
107*04fd306cSNickeau                $tagAttributes = TagAttributes::createFromTagMatch($match, $defaultParameters, $knownTypes)
108*04fd306cSNickeau                    ->setLogicalTag(self::TAG);
109*04fd306cSNickeau
110*04fd306cSNickeau                return array(
111*04fd306cSNickeau                    PluginUtility::STATE => $state,
112*04fd306cSNickeau                    PluginUtility::ATTRIBUTES => $tagAttributes->toCallStackArray()
113*04fd306cSNickeau                );
114*04fd306cSNickeau            case DOKU_LEXER_UNMATCHED :
115*04fd306cSNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
116*04fd306cSNickeau
117*04fd306cSNickeau            case DOKU_LEXER_EXIT :
118*04fd306cSNickeau                return array(
119*04fd306cSNickeau                    PluginUtility::STATE => $state
120*04fd306cSNickeau                );
121*04fd306cSNickeau
122*04fd306cSNickeau
123*04fd306cSNickeau        }
124*04fd306cSNickeau        return array();
125*04fd306cSNickeau
126*04fd306cSNickeau    }
127*04fd306cSNickeau
128*04fd306cSNickeau    /**
129*04fd306cSNickeau     * Render the output
130*04fd306cSNickeau     * @param string $format
131*04fd306cSNickeau     * @param Doku_Renderer $renderer
132*04fd306cSNickeau     * @param array $data - what the function handle() return
133*04fd306cSNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
134*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::render()
135*04fd306cSNickeau     *
136*04fd306cSNickeau     *
137*04fd306cSNickeau     */
138*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
139*04fd306cSNickeau    {
140*04fd306cSNickeau
141*04fd306cSNickeau        if ($format === "xhtml") {
142*04fd306cSNickeau            $state = $data[PluginUtility::STATE];
143*04fd306cSNickeau            switch ($state) {
144*04fd306cSNickeau                case DOKU_LEXER_ENTER:
145*04fd306cSNickeau                    $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES])
146*04fd306cSNickeau                        ->setLogicalTag(self::TAG);
147*04fd306cSNickeau                    $renderer->doc .= $tagAttributes->toHtmlEnterTag("span");
148*04fd306cSNickeau                    break;
149*04fd306cSNickeau                case DOKU_LEXER_UNMATCHED:
150*04fd306cSNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
151*04fd306cSNickeau                    break;
152*04fd306cSNickeau                case DOKU_LEXER_EXIT:
153*04fd306cSNickeau                    $renderer->doc .= "</span>";
154*04fd306cSNickeau                    break;
155*04fd306cSNickeau
156*04fd306cSNickeau            }
157*04fd306cSNickeau            return true;
158*04fd306cSNickeau        }
159*04fd306cSNickeau
160*04fd306cSNickeau        // unsupported $mode
161*04fd306cSNickeau        return false;
162*04fd306cSNickeau    }
163*04fd306cSNickeau
164*04fd306cSNickeau    public
165*04fd306cSNickeau    static function getTag(): string
166*04fd306cSNickeau    {
167*04fd306cSNickeau        return self::TAG;
168*04fd306cSNickeau    }
169*04fd306cSNickeau
170*04fd306cSNickeau
171*04fd306cSNickeau}
172*04fd306cSNickeau
173