xref: /plugin/combo/syntax/header.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1007225e5Sgerardnico<?php
2007225e5Sgerardnico
3007225e5Sgerardnico
4*04fd306cSNickeauuse ComboStrap\BlockquoteTag;
5*04fd306cSNickeauuse ComboStrap\CallStack;
6*04fd306cSNickeauuse ComboStrap\CardTag;
7007225e5Sgerardnicouse ComboStrap\PluginUtility;
821913ab3SNickeauuse ComboStrap\TagAttributes;
9*04fd306cSNickeauuse ComboStrap\XmlTagProcessing;
10007225e5Sgerardnico
11007225e5Sgerardnico
12*04fd306cSNickeau/**
13*04fd306cSNickeau * An header may be:
14*04fd306cSNickeau *   * A outline section header
15*04fd306cSNickeau *   * The header of a card ...
16*04fd306cSNickeau */
17007225e5Sgerardnicoclass syntax_plugin_combo_header extends DokuWiki_Syntax_Plugin
18007225e5Sgerardnico{
19007225e5Sgerardnico
20007225e5Sgerardnico
2121913ab3SNickeau    const TAG = "header";
2221913ab3SNickeau
23*04fd306cSNickeau    function getType(): string
24007225e5Sgerardnico    {
25*04fd306cSNickeau        return 'container';
26007225e5Sgerardnico    }
27007225e5Sgerardnico
28007225e5Sgerardnico    /**
29007225e5Sgerardnico     * How Dokuwiki will add P element
30007225e5Sgerardnico     *
31007225e5Sgerardnico     *  * 'normal' - The plugin can be used inside paragraphs (inline)
32007225e5Sgerardnico     *  * 'block'  - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs
33007225e5Sgerardnico     *  * 'stack'  - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs
34007225e5Sgerardnico     *
35007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::getPType()
36007225e5Sgerardnico     */
37*04fd306cSNickeau    function getPType(): string
38007225e5Sgerardnico    {
39*04fd306cSNickeau        // block because we don't want any `p` created inside by dokuwiki, otherwise the card-header is not happy
4021913ab3SNickeau        return 'block';
41007225e5Sgerardnico    }
42007225e5Sgerardnico
43*04fd306cSNickeau    function getAllowedTypes(): array
44007225e5Sgerardnico    {
45007225e5Sgerardnico        return array('substition', 'formatting', 'disabled');
46007225e5Sgerardnico    }
47007225e5Sgerardnico
48007225e5Sgerardnico    function getSort()
49007225e5Sgerardnico    {
50007225e5Sgerardnico        return 201;
51007225e5Sgerardnico    }
52007225e5Sgerardnico
53007225e5Sgerardnico
54007225e5Sgerardnico    function connectTo($mode)
55007225e5Sgerardnico    {
56007225e5Sgerardnico
57*04fd306cSNickeau        $this->Lexer->addEntryPattern(XmlTagProcessing::getContainerTagPattern(self::TAG), $mode, PluginUtility::getModeFromTag($this->getPluginComponent()));
58007225e5Sgerardnico    }
59007225e5Sgerardnico
60007225e5Sgerardnico    public function postConnect()
61007225e5Sgerardnico    {
62*04fd306cSNickeau        $this->Lexer->addExitPattern('</' . self::TAG . '>', PluginUtility::getModeFromTag($this->getPluginComponent()));
63007225e5Sgerardnico    }
64007225e5Sgerardnico
65*04fd306cSNickeau    function handle($match, $state, $pos, Doku_Handler $handler): array
66007225e5Sgerardnico    {
67007225e5Sgerardnico
68007225e5Sgerardnico        switch ($state) {
69007225e5Sgerardnico
70007225e5Sgerardnico            case DOKU_LEXER_ENTER:
71007225e5Sgerardnico                $tagAttributes = PluginUtility::getTagAttributes($match);
72*04fd306cSNickeau                $callStack = CallStack::createFromHandler($handler);
73*04fd306cSNickeau                $parent = $callStack->moveToParent();
74007225e5Sgerardnico                $parentName = "";
75*04fd306cSNickeau                if ($parent !== false) {
76*04fd306cSNickeau                    $parentName = $parent->getTagName();
77007225e5Sgerardnico                }
78007225e5Sgerardnico                return array(
79007225e5Sgerardnico                    PluginUtility::STATE => $state,
80007225e5Sgerardnico                    PluginUtility::ATTRIBUTES => $tagAttributes,
815f891b7eSNickeau                    PluginUtility::CONTEXT => $parentName
82007225e5Sgerardnico                );
83007225e5Sgerardnico
84007225e5Sgerardnico            case DOKU_LEXER_UNMATCHED :
85007225e5Sgerardnico                return array(
86007225e5Sgerardnico                    PluginUtility::STATE => $state,
87007225e5Sgerardnico                    PluginUtility::PAYLOAD => $match);
88007225e5Sgerardnico
89007225e5Sgerardnico            case DOKU_LEXER_EXIT :
90*04fd306cSNickeau                $callStack = CallStack::createFromHandler($handler);
91*04fd306cSNickeau                $openingCall = $callStack->moveToPreviousCorrespondingOpeningCall();
92007225e5Sgerardnico                return array(
93*04fd306cSNickeau                    PluginUtility::STATE => $state,
94*04fd306cSNickeau                    PluginUtility::CONTEXT => $openingCall->getContext()
95007225e5Sgerardnico                );
96007225e5Sgerardnico
97007225e5Sgerardnico
98007225e5Sgerardnico        }
99007225e5Sgerardnico        return array();
100007225e5Sgerardnico
101007225e5Sgerardnico    }
102007225e5Sgerardnico
103007225e5Sgerardnico    /**
104007225e5Sgerardnico     * Render the output
105007225e5Sgerardnico     * @param string $format
106007225e5Sgerardnico     * @param Doku_Renderer $renderer
107007225e5Sgerardnico     * @param array $data - what the function handle() return'ed
108007225e5Sgerardnico     * @return boolean - rendered correctly? (however, returned value is not used at the moment)
109007225e5Sgerardnico     * @see DokuWiki_Syntax_Plugin::render()
110007225e5Sgerardnico     *
111007225e5Sgerardnico     *
112007225e5Sgerardnico     */
113*04fd306cSNickeau    function render($format, Doku_Renderer $renderer, $data): bool
114007225e5Sgerardnico    {
115007225e5Sgerardnico
116*04fd306cSNickeau        if ($format === 'xhtml') {
117007225e5Sgerardnico
118007225e5Sgerardnico            /** @var Doku_Renderer_xhtml $renderer */
119007225e5Sgerardnico            $state = $data[PluginUtility::STATE];
120007225e5Sgerardnico            switch ($state) {
121007225e5Sgerardnico
122007225e5Sgerardnico                case DOKU_LEXER_ENTER:
1235f891b7eSNickeau                    $parent = $data[PluginUtility::CONTEXT];
12421913ab3SNickeau                    $tagAttributes = TagAttributes::createFromCallStackArray($data[PluginUtility::ATTRIBUTES]);
125*04fd306cSNickeau                    switch ($parent) {
126*04fd306cSNickeau                        case BlockquoteTag::TAG:
127*04fd306cSNickeau                        case CardTag::CARD_TAG:
12821913ab3SNickeau                            $tagAttributes->addClassName("card-header");
12921913ab3SNickeau                            $renderer->doc .= $tagAttributes->toHtmlEnterTag("div");
130007225e5Sgerardnico                            break;
131*04fd306cSNickeau                        default:
132*04fd306cSNickeau                            $renderer->doc .= $tagAttributes
133*04fd306cSNickeau                                ->setLogicalTag(self::TAG)
134*04fd306cSNickeau                                ->toHtmlEnterTag("header");
135*04fd306cSNickeau                            break;
136007225e5Sgerardnico                    }
137007225e5Sgerardnico                    break;
138007225e5Sgerardnico
139007225e5Sgerardnico                case DOKU_LEXER_UNMATCHED :
14032b85071SNickeau                    $renderer->doc .= PluginUtility::renderUnmatched($data);
141007225e5Sgerardnico                    break;
142007225e5Sgerardnico
143007225e5Sgerardnico                case DOKU_LEXER_EXIT:
144*04fd306cSNickeau                    $parent = $data[PluginUtility::CONTEXT];
145*04fd306cSNickeau                    switch ($parent) {
146*04fd306cSNickeau                        case BlockquoteTag::TAG:
147*04fd306cSNickeau                        case CardTag::CARD_TAG:
148*04fd306cSNickeau                            $renderer->doc .= "</div>";
149*04fd306cSNickeau                            break;
150*04fd306cSNickeau                        default:
151*04fd306cSNickeau                            $renderer->doc .= "</header>";
152*04fd306cSNickeau                            break;
153*04fd306cSNickeau                    }
154007225e5Sgerardnico                    break;
155007225e5Sgerardnico
156007225e5Sgerardnico
157007225e5Sgerardnico            }
158007225e5Sgerardnico        }
159007225e5Sgerardnico        // unsupported $mode
160007225e5Sgerardnico        return false;
161007225e5Sgerardnico    }
162007225e5Sgerardnico
163007225e5Sgerardnico
164007225e5Sgerardnico}
165007225e5Sgerardnico
166