module Codec.Xlsx.Types.Internal.ContentTypes where
import Control.Arrow
import Data.Map (Map)
import qualified Data.Map as M
import Data.Text (Text)
import qualified Data.Text as T
import Text.XML
import Text.XML.Cursor
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative
#endif
import Codec.Xlsx.Parser.Internal
data Override = Override
{ ovrPartName :: FilePath
, ovrContentType :: Text
} deriving (Eq, Show)
newtype ContentTypes = ContentTypes
{ ctTypes :: Map FilePath Text
} deriving (Eq, Show)
lookup :: FilePath -> ContentTypes -> Maybe Text
lookup path = M.lookup path . ctTypes
instance FromCursor ContentTypes where
fromCursor cur = do
let items = cur $/ element (ct"Override") >=> fromCursor
return . ContentTypes . M.fromList $ map (ovrPartName &&& ovrContentType) items
instance FromCursor Override where
fromCursor cur = do
ovrPartName <- T.unpack <$> attribute "PartName" cur
ovrContentType <- attribute "ContentType" cur
return Override{..}
ct :: Text -> Name
ct x = Name
{ nameLocalName = x
, nameNamespace = Just contentTypesNs
, namePrefix = Nothing
}
contentTypesNs :: Text
contentTypesNs = "http://schemas.openxmlformats.org/package/2006/content-types"