taconite-parser.js
上传用户:shen332233
上传日期:2021-09-03
资源大小:7478k
文件大小:11k
源码类别:

Ajax

开发平台:

Java

  1. String.prototype.trim = function() {
  2.     //skip leading and trailing whitespace
  3.     //and return everything in between
  4.     var x=this;
  5.     x=x.replace(/^s*(.*)/, "$1");
  6.     x=x.replace(/(.*?)s*$/, "$1");
  7.     return x;
  8. };
  9. function XhtmlToDOMParser(xml) {
  10.     var CREATE_DOCUMENT_FRAGMENT = "var node0 = document.createDocumentFragment();";
  11.     var CREATE_ELEMENT = "zero = document.createElement("one");";
  12.     var APPEND_CHILD = "zero.appendChild(one);";
  13.     var APPEND_TEXT_NODE_CHILD = "zero.appendChild(document.createTextNode("one"));";
  14.     var SET_ATTRIBUTE = "zero.setAttribute("one", "two");";
  15.     var EVENT_HANDLER_ATTR = "zero.one = function () { two };";
  16.     var SET_STYLE_CSSTEXT = "zero.style.cssText = "one";";
  17.     var NODE_VAR_NAME = "node";
  18.     var xmlDoc = xml;
  19.     var parents = new Array();
  20.     var elementIndex = 0;
  21.     var highestNestingLevel = 0;
  22.     var domJS = "";
  23.    
  24.     this.getJavaScript = function() {
  25.         return domJS;
  26.     };
  27.     this.startParsing = function() {
  28.         var start = new Date().getTime();
  29.    
  30.         domJS = domJS + getPrepend(xmlDoc);
  31.         parseToJavaScript(xmlDoc);
  32.         domJS = domJS + getAppend(xmlDoc);
  33.     };
  34.     function parseToJavaScript(element) {
  35.         var nodeType = element.nodeType;
  36.         switch(nodeType) {
  37.             case 1:  //ELEMENT_NODE
  38.                 handleElement(element);
  39.                 break;
  40.             case 3:  //TEXT_NODE
  41.                handleTextNode(element);
  42.                break;
  43.             case 4:  //CDATA_SECTION_NODE
  44.                 break;
  45.         }
  46.     }
  47.     function handleElement(elementNode) {
  48.         elementIndex = getNewElementIndex();
  49.         var tagName = elementNode.tagName.toLowerCase();
  50. //        if(tagName == "taconite-root") {
  51.         if(isTaconiteTag(elementNode)) {
  52.             domJS = domJS + CREATE_DOCUMENT_FRAGMENT;
  53.         }
  54.         else if(isRadioButton(elementNode) && isIE()) {
  55.             domJS = domJS + renderIERadioButton(elementNode);
  56.         }
  57.         else {
  58.             var createVarToken = getNodeCreationToken(elementIndex);
  59.             var createTokenParms = {zero: createVarToken, one: elementNode.tagName.toLowerCase()};
  60.             var createToken = replaceParms(createTokenParms, CREATE_ELEMENT);
  61.             domJS = domJS + createToken;
  62.             //Add the element's attributes
  63.             handleAttributes(elementNode);
  64.         }
  65.        
  66.         if(parents.length > 0) {
  67.             //Append this element to its parent
  68.             var appendParms = {zero: NODE_VAR_NAME + peekFromParents(), one: NODE_VAR_NAME + elementIndex  };
  69.             var appendToken = replaceParms(appendParms, APPEND_CHILD);
  70.             domJS = domJS + appendToken;
  71.         }
  72.         //Set this element to be the current parent element
  73.         parents.push(elementIndex);
  74.         //Do all the elementNode's children
  75.         for(var z = 0; z < elementNode.childNodes.length; z++) {
  76.             parseToJavaScript(elementNode.childNodes[z]);
  77.         }
  78.        
  79.         //Done with all this element's children
  80.         parents.pop();
  81.         //Decrement the elementIndex
  82.         elementIndex = elementIndex - 1;
  83.     }
  84.    
  85.     function handleAttributes(elementNode) {
  86.         var attr = null;
  87.         var attrParms;
  88.         var name = "";
  89.         var value = "";
  90.         for(var x = 0; x < elementNode.attributes.length; x++) {
  91.             attr = elementNode.attributes[x];
  92.             name = attr.name.trim().toLowerCase();
  93.             value = attr.value.trim();
  94.            
  95.             if(name == "style") {
  96.                 /* IE workaround */
  97.                 attrParms = {zero: getCurrentElementVarName(), one: value };
  98.                 domJS = domJS + replaceParms(attrParms, SET_STYLE_CSSTEXT);
  99.                 /* Standards compliant */
  100.                 attrParms = {zero: getCurrentElementVarName(), one: name, two: value };
  101.                 domJS = domJS + replaceParms(attrParms, SET_ATTRIBUTE);
  102.             }
  103.             else if(isEventHandler(attr.name)) {
  104.                 /* IE workaround for event handlers */
  105.                 attrParms = {zero: getCurrentElementVarName(), one: name, two: value  };
  106.                 domJS = domJS + replaceParms(attrParms, EVENT_HANDLER_ATTR);
  107.             }
  108.             else {
  109.                 /* Standards compliant */
  110.                 attrParms = {zero: getCurrentElementVarName(), one: name, two: value };
  111.                 domJS = domJS + replaceParms(attrParms, SET_ATTRIBUTE);
  112.             }
  113.             /* class attribute workaround for IE */
  114.             if(name == "class") {
  115.                 attrParms = {zero: getCurrentElementVarName(), one: "className", two: value };
  116.                 domJS = domJS + replaceParms(attrParms, SET_ATTRIBUTE);
  117.             }
  118.         }
  119.     }
  120.     function handleTextNode(textNode) {
  121.         var text = textNode.nodeValue.trim();
  122.         if(text.length == 0) {
  123.             return;
  124.         }
  125.         var parms = {zero: getCurrentElementVarName(), one: text };
  126.         var appendTextToken = replaceParms(parms, APPEND_TEXT_NODE_CHILD);
  127.         domJS = domJS + appendTextToken;
  128.     }
  129.     function getNewElementIndex() {
  130.         if(parents.length == 0) {
  131.             return 0;
  132.         }
  133.         return peekFromParents() + 1;
  134.     }
  135.     function peekFromParents() {
  136.         var peek = parents.pop();
  137.         parents.push(peek);
  138.         return peek;
  139.     }
  140.     function getNodeCreationToken(currentIndex) {
  141.         if(currentIndex > highestNestingLevel) {
  142.             highestNestingLevel = currentIndex;
  143.             return "var node" + currentIndex;
  144.         }
  145.         else {
  146.             return "node" + currentIndex;
  147.         }
  148.     }
  149.     function replaceParms(parms, str) {
  150.         var temp = str;
  151.         var key;
  152.         for(var key in parms) {
  153.             temp = temp.replace(key, parms[key]);
  154.         }
  155.         return temp;
  156.     }
  157.     function getCurrentElementVarName() {
  158.         return NODE_VAR_NAME + elementIndex;
  159.     }
  160.     function isEventHandler(name) {
  161.         return name.trim().toLowerCase().substring(0, 2) == "on";
  162.     }
  163.     function isRadioButton(node) {
  164.         if(!node.tagName.trim().toLowerCase() == "input") {
  165.             return false;
  166.         }
  167.         var attrs = node.attributes;
  168.         var attr = null;
  169.         for(var a = 0; a < attrs.length; a++) {
  170.             attr = attrs[a];
  171.            
  172.             if(attr.name.toLowerCase().trim() == "type") {
  173.                 if(attr.value.toLowerCase().trim() == "radio") {
  174.                     return true;
  175.                 }
  176.             }
  177.         }
  178.         return false;
  179.     }
  180.     function isIE() {
  181.         if(document.uniqueID) {
  182.             return true;
  183.         }
  184.         else {
  185.             return false;
  186.         }
  187.     }
  188.     function renderIERadioButton(node) {
  189.         var attrString = "";
  190.         var name = "";
  191.         var value = "";
  192.         var attr = null;
  193.         for(var q = 0; q < node.attributes.length; q++) {
  194.             if(q > 0) {
  195.                 attrString = attrString + " ";
  196.             }
  197.             attr = node.attributes[q];
  198.             name = attr.name.trim().toLowerCase();
  199.             value = attr.value.trim();
  200.             attrString = attrString + name + "='" + value + "'" ;
  201.         }
  202.         var radioButton = getCurrentElementVarName() + " = document.createElement("<input "  + attrString + ">");" ;
  203.        
  204.         return radioButton;
  205.     }
  206.     function isTaconiteTag(node) {
  207.         var name = node.tagName.trim();
  208.         return name.substring(0, 9) == "taconite-";
  209.     }
  210.     function getPrepend(node) {
  211.         return "";
  212.     }
  213.     function getAppend(node) {
  214.         var tagName = node.tagName.toLowerCase().trim();
  215.         var appendToken = "";
  216.         switch (tagName) {
  217.             case "taconite-append-as-children":
  218.                 appendToken = getAppendAsChildren(node);
  219.                 break;
  220.             case "taconite-append-as-first-child":
  221.                 appendToken = getAppendAsFirstChild(node);
  222.                 break;
  223.             case "taconite-delete":
  224.                 appendToken = getDelete(node);
  225.                 break;
  226.             case "taconite-insert-after":
  227.                 appendToken = getInsertAfter(node);
  228.                 break;
  229.             case "taconite-insert-before":
  230.                 appendToken = getInsertBefore(node);
  231.                 break;
  232.             case "taconite-replace-children":
  233.                 appendToken = getReplaceChildren(node);
  234.                 break;
  235.             case "taconite-replace":
  236.                 appendToken = getReplace(node);
  237.                 break;
  238.         }
  239.         return appendToken;
  240.     }
  241.     function getContextNodeID(node) {
  242.         return node.getAttribute("contextNodeID");
  243.     }
  244.     function getContextNodeDOM(node) {
  245.         var format = "document.getElementById("one")";
  246.         var parms = {one: getContextNodeID(node)  } ;
  247.         return replaceParms(parms, format);
  248.     }
  249.     function getAppendAsChildren(node) {
  250.         return getContextNodeDOM(node) + ".appendChild(node0);";
  251.     }
  252.     function getAppendAsFirstChild(node) {
  253.         var format = "if(one.childNodes.length > 0) { "
  254.             + "two.insertBefore(node0, three.childNodes[0]) ; }"
  255.             + " else { four.appendChild(node0); } ";
  256.        
  257.         var parms = {one: getContextNodeDOM(node), two: getContextNodeDOM(node), three: getContextNodeDOM(node), four: getContextNodeDOM(node)  } ;
  258.         return replaceParms(parms, format);
  259.     }
  260.     function getDelete(node) {
  261.         var format = "one.parentNode.removeChild(two);";
  262.         var parms = { one: getContextNodeDOM(node), two: getContextNodeDOM(node) };
  263.         return replaceParms(parms, format);
  264.     }
  265.     function getInsertAfter(node) {
  266.         var format = "var nextSibling = one.nextSibling;"
  267.                 + "if (nextSibling == null ) { "
  268.                 + "two.parentNode.appendChild(node0); } "
  269.                 + "else { "
  270.                 + "nextSibling.parentNode.insertBefore(node0, nextSibling); } ";
  271.         var parms = { one: getContextNodeDOM(node), two: getContextNodeDOM(node) };
  272.         return replaceParms(parms, format);
  273.     }
  274.     function getInsertBefore(node) {
  275.         var format = "one.parentNode.insertBefore(node0, two);";
  276.         var parms = { one: getContextNodeDOM(node), two: getContextNodeDOM(node) };
  277.         return replaceParms(parms, format);
  278.     }
  279.     function getReplaceChildren(node) {
  280.         var format =
  281.                 "while (one.childNodes.length > 0) {"
  282.                 + "two.removeChild(three.childNodes[0]); }"
  283.                 + "four.appendChild(node0);";
  284.         var parms = { one: getContextNodeDOM(node), two: getContextNodeDOM(node), three: getContextNodeDOM(node), four: getContextNodeDOM(node) };
  285.         return replaceParms(parms, format);
  286.     }
  287.     function getReplace(node) {
  288.         var format = "one.parentNode.replaceChild(node0, two);";
  289.         var parms = { one: getContextNodeDOM(node), two: getContextNodeDOM(node) };
  290.         return replaceParms(parms, format);
  291.     }
  292. }