xref: /plugin/combo/ComboStrap/XmlTagProcessing.php (revision 81f56eb90da55cece29ce129c7b54b0ac748dc2d)
104fd306cSNickeau<?php
204fd306cSNickeau
304fd306cSNickeaunamespace ComboStrap;
404fd306cSNickeau
504fd306cSNickeau
604fd306cSNickeauuse ComboStrap\Tag\AdTag;
704fd306cSNickeauuse ComboStrap\Tag\BackgroundTag;
804fd306cSNickeauuse ComboStrap\Tag\BarTag;
904fd306cSNickeauuse ComboStrap\Tag\BoxTag;
1004fd306cSNickeauuse ComboStrap\Tag\FollowTag;
1104fd306cSNickeauuse ComboStrap\Tag\MermaidTag;
1204fd306cSNickeauuse ComboStrap\Tag\RelatedTag;
1304fd306cSNickeauuse ComboStrap\Tag\ShareTag;
1404fd306cSNickeauuse ComboStrap\Tag\SubscribeTag;
1504fd306cSNickeauuse ComboStrap\Tag\TableTag;
1604fd306cSNickeauuse ComboStrap\Tag\WebCodeTag;
1704fd306cSNickeauuse ComboStrap\TagAttribute\Hero;
1804fd306cSNickeauuse Doku_Handler;
1904fd306cSNickeauuse Doku_Renderer;
2004fd306cSNickeauuse Doku_Renderer_metadata;
2104fd306cSNickeauuse Doku_Renderer_xhtml;
2204fd306cSNickeauuse DokuWiki_Syntax_Plugin;
2304fd306cSNickeauuse renderer_plugin_combo_analytics;
2404fd306cSNickeauuse renderer_plugin_combo_xml;
2504fd306cSNickeauuse syntax_plugin_combo_code;
2604fd306cSNickeau
2704fd306cSNickeau
2804fd306cSNickeauclass XmlTagProcessing
2904fd306cSNickeau{
3004fd306cSNickeau
3104fd306cSNickeau
3204fd306cSNickeau    /**
3304fd306cSNickeau     * The start tag pattern does not allow > or /
3404fd306cSNickeau     * in the data to not compete with the empty tag pattern (ie <empty/>
35912bb8fdSgerardnico     *
36912bb8fdSgerardnico     * No numbers to not have a greater than `<1200` as tag
3704fd306cSNickeau     */
38912bb8fdSgerardnico    public const START_TAG_PATTERN = '<[A-Za-z-]+[^/><]*>';
3904fd306cSNickeau
4004fd306cSNickeau
4104fd306cSNickeau    public static function renderStaticExitXhtml(TagAttributes $tagAttributes, Doku_Renderer_xhtml $renderer, array $data, DokuWiki_Syntax_Plugin $plugin): bool
4204fd306cSNickeau    {
4304fd306cSNickeau        $logicalTag = $tagAttributes->getLogicalTag();
4404fd306cSNickeau        switch ($logicalTag) {
4504fd306cSNickeau            case BlockquoteTag::TAG:
4604fd306cSNickeau                BlockquoteTag::renderExitXhtml($tagAttributes, $renderer, $data);
4704fd306cSNickeau                return true;
4804fd306cSNickeau            case BoxTag::TAG:
4904fd306cSNickeau                $renderer->doc .= BoxTag::renderExitXhtml($tagAttributes);
5004fd306cSNickeau                return true;
5104fd306cSNickeau            case ButtonTag::LOGICAL_TAG:
5204fd306cSNickeau                $renderer->doc .= ButtonTag::renderExitXhtml($data);
5304fd306cSNickeau                return true;
5404fd306cSNickeau            case CardTag::LOGICAL_TAG:
5504fd306cSNickeau                CardTag::handleExitXhtml($data, $renderer);
5604fd306cSNickeau                return true;
5704fd306cSNickeau            case BarTag::LOGICAL_TAG:
5804fd306cSNickeau                $renderer->doc .= BarTag::renderExitXhtml($data);
5904fd306cSNickeau                return true;
6004fd306cSNickeau            case CarrouselTag::TAG:
6104fd306cSNickeau                $renderer->doc .= CarrouselTag::renderExitXhtml();
6204fd306cSNickeau                return true;
6304fd306cSNickeau            case PrismTags::CONSOLE_TAG:
6404fd306cSNickeau            case PrismTags::FILE_TAG:
6504fd306cSNickeau                PrismTags::processExitXhtml($tagAttributes, $renderer);
6604fd306cSNickeau                return true;
6704fd306cSNickeau            case ContainerTag::TAG:
6804fd306cSNickeau                $renderer->doc .= ContainerTag::renderExitXhtml();
6904fd306cSNickeau                return true;
7004fd306cSNickeau            case GridTag::LOGICAL_TAG:
7104fd306cSNickeau                $renderer->doc .= GridTag::renderExitXhtml($tagAttributes);
7204fd306cSNickeau                return true;
7304fd306cSNickeau            case PipelineTag::TAG:
7404fd306cSNickeau            case DateTag::TAG:
7504fd306cSNickeau            case PageExplorerTag::LOGICAL_TAG:
7604fd306cSNickeau            case PermalinkTag::TAG:
7704fd306cSNickeau            case IconTag::TAG:
7804fd306cSNickeau            case MermaidTag::LOGICAL_TAG:
7904fd306cSNickeau                return true;
8004fd306cSNickeau            case DropDownTag::TAG:
8104fd306cSNickeau                $renderer->doc .= DropDownTag::renderExitXhtml();
8204fd306cSNickeau                return true;
8304fd306cSNickeau            case HeadingTag::LOGICAL_TAG:
8404fd306cSNickeau                $context = $data[PluginUtility::CONTEXT];
857dbcdecdSNico                if ($context === null) {
867dbcdecdSNico                    // no idea why but with the page bundler
877dbcdecdSNico                    // this is what is expected
887dbcdecdSNico                    $context = "outline";
897dbcdecdSNico                    if (PluginUtility::isDev()) {
907dbcdecdSNico                        throw new ExceptionRuntimeInternal("The Heading context was null");
917dbcdecdSNico                    }
927dbcdecdSNico                }
9304fd306cSNickeau                $renderer->doc .= HeadingTag::renderClosingTag($tagAttributes, $context);
9404fd306cSNickeau                return true;
9504fd306cSNickeau            case NoteTag::TAG_INOTE:
9604fd306cSNickeau                $renderer->doc .= NoteTag::renderClosingInlineNote();
9704fd306cSNickeau                return true;
9804fd306cSNickeau            case JumbotronTag::TAG:
9904fd306cSNickeau                $renderer->doc .= JumbotronTag::renderExitHtml();
10004fd306cSNickeau                return true;
10104fd306cSNickeau            case MasonryTag::LOGICAL_TAG:
10204fd306cSNickeau                $renderer->doc .= MasonryTag::renderExitHtml();
10304fd306cSNickeau                return true;
10404fd306cSNickeau            case SectionTag::TAG:
10504fd306cSNickeau                $renderer->doc .= SectionTag::renderExitXhtml();
10604fd306cSNickeau                return true;
10704fd306cSNickeau            case TabsTag::TAG:
10804fd306cSNickeau                $renderer->doc .= TabsTag::renderExitXhtml($tagAttributes, $data);
10904fd306cSNickeau                return true;
11004fd306cSNickeau            case PanelTag::PANEL_LOGICAL_MARKUP:
11104fd306cSNickeau                $renderer->doc .= PanelTag::renderExitXhtml($data);
11204fd306cSNickeau                return true;
11304fd306cSNickeau            case BackgroundTag::LOGICAL_TAG:
11404fd306cSNickeau                $renderer->doc .= BackgroundTag::renderExitSpecialHtml($data);
11504fd306cSNickeau                return true;
11604fd306cSNickeau            case WebCodeTag::TAG:
11704fd306cSNickeau                $renderer->doc .= WebCodeTag::renderExit($tagAttributes, $data);
11804fd306cSNickeau                return true;
11904fd306cSNickeau            case ShareTag::MARKUP:
1208b8569b7Sgerardnico                $renderer->doc .= ShareTag::renderExit($tagAttributes);
12104fd306cSNickeau                return true;
12204fd306cSNickeau            case FollowTag::MARKUP:
12304fd306cSNickeau                $renderer->doc .= FollowTag::renderExit();
12404fd306cSNickeau                return true;
12504fd306cSNickeau            default:
126*81f56eb9SNicolas GERARD                $renderer->doc .= htmlspecialchars("</$logicalTag>", ENT_QUOTES, 'UTF-8');
127*81f56eb9SNicolas GERARD                LogUtility::warning("The exit tag (" . $logicalTag . ") is unknown and was escaped.");
12804fd306cSNickeau                return false;
12904fd306cSNickeau        }
13004fd306cSNickeau
13104fd306cSNickeau    }
13204fd306cSNickeau
13304fd306cSNickeau    /**
13404fd306cSNickeau     * Static because it handle inline and block tag
13504fd306cSNickeau     * @param string $match
13604fd306cSNickeau     * @param int $state
13704fd306cSNickeau     * @param int $pos
13804fd306cSNickeau     * @param Doku_Handler $handler
13904fd306cSNickeau     * @param DokuWiki_Syntax_Plugin $plugin
14004fd306cSNickeau     * @return array
14104fd306cSNickeau     */
14204fd306cSNickeau    public static function handleStatic(string $match, int $state, int $pos, Doku_Handler $handler, DokuWiki_Syntax_Plugin $plugin): array
14304fd306cSNickeau    {
14404fd306cSNickeau        /**
14504fd306cSNickeau         * Logical Tag Building
14604fd306cSNickeau         */
14704fd306cSNickeau        switch ($state) {
14804fd306cSNickeau
14904fd306cSNickeau            case DOKU_LEXER_ENTER:
15004fd306cSNickeau
15104fd306cSNickeau                return self::handleStaticEnter($match, $pos, $handler, $plugin);
15204fd306cSNickeau
15304fd306cSNickeau            case DOKU_LEXER_UNMATCHED :
15404fd306cSNickeau
15504fd306cSNickeau                $data = PluginUtility::handleAndReturnUnmatchedData(null, $match, $handler);
15604fd306cSNickeau                /**
15704fd306cSNickeau                 * Attribute of parent are send for context
15804fd306cSNickeau                 * (example `display = none`)
15904fd306cSNickeau                 */
16004fd306cSNickeau                $callStack = CallStack::createFromHandler($handler);
16104fd306cSNickeau                $parentTag = $callStack->moveToParent();
16204fd306cSNickeau                if ($parentTag !== false) {
16304fd306cSNickeau                    $tagAttributes = $parentTag->getAttributes();
16404fd306cSNickeau                    $data[PluginUtility::ATTRIBUTES] = $tagAttributes;
16504fd306cSNickeau                }
16604fd306cSNickeau                return $data;
16704fd306cSNickeau
16804fd306cSNickeau            case DOKU_LEXER_EXIT :
16904fd306cSNickeau
17004fd306cSNickeau                return self::handleStaticExit($match, $pos, $handler, $plugin);
17104fd306cSNickeau
17204fd306cSNickeau
17304fd306cSNickeau            default:
17404fd306cSNickeau                throw new ExceptionRuntimeInternal("Should not happen");
17504fd306cSNickeau        }
17604fd306cSNickeau    }
17704fd306cSNickeau
17804fd306cSNickeau    public static function renderStaticEnterXhtml(TagAttributes $tagAttributes, Doku_Renderer_xhtml $renderer, array $data, DokuWiki_Syntax_Plugin $plugin): bool
17904fd306cSNickeau    {
18004fd306cSNickeau
18170bbd7f1Sgerardnico        $context = $data[PluginUtility::CONTEXT] ?? null;
18270bbd7f1Sgerardnico        $pos = $data[PluginUtility::POSITION] ?? null;
18304fd306cSNickeau        $logicalTag = $tagAttributes->getLogicalTag();
18404fd306cSNickeau        switch ($logicalTag) {
18504fd306cSNickeau            case BlockquoteTag::TAG:
18604fd306cSNickeau                $renderer->doc .= BlockquoteTag::renderEnterXhtml($tagAttributes, $data, $renderer);
18704fd306cSNickeau                return true;
18804fd306cSNickeau            case BoxTag::TAG:
18904fd306cSNickeau                $renderer->doc .= BoxTag::renderEnterXhtml($tagAttributes);
19004fd306cSNickeau                return true;
19104fd306cSNickeau            case ButtonTag::LOGICAL_TAG:
19204fd306cSNickeau                $renderer->doc .= ButtonTag::renderEnterXhtml($tagAttributes, $plugin, $data);
19304fd306cSNickeau                return true;
19404fd306cSNickeau            case CardTag::LOGICAL_TAG:
19504fd306cSNickeau                $renderer->doc .= CardTag::renderEnterXhtml($tagAttributes, $renderer, $data);
19604fd306cSNickeau                return true;
19704fd306cSNickeau            case BarTag::LOGICAL_TAG:
19804fd306cSNickeau                $renderer->doc .= BarTag::renderEnterXhtml($tagAttributes, $data);
19904fd306cSNickeau                return true;
20004fd306cSNickeau            case CarrouselTag::TAG:
20104fd306cSNickeau                $renderer->doc .= CarrouselTag::renderEnterXhtml($tagAttributes, $data);
20204fd306cSNickeau                return true;
20304fd306cSNickeau            case PrismTags::CONSOLE_TAG:
20404fd306cSNickeau            case PrismTags::FILE_TAG:
20504fd306cSNickeau                PrismTags::processEnterXhtml($tagAttributes, $plugin, $renderer);
20604fd306cSNickeau                return true;
20704fd306cSNickeau            case ContainerTag::TAG:
20804fd306cSNickeau                $renderer->doc .= ContainerTag::renderEnterXhtml($tagAttributes);
20904fd306cSNickeau                return true;
21004fd306cSNickeau            case GridTag::LOGICAL_TAG:
21104fd306cSNickeau                $renderer->doc .= GridTag::renderEnterXhtml($tagAttributes);
21204fd306cSNickeau                return true;
21304fd306cSNickeau            case PipelineTag::TAG:
21404fd306cSNickeau                $renderer->doc .= PipelineTag::renderEnterXhtml($tagAttributes);
21504fd306cSNickeau                return true;
21604fd306cSNickeau            case DateTag::TAG:
21704fd306cSNickeau                $renderer->doc .= DateTag::renderHtml($tagAttributes);
21804fd306cSNickeau                return true;
21904fd306cSNickeau            case DropDownTag::TAG:
22004fd306cSNickeau                $renderer->doc .= DropDownTag::renderEnterXhtml($tagAttributes);
22104fd306cSNickeau                return true;
22204fd306cSNickeau            case HeadingTag::LOGICAL_TAG:
22304fd306cSNickeau                HeadingTag::processRenderEnterXhtml($context, $tagAttributes, $renderer, $pos);
22404fd306cSNickeau                return true;
22504fd306cSNickeau            case NoteTag::TAG_INOTE:
22604fd306cSNickeau                $renderer->doc .= NoteTag::renderEnterInlineNote($tagAttributes);
22704fd306cSNickeau                return true;
22804fd306cSNickeau            case JumbotronTag::TAG:
22904fd306cSNickeau                $renderer->doc .= JumbotronTag::renderEnterXhtml($tagAttributes);
23004fd306cSNickeau                return true;
23104fd306cSNickeau            case MasonryTag::LOGICAL_TAG:
23204fd306cSNickeau                $renderer->doc .= MasonryTag::renderEnterTag();
23304fd306cSNickeau                return true;
23404fd306cSNickeau            case PageExplorerTag::LOGICAL_TAG:
23504fd306cSNickeau                $renderer->doc .= PageExplorerTag::renderEnterTag($tagAttributes, $data);
23604fd306cSNickeau                return true;
23704fd306cSNickeau            case SectionTag::TAG:
23804fd306cSNickeau                $renderer->doc .= SectionTag::renderEnterXhtml($tagAttributes);
23904fd306cSNickeau                return true;
24004fd306cSNickeau            case TabsTag::TAG:
24104fd306cSNickeau                $renderer->doc .= TabsTag::renderEnterXhtml($tagAttributes, $data);
24204fd306cSNickeau                return true;
24304fd306cSNickeau            case PanelTag::PANEL_LOGICAL_MARKUP:
24404fd306cSNickeau                $renderer->doc .= PanelTag::renderEnterXhtml($tagAttributes, $data);
24504fd306cSNickeau                return true;
24604fd306cSNickeau            case PermalinkTag::TAG:
24704fd306cSNickeau                $renderer->doc .= PermalinkTag::renderEnterSpecialXhtml($data);
24804fd306cSNickeau                return true;
24904fd306cSNickeau            case HrTag::TAG:
25004fd306cSNickeau                $renderer->doc .= HrTag::render($tagAttributes);
25104fd306cSNickeau                return true;
25204fd306cSNickeau            case IconTag::TAG:
25304fd306cSNickeau                $renderer->doc .= IconTag::renderEnterTag($tagAttributes);
25404fd306cSNickeau                return true;
25504fd306cSNickeau            case BackgroundTag::LOGICAL_TAG:
25604fd306cSNickeau                $renderer->doc .= BackgroundTag::renderEnterTag();
25704fd306cSNickeau                return true;
25804fd306cSNickeau            case MermaidTag::LOGICAL_TAG:
25904fd306cSNickeau                $renderer->doc .= MermaidTag::renderEnter($tagAttributes);
26004fd306cSNickeau                return true;
26104fd306cSNickeau            case WebCodeTag::TAG:
26204fd306cSNickeau                return true;
26304fd306cSNickeau            case ShareTag::MARKUP:
26404fd306cSNickeau                $renderer->doc .= ShareTag::renderSpecialEnter($tagAttributes, DOKU_LEXER_ENTER);
26504fd306cSNickeau                return true;
26604fd306cSNickeau            case FollowTag::MARKUP:
26704fd306cSNickeau                $renderer->doc .= FollowTag::renderSpecialEnterNode($tagAttributes, DOKU_LEXER_ENTER);
26804fd306cSNickeau                return true;
26904fd306cSNickeau            case TableTag::TAG:
27004fd306cSNickeau                TableTag::renderEnterXhtml($tagAttributes, $renderer);
27104fd306cSNickeau                return true;
27204fd306cSNickeau            case RelatedTag::TAG:
27304fd306cSNickeau                LogUtility::warning("The related tag should be closed. You should write <related/> and not <related>.");
27404fd306cSNickeau                $renderer->doc .= RelatedTag::render($tagAttributes);
27504fd306cSNickeau                return true;
27604fd306cSNickeau            default:
277*81f56eb9SNicolas GERARD                $renderer->doc .= htmlspecialchars("<$logicalTag>", ENT_QUOTES, 'UTF-8');
278*81f56eb9SNicolas GERARD                LogUtility::warning("The enter tag (" . $logicalTag . ") is unknown and was escaped.");
27904fd306cSNickeau                return false;
28004fd306cSNickeau        }
28104fd306cSNickeau    }
28204fd306cSNickeau
28304fd306cSNickeau    public static function handleStaticEnter(string $match, int $pos, Doku_Handler $handler, DokuWiki_Syntax_Plugin $plugin): array
28404fd306cSNickeau    {
28504fd306cSNickeau        // context data
28604fd306cSNickeau        $executionContext = ExecutionContext::getActualOrCreateFromEnv();
28704fd306cSNickeau
28804fd306cSNickeau        // Normalize Trim and delete eol to start clean
28904fd306cSNickeau        $match = trim($match);
29004fd306cSNickeau        $match = str_replace("\n", " ", $match);
29104fd306cSNickeau
29204fd306cSNickeau        // Markup
29304fd306cSNickeau        $markupTag = PluginUtility::getMarkupTag($match);
29404fd306cSNickeau        $logicalTag = $markupTag;
29504fd306cSNickeau        $defaultAttributes = [];
29604fd306cSNickeau        $knownTypes = [];
29704fd306cSNickeau        $allowAnyFirstBooleanAttributesAsType = false;
29804fd306cSNickeau
29904fd306cSNickeau        // code block allow a second attribute value as file name
30004fd306cSNickeau        $hasTwoBooleanAttribute = false;
30104fd306cSNickeau        $secondBooleanAttribute = null;
30204fd306cSNickeau
30304fd306cSNickeau        switch ($markupTag) {
30404fd306cSNickeau            case BlockquoteTag::TAG:
30504fd306cSNickeau                // Suppress the component name
30604fd306cSNickeau                $defaultAttributes = array("type" => BlockquoteTag::CARD_TYPE);
30704fd306cSNickeau                $knownTypes = [BlockquoteTag::TYPO_TYPE, BlockquoteTag::CARD_TYPE];;
30804fd306cSNickeau                break;
30904fd306cSNickeau            case BoxTag::TAG:
31004fd306cSNickeau                $defaultAttributes[BoxTag::HTML_TAG_ATTRIBUTE] = BoxTag::DEFAULT_HTML_TAG;
31104fd306cSNickeau                $defaultAttributes[BoxTag::LOGICAL_TAG_ATTRIBUTE] = BoxTag::LOGICAL_TAG_DEFAUT;
31204fd306cSNickeau                break;
31304fd306cSNickeau            case ButtonTag::MARKUP_SHORT:
31404fd306cSNickeau            case ButtonTag::MARKUP_LONG:
31504fd306cSNickeau                $logicalTag = ButtonTag::LOGICAL_TAG;
31604fd306cSNickeau                $knownTypes = ButtonTag::TYPES;
31704fd306cSNickeau                $defaultAttributes = array(
31804fd306cSNickeau                    Skin::SKIN_ATTRIBUTE => Skin::FILLED_VALUE,
31904fd306cSNickeau                    TagAttributes::TYPE_KEY => ColorRgb::PRIMARY_VALUE
32004fd306cSNickeau                );
32104fd306cSNickeau                break;
32204fd306cSNickeau            case CardTag::CARD_TAG:
32304fd306cSNickeau            case CardTag::TEASER_TAG:
32404fd306cSNickeau                $logicalTag = CardTag::LOGICAL_TAG;
32504fd306cSNickeau                break;
32604fd306cSNickeau            case BarTag::BAR_TAG:
32704fd306cSNickeau            case BarTag::SLIDE_TAG:
32804fd306cSNickeau                $logicalTag = BarTag::LOGICAL_TAG;
32904fd306cSNickeau                $defaultAttributes[Hero::ATTRIBUTE] = "sm";
33004fd306cSNickeau                break;
33104fd306cSNickeau            case PrismTags::CONSOLE_TAG:
33204fd306cSNickeau            case PrismTags::FILE_TAG:
33304fd306cSNickeau                $hasTwoBooleanAttribute = true;
33404fd306cSNickeau                $secondBooleanAttribute = syntax_plugin_combo_code::FILE_PATH_KEY;
33504fd306cSNickeau                $allowAnyFirstBooleanAttributesAsType = true;
33604fd306cSNickeau                break;
33704fd306cSNickeau            case ContainerTag::TAG:
33804fd306cSNickeau                $knownTypes = ContainerTag::CONTAINER_VALUES;
33904fd306cSNickeau                $defaultAttributes[TagAttributes::TYPE_KEY] = $executionContext->getConfig()->getValue(ContainerTag::DEFAULT_LAYOUT_CONTAINER_CONF, ContainerTag::DEFAULT_LAYOUT_CONTAINER_DEFAULT_VALUE);
34004fd306cSNickeau                break;
34104fd306cSNickeau            case GridTag::ROW_TAG:
34204fd306cSNickeau            case GridTag::GRID_TAG:
34304fd306cSNickeau                $logicalTag = GridTag::LOGICAL_TAG;
34404fd306cSNickeau                $knownTypes = GridTag::KNOWN_TYPES;
34504fd306cSNickeau                break;
34604fd306cSNickeau            case HeadingTag::HEADING_TAG:
34704fd306cSNickeau            case HeadingTag::TITLE_TAG:
34804fd306cSNickeau                $logicalTag = HeadingTag::LOGICAL_TAG;
34904fd306cSNickeau                $knownTypes = HeadingTag::getAllTypes();
35004fd306cSNickeau                break;
35104fd306cSNickeau            case NoteTag::TAG_INOTE:
35204fd306cSNickeau                $defaultConfValue = $plugin->getConf(NoteTag::INOTE_CONF_DEFAULT_ATTRIBUTES_KEY);
35304fd306cSNickeau                $defaultAttributes = PluginUtility::parseAttributes($defaultConfValue);
35404fd306cSNickeau                if (!isset($defaultAttributes[TagAttributes::TYPE_KEY])) {
35504fd306cSNickeau                    $defaultAttributes[TagAttributes::TYPE_KEY] = "info";
35604fd306cSNickeau                }
35704fd306cSNickeau                $knownTypes = NoteTag::KNOWN_TYPES;
35804fd306cSNickeau                break;
35904fd306cSNickeau            case JumbotronTag::TAG:
36004fd306cSNickeau                $defaultAttributes = JumbotronTag::getDefault();
36104fd306cSNickeau                break;
36204fd306cSNickeau            case MasonryTag::CARD_COLUMNS_TAG:
36304fd306cSNickeau            case MasonryTag::TEASER_COLUMNS_TAG:
36404fd306cSNickeau            case MasonryTag::MASONRY_TAG:
36504fd306cSNickeau                $logicalTag = MasonryTag::LOGICAL_TAG;
36604fd306cSNickeau                break;
36704fd306cSNickeau            case PageExplorerTag::NTOC_MARKUP:
36804fd306cSNickeau            case PageExplorerTag::PAGE_EXPLORER_MARKUP:
36904fd306cSNickeau                $logicalTag = PageExplorerTag::LOGICAL_TAG;
37004fd306cSNickeau                $defaultAttributes = [TagAttributes::TYPE_KEY => PageExplorerTag::LIST_TYPE];
37104fd306cSNickeau                $knownTypes = [PageExplorerTag::TYPE_TREE, PageExplorerTag::LIST_TYPE];
37204fd306cSNickeau                break;
37304fd306cSNickeau            case PageExplorerTag::INDEX_HOME_TAG:
37404fd306cSNickeau            case PageExplorerTag::INDEX_TAG:
37504fd306cSNickeau                $logicalTag = PageExplorerTag::LOGICAL_INDEX_TAG;
37604fd306cSNickeau                break;
37704fd306cSNickeau            case PageExplorerTag::NAMESPACE_ITEM_TAG:
37804fd306cSNickeau            case PageExplorerTag::NAMESPACE_LONG_TAG:
37904fd306cSNickeau            case PageExplorerTag::NAMESPACE_SHORT_TAG:
38004fd306cSNickeau                $logicalTag = PageExplorerTag::NAMESPACE_LOGICAL_TAG;
38104fd306cSNickeau                break;
38204fd306cSNickeau            case PageExplorerTag::PAGE_ITEM_TAG:
38304fd306cSNickeau            case PageExplorerTag::PAGE_TAG:
38404fd306cSNickeau                $logicalTag = PageExplorerTag::PAGE_LOGICAL_TAG;
38504fd306cSNickeau                break;
38604fd306cSNickeau            case TabsTag::TAG:
38704fd306cSNickeau                $knownTypes = [TabsTag::ENCLOSED_PILLS_TYPE, TabsTag::ENCLOSED_TABS_TYPE, TabsTag::PILLS_TYPE, TabsTag::TABS_TYPE];
38804fd306cSNickeau                break;
38904fd306cSNickeau            case PanelTag::PANEL_MARKUP:
39004fd306cSNickeau            case PanelTag::TAB_PANEL_MARKUP:
39104fd306cSNickeau                $logicalTag = PanelTag::PANEL_LOGICAL_MARKUP;
39204fd306cSNickeau                break;
39304fd306cSNickeau            case PermalinkTag::TAG:
39404fd306cSNickeau                $knownTypes = PermalinkTag::getKnownTypes();
39504fd306cSNickeau                $defaultAttributes = [TagAttributes::TYPE_KEY => PermalinkTag::GENERATED_TYPE];
39604fd306cSNickeau                break;
39704fd306cSNickeau            case BackgroundTag::MARKUP_LONG:
39804fd306cSNickeau            case BackgroundTag::MARKUP_SHORT:
39904fd306cSNickeau                $logicalTag = BackgroundTag::LOGICAL_TAG;
40004fd306cSNickeau                break;
40104fd306cSNickeau            case MermaidTag::MARKUP_MERMAID:
40204fd306cSNickeau            case WebCodeTag::TAG:
40304fd306cSNickeau                $logicalTag = Tag\WebCodeTag::TAG;
40404fd306cSNickeau                $defaultAttributes = WebCodeTag::getDefaultAttributes();
40504fd306cSNickeau                break;
40604fd306cSNickeau            case MermaidTag::MARKUP_SEQUENCE_DIAGRAM:
40704fd306cSNickeau            case MermaidTag::MARKUP_CLASS_DIAGRAM:
40804fd306cSNickeau            case MermaidTag::MARKUP_FLOWCHART:
40904fd306cSNickeau            case MermaidTag::MARKUP_GANTT:
41004fd306cSNickeau            case MermaidTag::MARKUP_ERD:
41104fd306cSNickeau            case MermaidTag::MARKUP_JOURNEY:
41204fd306cSNickeau            case MermaidTag::MARKUP_PIECHART:
41304fd306cSNickeau            case MermaidTag::MARKUP_STATE_DIAGRAM:
41404fd306cSNickeau                $logicalTag = MermaidTag::LOGICAL_TAG;
41504fd306cSNickeau                break;
41604fd306cSNickeau            case ShareTag::MARKUP:
41704fd306cSNickeau                $knownTypes = ShareTag::getKnownTypes();
41804fd306cSNickeau                break;
41904fd306cSNickeau            case FollowTag::MARKUP:
42004fd306cSNickeau                $knownTypes = FollowTag::getKnownTypes();
42104fd306cSNickeau                break;
42204fd306cSNickeau        }
42304fd306cSNickeau
42404fd306cSNickeau        /**
42504fd306cSNickeau         * Build tag Attributes
42604fd306cSNickeau         */
42704fd306cSNickeau        if (!$hasTwoBooleanAttribute) {
42804fd306cSNickeau            $tagAttributes = TagAttributes::createFromTagMatch($match, $defaultAttributes, $knownTypes, $allowAnyFirstBooleanAttributesAsType);
42904fd306cSNickeau        } else {
43004fd306cSNickeau            $tagAttributes = TagAttributes::createEmpty();
43104fd306cSNickeau            $attributesArray = PluginUtility::getQualifiedTagAttributes($match, true, $secondBooleanAttribute, $knownTypes, $allowAnyFirstBooleanAttributesAsType);
43204fd306cSNickeau            foreach ($attributesArray as $key => $value) {
43304fd306cSNickeau                $tagAttributes->addComponentAttributeValue($key, $value);
43404fd306cSNickeau            }
43504fd306cSNickeau        }
43604fd306cSNickeau        $tagAttributes->setLogicalTag($logicalTag);
43704fd306cSNickeau
43804fd306cSNickeau        /**
43904fd306cSNickeau         * Calculate extra returned key in the table
44004fd306cSNickeau         */
44104fd306cSNickeau        $returnedArray = [];
44204fd306cSNickeau        switch ($logicalTag) {
44304fd306cSNickeau            case BlockquoteTag::TAG:
44404fd306cSNickeau                $returnedArray = BlockquoteTag::handleEnter($handler);
44504fd306cSNickeau                break;
44604fd306cSNickeau            case BoxTag::TAG:
44704fd306cSNickeau                BoxTag::handleEnter($tagAttributes);
44804fd306cSNickeau                break;
44904fd306cSNickeau            case ButtonTag::LOGICAL_TAG:
45004fd306cSNickeau                $returnedArray = ButtonTag::handleEnter($tagAttributes, $handler);
45104fd306cSNickeau                break;
45204fd306cSNickeau            case CardTag::CARD_TAG:
45304fd306cSNickeau                $returnedArray = CardTag::handleEnter($tagAttributes, $handler);
45404fd306cSNickeau                break;
45504fd306cSNickeau            case BarTag::LOGICAL_TAG:
45604fd306cSNickeau                $returnedArray = BarTag::handleEnter($tagAttributes);
45704fd306cSNickeau                break;
45804fd306cSNickeau            case CarrouselTag::TAG:
45904fd306cSNickeau                $returnedArray = CarrouselTag::handleEnter($handler);
46004fd306cSNickeau                break;
46104fd306cSNickeau            case GridTag::LOGICAL_TAG:
46204fd306cSNickeau                GridTag::processEnter($tagAttributes, $handler, $match);
46304fd306cSNickeau                break;
46404fd306cSNickeau            case DateTag::TAG:
46504fd306cSNickeau                DateTag::handleEnterAndSpecial();
46604fd306cSNickeau                break;
46704fd306cSNickeau            case HeadingTag::LOGICAL_TAG:
46804fd306cSNickeau                $returnedArray = HeadingTag::handleEnter($handler, $tagAttributes, $markupTag);
46904fd306cSNickeau                break;
47004fd306cSNickeau            case PanelTag::PANEL_LOGICAL_MARKUP:
47104fd306cSNickeau                $returnedArray = PanelTag::handleEnter($tagAttributes, $handler, $markupTag);
47204fd306cSNickeau                break;
47304fd306cSNickeau            case PermalinkTag::TAG:
47404fd306cSNickeau                $returnedArray = PermalinkTag::handleEnterSpecial($tagAttributes, DOKU_LEXER_ENTER, $handler);
47504fd306cSNickeau                break;
47604fd306cSNickeau            case IconTag::TAG:
47704fd306cSNickeau                $returnedArray = IconTag::handleEnter($tagAttributes, $handler);
47804fd306cSNickeau                break;
47904fd306cSNickeau            case BackgroundTag::LOGICAL_TAG:
48004fd306cSNickeau                BackgroundTag::handleEnterAndSpecial($tagAttributes);
48104fd306cSNickeau                break;
48204fd306cSNickeau        }
48304fd306cSNickeau
48404fd306cSNickeau        /**
48504fd306cSNickeau         * Common default
48604fd306cSNickeau         */
48704fd306cSNickeau        $defaultReturnedArray[PluginUtility::STATE] = DOKU_LEXER_ENTER;
48804fd306cSNickeau        $defaultReturnedArray[PluginUtility::TAG] = $logicalTag;
48904fd306cSNickeau        $defaultReturnedArray[PluginUtility::MARKUP_TAG] = $markupTag;
49004fd306cSNickeau        $defaultReturnedArray[PluginUtility::POSITION] = $pos;
49104fd306cSNickeau        $defaultReturnedArray[PluginUtility::ATTRIBUTES] = $tagAttributes->toCallStackArray();
49204fd306cSNickeau
49304fd306cSNickeau        return array_merge($defaultReturnedArray, $returnedArray);
49404fd306cSNickeau
49504fd306cSNickeau    }
49604fd306cSNickeau
49704fd306cSNickeau    public static function renderStatic(string $format, Doku_Renderer $renderer, array $data, DokuWiki_Syntax_Plugin $plugin): bool
49804fd306cSNickeau    {
49970bbd7f1Sgerardnico        $logicalTag = $data[PluginUtility::TAG] ?? null;
50070bbd7f1Sgerardnico        $attributes = $data[PluginUtility::ATTRIBUTES] ?? null;
50170bbd7f1Sgerardnico        $context = $data[PluginUtility::CONTEXT] ?? null;
50270bbd7f1Sgerardnico        $state = $data[PluginUtility::STATE] ?? null;
50370bbd7f1Sgerardnico        $pos = $data[PluginUtility::POSITION] ?? null;
50404fd306cSNickeau        $tagAttributes = TagAttributes::createFromCallStackArray($attributes)->setLogicalTag($logicalTag);
50504fd306cSNickeau        switch ($format) {
50604fd306cSNickeau            case "xhtml":
50704fd306cSNickeau                /** @var Doku_Renderer_xhtml $renderer */
50804fd306cSNickeau                switch ($state) {
50904fd306cSNickeau                    case DOKU_LEXER_ENTER:
51004fd306cSNickeau                        return self::renderStaticEnterXhtml($tagAttributes, $renderer, $data, $plugin);
51104fd306cSNickeau                    case DOKU_LEXER_UNMATCHED:
51204fd306cSNickeau
51304fd306cSNickeau                        $renderer->doc .= PluginUtility::renderUnmatched($data);
51404fd306cSNickeau                        return true;
51504fd306cSNickeau
51604fd306cSNickeau                    case DOKU_LEXER_EXIT:
51704fd306cSNickeau
51804fd306cSNickeau                        return XmlTagProcessing::renderStaticExitXhtml($tagAttributes, $renderer, $data, $plugin);
51904fd306cSNickeau                }
52004fd306cSNickeau                break;
52104fd306cSNickeau            case 'metadata':
52204fd306cSNickeau                /** @var Doku_Renderer_metadata $renderer */
52304fd306cSNickeau                if (!in_array($state, [DOKU_LEXER_ENTER, DOKU_LEXER_SPECIAL])) {
52404fd306cSNickeau                    return true;
52504fd306cSNickeau                }
52604fd306cSNickeau                return XmlTagProcessing::renderStaticEnterSpecialMetadata($tagAttributes, $renderer, $data, $plugin);
52704fd306cSNickeau            case 'xml':
52804fd306cSNickeau                /** @var renderer_plugin_combo_xml $renderer */
52904fd306cSNickeau                switch ($state) {
53004fd306cSNickeau                    case DOKU_LEXER_ENTER:
53104fd306cSNickeau                        switch ($logicalTag) {
53204fd306cSNickeau                            default:
53304fd306cSNickeau                            case BarTag::LOGICAL_TAG:
53404fd306cSNickeau                                $renderer->doc .= "<$logicalTag>";
53504fd306cSNickeau                                return true;
53604fd306cSNickeau                        }
53704fd306cSNickeau                    case DOKU_LEXER_UNMATCHED :
53804fd306cSNickeau                        $renderer->doc .= PluginUtility::renderUnmatched($data);
53904fd306cSNickeau                        break;
54004fd306cSNickeau                    case DOKU_LEXER_EXIT :
54104fd306cSNickeau                        switch ($logicalTag) {
54204fd306cSNickeau                            default:
54304fd306cSNickeau                            case BarTag::LOGICAL_TAG:
54404fd306cSNickeau                                $renderer->doc .= "</$logicalTag>";
54504fd306cSNickeau                                return true;
54604fd306cSNickeau                        }
54704fd306cSNickeau                }
54804fd306cSNickeau                return false;
54904fd306cSNickeau            case renderer_plugin_combo_analytics::RENDERER_FORMAT:
55004fd306cSNickeau                /**
55104fd306cSNickeau                 * @var renderer_plugin_combo_analytics $renderer
55204fd306cSNickeau                 */
55304fd306cSNickeau                switch ($logicalTag) {
55404fd306cSNickeau                    default:
55504fd306cSNickeau                    case HeadingTag::LOGICAL_TAG:
55604fd306cSNickeau                        HeadingTag::processMetadataAnalytics($data, $renderer);
55704fd306cSNickeau                        return true;
55804fd306cSNickeau                }
55904fd306cSNickeau
56004fd306cSNickeau        }
56104fd306cSNickeau
56204fd306cSNickeau        // unsupported $mode
56304fd306cSNickeau        return false;
56404fd306cSNickeau    }
56504fd306cSNickeau
56604fd306cSNickeau    public static function handleStaticExit(string $match, int $pos, Doku_Handler $handler, DokuWiki_Syntax_Plugin $plugin): array
56704fd306cSNickeau    {
56804fd306cSNickeau        $markupTag = PluginUtility::getMarkupTag($match);
56904fd306cSNickeau        $logicalTag = $markupTag;
57004fd306cSNickeau        $returnedArray = [];
57104fd306cSNickeau        switch ($markupTag) {
57204fd306cSNickeau            case BlockquoteTag::TAG:
57304fd306cSNickeau                $returnedArray = BlockquoteTag::handleExit($handler);
57404fd306cSNickeau                break;
57504fd306cSNickeau            case BoxTag::TAG:
57604fd306cSNickeau                $returnedArray = BoxTag::handleExit($handler);
57704fd306cSNickeau                break;
57804fd306cSNickeau            case ButtonTag::MARKUP_SHORT:
57904fd306cSNickeau            case ButtonTag::MARKUP_LONG:
58004fd306cSNickeau                $logicalTag = ButtonTag::LOGICAL_TAG;
58104fd306cSNickeau                $returnedArray = ButtonTag::handleExit($handler);
58204fd306cSNickeau                break;
58304fd306cSNickeau            case CardTag::CARD_TAG:
58404fd306cSNickeau            case CardTag::TEASER_TAG:
58504fd306cSNickeau                $logicalTag = CardTag::LOGICAL_TAG;
58604fd306cSNickeau                $returnedArray = CardTag::handleExit($handler, $pos, $match);
58704fd306cSNickeau                break;
58804fd306cSNickeau            case BarTag::BAR_TAG:
58904fd306cSNickeau            case BarTag::SLIDE_TAG:
59004fd306cSNickeau                $logicalTag = BarTag::LOGICAL_TAG;
59104fd306cSNickeau                $returnedArray = BarTag::handleExit($handler, $pos, $match);
59204fd306cSNickeau                break;
59304fd306cSNickeau            case CarrouselTag::TAG:
59404fd306cSNickeau                $returnedArray = CarrouselTag::handleExit($handler);
59504fd306cSNickeau                break;
59604fd306cSNickeau            case PrismTags::CONSOLE_TAG:
59704fd306cSNickeau            case PrismTags::FILE_TAG:
59804fd306cSNickeau                $returnedArray = PrismTags::handleExit($handler);
59904fd306cSNickeau                break;
60004fd306cSNickeau            case PipelineTag::TAG:
60104fd306cSNickeau                PipelineTag::processExit($handler);
60204fd306cSNickeau                break;
60304fd306cSNickeau            case GridTag::GRID_TAG:
60404fd306cSNickeau            case GridTag::ROW_TAG:
60504fd306cSNickeau                $logicalTag = GridTag::LOGICAL_TAG;
60604fd306cSNickeau                $returnedArray = GridTag::handleExit($handler);
60704fd306cSNickeau                break;
60804fd306cSNickeau            case DateTag::TAG:
60904fd306cSNickeau                DateTag::handleExit($handler);
61004fd306cSNickeau                break;
61104fd306cSNickeau            case HeadingTag::TITLE_TAG:
61204fd306cSNickeau            case HeadingTag::HEADING_TAG:
61304fd306cSNickeau                $logicalTag = HeadingTag::LOGICAL_TAG;
61404fd306cSNickeau                $returnedArray = HeadingTag::handleExit($handler);
61504fd306cSNickeau                break;
61604fd306cSNickeau            case MasonryTag::CARD_COLUMNS_TAG:
61704fd306cSNickeau            case MasonryTag::TEASER_COLUMNS_TAG:
61804fd306cSNickeau            case MasonryTag::MASONRY_TAG:
61904fd306cSNickeau                $logicalTag = MasonryTag::LOGICAL_TAG;
62004fd306cSNickeau                MasonryTag::handleExit($handler);
62104fd306cSNickeau                break;
62204fd306cSNickeau            case PageExplorerTag::NTOC_MARKUP:
62304fd306cSNickeau            case PageExplorerTag::PAGE_EXPLORER_MARKUP:
62404fd306cSNickeau                $logicalTag = PageExplorerTag::LOGICAL_TAG;
62504fd306cSNickeau                PageExplorerTag::handleExit($handler);
62604fd306cSNickeau                break;
62704fd306cSNickeau            case PageExplorerTag::INDEX_HOME_TAG:
62804fd306cSNickeau            case PageExplorerTag::INDEX_TAG:
62904fd306cSNickeau                $logicalTag = PageExplorerTag::LOGICAL_INDEX_TAG;
63004fd306cSNickeau                break;
63104fd306cSNickeau            case PageExplorerTag::NAMESPACE_ITEM_TAG:
63204fd306cSNickeau            case PageExplorerTag::NAMESPACE_LONG_TAG:
63304fd306cSNickeau            case PageExplorerTag::NAMESPACE_SHORT_TAG:
63404fd306cSNickeau                $logicalTag = PageExplorerTag::NAMESPACE_LOGICAL_TAG;
63504fd306cSNickeau                break;
63604fd306cSNickeau            case PageExplorerTag::PAGE_ITEM_TAG:
63704fd306cSNickeau            case PageExplorerTag::PAGE_TAG:
63804fd306cSNickeau                $logicalTag = PageExplorerTag::PAGE_LOGICAL_TAG;
63904fd306cSNickeau                break;
64004fd306cSNickeau            case PageExplorerTag::PARENT_TAG:
64104fd306cSNickeau                // nothing as the content is captured and deleted by page-explorer
64204fd306cSNickeau                break;
64304fd306cSNickeau            case TabsTag::TAG:
64404fd306cSNickeau                $returnedArray = TabsTag::handleExit($handler);
64504fd306cSNickeau                break;
64604fd306cSNickeau            case PanelTag::PANEL_MARKUP:
64704fd306cSNickeau            case PanelTag::TAB_PANEL_MARKUP:
64804fd306cSNickeau                $logicalTag = PanelTag::PANEL_LOGICAL_MARKUP;
64904fd306cSNickeau                $returnedArray = PanelTag::handleExit($handler, $pos, $markupTag, $match);
65004fd306cSNickeau                break;
65104fd306cSNickeau            case PermalinkTag::TAG:
65204fd306cSNickeau                PermalinkTag::handeExit($handler);
65304fd306cSNickeau                break;
65404fd306cSNickeau            case IconTag::TAG:
65504fd306cSNickeau                $returnedArray = IconTag::handleExit($handler);
65604fd306cSNickeau                break;
65704fd306cSNickeau            case BackgroundTag::MARKUP_SHORT:
65804fd306cSNickeau            case BackgroundTag::MARKUP_LONG:
65904fd306cSNickeau                $logicalTag = BackgroundTag::LOGICAL_TAG;
66004fd306cSNickeau                $returnedArray = BackgroundTag::handleExit($handler);
66104fd306cSNickeau                break;
66204fd306cSNickeau            case MermaidTag::MARKUP_SEQUENCE_DIAGRAM:
66304fd306cSNickeau            case MermaidTag::MARKUP_CLASS_DIAGRAM:
66404fd306cSNickeau            case MermaidTag::MARKUP_FLOWCHART:
66504fd306cSNickeau            case MermaidTag::MARKUP_GANTT:
66604fd306cSNickeau            case MermaidTag::MARKUP_ERD:
66704fd306cSNickeau            case MermaidTag::MARKUP_JOURNEY:
66804fd306cSNickeau            case MermaidTag::MARKUP_PIECHART:
66904fd306cSNickeau            case MermaidTag::MARKUP_STATE_DIAGRAM:
67004fd306cSNickeau                $logicalTag = MermaidTag::LOGICAL_TAG;
67104fd306cSNickeau                MermaidTag::handleExit($handler);
67204fd306cSNickeau                break;
67304fd306cSNickeau            case MermaidTag::MARKUP_MERMAID: // bug
67404fd306cSNickeau            case WebCodeTag::TAG:
67504fd306cSNickeau                $logicalTag = WebCodeTag::TAG;
67604fd306cSNickeau                $returnedArray = WebCodeTag::handleExit($handler);
67704fd306cSNickeau                break;
6788b8569b7Sgerardnico            case ShareTag::MARKUP:
6798b8569b7Sgerardnico                $returnedArray = ShareTag::handleExit($handler);
6808b8569b7Sgerardnico
6818b8569b7Sgerardnico                break;
6828b8569b7Sgerardnico
68304fd306cSNickeau        }
68404fd306cSNickeau        /**
68504fd306cSNickeau         * Common exit attributes
68604fd306cSNickeau         */
68704fd306cSNickeau        $defaultReturnedArray[PluginUtility::STATE] = DOKU_LEXER_EXIT;
68804fd306cSNickeau        $defaultReturnedArray[PluginUtility::TAG] = $logicalTag;
68904fd306cSNickeau        $defaultReturnedArray[PluginUtility::MARKUP_TAG] = $markupTag;
69004fd306cSNickeau        return array_merge($defaultReturnedArray, $returnedArray);
69104fd306cSNickeau    }
69204fd306cSNickeau
69304fd306cSNickeau    /**
69404fd306cSNickeau     * @param $tag
69504fd306cSNickeau     * @return string
69604fd306cSNickeau     *
69704fd306cSNickeau     * Create a lookahead pattern for a container tag used to enter in a mode
69804fd306cSNickeau     */
69904fd306cSNickeau    public static function getContainerTagPattern($tag): string
70004fd306cSNickeau    {
70104fd306cSNickeau        // this pattern ensure that the tag
70204fd306cSNickeau        // `accordion` will not intercept also the tag `accordionitem`
70304fd306cSNickeau        // where:
70404fd306cSNickeau        // ?: means non capturing group (to not capture the last >)
70504fd306cSNickeau        // (\s.*?): is a capturing group that starts with a space
70604fd306cSNickeau        $pattern = "(?:\s.*?>|>)";
70704fd306cSNickeau        return '<' . $tag . $pattern . '(?=.*?<\/' . $tag . '>)';
70804fd306cSNickeau    }
70904fd306cSNickeau
71004fd306cSNickeau    public static function handleStaticEmptyTag(string $match, int $state, int $pos, Doku_Handler $handler, DokuWiki_Syntax_Plugin $plugin): array
71104fd306cSNickeau    {
71204fd306cSNickeau        /**
71304fd306cSNickeau         * Logical Tag Building
71404fd306cSNickeau         */
71504fd306cSNickeau        $logicalTag = PluginUtility::getMarkupTag($match);
71604fd306cSNickeau        $defaultAttributes = [];
71704fd306cSNickeau        $knownTypes = [];
71804fd306cSNickeau        $allowAnyFirstBooleanAttributesAsType = false;
71904fd306cSNickeau        switch ($logicalTag) {
72004fd306cSNickeau            case SearchTag::TAG:
72104fd306cSNickeau                $defaultAttributes = array(
72204fd306cSNickeau                    'ajax' => true,
72304fd306cSNickeau                    'autocomplete' => false
72404fd306cSNickeau                );
72504fd306cSNickeau                break;
72604fd306cSNickeau            case PageImageTag::MARKUP:
72704fd306cSNickeau                $knownTypes = PageImageTag::TYPES;
72804fd306cSNickeau                $defaultAttributes = PageImageTag::getDefaultAttributes();
72904fd306cSNickeau                break;
73004fd306cSNickeau            case ShareTag::MARKUP:
73104fd306cSNickeau                $knownTypes = ShareTag::getKnownTypes();
73204fd306cSNickeau                break;
73304fd306cSNickeau            case FollowTag::MARKUP:
73404fd306cSNickeau                $knownTypes = FollowTag::getKnownTypes();
73504fd306cSNickeau                break;
73604fd306cSNickeau            case BrandListTag::MARKUP:
73704fd306cSNickeau                $knownTypes = BrandButton::TYPE_BUTTONS;
73804fd306cSNickeau                $defaultAttributes = [TagAttributes::TYPE_KEY => BrandButton::TYPE_BUTTON_BRAND];
73904fd306cSNickeau                break;
74004fd306cSNickeau            case BrandTag::MARKUP:
74104fd306cSNickeau                $defaultAttributes = [TagAttributes::TYPE_KEY => Brand::CURRENT_BRAND];
74204fd306cSNickeau                $allowAnyFirstBooleanAttributesAsType = true;
74304fd306cSNickeau                break;
74404fd306cSNickeau            case PermalinkTag::TAG:
74504fd306cSNickeau                $knownTypes = PermalinkTag::getKnownTypes();
74604fd306cSNickeau                $defaultAttributes = [TagAttributes::TYPE_KEY => PermalinkTag::GENERATED_TYPE];
74704fd306cSNickeau                break;
74804fd306cSNickeau            case BreadcrumbTag::MARKUP_BLOCK:
74904fd306cSNickeau                $logicalTag = BreadcrumbTag::LOGICAL_TAG;
75004fd306cSNickeau                $knownTypes = BreadcrumbTag::TYPES;
75104fd306cSNickeau                $defaultAttributes = BreadcrumbTag::getDefaultBlockAttributes();
75204fd306cSNickeau                break;
75304fd306cSNickeau        }
75404fd306cSNickeau        $tagAttributes = TagAttributes::createFromTagMatch($match, $defaultAttributes, $knownTypes, $allowAnyFirstBooleanAttributesAsType)
75504fd306cSNickeau            ->setLogicalTag($logicalTag);
75604fd306cSNickeau
75704fd306cSNickeau        /**
75804fd306cSNickeau         * Calculate extra returned key in the table
75904fd306cSNickeau         */
76004fd306cSNickeau        $returnedArray = [];
76104fd306cSNickeau        switch ($logicalTag) {
76204fd306cSNickeau            case IconTag::TAG:
76304fd306cSNickeau                $returnedArray = IconTag::handleSpecial($tagAttributes, $handler);
76404fd306cSNickeau                break;
76504fd306cSNickeau            case PageImageTag::MARKUP:
76604fd306cSNickeau                $returnedArray = PageImageTag::handle($tagAttributes, $handler);
76704fd306cSNickeau                break;
76804fd306cSNickeau            case BrandTag::MARKUP:
76904fd306cSNickeau                $returnedArray = BrandTag::handleSpecialEnter($tagAttributes, $handler);
77004fd306cSNickeau                break;
77104fd306cSNickeau            case CacheTag::MARKUP:
77204fd306cSNickeau                $returnedArray = CacheTag::handle($tagAttributes);
77304fd306cSNickeau                break;
77404fd306cSNickeau            case BackgroundTag::MARKUP_SHORT:
77504fd306cSNickeau            case BackgroundTag::MARKUP_LONG:
77604fd306cSNickeau                BackgroundTag::handleEnterAndSpecial($tagAttributes);
77704fd306cSNickeau                $callStack = CallStack::createFromHandler($handler);
77804fd306cSNickeau                $returnedArray = BackgroundTag::setAttributesToParentAndReturnData($callStack, $tagAttributes, $state);
77904fd306cSNickeau                break;
78004fd306cSNickeau            case DateTag::TAG:
78104fd306cSNickeau                DateTag::handleEnterAndSpecial();
78204fd306cSNickeau                break;
78304fd306cSNickeau            case PermalinkTag::TAG:
78404fd306cSNickeau                $returnedArray = PermalinkTag::handleEnterSpecial($tagAttributes, $state, $handler);
78504fd306cSNickeau                break;
78604fd306cSNickeau            case BreadcrumbTag::MARKUP_BLOCK:
78704fd306cSNickeau                $returnedArray = BreadcrumbTag::handleEnter($tagAttributes);
78804fd306cSNickeau                break;
78904fd306cSNickeau            case HrTag::TAG:
79004fd306cSNickeau                /**
79104fd306cSNickeau                 * Block tag
79204fd306cSNickeau                 */
79304fd306cSNickeau                $returnedArray = [PluginUtility::DISPLAY => HrTag::getDisplay()];
79404fd306cSNickeau                break;
79504fd306cSNickeau        }
79604fd306cSNickeau
79704fd306cSNickeau        /**
79804fd306cSNickeau         * Common default
79904fd306cSNickeau         * {@link PluginUtility::DISPLAY} should be set on handle
80004fd306cSNickeau         */
80104fd306cSNickeau        $defaultReturnedArray[PluginUtility::STATE] = $state;
80204fd306cSNickeau        $defaultReturnedArray[PluginUtility::TAG] = $logicalTag;
80304fd306cSNickeau        $defaultReturnedArray[PluginUtility::ATTRIBUTES] = $tagAttributes->toCallStackArray();
80404fd306cSNickeau
80504fd306cSNickeau        return array_merge($defaultReturnedArray, $returnedArray);
80604fd306cSNickeau    }
80704fd306cSNickeau
80804fd306cSNickeau    public static function renderStaticEmptyTag(string $format, Doku_Renderer $renderer, array $data, DokuWiki_Syntax_Plugin $plugin): bool
80904fd306cSNickeau    {
81004fd306cSNickeau
81104fd306cSNickeau        $tag = $data[PluginUtility::TAG];
81204fd306cSNickeau        $attributes = $data[PluginUtility::ATTRIBUTES];
81304fd306cSNickeau        $state = DOKU_LEXER_SPECIAL;
81404fd306cSNickeau        $tagAttributes = TagAttributes::createFromCallStackArray($attributes)->setLogicalTag($tag);
81504fd306cSNickeau        switch ($format) {
81604fd306cSNickeau            case "xhtml":
81704fd306cSNickeau                /** @var Doku_Renderer_xhtml $renderer */
81804fd306cSNickeau                switch ($tag) {
81904fd306cSNickeau                    case HrTag::TAG:
82004fd306cSNickeau                        $renderer->doc .= HrTag::render($tagAttributes);
82104fd306cSNickeau                        break;
82204fd306cSNickeau                    case SearchTag::TAG:
82304fd306cSNickeau                        $renderer->doc .= SearchTag::render($tagAttributes);
82404fd306cSNickeau                        break;
82504fd306cSNickeau                    case IconTag::TAG:
82604fd306cSNickeau                        $renderer->doc .= IconTag::renderEmptyTag($tagAttributes);
82704fd306cSNickeau                        break;
82804fd306cSNickeau                    case BreadcrumbTag::LOGICAL_TAG:
82904fd306cSNickeau                        $renderer->doc .= BreadcrumbTag::render($tagAttributes);
83004fd306cSNickeau                        break;
83104fd306cSNickeau                    case PageImageTag::MARKUP:
83204fd306cSNickeau                        $renderer->doc .= PageImageTag::render($tagAttributes, $data);
83304fd306cSNickeau                        break;
83404fd306cSNickeau                    case ShareTag::MARKUP:
83504fd306cSNickeau                        $renderer->doc .= ShareTag::renderSpecialEnter($tagAttributes, $state);
83604fd306cSNickeau                        break;
83704fd306cSNickeau                    case BrandListTag::MARKUP:
83804fd306cSNickeau                        $renderer->doc .= BrandListTag::render($tagAttributes);
83904fd306cSNickeau                        break;
84004fd306cSNickeau                    case BrandTag::MARKUP:
84104fd306cSNickeau                        $renderer->doc .= BrandTag::render($tagAttributes, $state, $data);
84204fd306cSNickeau                        break;
84304fd306cSNickeau                    case CacheTag::MARKUP:
84404fd306cSNickeau                        $renderer->doc .= CacheTag::renderXhtml($data);
84504fd306cSNickeau                        break;
84604fd306cSNickeau                    case BackgroundTag::MARKUP_LONG:
84704fd306cSNickeau                    case BackgroundTag::MARKUP_SHORT:
84804fd306cSNickeau                        $renderer->doc .= BackgroundTag::renderExitSpecialHtml($data);
84904fd306cSNickeau                        break;
85004fd306cSNickeau                    case DateTag::TAG:
85104fd306cSNickeau                        $renderer->doc .= DateTag::renderHtml($tagAttributes);
85204fd306cSNickeau                        return true;
85304fd306cSNickeau                    case PermalinkTag::TAG:
85404fd306cSNickeau                        $renderer->doc .= PermalinkTag::renderEnterSpecialXhtml($data);
85504fd306cSNickeau                        return true;
85604fd306cSNickeau                    case QualityTag::MARKUP_TAG:
85704fd306cSNickeau                        $renderer->doc .= QualityTag::renderXhtml($tagAttributes);
85804fd306cSNickeau                        return true;
85904fd306cSNickeau                    case FollowTag::MARKUP:
86004fd306cSNickeau                        $renderer->doc .= FollowTag::renderSpecialEnterNode($tagAttributes, DOKU_LEXER_SPECIAL);
86104fd306cSNickeau                        return true;
86204fd306cSNickeau                    case MediaMarkup::TAG:
86304fd306cSNickeau                        $renderer->doc .= MediaMarkup::renderSpecial($data, $renderer);
86404fd306cSNickeau                        return true;
86504fd306cSNickeau                    case SubscribeTag::LOGICAL_TAG:
86604fd306cSNickeau                        $renderer->doc .= SubscribeTag::renderEnterXhtml($tagAttributes);
86704fd306cSNickeau                        return true;
86804fd306cSNickeau                    case AdTag::MARKUP:
86904fd306cSNickeau                        $renderer->doc .= AdTag::render($tagAttributes);
87004fd306cSNickeau                        return true;
87104fd306cSNickeau                    case RelatedTag::TAG:
87204fd306cSNickeau                        $renderer->doc .= RelatedTag::render($tagAttributes);
87304fd306cSNickeau                        return true;
87404fd306cSNickeau                    default:
87504fd306cSNickeau                        LogUtility::errorIfDevOrTest("The empty tag (" . $tag . ") was not processed.");
87604fd306cSNickeau                }
87704fd306cSNickeau                break;
87804fd306cSNickeau            case 'metadata':
87904fd306cSNickeau                /** @var Doku_Renderer_metadata $renderer */
88004fd306cSNickeau                switch ($tag) {
88104fd306cSNickeau                    case IconTag::TAG:
88204fd306cSNickeau                        IconTag::metadata($renderer, $tagAttributes);
88304fd306cSNickeau                        return true;
88404fd306cSNickeau                    case CacheTag::MARKUP:
88504fd306cSNickeau                        CacheTag::metadata($data);
88604fd306cSNickeau                        return true;
88704fd306cSNickeau                    case MediaMarkup::TAG:
88804fd306cSNickeau                        MediaMarkup::metadata($data, $renderer);
88904fd306cSNickeau                        return true;
89004fd306cSNickeau                }
89104fd306cSNickeau                break;
89204fd306cSNickeau            case renderer_plugin_combo_analytics::RENDERER_FORMAT:
89304fd306cSNickeau
89404fd306cSNickeau        }
89504fd306cSNickeau        // unsupported $mode
89604fd306cSNickeau        return false;
89704fd306cSNickeau    }
89804fd306cSNickeau
89904fd306cSNickeau    private static function renderStaticEnterSpecialMetadata(TagAttributes $tagAttributes, Doku_Renderer_metadata $renderer, array $data, DokuWiki_Syntax_Plugin $plugin): bool
90004fd306cSNickeau    {
90104fd306cSNickeau        $logicalTag = $tagAttributes->getLogicalTag();
90204fd306cSNickeau        switch ($logicalTag) {
90304fd306cSNickeau            case HeadingTag::LOGICAL_TAG:
90404fd306cSNickeau                HeadingTag::processHeadingEnterMetadata($data, $renderer);
90504fd306cSNickeau                return true;
90604fd306cSNickeau            case IconTag::TAG:
90704fd306cSNickeau                IconTag::metadata($renderer, $tagAttributes);
90804fd306cSNickeau                return true;
90904fd306cSNickeau            case BackgroundTag::LOGICAL_TAG:
91004fd306cSNickeau                BackgroundTag::renderMeta($data, $renderer);
91104fd306cSNickeau                return true;
91204fd306cSNickeau        }
91304fd306cSNickeau        return false;
91404fd306cSNickeau    }
91504fd306cSNickeau}
91604fd306cSNickeau
917