121913ab3SNickeau<?php 221913ab3SNickeau 321913ab3SNickeau 4*37748cd8SNickeaurequire_once(__DIR__ . '/../ComboStrap/PluginUtility.php'); 521913ab3SNickeau 6a6bf47aaSNickeauuse ComboStrap\Dimension; 7a6bf47aaSNickeauuse ComboStrap\Identity; 8654a02feSgerardnicouse ComboStrap\CacheMedia; 9531e725cSNickeauuse ComboStrap\DokuPath; 1023723136Sgerardnicouse ComboStrap\MediaLink; 1121913ab3SNickeauuse ComboStrap\LogUtility; 12*37748cd8SNickeauuse ComboStrap\PluginUtility; 1321913ab3SNickeauuse ComboStrap\Resources; 1421913ab3SNickeauuse ComboStrap\SvgImageLink; 1521913ab3SNickeauuse ComboStrap\TagAttributes; 1621913ab3SNickeau 1721913ab3SNickeauif (!defined('DOKU_INC')) exit; 1821913ab3SNickeauif (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 1921913ab3SNickeau 2021913ab3SNickeau/** 2121913ab3SNickeau * Class action_plugin_combo_svg 2221913ab3SNickeau * Returned an svg optimized version 2321913ab3SNickeau */ 2421913ab3SNickeauclass action_plugin_combo_svg extends DokuWiki_Action_Plugin 2521913ab3SNickeau{ 2621913ab3SNickeau 2721913ab3SNickeau 2821913ab3SNickeau const CONF_SVG_UPLOAD_GROUP_NAME = "svgUploadGroupName"; 2921913ab3SNickeau 3021913ab3SNickeau public function register(Doku_Event_Handler $controller) 3121913ab3SNickeau { 3221913ab3SNickeau 3321913ab3SNickeau $controller->register_hook('FETCH_MEDIA_STATUS', 'BEFORE', $this, 'svg_optimization'); 3421913ab3SNickeau 3521913ab3SNickeau 3621913ab3SNickeau /** 3721913ab3SNickeau * Hack the upload is done via the ajax.php file 3821913ab3SNickeau * {@link media_upload()} 3921913ab3SNickeau */ 4021913ab3SNickeau $controller->register_hook('AUTH_ACL_CHECK', 'BEFORE', $this, 'svg_mime'); 41*37748cd8SNickeau 4221913ab3SNickeau /** 4321913ab3SNickeau * When the parsing of a page starts 4421913ab3SNickeau */ 4521913ab3SNickeau $controller->register_hook('PARSER_WIKITEXT_PREPROCESS', 'BEFORE', $this, 'svg_mime'); 4621913ab3SNickeau 4721913ab3SNickeau } 4821913ab3SNickeau 4921913ab3SNickeau /** 5021913ab3SNickeau * @param Doku_Event $event 5121913ab3SNickeau * https://www.dokuwiki.org/devel:event:fetch_media_status 5221913ab3SNickeau */ 5321913ab3SNickeau public function svg_optimization(Doku_Event &$event) 5421913ab3SNickeau { 5521913ab3SNickeau 5621913ab3SNickeau if ($event->data['ext'] != 'svg') return; 5721913ab3SNickeau if ($event->data['status'] >= 400) return; // ACLs and precondition checks 5821913ab3SNickeau 5921913ab3SNickeau 6021913ab3SNickeau $tagAttributes = TagAttributes::createEmpty(); 6121913ab3SNickeau $width = $event->data['width']; 6221913ab3SNickeau if ($width != 0) { 63a6bf47aaSNickeau $tagAttributes->addComponentAttributeValue(Dimension::WIDTH_KEY, $width); 6421913ab3SNickeau } 6521913ab3SNickeau $height = $event->data['height']; 6621913ab3SNickeau if ($height != 0) { 67a6bf47aaSNickeau $tagAttributes->addComponentAttributeValue(Dimension::HEIGHT_KEY, $height); 6821913ab3SNickeau } 699337a630SNickeau $tagAttributes->addComponentAttributeValue(CacheMedia::CACHE_KEY, $event->data['cache']); 7021913ab3SNickeau 7121913ab3SNickeau $mime = "image/svg+xml"; 7221913ab3SNickeau $event->data["mime"] = $mime; 7321913ab3SNickeau $tagAttributes->setMime($mime); 7421913ab3SNickeau 7521913ab3SNickeau /** 7621913ab3SNickeau * Add the extra attributes 7721913ab3SNickeau */ 7821913ab3SNickeau $rev = null; 7921913ab3SNickeau foreach ($_REQUEST as $name => $value) { 8021913ab3SNickeau switch ($name) { 8121913ab3SNickeau case "media": 8221913ab3SNickeau case "w": 8321913ab3SNickeau case "h": 8421913ab3SNickeau case "cache": 85654a02feSgerardnico case CacheMedia::CACHE_BUSTER_KEY: 8621913ab3SNickeau case "tok": // A checker 8721913ab3SNickeau // Nothing to do, we take them 8821913ab3SNickeau break; 8921913ab3SNickeau case "rev": 9021913ab3SNickeau $rev = $value; 9121913ab3SNickeau break; 9221913ab3SNickeau case "u": 9321913ab3SNickeau case "p": 9421913ab3SNickeau case "http_credentials": 9521913ab3SNickeau // Credentials data 9621913ab3SNickeau break; 9721913ab3SNickeau default: 9821913ab3SNickeau if (!empty($value)) { 99531e725cSNickeau if (!in_array(strtolower($name), MediaLink::NON_URL_ATTRIBUTES)) { 10021913ab3SNickeau $tagAttributes->addComponentAttributeValue($name, $value); 10121913ab3SNickeau } else { 10221913ab3SNickeau LogUtility::msg("The attribute ($name) is not a valid fetch image URL attribute and was not added", LogUtility::LVL_MSG_WARNING, SvgImageLink::CANONICAL); 10321913ab3SNickeau } 10421913ab3SNickeau } else { 10521913ab3SNickeau LogUtility::msg("Internal Error: the value of the query name ($name) is empty", LogUtility::LVL_MSG_WARNING, SvgImageLink::CANONICAL); 10621913ab3SNickeau } 10721913ab3SNickeau } 10821913ab3SNickeau } 10921913ab3SNickeau 11021913ab3SNickeau 11121913ab3SNickeau $id = $event->data["media"]; 112531e725cSNickeau $pathId = DokuPath::IdToAbsolutePath($id); 11385e82846SNickeau $svgImageLink = SvgImageLink::createMediaLinkFromNonQualifiedPath($pathId, $rev, $tagAttributes); 114*37748cd8SNickeau try { 11521913ab3SNickeau $event->data['file'] = $svgImageLink->getSvgFile(); 116*37748cd8SNickeau } catch (RuntimeException $e) { 117*37748cd8SNickeau 118*37748cd8SNickeau $event->data['file'] = PluginUtility::getResourceBaseUrl()."/images/error-bad-format.svg"; 119*37748cd8SNickeau $event->data['status'] = 422; 120*37748cd8SNickeau 121*37748cd8SNickeau } 12221913ab3SNickeau 12321913ab3SNickeau 12421913ab3SNickeau } 12521913ab3SNickeau 12621913ab3SNickeau /** 12721913ab3SNickeau * @param Doku_Event $event 12821913ab3SNickeau * {@link media_save} is checking the authorized mime type 12921913ab3SNickeau * Svg is not by default, we add it here if the user is admin or 13021913ab3SNickeau * in a specified group 13121913ab3SNickeau */ 13221913ab3SNickeau public function svg_mime(Doku_Event &$event) 13321913ab3SNickeau { 13421913ab3SNickeau 13521913ab3SNickeau self::allowSvgIfAuthorized(); 13621913ab3SNickeau 13721913ab3SNickeau } 13821913ab3SNickeau 13921913ab3SNickeau /** 14021913ab3SNickeau * 14121913ab3SNickeau */ 14221913ab3SNickeau public static function allowSvgIfAuthorized() 14321913ab3SNickeau { 144*37748cd8SNickeau $isAdmin = Identity::isAdmin(); 145a6bf47aaSNickeau $isMember = Identity::isMember("@" . self::CONF_SVG_UPLOAD_GROUP_NAME); 14621913ab3SNickeau 147*37748cd8SNickeau if ($isAdmin || $isMember) { 14821913ab3SNickeau /** 14921913ab3SNickeau * Enhance the svg mime type 15021913ab3SNickeau * {@link getMimeTypes()} 15121913ab3SNickeau */ 15221913ab3SNickeau global $config_cascade; 15321913ab3SNickeau $svgMimeConf = Resources::getConfResourceDirectory() . "/svg.mime.conf"; 15421913ab3SNickeau $config_cascade['mime']['local'][] = $svgMimeConf; 15521913ab3SNickeau } 15621913ab3SNickeau 15721913ab3SNickeau } 15821913ab3SNickeau 15921913ab3SNickeau 16021913ab3SNickeau} 161