xref: /template/strap/ComboStrap/Mime.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
7*04fd306cSNickeauuse renderer_plugin_combo_analytics;
8*04fd306cSNickeau
9c3437056SNickeauclass Mime
10c3437056SNickeau{
11c3437056SNickeau
12c3437056SNickeau    public const JSON = "application/json";
13c3437056SNickeau    public const HTML = "text/html";
14*04fd306cSNickeau    public const XHTML = "text/xhtml";
15c3437056SNickeau    const PLAIN_TEXT = "text/plain";
16c3437056SNickeau    public const SVG = "image/svg+xml";
17c3437056SNickeau    public const JAVASCRIPT = "text/javascript";
18c3437056SNickeau    const PNG = "image/png";
19c3437056SNickeau    const GIF = "image/gif";
20c3437056SNickeau    const JPEG = "image/jpeg";
21c3437056SNickeau    const BMP = "image/bmp";
22c3437056SNickeau    const WEBP = "image/webp";
234cadd4f8SNickeau    const CSS = "text/css";
24*04fd306cSNickeau    const MARKDOWN = "text/markdown";
25*04fd306cSNickeau    const PDF = "application/pdf";
26*04fd306cSNickeau    const BINARY_MIME = "application/octet-stream";
27*04fd306cSNickeau    public const RASTER_MIMES = [
28*04fd306cSNickeau        Mime::BMP,
29*04fd306cSNickeau        Mime::WEBP,
30*04fd306cSNickeau        Mime::JPEG,
31*04fd306cSNickeau        Mime::GIF,
32*04fd306cSNickeau        MIME::PNG
33*04fd306cSNickeau    ];
34*04fd306cSNickeau
35*04fd306cSNickeau    const XML = "text/xml";
36*04fd306cSNickeau    const INSTRUCTIONS = "text/i";
37*04fd306cSNickeau    const META = "text/meta";
38*04fd306cSNickeau    const HANDLEBARS = "text/hbs";
39*04fd306cSNickeau
40c3437056SNickeau    /**
41c3437056SNickeau     * @var array|null
42c3437056SNickeau     */
43*04fd306cSNickeau    private static ?array $knownTypes;
44c3437056SNickeau
45c3437056SNickeau    /**
46c3437056SNickeau     * @var string
47c3437056SNickeau     */
48c3437056SNickeau    private $mime;
49c3437056SNickeau
50c3437056SNickeau    /**
51c3437056SNickeau     * Mime constructor.
52c3437056SNickeau     */
53c3437056SNickeau    public function __construct(string $mime)
54c3437056SNickeau    {
55c3437056SNickeau        if (trim($mime) === "") {
56c3437056SNickeau            LogUtility::msg("The mime should not be an empty string");
57c3437056SNickeau        }
58c3437056SNickeau        $this->mime = $mime;
59c3437056SNickeau    }
60c3437056SNickeau
61c3437056SNickeau    public static function create(string $mime): Mime
62c3437056SNickeau    {
63c3437056SNickeau        return new Mime($mime);
64c3437056SNickeau    }
65c3437056SNickeau
66*04fd306cSNickeau    /**
67*04fd306cSNickeau     * @throws ExceptionNotFound
68*04fd306cSNickeau     */
69*04fd306cSNickeau    public static function createFromExtension($extension): Mime
70*04fd306cSNickeau    {
71*04fd306cSNickeau        switch ($extension) {
72*04fd306cSNickeau            case FetcherSvg::EXTENSION:
73*04fd306cSNickeau                /**
74*04fd306cSNickeau                 * Svg is authorized when viewing but is not part
75*04fd306cSNickeau                 * of the {@link File::getKnownMime()}
76*04fd306cSNickeau                 */
77*04fd306cSNickeau                return new Mime(Mime::SVG);
78*04fd306cSNickeau            case "js":
79*04fd306cSNickeau                return new Mime(Mime::JAVASCRIPT);
80*04fd306cSNickeau            case renderer_plugin_combo_analytics::RENDERER_NAME_MODE:
81*04fd306cSNickeau            case Json::EXTENSION:
82*04fd306cSNickeau                return new Mime(Mime::JSON);
83*04fd306cSNickeau            case "md":
84*04fd306cSNickeau                return new Mime(Mime::MARKDOWN);
85*04fd306cSNickeau            case "txt":
86*04fd306cSNickeau                return new Mime(Mime::PLAIN_TEXT);
87*04fd306cSNickeau            case "xhtml":
88*04fd306cSNickeau                return new Mime(Mime::XHTML);
89*04fd306cSNickeau            case "html":
90*04fd306cSNickeau                return new Mime(Mime::HTML);
91*04fd306cSNickeau            case "png":
92*04fd306cSNickeau                return new Mime(Mime::PNG);
93*04fd306cSNickeau            case "css":
94*04fd306cSNickeau                return new Mime(Mime::CSS);
95*04fd306cSNickeau            case "jpg":
96*04fd306cSNickeau            case "jpeg":
97*04fd306cSNickeau                return new Mime(Mime::JPEG);
98*04fd306cSNickeau            case "webp":
99*04fd306cSNickeau                return new Mime(Mime::WEBP);
100*04fd306cSNickeau            case "bmp":
101*04fd306cSNickeau                return new Mime(Mime::BMP);
102*04fd306cSNickeau            case "gif":
103*04fd306cSNickeau                return new Mime(Mime::GIF);
104*04fd306cSNickeau            case "pdf":
105*04fd306cSNickeau                return new Mime(Mime::PDF);
106*04fd306cSNickeau            case MarkupRenderer::INSTRUCTION_EXTENSION:
107*04fd306cSNickeau                // text storage, array memory
108*04fd306cSNickeau                return new Mime(self::INSTRUCTIONS);
109*04fd306cSNickeau            case MarkupRenderer::METADATA_EXTENSION:
110*04fd306cSNickeau                // text storage, array memory
111*04fd306cSNickeau                return new Mime(self::META);
112*04fd306cSNickeau            case TemplateEngine::EXTENSION_HBS:
113*04fd306cSNickeau                // handlebars
114*04fd306cSNickeau                return new Mime(self::HANDLEBARS);
115*04fd306cSNickeau            default:
116*04fd306cSNickeau                $mtypes = getMimeTypes();
117*04fd306cSNickeau                $mimeString = $mtypes[$extension];
118*04fd306cSNickeau                if ($mimeString === null) {
119*04fd306cSNickeau                    throw new ExceptionNotFound("No mime was found for the extension ($extension)");
120*04fd306cSNickeau                } else {
121*04fd306cSNickeau                    /**
122*04fd306cSNickeau                     * Delete the special dokuwiki character `!`
123*04fd306cSNickeau                     * that means that the media should be downloaded
124*04fd306cSNickeau                     */
125*04fd306cSNickeau                    if ($mimeString[0] === "!") {
126*04fd306cSNickeau                        $mimeString = substr($mimeString, 1);
127*04fd306cSNickeau                    }
128*04fd306cSNickeau                    return new Mime($mimeString);
129*04fd306cSNickeau                }
130*04fd306cSNickeau
131*04fd306cSNickeau        }
132*04fd306cSNickeau    }
133*04fd306cSNickeau
134*04fd306cSNickeau    public static function getJson(): Mime
135*04fd306cSNickeau    {
136*04fd306cSNickeau        try {
137*04fd306cSNickeau            return Mime::createFromExtension("json");
138*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
139*04fd306cSNickeau            throw new ExceptionRuntime("Json is a known extension and should not throw. Error :{$e->getMessage()}");
140*04fd306cSNickeau        }
141*04fd306cSNickeau    }
142*04fd306cSNickeau
143*04fd306cSNickeau    public static function getHtml(): Mime
144*04fd306cSNickeau    {
145*04fd306cSNickeau        try {
146*04fd306cSNickeau            return Mime::createFromExtension("html");
147*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
148*04fd306cSNickeau            throw new ExceptionRuntime("Html is a known extension and should not throw. Error :{$e->getMessage()}");
149*04fd306cSNickeau        }
150*04fd306cSNickeau    }
151*04fd306cSNickeau
152*04fd306cSNickeau    public static function getText(): Mime
153*04fd306cSNickeau    {
154*04fd306cSNickeau        try {
155*04fd306cSNickeau            return Mime::createFromExtension("txt");
156*04fd306cSNickeau        } catch (ExceptionNotFound $e) {
157*04fd306cSNickeau            throw new ExceptionRuntime("Txt is a known extension and should not throw. Error :{$e->getMessage()}");
158*04fd306cSNickeau        }
159*04fd306cSNickeau    }
160*04fd306cSNickeau
161*04fd306cSNickeau    public static function getBinary(): Mime
162*04fd306cSNickeau    {
163*04fd306cSNickeau        return new Mime(self::BINARY_MIME);
164*04fd306cSNickeau    }
165*04fd306cSNickeau
166*04fd306cSNickeau    public static function getXml()
167*04fd306cSNickeau    {
168*04fd306cSNickeau        return new Mime(self::XML);
169*04fd306cSNickeau    }
170*04fd306cSNickeau
171c3437056SNickeau    public function __toString()
172c3437056SNickeau    {
173c3437056SNickeau        return $this->mime;
174c3437056SNickeau    }
175c3437056SNickeau
176c3437056SNickeau    public function isKnown(): bool
177c3437056SNickeau    {
178c3437056SNickeau
179c3437056SNickeau        if (self::$knownTypes === null) {
180c3437056SNickeau            self::$knownTypes = getMimeTypes();
181c3437056SNickeau        }
182c3437056SNickeau        return array_search($this->mime, self::$knownTypes) !== false;
183c3437056SNickeau
184c3437056SNickeau    }
185c3437056SNickeau
186c3437056SNickeau    public function isTextBased(): bool
187c3437056SNickeau    {
188c3437056SNickeau        if ($this->getFirstPart() === "text") {
189c3437056SNickeau            return true;
190c3437056SNickeau        }
191c3437056SNickeau        if (in_array($this->mime, [self::SVG, self::JSON])) {
192c3437056SNickeau            return true;
193c3437056SNickeau        }
194c3437056SNickeau        return false;
195c3437056SNickeau    }
196c3437056SNickeau
197c3437056SNickeau    private function getFirstPart()
198c3437056SNickeau    {
199c3437056SNickeau        return explode("/", $this->mime)[0];
200c3437056SNickeau    }
201c3437056SNickeau
202c3437056SNickeau    public function isImage(): bool
203c3437056SNickeau    {
204c3437056SNickeau        return substr($this->mime, 0, 5) === 'image';
205c3437056SNickeau    }
206c3437056SNickeau
207c3437056SNickeau    public function toString(): string
208c3437056SNickeau    {
209c3437056SNickeau        return $this->__toString();
210c3437056SNickeau    }
211c3437056SNickeau
212*04fd306cSNickeau    public function getExtension()
213*04fd306cSNickeau    {
214*04fd306cSNickeau
215*04fd306cSNickeau        $secondPart = explode("/", $this->mime)[1];
216*04fd306cSNickeau        // case such as "image/svg+xml";
217*04fd306cSNickeau        return explode("+", $secondPart)[0];
218*04fd306cSNickeau
219*04fd306cSNickeau    }
220*04fd306cSNickeau
221*04fd306cSNickeau    public function isSupportedRasterImage(): bool
222*04fd306cSNickeau    {
223*04fd306cSNickeau        return in_array($this->mime, Mime::RASTER_MIMES);
224*04fd306cSNickeau    }
225*04fd306cSNickeau
226c3437056SNickeau
227c3437056SNickeau}
228