xref: /plugin/combo/action/svg.php (revision 37748cd8654635afbeca80942126742f0f4cc346)
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