1*04fd306cSNickeau<?php 2*04fd306cSNickeau 3*04fd306cSNickeaunamespace ComboStrap\Tag; 4*04fd306cSNickeau 5*04fd306cSNickeauuse action_plugin_combo_instructionspostprocessing; 6*04fd306cSNickeauuse ComboStrap\CallStack; 7*04fd306cSNickeauuse ComboStrap\ContainerTag; 8*04fd306cSNickeauuse ComboStrap\DataType; 9*04fd306cSNickeauuse ComboStrap\EditButton; 10*04fd306cSNickeauuse ComboStrap\ExceptionBadArgument; 11*04fd306cSNickeauuse ComboStrap\ExceptionNotFound; 12*04fd306cSNickeauuse ComboStrap\ExecutionContext; 13*04fd306cSNickeauuse ComboStrap\TagAttribute\Hero; 14*04fd306cSNickeauuse ComboStrap\LogUtility; 15*04fd306cSNickeauuse ComboStrap\PluginUtility; 16*04fd306cSNickeauuse ComboStrap\SiteConfig; 17*04fd306cSNickeauuse ComboStrap\TagAttributes; 18*04fd306cSNickeau 19*04fd306cSNickeau/** 20*04fd306cSNickeau * Separator: See: https://getwaves.io/ 21*04fd306cSNickeau * 22*04fd306cSNickeau * * horizontal block are known as section in mjml 23*04fd306cSNickeau */ 24*04fd306cSNickeauclass BarTag 25*04fd306cSNickeau{ 26*04fd306cSNickeau 27*04fd306cSNickeau 28*04fd306cSNickeau public const SIZE_ATTRIBUTE = "size"; 29*04fd306cSNickeau public const HTML_TAG_ATTRIBUTES = "html_tag"; 30*04fd306cSNickeau public const CANONICAL = BarTag::SLIDE_TAG; 31*04fd306cSNickeau public const CONF_ENABLE_BAR_EDITING = "enableBarEditing"; 32*04fd306cSNickeau public const SLIDE_TAG = "slide"; 33*04fd306cSNickeau public const BAR_TAG = "bar"; 34*04fd306cSNickeau public const HTML_SECTION_TAG = "section"; 35*04fd306cSNickeau const LOGICAL_TAG = self::BAR_TAG; 36*04fd306cSNickeau public static $tags = [BarTag::BAR_TAG, BarTag::SLIDE_TAG]; 37*04fd306cSNickeau 38*04fd306cSNickeau public static function getHtmlTag(): string 39*04fd306cSNickeau { 40*04fd306cSNickeau $tag = "div"; 41*04fd306cSNickeau try { 42*04fd306cSNickeau $isFragmentExecution = ExecutionContext::getActualOrCreateFromEnv() 43*04fd306cSNickeau ->getExecutingMarkupHandler() 44*04fd306cSNickeau ->isFragment(); 45*04fd306cSNickeau if (!$isFragmentExecution) { 46*04fd306cSNickeau $tag = self::HTML_SECTION_TAG; 47*04fd306cSNickeau } 48*04fd306cSNickeau return $tag; 49*04fd306cSNickeau } catch (ExceptionNotFound $e) { 50*04fd306cSNickeau return $tag; 51*04fd306cSNickeau } 52*04fd306cSNickeau } 53*04fd306cSNickeau 54*04fd306cSNickeau public static function handleEnter(TagAttributes $tagAttributes): array 55*04fd306cSNickeau { 56*04fd306cSNickeau 57*04fd306cSNickeau $htmlTag = BarTag::getHtmlTag(); 58*04fd306cSNickeau 59*04fd306cSNickeau /** 60*04fd306cSNickeau * Deprecation 61*04fd306cSNickeau */ 62*04fd306cSNickeau $size = $tagAttributes->getValueAndRemoveIfPresent(BarTag::SIZE_ATTRIBUTE); 63*04fd306cSNickeau if ($size !== null) { 64*04fd306cSNickeau LogUtility::warning("The size attribute on bar/slide has been deprecated for the hero attribute"); 65*04fd306cSNickeau $tagAttributes->setComponentAttributeValue(Hero::ATTRIBUTE, $size); 66*04fd306cSNickeau } 67*04fd306cSNickeau 68*04fd306cSNickeau return array(BarTag::HTML_TAG_ATTRIBUTES => $htmlTag); 69*04fd306cSNickeau } 70*04fd306cSNickeau 71*04fd306cSNickeau public static function handleExit(\Doku_Handler $handler, int $pos, string $match): array 72*04fd306cSNickeau { 73*04fd306cSNickeau $callStack = CallStack::createFromHandler($handler); 74*04fd306cSNickeau $openingTag = $callStack->moveToPreviousCorrespondingOpeningCall(); 75*04fd306cSNickeau 76*04fd306cSNickeau /** 77*04fd306cSNickeau * Section heading control 78*04fd306cSNickeau */ 79*04fd306cSNickeau $htmlTag = $openingTag->getPluginData(BarTag::HTML_TAG_ATTRIBUTES); 80*04fd306cSNickeau $message = null; 81*04fd306cSNickeau if ($htmlTag === BarTag::HTML_SECTION_TAG) { 82*04fd306cSNickeau $headingFound = false; 83*04fd306cSNickeau while ($actualCall = $callStack->next()) { 84*04fd306cSNickeau if (in_array($actualCall->getTagName(), action_plugin_combo_instructionspostprocessing::HEADING_TAGS)) { 85*04fd306cSNickeau $headingFound = true; 86*04fd306cSNickeau break; 87*04fd306cSNickeau } 88*04fd306cSNickeau } 89*04fd306cSNickeau if (!$headingFound) { 90*04fd306cSNickeau $id = $openingTag->getIdOrDefault(); 91*04fd306cSNickeau $message = "No heading was found in the section bar ($id). An heading is mandatory for navigation within device."; 92*04fd306cSNickeau } 93*04fd306cSNickeau } 94*04fd306cSNickeau 95*04fd306cSNickeau if (SiteConfig::getConfValue(BarTag::CONF_ENABLE_BAR_EDITING, 1)) { 96*04fd306cSNickeau 97*04fd306cSNickeau $position = $openingTag->getFirstMatchedCharacterPosition(); 98*04fd306cSNickeau try { 99*04fd306cSNickeau $startPosition = DataType::toInteger($position); 100*04fd306cSNickeau } catch (ExceptionBadArgument $e) { 101*04fd306cSNickeau LogUtility::error("The position of the slide is not an integer", BarTag::CANONICAL); 102*04fd306cSNickeau $startPosition = null; 103*04fd306cSNickeau } 104*04fd306cSNickeau $id = $openingTag->getIdOrDefault(); 105*04fd306cSNickeau // +1 to go at the line 106*04fd306cSNickeau $endPosition = $pos + strlen($match) + 1; 107*04fd306cSNickeau $tag = BarTag::BAR_TAG; 108*04fd306cSNickeau $editButtonCall = EditButton::create("Edit $tag $id") 109*04fd306cSNickeau ->setStartPosition($startPosition) 110*04fd306cSNickeau ->setEndPosition($endPosition) 111*04fd306cSNickeau ->toComboCallComboFormat(); 112*04fd306cSNickeau $callStack->moveToEnd(); 113*04fd306cSNickeau $callStack->insertBefore($editButtonCall); 114*04fd306cSNickeau } 115*04fd306cSNickeau 116*04fd306cSNickeau 117*04fd306cSNickeau return array( 118*04fd306cSNickeau BarTag::HTML_TAG_ATTRIBUTES => $htmlTag, 119*04fd306cSNickeau PluginUtility::EXIT_MESSAGE => $message 120*04fd306cSNickeau ); 121*04fd306cSNickeau } 122*04fd306cSNickeau 123*04fd306cSNickeau public static function renderEnterXhtml(TagAttributes $attributes, array $data): string 124*04fd306cSNickeau { 125*04fd306cSNickeau $barTag = BarTag::BAR_TAG; 126*04fd306cSNickeau $attributes->addClassName($barTag); 127*04fd306cSNickeau 128*04fd306cSNickeau PluginUtility::getSnippetManager()->attachCssInternalStyleSheet($barTag); 129*04fd306cSNickeau 130*04fd306cSNickeau $htmlTag = $data[BarTag::HTML_TAG_ATTRIBUTES]; 131*04fd306cSNickeau $html = $attributes->toHtmlEnterTag($htmlTag); 132*04fd306cSNickeau 133*04fd306cSNickeau $layoutContainer = SiteConfig::getConfValue(ContainerTag::DEFAULT_LAYOUT_CONTAINER_CONF, ContainerTag::DEFAULT_LAYOUT_CONTAINER_DEFAULT_VALUE); 134*04fd306cSNickeau $containerClass = ContainerTag::getClassName($layoutContainer); 135*04fd306cSNickeau 136*04fd306cSNickeau $html .= "<div class=\"$barTag-body position-relative $containerClass\">"; 137*04fd306cSNickeau return $html; 138*04fd306cSNickeau } 139*04fd306cSNickeau 140*04fd306cSNickeau public static function renderExitXhtml(array $data): string 141*04fd306cSNickeau { 142*04fd306cSNickeau /** 143*04fd306cSNickeau * End body 144*04fd306cSNickeau */ 145*04fd306cSNickeau $html = '</div>'; 146*04fd306cSNickeau 147*04fd306cSNickeau /** 148*04fd306cSNickeau * End component 149*04fd306cSNickeau */ 150*04fd306cSNickeau $htmlTag = $data[BarTag::HTML_TAG_ATTRIBUTES]; 151*04fd306cSNickeau $html .= "</$htmlTag>"; 152*04fd306cSNickeau return $html; 153*04fd306cSNickeau } 154*04fd306cSNickeau} 155