@@ -19,13 +19,25 @@ num = fmap toLit (preNum <?> "number")
19 string "."
19 string "."
20 ('.':) <$> many1 digit
20 ('.':) <$> many1 digit
22+chr :: IParser Literal
23+chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
22str :: IParser Literal
26str :: IParser Literal
23−str = choice [ let quote = try (string "\"\"\"")
24− in quote >> Str <$> manyTill (backslashed <|> anyChar) quote
27+str = choice [ quote >> str <$> manyTill (backslashed <|> anyChar) quote
25 , liftM Str . expecting "string" . betwixt '"' '"' . many $
28 , liftM Str . expecting "string" . betwixt '"' '"' . many $
26 backslashed <|> satisfy (/='"')
29 backslashed <|> satisfy (/='"')
32+ quote = try (string "\"\"\"")
33+ str = Str . dewindows
29−chr :: IParser Literal
35+ -- Remove \r from strings to fix generated JavaScript
30−chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
36+ dewindows [] = []
31− <?> "character"
37+ dewindows cs =
38+ let (pre, suf) = break (`elem` ['\r','\n']) cs
39+ in pre ++ case suf of
40+ ('\r':'\n':rest) -> '\n' : dewindows rest
41+ ('\n':rest) -> '\n' : dewindows rest
42+ ('\r':rest) -> '\n' : dewindows rest