123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432 |
- $.define(["jQuery", "doc", "body", "util"], "code", function($, doc, $body, util) {
-
- * env={ ce:current Element; cd:current Data; ci:current index in
- * ListElement array[ci=index] or object[ci=key] es:Element stack; Array
- * ds:Data stack; Array is:index stack;Array sh:value handler
- * function(env,key){return [String]} dir:directive handler
- * Aarray(function(env){}.call(elementObj={},env) }
- */
- var ch_val_buider = {
-
-
-
- "c": function( ) {
- return this.k;
- },
- "s": function(env) {
- var v = env.cd;
- if(v) v = this.k ? v[this.k] : v;
- if(v) return v;
- return 0===v?"0":"";
- },
- "cp":function(env){
- var v = env.cd;
- if(v) return v;
- return 0===v?"0":"";
- },
- "_index": function(env) {
- return env.ci+1;
- },
- "bool":function(env){
- return env.cd[this.k]?"是":"否";
- },
- "date":function(env){
- var v = env.cd[this.k];
- return v?(v.substring(0,4)+"年"+v.substring(4,6)+"月"+v.substring(6,8)+"日"):((this.p && this.p[0])||"");
- }
- },
- simpleAttrHandler = function(env) {
- env.ce.setAttribute(this.n, this.v);
- },
- AttrHandler = function(env) {
- var ret = [],
- va = this.v;
- for(var i = 0; i < va.length; ++i) {
- var item = va[i];
- ret.push[env.sh[item.h].call(this, env)];
- }
- env.ce.setAttribute(this.n, ret.join(""));
- },
-
- * r:array s:text value f:lslast value in array Is * Text
- */
- strSplit_s = function(r, s, f) {
- if(f) {
- var tmp = r[r.length - 1];
- tmp.k = tmp.k + s;
- } else {
- r.push({ k: s, h: "c" });
- }
- },
- strSplit_o = function(r , shell ) {
- var tmp = shell.split("-");
- var obj = { k: tmp.shift(), h: "s" };
- if(tmp.length) { obj.h = tmp.shift(); }
- if(tmp.length) { obj.p = tmp; }
- r.push(obj);
- },
- strSplit = function(s) {
- var r = [],
- len = s.length,
- si = 0,
-
- ei,
- shell,
- tmp,
- f ,
- bi = s.indexOf("{{");
- if(bi >= 0) {
- ei = s.indexOf("}}", bi);
- if(ei>0){
- while(true) {
- if(bi > si) {
- r.push({ k: s.substring(si, bi), h: "c" });
- f = true;
- }
- shell = s.substring(bi + 2, ei).trim();
- si = ei + 2;
- if(shell.length) {
- f = false;
- strSplit_o(r, shell);
- } else {
- strSplit_s(r, s.substring(bi, si), f);
- f = true;
- }
- if(si >= len) return r;
- bi = s.indexOf("{{", si);
- if(bi < 0) { strSplit_s(r, s.substring(si), f); return r; }
- ei = s.indexOf("}}", bi);
- if(ei < 0) { strSplit_s(r, s.substring(si), f); return r; }
- }}
- }
- return s;
- },
- strCompile = function(s) {
- var r = strSplit(s);
- if(typeof r != "string") {
- return r.length > 1 ? r : r[0];
-
- * [{k:"",h:"",p:[]},...] :
- * {k:"",h:"",p:[]}
- */
- }
- return s;
- },
- simpleAttrHand = function(env) {
- env.ce.setAttribute(this.n, this.v);
- },
- singleAttrHand = function(env) {
- env.ce.setAttribute(this.n, env.sh[this.v.h].call(this.v, env));
- },
- arrayAttrHand = function(env) {
- var item, ret = [],
- vs = this.v,
- len = vs.length;
- for(var i = 0; i < len; ++i) {
- item = vs[i];
- ret.push(env.sh[item.h].call(item, env));
- }
- env.ce.setAttribute(this.n, ret.join(""));
- },
-
- attrCompile = function(attr) {
- var s = attr.value || "",
- ret = { n: attr.name, v: s, h: simpleAttrHand };
- if(s.length > 4) {
- s = strCompile(s);
- if(typeof s != "string") {
- ret.v = s;
-
- ret.h = s.length ? arrayAttrHand : singleAttrHand;
- }
- }
- return ret;
- },
-
- textCompile = function(s ) {
- var len = s.length,
- ret = { v: s, h: "_t" };
- if(len > 4) {
- s = strCompile(s);
- if(typeof s != "string") {
- ret.v = s;
-
- ret.h = s.length ? "_at" : "_st";
- }
- }
- return ret;
- },
- ch_dir_container = {
-
- "_t": function(env) { env.ce.appendChild(doc.createTextNode(this.v)); },
-
- "_st": function(env) { env.ce.appendChild(doc.createTextNode(env.sh[this.v.h].call(this.v, env))); },
-
- "_at": function(env) {
- var item, ret = [],
- vs = this.v,
- len = vs.length;
- for(var i = 0; i < len; ++i) {
- item = vs[i];
- ret.push(env.sh[item.h].call(item, env));
- }
- env.ce.appendChild(doc.createTextNode(ret.join("")));
- },
- "_": function(env) {
- var ele = doc.createElement(this.n),
- as = this.as,
- es = this.es,
- item;
- env.ce.appendChild(ele);
- env.es.push(env.ce);
- env.ce = ele;
- for(var i = 0; i < as.length; ++i) {
- as[i].h(env);
- }
- for(var i = 0; i < es.length; ++i) {
- item = es[i];
- env.dir[item.h].call(item, env);
- }
- env.ce = env.es.pop();
- },
- "list": function(env) {
- var hand = env.dir["_"],
- as = this.as,
- es = this.es,
- item, data = env.cd,
- p = this.p;
- if(data && p && p.length && p[0]) {
- env.ds.push(data);
- data = env.cd = data[p[0]] || [];
- env.is.push(env.ci);
- for(var i = 0; i < data.length; ++i) {
- env.ci = i;
- env.cd = data[i];
- hand.call(this, env);
- }
- env.ci = env.is.pop();
- env.cd = env.ds.pop();
- } else if(data && data.length) {
- env.is.push(env.ci);
- env.ds.push(data);
- for(var i = 0; i < data.length; ++i) {
- env.ci = i;
- env.cd = data[i];
- hand.call(this, env);
- }
- env.cd=env.ds.pop();
- env.ci = env.is.pop();
- }
- },
- "array.empty":function(env){
- if((!env.cd) || (!env.cd.length)){
- env.dir["_"].call(this,env);
- }
- },
- "each": function(env) {
- var hand = env.dir["_"],
- as = this.as,
- es = this.es,
- item, data = env.cd,
- p = this.p;
- if(data && p && p.length && p[0]) {
- env.ds.push(data);
- env.is.push(env.ci);
- for(var i = 0; i < p.length; ++i) {
- env.ci = p[i];
- env.cd = data[env.ci];
- hand.call(this, env);
- }
- env.ci = env.is.pop();
- env.cd = env.ds.pop();
- } else if(data) {
- env.is.push(env.ci);
- env.ds.push(data);
- for(var key in data) {
- env.ci = k;
- env.cd = data[key];
- hand.call(this, env);
- }
- env.cd = env.ds.pop();
- env.ci = env.is.pop();
- }
- },
- "val": function(env) {
- var hand = env.dir["_"],
- items, item, data = env.cd,
- p = this.p;
- if(p && p.length && p[0]) {
- items = p[0].split("\\.");
- env.ds.push(data);
- while(items.length && data) {
- data = data[items.shift()];
- }
- if(items.length === 0) {
- env.cd = data;
- hand.call(this,env);
- }
- env.cd = env.ds.pop();
- }
- },
- "valTag": function(env) {
- var items, item, data = env.cd,
- p = this.p,es = this.es;
- if(p && p.length && p[0]) {
- items = p[0].split("\\.");
- env.ds.push(data);
- while(items.length && data) {
- data = data[items.shift()];
- }
- if(items.length === 0) {
- env.cd = data;
- for(var i = 0; i < es.length; ++i) {
- item = es[i];
- env.dir(item.h).call(item, env);
- }
- }
- env.cd = env.ds.pop();
- }
- }
- },
- childCompile = function(chs) {
- var ret = [],stack = [],ev, as, es, attrs, ch, ele;
- hObj = { r: ret, i: 0, c: chs, t: false, s: "", l: chs.length };
- while(hObj) {
- while(hObj.i < hObj.l) {
- ele = hObj.c[hObj.i++];
- if(ele.nodeType == 1) {
- if(hObj.t) {
- hObj.r.push(textCompile(hObj.s));
- }
- hObj.t = false;
- attrs = ele.attributes;
- ch = (ele.getAttribute("ch-dir") || "_").split("-");
- ev = { n: ele.nodeName, h: (ch.shift()||"_"), p: ch };
- as = ev.as = [];
- es = ev.es = [];
- hObj.r.push(ev);
- for(var i = 0; i < attrs.length; ++i) {
- as.push(attrCompile(attrs[i]));
- }
- as = ele.childNodes.length;
- if(as) {
- stack.push(hObj);
- hObj = { r: es, i: 0, c: ele.childNodes, t: false, s: "", l: as };
- stack.push(hObj);
- break;
- }
-
- } else if(ele.nodeType == 3) {
- hObj.s = hObj.t ? (hObj.s + ele.nodeValue) : ele.nodeValue;
- if(hObj.i>=hObj.l){
- hObj.r.push(textCompile(hObj.s));
- }else{
- hObj.t = true;
- }
- }
- }
- hObj = stack.pop();
- }
- return ret;
- },
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- parseElement = function(ele) {
- var env = { sh: {}, dir: {} },
- chs = childCompile(ele.childNodes);
- $.extend(env.sh, ch_val_buider);
- $.extend(env.dir, ch_dir_container);
- return {
- "shell": function(name, hand) {
- if(hand) {
- env.sh[name] = hand;
- return this;
- } else return env.sh[name];
- },
- "dir": function(name, hand) {
- if(hand) {
- env.dir[name] = hand;
- return this;
- } else return env.dir[name];
- },
- "fill": function(pe, data) {
- env.es = [];
- env.ds = [];
- env.is = [];
- env.ce = pe, env.cd = data;
- for(var i = 0; i < chs.length; ++i) {
- var ch = chs[i];
- env.dir[ch.h].call(ch, env);
- }
- return this;
- }
- };
- },
- parseCode = function(ele) {
- var ele=ele.jquery?ele[0]:ele, hand = parseElement(ele),
- $ele = $(ele),
- bh = util.nochange,
- lses = [];
- return $.extend(hand, {
- "val": function(data) {
- data = bh(data);
- if(false === data) return this;
- $ele.empty();
- var docf = doc.createDocumentFragment();
- this.fill(docf, data);
- ele.appendChild(docf);
- for(var i = 0; i < lses.length; ++i) {
- lses[i]();
- }
- return this;
- },
- "empty": function() {
- $(ele).empty();
- return this;
- },
- "listen": function(h) {
- if(h) lses.push(h);
- return this;
- },
- "before": function(h) {
- if(h) {
- bh = h;
- }
- }
- });
- },
- parseHtmlTemplate = function(c) {
- var $div = $("<div style='display:none;'></div>");
- $div.appendTo($body).html(c);
- var h = parseCode($div[0]);
- $div.remove();
- return $.extend(h, {
- "appendTo": function(pe, data) {
- var docf = doc.createDocumentFragment();
- this.fill(docf, data);
- pe.appendChild(docf);
- }
- });
- };
- return {
- "parse": parseElement,
- "parseCode": parseCode,
- "template": parseHtmlTemplate
- };
- });
|