xref: /plugin/combo/syntax/xmlblocktag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau
4*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php');
5*04fd306cSNickeau
6*04fd306cSNickeau// must be run within Dokuwiki
7*04fd306cSNickeauuse ComboStrap\BlockquoteTag;
8*04fd306cSNickeauuse ComboStrap\HeadingTag;
9*04fd306cSNickeauuse ComboStrap\PluginUtility;
10*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
11*04fd306cSNickeau
12*04fd306cSNickeau
13*04fd306cSNickeau/**
14*04fd306cSNickeau * The xml block tag (non-empty) pattern
15*04fd306cSNickeau */
16*04fd306cSNickeauclass syntax_plugin_combo_xmlblocktag extends DokuWiki_Syntax_Plugin
17*04fd306cSNickeau{
18*04fd306cSNickeau    /**
19*04fd306cSNickeau     * Should be the same than the last name of the class
20*04fd306cSNickeau     */
21*04fd306cSNickeau    const TAG = "xmlblocktag";
22*04fd306cSNickeau
23*04fd306cSNickeau
24*04fd306cSNickeau    /**
25*04fd306cSNickeau     * The Syntax Type determines which syntax may be nested
26*04fd306cSNickeau     *
27*04fd306cSNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
28*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getType()
29*04fd306cSNickeau     * See https://www.dokuwiki.org/devel:syntax_plugins#syntax_types
30*04fd306cSNickeau     */
31*04fd306cSNickeau    function getType(): string
32*04fd306cSNickeau    {
33*04fd306cSNickeau        /**
34*04fd306cSNickeau         * Choice between container, formatting and substition
35*04fd306cSNickeau         *
36*04fd306cSNickeau         * Icon had 'substition' and can still have other mode inside (ie tooltip)
37*04fd306cSNickeau         * We choose substition then
38*04fd306cSNickeau         *
39*04fd306cSNickeau         * For heading, title, it was `baseonly` because
40*04fd306cSNickeau         * Heading disappear when a table is just before because the {@link HeadingTag::SYNTAX_TYPE}  was `formatting`
41*04fd306cSNickeau         * The table was then accepting it and was deleting it at completion because there was no end of cell character (ie `|`)
42*04fd306cSNickeau         *
43*04fd306cSNickeau         */
44*04fd306cSNickeau        return 'substition';
45*04fd306cSNickeau    }
46*04fd306cSNickeau
47*04fd306cSNickeau    /**
48*04fd306cSNickeau     * @param string $mode
49*04fd306cSNickeau     * @return bool
50*04fd306cSNickeau     * Allowed type
51*04fd306cSNickeau     */
52*04fd306cSNickeau    public function accepts($mode): bool
53*04fd306cSNickeau    {
54*04fd306cSNickeau        /**
55*04fd306cSNickeau         * header mode is disable to take over
56*04fd306cSNickeau         * and replace it with {@link syntax_plugin_combo_headingwiki}
57*04fd306cSNickeau         */
58*04fd306cSNickeau        if ($mode == "header") {
59*04fd306cSNickeau            return false;
60*04fd306cSNickeau        }
61*04fd306cSNickeau
62*04fd306cSNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
63*04fd306cSNickeau
64*04fd306cSNickeau    }
65*04fd306cSNickeau
66*04fd306cSNickeau    /**
67*04fd306cSNickeau     * How Dokuwiki will add P element
68*04fd306cSNickeau     *
69*04fd306cSNickeau     *  * 'normal' - Inline (dokuwiki will not close an ongoing p)
70*04fd306cSNickeau     *  * 'block' - Block (dokuwiki does not not create p inside and close an open p)
71*04fd306cSNickeau     *  * 'stack' - Block (dokuwiki create p inside)
72*04fd306cSNickeau     *
73*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
74*04fd306cSNickeau     */
75*04fd306cSNickeau    function getPType(): string
76*04fd306cSNickeau    {
77*04fd306cSNickeau        /**
78*04fd306cSNickeau         * Ptype is the driver of the {@link \dokuwiki\Parsing\Handler\Block::process()}
79*04fd306cSNickeau         * that creates the P tag.
80*04fd306cSNickeau         *
81*04fd306cSNickeau         * Works with block and stack for now
82*04fd306cSNickeau         * Not with `normal` as if dokuwiki has created a p
83*04fd306cSNickeau         * and that is encounters a block, it will close the p inside the stack unfortunately
84*04fd306cSNickeau         * (You can try with {@link BlockquoteTag}
85*04fd306cSNickeau         *
86*04fd306cSNickeau         * For box, not stack, otherwise it creates p
87*04fd306cSNickeau         * and as box is used mostly for layout purpose, it breaks the
88*04fd306cSNickeau         * {@link \ComboStrap\TagAttribute\Align} flex css attribute
89*04fd306cSNickeau         *
90*04fd306cSNickeau         * For Cardbody, block value was !important! as
91*04fd306cSNickeau         * it will not create an extra paragraph after it encounters a block
92*04fd306cSNickeau         *
93*04fd306cSNickeau         * For {@link \ComboStrap\GridTag},
94*04fd306cSNickeau         * not stack, otherwise you get extra p's
95*04fd306cSNickeau         * and it will fucked up the flex layout
96*04fd306cSNickeau         */
97*04fd306cSNickeau        return 'block';
98*04fd306cSNickeau    }
99*04fd306cSNickeau
100*04fd306cSNickeau    /**
101*04fd306cSNickeau     * @return array the kind of plugin that are allowed inside (ie an array of
102*04fd306cSNickeau     * <a href="https://www.dokuwiki.org/devel:syntax_plugins#syntax_types">mode type</a>
103*04fd306cSNickeau     * ie
104*04fd306cSNickeau     * * array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
105*04fd306cSNickeau     * * array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
106*04fd306cSNickeau     */
107*04fd306cSNickeau    public function getAllowedTypes(): array
108*04fd306cSNickeau    {
109*04fd306cSNickeau        /**
110*04fd306cSNickeau         * Tweak: `paragraphs` is not in the allowed type
111*04fd306cSNickeau         */
112*04fd306cSNickeau        return array('container', 'formatting', 'substition', 'protected', 'disabled');
113*04fd306cSNickeau    }
114*04fd306cSNickeau
115*04fd306cSNickeau
116*04fd306cSNickeau    function getSort(): int
117*04fd306cSNickeau    {
118*04fd306cSNickeau        return 999;
119*04fd306cSNickeau    }
120*04fd306cSNickeau
121*04fd306cSNickeau
122*04fd306cSNickeau    function connectTo($mode)
123*04fd306cSNickeau    {
124*04fd306cSNickeau
125*04fd306cSNickeau        // One pattern to not compete between pattern
126*04fd306cSNickeau        // this pattern ensure that the tag
127*04fd306cSNickeau        // (ie that `accordion` will not intercept also the tag `accordionitem`)
128*04fd306cSNickeau
129*04fd306cSNickeau
130*04fd306cSNickeau        $pattern = XmlTagProcessing::START_TAG_PATTERN;
131*04fd306cSNickeau        $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
132*04fd306cSNickeau
133*04fd306cSNickeau    }
134*04fd306cSNickeau
135*04fd306cSNickeau    public function postConnect()
136*04fd306cSNickeau    {
137*04fd306cSNickeau
138*04fd306cSNickeau        $this->Lexer->addExitPattern('</[\w-]+>', PluginUtility::getModeFromTag($this->getPluginComponent()));
139*04fd306cSNickeau
140*04fd306cSNickeau    }
141*04fd306cSNickeau
142*04fd306cSNickeau
143*04fd306cSNickeau    function handle($match, $state, $pos, Doku_Handler $handler): array
144*04fd306cSNickeau    {
145*04fd306cSNickeau        return XmlTagProcessing::handleStatic($match, $state, $pos, $handler, $this);
146*04fd306cSNickeau    }
147*04fd306cSNickeau
148*04fd306cSNickeau    /**
149*04fd306cSNickeau     * Render the output
150*04fd306cSNickeau     * @param string $format
151*04fd306cSNickeau     * @param Doku_Renderer $renderer
152*04fd306cSNickeau     * @param array $data - what the function handle() return'ed
153*04fd306cSNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
154*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::render()
155*04fd306cSNickeau     *
156*04fd306cSNickeau     *
157*04fd306cSNickeau     */
158*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
159*04fd306cSNickeau    {
160*04fd306cSNickeau
161*04fd306cSNickeau        return XmlTagProcessing::renderStatic($format, $renderer, $data, $this);
162*04fd306cSNickeau
163*04fd306cSNickeau    }
164*04fd306cSNickeau
165*04fd306cSNickeau
166*04fd306cSNickeau}
167*04fd306cSNickeau
168