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