xref: /plugin/combo/syntax/backgrounds.php (revision 21913ab3235d516e2fa19c7e3929b555b3a2bda1) !
1*21913ab3SNickeau<?php
2*21913ab3SNickeau
3*21913ab3SNickeau
4*21913ab3SNickeau// must be run within Dokuwiki
5*21913ab3SNickeauuse ComboStrap\Background;
6*21913ab3SNickeauuse ComboStrap\InternalMediaLink;
7*21913ab3SNickeauuse ComboStrap\PluginUtility;
8*21913ab3SNickeauuse ComboStrap\Tag;
9*21913ab3SNickeauuse ComboStrap\TagAttributes;
10*21913ab3SNickeau
11*21913ab3SNickeauif (!defined('DOKU_INC')) die();
12*21913ab3SNickeau
13*21913ab3SNickeau/**
14*21913ab3SNickeau *
15*21913ab3SNickeau * backgrounds is an element that holds more than one background
16*21913ab3SNickeau * We can set then parallax effect for instance
17*21913ab3SNickeau *
18*21913ab3SNickeau */
19*21913ab3SNickeauclass syntax_plugin_combo_backgrounds extends DokuWiki_Syntax_Plugin
20*21913ab3SNickeau{
21*21913ab3SNickeau
22*21913ab3SNickeau    const TAG = "backgrounds";
23*21913ab3SNickeau
24*21913ab3SNickeau
25*21913ab3SNickeau    /**
26*21913ab3SNickeau     * Syntax Type.
27*21913ab3SNickeau     *
28*21913ab3SNickeau     * Needs to return one of the mode types defined in $PARSER_MODES in parser.php
29*21913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::getType()
30*21913ab3SNickeau     */
31*21913ab3SNickeau    function getType()
32*21913ab3SNickeau    {
33*21913ab3SNickeau        return 'container';
34*21913ab3SNickeau    }
35*21913ab3SNickeau
36*21913ab3SNickeau    /**
37*21913ab3SNickeau     * How Dokuwiki will add P element
38*21913ab3SNickeau     *
39*21913ab3SNickeau     * * 'normal' - The plugin can be used inside paragraphs
40*21913ab3SNickeau     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
41*21913ab3SNickeau     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
42*21913ab3SNickeau     *
43*21913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::getPType()
44*21913ab3SNickeau     */
45*21913ab3SNickeau    function getPType()
46*21913ab3SNickeau    {
47*21913ab3SNickeau        /**
48*21913ab3SNickeau         * normal (and not block) is important to not create p_open calls
49*21913ab3SNickeau         */
50*21913ab3SNickeau        return 'normal';
51*21913ab3SNickeau    }
52*21913ab3SNickeau
53*21913ab3SNickeau    /**
54*21913ab3SNickeau     * @return array
55*21913ab3SNickeau     * Allow which kind of plugin inside
56*21913ab3SNickeau     *
57*21913ab3SNickeau     * Array('baseonly','container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs')
58*21913ab3SNickeau     *
59*21913ab3SNickeau     * Return an array of one or more of the mode types {@link $PARSER_MODES} in Parser.php
60*21913ab3SNickeau     */
61*21913ab3SNickeau    function getAllowedTypes()
62*21913ab3SNickeau    {
63*21913ab3SNickeau        return array('baseonly', 'container', 'formatting', 'substition', 'protected', 'disabled', 'paragraphs');
64*21913ab3SNickeau    }
65*21913ab3SNickeau
66*21913ab3SNickeau    public function accepts($mode)
67*21913ab3SNickeau    {
68*21913ab3SNickeau
69*21913ab3SNickeau        return syntax_plugin_combo_preformatted::disablePreformatted($mode);
70*21913ab3SNickeau
71*21913ab3SNickeau    }
72*21913ab3SNickeau
73*21913ab3SNickeau    function getSort()
74*21913ab3SNickeau    {
75*21913ab3SNickeau        return 201;
76*21913ab3SNickeau    }
77*21913ab3SNickeau
78*21913ab3SNickeau
79*21913ab3SNickeau    function connectTo($mode)
80*21913ab3SNickeau    {
81*21913ab3SNickeau
82*21913ab3SNickeau        $pattern = PluginUtility::getContainerTagPattern(self::TAG);
83*21913ab3SNickeau        $this->Lexer->addEntryPattern($pattern, $mode, PluginUtility::getModeForComponent($this->getPluginComponent()));
84*21913ab3SNickeau
85*21913ab3SNickeau    }
86*21913ab3SNickeau
87*21913ab3SNickeau
88*21913ab3SNickeau    function postConnect()
89*21913ab3SNickeau    {
90*21913ab3SNickeau
91*21913ab3SNickeau        $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeForComponent($this->getPluginComponent()));
92*21913ab3SNickeau
93*21913ab3SNickeau
94*21913ab3SNickeau    }
95*21913ab3SNickeau
96*21913ab3SNickeau    function handle($match, $state, $pos, Doku_Handler $handler)
97*21913ab3SNickeau    {
98*21913ab3SNickeau
99*21913ab3SNickeau        switch ($state) {
100*21913ab3SNickeau
101*21913ab3SNickeau            case DOKU_LEXER_ENTER :
102*21913ab3SNickeau                $tagAttributes = TagAttributes::createFromTagMatch($match);
103*21913ab3SNickeau                return array(
104*21913ab3SNickeau                    PluginUtility::STATE => $state,
105*21913ab3SNickeau                    PluginUtility::ATTRIBUTES => $tagAttributes->toCallStackArray()
106*21913ab3SNickeau                );
107*21913ab3SNickeau
108*21913ab3SNickeau            case DOKU_LEXER_UNMATCHED :
109*21913ab3SNickeau                /**
110*21913ab3SNickeau                 * We should not have anything here
111*21913ab3SNickeau                 * but in any case, we send the data for feedback
112*21913ab3SNickeau                 */
113*21913ab3SNickeau                return PluginUtility::handleAndReturnUnmatchedData(self::TAG, $match, $handler);
114*21913ab3SNickeau
115*21913ab3SNickeau            case DOKU_LEXER_EXIT :
116*21913ab3SNickeau
117*21913ab3SNickeau                /**
118*21913ab3SNickeau                 * Return state to keep the call stack structure
119*21913ab3SNickeau                 * and print the closing tag
120*21913ab3SNickeau                 */
121*21913ab3SNickeau                return array(
122*21913ab3SNickeau                    PluginUtility::STATE => $state
123*21913ab3SNickeau                );
124*21913ab3SNickeau
125*21913ab3SNickeau
126*21913ab3SNickeau        }
127*21913ab3SNickeau        return array();
128*21913ab3SNickeau
129*21913ab3SNickeau    }
130*21913ab3SNickeau
131*21913ab3SNickeau    /**
132*21913ab3SNickeau     * Render the output
133*21913ab3SNickeau     * @param string $format
134*21913ab3SNickeau     * @param Doku_Renderer $renderer
135*21913ab3SNickeau     * @param array $data - what the function handle() return'ed
136*21913ab3SNickeau     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
137*21913ab3SNickeau     * @see DokuWiki_Syntax_Plugin::render()
138*21913ab3SNickeau     *
139*21913ab3SNickeau     *
140*21913ab3SNickeau     */
141*21913ab3SNickeau    function render($format, Doku_Renderer $renderer, $data)
142*21913ab3SNickeau    {
143*21913ab3SNickeau        if ($format == 'xhtml') {
144*21913ab3SNickeau
145*21913ab3SNickeau            /** @var Doku_Renderer_xhtml $renderer */
146*21913ab3SNickeau            $state = $data[PluginUtility::STATE];
147*21913ab3SNickeau            switch ($state) {
148*21913ab3SNickeau
149*21913ab3SNickeau                case DOKU_LEXER_ENTER:
150*21913ab3SNickeau                    $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]);
151*21913ab3SNickeau                    $tagAttributes->addClassName(self::TAG);
152*21913ab3SNickeau                    $renderer->doc .= $tagAttributes->toHtmlEnterTag("div");
153*21913ab3SNickeau                    break;
154*21913ab3SNickeau                case DOKU_LEXER_EXIT:
155*21913ab3SNickeau                    $renderer->doc .= "</div>";
156*21913ab3SNickeau                    break;
157*21913ab3SNickeau                case DOKU_LEXER_UNMATCHED:
158*21913ab3SNickeau                    /**
159*21913ab3SNickeau                     * In case anyone put text where it should not
160*21913ab3SNickeau                     */
161*21913ab3SNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
162*21913ab3SNickeau                    break;
163*21913ab3SNickeau
164*21913ab3SNickeau            }
165*21913ab3SNickeau            return true;
166*21913ab3SNickeau        }
167*21913ab3SNickeau
168*21913ab3SNickeau        // unsupported $mode
169*21913ab3SNickeau        return false;
170*21913ab3SNickeau    }
171*21913ab3SNickeau
172*21913ab3SNickeau
173*21913ab3SNickeau}
174*21913ab3SNickeau
175