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