xref: /template/strap/syntax/iteratordata.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
1*37748cd8SNickeau<?php
2*37748cd8SNickeau
3*37748cd8SNickeau
4*37748cd8SNickeauuse ComboStrap\PluginUtility;
5*37748cd8SNickeauuse ComboStrap\TagAttributes;
6*37748cd8SNickeau
7*37748cd8SNickeau
8*37748cd8SNickeau/**
9*37748cd8SNickeau * This syntax is not a classic syntax plugin
10*37748cd8SNickeau *
11*37748cd8SNickeau * The instructions are captured at the {@link DOKU_LEXER_END}
12*37748cd8SNickeau * state of {@link syntax_plugin_combo_iterator::handle()}
13*37748cd8SNickeau * to create the data
14*37748cd8SNickeau *
15*37748cd8SNickeau *
16*37748cd8SNickeau */
17*37748cd8SNickeauclass syntax_plugin_combo_iteratordata extends DokuWiki_Syntax_Plugin
18*37748cd8SNickeau{
19*37748cd8SNickeau
20*37748cd8SNickeau    /**
21*37748cd8SNickeau     * Tag in Dokuwiki cannot have a `-`
22*37748cd8SNickeau     * This is the last part of the class
23*37748cd8SNickeau     */
24*37748cd8SNickeau    const TAG = "iteratordata";
25*37748cd8SNickeau
26*37748cd8SNickeau    /**
27*37748cd8SNickeau     * The pattern
28*37748cd8SNickeau     */
29*37748cd8SNickeau    const MARKI_PAGE_TAG = "data";
30*37748cd8SNickeau
31*37748cd8SNickeau
32*37748cd8SNickeau    /**
33*37748cd8SNickeau     * Syntax Type.
34*37748cd8SNickeau     *
35*37748cd8SNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
36*37748cd8SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types
37*37748cd8SNickeau     * @see DokuWiki_Syntax_Plugin::getType()
38*37748cd8SNickeau     */
39*37748cd8SNickeau    function getType()
40*37748cd8SNickeau    {
41*37748cd8SNickeau        return 'protected';
42*37748cd8SNickeau    }
43*37748cd8SNickeau
44*37748cd8SNickeau    /**
45*37748cd8SNickeau     * How Dokuwiki will add P element
46*37748cd8SNickeau     *
47*37748cd8SNickeau     *  * 'normal' - The plugin can be used inside paragraphs (inline or inside)
48*37748cd8SNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output (box) - block should not be inside paragraphs
49*37748cd8SNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
50*37748cd8SNickeau     *
51*37748cd8SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
52*37748cd8SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#ptype
53*37748cd8SNickeau     */
54*37748cd8SNickeau    function getPType()
55*37748cd8SNickeau    {
56*37748cd8SNickeau        return 'normal';
57*37748cd8SNickeau    }
58*37748cd8SNickeau
59*37748cd8SNickeau    /**
60*37748cd8SNickeau     * @return array
61*37748cd8SNickeau     * Allow which kind of plugin inside
62*37748cd8SNickeau     *
63*37748cd8SNickeau     * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
64*37748cd8SNickeau     * because we manage self the content and we call self the parser
65*37748cd8SNickeau     *
66*37748cd8SNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
67*37748cd8SNickeau     */
68*37748cd8SNickeau    function getAllowedTypes()
69*37748cd8SNickeau    {
70*37748cd8SNickeau        return array();
71*37748cd8SNickeau    }
72*37748cd8SNickeau
73*37748cd8SNickeau    function getSort()
74*37748cd8SNickeau    {
75*37748cd8SNickeau        return 201;
76*37748cd8SNickeau    }
77*37748cd8SNickeau
78*37748cd8SNickeau    public function accepts($mode)
79*37748cd8SNickeau    {
80*37748cd8SNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
81*37748cd8SNickeau    }
82*37748cd8SNickeau
83*37748cd8SNickeau
84*37748cd8SNickeau    function connectTo($mode)
85*37748cd8SNickeau    {
86*37748cd8SNickeau        /**
87*37748cd8SNickeau         * Only in iterator
88*37748cd8SNickeau         */
89*37748cd8SNickeau        if ($mode == PluginUtility::getModeFromTag(syntax_plugin_combo_iterator::TAG)) {
90*37748cd8SNickeau
91*37748cd8SNickeau            $pattern = PluginUtility::getContainerTagPattern(self::MARKI_PAGE_TAG);
92*37748cd8SNickeau            $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
93*37748cd8SNickeau
94*37748cd8SNickeau        }
95*37748cd8SNickeau
96*37748cd8SNickeau    }
97*37748cd8SNickeau
98*37748cd8SNickeau
99*37748cd8SNickeau    public function postConnect()
100*37748cd8SNickeau    {
101*37748cd8SNickeau
102*37748cd8SNickeau        $this->Lexer->addExitPattern('</' . self::MARKI_PAGE_TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent()));
103*37748cd8SNickeau
104*37748cd8SNickeau
105*37748cd8SNickeau    }
106*37748cd8SNickeau
107*37748cd8SNickeau
108*37748cd8SNickeau    /**
109*37748cd8SNickeau     *
110*37748cd8SNickeau     * The handle function goal is to parse the matched syntax through the pattern function
111*37748cd8SNickeau     * and to return the result for use in the renderer
112*37748cd8SNickeau     * This result is always cached until the page is modified.
113*37748cd8SNickeau     * @param string $match
114*37748cd8SNickeau     * @param int $state
115*37748cd8SNickeau     * @param int $pos - byte position in the original source file
116*37748cd8SNickeau     * @param Doku_Handler $handler
117*37748cd8SNickeau     * @return array|bool
118*37748cd8SNickeau     * @throws Exception
119*37748cd8SNickeau     * @see DokuWiki_Syntax_Plugin::handle()
120*37748cd8SNickeau     *
121*37748cd8SNickeau     */
122*37748cd8SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
123*37748cd8SNickeau    {
124*37748cd8SNickeau
125*37748cd8SNickeau        switch ($state) {
126*37748cd8SNickeau
127*37748cd8SNickeau            case DOKU_LEXER_ENTER :
128*37748cd8SNickeau                $attributes = PluginUtility::getTagAttributes($match);
129*37748cd8SNickeau                return array(
130*37748cd8SNickeau                    PluginUtility::STATE => $state,
131*37748cd8SNickeau                    PluginUtility::ATTRIBUTES => $attributes
132*37748cd8SNickeau                );
133*37748cd8SNickeau
134*37748cd8SNickeau            case DOKU_LEXER_UNMATCHED :
135*37748cd8SNickeau
136*37748cd8SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
137*37748cd8SNickeau
138*37748cd8SNickeau
139*37748cd8SNickeau            case DOKU_LEXER_EXIT :
140*37748cd8SNickeau
141*37748cd8SNickeau
142*37748cd8SNickeau                return array(
143*37748cd8SNickeau                    PluginUtility::STATE => $state,
144*37748cd8SNickeau                );
145*37748cd8SNickeau
146*37748cd8SNickeau
147*37748cd8SNickeau        }
148*37748cd8SNickeau        return array();
149*37748cd8SNickeau
150*37748cd8SNickeau    }
151*37748cd8SNickeau
152*37748cd8SNickeau    /**
153*37748cd8SNickeau     * Render the output
154*37748cd8SNickeau     * @param string $format
155*37748cd8SNickeau     * @param Doku_Renderer $renderer
156*37748cd8SNickeau     * @param array $data - what the function handle() return'ed
157*37748cd8SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
158*37748cd8SNickeau     * @see DokuWiki_Syntax_Plugin::render()
159*37748cd8SNickeau     *
160*37748cd8SNickeau     *
161*37748cd8SNickeau     */
162*37748cd8SNickeau    function render($format, Doku_Renderer $renderer, $data)
163*37748cd8SNickeau    {
164*37748cd8SNickeau
165*37748cd8SNickeau        /**
166*37748cd8SNickeau         * No render, the data is used by {@link syntax_plugin_combo_iterator::handle()}
167*37748cd8SNickeau         * at the {@link DOKU_LEXER_EXIT}
168*37748cd8SNickeau         */
169*37748cd8SNickeau        return true;
170*37748cd8SNickeau
171*37748cd8SNickeau    }
172*37748cd8SNickeau
173*37748cd8SNickeau
174*37748cd8SNickeau}
175*37748cd8SNickeau
176