git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Encode non-ascii chars in JS strings with unicode literals
commit9adb69413ed18c8b2cfbe7d7d45418227d88350a authorGary Burgess <gary.burgess@gmail.com> dateThu 27 Mar 2014, 21:45 (13 years ago) parent2e97c2c
1 file changed+9−1
src/Language/PureScript/Pretty/JS.hs+9−1
src/Language/PureScript/Pretty/JS.hs+9−1
@@ -27,6 +27,7 @@ import Control.Arrow ((<+>))
2727import Control.PatternArrows
2828import Control.Applicative
2929import Control.Monad.State
30+import Numeric
3031
3132newtype PrinterState = PrinterState { indent :: Int } deriving (Show, Eq, Ord)
3233
@@ -59,7 +60,7 @@ literals = mkPattern' match
5960 where
6061 match :: JS -> StateT PrinterState Maybe String
6162 match (JSNumericLiteral n) = return $ either show show n
62− match (JSStringLiteral s) = return $ show s
63+ match (JSStringLiteral s) = return $ '"' : concatMap encodeChar s ++ "\""
6364 match (JSBooleanLiteral True) = return "true"
6465 match (JSBooleanLiteral False) = return "false"
6566 match (JSArrayLiteral xs) = fmap concat $ sequence
@@ -140,6 +141,13 @@ literals = mkPattern' match
140141 match (JSRaw js) = return js
141142 match _ = mzero
142143
144+ encodeChar :: Char -> String
145+ encodeChar '\r' = "\\r"
146+ encodeChar '\n' = "\\n"
147+ encodeChar c | fromEnum c > 0xFFF = "\\u" ++ showHex (fromEnum c) ""
148+ encodeChar c | fromEnum c > 0xFF = "\\u0" ++ showHex (fromEnum c) ""
149+ encodeChar c = [c]
150+
143151conditional :: Pattern PrinterState JS ((JS, JS), JS)
144152conditional = mkPattern match
145153 where