//javascript: var expSyntaxArray = []; Element.prototype.getElementWidth = function() { if (typeof this.clip !== "undefined") { return this.clip.width; } else { if (this.style.pixelWidth) { return this.style.pixelWidth; } else { return this.offsetWidth; } } }; Element.prototype.getElementHeight = function() { if (typeof this.clip !== "undefined") { return this.clip.height; } else { if (this.style.pixelHeight) { return this.style.pixelHeight; } else { return this.offsetHeight; } } }; function getElementWidth(elem) { if (typeof elem.clip !== "undefined") { return elem.clip.width; } else { if (elem.style && elem.style.pixelWidth) { return elem.style.pixelWidth; } else { return elem.offsetWidth; } } } function getElementHeight(elem) { if (typeof elem.clip !== "undefined") { return elem.clip.height; } else { if (elem.style && elem.style.pixelHeight) { return elem.style.pixelHeight; } else { return elem.offsetHeight; } } } function hyphenToInitialCapReplacer(str, p1, offset, s) { return p1.toUpperCase(); } function getStyle(node,style_prop) { var prop_val; if (node.currentStyle) { /* IE */ style_prop = strCssRule.replace(/\-(\w)/g, hyphenToInitialCapReplacer); prop_val = node.currentStyle[style_prop]; } else if (window.getComputedStyle) { /* Firefox */ var computed_style = document.defaultView.getComputedStyle(node,null) prop_val = computed_style.getPropertyValue(style_prop); } else { /* try for inline value */ prop_val = el.style[style_prop]; } return prop_val; } function getElementPosition(elem) { var origElem = elem; var xl_ = 0; var yt_ = 0; while(elem && !isNaN(elem.offsetLeft) && !isNaN(elem.offsetTop)) { xl_ += elem.offsetLeft - elem.scrollLeft; yt_ += elem.offsetTop - elem.scrollTop; elem = elem.offsetParent; } var xr_ = xl_ + getElementWidth(origElem); var yb_ = yt_ + getElementHeight(origElem); return { xl: xl_, yt: yt_, xr: xr_, yb: yb_ }; } function htmlToExpeditee(node) { var nodePos = getElementPosition(node); var pxl = nodePos.xl; var pyt = nodePos.yt; var pxr = nodePos.xr; var pyb = nodePos.yb; return htmlToExpediteeRec(node, pxl,pyt, pxl,pyt,pxr,pyb, 0); } function htmlToExpediteeRec(node,baseX,baseY, pxl,pyt,pxr,pyb, depth) { depth = (depth) ? depth : 0; var jsonNode = null; if (node.nodeType == 3) { /* text node */ var text = node.nodeValue; if (text.match(/\S/)) { jsonNode = {}; jsonNode.type = "text"; jsonNode.text = node.nodeValue; jsonNode.xl = pxl; jsonNode.yt = pyt; jsonNode.xr = pxr; jsonNode.yb = pyb; var parent = node.parentNode; if (parent != null) { var data = parent.attributes["data"]; if (data != null) { jsonNode.data = data.value; } } } } else if (node.nodeType == 1) { /* element */ /* need to handle: img, a, li */ /* need to dig out: text size, l/r/justified, font-face, type, colour */ if (getStyle(node,"visibility").match("hidden") || getStyle(node,"display").match("none")) { return null; } var elemName = node.nodeName.toLowerCase(); if (!elemName.match(/script/)) { var nodePos = getElementPosition(node); var xl = nodePos.xl; var xr = nodePos.xr; var yt = nodePos.yt; var yb = nodePos.yb; jsonNode = {}; jsonNode.type = "rect"; jsonNode.elem = node.nodeName; var rect = { "xl":xl, "yt":yt, "xr":xr, "yb":yb }; jsonNode.rect = rect; if (elemName.match("img")) { jsonNode.img = node.src; } var style = {}; style["font-family"] = getStyle(node,"font-family"); style["font-size"] = getStyle(node,"font-size"); style["background-color"] = getStyle(node,"background-color"); // console.log("background color = " + style["background-color"]); // console.log("font size = " + style["font-size"]); jsonNode.style = style var jsonChildNodes = []; var cnode = node.firstChild; while (cnode != null) { var jsonChildNode = htmlToExpediteeRec(cnode,baseX,baseY,xl,yt,xr,yb,depth+1); if (jsonChildNode != null) { jsonChildNodes.push(jsonChildNode); } cnode = cnode.nextSibling; } jsonNode.childNodes = jsonChildNodes; } } /* currently do nothing for the other node types */ return jsonNode; } //var body = document.body; //alert(traverseDOM(body));