module Sound.Audacity.XML where import qualified Text.HTML.Tagchup.Tag as Tag import qualified Text.XML.Basic.Attribute as Attr import qualified Text.XML.Basic.Name.MixedCase as Name import qualified Data.List as List import Prelude hiding (unlines) tag :: String -> a -> [Attr.T Name.T (a -> String)] -> [[Tag.T Name.T String]] -> [[Tag.T Name.T String]] tag name x attrs enclosed = let tagName = Tag.Name $ Name.Cons name in [Tag.open tagName $ Attr.mapValues ($x) attrs] : enclosed ++ [Tag.close tagName] : [] attr :: String -> a -> Attr.T Name.T a attr name value = Attr.cons (Attr.Name $ Name.Cons name) value unlines :: [[Tag.T Name.T String]] -> [Tag.T Name.T String] unlines = concat . snd . List.mapAccumL (\oldIndent tags -> let newIndent = oldIndent + sum (map tagIndent tags) in (newIndent, Tag.text (replicate (min oldIndent newIndent) '\t') : tags ++ Tag.text "\n" : [])) 0 tagIndent :: Tag.T Name.T String -> Int tagIndent t = case t of Tag.Open _ _ -> 1 Tag.Close _ -> -1 _ -> 0