{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} module Text.XmlHtml.Common where import Data.ByteString (ByteString) import Blaze.ByteString.Builder import qualified Data.ByteString.Char8 as BS import qualified Data.ByteString.Builder as B import Data.Char (isAscii, isLatin1) import qualified Data.HashMap.Strict as M import qualified Data.HashSet as S import qualified Data.Map as Map import Data.Maybe import Data.Text (Text) import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.Text.Encoding.Error as TE import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TL import Text.XmlHtml.HTML.Meta (reversePredefinedRefs, explicitAttributes) ------------------------------------------------------------------------------ -- | Represents a document fragment, including the format, encoding, and -- document type declaration as well as its content. data Document = XmlDocument { docEncoding :: !Encoding, docType :: !(Maybe DocType), docContent :: ![Node] } | HtmlDocument { docEncoding :: !Encoding, docType :: !(Maybe DocType), docContent :: ![Node] } deriving (Eq, Show) ------------------------------------------------------------------------------ -- | A node of a document structure. A node can be text, a comment, or an -- element. XML processing instructions are intentionally omitted as a -- simplification, and CDATA and plain text are both text nodes, since they -- ought to be semantically interchangeable. data Node = TextNode !Text | Comment !Text | Element { elementTag :: !Text, elementAttrs :: ![(Text, Text)], elementChildren :: ![Node] } deriving (Eq, Show) ------------------------------------------------------------------------------ -- | Rendering options data RenderOptions = RenderOptions { roAttributeSurround :: AttrSurround -- ^ Single or double-quotes used around attribute values , roAttributeResolveInternal :: AttrResolveInternalQuotes -- ^ Quotes inside attribute values that conflict with the surround -- are escaped, or the outer quotes are changed to avoid conflicting -- with the internal ones , roExplicitEmptyAttrs :: Maybe (M.HashMap Text (S.HashSet Text)) -- ^ Attributes in the whitelist with empty values are -- rendered as