@@ -14,6 +14,8 @@ import Initialize
14import Rename (derename)
14import Rename (derename)
15import Cases
15import Cases
16import Guid
16import Guid
17+import Parse.Library (isOp)
18+import Rename (deprime)
18showErr :: String -> String
20showErr :: String -> String
19showErr err = mainEquals $ "Elm.Graphics.text(Elm.Text.monospace(" ++ msg ++ "))"
21showErr err = mainEquals $ "Elm.Graphics.text(Elm.Text.monospace(" ++ msg ++ "))"
@@ -35,7 +37,7 @@ mainEquals s = globalAssign "Elm.main" (jsFunc "" (ret s))
35globalAssign m s = "\n" ++ m ++ "=" ++ s ++ ";"
37globalAssign m s = "\n" ++ m ++ "=" ++ s ++ ";"
37tryBlock escapees names e =
39tryBlock escapees names e =
38− concat [ "\n(function() {\ntry{\n" ++ e ++ "\n} catch (e) {"
40+ concat [ "\ntry{\n" ++ e ++ "\n} catch (e) {"
39 , "\nElm.main=function() {"
41 , "\nElm.main=function() {"
40 , "\nvar msg = ('<br/><h2>Your browser may not be supported. " ++
42 , "\nvar msg = ('<br/><h2>Your browser may not be supported. " ++
41 "Are you using a modern browser?</h2>' +" ++
43 "Are you using a modern browser?</h2>' +" ++
@@ -43,7 +45,7 @@ tryBlock escapees names e =
43 intercalate "." names ++ " module:<br/>' + e + '" ++ msg ++ "</span>');"
45 intercalate "." names ++ " module:<br/>' + e + '" ++ msg ++ "</span>');"
44 , "\ndocument.body.innerHTML = Elm.Text.monospace(msg);"
46 , "\ndocument.body.innerHTML = Elm.Text.monospace(msg);"
45 , "throw e;"
47 , "throw e;"
46− , "};}}());"
48+ , "};}"
48 where msg | escapees /= [] = concat [ "<br/><br/>The problem may stem from an improper usage of:<br/>"
50 where msg | escapees /= [] = concat [ "<br/><br/>The problem may stem from an improper usage of:<br/>"
49 , intercalate ", " $ map (concatMap escape) escapees ]
51 , intercalate ", " $ map (concatMap escape) escapees ]
@@ -55,14 +57,12 @@ tryBlock escapees names e =
56jsModule (escapees, Module names exports imports stmts) =
58jsModule (escapees, Module names exports imports stmts) =
57 tryBlock escapees (tail modNames) $ concat
59 tryBlock escapees (tail modNames) $ concat
59− , "\nfor(this['i'] in Elm){eval('var '+this['i']+'=Elm[this.i];');}"
60− , concatMap (\n -> globalAssign n $ n ++ " || {}") .
60+ [ concatMap (\n -> globalAssign n $ n ++ " || {}") .
61 map (intercalate ".") . drop 2 . inits $
61 map (intercalate ".") . drop 2 . inits $
62 take (length modNames - 1) modNames
62 take (length modNames - 1) modNames
63 , "\nif (" ++ modName ++ ") throw \"Module name collision, '" ++
63 , "\nif (" ++ modName ++ ") throw \"Module name collision, '" ++
64 intercalate "." (tail modNames) ++ "' is already defined.\"; "
64 intercalate "." (tail modNames) ++ "' is already defined.\"; "
65− , globalAssign modName $ jsFunc "" (includes ++body++ export) ++ "()"
65+ , globalAssign modName $ jsFunc "" (defs ++ includes ++ body ++ export) ++ "()"
66 , mainEquals $ modName ++ ".main" ]
66 , mainEquals $ modName ++ ".main" ]
67 where modNames = if null names then ["Elm", "Main"]
67 where modNames = if null names then ["Elm", "Main"]
68 else "Elm" : names
68 else "Elm" : names
@@ -71,9 +71,11 @@ jsModule (escapees, Module names exports imports stmts) =
71 body = stmtsToJS stmts
71 body = stmtsToJS stmts
72 export = getExports exports stmts
72 export = getExports exports stmts
73 exps = if null exports then ["main"] else exports
73 exps = if null exports then ["main"] else exports
74+ defs = concat [ assign "$op" "{}"
75+ , "\nfor(Elm['i'] in Elm){eval('var '+Elm['i']+'=Elm[Elm.i];');}" ]
75getExports names stmts = ret . braces $ intercalate ",\n" (op : map fnPair fns)
77getExports names stmts = ret . braces $ intercalate ",\n" (op : map fnPair fns)
76− where exNames n = either id id n `elem` names
78+ where exNames n = either derename id n `elem` names
77 exports | null names = concatMap get stmts
79 exports | null names = concatMap get stmts
78 | otherwise = filter exNames (concatMap get stmts)
80 | otherwise = filter exNames (concatMap get stmts)
@@ -100,16 +102,21 @@ jsImport (modul, how) =
100 jsImport' (modul, how)
102 jsImport' (modul, how)
102jsImport' (modul, As name) = assign name modul
104jsImport' (modul, As name) = assign name modul
103−jsImport' (modul, Importing vs) =
105+jsImport' (modul, Importing vs) = concatMap def vs
107+ def (o:p) | isOp o = let v = "$op['" ++ o:p ++ "']" in
108+ "\n" ++ v ++ " = " ++ modul ++ "." ++ v ++ ";"
109+ | otherwise = let v = deprime (o:p) in
104− concatMap (\v -> assign v $ modul ++ "." ++ v) vs
110+ assign v $ modul ++ "." ++ v
105jsImport' (modul, Hiding vs) =
112jsImport' (modul, Hiding vs) =
106 concat [ assign "hiddenVars" . ("{"++) . (++"}") . intercalate "," $
113 concat [ assign "hiddenVars" . ("{"++) . (++"}") . intercalate "," $
107− map (\v -> v ++ ":true") vs
114+ map (\v -> v ++ ":true") (map deprime vs)
108− , "\nfor (this['i'] in " ++ modul ++ ") "
115+ , "\nfor (Elm['i'] in " ++ modul ++ ") "
109 , braces . indent . concat $
116 , braces . indent . concat $
110− [ "\nif (hiddenVars[this['i']]) continue;"
117+ [ "\nif (hiddenVars[Elm['i']]) continue;"
111− , "\neval('var ' + this['i'] + ' = "
118+ , "\neval('var ' + Elm['i'] + ' = "
112− , modul, "[this.i];');" ]
119+ , modul, "[Elm.i];');" ]
115stmtsToJS :: [Statement] -> String
122stmtsToJS :: [Statement] -> String