module Graphics.SvgTree.Printer
( ppTree,
ppDocument,
)
where
import Control.Lens ((^.))
import Data.List
import Graphics.SvgTree.Types hiding (Element)
import Graphics.SvgTree.XmlParser
import Text.XML.Light hiding (showAttr)
ppDocument :: Document -> String
ppDocument doc =
ppElementS_ (_documentElements doc) (xmlOfDocument doc) ""
ppTree :: Tree -> String
ppTree t = ppTreeS t ""
ppTreeS :: Tree -> ShowS
ppTreeS tree =
case xmlOfTree tree of
Just x -> ppElementS_ (treeChildren tree) x
Nothing -> id
treeChildren :: Tree -> [Tree]
treeChildren t = case t of
GroupTree g -> g ^. groupChildren
SymbolTree g -> g ^. groupChildren
DefinitionTree g -> g ^. groupChildren
ClipPathTree c -> c ^. clipPathContent
PatternTree p -> p ^. patternElements
MarkerTree m -> m ^. markerElements
MaskTree m -> m ^. maskContent
_ -> []
ppElementS_ :: [Tree] -> Element -> ShowS
ppElementS_ [] e xs | not (null (elContent e)) = ppElement e ++ xs
ppElementS_ children e xs = tagStart name (elAttribs e) $
case children of
[]
| "?" `isPrefixOf` qName name -> showString " ?>" xs
| otherwise -> showString " />" xs
_ -> showChar '>' (foldr ppTreeS (tagEnd name xs) children)
where
name = elName e
tagStart :: QName -> [Attr] -> ShowS
tagStart qn as rs = '<' : showQName qn ++ as_str ++ rs
where
as_str = if null as then "" else ' ' : unwords (map showAttr as)
showAttr :: Attr -> String
showAttr (Attr qn v) = showQName qn ++ '=' : '"' : v ++ "\""