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