module MPS.Heavy where
import Data.Char
import MPS.Light
import Prelude hiding ((.), (^), (>), (<), (/), elem, foldl)
import qualified Prelude as P
import Text.ParserCombinators.Parsec (many, char, many1, digit, (<|>), Parser, anyChar, try)
import qualified Data.ByteString.Lazy.Char8 as B
import qualified Text.ParserCombinators.Parsec as P
parse :: P.GenParser tok () a -> [tok] -> a
parse p s = case (P.parse p "" s) of
Left err -> err.show.error
Right x -> x
unescape_xml, escape_xml :: String -> String
unescape_xml s = parse unescape_parser s
where
unicode_char :: Parser Char
unicode_char = do
char '&'
char '#'
word <- many1 digit
char ';'
return $ chr (read word)
unescape_parser :: Parser String
unescape_parser = many (try unicode_char <|> anyChar)
escape_xml = concatMap fixChar
where
fixChar '<' = "<"
fixChar '>' = ">"
fixChar '&' = "&"
fixChar '"' = "\""
fixChar c | ord c P.< 0x80 = [c]
fixChar c = "&#" ++ show (ord c) ++ ";"
unescape_unicode_xml, escape_unicode_xml :: String -> String
unescape_unicode_xml = unescape_xml
escape_unicode_xml = escape_xml