1*04fd306cSNickeau<?php 2*04fd306cSNickeau/** 3*04fd306cSNickeau * Copyright (c) 2020. ComboStrap, Inc. and its affiliates. All Rights Reserved. 4*04fd306cSNickeau * 5*04fd306cSNickeau * This source code is licensed under the GPL license found in the 6*04fd306cSNickeau * COPYING file in the root directory of this source tree. 7*04fd306cSNickeau * 8*04fd306cSNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 9*04fd306cSNickeau * @author ComboStrap <support@combostrap.com> 10*04fd306cSNickeau * 11*04fd306cSNickeau */ 12*04fd306cSNickeau 13*04fd306cSNickeaunamespace ComboStrap\TagAttribute; 14*04fd306cSNickeau 15*04fd306cSNickeau 16*04fd306cSNickeauuse ComboStrap\ExceptionNotEquals; 17*04fd306cSNickeauuse ComboStrap\StringUtility; 18*04fd306cSNickeauuse ComboStrap\TagAttributes; 19*04fd306cSNickeau 20*04fd306cSNickeau/** 21*04fd306cSNickeau * This class gots static function about the HTML style attribute 22*04fd306cSNickeau * 23*04fd306cSNickeau * The style attribute is not allowed due to security concern 24*04fd306cSNickeau * in Combostrap (Click Hijacking, ...) 25*04fd306cSNickeau */ 26*04fd306cSNickeauclass StyleAttribute 27*04fd306cSNickeau{ 28*04fd306cSNickeau 29*04fd306cSNickeau const COMBOSTRAP_FIX = "cs"; 30*04fd306cSNickeau public const STYLE_ATTRIBUTE = "style"; 31*04fd306cSNickeau 32*04fd306cSNickeau public static function getRule(array $styles, $selector): string 33*04fd306cSNickeau { 34*04fd306cSNickeau $rule = $selector . " {" . DOKU_LF; 35*04fd306cSNickeau foreach ($styles as $key => $value) { 36*04fd306cSNickeau $rule .= " $key:$value;" . DOKU_LF; 37*04fd306cSNickeau } 38*04fd306cSNickeau StringUtility::rtrim($rule, ";"); 39*04fd306cSNickeau return $rule . DOKU_LF . "}" . DOKU_LF; 40*04fd306cSNickeau 41*04fd306cSNickeau } 42*04fd306cSNickeau 43*04fd306cSNickeau /** 44*04fd306cSNickeau * @param array $array of property as key and value 45*04fd306cSNickeau * @return string a html inline style property 46*04fd306cSNickeau */ 47*04fd306cSNickeau public static function createInlineValue(array $array) 48*04fd306cSNickeau { 49*04fd306cSNickeau $inline = ""; 50*04fd306cSNickeau foreach ($array as $property => $value) { 51*04fd306cSNickeau if ($inline != "") { 52*04fd306cSNickeau $inline .= ";$property:$value"; 53*04fd306cSNickeau } else { 54*04fd306cSNickeau $inline = "$property:$value"; 55*04fd306cSNickeau } 56*04fd306cSNickeau } 57*04fd306cSNickeau return $inline; 58*04fd306cSNickeau 59*04fd306cSNickeau } 60*04fd306cSNickeau 61*04fd306cSNickeau /** 62*04fd306cSNickeau * Add class for user styling 63*04fd306cSNickeau * See 64*04fd306cSNickeau * https://combostrap.com/styling/userstyle#class 65*04fd306cSNickeau * @param TagAttributes $tagAttributes 66*04fd306cSNickeau */ 67*04fd306cSNickeau public static function addStylingClass(TagAttributes &$tagAttributes) 68*04fd306cSNickeau { 69*04fd306cSNickeau $logicalTag = $tagAttributes->getLogicalTag(); 70*04fd306cSNickeau if ($logicalTag !== null && $tagAttributes->getDefaultStyleClassShouldBeAdded() === true) { 71*04fd306cSNickeau 72*04fd306cSNickeau $tagAttributes->addClassName(self::addComboStrapSuffix($logicalTag)); 73*04fd306cSNickeau if (!empty($tagAttributes->getType())) { 74*04fd306cSNickeau $tagAttributes->addClassName($logicalTag . "-" . $tagAttributes->getType() . "-" . self::COMBOSTRAP_FIX); 75*04fd306cSNickeau } 76*04fd306cSNickeau } 77*04fd306cSNickeau } 78*04fd306cSNickeau 79*04fd306cSNickeau public static function addComboStrapSuffix($name): string 80*04fd306cSNickeau { 81*04fd306cSNickeau return $name . "-" . self::COMBOSTRAP_FIX; 82*04fd306cSNickeau } 83*04fd306cSNickeau 84*04fd306cSNickeau public static function HtmlStyleValueToArray(string $htmlStyleValue): array 85*04fd306cSNickeau { 86*04fd306cSNickeau $stylingDeclarationsAsString = explode(";", $htmlStyleValue); 87*04fd306cSNickeau $stylingDeclarationAsArray = []; 88*04fd306cSNickeau foreach ($stylingDeclarationsAsString as $stylingDeclaration) { 89*04fd306cSNickeau if (empty($stylingDeclaration)) { 90*04fd306cSNickeau // case with a trailing comma. ie `width:18rem;` 91*04fd306cSNickeau continue; 92*04fd306cSNickeau } 93*04fd306cSNickeau [$key, $value] = preg_split("/:/", $stylingDeclaration, 2); 94*04fd306cSNickeau $stylingDeclarationAsArray[$key] = $value; 95*04fd306cSNickeau } 96*04fd306cSNickeau return $stylingDeclarationAsArray; 97*04fd306cSNickeau 98*04fd306cSNickeau } 99*04fd306cSNickeau 100*04fd306cSNickeau /** 101*04fd306cSNickeau * @throws ExceptionNotEquals 102*04fd306cSNickeau */ 103*04fd306cSNickeau public static function arrayEquals(array $expectedQuery, array $actualQuery) 104*04fd306cSNickeau { 105*04fd306cSNickeau foreach ($actualQuery as $key => $value) { 106*04fd306cSNickeau $expectedValue = $expectedQuery[$key]; 107*04fd306cSNickeau if ($expectedValue === null) { 108*04fd306cSNickeau throw new ExceptionNotEquals("The expected style does not have the $key property"); 109*04fd306cSNickeau } 110*04fd306cSNickeau if ($expectedValue !== $value) { 111*04fd306cSNickeau throw new ExceptionNotEquals("The style $key property does not have the same value ($value vs $expectedValue)"); 112*04fd306cSNickeau } 113*04fd306cSNickeau unset($expectedQuery[$key]); 114*04fd306cSNickeau } 115*04fd306cSNickeau foreach ($expectedQuery as $key => $value) { 116*04fd306cSNickeau throw new ExceptionNotEquals("The expected styles has an extra property ($key=$value)"); 117*04fd306cSNickeau } 118*04fd306cSNickeau } 119*04fd306cSNickeau 120*04fd306cSNickeau /** 121*04fd306cSNickeau * @throws ExceptionNotEquals 122*04fd306cSNickeau */ 123*04fd306cSNickeau public static function stringEquals($leftStyles, $rightStyles) 124*04fd306cSNickeau { 125*04fd306cSNickeau $leftStylesArray = StyleAttribute::HtmlStyleValueToArray($leftStyles); 126*04fd306cSNickeau $rightStylesArray = StyleAttribute::HtmlStyleValueToArray($rightStyles); 127*04fd306cSNickeau self::arrayEquals($leftStylesArray,$rightStylesArray); 128*04fd306cSNickeau } 129*04fd306cSNickeau} 130