diff options
author | Adam Chlipala <adamc@hcoop.net> | 2009-03-10 12:44:40 -0400 |
---|---|---|
committer | Adam Chlipala <adamc@hcoop.net> | 2009-03-10 12:44:40 -0400 |
commit | 18c2f489867bf282c49346eb090b22e41ec5f67a (patch) | |
tree | 82f3cb492c30ab735fe779934eca0e58a1e6b461 | |
parent | 998ec0f6506d8b7065fbe277c253188b38bcac7c (diff) |
ListEdit demo, minus prose
-rw-r--r-- | demo/listEdit.ur | 54 | ||||
-rw-r--r-- | demo/listEdit.urp | 2 | ||||
-rw-r--r-- | demo/listEdit.urs | 1 | ||||
-rw-r--r-- | lib/js/urweb.js | 6 | ||||
-rw-r--r-- | src/elaborate.sml | 11 | ||||
-rw-r--r-- | src/jscomp.sml | 26 | ||||
-rw-r--r-- | src/monoize.sml | 8 |
7 files changed, 100 insertions, 8 deletions
diff --git a/demo/listEdit.ur b/demo/listEdit.ur new file mode 100644 index 00000000..1a9851a7 --- /dev/null +++ b/demo/listEdit.ur @@ -0,0 +1,54 @@ +datatype rlist = Nil | Cons of {Data : source string, + NewData : source string, + Tail : source rlist} + +fun showString ss = + s <- signal ss; + return <xml>{[s]}</xml> + +fun show rls = + v <- signal rls; + show' v + +and show' rl = + case rl of + Nil => return <xml/> + | Cons {Data = ss, NewData = ss', Tail = rls} => return <xml> + <dyn signal={showString ss}/> + <button value="Change to:" onclick={s <- get ss'; set ss s}/> + <ctextbox source={ss'}/><br/> + <dyn signal={show rls}/> + </xml> + +fun main () = + head <- source Nil; + tailP <- source head; + data <- source ""; + + let + fun add () = + data <- get data; + data <- source data; + ndata <- source ""; + tail <- get tailP; + tail' <- source Nil; + + let + val cons = Cons {Data = data, NewData = ndata, Tail = tail'} + in + set tail cons; + set tailP tail'; + + head' <- get head; + case head' of + Nil => set head cons + | _ => return () + end + in + return <xml><body> + <ctextbox source={data}/> <button value="Add" onclick={add ()}/><br/> + <br/> + + <dyn signal={show head}/> + </body></xml> + end diff --git a/demo/listEdit.urp b/demo/listEdit.urp new file mode 100644 index 00000000..592e0546 --- /dev/null +++ b/demo/listEdit.urp @@ -0,0 +1,2 @@ + +listEdit diff --git a/demo/listEdit.urs b/demo/listEdit.urs new file mode 100644 index 00000000..6ac44e0b --- /dev/null +++ b/demo/listEdit.urs @@ -0,0 +1 @@ +val main : unit -> transaction page diff --git a/lib/js/urweb.js b/lib/js/urweb.js index c78229af..158e574d 100644 --- a/lib/js/urweb.js +++ b/lib/js/urweb.js @@ -59,10 +59,12 @@ function addNode(node) { function runScripts(node) { var savedScript = thisScript; - var scripts = node.getElementsByTagName("script"); + var scripts = node.getElementsByTagName("script"), scriptsCopy = {}; var len = scripts.length; + for (var i = 0; i < len; ++i) + scriptsCopy[i] = scripts[i]; for (var i = 0; i < len; ++i) { - thisScript = scripts[i]; + thisScript = scriptsCopy[i]; eval(thisScript.textContent); } diff --git a/src/elaborate.sml b/src/elaborate.sml index c55593b4..5e94d8e4 100644 --- a/src/elaborate.sml +++ b/src/elaborate.sml @@ -704,7 +704,16 @@ (#fields s1, #fields s2) (*val () = eprefaces "Summaries2" [("#1", p_summary env {fields = fs1, unifs = #unifs s1, others = #others s1}), ("#2", p_summary env {fields = fs2, unifs = #unifs s2, others = #others s2})]*) + val (unifs1, unifs2) = eatMatching (fn ((_, r1), (_, r2)) => r1 = r2) (#unifs s1, #unifs s2) + fun eatMost unifs = + case unifs of + (_, r) :: (rest as _ :: _) => (r := SOME (L'.CRecord (k, []), loc); + eatMost rest) + | _ => unifs + val unifs1 = eatMost unifs1 + val unifs2 = eatMost unifs2 + val (others1, others2) = eatMatching (consEq env) (#others s1, #others s2) (*val () = eprefaces "Summaries3" [("#1", p_summary env {fields = fs1, unifs = unifs1, others = others1}), ("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*) @@ -761,7 +770,7 @@ | _ => (fs1, fs2, others1, others2) (*val () = eprefaces "Summaries5" [("#1", p_summary env {fields = fs1, unifs = unifs1, others = others1}), - ("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*) + ("#2", p_summary env {fields = fs2, unifs = unifs2, others = others2})]*) val clear = case (fs1, others1, fs2, others2) of ([], [], [], []) => true diff --git a/src/jscomp.sml b/src/jscomp.sml index 23b6e936..37bbf79d 100644 --- a/src/jscomp.sml +++ b/src/jscomp.sml @@ -409,6 +409,12 @@ fun process file = Print.prefaces "Can't unurlify" [("t", MonoPrint.p_typ MonoEnv.empty t)]; ("ERROR", st)) + fun padWith (ch, s, len) = + if size s < len then + padWith (ch, String.str ch ^ s, len - 1) + else + s + fun jsExp mode skip outer = let val len = length outer @@ -448,7 +454,16 @@ fun process file = else "\\074" | #"\\" => "\\\\" - | ch => String.str ch) s + | #"\n" => "\\n" + | #"\r" => "\\r" + | #"\t" => "\\t" + | ch => + if Char.isPrint ch then + String.str ch + else + "\\" ^ padWith (#"0", + Int.fmt StringCvt.OCT (ord ch), + 3)) s ^ "\"") | _ => str (Prim.toString p) @@ -878,6 +893,15 @@ fun process file = | EDml _ => unsupported "DML" | ENextval _ => unsupported "Nextval" | EUnurlify _ => unsupported "EUnurlify" + | EJavaScript (_, e as (EAbs _, _), _) => + let + val (e, st) = jsE inner (e, st) + in + (strcat [str "\"cr(\"+ca(", + e, + str ")+\")\""], + st) + end | EJavaScript (_, e, _) => let val (e, st) = jsE inner (e, st) diff --git a/src/monoize.sml b/src/monoize.sml index 57bf26e3..131bdf67 100644 --- a/src/monoize.sml +++ b/src/monoize.sml @@ -1954,9 +1954,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) = loc)), loc), fm) end | SOME (_, src, _) => - (strcat [str "<script type=\"text/javascript\">inp(\"input\",", + (strcat [str "<span><script type=\"text/javascript\">inp(\"input\",", (L'.EJavaScript (L'.Script, src, NONE), loc), - str ")</script>"], + str ")</script></span>"], fm)) | _ => (Print.prefaces "Targs" (map (fn t => ("T", CorePrint.p_con env t)) targs); raise Fail "No name passed to textbox tag")) @@ -2030,9 +2030,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) = str ")"] val sc = setAttrs sc in - (strcat [str "<script type=\"text/javascript\">", + (strcat [str "<span><script type=\"text/javascript\">", sc, - str "</script>"], + str "</script></span>"], fm) end) |