xref: /template/strap/ComboStrap/Mime.php (revision 70bbd7f1f72440223cc13f3495efdcb2b0a11514)
1c3437056SNickeau<?php
2c3437056SNickeau
3c3437056SNickeau
4c3437056SNickeaunamespace ComboStrap;
5c3437056SNickeau
6c3437056SNickeau
704fd306cSNickeauuse renderer_plugin_combo_analytics;
804fd306cSNickeau
9c3437056SNickeauclass Mime
10c3437056SNickeau{
11c3437056SNickeau
12c3437056SNickeau    public const JSON = "application/json";
13c3437056SNickeau    public const HTML = "text/html";
1404fd306cSNickeau    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";
2404fd306cSNickeau    const MARKDOWN = "text/markdown";
2504fd306cSNickeau    const PDF = "application/pdf";
2604fd306cSNickeau    const BINARY_MIME = "application/octet-stream";
2704fd306cSNickeau    public const RASTER_MIMES = [
2804fd306cSNickeau        Mime::BMP,
2904fd306cSNickeau        Mime::WEBP,
3004fd306cSNickeau        Mime::JPEG,
3104fd306cSNickeau        Mime::GIF,
3204fd306cSNickeau        MIME::PNG
3304fd306cSNickeau    ];
3404fd306cSNickeau
3504fd306cSNickeau    const XML = "text/xml";
3604fd306cSNickeau    const INSTRUCTIONS = "text/i";
3704fd306cSNickeau    const META = "text/meta";
3804fd306cSNickeau    const HANDLEBARS = "text/hbs";
3904fd306cSNickeau
40c3437056SNickeau    /**
41c3437056SNickeau     * @var array|null
42c3437056SNickeau     */
4304fd306cSNickeau    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
6604fd306cSNickeau    /**
6704fd306cSNickeau     * @throws ExceptionNotFound
6804fd306cSNickeau     */
6904fd306cSNickeau    public static function createFromExtension($extension): Mime
7004fd306cSNickeau    {
7104fd306cSNickeau        switch ($extension) {
7204fd306cSNickeau            case FetcherSvg::EXTENSION:
7304fd306cSNickeau                /**
7404fd306cSNickeau                 * Svg is authorized when viewing but is not part
7504fd306cSNickeau                 * of the {@link File::getKnownMime()}
7604fd306cSNickeau                 */
7704fd306cSNickeau                return new Mime(Mime::SVG);
7804fd306cSNickeau            case "js":
7904fd306cSNickeau                return new Mime(Mime::JAVASCRIPT);
8004fd306cSNickeau            case renderer_plugin_combo_analytics::RENDERER_NAME_MODE:
8104fd306cSNickeau            case Json::EXTENSION:
8204fd306cSNickeau                return new Mime(Mime::JSON);
8304fd306cSNickeau            case "md":
8404fd306cSNickeau                return new Mime(Mime::MARKDOWN);
8504fd306cSNickeau            case "txt":
8604fd306cSNickeau                return new Mime(Mime::PLAIN_TEXT);
8704fd306cSNickeau            case "xhtml":
8804fd306cSNickeau                return new Mime(Mime::XHTML);
8904fd306cSNickeau            case "html":
9004fd306cSNickeau                return new Mime(Mime::HTML);
9104fd306cSNickeau            case "png":
9204fd306cSNickeau                return new Mime(Mime::PNG);
9304fd306cSNickeau            case "css":
9404fd306cSNickeau                return new Mime(Mime::CSS);
9504fd306cSNickeau            case "jpg":
9604fd306cSNickeau            case "jpeg":
9704fd306cSNickeau                return new Mime(Mime::JPEG);
9804fd306cSNickeau            case "webp":
9904fd306cSNickeau                return new Mime(Mime::WEBP);
10004fd306cSNickeau            case "bmp":
10104fd306cSNickeau                return new Mime(Mime::BMP);
10204fd306cSNickeau            case "gif":
10304fd306cSNickeau                return new Mime(Mime::GIF);
10404fd306cSNickeau            case "pdf":
10504fd306cSNickeau                return new Mime(Mime::PDF);
10604fd306cSNickeau            case MarkupRenderer::INSTRUCTION_EXTENSION:
10704fd306cSNickeau                // text storage, array memory
10804fd306cSNickeau                return new Mime(self::INSTRUCTIONS);
10904fd306cSNickeau            case MarkupRenderer::METADATA_EXTENSION:
11004fd306cSNickeau                // text storage, array memory
11104fd306cSNickeau                return new Mime(self::META);
11204fd306cSNickeau            case TemplateEngine::EXTENSION_HBS:
11304fd306cSNickeau                // handlebars
11404fd306cSNickeau                return new Mime(self::HANDLEBARS);
11504fd306cSNickeau            default:
11604fd306cSNickeau                $mtypes = getMimeTypes();
117*70bbd7f1Sgerardnico                $mimeString = $mtypes[$extension] ?? null;
11804fd306cSNickeau                if ($mimeString === null) {
11904fd306cSNickeau                    throw new ExceptionNotFound("No mime was found for the extension ($extension)");
12004fd306cSNickeau                } else {
12104fd306cSNickeau                    /**
12204fd306cSNickeau                     * Delete the special dokuwiki character `!`
12304fd306cSNickeau                     * that means that the media should be downloaded
12404fd306cSNickeau                     */
12504fd306cSNickeau                    if ($mimeString[0] === "!") {
12604fd306cSNickeau                        $mimeString = substr($mimeString, 1);
12704fd306cSNickeau                    }
12804fd306cSNickeau                    return new Mime($mimeString);
12904fd306cSNickeau                }
13004fd306cSNickeau
13104fd306cSNickeau        }
13204fd306cSNickeau    }
13304fd306cSNickeau
13404fd306cSNickeau    public static function getJson(): Mime
13504fd306cSNickeau    {
13604fd306cSNickeau        try {
13704fd306cSNickeau            return Mime::createFromExtension("json");
13804fd306cSNickeau        } catch (ExceptionNotFound $e) {
13904fd306cSNickeau            throw new ExceptionRuntime("Json is a known extension and should not throw. Error :{$e->getMessage()}");
14004fd306cSNickeau        }
14104fd306cSNickeau    }
14204fd306cSNickeau
14304fd306cSNickeau    public static function getHtml(): Mime
14404fd306cSNickeau    {
14504fd306cSNickeau        try {
14604fd306cSNickeau            return Mime::createFromExtension("html");
14704fd306cSNickeau        } catch (ExceptionNotFound $e) {
14804fd306cSNickeau            throw new ExceptionRuntime("Html is a known extension and should not throw. Error :{$e->getMessage()}");
14904fd306cSNickeau        }
15004fd306cSNickeau    }
15104fd306cSNickeau
15204fd306cSNickeau    public static function getText(): Mime
15304fd306cSNickeau    {
15404fd306cSNickeau        try {
15504fd306cSNickeau            return Mime::createFromExtension("txt");
15604fd306cSNickeau        } catch (ExceptionNotFound $e) {
15704fd306cSNickeau            throw new ExceptionRuntime("Txt is a known extension and should not throw. Error :{$e->getMessage()}");
15804fd306cSNickeau        }
15904fd306cSNickeau    }
16004fd306cSNickeau
16104fd306cSNickeau    public static function getBinary(): Mime
16204fd306cSNickeau    {
16304fd306cSNickeau        return new Mime(self::BINARY_MIME);
16404fd306cSNickeau    }
16504fd306cSNickeau
16604fd306cSNickeau    public static function getXml()
16704fd306cSNickeau    {
16804fd306cSNickeau        return new Mime(self::XML);
16904fd306cSNickeau    }
17004fd306cSNickeau
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
21204fd306cSNickeau    public function getExtension()
21304fd306cSNickeau    {
21404fd306cSNickeau
21504fd306cSNickeau        $secondPart = explode("/", $this->mime)[1];
21604fd306cSNickeau        // case such as "image/svg+xml";
21704fd306cSNickeau        return explode("+", $secondPart)[0];
21804fd306cSNickeau
21904fd306cSNickeau    }
22004fd306cSNickeau
22104fd306cSNickeau    public function isSupportedRasterImage(): bool
22204fd306cSNickeau    {
22304fd306cSNickeau        return in_array($this->mime, Mime::RASTER_MIMES);
22404fd306cSNickeau    }
22504fd306cSNickeau
226c3437056SNickeau
227c3437056SNickeau}
228