module Exercise04 where import Data.List as List import Data.Char as Char {-WETT-} xmlLight :: String -> Bool xmlLight xml = xmlLightHelp (dropWhile (\c -> c /= '<' && c /= '>') xml) [] False -- todo: trim text before and after xmlLightHelp :: String -> [String] -> Bool -> Bool xmlLightHelp [] [] False = True xmlLightHelp [] _ _ = False xmlLightHelp (x:xs) acc lastWasOpen | x == '<' = let tag = takeWhile (/= '>') xs left = drop (length tag + 1) xs close = "/" == take 1 tag invalid0 = length xs == length tag invalid1 = ' ' `elem` strip tag invalid2 = '<' `elem` tag invalid3 = '/' `elem` drop 1 tag in not (invalid0 || invalid1 || invalid2 || invalid3) && if close then (not (null acc) && '/' : head acc == strip tag) && xmlLightHelp left (tail acc) False else xmlLightHelp left (strip tag : acc) True | x == '>' = False | otherwise = xmlLightHelp xs acc lastWasOpen strip :: String -> String strip = dropWhileEnd isSpace {-TTEW-}