xref: /plugin/combo/ComboStrap/Icon.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
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