{-# LANGUAGE OverloadedStrings #-}
{- |
   Module      : Text.Pandoc.MIME
   Copyright   : Copyright (C) 2011-2022 John MacFarlane
   License     : GNU GPL, version 2 or above

   Maintainer  : John MacFarlane <jgm@berkeley.edu>
   Stability   : alpha
   Portability : portable

Mime type lookup.
-}
module Text.Pandoc.MIME (
  MimeType,
  getMimeType,
  getMimeTypeDef,
  getCharset,
  extensionFromMimeType,
  mediaCategory ) where
import Data.List (isPrefixOf, isSuffixOf)
import qualified Data.Map as M
import qualified Data.Text as T
import Data.Maybe (fromMaybe, listToMaybe)
import Data.Tuple (swap)
import System.FilePath

type MimeType = T.Text

-- | Determine mime type appropriate for file path.
getMimeType :: FilePath -> Maybe MimeType
getMimeType :: FilePath -> Maybe Text
getMimeType FilePath
fp
  -- ODT
  | FilePath
fp FilePath -> FilePath -> Bool
forall a. Eq a => a -> a -> Bool
== FilePath
"layout-cache" =
        Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"application/binary"
  | FilePath
"Formula-" FilePath -> FilePath -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf` FilePath
fp Bool -> Bool -> Bool
&& FilePath
"/" FilePath -> FilePath -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` FilePath
fp =
        Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"application/vnd.oasis.opendocument.formula"
  -- generic
  | Bool
otherwise = Text -> Map Text Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup (Text -> Text
T.toLower (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text
T.drop Int
1 (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ FilePath -> Text
T.pack (FilePath -> Text) -> FilePath -> Text
forall a b. (a -> b) -> a -> b
$ FilePath -> FilePath
takeExtension FilePath
fp) Map Text Text
mimeTypes

-- | Determime mime type appropriate for file path, defaulting to
-- “application/octet-stream” if nothing else fits.
getMimeTypeDef :: FilePath -> MimeType
getMimeTypeDef :: FilePath -> Text
getMimeTypeDef = Text -> Maybe Text -> Text
forall a. a -> Maybe a -> a
fromMaybe Text
"application/octet-stream" (Maybe Text -> Text)
-> (FilePath -> Maybe Text) -> FilePath -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FilePath -> Maybe Text
getMimeType

extensionFromMimeType :: MimeType -> Maybe T.Text
-- few special cases, where there are multiple options:
extensionFromMimeType :: Text -> Maybe Text
extensionFromMimeType Text
"text/plain" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"txt"
extensionFromMimeType Text
"video/quicktime" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"mov"
extensionFromMimeType Text
"video/mpeg" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"mpeg"
extensionFromMimeType Text
"video/dv" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"dv"
extensionFromMimeType Text
"image/vnd.djvu" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"djvu"
extensionFromMimeType Text
"image/tiff" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"tiff"
extensionFromMimeType Text
"image/jpeg" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"jpg"
extensionFromMimeType Text
"application/xml" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"xml"
extensionFromMimeType Text
"application/ogg" = Text -> Maybe Text
forall a. a -> Maybe a
Just Text
"ogg"
extensionFromMimeType Text
mimetype =
  Text -> Map Text Text -> Maybe Text
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup ((Char -> Bool) -> Text -> Text
T.takeWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=Char
';') Text
mimetype) Map Text Text
reverseMimeTypes
  -- note:  we just look up the basic mime type, dropping the content-encoding etc.

-- | Determine general media category for file path, e.g.
--
-- prop> mediaCategory "foo.jpg" = Just "image"
mediaCategory :: FilePath -> Maybe T.Text
mediaCategory :: FilePath -> Maybe Text
mediaCategory FilePath
fp = FilePath -> Maybe Text
getMimeType FilePath
fp Maybe Text -> (Text -> Maybe Text) -> Maybe Text
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= [Text] -> Maybe Text
forall a. [a] -> Maybe a
listToMaybe ([Text] -> Maybe Text) -> (Text -> [Text]) -> Text -> Maybe Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> [Text]
T.splitOn Text
"/"

reverseMimeTypes :: M.Map MimeType T.Text
reverseMimeTypes :: Map Text Text
reverseMimeTypes = [(Text, Text)] -> Map Text Text
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(Text, Text)] -> Map Text Text)
-> [(Text, Text)] -> Map Text Text
forall a b. (a -> b) -> a -> b
$ ((Text, Text) -> (Text, Text)) -> [(Text, Text)] -> [(Text, Text)]
forall a b. (a -> b) -> [a] -> [b]
map (Text, Text) -> (Text, Text)
forall a b. (a, b) -> (b, a)
swap [(Text, Text)]
mimeTypesList

mimeTypes :: M.Map T.Text MimeType
mimeTypes :: Map Text Text
mimeTypes = [(Text, Text)] -> Map Text Text
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(Text, Text)]
mimeTypesList

-- | Get the charset from a mime type, if one is present.
getCharset :: MimeType -> Maybe T.Text
getCharset :: Text -> Maybe Text
getCharset Text
mt =
  let (Text
_,Text
y) = Text -> Text -> (Text, Text)
T.breakOn Text
"charset=" Text
mt
   in if Text -> Bool
T.null Text
y
         then Maybe Text
forall a. Maybe a
Nothing
         else Text -> Maybe Text
forall a. a -> Maybe a
Just (Text -> Maybe Text) -> Text -> Maybe Text
forall a b. (a -> b) -> a -> b
$ Text -> Text
T.toUpper (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> Text -> Text
T.takeWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/= Char
';') (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text
T.drop Int
8 Text
y

-- | Collection of common mime types.
-- Except for first entry, list borrowed from
-- <https://github.com/Happstack/happstack-server/blob/master/src/Happstack/Server/FileServe/BuildingBlocks.hs happstack-server>
mimeTypesList :: [(T.Text, MimeType)]
mimeTypesList :: [(Text, Text)]
mimeTypesList =
           [(Text
"cpt",Text
"image/x-corelphotopaint")
           ,(Text
"gz",Text
"application/x-gzip")
           ,(Text
"cabal",Text
"application/x-cabal")
           ,(Text
"%",Text
"application/x-trash")
           ,(Text
"323",Text
"text/h323")
           ,(Text
"3gp",Text
"video/3gpp")
           ,(Text
"7z",Text
"application/x-7z-compressed")
           ,(Text
"abw",Text
"application/x-abiword")
           ,(Text
"ai",Text
"application/postscript")
           ,(Text
"aif",Text
"audio/x-aiff")
           ,(Text
"aifc",Text
"audio/x-aiff")
           ,(Text
"aiff",Text
"audio/x-aiff")
           ,(Text
"alc",Text
"chemical/x-alchemy")
           ,(Text
"art",Text
"image/x-jg")
           ,(Text
"asc",Text
"text/plain")
           ,(Text
"asf",Text
"video/x-ms-asf")
           ,(Text
"asn",Text
"chemical/x-ncbi-asn1")
           ,(Text
"aso",Text
"chemical/x-ncbi-asn1-binary")
           ,(Text
"asx",Text
"video/x-ms-asf")
           ,(Text
"atom",Text
"application/atom")
           ,(Text
"atomcat",Text
"application/atomcat+xml")
           ,(Text
"atomsrv",Text
"application/atomserv+xml")
           ,(Text
"au",Text
"audio/basic")
           ,(Text
"avi",Text
"video/x-msvideo")
           ,(Text
"b",Text
"chemical/x-molconn-Z")
           ,(Text
"bak",Text
"application/x-trash")
           ,(Text
"bat",Text
"application/x-msdos-program")
           ,(Text
"bcpio",Text
"application/x-bcpio")
           ,(Text
"bib",Text
"text/x-bibtex")
           ,(Text
"bin",Text
"application/octet-stream")
           ,(Text
"bmp",Text
"image/x-ms-bmp")
           ,(Text
"boo",Text
"text/x-boo")
           ,(Text
"book",Text
"application/x-maker")
           ,(Text
"bsd",Text
"chemical/x-crossfire")
           ,(Text
"c",Text
"text/x-csrc")
           ,(Text
"c++",Text
"text/x-c++src")
           ,(Text
"c3d",Text
"chemical/x-chem3d")
           ,(Text
"cab",Text
"application/x-cab")
           ,(Text
"cac",Text
"chemical/x-cache")
           ,(Text
"cache",Text
"chemical/x-cache")
           ,(Text
"cap",Text
"application/cap")
           ,(Text
"cascii",Text
"chemical/x-cactvs-binary")
           ,(Text
"cat",Text
"application/vnd.ms-pki.seccat")
           ,(Text
"cbin",Text
"chemical/x-cactvs-binary")
           ,(Text
"cbr",Text
"application/x-cbr")
           ,(Text
"cbz",Text
"application/x-cbz")
           ,(Text
"cc",Text
"text/x-c++src")
           ,(Text
"cdf",Text
"application/x-cdf")
           ,(Text
"cdr",Text
"image/x-coreldraw")
           ,(Text
"cdt",Text
"image/x-coreldrawtemplate")
           ,(Text
"cdx",Text
"chemical/x-cdx")
           ,(Text
"cdy",Text
"application/vnd.cinderella")
           ,(Text
"cef",Text
"chemical/x-cxf")
           ,(Text
"cer",Text
"chemical/x-cerius")
           ,(Text
"chm",Text
"chemical/x-chemdraw")
           ,(Text
"chrt",Text
"application/x-kchart")
           ,(Text
"cif",Text
"chemical/x-cif")
           ,(Text
"class",Text
"application/java-vm")
           ,(Text
"cls",Text
"text/x-tex")
           ,(Text
"cmdf",Text
"chemical/x-cmdf")
           ,(Text
"cml",Text
"chemical/x-cml")
           ,(Text
"cod",Text
"application/vnd.rim.cod")
           ,(Text
"com",Text
"application/x-msdos-program")
           ,(Text
"cpa",Text
"chemical/x-compass")
           ,(Text
"cpio",Text
"application/x-cpio")
           ,(Text
"cpp",Text
"text/x-c++src")
           ,(Text
"cpt",Text
"application/mac-compactpro")
           ,(Text
"crl",Text
"application/x-pkcs7-crl")
           ,(Text
"crt",Text
"application/x-x509-ca-cert")
           ,(Text
"csf",Text
"chemical/x-cache-csf")
           ,(Text
"csh",Text
"application/x-csh")
           ,(Text
"csm",Text
"chemical/x-csml")
           ,(Text
"csml",Text
"chemical/x-csml")
           ,(Text
"css",Text
"text/css")
           ,(Text
"csv",Text
"text/csv")
           ,(Text
"ctab",Text
"chemical/x-cactvs-binary")
           ,(Text
"ctx",Text
"chemical/x-ctx")
           ,(Text
"cu",Text
"application/cu-seeme")
           ,(Text
"cub",Text
"chemical/x-gaussian-cube")
           ,(Text
"cxf",Text
"chemical/x-cxf")
           ,(Text
"cxx",Text
"text/x-c++src")
           ,(Text
"d",Text
"text/x-dsrc")
           ,(Text
"dat",Text
"chemical/x-mopac-input")
           ,(Text
"dcr",Text
"application/x-director")
           ,(Text
"deb",Text
"application/x-debian-package")
           ,(Text
"dif",Text
"video/dv")
           ,(Text
"diff",Text
"text/x-diff")
           ,(Text
"dir",Text
"application/x-director")
           ,(Text
"djv",Text
"image/vnd.djvu")
           ,(Text
"djvu",Text
"image/vnd.djvu")
           ,(Text
"dl",Text
"video/dl")
           ,(Text
"dll",Text
"application/x-msdos-program")
           ,(Text
"dmg",Text
"application/x-apple-diskimage")
           ,(Text
"dms",Text
"application/x-dms")
           ,(Text
"doc",Text
"application/msword")
           ,(Text
"dot",Text
"application/msword")
           ,(Text
"dv",Text
"video/dv")
           ,(Text
"dvi",Text
"application/x-dvi")
           ,(Text
"dx",Text
"chemical/x-jcamp-dx")
           ,(Text
"dxr",Text
"application/x-director")
           ,(Text
"emb",Text
"chemical/x-embl-dl-nucleotide")
           ,(Text
"embl",Text
"chemical/x-embl-dl-nucleotide")
           ,(Text
"emf",Text
"image/x-emf")
           ,(Text
"emz",Text
"application/x-msmetafile")
           ,(Text
"eml",Text
"message/rfc822")
           ,(Text
"ent",Text
"chemical/x-ncbi-asn1-ascii")
           ,(Text
"eot",Text
"application/vnd.ms-fontobject")
           ,(Text
"eps",Text
"application/eps")
           ,(Text
"etx",Text
"text/x-setext")
           ,(Text
"exe",Text
"application/x-msdos-program")
           ,(Text
"ez",Text
"application/andrew-inset")
           ,(Text
"fb",Text
"application/x-maker")
           ,(Text
"fbdoc",Text
"application/x-maker")
           ,(Text
"fch",Text
"chemical/x-gaussian-checkpoint")
           ,(Text
"fchk",Text
"chemical/x-gaussian-checkpoint")
           ,(Text
"fig",Text
"application/x-xfig")
           ,(Text
"flac",Text
"application/x-flac")
           ,(Text
"fli",Text
"video/fli")
           ,(Text
"fm",Text
"application/x-maker")
           ,(Text
"frame",Text
"application/x-maker")
           ,(Text
"frm",Text
"application/x-maker")
           ,(Text
"fs",Text
"text/plain")
           ,(Text
"gal",Text
"chemical/x-gaussian-log")
           ,(Text
"gam",Text
"chemical/x-gamess-input")
           ,(Text
"gamin",Text
"chemical/x-gamess-input")
           ,(Text
"gau",Text
"chemical/x-gaussian-input")
           ,(Text
"gcd",Text
"text/x-pcs-gcd")
           ,(Text
"gcf",Text
"application/x-graphing-calculator")
           ,(Text
"gcg",Text
"chemical/x-gcg8-sequence")
           ,(Text
"gen",Text
"chemical/x-genbank")
           ,(Text
"gf",Text
"application/x-tex-gf")
           ,(Text
"gif",Text
"image/gif")
           ,(Text
"gjc",Text
"chemical/x-gaussian-input")
           ,(Text
"gjf",Text
"chemical/x-gaussian-input")
           ,(Text
"gl",Text
"video/gl")
           ,(Text
"glsl",Text
"text/plain")
           ,(Text
"gnumeric",Text
"application/x-gnumeric")
           ,(Text
"gpt",Text
"chemical/x-mopac-graph")
           ,(Text
"gsf",Text
"application/x-font")
           ,(Text
"gsm",Text
"audio/x-gsm")
           ,(Text
"gtar",Text
"application/x-gtar")
           ,(Text
"h",Text
"text/x-chdr")
           ,(Text
"h++",Text
"text/x-c++hdr")
           ,(Text
"hdf",Text
"application/x-hdf")
           ,(Text
"hh",Text
"text/x-c++hdr")
           ,(Text
"hin",Text
"chemical/x-hin")
           ,(Text
"hpp",Text
"text/x-c++hdr")
           ,(Text
"hqx",Text
"application/mac-binhex40")
           ,(Text
"hs",Text
"text/x-haskell")
           ,(Text
"hta",Text
"application/hta")
           ,(Text
"htc",Text
"text/x-component")
           ,(Text
"htm",Text
"text/html")
           ,(Text
"html",Text
"text/html")
           ,(Text
"hxx",Text
"text/x-c++hdr")
           ,(Text
"ica",Text
"application/x-ica")
           ,(Text
"ice",Text
"x-conference/x-cooltalk")
           ,(Text
"ico",Text
"image/x-icon")
           ,(Text
"ics",Text
"text/calendar")
           ,(Text
"icz",Text
"text/calendar")
           ,(Text
"ief",Text
"image/ief")
           ,(Text
"iges",Text
"model/iges")
           ,(Text
"igs",Text
"model/iges")
           ,(Text
"iii",Text
"application/x-iphone")
           ,(Text
"inp",Text
"chemical/x-gamess-input")
           ,(Text
"ins",Text
"application/x-internet-signup")
           ,(Text
"iso",Text
"application/x-iso9660-image")
           ,(Text
"isp",Text
"application/x-internet-signup")
           ,(Text
"ist",Text
"chemical/x-isostar")
           ,(Text
"istr",Text
"chemical/x-isostar")
           ,(Text
"jad",Text
"text/vnd.sun.j2me.app-descriptor")
           ,(Text
"jar",Text
"application/java-archive")
           ,(Text
"java",Text
"text/x-java")
           ,(Text
"jdx",Text
"chemical/x-jcamp-dx")
           ,(Text
"jmz",Text
"application/x-jmol")
           ,(Text
"jng",Text
"image/x-jng")
           ,(Text
"jnlp",Text
"application/x-java-jnlp-file")
           ,(Text
"jpe",Text
"image/jpeg")
           ,(Text
"jpeg",Text
"image/jpeg")
           ,(Text
"jfif",Text
"image/jpeg")
           ,(Text
"jpg",Text
"image/jpeg")
           ,(Text
"js",Text
"application/javascript")
           ,(Text
"kar",Text
"audio/midi")
           ,(Text
"key",Text
"application/pgp-keys")
           ,(Text
"kil",Text
"application/x-killustrator")
           ,(Text
"kin",Text
"chemical/x-kinemage")
           ,(Text
"kml",Text
"application/vnd.google-earth.kml+xml")
           ,(Text
"kmz",Text
"application/vnd.google-earth.kmz")
           ,(Text
"kpr",Text
"application/x-kpresenter")
           ,(Text
"kpt",Text
"application/x-kpresenter")
           ,(Text
"ksp",Text
"application/x-kspread")
           ,(Text
"kwd",Text
"application/x-kword")
           ,(Text
"kwt",Text
"application/x-kword")
           ,(Text
"latex",Text
"application/x-latex")
           ,(Text
"lha",Text
"application/x-lha")
           ,(Text
"lhs",Text
"text/x-literate-haskell")
           ,(Text
"lsf",Text
"video/x-la-asf")
           ,(Text
"lsx",Text
"video/x-la-asf")
           ,(Text
"ltx",Text
"text/x-tex")
           ,(Text
"lyx",Text
"application/x-lyx")
           ,(Text
"lzh",Text
"application/x-lzh")
           ,(Text
"lzx",Text
"application/x-lzx")
           ,(Text
"m3u",Text
"audio/mpegurl")
           ,(Text
"m4a",Text
"audio/mpeg")
           ,(Text
"m4v",Text
"video/x-m4v")
           ,(Text
"maker",Text
"application/x-maker")
           ,(Text
"man",Text
"application/x-troff-man")
           ,(Text
"mcif",Text
"chemical/x-mmcif")
           ,(Text
"mcm",Text
"chemical/x-macmolecule")
           ,(Text
"mdb",Text
"application/msaccess")
           ,(Text
"me",Text
"application/x-troff-me")
           ,(Text
"mesh",Text
"model/mesh")
           ,(Text
"mid",Text
"audio/midi")
           ,(Text
"midi",Text
"audio/midi")
           ,(Text
"mif",Text
"application/x-mif")
           ,(Text
"mkv",Text
"video/x-matroska")
           ,(Text
"mm",Text
"application/x-freemind")
           ,(Text
"mmd",Text
"chemical/x-macromodel-input")
           ,(Text
"mmf",Text
"application/vnd.smaf")
           ,(Text
"mml",Text
"text/mathml")
           ,(Text
"mmod",Text
"chemical/x-macromodel-input")
           ,(Text
"mng",Text
"video/x-mng")
           ,(Text
"moc",Text
"text/x-moc")
           ,(Text
"mol",Text
"chemical/x-mdl-molfile")
           ,(Text
"mol2",Text
"chemical/x-mol2")
           ,(Text
"moo",Text
"chemical/x-mopac-out")
           ,(Text
"mop",Text
"chemical/x-mopac-input")
           ,(Text
"mopcrt",Text
"chemical/x-mopac-input")
           ,(Text
"mov",Text
"video/quicktime")
           ,(Text
"movie",Text
"video/x-sgi-movie")
           ,(Text
"mp2",Text
"audio/mpeg")
           ,(Text
"mp3",Text
"audio/mpeg")
           ,(Text
"mp4",Text
"video/mp4")
           ,(Text
"mpc",Text
"chemical/x-mopac-input")
           ,(Text
"mpe",Text
"video/mpeg")
           ,(Text
"mpeg",Text
"video/mpeg")
           ,(Text
"mpega",Text
"audio/mpeg")
           ,(Text
"mpg",Text
"video/mpeg")
           ,(Text
"mpga",Text
"audio/mpeg")
           ,(Text
"ms",Text
"application/x-troff-ms")
           ,(Text
"msh",Text
"model/mesh")
           ,(Text
"msi",Text
"application/x-msi")
           ,(Text
"mvb",Text
"chemical/x-mopac-vib")
           ,(Text
"mxu",Text
"video/vnd.mpegurl")
           ,(Text
"nb",Text
"application/mathematica")
           ,(Text
"nc",Text
"application/x-netcdf")
           ,(Text
"nwc",Text
"application/x-nwc")
           ,(Text
"o",Text
"application/x-object")
           ,(Text
"oda",Text
"application/oda")
           ,(Text
"odb",Text
"application/vnd.oasis.opendocument.database")
           ,(Text
"odc",Text
"application/vnd.oasis.opendocument.chart")
           ,(Text
"odf",Text
"application/vnd.oasis.opendocument.formula")
           ,(Text
"odg",Text
"application/vnd.oasis.opendocument.graphics")
           ,(Text
"odi",Text
"application/vnd.oasis.opendocument.image")
           ,(Text
"odm",Text
"application/vnd.oasis.opendocument.text-master")
           ,(Text
"odp",Text
"application/vnd.oasis.opendocument.presentation")
           ,(Text
"ods",Text
"application/vnd.oasis.opendocument.spreadsheet")
           ,(Text
"odt",Text
"application/vnd.oasis.opendocument.text")
           ,(Text
"oga",Text
"audio/ogg")
           ,(Text
"ogg",Text
"application/ogg")
           ,(Text
"ogv",Text
"video/ogg")
           ,(Text
"ogx",Text
"application/ogg")
           ,(Text
"old",Text
"application/x-trash")
           ,(Text
"opus",Text
"audio/ogg")
           ,(Text
"otg",Text
"application/vnd.oasis.opendocument.graphics-template")
           ,(Text
"oth",Text
"application/vnd.oasis.opendocument.text-web")
           ,(Text
"otp",Text
"application/vnd.oasis.opendocument.presentation-template")
           ,(Text
"ots",Text
"application/vnd.oasis.opendocument.spreadsheet-template")
           ,(Text
"otf",Text
"application/vnd.ms-opentype")
           ,(Text
"ott",Text
"application/vnd.oasis.opendocument.text-template")
           ,(Text
"oza",Text
"application/x-oz-application")
           ,(Text
"p",Text
"text/x-pascal")
           ,(Text
"p7r",Text
"application/x-pkcs7-certreqresp")
           ,(Text
"pac",Text
"application/x-ns-proxy-autoconfig")
           ,(Text
"pas",Text
"text/x-pascal")
           ,(Text
"pat",Text
"image/x-coreldrawpattern")
           ,(Text
"patch",Text
"text/x-diff")
           ,(Text
"pbm",Text
"image/x-portable-bitmap")
           ,(Text
"pcap",Text
"application/cap")
           ,(Text
"pcf",Text
"application/x-font")
           ,(Text
"pcf.Z",Text
"application/x-font")
           ,(Text
"pcx",Text
"image/pcx")
           ,(Text
"pdb",Text
"chemical/x-pdb")
           ,(Text
"pdf",Text
"application/pdf")
           ,(Text
"pfa",Text
"application/x-font")
           ,(Text
"pfb",Text
"application/x-font")
           ,(Text
"pgm",Text
"image/x-portable-graymap")
           ,(Text
"pgn",Text
"application/x-chess-pgn")
           ,(Text
"pgp",Text
"application/pgp-signature")
           ,(Text
"php",Text
"application/x-httpd-php")
           ,(Text
"php3",Text
"application/x-httpd-php3")
           ,(Text
"php3p",Text
"application/x-httpd-php3-preprocessed")
           ,(Text
"php4",Text
"application/x-httpd-php4")
           ,(Text
"phps",Text
"application/x-httpd-php-source")
           ,(Text
"pht",Text
"application/x-httpd-php")
           ,(Text
"phtml",Text
"application/x-httpd-php")
           ,(Text
"pk",Text
"application/x-tex-pk")
           ,(Text
"pl",Text
"text/x-perl")
           ,(Text
"pls",Text
"audio/x-scpls")
           ,(Text
"pm",Text
"text/x-perl")
           ,(Text
"png",Text
"image/png")
           ,(Text
"pnm",Text
"image/x-portable-anymap")
           ,(Text
"pot",Text
"text/plain")
           ,(Text
"ppm",Text
"image/x-portable-pixmap")
           ,(Text
"pps",Text
"application/vnd.ms-powerpoint")
           ,(Text
"ppt",Text
"application/vnd.ms-powerpoint")
           ,(Text
"prf",Text
"application/pics-rules")
           ,(Text
"prt",Text
"chemical/x-ncbi-asn1-ascii")
           ,(Text
"ps",Text
"application/postscript")
           ,(Text
"psd",Text
"image/x-photoshop")
           ,(Text
"py",Text
"text/x-python")
           ,(Text
"pyc",Text
"application/x-python-code")
           ,(Text
"pyo",Text
"application/x-python-code")
           ,(Text
"qt",Text
"video/quicktime")
           ,(Text
"qtl",Text
"application/x-quicktimeplayer")
           ,(Text
"ra",Text
"audio/x-pn-realaudio")
           ,(Text
"ram",Text
"audio/x-pn-realaudio")
           ,(Text
"rar",Text
"application/rar")
           ,(Text
"ras",Text
"image/x-cmu-raster")
           ,(Text
"rd",Text
"chemical/x-mdl-rdfile")
           ,(Text
"rdf",Text
"application/rdf+xml")
           ,(Text
"rgb",Text
"image/x-rgb")
           ,(Text
"rhtml",Text
"application/x-httpd-eruby")
           ,(Text
"rm",Text
"audio/x-pn-realaudio")
           ,(Text
"roff",Text
"application/x-troff")
           ,(Text
"ros",Text
"chemical/x-rosdal")
           ,(Text
"rpm",Text
"application/x-redhat-package-manager")
           ,(Text
"rss",Text
"application/rss+xml")
           ,(Text
"rtf",Text
"application/rtf")
           ,(Text
"rtx",Text
"text/richtext")
           ,(Text
"rxn",Text
"chemical/x-mdl-rxnfile")
           ,(Text
"sct",Text
"text/scriptlet")
           ,(Text
"sd",Text
"chemical/x-mdl-sdfile")
           ,(Text
"sd2",Text
"audio/x-sd2")
           ,(Text
"sda",Text
"application/vnd.stardivision.draw")
           ,(Text
"sdc",Text
"application/vnd.stardivision.calc")
           ,(Text
"sdd",Text
"application/vnd.stardivision.impress")
           ,(Text
"sdf",Text
"application/vnd.stardivision.math")
           ,(Text
"sds",Text
"application/vnd.stardivision.chart")
           ,(Text
"sdw",Text
"application/vnd.stardivision.writer")
           ,(Text
"ser",Text
"application/java-serialized-object")
           ,(Text
"sgf",Text
"application/x-go-sgf")
           ,(Text
"sgl",Text
"application/vnd.stardivision.writer-global")
           ,(Text
"sh",Text
"application/x-sh")
           ,(Text
"shar",Text
"application/x-shar")
           ,(Text
"shtml",Text
"text/html")
           ,(Text
"sid",Text
"audio/prs.sid")
           ,(Text
"sik",Text
"application/x-trash")
           ,(Text
"silo",Text
"model/mesh")
           ,(Text
"sis",Text
"application/vnd.symbian.install")
           ,(Text
"sisx",Text
"x-epoc/x-sisx-app")
           ,(Text
"sit",Text
"application/x-stuffit")
           ,(Text
"sitx",Text
"application/x-stuffit")
           ,(Text
"skd",Text
"application/x-koan")
           ,(Text
"skm",Text
"application/x-koan")
           ,(Text
"skp",Text
"application/x-koan")
           ,(Text
"skt",Text
"application/x-koan")
           ,(Text
"smi",Text
"application/smil")
           ,(Text
"smil",Text
"application/smil")
           ,(Text
"snd",Text
"audio/basic")
           ,(Text
"spc",Text
"chemical/x-galactic-spc")
           ,(Text
"spl",Text
"application/futuresplash")
           ,(Text
"spx",Text
"audio/ogg")
           ,(Text
"src",Text
"application/x-wais-source")
           ,(Text
"stc",Text
"application/vnd.sun.xml.calc.template")
           ,(Text
"std",Text
"application/vnd.sun.xml.draw.template")
           ,(Text
"sti",Text
"application/vnd.sun.xml.impress.template")
           ,(Text
"stl",Text
"application/vnd.ms-pki.stl")
           ,(Text
"stw",Text
"application/vnd.sun.xml.writer.template")
           ,(Text
"sty",Text
"text/x-tex")
           ,(Text
"sv4cpio",Text
"application/x-sv4cpio")
           ,(Text
"sv4crc",Text
"application/x-sv4crc")
           ,(Text
"svg",Text
"image/svg+xml")
           -- removed for now, since it causes problems with
           -- extensionFromMimeType: see #2183.
           -- ,("svgz","image/svg+xml")
           ,(Text
"sw",Text
"chemical/x-swissprot")
           ,(Text
"swf",Text
"application/x-shockwave-flash")
           ,(Text
"swfl",Text
"application/x-shockwave-flash")
           ,(Text
"sxc",Text
"application/vnd.sun.xml.calc")
           ,(Text
"sxd",Text
"application/vnd.sun.xml.draw")
           ,(Text
"sxg",Text
"application/vnd.sun.xml.writer.global")
           ,(Text
"sxi",Text
"application/vnd.sun.xml.impress")
           ,(Text
"sxm",Text
"application/vnd.sun.xml.math")
           ,(Text
"sxw",Text
"application/vnd.sun.xml.writer")
           ,(Text
"t",Text
"application/x-troff")
           ,(Text
"tar",Text
"application/x-tar")
           ,(Text
"taz",Text
"application/x-gtar")
           ,(Text
"tcl",Text
"application/x-tcl")
           ,(Text
"tex",Text
"text/x-tex")
           ,(Text
"texi",Text
"application/x-texinfo")
           ,(Text
"texinfo",Text
"application/x-texinfo")
           ,(Text
"text",Text
"text/plain")
           ,(Text
"tgf",Text
"chemical/x-mdl-tgf")
           ,(Text
"tgz",Text
"application/x-gtar")
           ,(Text
"tif",Text
"image/tiff")
           ,(Text
"tiff",Text
"image/tiff")
           ,(Text
"tk",Text
"text/x-tcl")
           ,(Text
"tm",Text
"text/texmacs")
           ,(Text
"torrent",Text
"application/x-bittorrent")
           ,(Text
"tr",Text
"application/x-troff")
           ,(Text
"ts",Text
"text/texmacs")
           ,(Text
"tsp",Text
"application/dsptype")
           ,(Text
"tsv",Text
"text/tab-separated-values")
           ,(Text
"ttf",Text
"application/font-sfnt")
           ,(Text
"txt",Text
"text/plain")
           ,(Text
"udeb",Text
"application/x-debian-package")
           ,(Text
"uls",Text
"text/iuls")
           ,(Text
"ustar",Text
"application/x-ustar")
           ,(Text
"val",Text
"chemical/x-ncbi-asn1-binary")
           ,(Text
"vcd",Text
"application/x-cdlink")
           ,(Text
"vcf",Text
"text/x-vcard")
           ,(Text
"vcs",Text
"text/x-vcalendar")
           ,(Text
"vmd",Text
"chemical/x-vmd")
           ,(Text
"vms",Text
"chemical/x-vamas-iso14976")
           ,(Text
"vrm",Text
"x-world/x-vrml")
           ,(Text
"vrml",Text
"model/vrml")
           ,(Text
"vs",Text
"text/plain")
           ,(Text
"vsd",Text
"application/vnd.visio")
           ,(Text
"vtt",Text
"text/vtt")
           ,(Text
"wad",Text
"application/x-doom")
           ,(Text
"wav",Text
"audio/x-wav")
           ,(Text
"wax",Text
"audio/x-ms-wax")
           ,(Text
"wbmp",Text
"image/vnd.wap.wbmp")
           ,(Text
"wbxml",Text
"application/vnd.wap.wbxml")
           ,(Text
"webm",Text
"video/webm")
           ,(Text
"webp",Text
"image/webp")
           ,(Text
"wk",Text
"application/x-123")
           ,(Text
"wm",Text
"video/x-ms-wm")
           ,(Text
"wma",Text
"audio/x-ms-wma")
           ,(Text
"wmd",Text
"application/x-ms-wmd")
           ,(Text
"wmf",Text
"image/x-wmf")
           ,(Text
"wml",Text
"text/vnd.wap.wml")
           ,(Text
"wmlc",Text
"application/vnd.wap.wmlc")
           ,(Text
"wmls",Text
"text/vnd.wap.wmlscript")
           ,(Text
"wmlsc",Text
"application/vnd.wap.wmlscriptc")
           ,(Text
"wmv",Text
"video/x-ms-wmv")
           ,(Text
"wmx",Text
"video/x-ms-wmx")
           ,(Text
"wmz",Text
"application/x-ms-wmz")
           ,(Text
"woff",Text
"application/font-woff")
           ,(Text
"woff2",Text
"font/woff2")
           ,(Text
"wp5",Text
"application/wordperfect5.1")
           ,(Text
"wpd",Text
"application/wordperfect")
           ,(Text
"wrl",Text
"model/vrml")
           ,(Text
"wsc",Text
"text/scriptlet")
           ,(Text
"wvx",Text
"video/x-ms-wvx")
           ,(Text
"wz",Text
"application/x-wingz")
           ,(Text
"xbm",Text
"image/x-xbitmap")
           ,(Text
"xcf",Text
"image/x-xcf")
           ,(Text
"xht",Text
"application/xhtml+xml")
           ,(Text
"xhtml",Text
"application/xhtml+xml")
           ,(Text
"xlb",Text
"application/vnd.ms-excel")
           ,(Text
"xls",Text
"application/vnd.ms-excel")
           ,(Text
"xlt",Text
"application/vnd.ms-excel")
           ,(Text
"xml",Text
"application/xml")
           ,(Text
"xpi",Text
"application/x-xpinstall")
           ,(Text
"xpm",Text
"image/x-xpixmap")
           ,(Text
"xsl",Text
"application/xml")
           ,(Text
"xtel",Text
"chemical/x-xtel")
           ,(Text
"xul",Text
"application/vnd.mozilla.xul+xml")
           ,(Text
"xwd",Text
"image/x-xwindowdump")
           ,(Text
"xyz",Text
"chemical/x-xyz")
           ,(Text
"zip",Text
"application/zip")
           ,(Text
"zmt",Text
"chemical/x-mopac-input")
           ]