packages feed

ampersand-3.0.0: src/lib/DatabaseDesign/Ampersand/Misc/TinyXML.hs

{-# OPTIONS_GHC -Wall #-}
module DatabaseDesign.Ampersand.Misc.TinyXML where

   -----------------some new data types for simple XML structures--------
   data XTree = Elem { etag :: XTag
                     , etrees :: [XTree]
                     }
              | Node { ntag :: XTag  -- WHY? is Node nodig? Immers een Elem met een lege etrees doet precies hetzelfde...
                                      -- BECAUSE! De show van een Node laat maar één tag zien. Een Elem showt een begin- en end-tag.
                     }
              | PlainText {ptstr :: String}
   data XTag =  Tag  { tName :: String
                     , tAtts :: [XAtt]
                     }
   data XAtt = Att { attName :: String
                   , attValue :: String
                   }


   showXTree :: XTree -> String
   showXTree tree = case tree of
                        Elem{} -> showStart tag
                               ++ concatMap showXTree (etrees tree)
                               ++ showEnd tag
                                   where tag = etag tree
                        Node{} -> showNode (ntag tree)
                        PlainText{} -> show (ptstr tree)
   showStart :: XTag -> String
   showStart a = "<" ++ tName a ++ showAtts (tAtts a) ++ ">" 
  
   showAtts :: [XAtt] -> String
   showAtts = concatMap showAtt
      where showAtt :: XAtt -> String
            showAtt a= " "++attName a++"="++show (attValue a)

   showEnd :: XTag -> String
   showEnd a = "</" ++ tName a ++ ">"   
   
   showNode :: XTag -> String
   showNode a = "<" ++ tName a ++ showAtts (tAtts a) ++ "/>"   

   mkAttr :: String -> String -> XAtt
   mkAttr  = Att 
   
   simpleTag :: String -> XTag
   simpleTag nm = Tag nm []