Author: jmorliaguet Date: Sat Feb 11 13:05:38 2006 New Revision: 2343 Modified: cpsskins/branches/jmo-perspectives/ui/framework/ctal.js Log:
- misc bug fixes. all tests now pass. Modified: cpsskins/branches/jmo-perspectives/ui/framework/ctal.js ============================================================================== --- cpsskins/branches/jmo-perspectives/ui/framework/ctal.js (original) +++ cpsskins/branches/jmo-perspectives/ui/framework/ctal.js Sat Feb 11 13:05:38 2006 @@ -10,6 +10,8 @@ WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + 2006-02-11: bug fixes - Jean-Marc Orliaguet <[EMAIL PROTECTED]> + */ @@ -50,6 +52,7 @@ nodes[0] = value; } } + var node; for (;node=nodes.shift();) { if (marker) { parent.insertBefore(node, marker); @@ -62,8 +65,10 @@ ctal.node_replace = function(value, old) { var parent = old.parentNode; var nextsibling = old.nextSibling; - parent.removeChild(old); - ctal.node_insertbefore(parent, value, nextsibling); + if (parent) {; + parent.removeChild(old); + ctal.node_insertbefore(parent, value, nextsibling); + } } ctal.node_replacechildren = function(value, old) { @@ -77,7 +82,7 @@ ctal.tal_attributes = function(tmpl, value, data) { var attrs = value.split(";"); - var attr = null; + var attr; for (;attr=attrs.shift();) { var nmx = ctal.get_nameexpr(attr); var aname = nmx[0] @@ -89,27 +94,25 @@ } ctal.content_or_replace = function(tmpl, expr, data, func) { - var expr = expr.split(' ').join(' '); + var qual, value, newnode; var colpos = expr.indexOf(' ') - var qual; if (colpos > -1) { qual = expr.substring(0, colpos); - qual = qual.split(' ').join(' '); } if (colpos > -1 && qual.indexOf(':') == -1) { - var value = expr.substring(colpos + 1); + value = expr.substring(colpos + 1); } else { qual = null; - var value = expr; + value = expr; } + var evalue = ctal.eval_expr(data, value); if (qual == 'dom') { - var evalue = ctal.eval_expr(data, value); - var newnode = evalue; + newnode = evalue; } else if (qual == null) { - var evalue = ctal.eval_expr(data, value); - var newnode = tmpl.ownerDocument.createTextNode(evalue); + newnode = tmpl.ownerDocument.createTextNode(evalue); } else { - throw new ctal.TALESError('TALES Expression qualifier "' + qual + '" is unimplemented') + throw new ctal.TALESError('TALES Expression qualifier "' + qual + + '" is not implemented') } func(newnode, tmpl); } @@ -148,7 +151,8 @@ } } var parent = tmpl.parentNode; - marker = tmpl.nextSibling; + if (!parent) return; + var marker = tmpl.nextSibling; parent.removeChild(tmpl); for (var i=0; i<datas.length; i++) { data[nmx[0]] = datas[i]; @@ -162,42 +166,20 @@ /* general processor */ ctal.process_ctal = function(tmpl, data) { - var recurse = true; if (tmpl.nodeType == 1) { - for (var i=0; i<tmpl.attributes.length; i++) { - var attrnode = tmpl.attributes.item(i); - var splitname = attrnode.nodeName.split(':'); - if (splitname.length == 2 && splitname[0] == 'ctal') { - // remove the attr right away - tmpl.removeAttributeNode(attrnode); - // process it - var attrname = splitname[1]; - if (attrname == "repeat") { - ctal.tal_repeat(tmpl, attrnode.value, data); - recurse = false; - } else if (attrname == "condition") { - ctal.tal_condition(tmpl, attrnode.value, data); - } else if (attrname == "content") { - ctal.tal_content(tmpl, attrnode.value, data); - recurse = false; - } else if (attrname == "replace") { - ctal.tal_replace(tmpl, attrnode.value, data); - recurse = false; - } else if (attrname == "attributes") { - ctal.tal_attributes(tmpl, attrnode.value, data); - } else if (attrname == "omit-tag") { - ctal.tal_omit_tag(tmpl, attrnode.value, data); - } else { - throw new ctal.TALError('TAL attribute "' + attrname + '" is unimplemented') - } + var parsers = ctal.parsers; + for (ctal_attr in parsers) { + var attrnode = tmpl.getAttribute(ctal_attr); + if (attrnode) { + tmpl.removeAttribute(ctal_attr); + var parser = parsers[ctal_attr]; + parser(tmpl, attrnode, data) } } } - if (recurse) { - // recursion - for (var i=0; i<tmpl.childNodes.length; i++) { - ctal.process_ctal(tmpl.childNodes[i], data); - } + // recursion + for (var i=0; i<tmpl.childNodes.length; i++) { + ctal.process_ctal(tmpl.childNodes[i], data); } } @@ -221,7 +203,8 @@ } else if (etype == 'javascript') { return eval(value) } else { - throw new ctal.TALESError('TALES Expression type "' + etype + '" is unimplemented') + throw new ctal.TALESError('TALES Expression type "' + etype + + '" is not implemented') } } @@ -240,16 +223,24 @@ } ctal.get_nameexpr = function(value) { - var splitnx = value.split(/ /); - var first = ""; - // ltrim - while (first == "") { - first = splitnx.shift(); - } - return [first, splitnx.join(" ")]; + var splitnx = ctal.trim(value).split(/ /); + return [ctal.trim(splitnx[0]), ctal.trim(splitnx.slice(1).join(' '))]; +} + +ctal.trim = function(text) { + return text.replace(/^\s+|\s+$/g, ""); } ctal.isTrue = function(cond) { return cond && (cond != "") } +ctal.parsers = { + "ctal:condition": ctal.tal_condition, + "ctal:repeat": ctal.tal_repeat, + "ctal:content": ctal.tal_content, + "ctal:attributes": ctal.tal_attributes, + "ctal:omit-tag": ctal.tal_omit_tag, + "ctal:replace": ctal.tal_replace + }; + -- http://lists.nuxeo.com/mailman/listinfo/z3lab-checkins