1*21913ab3SNickeau<?php 2*21913ab3SNickeau 3*21913ab3SNickeau 4*21913ab3SNickeaurequire_once(__DIR__ . '/../class/Cache.php'); 5*21913ab3SNickeau 6*21913ab3SNickeauuse ComboStrap\Auth; 7*21913ab3SNickeauuse ComboStrap\Cache; 8*21913ab3SNickeauuse ComboStrap\InternalMediaLink; 9*21913ab3SNickeauuse ComboStrap\LogUtility; 10*21913ab3SNickeauuse ComboStrap\Resources; 11*21913ab3SNickeauuse ComboStrap\SvgImageLink; 12*21913ab3SNickeauuse ComboStrap\TagAttributes; 13*21913ab3SNickeau 14*21913ab3SNickeauif (!defined('DOKU_INC')) exit; 15*21913ab3SNickeauif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 16*21913ab3SNickeau 17*21913ab3SNickeau/** 18*21913ab3SNickeau * Class action_plugin_combo_svg 19*21913ab3SNickeau * Returned an svg optimized version 20*21913ab3SNickeau */ 21*21913ab3SNickeauclass action_plugin_combo_svg extends DokuWiki_Action_Plugin 22*21913ab3SNickeau{ 23*21913ab3SNickeau 24*21913ab3SNickeau 25*21913ab3SNickeau const CONF_SVG_UPLOAD_GROUP_NAME = "svgUploadGroupName"; 26*21913ab3SNickeau 27*21913ab3SNickeau public function register(Doku_Event_Handler $controller) 28*21913ab3SNickeau { 29*21913ab3SNickeau 30*21913ab3SNickeau $controller->register_hook('FETCH_MEDIA_STATUS', 'BEFORE', $this, 'svg_optimization'); 31*21913ab3SNickeau 32*21913ab3SNickeau 33*21913ab3SNickeau /** 34*21913ab3SNickeau * Hack the upload is done via the ajax.php file 35*21913ab3SNickeau * {@link media_upload()} 36*21913ab3SNickeau */ 37*21913ab3SNickeau $controller->register_hook('AUTH_ACL_CHECK', 'BEFORE', $this, 'svg_mime'); 38*21913ab3SNickeau /** 39*21913ab3SNickeau * When the parsing of a page starts 40*21913ab3SNickeau */ 41*21913ab3SNickeau $controller->register_hook('PARSER_WIKITEXT_PREPROCESS', 'BEFORE', $this, 'svg_mime'); 42*21913ab3SNickeau 43*21913ab3SNickeau } 44*21913ab3SNickeau 45*21913ab3SNickeau /** 46*21913ab3SNickeau * @param Doku_Event $event 47*21913ab3SNickeau * https://www.dokuwiki.org/devel:event:fetch_media_status 48*21913ab3SNickeau */ 49*21913ab3SNickeau public function svg_optimization(Doku_Event &$event) 50*21913ab3SNickeau { 51*21913ab3SNickeau 52*21913ab3SNickeau if ($event->data['ext'] != 'svg') return; 53*21913ab3SNickeau if ($event->data['status'] >= 400) return; // ACLs and precondition checks 54*21913ab3SNickeau 55*21913ab3SNickeau 56*21913ab3SNickeau $tagAttributes = TagAttributes::createEmpty(); 57*21913ab3SNickeau $width = $event->data['width']; 58*21913ab3SNickeau if ($width != 0) { 59*21913ab3SNickeau $tagAttributes->addComponentAttributeValue(TagAttributes::WIDTH_KEY, $width); 60*21913ab3SNickeau } 61*21913ab3SNickeau $height = $event->data['height']; 62*21913ab3SNickeau if ($height != 0) { 63*21913ab3SNickeau $tagAttributes->addComponentAttributeValue(TagAttributes::HEIGHT_KEY, $height); 64*21913ab3SNickeau } 65*21913ab3SNickeau $tagAttributes->addComponentAttributeValue(\ComboStrap\Cache::CACHE_KEY, $event->data['cache']); 66*21913ab3SNickeau 67*21913ab3SNickeau $mime = "image/svg+xml"; 68*21913ab3SNickeau $event->data["mime"] = $mime; 69*21913ab3SNickeau $tagAttributes->setMime($mime); 70*21913ab3SNickeau 71*21913ab3SNickeau /** 72*21913ab3SNickeau * Add the extra attributes 73*21913ab3SNickeau */ 74*21913ab3SNickeau $rev = null; 75*21913ab3SNickeau foreach ($_REQUEST as $name => $value) { 76*21913ab3SNickeau switch ($name) { 77*21913ab3SNickeau case "media": 78*21913ab3SNickeau case "w": 79*21913ab3SNickeau case "h": 80*21913ab3SNickeau case "cache": 81*21913ab3SNickeau case Cache::CACHE_BUSTER_KEY: 82*21913ab3SNickeau case "tok": // A checker 83*21913ab3SNickeau // Nothing to do, we take them 84*21913ab3SNickeau break; 85*21913ab3SNickeau case "rev": 86*21913ab3SNickeau $rev = $value; 87*21913ab3SNickeau break; 88*21913ab3SNickeau case "u": 89*21913ab3SNickeau case "p": 90*21913ab3SNickeau case "http_credentials": 91*21913ab3SNickeau // Credentials data 92*21913ab3SNickeau break; 93*21913ab3SNickeau default: 94*21913ab3SNickeau if (!empty($value)) { 95*21913ab3SNickeau if (!in_array($name, InternalMediaLink::TAG_ATTRIBUTES_ONLY)) { 96*21913ab3SNickeau $tagAttributes->addComponentAttributeValue($name, $value); 97*21913ab3SNickeau } else { 98*21913ab3SNickeau LogUtility::msg("The attribute ($name) is not a valid fetch image URL attribute and was not added", LogUtility::LVL_MSG_WARNING, SvgImageLink::CANONICAL); 99*21913ab3SNickeau } 100*21913ab3SNickeau } else { 101*21913ab3SNickeau LogUtility::msg("Internal Error: the value of the query name ($name) is empty", LogUtility::LVL_MSG_WARNING, SvgImageLink::CANONICAL); 102*21913ab3SNickeau } 103*21913ab3SNickeau } 104*21913ab3SNickeau } 105*21913ab3SNickeau 106*21913ab3SNickeau 107*21913ab3SNickeau $id = $event->data["media"]; 108*21913ab3SNickeau $svgImageLink = SvgImageLink::createMediaLinkFromPathId($id, $rev, $tagAttributes); 109*21913ab3SNickeau $event->data['file'] = $svgImageLink->getSvgFile(); 110*21913ab3SNickeau 111*21913ab3SNickeau 112*21913ab3SNickeau } 113*21913ab3SNickeau 114*21913ab3SNickeau /** 115*21913ab3SNickeau * @param Doku_Event $event 116*21913ab3SNickeau * {@link media_save} is checking the authorized mime type 117*21913ab3SNickeau * Svg is not by default, we add it here if the user is admin or 118*21913ab3SNickeau * in a specified group 119*21913ab3SNickeau */ 120*21913ab3SNickeau public function svg_mime(Doku_Event &$event) 121*21913ab3SNickeau { 122*21913ab3SNickeau 123*21913ab3SNickeau self::allowSvgIfAuthorized(); 124*21913ab3SNickeau 125*21913ab3SNickeau } 126*21913ab3SNickeau 127*21913ab3SNickeau /** 128*21913ab3SNickeau * 129*21913ab3SNickeau */ 130*21913ab3SNickeau public static function allowSvgIfAuthorized() 131*21913ab3SNickeau { 132*21913ab3SNickeau $isadmin = Auth::isAdmin(); 133*21913ab3SNickeau $isMember = Auth::isMember("@" . self::CONF_SVG_UPLOAD_GROUP_NAME); 134*21913ab3SNickeau 135*21913ab3SNickeau if ($isadmin || $isMember) { 136*21913ab3SNickeau /** 137*21913ab3SNickeau * Enhance the svg mime type 138*21913ab3SNickeau * {@link getMimeTypes()} 139*21913ab3SNickeau */ 140*21913ab3SNickeau global $config_cascade; 141*21913ab3SNickeau $svgMimeConf = Resources::getConfResourceDirectory() . "/svg.mime.conf"; 142*21913ab3SNickeau $config_cascade['mime']['local'][] = $svgMimeConf; 143*21913ab3SNickeau } 144*21913ab3SNickeau 145*21913ab3SNickeau } 146*21913ab3SNickeau 147*21913ab3SNickeau 148*21913ab3SNickeau} 149