xref: /plugin/combo/ComboStrap/ImageLink.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
11fa8c418SNickeau<?php
21fa8c418SNickeau
31fa8c418SNickeau
41fa8c418SNickeaunamespace ComboStrap;
51fa8c418SNickeau
61fa8c418SNickeau
7*04fd306cSNickeauuse ComboStrap\TagAttribute\StyleAttribute;
8*04fd306cSNickeauuse ComboStrap\Web\UrlEndpoint;
9*04fd306cSNickeau
101fa8c418SNickeau/**
111fa8c418SNickeau * Class ImageLink
121fa8c418SNickeau * @package ComboStrap
131fa8c418SNickeau *
141fa8c418SNickeau * A media of image type
151fa8c418SNickeau */
161fa8c418SNickeauabstract class ImageLink extends MediaLink
171fa8c418SNickeau{
181fa8c418SNickeau
19*04fd306cSNickeau    const LIGHTBOX = "lightbox";
20*04fd306cSNickeau    const IMG_LINK = "img-link";
21*04fd306cSNickeau
221fa8c418SNickeau
23c3437056SNickeau    /**
24*04fd306cSNickeau     * This is mandatory for HTML
25*04fd306cSNickeau     * The alternate text (the title in Dokuwiki media term)
26*04fd306cSNickeau     *
27*04fd306cSNickeau     *
28*04fd306cSNickeau     * TODO: Try to extract it from the metadata file ?
29*04fd306cSNickeau     *
30*04fd306cSNickeau     * An img element must have an alt attribute, except under certain conditions.
31*04fd306cSNickeau     * For details, consult guidance on providing text alternatives for images.
32*04fd306cSNickeau     * https://www.w3.org/WAI/tutorials/images/
33c3437056SNickeau     */
34*04fd306cSNickeau    public function getAltNotEmpty(): string
351fa8c418SNickeau    {
36*04fd306cSNickeau        try {
37*04fd306cSNickeau            return $this->mediaMarkup->getLabel();
38*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
39*04fd306cSNickeau            return $this->mediaMarkup->getFetcher()->getLabel();
401fa8c418SNickeau        }
41*04fd306cSNickeau
42*04fd306cSNickeau    }
43*04fd306cSNickeau
44c3437056SNickeau    /**
45*04fd306cSNickeau     * @return string - the HTML of the image inside a link if asked
46*04fd306cSNickeau     * @throws ExceptionNotFound
47*04fd306cSNickeau     */
48*04fd306cSNickeau    public
49*04fd306cSNickeau    function wrapMediaMarkupWithLink(string $htmlMediaMarkup): string
50*04fd306cSNickeau    {
51*04fd306cSNickeau
52*04fd306cSNickeau        /**
53*04fd306cSNickeau         * Link to the media
54c3437056SNickeau         *
55c3437056SNickeau         */
56*04fd306cSNickeau        $linkTagAttributes = TagAttributes::createEmpty()
57*04fd306cSNickeau            ->setLogicalTag(self::IMG_LINK);
58*04fd306cSNickeau        // https://www.dokuwiki.org/config:target
59*04fd306cSNickeau        global $conf;
60*04fd306cSNickeau        $target = $conf['target']['media'];
61*04fd306cSNickeau        $linkTagAttributes->addOutputAttributeValueIfNotEmpty("target", $target);
62*04fd306cSNickeau        if (!empty($target)) {
63*04fd306cSNickeau            $linkTagAttributes->addOutputAttributeValue("rel", 'noopener');
641fa8c418SNickeau        }
651fa8c418SNickeau
661fa8c418SNickeau        /**
67*04fd306cSNickeau         * Do we add a link to the image ?
681fa8c418SNickeau         */
69*04fd306cSNickeau        $fetcher = $this->mediaMarkup->getFetcher();
70*04fd306cSNickeau        if (!($fetcher instanceof IFetcherSource)) {
71*04fd306cSNickeau            // not an internal image
72*04fd306cSNickeau            return $htmlMediaMarkup;
731fa8c418SNickeau        }
74*04fd306cSNickeau
75*04fd306cSNickeau        $isImage = $fetcher->getMime()->isImage();
76*04fd306cSNickeau        if (!$isImage) {
77*04fd306cSNickeau            return $htmlMediaMarkup;
78*04fd306cSNickeau        }
79*04fd306cSNickeau
80*04fd306cSNickeau        $dokuPath = $fetcher->getSourcePath();
81*04fd306cSNickeau        try {
82*04fd306cSNickeau            $linking = $this->mediaMarkup->getLinking();
83*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
84*04fd306cSNickeau            $linking = MediaMarkup::LINKING_DIRECT_VALUE;
85*04fd306cSNickeau        }
86*04fd306cSNickeau        if($linking==="default"){
87*04fd306cSNickeau            $linking = MediaMarkup::LINKING_DIRECT_VALUE;
88*04fd306cSNickeau        }
89*04fd306cSNickeau        switch ($linking) {
90*04fd306cSNickeau            case MediaMarkup::LINKING_LINKONLY_VALUE:
91*04fd306cSNickeau                // show only a url, no image
92*04fd306cSNickeau                $href = FetcherRawLocalPath::createFromPath($dokuPath)->getFetchUrl()->toString();
93*04fd306cSNickeau                $linkTagAttributes->addOutputAttributeValue("href", $href);
94*04fd306cSNickeau                try {
95*04fd306cSNickeau                    $title = $this->mediaMarkup->getLabel();
96*04fd306cSNickeau                } catch (ExceptionNotFound $e) {
97*04fd306cSNickeau                    $title = $dokuPath->getLastName();
98*04fd306cSNickeau                }
99*04fd306cSNickeau                return $linkTagAttributes->toHtmlEnterTag("a") . $title . "</a>";
100*04fd306cSNickeau            case MediaMarkup::LINKING_NOLINK_VALUE:
101*04fd306cSNickeau                // show only a the image
102*04fd306cSNickeau                return $htmlMediaMarkup;
103*04fd306cSNickeau            case MediaMarkup::LINKING_DIRECT_VALUE:
104*04fd306cSNickeau                //directly to the image
105*04fd306cSNickeau                $href = FetcherRawLocalPath::createFromPath($dokuPath)->getFetchUrl()->toString();
106*04fd306cSNickeau                $linkTagAttributes->addOutputAttributeValue("href", $href);
107*04fd306cSNickeau                $snippetId = self::LIGHTBOX;
108*04fd306cSNickeau                $linkTagAttributes->addClassName(StyleAttribute::addComboStrapSuffix($snippetId));
109*04fd306cSNickeau                $linkingClass = $this->mediaMarkup->getLinkingClass();
110*04fd306cSNickeau                if ($linkingClass !== null) {
111*04fd306cSNickeau                    $linkTagAttributes->addClassName($linkingClass);
112*04fd306cSNickeau                }
113*04fd306cSNickeau                $snippetManager = PluginUtility::getSnippetManager();
114*04fd306cSNickeau                $snippetManager->attachJavascriptComboLibrary();
115*04fd306cSNickeau                $snippetManager->attachJavascriptFromComponentId($snippetId);
116*04fd306cSNickeau                $snippetManager->attachCssInternalStyleSheet($snippetId);
117*04fd306cSNickeau                return $linkTagAttributes->toHtmlEnterTag("a") . $htmlMediaMarkup . "</a>";
118*04fd306cSNickeau
119*04fd306cSNickeau            case MediaMarkup::LINKING_DETAILS_VALUE:
120*04fd306cSNickeau                //go to the details media viewer
121*04fd306cSNickeau                $url = UrlEndpoint::createDetailUrl()
122*04fd306cSNickeau                    ->addQueryParameter(DokuwikiId::DOKUWIKI_ID_ATTRIBUTE, $dokuPath->getWikiId())
123*04fd306cSNickeau                    ->addQueryParameter(WikiPath::REV_ATTRIBUTE, $dokuPath->getRevision());
124*04fd306cSNickeau                $linkTagAttributes->addOutputAttributeValue("href", $url->toString());
125*04fd306cSNickeau                return $linkTagAttributes->toHtmlEnterTag("a") . $htmlMediaMarkup . "</a>";
126*04fd306cSNickeau            default:
127*04fd306cSNickeau                LogUtility::internalError("The linking ($linking) was not processed");
128*04fd306cSNickeau                return $htmlMediaMarkup;
129*04fd306cSNickeau
130*04fd306cSNickeau        }
131*04fd306cSNickeau
132*04fd306cSNickeau
1331fa8c418SNickeau    }
1341fa8c418SNickeau
1351fa8c418SNickeau}
136