Mercurial > urweb
annotate jslib/urweb.js @ 600:d1cce194180d
Do proper insertion of dynamic content within nested DOM containers
author | Adam Chlipala <adamc@hcoop.net> |
---|---|
date | Sun, 11 Jan 2009 10:41:38 -0500 |
parents | 4c2c740c6931 |
children | 7c3c21eb5b4c |
rev | line source |
---|---|
adamc@580 | 1 function cons(v, ls) { |
adamc@580 | 2 return { n : ls, v : v }; |
adamc@580 | 3 } |
adamc@579 | 4 function callAll(ls) { |
adamc@585 | 5 for (; ls; ls = ls.n) |
adamc@579 | 6 ls.v(); |
adamc@579 | 7 } |
adamc@574 | 8 |
adamc@580 | 9 function sc(v) { |
adamc@580 | 10 return {v : v, h : null}; |
adamc@580 | 11 } |
adamc@580 | 12 function sv(s, v) { |
adamc@580 | 13 s.v = v; |
adamc@580 | 14 callAll(s.h); |
adamc@580 | 15 } |
adamc@579 | 16 |
adamc@580 | 17 function ss(s) { |
adamc@580 | 18 return s; |
adamc@580 | 19 } |
adamc@580 | 20 function sr(v) { |
adamc@580 | 21 return {v : v, h : null}; |
adamc@580 | 22 } |
adamc@580 | 23 function sb(x,y) { |
adamc@580 | 24 var z = y(x.v); |
adamc@580 | 25 var s = {v : z.v, h : null}; |
adamc@580 | 26 |
adamc@580 | 27 function reZ() { |
adamc@580 | 28 z.h = cons(function() { s.v = z.v; callAll(s.h); }, z.h); |
adamc@580 | 29 } |
adamc@580 | 30 |
adamc@580 | 31 x.h = cons(function() { z = y(x.v); reZ(); s.v = z.v; callAll(s.h); }, x.h); |
adamc@580 | 32 reZ(); |
adamc@580 | 33 |
adamc@580 | 34 return s; |
adamc@580 | 35 } |
adamc@571 | 36 |
adamc@600 | 37 function myParent() { |
adamc@600 | 38 var pos = document; |
adamc@600 | 39 |
adamc@600 | 40 while (pos.lastChild && pos.lastChild.nodeType == 1) |
adamc@600 | 41 pos = pos.lastChild; |
adamc@600 | 42 |
adamc@600 | 43 return pos.parentNode; |
adamc@600 | 44 } |
adamc@600 | 45 |
adamc@571 | 46 function dyn(s) { |
adamc@571 | 47 var x = document.createElement("span"); |
adamc@571 | 48 x.innerHTML = s.v; |
adamc@600 | 49 myParent().appendChild(x); |
adamc@580 | 50 s.h = cons(function() { x.innerHTML = s.v }, s.h); |
adamc@571 | 51 } |
adamc@582 | 52 |
adamc@598 | 53 function inp(t, s) { |
adamc@598 | 54 var x = document.createElement(t); |
adamc@598 | 55 x.value = s.v; |
adamc@600 | 56 myParent().appendChild(x); |
adamc@598 | 57 s.h = cons(function() { x.value = s.v }, s.h); |
adamc@598 | 58 x.onkeyup = function() { sv(s, x.value) }; |
adamc@598 | 59 } |
adamc@598 | 60 |
adamc@597 | 61 function eh(x) { |
adamc@597 | 62 return x.split("&").join("&").split("<").join("<").split(">").join(">"); |
adamc@597 | 63 } |
adamc@597 | 64 |
adamc@582 | 65 function ts(x) { return x.toString() } |
adamc@586 | 66 function bs(b) { return (b ? "True" : "False") } |
adamc@586 | 67 |
adamc@584 | 68 function pf() { alert("Pattern match failure") } |
adamc@589 | 69 |