xref: /template/strap/syntax/xmlinlinetag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau/**
3*04fd306cSNickeau * DokuWiki Syntax Plugin Combostrap.
4*04fd306cSNickeau *
5*04fd306cSNickeau */
6*04fd306cSNickeau
7*04fd306cSNickeauuse ComboStrap\ButtonTag;
8*04fd306cSNickeauuse ComboStrap\DateTag;
9*04fd306cSNickeauuse ComboStrap\DropDownTag;
10*04fd306cSNickeauuse ComboStrap\IconTag;
11*04fd306cSNickeauuse ComboStrap\NoteTag;
12*04fd306cSNickeauuse ComboStrap\PermalinkTag;
13*04fd306cSNickeauuse ComboStrap\PipelineTag;
14*04fd306cSNickeauuse ComboStrap\PluginUtility;
15*04fd306cSNickeauuse ComboStrap\Tag\FollowTag;
16*04fd306cSNickeauuse ComboStrap\Tag\ShareTag;
17*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
18*04fd306cSNickeau
19*04fd306cSNickeau
20*04fd306cSNickeaurequire_once(__DIR__ . '/../vendor/autoload.php');
21*04fd306cSNickeau
22*04fd306cSNickeau
23*04fd306cSNickeau/**
24*04fd306cSNickeau * All DokuWiki plugins to extend the parser/rendering mechanism
25*04fd306cSNickeau * need to inherit from this class
26*04fd306cSNickeau *
27*04fd306cSNickeau * The name of the class must follow a pattern (don't change it)
28*04fd306cSNickeau * ie:
29*04fd306cSNickeau *    syntax_plugin_PluginName_ComponentName
30*04fd306cSNickeau *
31*04fd306cSNickeau * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
32*04fd306cSNickeau * !!!!!!!!!!! The component name must be the name of the php file !!!
33*04fd306cSNickeau * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
34*04fd306cSNickeau *
35*04fd306cSNickeau */
36*04fd306cSNickeauclass syntax_plugin_combo_xmlinlinetag extends DokuWiki_Syntax_Plugin
37*04fd306cSNickeau{
38*04fd306cSNickeau
39*04fd306cSNickeau    /**
40*04fd306cSNickeau     * @return array inline non-protected
41*04fd306cSNickeau     */
42*04fd306cSNickeau    private static function getInlineTags(): array
43*04fd306cSNickeau    {
44*04fd306cSNickeau        $array = ButtonTag::getTags();
45*04fd306cSNickeau        $array[] = DropDownTag::TAG;
46*04fd306cSNickeau        $array[] = NoteTag::TAG_INOTE;
47*04fd306cSNickeau        $array[] = PermalinkTag::TAG;
48*04fd306cSNickeau        $array[] = DateTag::TAG;
49*04fd306cSNickeau        $array[] = IconTag::TAG;
50*04fd306cSNickeau        $array[] = PipelineTag::TAG;
51*04fd306cSNickeau        $array[] = FollowTag::MARKUP;
52*04fd306cSNickeau        $array[] = ShareTag::MARKUP;
53*04fd306cSNickeau        return $array;
54*04fd306cSNickeau    }
55*04fd306cSNickeau
56*04fd306cSNickeau
57*04fd306cSNickeau    /**
58*04fd306cSNickeau     * Syntax Type.
59*04fd306cSNickeau     *
60*04fd306cSNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
61*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getType()
62*04fd306cSNickeau     */
63*04fd306cSNickeau    function getType(): string
64*04fd306cSNickeau    {
65*04fd306cSNickeau        return 'formatting';
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('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
73*04fd306cSNickeau     * because we manage self the content and we call self the parser
74*04fd306cSNickeau     */
75*04fd306cSNickeau    public function getAllowedTypes(): array
76*04fd306cSNickeau    {
77*04fd306cSNickeau        return array('container', 'formatting', 'substition', 'protected', 'disabled');
78*04fd306cSNickeau    }
79*04fd306cSNickeau
80*04fd306cSNickeau    public function accepts($mode): bool
81*04fd306cSNickeau    {
82*04fd306cSNickeau
83*04fd306cSNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
84*04fd306cSNickeau
85*04fd306cSNickeau    }
86*04fd306cSNickeau
87*04fd306cSNickeau    /**
88*04fd306cSNickeau     * How Dokuwiki will add P element
89*04fd306cSNickeau     *
90*04fd306cSNickeau     *  * 'normal' - The plugin can be used inside paragraphs
91*04fd306cSNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
92*04fd306cSNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
93*04fd306cSNickeau     *
94*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
95*04fd306cSNickeau     */
96*04fd306cSNickeau    function getPType(): string
97*04fd306cSNickeau    {
98*04fd306cSNickeau        return 'normal';
99*04fd306cSNickeau    }
100*04fd306cSNickeau
101*04fd306cSNickeau    /**
102*04fd306cSNickeau     * @see Doku_Parser_Mode::getSort()
103*04fd306cSNickeau     * the mode with the lowest sort number will win out
104*04fd306cSNickeau     * the lowest in the tree must have the lowest sort number
105*04fd306cSNickeau     * No idea why it must be low but inside a teaser, it will work
106*04fd306cSNickeau     * https://www.dokuwiki.org/devel:parser#order_of_adding_modes_important
107*04fd306cSNickeau     */
108*04fd306cSNickeau    function getSort(): int
109*04fd306cSNickeau    {
110*04fd306cSNickeau        return 10;
111*04fd306cSNickeau    }
112*04fd306cSNickeau
113*04fd306cSNickeau    /**
114*04fd306cSNickeau     * Create a pattern that will called this plugin
115*04fd306cSNickeau     *
116*04fd306cSNickeau     * @param string $mode
117*04fd306cSNickeau     * @see Doku_Parser_Mode::connectTo()
118*04fd306cSNickeau     */
119*04fd306cSNickeau    function connectTo($mode)
120*04fd306cSNickeau    {
121*04fd306cSNickeau
122*04fd306cSNickeau        foreach (self::getInlineTags() as $tag) {
123*04fd306cSNickeau
124*04fd306cSNickeau            $pattern = XmlTagProcessing::getContainerTagPattern($tag);
125*04fd306cSNickeau            $this->Lexer->addEntryPattern($pattern, $mode, 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
126*04fd306cSNickeau
127*04fd306cSNickeau        }
128*04fd306cSNickeau
129*04fd306cSNickeau    }
130*04fd306cSNickeau
131*04fd306cSNickeau    public function postConnect()
132*04fd306cSNickeau    {
133*04fd306cSNickeau
134*04fd306cSNickeau        foreach (self::getInlineTags() as $tag) {
135*04fd306cSNickeau            $this->Lexer->addExitPattern('</' . $tag . '>', 'plugin_' . PluginUtility::PLUGIN_BASE_NAME . '_' . $this->getPluginComponent());
136*04fd306cSNickeau        }
137*04fd306cSNickeau
138*04fd306cSNickeau    }
139*04fd306cSNickeau
140*04fd306cSNickeau    /**
141*04fd306cSNickeau     *
142*04fd306cSNickeau     * The handle function goal is to parse the matched syntax through the pattern function
143*04fd306cSNickeau     * and to return the result for use in the renderer
144*04fd306cSNickeau     * This result is always cached until the page is modified.
145*04fd306cSNickeau     * @param string $match
146*04fd306cSNickeau     * @param int $state
147*04fd306cSNickeau     * @param int $pos
148*04fd306cSNickeau     * @param Doku_Handler $handler
149*04fd306cSNickeau     * @return array|bool
150*04fd306cSNickeau     * @throws Exception
151*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::handle()
152*04fd306cSNickeau     *
153*04fd306cSNickeau     */
154*04fd306cSNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
155*04fd306cSNickeau    {
156*04fd306cSNickeau
157*04fd306cSNickeau        return XmlTagProcessing::handleStatic($match, $state, $pos, $handler, $this);
158*04fd306cSNickeau
159*04fd306cSNickeau    }
160*04fd306cSNickeau
161*04fd306cSNickeau    /**
162*04fd306cSNickeau     * Render the output
163*04fd306cSNickeau     * @param string $format
164*04fd306cSNickeau     * @param Doku_Renderer $renderer
165*04fd306cSNickeau     * @param array $data - what the function handle() return'ed
166*04fd306cSNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
167*04fd306cSNickeau     * @see DokuWiki_Syntax_Plugin::render()
168*04fd306cSNickeau     *
169*04fd306cSNickeau     *
170*04fd306cSNickeau     */
171*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
172*04fd306cSNickeau    {
173*04fd306cSNickeau
174*04fd306cSNickeau        return XmlTagProcessing::renderStatic($format, $renderer, $data, $this);
175*04fd306cSNickeau
176*04fd306cSNickeau    }
177*04fd306cSNickeau
178*04fd306cSNickeau
179*04fd306cSNickeau}
180