From c6f717a90ca7cede8af4fd7aefd7b69cf069592e Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Tue, 13 Jan 2009 15:23:48 -0500 Subject: Combine lib* directories --- lib/js/urweb.js | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 lib/js/urweb.js (limited to 'lib/js/urweb.js') diff --git a/lib/js/urweb.js b/lib/js/urweb.js new file mode 100644 index 00000000..0ee19992 --- /dev/null +++ b/lib/js/urweb.js @@ -0,0 +1,72 @@ +function cons(v, ls) { + return { n : ls, v : v }; +} +function callAll(ls) { + for (; ls; ls = ls.n) + ls.v(); +} + +function sc(v) { + return {v : v, h : null}; +} +function sv(s, v) { + s.v = v; + callAll(s.h); +} +function sg(s) { + return s.v; +} + +function ss(s) { + return s; +} +function sr(v) { + return {v : v, h : null}; +} +function sb(x,y) { + var z = y(x.v); + var s = {v : z.v, h : null}; + + function reZ() { + z.h = cons(function() { s.v = z.v; callAll(s.h); }, z.h); + } + + x.h = cons(function() { z = y(x.v); reZ(); s.v = z.v; callAll(s.h); }, x.h); + reZ(); + + return s; +} + +function myParent() { + var pos = document; + + while (pos.lastChild && pos.lastChild.nodeType == 1) + pos = pos.lastChild; + + return pos.parentNode; +} + +function dyn(s) { + var x = document.createElement("span"); + x.innerHTML = s.v; + myParent().appendChild(x); + s.h = cons(function() { x.innerHTML = s.v }, s.h); +} + +function inp(t, s) { + var x = document.createElement(t); + x.value = s.v; + myParent().appendChild(x); + s.h = cons(function() { x.value = s.v }, s.h); + x.onkeyup = function() { sv(s, x.value) }; +} + +function eh(x) { + return x.split("&").join("&").split("<").join("<").split(">").join(">"); +} + +function ts(x) { return x.toString() } +function bs(b) { return (b ? "True" : "False") } + +function pf() { alert("Pattern match failure") } + -- cgit v1.2.3 From ed56c462bf4131b7e179c72bfafb4f6967bc27dc Mon Sep 17 00:00:00 2001 From: Adam Chlipala Date: Fri, 16 Jan 2009 15:49:10 -0500 Subject: dlist example working --- lib/js/urweb.js | 51 +++++++++++++++++++++++++++++++++++++++++++++------ src/jscomp.sml | 12 +++++++++--- src/monoize.sml | 8 ++++---- tests/dlist.ur | 1 + 4 files changed, 59 insertions(+), 13 deletions(-) (limited to 'lib/js/urweb.js') diff --git a/lib/js/urweb.js b/lib/js/urweb.js index 0ee19992..689792f7 100644 --- a/lib/js/urweb.js +++ b/lib/js/urweb.js @@ -37,26 +37,53 @@ function sb(x,y) { return s; } -function myParent() { - var pos = document; - +function lastParent(pos) { while (pos.lastChild && pos.lastChild.nodeType == 1) pos = pos.lastChild; return pos.parentNode; } +var parents = null; + +function pushParent(node) { + parents = cons(node, parents); +} + +function popParent() { + if (parents) + parents = parents.n; + else + alert("popParent: stack underflow"); +} + +function curParent() { + return lastParent(parents ? parents.v : document); +} + +function populate(node, html) { + node.innerHTML = html; + + var scripts = node.getElementsByTagName("script"); + var len = scripts.length; + for (var i = 0; i < len; ++i) { + pushParent(scripts[i].parentNode); + eval(scripts[i].textContent); + popParent(); + } +} + function dyn(s) { var x = document.createElement("span"); x.innerHTML = s.v; - myParent().appendChild(x); - s.h = cons(function() { x.innerHTML = s.v }, s.h); + curParent().appendChild(x); + s.h = cons(function() { populate(x, s.v) }, s.h); } function inp(t, s) { var x = document.createElement(t); x.value = s.v; - myParent().appendChild(x); + curParent().appendChild(x); s.h = cons(function() { x.value = s.v }, s.h); x.onkeyup = function() { sv(s, x.value) }; } @@ -70,3 +97,15 @@ function bs(b) { return (b ? "True" : "False") } function pf() { alert("Pattern match failure") } +var closures = []; + +function ca(f) { + var n = closures.length; + closures[n] = f; + return n; +} + +function cr(n) { + return closures[n](); +} + diff --git a/src/jscomp.sml b/src/jscomp.sml index 1b675abd..f61ec3f0 100644 --- a/src/jscomp.sml +++ b/src/jscomp.sml @@ -486,7 +486,6 @@ fun process file = maxName = #maxName st} val (e, st) = jsExp mode skip [] 0 (e, st) - val () = Print.prefaces "Pre-e" [("e", MonoPrint.p_exp MonoEnv.empty e)] val e = deStrcat 0 e val sc = "_n" ^ Int.toString n ^ "=" ^ e ^ ";\n" @@ -759,7 +758,11 @@ fun process file = end | EJavaScript (Source _, _, SOME _) => (e, st) - | EJavaScript (_, _, SOME e) => ((EFfiApp ("Basis", "jsifyString", [e]), loc), st) + | EJavaScript (_, _, SOME e) => + (strcat [str "\"cr(\"+ca(function(){return ", + e, + str "})+\")\""], + st) | EClosure _ => unsupported "EClosure" | EQuery _ => unsupported "Query" @@ -770,7 +773,10 @@ fun process file = let val (e, st) = jsE inner (e, st) in - ((EFfiApp ("Basis", "jsifyString", [e]), loc), st) + (strcat [str "\"cr(\"+ca(function(){return ", + e, + str "})+\")\""], + st) end | ESignalReturn e => diff --git a/src/monoize.sml b/src/monoize.sml index 993034e4..8d5ed36c 100644 --- a/src/monoize.sml +++ b/src/monoize.sml @@ -1910,9 +1910,9 @@ fun monoExp (env, st, fm) (all as (e, loc)) = e), _), _)] => (e, fm) | [("Signal", e, _)] => ((L'.EStrcat - ((L'.EPrim (Prim.String ""), loc)), loc)), loc), + (L'.EPrim (Prim.String ")"), loc)), loc)), loc), fm) | _ => raise Fail "Monoize: Bad dyn attributes") @@ -1932,7 +1932,7 @@ fun monoExp (env, st, fm) (all as (e, loc)) = loc)), loc), fm) end | SOME (_, src, _) => - (strcat [str ""], fm)) @@ -2002,7 +2002,7 @@ fun monoExp (env, st, fm) (all as (e, loc)) = loc), fm) end | SOME (_, src, _) => - (strcat [str ""], fm)) diff --git a/tests/dlist.ur b/tests/dlist.ur index 211291bc..dbf8c3c5 100644 --- a/tests/dlist.ur +++ b/tests/dlist.ur @@ -19,4 +19,5 @@ fun main () : transaction page = tl <- get s; s' <- source (Cons (hd, tl)); set s s'}/> +