137748cd8SNickeau<?php 237748cd8SNickeau 337748cd8SNickeaunamespace ComboStrap; 437748cd8SNickeau 504fd306cSNickeauclass Icon 637748cd8SNickeau{ 737748cd8SNickeau 804fd306cSNickeau public const ICON_CANONICAL_NAME = "icon"; 904fd306cSNickeau 1004fd306cSNickeau private TagAttributes $tagAttributes; 1104fd306cSNickeau private FetcherSvg $fetchSvg; 1237748cd8SNickeau 1337748cd8SNickeau /** 1404fd306cSNickeau * @param string $name 1504fd306cSNickeau * @param TagAttributes|null $iconAttributes 1604fd306cSNickeau * @return Icon 1704fd306cSNickeau * @throws ExceptionBadArgument 1804fd306cSNickeau * @throws ExceptionBadSyntax 1904fd306cSNickeau * @throws ExceptionCompile 2004fd306cSNickeau * @throws ExceptionNotExists 2104fd306cSNickeau * @throws ExceptionNotFound 2237748cd8SNickeau */ 2304fd306cSNickeau public static function createFromName(string $name, TagAttributes $iconAttributes = null): Icon 2404fd306cSNickeau { 2504fd306cSNickeau if ($iconAttributes === null) { 2604fd306cSNickeau $iconAttributes = TagAttributes::createEmpty(self::ICON_CANONICAL_NAME); 274cadd4f8SNickeau } 2804fd306cSNickeau $iconAttributes->addComponentAttributeValue(FetcherSvg::NAME_ATTRIBUTE, $name); 2904fd306cSNickeau return self::createFromTagAttributes($iconAttributes); 3004fd306cSNickeau } 3104fd306cSNickeau 3204fd306cSNickeau /** 3304fd306cSNickeau * @throws ExceptionBadArgument 3404fd306cSNickeau * @throws ExceptionBadSyntax 3504fd306cSNickeau * @throws ExceptionNotExists 3604fd306cSNickeau * @throws ExceptionNotFound 3704fd306cSNickeau * @throws ExceptionCompile 3804fd306cSNickeau */ 3904fd306cSNickeau public static function createFromTagAttributes(TagAttributes $tagAttributes): Icon 4004fd306cSNickeau { 4104fd306cSNickeau /** 4204fd306cSNickeau * The svg 4304fd306cSNickeau * Adding the icon type is mandatory if there is no media 4404fd306cSNickeau */ 4504fd306cSNickeau $tagAttributes->addComponentAttributeValue(TagAttributes::TYPE_KEY, FetcherSvg::ICON_TYPE); 4604fd306cSNickeau 4704fd306cSNickeau /** 4804fd306cSNickeau * Icon Svg file or Icon Library 4904fd306cSNickeau */ 5004fd306cSNickeau $name = $tagAttributes->getValue(FetcherSvg::NAME_ATTRIBUTE); 5104fd306cSNickeau if ($name === null) { 5204fd306cSNickeau throw new ExceptionNotFound("A name is mandatory as attribute for an icon. It was not found.", Icon::ICON_CANONICAL_NAME); 5304fd306cSNickeau } 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 */ 5904fd306cSNickeau $mediaDokuPath = WikiPath::createMediaPathFromId($name); 6004fd306cSNickeau try { 6104fd306cSNickeau $extension = $mediaDokuPath->getExtension(); 6204fd306cSNickeau if ($extension !== "svg") { 6304fd306cSNickeau throw new ExceptionBadArgument("The extension of the icon ($name) is not `svg`", Icon::ICON_CANONICAL_NAME); 6404fd306cSNickeau } 654cadd4f8SNickeau if (!FileSystems::exists($mediaDokuPath)) { 664cadd4f8SNickeau 674cadd4f8SNickeau // Trying to see if it's not in the template images directory 6804fd306cSNickeau $message = "The svg icon file ($mediaDokuPath) does not exists. If you want an icon from an icon library, indicate a name without extension."; 6904fd306cSNickeau throw new ExceptionNotExists($message, Icon::ICON_CANONICAL_NAME); 704cadd4f8SNickeau 714cadd4f8SNickeau } 724cadd4f8SNickeau 73*70bbd7f1Sgerardnico $tagAttributes->addComponentAttributeValue(MediaMarkup::$MEDIA_QUERY_PARAMETER, $mediaDokuPath->getWikiId()); 7404fd306cSNickeau $tagAttributes->setComponentAttributeValue(FetcherSvg::NAME_ATTRIBUTE, $mediaDokuPath->getLastNameWithoutExtension()); 754cadd4f8SNickeau 764cadd4f8SNickeau 7704fd306cSNickeau } catch (ExceptionNotFound $e) { 784cadd4f8SNickeau 794cadd4f8SNickeau /** 8004fd306cSNickeau * No file extension 814cadd4f8SNickeau * From an icon library 824cadd4f8SNickeau */ 834cadd4f8SNickeau 844cadd4f8SNickeau } 8504fd306cSNickeau $fetcherSvg = FetcherSvg::createFromAttributes($tagAttributes); 864cadd4f8SNickeau 8704fd306cSNickeau return (new Icon()) 8804fd306cSNickeau ->setFetcherSvg($fetcherSvg) 8904fd306cSNickeau ->setTagAttributes($tagAttributes); 904cadd4f8SNickeau } 914cadd4f8SNickeau 924cadd4f8SNickeau /** 934cadd4f8SNickeau */ 944cadd4f8SNickeau public static function createFromComboResource(string $name, TagAttributes $tagAttributes = null): Icon 954cadd4f8SNickeau { 9604fd306cSNickeau $icon = new Icon(); 9704fd306cSNickeau $path = WikiPath::createComboResource(":$name.svg"); 9804fd306cSNickeau $fetchSvg = FetcherSvg::createSvgFromPath($path); 9904fd306cSNickeau $icon->setFetcherSvg($fetchSvg); 10004fd306cSNickeau if ($tagAttributes !== null) { 10104fd306cSNickeau $icon->setTagAttributes($tagAttributes); 10204fd306cSNickeau } 10304fd306cSNickeau return $icon; 10404fd306cSNickeau } 10504fd306cSNickeau 10604fd306cSNickeau public function setFetcherSvg(FetcherSvg $fetchSvg): Icon 10704fd306cSNickeau { 10804fd306cSNickeau $this->fetchSvg = $fetchSvg; 10904fd306cSNickeau return $this; 11004fd306cSNickeau } 11104fd306cSNickeau 11204fd306cSNickeau private function setTagAttributes(TagAttributes $tagAttributes): Icon 11304fd306cSNickeau { 11404fd306cSNickeau $this->tagAttributes = $tagAttributes; 11504fd306cSNickeau return $this; 1164cadd4f8SNickeau } 1174cadd4f8SNickeau 1184cadd4f8SNickeau /** 11904fd306cSNickeau * @throws ExceptionCompile 1204cadd4f8SNickeau */ 12104fd306cSNickeau public function toHtml(): string 1224cadd4f8SNickeau { 1234cadd4f8SNickeau 1244cadd4f8SNickeau 12504fd306cSNickeau $mediaMarkup = MediaMarkup::createFromFetcher($this->fetchSvg) 12604fd306cSNickeau ->setLinking(MediaMarkup::LINKING_NOLINK_VALUE); // no lightbox on icon 12704fd306cSNickeau if (isset($this->tagAttributes)) { 12804fd306cSNickeau $mediaMarkup->buildFromTagAttributes($this->tagAttributes); 1294cadd4f8SNickeau } 1304cadd4f8SNickeau 13104fd306cSNickeau return SvgImageLink::createFromMediaMarkup($mediaMarkup) 13204fd306cSNickeau ->renderMediaTag(); 1334cadd4f8SNickeau 1344cadd4f8SNickeau 1354cadd4f8SNickeau } 1364cadd4f8SNickeau 13704fd306cSNickeau public function getFetchSvg(): FetcherSvg 1384cadd4f8SNickeau { 13904fd306cSNickeau return $this->fetchSvg; 1404cadd4f8SNickeau } 14137748cd8SNickeau} 142