137748cd8SNickeau<?php 237748cd8SNickeau 337748cd8SNickeaunamespace ComboStrap; 437748cd8SNickeau 5*04fd306cSNickeauclass Icon 637748cd8SNickeau{ 737748cd8SNickeau 8*04fd306cSNickeau public const ICON_CANONICAL_NAME = "icon"; 9*04fd306cSNickeau 10*04fd306cSNickeau private TagAttributes $tagAttributes; 11*04fd306cSNickeau private FetcherSvg $fetchSvg; 1237748cd8SNickeau 1337748cd8SNickeau /** 14*04fd306cSNickeau * @param string $name 15*04fd306cSNickeau * @param TagAttributes|null $iconAttributes 16*04fd306cSNickeau * @return Icon 17*04fd306cSNickeau * @throws ExceptionBadArgument 18*04fd306cSNickeau * @throws ExceptionBadSyntax 19*04fd306cSNickeau * @throws ExceptionCompile 20*04fd306cSNickeau * @throws ExceptionNotExists 21*04fd306cSNickeau * @throws ExceptionNotFound 2237748cd8SNickeau */ 23*04fd306cSNickeau public static function createFromName(string $name, TagAttributes $iconAttributes = null): Icon 24*04fd306cSNickeau { 25*04fd306cSNickeau if ($iconAttributes === null) { 26*04fd306cSNickeau $iconAttributes = TagAttributes::createEmpty(self::ICON_CANONICAL_NAME); 274cadd4f8SNickeau } 28*04fd306cSNickeau $iconAttributes->addComponentAttributeValue(FetcherSvg::NAME_ATTRIBUTE, $name); 29*04fd306cSNickeau return self::createFromTagAttributes($iconAttributes); 30*04fd306cSNickeau } 31*04fd306cSNickeau 32*04fd306cSNickeau /** 33*04fd306cSNickeau * @throws ExceptionBadArgument 34*04fd306cSNickeau * @throws ExceptionBadSyntax 35*04fd306cSNickeau * @throws ExceptionNotExists 36*04fd306cSNickeau * @throws ExceptionNotFound 37*04fd306cSNickeau * @throws ExceptionCompile 38*04fd306cSNickeau */ 39*04fd306cSNickeau public static function createFromTagAttributes(TagAttributes $tagAttributes): Icon 40*04fd306cSNickeau { 41*04fd306cSNickeau /** 42*04fd306cSNickeau * The svg 43*04fd306cSNickeau * Adding the icon type is mandatory if there is no media 44*04fd306cSNickeau */ 45*04fd306cSNickeau $tagAttributes->addComponentAttributeValue(TagAttributes::TYPE_KEY, FetcherSvg::ICON_TYPE); 46*04fd306cSNickeau 47*04fd306cSNickeau /** 48*04fd306cSNickeau * Icon Svg file or Icon Library 49*04fd306cSNickeau */ 50*04fd306cSNickeau $name = $tagAttributes->getValue(FetcherSvg::NAME_ATTRIBUTE); 51*04fd306cSNickeau if ($name === null) { 52*04fd306cSNickeau throw new ExceptionNotFound("A name is mandatory as attribute for an icon. It was not found.", Icon::ICON_CANONICAL_NAME); 53*04fd306cSNickeau } 5437748cd8SNickeau 554cadd4f8SNickeau /** 564cadd4f8SNickeau * If the name have an extension, it's a file from the media directory 574cadd4f8SNickeau * Otherwise, it's an icon from a library 584cadd4f8SNickeau */ 59*04fd306cSNickeau $mediaDokuPath = WikiPath::createMediaPathFromId($name); 60*04fd306cSNickeau try { 61*04fd306cSNickeau $extension = $mediaDokuPath->getExtension(); 62*04fd306cSNickeau if ($extension !== "svg") { 63*04fd306cSNickeau throw new ExceptionBadArgument("The extension of the icon ($name) is not `svg`", Icon::ICON_CANONICAL_NAME); 64*04fd306cSNickeau } 654cadd4f8SNickeau if (!FileSystems::exists($mediaDokuPath)) { 664cadd4f8SNickeau 674cadd4f8SNickeau // Trying to see if it's not in the template images directory 68*04fd306cSNickeau $message = "The svg icon file ($mediaDokuPath) does not exists. If you want an icon from an icon library, indicate a name without extension."; 69*04fd306cSNickeau throw new ExceptionNotExists($message, Icon::ICON_CANONICAL_NAME); 704cadd4f8SNickeau 714cadd4f8SNickeau } 724cadd4f8SNickeau 73*04fd306cSNickeau $tagAttributes->addComponentAttributeValue(FetcherRawLocalPath::$MEDIA_QUERY_PARAMETER, $mediaDokuPath->getWikiId()); 74*04fd306cSNickeau $tagAttributes->setComponentAttributeValue(FetcherSvg::NAME_ATTRIBUTE, $mediaDokuPath->getLastNameWithoutExtension()); 754cadd4f8SNickeau 764cadd4f8SNickeau 77*04fd306cSNickeau } catch (ExceptionNotFound $e) { 784cadd4f8SNickeau 794cadd4f8SNickeau /** 80*04fd306cSNickeau * No file extension 814cadd4f8SNickeau * From an icon library 824cadd4f8SNickeau */ 834cadd4f8SNickeau 844cadd4f8SNickeau } 85*04fd306cSNickeau $fetcherSvg = FetcherSvg::createFromAttributes($tagAttributes); 864cadd4f8SNickeau 87*04fd306cSNickeau return (new Icon()) 88*04fd306cSNickeau ->setFetcherSvg($fetcherSvg) 89*04fd306cSNickeau ->setTagAttributes($tagAttributes); 904cadd4f8SNickeau } 914cadd4f8SNickeau 924cadd4f8SNickeau /** 934cadd4f8SNickeau */ 944cadd4f8SNickeau public static function createFromComboResource(string $name, TagAttributes $tagAttributes = null): Icon 954cadd4f8SNickeau { 96*04fd306cSNickeau $icon = new Icon(); 97*04fd306cSNickeau $path = WikiPath::createComboResource(":$name.svg"); 98*04fd306cSNickeau $fetchSvg = FetcherSvg::createSvgFromPath($path); 99*04fd306cSNickeau $icon->setFetcherSvg($fetchSvg); 100*04fd306cSNickeau if ($tagAttributes !== null) { 101*04fd306cSNickeau $icon->setTagAttributes($tagAttributes); 102*04fd306cSNickeau } 103*04fd306cSNickeau return $icon; 104*04fd306cSNickeau } 105*04fd306cSNickeau 106*04fd306cSNickeau public function setFetcherSvg(FetcherSvg $fetchSvg): Icon 107*04fd306cSNickeau { 108*04fd306cSNickeau $this->fetchSvg = $fetchSvg; 109*04fd306cSNickeau return $this; 110*04fd306cSNickeau } 111*04fd306cSNickeau 112*04fd306cSNickeau private function setTagAttributes(TagAttributes $tagAttributes): Icon 113*04fd306cSNickeau { 114*04fd306cSNickeau $this->tagAttributes = $tagAttributes; 115*04fd306cSNickeau return $this; 1164cadd4f8SNickeau } 1174cadd4f8SNickeau 1184cadd4f8SNickeau /** 119*04fd306cSNickeau * @throws ExceptionCompile 1204cadd4f8SNickeau */ 121*04fd306cSNickeau public function toHtml(): string 1224cadd4f8SNickeau { 1234cadd4f8SNickeau 1244cadd4f8SNickeau 125*04fd306cSNickeau $mediaMarkup = MediaMarkup::createFromFetcher($this->fetchSvg) 126*04fd306cSNickeau ->setLinking(MediaMarkup::LINKING_NOLINK_VALUE); // no lightbox on icon 127*04fd306cSNickeau if (isset($this->tagAttributes)) { 128*04fd306cSNickeau $mediaMarkup->buildFromTagAttributes($this->tagAttributes); 1294cadd4f8SNickeau } 1304cadd4f8SNickeau 131*04fd306cSNickeau return SvgImageLink::createFromMediaMarkup($mediaMarkup) 132*04fd306cSNickeau ->renderMediaTag(); 1334cadd4f8SNickeau 1344cadd4f8SNickeau 1354cadd4f8SNickeau } 1364cadd4f8SNickeau 137*04fd306cSNickeau public function getFetchSvg(): FetcherSvg 1384cadd4f8SNickeau { 139*04fd306cSNickeau return $this->fetchSvg; 1404cadd4f8SNickeau } 14137748cd8SNickeau} 142