//javascript: var expSyntaxArray = []; var font_family; var font_size; var font_color; var font_weight; var font_style; var compute_font = false; var compute_width = false; 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,compFont,compWidth) { compute_font = compFont; compute_width = compWidth; var nodePos = getElementPosition(node); var parentStyle = node.getAttribute('style'); //Use these as default values if font info can't be found for text items. //and only if the user wants the font computed (otherwise use Expeditee defaults). if(compute_font){ font_family = getStyle(node,'font-family'); font_size = getStyle(node,'font-size'); font_color = getStyle(node,'color'); } 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) { //set a frame link attribute var link = parent.attributes["link"]; if(link !== null && link !== undefined){ console.log(link.value); jsonNode.link = link.value; } if(compute_font){ //obtain font info for text nodes from their parent nodes. var new_font_family = getStyle(parent,"font-family"); var new_font_size = getStyle(parent,"font-size"); var new_font_color = getStyle(parent,"color"); var new_font_weight = getStyle(parent,"font-weight"); var new_font_style = getStyle(parent,"font-style"); if(new_font_family !== undefined && new_font_family !== null) font_family = new_font_family; if(new_font_size !== undefined && new_font_size !== null) font_size = new_font_size; if(new_font_color !== undefined && new_font_color !== null) font_color = new_font_color; //TODO: if parent node is a element, then set style["font-weight"] to be "bold". if(new_font_weight !== undefined && new_font_weight !== null) font_weight = new_font_weight; //TODO: if parent node is an element, then set style["font-style"] to be "italic". if(new_font_style !== undefined && new_font_style !== null) font_style = new_font_style; var style = {}; style["font-family"] = font_family; style["font-size"] = font_size; style["color"] = font_color; style["font-weight"] = font_weight; style["font-style"] = font_style; jsonNode.style = style; } if(compute_width){ var parentPos = getElementPosition(parent); var parentWidth = parentPos.xr - parentPos.xl; jsonNode.width = parentWidth; } 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; if(node.getAttribute("rect") !== undefined){ /**This is to ensure rectangles aren't drawn around "non-rectangular" items such as text and empty elements such as
**/ if(node.getAttribute("rect") === "norect"){ jsonNode.type = "norect"; } } var rect = { "xl":xl, "yt":yt, "xr":xr, "yb":yb }; jsonNode.rect = rect; //TODO: Set link attribute for images. if (elemName.match("img")) { var getLink = node.getAttribute("link"); if(getLink !== null && getLink !== undefined){ jsonNode.link = getLink; } jsonNode.img = node.src; } var style = {}; style["background-color"] = getStyle(node,"background-color"); jsonNode.style = style; var attr = node.attributes["attr"]; if (attr != null) { jsonNode.attr = attr.value; } 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));