module Text.HTML.WraXML.Document (
XmlDoc.T(..), XmlDoc.lift,
decodeAdaptive, format,
) where
import qualified Text.HTML.WraXML.Tree as HtmlTree
import qualified Text.XML.WraXML.Document as XmlDoc
import qualified Text.XML.WraXML.String as XmlString
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import qualified Text.XML.Basic.Format as Format
import qualified Text.HTML.Basic.String as HtmlStringB
import qualified Text.HTML.Basic.Character as HtmlChar
import Control.Monad.Trans.State (State, put, get, )
import Control.Applicative (liftA2, )
import Data.Traversable (traverse, )
format ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
XmlDoc.T i name string -> ShowS
format (XmlDoc.Cons xml dtd trees) =
let (formatHTML, formatXMLDecl) =
maybe
(HtmlTree.formatMany, id)
(\xmlDecl ->
(HtmlTree.formatManyXHTML,
XmlDoc.formatXMLDeclaration xmlDecl)) xml
in formatXMLDecl .
maybe id XmlDoc.formatDocType dtd .
formatHTML trees
decodeAdaptive ::
(Name.Attribute name, Name.Tag name) =>
(XmlString.Encoding -> XmlString.Encoded -> String) ->
XmlDoc.T i name [HtmlChar.T] ->
State (XmlString.Encoded -> String) (XmlDoc.T i name String)
decodeAdaptive getDecoder (XmlDoc.Cons xml0 dtd trees0) =
liftA2
(\xml1 trees1 -> XmlDoc.Cons xml1 dtd trees1)
(do decoder <- get
let xml1 = fmap (map (fmap (HtmlStringB.decode decoder))) xml0
maybe
(return ())
(put . getDecoder) $
Attr.lookup Attr.encodingName =<< xml1
return xml1)
(traverse (HtmlTree.decodeAdaptive getDecoder) trees0)