xref: /template/strap/syntax/contentlistitem.php (revision 9337a630db122fdba0294f47d72bdf5433c2bf10)
1*9337a630SNickeau<?php
2*9337a630SNickeau
3*9337a630SNickeau
4*9337a630SNickeauuse ComboStrap\PluginUtility;
5*9337a630SNickeauuse ComboStrap\TagAttributes;
6*9337a630SNickeau
7*9337a630SNickeau
8*9337a630SNickeau/**
9*9337a630SNickeau * Class syntax_plugin_combo_list
10*9337a630SNickeau * Implementation of a list
11*9337a630SNickeau *
12*9337a630SNickeau * This component is not not public
13*9337a630SNickeau *
14*9337a630SNickeau */
15*9337a630SNickeauclass syntax_plugin_combo_contentlistitem extends DokuWiki_Syntax_Plugin
16*9337a630SNickeau{
17*9337a630SNickeau
18*9337a630SNickeau    const DOKU_TAG = "contentlistitem";
19*9337a630SNickeau    const MARKI_TAG = "content-list-item";
20*9337a630SNickeau    const ALL_TAGS = array(self::MARKI_TAG, "list-item", "li");
21*9337a630SNickeau
22*9337a630SNickeau
23*9337a630SNickeau
24*9337a630SNickeau    /**
25*9337a630SNickeau     * Syntax Type.
26*9337a630SNickeau     *
27*9337a630SNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
28*9337a630SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#syntax_types
29*9337a630SNickeau     * @see DokuWiki_Syntax_Plugin::getType()
30*9337a630SNickeau     */
31*9337a630SNickeau    function getType()
32*9337a630SNickeau    {
33*9337a630SNickeau        return 'container';
34*9337a630SNickeau    }
35*9337a630SNickeau
36*9337a630SNickeau    /**
37*9337a630SNickeau     * How Dokuwiki will add P element
38*9337a630SNickeau     *
39*9337a630SNickeau     *  * 'normal' - The plugin can be used inside paragraphs (inline or inside)
40*9337a630SNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output (box) - block should not be inside paragraphs
41*9337a630SNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
42*9337a630SNickeau     *
43*9337a630SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
44*9337a630SNickeau     * @see https://www.dokuwiki.org/devel:syntax_plugins#ptype
45*9337a630SNickeau     */
46*9337a630SNickeau    function getPType()
47*9337a630SNickeau    {
48*9337a630SNickeau        /**
49*9337a630SNickeau         * No paragraph inside, this is a layout
50*9337a630SNickeau         */
51*9337a630SNickeau        return 'block';
52*9337a630SNickeau    }
53*9337a630SNickeau
54*9337a630SNickeau    public function accepts($mode)
55*9337a630SNickeau    {
56*9337a630SNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
57*9337a630SNickeau    }
58*9337a630SNickeau
59*9337a630SNickeau
60*9337a630SNickeau    /**
61*9337a630SNickeau     * @return array
62*9337a630SNickeau     * Allow which kind of plugin inside
63*9337a630SNickeau     *
64*9337a630SNickeau     * No one of array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
65*9337a630SNickeau     * because we manage self the content and we call self the parser
66*9337a630SNickeau     *
67*9337a630SNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
68*9337a630SNickeau     */
69*9337a630SNickeau    function getAllowedTypes()
70*9337a630SNickeau    {
71*9337a630SNickeau        return array('container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
72*9337a630SNickeau    }
73*9337a630SNickeau
74*9337a630SNickeau    /**
75*9337a630SNickeau     * @see Doku_Parser_Mode::getSort()
76*9337a630SNickeau     * the mode with the lowest sort number will win out
77*9337a630SNickeau     * Higher than {@link syntax_plugin_combo_contentlist}
78*9337a630SNickeau     * but less than {@link syntax_plugin_combo_preformatted}
79*9337a630SNickeau     */
80*9337a630SNickeau    function getSort()
81*9337a630SNickeau    {
82*9337a630SNickeau        return 18;
83*9337a630SNickeau    }
84*9337a630SNickeau
85*9337a630SNickeau
86*9337a630SNickeau    function connectTo($mode)
87*9337a630SNickeau    {
88*9337a630SNickeau
89*9337a630SNickeau        /**
90*9337a630SNickeau         * This is now know as `row`
91*9337a630SNickeau         * This is the old tags
92*9337a630SNickeau         */
93*9337a630SNickeau        foreach (self::ALL_TAGS as $tag) {
94*9337a630SNickeau            $pattern = PluginUtility::getContainerTagPattern($tag);
95*9337a630SNickeau            $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
96*9337a630SNickeau        }
97*9337a630SNickeau
98*9337a630SNickeau
99*9337a630SNickeau    }
100*9337a630SNickeau
101*9337a630SNickeau    public function postConnect()
102*9337a630SNickeau    {
103*9337a630SNickeau        foreach (self::ALL_TAGS as $tag) {
104*9337a630SNickeau            $this->Lexer->addExitPattern('</' . $tag . '>', PluginUtility::getModeFromTag($this->getPluginComponent()));
105*9337a630SNickeau        }
106*9337a630SNickeau
107*9337a630SNickeau    }
108*9337a630SNickeau
109*9337a630SNickeau
110*9337a630SNickeau    /**
111*9337a630SNickeau     *
112*9337a630SNickeau     * The handle function goal is to parse the matched syntax through the pattern function
113*9337a630SNickeau     * and to return the result for use in the renderer
114*9337a630SNickeau     * This result is always cached until the page is modified.
115*9337a630SNickeau     * @param string $match
116*9337a630SNickeau     * @param int $state
117*9337a630SNickeau     * @param int $pos - byte position in the original source file
118*9337a630SNickeau     * @param Doku_Handler $handler
119*9337a630SNickeau     * @return array|bool
120*9337a630SNickeau     * @see DokuWiki_Syntax_Plugin::handle()
121*9337a630SNickeau     *
122*9337a630SNickeau     */
123*9337a630SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
124*9337a630SNickeau    {
125*9337a630SNickeau
126*9337a630SNickeau        switch ($state) {
127*9337a630SNickeau
128*9337a630SNickeau            case DOKU_LEXER_ENTER :
129*9337a630SNickeau
130*9337a630SNickeau                $attributes = TagAttributes::createFromTagMatch($match);
131*9337a630SNickeau                $tag = PluginUtility::getTag($match);
132*9337a630SNickeau                return array(
133*9337a630SNickeau                    PluginUtility::STATE => $state,
134*9337a630SNickeau                    PluginUtility::ATTRIBUTES => $attributes->toCallStackArray(),
135*9337a630SNickeau                    PluginUtility::PAYLOAD=>$tag
136*9337a630SNickeau                );
137*9337a630SNickeau
138*9337a630SNickeau            case DOKU_LEXER_UNMATCHED :
139*9337a630SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::DOKU_TAG, $match, $handler);
140*9337a630SNickeau
141*9337a630SNickeau            case DOKU_LEXER_EXIT :
142*9337a630SNickeau
143*9337a630SNickeau                return array(
144*9337a630SNickeau                    PluginUtility::STATE => $state
145*9337a630SNickeau                );
146*9337a630SNickeau
147*9337a630SNickeau
148*9337a630SNickeau        }
149*9337a630SNickeau        return array();
150*9337a630SNickeau
151*9337a630SNickeau    }
152*9337a630SNickeau
153*9337a630SNickeau    /**
154*9337a630SNickeau     * Render the output
155*9337a630SNickeau     * @param string $format
156*9337a630SNickeau     * @param Doku_Renderer $renderer
157*9337a630SNickeau     * @param array $data - what the function handle() return'ed
158*9337a630SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
159*9337a630SNickeau     * @see DokuWiki_Syntax_Plugin::render()
160*9337a630SNickeau     *
161*9337a630SNickeau     *
162*9337a630SNickeau     */
163*9337a630SNickeau    function render($format, Doku_Renderer $renderer, $data)
164*9337a630SNickeau    {
165*9337a630SNickeau
166*9337a630SNickeau        /**
167*9337a630SNickeau         * The normal flow is that the `row` in a content
168*9337a630SNickeau         * list are transformed to `content-list-item` in the {@link DOKU_LEXER_EXIT} state
169*9337a630SNickeau         * of {@link syntax_plugin_combo_contentlist::handle()}
170*9337a630SNickeau         *
171*9337a630SNickeau         */
172*9337a630SNickeau        if ($format == 'xhtml') {
173*9337a630SNickeau
174*9337a630SNickeau            /** @var Doku_Renderer_xhtml $renderer */
175*9337a630SNickeau            $state = $data[PluginUtility::STATE];
176*9337a630SNickeau            switch ($state) {
177*9337a630SNickeau                case DOKU_LEXER_ENTER :
178*9337a630SNickeau                    $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES], self::MARKI_TAG);
179*9337a630SNickeau                    $tagAttributes->addClassName("list-group-item");
180*9337a630SNickeau                    $renderer->doc .= $tagAttributes->toHtmlEnterTag("li");
181*9337a630SNickeau                    break;
182*9337a630SNickeau                case DOKU_LEXER_EXIT :
183*9337a630SNickeau                    $renderer->doc .= "</li>" . DOKU_LF;
184*9337a630SNickeau                    break;
185*9337a630SNickeau                case DOKU_LEXER_UNMATCHED :
186*9337a630SNickeau                    $render = PluginUtility::renderUnmatched($data);
187*9337a630SNickeau                    if (!empty($render)) {
188*9337a630SNickeau                        $renderer->doc .= "<span>" . $render . '</span>';
189*9337a630SNickeau                    }
190*9337a630SNickeau                    break;
191*9337a630SNickeau            }
192*9337a630SNickeau            return true;
193*9337a630SNickeau        }
194*9337a630SNickeau
195*9337a630SNickeau        // unsupported $mode
196*9337a630SNickeau        return false;
197*9337a630SNickeau    }
198*9337a630SNickeau
199*9337a630SNickeau
200*9337a630SNickeau}
201*9337a630SNickeau
202