xref: /template/strap/ComboStrap/Tag/BarTag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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