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