xref: /plugin/combo/ComboStrap/Tag/FollowTag.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap\Tag;
4*04fd306cSNickeau
5*04fd306cSNickeauuse ComboStrap\Brand;
6*04fd306cSNickeauuse ComboStrap\BrandButton;
7*04fd306cSNickeauuse ComboStrap\BrandTag;
8*04fd306cSNickeauuse ComboStrap\ExceptionCompile;
9*04fd306cSNickeauuse ComboStrap\Icon;
10*04fd306cSNickeauuse ComboStrap\LogUtility;
11*04fd306cSNickeauuse ComboStrap\PluginUtility;
12*04fd306cSNickeauuse ComboStrap\TagAttributes;
13*04fd306cSNickeauuse syntax_plugin_combo_link;
14*04fd306cSNickeau
15*04fd306cSNickeauclass FollowTag
16*04fd306cSNickeau{
17*04fd306cSNickeau
18*04fd306cSNickeau
19*04fd306cSNickeau    public const CANONICAL = FollowTag::MARKUP;
20*04fd306cSNickeau    public const HANDLE_ATTRIBUTE = "handle";
21*04fd306cSNickeau    public const MARKUP = "follow";
22*04fd306cSNickeau
23*04fd306cSNickeau    public static function getKnownTypes(): array
24*04fd306cSNickeau    {
25*04fd306cSNickeau        return Brand::getBrandNamesForButtonType(BrandButton::TYPE_BUTTON_FOLLOW);
26*04fd306cSNickeau    }
27*04fd306cSNickeau
28*04fd306cSNickeau
29*04fd306cSNickeau    public static function renderExit(): string
30*04fd306cSNickeau    {
31*04fd306cSNickeau        return '</a>';
32*04fd306cSNickeau    }
33*04fd306cSNickeau
34*04fd306cSNickeau    public static function renderSpecialEnterNode(TagAttributes $tagAttributes, $state): string
35*04fd306cSNickeau    {
36*04fd306cSNickeau
37*04fd306cSNickeau
38*04fd306cSNickeau        if (
39*04fd306cSNickeau            !$tagAttributes->hasAttribute(syntax_plugin_combo_link::MARKUP_REF_ATTRIBUTE)
40*04fd306cSNickeau            && !$tagAttributes->hasAttribute(FollowTag::HANDLE_ATTRIBUTE)
41*04fd306cSNickeau        ) {
42*04fd306cSNickeau            $handleAttribute = FollowTag::HANDLE_ATTRIBUTE;
43*04fd306cSNickeau            $urlAttribute = BrandTag::URL_ATTRIBUTE;
44*04fd306cSNickeau            $message = "The brand button does not have any follow url. You need to set at minimum the `$handleAttribute` or `$urlAttribute` attribute";
45*04fd306cSNickeau            return self::returnErrorString($message, $state);
46*04fd306cSNickeau        }
47*04fd306cSNickeau
48*04fd306cSNickeau        /**
49*04fd306cSNickeau         * The channel
50*04fd306cSNickeau         */
51*04fd306cSNickeau        try {
52*04fd306cSNickeau            $brand = BrandTag::createButtonFromAttributes($tagAttributes, BrandButton::TYPE_BUTTON_FOLLOW);
53*04fd306cSNickeau        } catch (ExceptionCompile $e) {
54*04fd306cSNickeau            $message = "The brand button creation returns an error ({$e->getMessage()}";
55*04fd306cSNickeau            return self::returnErrorString($message, $state);
56*04fd306cSNickeau        }
57*04fd306cSNickeau
58*04fd306cSNickeau        /**
59*04fd306cSNickeau         * Add the Icon / CSS / Javascript snippet
60*04fd306cSNickeau         * It should happen only in rendering
61*04fd306cSNickeau         */
62*04fd306cSNickeau        try {
63*04fd306cSNickeau            $style = $brand->getStyle();
64*04fd306cSNickeau        } catch (ExceptionCompile $e) {
65*04fd306cSNickeau            $message = "The style of the share button ($brand) could not be determined. Error: {$e->getMessage()}";
66*04fd306cSNickeau            return self::returnErrorString($message, $state);
67*04fd306cSNickeau        }
68*04fd306cSNickeau        $snippetId = $brand->getStyleScriptIdentifier();
69*04fd306cSNickeau        PluginUtility::getSnippetManager()->attachCssInternalStyleSheet($snippetId, $style);
70*04fd306cSNickeau
71*04fd306cSNickeau
72*04fd306cSNickeau        /**
73*04fd306cSNickeau         * Standard link attribute
74*04fd306cSNickeau         * and add the link
75*04fd306cSNickeau         */
76*04fd306cSNickeau        try {
77*04fd306cSNickeau            $tagAttributes = BrandTag::mixBrandButtonToTagAttributes($tagAttributes, $brand);
78*04fd306cSNickeau            $html = $tagAttributes->toHtmlEnterTag("a");
79*04fd306cSNickeau        } catch (ExceptionCompile $e) {
80*04fd306cSNickeau            $message = "The brand button creation returns an error when creating the link ({$e->getMessage()}";
81*04fd306cSNickeau            return self::returnErrorString($message, $state);
82*04fd306cSNickeau        }
83*04fd306cSNickeau
84*04fd306cSNickeau        /**
85*04fd306cSNickeau         * Icon
86*04fd306cSNickeau         */
87*04fd306cSNickeau        try {
88*04fd306cSNickeau            $iconAttributes = TagAttributes::createFromCallStackArray($brand->getIconAttributes());
89*04fd306cSNickeau            $html .= Icon::createFromTagAttributes($iconAttributes)->toHtml();
90*04fd306cSNickeau        } catch (ExceptionCompile $e) {
91*04fd306cSNickeau            $message = "Getting the icon for the brand ($brand) returns an error ({$e->getMessage()}";
92*04fd306cSNickeau            return self::returnErrorString($message,$state);
93*04fd306cSNickeau        }
94*04fd306cSNickeau
95*04fd306cSNickeau        if ($state === DOKU_LEXER_SPECIAL) {
96*04fd306cSNickeau            $html .= "</a>";
97*04fd306cSNickeau        }
98*04fd306cSNickeau        return $html;
99*04fd306cSNickeau
100*04fd306cSNickeau    }
101*04fd306cSNickeau
102*04fd306cSNickeau    private static function returnErrorString($message, $state): string
103*04fd306cSNickeau    {
104*04fd306cSNickeau
105*04fd306cSNickeau        $message = LogUtility::wrapInRedForHtml($message);
106*04fd306cSNickeau        if ($state === DOKU_LEXER_SPECIAL) {
107*04fd306cSNickeau            return $message;
108*04fd306cSNickeau        }
109*04fd306cSNickeau        /**
110*04fd306cSNickeau         * An empty anchor to return in case of errors
111*04fd306cSNickeau         * to have a valid document with the exit
112*04fd306cSNickeau         */
113*04fd306cSNickeau        return "<a>$message";
114*04fd306cSNickeau    }
115*04fd306cSNickeau
116*04fd306cSNickeau}
117