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