module Text.XML.HXT.DOM.MimeTypes
where
import Control.Monad ( mplus )
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as C
import Data.Char
import Data.List
import qualified Data.Map as M
import Data.Maybe
import Text.XML.HXT.DOM.MimeTypeDefaults
type MimeTypeTable = M.Map String String
application_xhtml,
application_xml,
application_xml_external_parsed_entity,
application_xml_dtd,
text_html,
text_pdf,
text_plain,
text_xdtd,
text_xml,
text_xml_external_parsed_entity :: String
application_xhtml = "application/xhtml+xml"
application_xml = "application/xml"
application_xml_external_parsed_entity = "application/xml-external-parsed-entity"
application_xml_dtd = "application/xml-dtd"
text_html = "text/html"
text_pdf = "text/pdf"
text_plain = "text/plain"
text_xdtd = "text/x-dtd"
text_xml = "text/xml"
text_xml_external_parsed_entity = "text/xml-external-parsed-entity"
isTextMimeType :: String -> Bool
isTextMimeType = ("text/" `isPrefixOf`)
isHtmlMimeType :: String -> Bool
isHtmlMimeType t = t == text_html
isXmlMimeType :: String -> Bool
isXmlMimeType t = ( t `elem` [ application_xhtml
, application_xml
, application_xml_external_parsed_entity
, application_xml_dtd
, text_xml
, text_xml_external_parsed_entity
, text_xdtd
]
||
"+xml" `isSuffixOf` t
)
defaultMimeTypeTable :: MimeTypeTable
defaultMimeTypeTable = M.fromList mimeTypeDefaults
extensionToMimeType :: String -> MimeTypeTable -> String
extensionToMimeType e = fromMaybe "" . lookupMime
where
lookupMime t = M.lookup e t
`mplus`
M.lookup (map toLower e) t
`mplus`
M.lookup (map toUpper e) t
readMimeTypeTable :: FilePath -> IO MimeTypeTable
readMimeTypeTable inp = do
cb <- B.readFile inp
return . M.fromList . parseMimeTypeTable . C.unpack $ cb
parseMimeTypeTable :: String -> [(String, String)]
parseMimeTypeTable = concat
. map buildPairs
. map words
. filter (not . ("#" `isPrefixOf`))
. filter (not . all (isSpace))
. lines
where
buildPairs :: [String] -> [(String, String)]
buildPairs [] = []
buildPairs (mt:exts) = map (\ x -> (x, mt)) $ exts