module WURFLParser ( parseTree , ParseError ) where import Text.ParserCombinators.Parsec.Prim import Text.ParserCombinators.Parsec.Error import Data.Either import Text.ParserCombinators.Parsec.Char import Text.ParserCombinators.Parsec.Combinator import WURFLTypes userAgentEnd :: MD -> Parser MD userAgentEnd r = do manyTill anyToken eof return r treeParser :: MD -> Tree MD -> Parser MD treeParser o (Node a Nothing children) = do { string a ; r <- choice . reverse $ userAgentEnd o : map (treeParser o) children ; return r } treeParser _ (Node a (Just v) []) = try $ do { string a ; return v } treeParser _ (Node a (Just v) children) = try $ do { string a ; r <- choice . reverse $ userAgentEnd v : map (treeParser v) children ; return r } parseTree :: [Tree MD] -> String -> Either ParseError MD parseTree tree useragent = parse (choice (map (treeParser emptyMD) tree)) "" useragent