module Text.HTML.WraXML.Tree where
import qualified Data.Tree.BranchLeafLabel as Tree
import qualified Text.XML.WraXML.Tree as XmlTree
import qualified Text.XML.WraXML.String as XmlString
import qualified Data.Char as Char
import qualified Text.XML.Basic.Tag as TagX
import qualified Text.HTML.Basic.Tag as Tag
import qualified Text.HTML.Basic.Character as HtmlChar
import qualified Text.HTML.Basic.String as HtmlStringB
import qualified Text.HTML.WraXML.Element as Elem
import qualified Text.XML.Basic.Attribute as Attr
import qualified Text.XML.Basic.Name as Name
import Text.XML.WraXML.Tree (formatLeaf, )
import qualified Text.XML.Basic.Format as Format
import Control.Monad.Trans.State (State, put, get, )
import Control.Applicative (liftA, liftA2, )
import qualified Data.List.Reverse.StrictElement as Rev
import Data.Tuple.HT (mapFst, )
import Control.Monad (liftM2, )
import Data.Maybe (mapMaybe, fromMaybe, )
findMetaEncoding ::
(Name.Tag name, Name.Attribute name) =>
XmlTree.T i name String -> Maybe String
findMetaEncoding :: forall name i.
(Tag name, Attribute name) =>
T i name String -> Maybe String
findMetaEncoding =
(String -> String) -> Maybe String -> Maybe String
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
Char.toLower (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
Rev.takeWhile (Char
'='Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
/=)) (Maybe String -> Maybe String)
-> (T i name String -> Maybe String)
-> T i name String
-> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
String -> [(String, String)] -> Maybe String
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup String
"content-type" ([(String, String)] -> Maybe String)
-> (T i name String -> [(String, String)])
-> T i name String
-> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((String, String) -> (String, String))
-> [(String, String)] -> [(String, String)]
forall a b. (a -> b) -> [a] -> [b]
map ((String -> String) -> (String, String) -> (String, String)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst ((Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
Char.toLower)) ([(String, String)] -> [(String, String)])
-> (T i name String -> [(String, String)])
-> T i name String
-> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
T i name String -> [(String, String)]
forall name i.
(Tag name, Attribute name) =>
T i name String -> [(String, String)]
getMetaHTTPHeaders
getMetaHTTPHeaders ::
(Name.Tag name, Name.Attribute name) =>
XmlTree.T i name String -> [(String, String)]
=
([T name String] -> Maybe (String, String))
-> [[T name String]] -> [(String, String)]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (\[T name String]
attrs ->
(String -> String -> (String, String))
-> Maybe String -> Maybe String -> Maybe (String, String)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (,)
(String -> [T name String] -> Maybe String
forall name string.
Attribute name =>
String -> [T name string] -> Maybe string
Attr.lookupLit String
"http-equiv" [T name String]
attrs)
(String -> [T name String] -> Maybe String
forall name string.
Attribute name =>
String -> [T name string] -> Maybe string
Attr.lookupLit String
"content" [T name String]
attrs)) ([[T name String]] -> [(String, String)])
-> (T i name String -> [[T name String]])
-> T i name String
-> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(T name String -> [T name String])
-> [T name String] -> [[T name String]]
forall a b. (a -> b) -> [a] -> [b]
map T name String -> [T name String]
forall name str. T name str -> [T name str]
Elem.attributes_ ([T name String] -> [[T name String]])
-> (T i name String -> [T name String])
-> T i name String
-> [[T name String]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(T name String -> Bool) -> [T name String] -> [T name String]
forall a. (a -> Bool) -> [a] -> [a]
filter ((Name name -> Bool) -> T name String -> Bool
forall name str. (Name name -> Bool) -> T name str -> Bool
Elem.checkName (String -> Name name -> Bool
forall name. C name => String -> name -> Bool
Name.match String
"meta")) ([T name String] -> [T name String])
-> (T i name String -> [T name String])
-> T i name String
-> [T name String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((T name String, [T i name String]) -> T name String)
-> [(T name String, [T i name String])] -> [T name String]
forall a b. (a -> b) -> [a] -> [b]
map (T name String, [T i name String]) -> T name String
forall a b. (a, b) -> a
fst ([(T name String, [T i name String])] -> [T name String])
-> (T i name String -> [(T name String, [T i name String])])
-> T i name String
-> [T name String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(T i name String -> Maybe (T name String, [T i name String]))
-> [T i name String] -> [(T name String, [T i name String])]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe T i name String -> Maybe (T name String, [T i name String])
forall i name str.
T i name str -> Maybe (T name str, [T i name str])
XmlTree.maybeTag ([T i name String] -> [(T name String, [T i name String])])
-> (T i name String -> [T i name String])
-> T i name String
-> [(T name String, [T i name String])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
((T name String, [T i name String]) -> [T i name String])
-> [(T name String, [T i name String])] -> [T i name String]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (T name String, [T i name String]) -> [T i name String]
forall a b. (a, b) -> b
snd ([(T name String, [T i name String])] -> [T i name String])
-> (T i name String -> [(T name String, [T i name String])])
-> T i name String
-> [T i name String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(T name String -> Bool)
-> T i name String -> [(T name String, [T i name String])]
forall name str i.
(T name str -> Bool)
-> T i name str -> [(T name str, [T i name str])]
XmlTree.filterTagsFlatten ((Name name -> Bool) -> T name String -> Bool
forall name str. (Name name -> Bool) -> T name str -> Bool
Elem.checkName (String -> Name name -> Bool
forall name. C name => String -> name -> Bool
Name.match String
"head"))
decodeAdaptive ::
(Name.Attribute name, Name.Tag name) =>
(XmlString.Encoding -> XmlString.Encoded -> String) ->
XmlTree.T i name [HtmlChar.T] ->
State (XmlString.Encoded -> String) (XmlTree.T i name String)
decodeAdaptive :: forall name i.
(Attribute name, Tag name) =>
(String -> String -> String)
-> T i name [T] -> State (String -> String) (T i name String)
decodeAdaptive String -> String -> String
getDecoder =
(i
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
-> State (String -> String) (T i name String))
-> (T name [T]
-> [State (String -> String) (T i name String)]
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String)))
-> (Leaf name [T]
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String)))
-> T i name [T]
-> State (String -> String) (T i name String)
forall i a b name str.
(i -> a -> b)
-> (T name str -> [b] -> a)
-> (Leaf name str -> a)
-> T i name str
-> b
XmlTree.fold
((Elem i (Branch name String) (Leaf name String) -> T i name String)
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
-> State (String -> String) (T i name String)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA ((Elem i (Branch name String) (Leaf name String)
-> T i name String)
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
-> State (String -> String) (T i name String))
-> (i
-> Elem i (Branch name String) (Leaf name String)
-> T i name String)
-> i
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
-> State (String -> String) (T i name String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i
-> Elem i (Branch name String) (Leaf name String)
-> T i name String
forall i name str.
i -> Elem i (Branch name str) (Leaf name str) -> T i name str
XmlTree.wrap2)
(\T name [T]
elm [State (String -> String) (T i name String)]
subTrees ->
(T name String
-> [T i (Branch name String) (Leaf name String)]
-> Elem i (Branch name String) (Leaf name String))
-> StateT (String -> String) Identity (T name String)
-> StateT
(String -> String)
Identity
[T i (Branch name String) (Leaf name String)]
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
forall a b c.
(a -> b -> c)
-> StateT (String -> String) Identity a
-> StateT (String -> String) Identity b
-> StateT (String -> String) Identity c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (Branch name String
-> [T i (Branch name String) (Leaf name String)]
-> Elem i (Branch name String) (Leaf name String)
forall i branch leaf.
branch -> [T i branch leaf] -> Elem i branch leaf
Tree.Branch (Branch name String
-> [T i (Branch name String) (Leaf name String)]
-> Elem i (Branch name String) (Leaf name String))
-> (T name String -> Branch name String)
-> T name String
-> [T i (Branch name String) (Leaf name String)]
-> Elem i (Branch name String) (Leaf name String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T name String -> Branch name String
forall name str. T name str -> Branch name str
XmlTree.Tag)
((String -> String -> String)
-> T name [T] -> StateT (String -> String) Identity (T name String)
forall name.
(Attribute name, Tag name) =>
(String -> String -> String)
-> T name [T] -> State (String -> String) (T name String)
Elem.decodeAdaptive String -> String -> String
getDecoder T name [T]
elm)
(([T i name String]
-> [T i (Branch name String) (Leaf name String)])
-> StateT (String -> String) Identity [T i name String]
-> StateT
(String -> String)
Identity
[T i (Branch name String) (Leaf name String)]
forall a b.
(a -> b)
-> StateT (String -> String) Identity a
-> StateT (String -> String) Identity b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((T i name String -> T i (Branch name String) (Leaf name String))
-> [T i name String]
-> [T i (Branch name String) (Leaf name String)]
forall a b. (a -> b) -> [a] -> [b]
map T i name String -> T i (Branch name String) (Leaf name String)
forall i name str.
T i name str -> T i (Branch name str) (Leaf name str)
XmlTree.unwrap) (StateT (String -> String) Identity [T i name String]
-> StateT
(String -> String)
Identity
[T i (Branch name String) (Leaf name String)])
-> StateT (String -> String) Identity [T i name String]
-> StateT
(String -> String)
Identity
[T i (Branch name String) (Leaf name String)]
forall a b. (a -> b) -> a -> b
$ [State (String -> String) (T i name String)]
-> StateT (String -> String) Identity [T i name String]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence [State (String -> String) (T i name String)]
subTrees))
((Leaf name String
-> Elem i (Branch name String) (Leaf name String))
-> StateT (String -> String) Identity (Leaf name String)
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
liftA Leaf name String -> Elem i (Branch name String) (Leaf name String)
forall i branch leaf. leaf -> Elem i branch leaf
Tree.Leaf (StateT (String -> String) Identity (Leaf name String)
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String)))
-> (Leaf name [T]
-> StateT (String -> String) Identity (Leaf name String))
-> Leaf name [T]
-> StateT
(String -> String)
Identity
(Elem i (Branch name String) (Leaf name String))
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
(String -> String -> String)
-> Leaf name [T]
-> StateT (String -> String) Identity (Leaf name String)
forall name.
(Attribute name, Tag name) =>
(String -> String -> String)
-> Leaf name [T] -> State (String -> String) (Leaf name String)
decodeLeafAdaptive String -> String -> String
getDecoder)
decodeLeafAdaptive ::
(Name.Attribute name, Name.Tag name) =>
(XmlString.Encoding -> XmlString.Encoded -> String) ->
XmlTree.Leaf name [HtmlChar.T] ->
State (XmlString.Encoded -> String) (XmlTree.Leaf name String)
decodeLeafAdaptive :: forall name.
(Attribute name, Tag name) =>
(String -> String -> String)
-> Leaf name [T] -> State (String -> String) (Leaf name String)
decodeLeafAdaptive String -> String -> String
getDecoder Leaf name [T]
leaf0 =
do String -> String
decoder <- StateT (String -> String) Identity (String -> String)
forall (m :: * -> *) s. Monad m => StateT s m s
get
let leaf1 :: Leaf name String
leaf1 =
Leaf name String
-> (String -> Leaf name String) -> Maybe String -> Leaf name String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(([T] -> String) -> Leaf name [T] -> Leaf name String
forall a b. (a -> b) -> Leaf name a -> Leaf name b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((String -> String) -> [T] -> String
HtmlStringB.decode String -> String
decoder) Leaf name [T]
leaf0)
(String -> Leaf name String
forall name str. String -> Leaf name str
XmlTree.CData (String -> Leaf name String)
-> (String -> String) -> String -> Leaf name String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
decoder)
(Leaf name [T] -> Maybe String
forall name str. Leaf name str -> Maybe String
XmlTree.maybeCDataLeaf Leaf name [T]
leaf0)
StateT (String -> String) Identity ()
-> (String -> StateT (String -> String) Identity ())
-> Maybe String
-> StateT (String -> String) Identity ()
forall b a. b -> (a -> b) -> Maybe a -> b
maybe
(() -> StateT (String -> String) Identity ()
forall a. a -> StateT (String -> String) Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
((String -> String) -> StateT (String -> String) Identity ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
put ((String -> String) -> StateT (String -> String) Identity ())
-> (String -> String -> String)
-> String
-> StateT (String -> String) Identity ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> String
getDecoder) (Maybe String -> StateT (String -> String) Identity ())
-> Maybe String -> StateT (String -> String) Identity ()
forall a b. (a -> b) -> a -> b
$
(Name name -> T name String -> Maybe String)
-> (Name name, T name String) -> Maybe String
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Name name -> T name String -> Maybe String
forall name string.
(Tag name, Attribute name) =>
Name name -> T name string -> Maybe string
TagX.maybeXMLEncoding ((Name name, T name String) -> Maybe String)
-> Maybe (Name name, T name String) -> Maybe String
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<<
Leaf name String -> Maybe (Name name, T name String)
forall name str. Leaf name str -> Maybe (Name name, T name str)
XmlTree.maybeProcessingLeaf Leaf name String
leaf1
Leaf name String -> State (String -> String) (Leaf name String)
forall a. a -> StateT (String -> String) Identity a
forall (m :: * -> *) a. Monad m => a -> m a
return Leaf name String
leaf1
{-# DEPRECATED decodeSpecialCharsMetaEncoding "This calls findMetaEncoding which is a potential space leak. Better use decodeAdaptive." #-}
decodeSpecialCharsMetaEncoding ::
(Name.Tag name, Name.Attribute name) =>
XmlTree.T i name XmlString.T -> [XmlTree.T i name String]
decodeSpecialCharsMetaEncoding :: forall name i.
(Tag name, Attribute name) =>
T i name [T] -> [T i name String]
decodeSpecialCharsMetaEncoding T i name [T]
tree =
let unicodeTree :: T i name String
unicodeTree = T i name [T] -> T i name String
forall i name. T i name [T] -> T i name String
XmlTree.unescape T i name [T]
tree
in [T i name String] -> Maybe [T i name String] -> [T i name String]
forall a. a -> Maybe a -> a
fromMaybe
[T i name String
unicodeTree]
((String -> T i name [T] -> Maybe [T i name String])
-> T i name [T] -> String -> Maybe [T i name String]
forall a b c. (a -> b -> c) -> b -> a -> c
flip String -> T i name [T] -> Maybe [T i name String]
forall name i.
(Tag name, Attribute name) =>
String -> T i name [T] -> Maybe [T i name String]
XmlTree.maybeDecodeSpecialChars T i name [T]
tree
(String -> Maybe [T i name String])
-> Maybe String -> Maybe [T i name String]
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T i name String -> Maybe String
forall name i.
(Tag name, Attribute name) =>
T i name String -> Maybe String
findMetaEncoding T i name String
unicodeTree)
formatMany ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
[XmlTree.T i name string] -> ShowS
formatMany :: forall name string i.
(Tag name, Attribute name, C string) =>
[T i name string] -> String -> String
formatMany = (T i name string -> String -> String)
-> [T i name string] -> String -> String
forall a. (a -> String -> String) -> [a] -> String -> String
Format.many T i name string -> String -> String
forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> String -> String
format
format ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
XmlTree.T i name string -> ShowS
format :: forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> String -> String
format =
(i -> (String -> String) -> String -> String)
-> (Branch name string -> [String -> String] -> String -> String)
-> (Leaf name string -> String -> String)
-> T i (Branch name string) (Leaf name string)
-> String
-> String
forall i a b branch leaf.
(i -> a -> b)
-> (branch -> [b] -> a) -> (leaf -> a) -> T i branch leaf -> b
Tree.fold (((String -> String) -> i -> String -> String)
-> i -> (String -> String) -> String -> String
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> String) -> i -> String -> String
forall a b. a -> b -> a
const) Branch name string -> [String -> String] -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Branch name string -> [String -> String] -> String -> String
formatBranch Leaf name string -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Leaf name string -> String -> String
formatLeaf (T i (Branch name string) (Leaf name string) -> String -> String)
-> (T i name string -> T i (Branch name string) (Leaf name string))
-> T i name string
-> String
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
T i name string -> T i (Branch name string) (Leaf name string)
forall i name str.
T i name str -> T i (Branch name str) (Leaf name str)
XmlTree.unwrap
formatBranch ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
XmlTree.Branch name string -> [ShowS] -> ShowS
formatBranch :: forall name string.
(Tag name, Attribute name, C string) =>
Branch name string -> [String -> String] -> String -> String
formatBranch = Bool
-> Branch name string -> [String -> String] -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Bool
-> Branch name string -> [String -> String] -> String -> String
formatBranchGen Bool
False
formatManyXHTML ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
[XmlTree.T i name string] -> ShowS
formatManyXHTML :: forall name string i.
(Tag name, Attribute name, C string) =>
[T i name string] -> String -> String
formatManyXHTML = (T i name string -> String -> String)
-> [T i name string] -> String -> String
forall a. (a -> String -> String) -> [a] -> String -> String
Format.many T i name string -> String -> String
forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> String -> String
formatXHTML
formatXHTML ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
XmlTree.T i name string -> ShowS
formatXHTML :: forall name string i.
(Tag name, Attribute name, C string) =>
T i name string -> String -> String
formatXHTML =
(i -> (String -> String) -> String -> String)
-> (Branch name string -> [String -> String] -> String -> String)
-> (Leaf name string -> String -> String)
-> T i (Branch name string) (Leaf name string)
-> String
-> String
forall i a b branch leaf.
(i -> a -> b)
-> (branch -> [b] -> a) -> (leaf -> a) -> T i branch leaf -> b
Tree.fold (((String -> String) -> i -> String -> String)
-> i -> (String -> String) -> String -> String
forall a b c. (a -> b -> c) -> b -> a -> c
flip (String -> String) -> i -> String -> String
forall a b. a -> b -> a
const) Branch name string -> [String -> String] -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Branch name string -> [String -> String] -> String -> String
formatBranchXHTML Leaf name string -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Leaf name string -> String -> String
formatLeaf (T i (Branch name string) (Leaf name string) -> String -> String)
-> (T i name string -> T i (Branch name string) (Leaf name string))
-> T i name string
-> String
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
T i name string -> T i (Branch name string) (Leaf name string)
forall i name str.
T i name str -> T i (Branch name str) (Leaf name str)
XmlTree.unwrap
formatBranchXHTML ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
XmlTree.Branch name string -> [ShowS] -> ShowS
formatBranchXHTML :: forall name string.
(Tag name, Attribute name, C string) =>
Branch name string -> [String -> String] -> String -> String
formatBranchXHTML = Bool
-> Branch name string -> [String -> String] -> String -> String
forall name string.
(Tag name, Attribute name, C string) =>
Bool
-> Branch name string -> [String -> String] -> String -> String
formatBranchGen Bool
True
formatBranchGen ::
(Name.Tag name, Name.Attribute name, Format.C string) =>
Bool -> XmlTree.Branch name string -> [ShowS] -> ShowS
formatBranchGen :: forall name string.
(Tag name, Attribute name, C string) =>
Bool
-> Branch name string -> [String -> String] -> String -> String
formatBranchGen Bool
xhtml Branch name string
branch [String -> String]
formatSubTrees =
case Branch name string
branch of
XmlTree.Tag T name string
elm ->
(Name name -> Bool)
-> (String -> String)
-> T name string
-> [String -> String]
-> String
-> String
forall name string.
(Tag name, Attribute name, C string) =>
(Name name -> Bool)
-> (String -> String)
-> T name string
-> [String -> String]
-> String
-> String
Elem.format
(\Name name
tagName -> [String -> String] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [String -> String]
formatSubTrees Bool -> Bool -> Bool
&& Name name -> Bool
forall name. Tag name => Name name -> Bool
Tag.isEmpty Name name
tagName)
(if Bool
xhtml then String -> String
Format.slash else String -> String
forall a. a -> a
id)
T name string
elm [String -> String]
formatSubTrees