module Graphics.SvgTree.Printer ( ppTree , ppDocument ) where import Control.Lens ((^.)) import Data.List import Graphics.SvgTree.Types (Document (..), Tree (..), clipPathContent, groupChildren, markerElements, maskContent, patternElements, preRendered) import Graphics.SvgTree.XmlParser import Text.XML.Light hiding (showAttr) ppDocument :: Document -> String ppDocument doc = ppElementS_ (_elements doc) (xmlOfDocument doc) "" ppTree :: Tree -> String ppTree t = ppTreeS t "" ppTreeS :: Tree -> ShowS ppTreeS tree = case tree ^. preRendered of Nothing -> case xmlOfTree tree of Just x -> ppElementS_ (treeChildren tree) x Nothing -> id Just s -> showString s treeChildren :: Tree -> [Tree] treeChildren (GroupTree g) = g^.groupChildren treeChildren (SymbolTree g) = g^.groupChildren treeChildren (DefinitionTree g) = g^.groupChildren treeChildren (ClipPathTree c) = c^.clipPathContent treeChildren (PatternTree p) = p^.patternElements treeChildren (MarkerTree m) = m^.markerElements treeChildren (MaskTree m) = m^.maskContent treeChildren _ = [] 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 ++ "\""