on master help sign in
Properly escape strings and don't use infix op
commit0ff8a91552dbdcc9811be90f8d71fac654f9e3f9 authorEvan Czaplicki <info@elm-lang.org> dateMon 4 Apr 2016, 21:29 (11 years ago) parent4bae628
1 file changed+58−34
src/Generate/JavaScript/Builder.hs+58−34
src/Generate/JavaScript/Builder.hs+58−34
@@ -197,14 +197,6 @@ fromVarDecl indent (VarDecl _ (Id _ name) maybeExpr) =
197197data Lines = One | Many deriving (Eq)
198198
199199
200−{-# INLINE (!) #-}
201−(!) :: a -> b -> (a, b)
202−(!) a b =
203− (a, b)
204−
205−infix 0 !
206−
207−
208200merge :: Lines -> Lines -> Lines
209201merge a b =
210202 if a == Many || b == Many then Many else One
@@ -238,28 +230,28 @@ fromExpr :: Builder -> Grouping -> Expression a -> (Lines, Builder)
238230fromExpr indent grouping expression =
239231 case expression of
240232 StringLit _ string ->
241− One ! fromString (show string)
233+ (One, quoted string)
242234
243235 RegexpLit _ _ _ _ ->
244236 error "TODO"
245237
246238 NumLit _ n ->
247− One ! realFloat n
239+ (One, realFloat n)
248240
249241 IntLit _ n ->
250− One ! decimal n
242+ (One, decimal n)
251243
252244 BoolLit _ True ->
253− One ! "true"
245+ (One, "true")
254246
255247 BoolLit _ False ->
256− One ! "false"
248+ (One, "false")
257249
258250 NullLit _ ->
259− One ! "null"
251+ (One, "null")
260252
261253 ArrayLit _ exprs ->
262− Many !
254+ (,) Many $
263255 let
264256 (anyMany, builders) =
265257 linesMap (fromExpr indent Whatever) exprs
@@ -274,7 +266,7 @@ fromExpr indent grouping expression =
274266 "[" <> commaSep builders <> "]"
275267
276268 ObjectLit _ fields ->
277− Many !
269+ (,) Many $
278270 let
279271 deeperIndent =
280272 deeper indent
@@ -292,10 +284,10 @@ fromExpr indent grouping expression =
292284 "{" <> commaSep builders <> "}"
293285
294286 ThisRef _ ->
295− One ! "this"
287+ (One, "this")
296288
297289 VarRef _ name ->
298− One ! fromId name
290+ (One, fromId name)
299291
300292 DotRef _ expr (Id _ name) ->
301293 makeDot indent expr name
@@ -311,7 +303,9 @@ fromExpr indent grouping expression =
311303 (lines, builder) =
312304 fromExpr indent Atomic expr
313305 in
314− lines ! parensFor grouping (fromPrefix op <> builder)
306+ ( lines
307+ , parensFor grouping (fromPrefix op <> builder)
308+ )
315309
316310 UnaryAssignExpr _ _ _ ->
317311 error "TODO"
@@ -324,8 +318,9 @@ fromExpr indent grouping expression =
324318 (rightLines, right) =
325319 fromExpr indent Atomic rightExpr
326320 in
327− merge leftLines rightLines !
328− parensFor grouping (left <> fromInfix op <> right)
321+ ( merge leftLines rightLines
322+ , parensFor grouping (left <> fromInfix op <> right)
323+ )
329324
330325 CondExpr _ condExpr thenExpr elseExpr ->
331326 let
@@ -333,8 +328,9 @@ fromExpr indent grouping expression =
333328 thenB = snd (fromExpr indent Atomic thenExpr)
334329 elseB = snd (fromExpr indent Atomic elseExpr)
335330 in
336− Many !
337− parensFor grouping (condB <> " ? " <> thenB <> " : " <> elseB)
331+ ( Many
332+ , parensFor grouping (condB <> " ? " <> thenB <> " : " <> elseB)
333+ )
338334
339335 AssignExpr _ op lValue expr ->
340336 let
@@ -344,14 +340,15 @@ fromExpr indent grouping expression =
344340 (rightLines, right) =
345341 fromExpr indent Whatever expr
346342 in
347− merge leftLines rightLines !
348− parensFor grouping (left <> fromAssign op <> right)
343+ ( merge leftLines rightLines
344+ , parensFor grouping (left <> fromAssign op <> right)
345+ )
349346
350347 ListExpr _ _ ->
351348 error "TODO"
352349
353350 CallExpr _ function args ->
354− Many !
351+ (,) Many $
355352 let
356353 deeperIndent =
357354 deeper indent
@@ -369,7 +366,7 @@ fromExpr indent grouping expression =
369366 funcB <> "(" <> commaSep argsB <> ")"
370367
371368 FuncExpr _ maybeName args stmts ->
372− Many !
369+ (,) Many $
373370 "function " <> maybe mempty fromId maybeName <> "(" <> commaSep (map fromId args) <> ") {\n"
374371 <>
375372 fromStmtBlock (deeper indent) stmts
@@ -387,8 +384,9 @@ fromField indent (prop, expr) =
387384 (lines, builder) =
388385 fromExpr indent Whatever expr
389386 in
390− lines !
391− fromProp prop <> ": " <> builder
387+ ( lines
388+ , fromProp prop <> ": " <> builder
389+ )
392390
393391
394392fromProp :: Prop a -> Builder
@@ -398,13 +396,38 @@ fromProp prop =
398396 fromId name
399397
400398 PropString _ string ->
401− fromString (show string)
399+ quoted string
402400
403401 PropNum _ n ->
404402 decimal n
405403
406404
407405
406+-- STRINGS
407+
408+
409+quoted :: String -> Builder
410+quoted string =
411+ fromString ('\'' : foldr escapeCons "'" string)
412+
413+
414+-- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#String_literals
415+escapeCons :: Char -> String -> String
416+escapeCons char rest =
417+ case char of
418+ '\b' -> '\\' : 'b' : rest
419+ '\f' -> '\\' : 'f' : rest
420+ '\n' -> '\\' : 'n' : rest
421+ '\r' -> '\\' : 'r' : rest
422+ '\t' -> '\\' : 't' : rest
423+ '\v' -> '\\' : 'v' : rest
424+ '\"' -> '\\' : '"' : rest
425+ '\'' -> '\\' : '\'' : rest
426+ '\\' -> '\\' : '\\' : rest
427+ _ -> char : rest
428+
429+
430+
408431-- VALUES
409432
410433
@@ -412,7 +435,7 @@ fromLValue :: Builder -> LValue a -> (Lines, Builder)
412435fromLValue indent lValue =
413436 case lValue of
414437 LVar _ name ->
415− One ! fromString name
438+ (One, fromString name)
416439
417440 LDot _ expr field ->
418441 makeDot indent expr field
@@ -427,7 +450,7 @@ makeDot indent expr field =
427450 (lines, builder) =
428451 fromExpr indent Atomic expr
429452 in
430− lines ! builder <> "." <> fromString field
453+ (lines, builder <> "." <> fromString field)
431454
432455
433456makeBracketed :: Builder -> Expression a -> Expression a -> (Lines, Builder)
@@ -439,8 +462,9 @@ makeBracketed indent expr bracketedExpr =
439462 (bracketedLines, bracketedBuilder) =
440463 fromExpr indent Whatever bracketedExpr
441464 in
442− merge lines bracketedLines !
443− builder <> "[" <> bracketedBuilder <> "]"
465+ ( merge lines bracketedLines
466+ , builder <> "[" <> bracketedBuilder <> "]"
467+ )
444468
445469
446470