on master help sign in
Strip \r from multiline strings
9821e12Evan Czaplicki
compiler/Parse/Literal.hs+17−5
@@ -19,13 +19,25 @@ num = fmap toLit (preNum <?> "number")
19 string "."
19 string "."
20 ('.':) <$> many1 digit
20 ('.':) <$> many1 digit
21
21
22+chr :: IParser Literal
23+chr = Chr <$> betwixt '\'' '\'' (backslashed <|> satisfy (/='\''))
24+ <?> "character"
25+
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 (/='"')
27 ]
30 ]
31+ where
32+ quote = try (string "\"\"\"")
33+ str = Str . dewindows
28
34
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
43+ _ -> []