1*4cadd4f8SNickeau<?php 2*4cadd4f8SNickeau 3*4cadd4f8SNickeau 4*4cadd4f8SNickeaunamespace ComboStrap; 5*4cadd4f8SNickeau 6*4cadd4f8SNickeau 7*4cadd4f8SNickeauuse syntax_plugin_combo_button; 8*4cadd4f8SNickeauuse syntax_plugin_combo_link; 9*4cadd4f8SNickeauuse syntax_plugin_combo_tooltip; 10*4cadd4f8SNickeau 11*4cadd4f8SNickeauclass Tooltip 12*4cadd4f8SNickeau{ 13*4cadd4f8SNickeau 14*4cadd4f8SNickeau 15*4cadd4f8SNickeau public const TOOLTIP_ATTRIBUTE = "tooltip"; 16*4cadd4f8SNickeau public const CALLSTACK = "callstack"; 17*4cadd4f8SNickeau public const POSITION_ATTRIBUTE = "position"; 18*4cadd4f8SNickeau 19*4cadd4f8SNickeau public static function processTooltip(TagAttributes &$tagAttributes) 20*4cadd4f8SNickeau { 21*4cadd4f8SNickeau 22*4cadd4f8SNickeau $tooltip = $tagAttributes->getValueAndRemove(self::TOOLTIP_ATTRIBUTE); 23*4cadd4f8SNickeau if ($tooltip === null) { 24*4cadd4f8SNickeau return; 25*4cadd4f8SNickeau } 26*4cadd4f8SNickeau 27*4cadd4f8SNickeau /** 28*4cadd4f8SNickeau * Tooltip 29*4cadd4f8SNickeau */ 30*4cadd4f8SNickeau $dataAttributeNamespace = Bootstrap::getDataNamespace(); 31*4cadd4f8SNickeau 32*4cadd4f8SNickeau 33*4cadd4f8SNickeau /** 34*4cadd4f8SNickeau * Old tooltip syntax 35*4cadd4f8SNickeau */ 36*4cadd4f8SNickeau $title = $tooltip[syntax_plugin_combo_tooltip::TEXT_ATTRIBUTE]; 37*4cadd4f8SNickeau if ($title === null) { 38*4cadd4f8SNickeau 39*4cadd4f8SNickeau $callStack = $tooltip[Tooltip::CALLSTACK]; 40*4cadd4f8SNickeau if ($callStack !== null) { 41*4cadd4f8SNickeau try { 42*4cadd4f8SNickeau $title = PluginUtility::renderInstructionsToXhtml($callStack); 43*4cadd4f8SNickeau } catch (ExceptionCombo $e) { 44*4cadd4f8SNickeau $title = LogUtility::wrapInRedForHtml("Error while rendering the tooltip. Error: {$e->getMessage()}"); 45*4cadd4f8SNickeau } 46*4cadd4f8SNickeau 47*4cadd4f8SNickeau /** 48*4cadd4f8SNickeau * New Syntax 49*4cadd4f8SNickeau * (The new syntax add the attributes to the previous element 50*4cadd4f8SNickeau */ 51*4cadd4f8SNickeau $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-html", "true"); 52*4cadd4f8SNickeau 53*4cadd4f8SNickeau } 54*4cadd4f8SNickeau } 55*4cadd4f8SNickeau 56*4cadd4f8SNickeau 57*4cadd4f8SNickeau 58*4cadd4f8SNickeau 59*4cadd4f8SNickeau if (empty($title)) { 60*4cadd4f8SNickeau $title = LogUtility::wrapInRedForHtml("The tooltip is empty"); 61*4cadd4f8SNickeau } 62*4cadd4f8SNickeau $tagAttributes->addOutputAttributeValue("title", $title); 63*4cadd4f8SNickeau 64*4cadd4f8SNickeau /** 65*4cadd4f8SNickeau * Snippet 66*4cadd4f8SNickeau */ 67*4cadd4f8SNickeau Tooltip::addToolTipSnippetIfNeeded(); 68*4cadd4f8SNickeau $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-toggle", "tooltip"); 69*4cadd4f8SNickeau 70*4cadd4f8SNickeau /** 71*4cadd4f8SNickeau * Position 72*4cadd4f8SNickeau */ 73*4cadd4f8SNickeau $position = $tooltip[Tooltip::POSITION_ATTRIBUTE]; 74*4cadd4f8SNickeau if ($position === null) { 75*4cadd4f8SNickeau $position = "top"; 76*4cadd4f8SNickeau } 77*4cadd4f8SNickeau $tagAttributes->addOutputAttributeValue("data{$dataAttributeNamespace}-placement", "${position}"); 78*4cadd4f8SNickeau 79*4cadd4f8SNickeau 80*4cadd4f8SNickeau /** 81*4cadd4f8SNickeau * Keyboard user and assistive technology users 82*4cadd4f8SNickeau * If not button or link (ie span), add tabindex to make the element focusable 83*4cadd4f8SNickeau * in order to see the tooltip 84*4cadd4f8SNickeau * Not sure, if this is a good idea 85*4cadd4f8SNickeau * 86*4cadd4f8SNickeau * Arbitrary HTML elements (such as <span>s) can be made focusable by adding the tabindex="0" attribute 87*4cadd4f8SNickeau */ 88*4cadd4f8SNickeau $logicalTag = $tagAttributes->getLogicalTag(); 89*4cadd4f8SNickeau if (!in_array($logicalTag, [syntax_plugin_combo_link::TAG, syntax_plugin_combo_button::TAG])) { 90*4cadd4f8SNickeau $tagAttributes->addOutputAttributeValue("tabindex", "0"); 91*4cadd4f8SNickeau } 92*4cadd4f8SNickeau 93*4cadd4f8SNickeau 94*4cadd4f8SNickeau } 95*4cadd4f8SNickeau 96*4cadd4f8SNickeau /** 97*4cadd4f8SNickeau * tooltip is used also in page protection 98*4cadd4f8SNickeau */ 99*4cadd4f8SNickeau public 100*4cadd4f8SNickeau static function addToolTipSnippetIfNeeded() 101*4cadd4f8SNickeau { 102*4cadd4f8SNickeau PluginUtility::getSnippetManager()->attachInternalJavascriptForSlot(syntax_plugin_combo_tooltip::TAG); 103*4cadd4f8SNickeau PluginUtility::getSnippetManager()->attachCssInternalStyleSheetForSlot(syntax_plugin_combo_tooltip::TAG); 104*4cadd4f8SNickeau } 105*4cadd4f8SNickeau} 106