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