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