test.html 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:o2="http://www.o2oa.net">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <textarea id="content" style="width: 600px; height: 500px"></textarea>
  9. <textarea id="result" style="width: 600px; height: 500px"></textarea><br>
  10. <input type="button" value="testStr" onclick="test()"/>
  11. <input type="button" value="testDom" onclick="testDom()"/>
  12. <input type="button" value="testo2" onclick="testo2()"/>
  13. <div id="resultDiv"></div>
  14. <script>
  15. var json = {
  16. "if": {
  17. "x": 0
  18. },
  19. "lp": {
  20. "saveIdeaDefault": "saveIdeaDefault",
  21. "text2": "text2",
  22. "text3": "text3",
  23. "items": [
  24. {
  25. "itemvalue": "items1",
  26. "subs": [
  27. {"subvalue": "items1_sub1"},
  28. {"subvalue": "items1_sub2"},
  29. {"subvalue": "items1_sub3"},
  30. {"subvalue": "items1_sub4"},
  31. {"subvalue": "items1_sub5"}
  32. ]
  33. },
  34. {
  35. "itemvalue": "items2"
  36. },
  37. {
  38. "itemvalue": "items3",
  39. "subs": [
  40. {"subvalue": "items3_sub1"},
  41. {"subvalue": "items3_sub2"}
  42. ]
  43. },
  44. {
  45. "itemvalue": "items4",
  46. "subs": [
  47. {"subvalue": "items4_sub1"},
  48. {"subvalue": "items4_sub2"},
  49. {"subvalue": "items4_sub3"}
  50. ]
  51. }
  52. ]
  53. }
  54. };
  55. function testo2(){
  56. document.all.resultDiv.innerHTML = "";
  57. var t = document.all.content.value;
  58. var node = document.all.resultDiv;
  59. node.innerHTML = "";
  60. var x = t;
  61. for (var r=0; r<480; r++){
  62. x += t;
  63. }
  64. node.innerHTML = x;
  65. var sd = new Date();
  66. parseDom(node);
  67. document.all.result.value = node.innerHTML;
  68. var ed = new Date();
  69. alert(ed.getTime()-sd.getTime());
  70. }
  71. function parseDom(node){
  72. var subNode = node.firstChild;
  73. //var subNode = node.querySelector("o2\\:if,o2\\:each,o2\\:text");
  74. while(subNode){
  75. if (subNode.nodeType===Node.ELEMENT_NODE){
  76. if (subNode.localName.toString().toLowerCase()==="o2:if"){
  77. var condition = subNode.getAttribute("condition");
  78. var flag = _jsonText(json, condition, "boolean");
  79. if (flag){
  80. parseDom(subNode);
  81. }else{
  82. subNode.parentNode.removeChild(subNode);
  83. }
  84. }else if (subNode.localName.toString().toLowerCase()==="o2:each"){
  85. }else if (subNode.localName.toString().toLowerCase()==="o2:text"){
  86. var text = subNode.innerText;
  87. subNode.parentNode.replaceChild(document.createTextNode(_jsonText(json, text)), subNode);
  88. }else{
  89. parseDom(subNode);
  90. }
  91. }
  92. subNode = subNode.nextSibling;
  93. }
  94. }
  95. function testDom(){
  96. document.all.resultDiv.innerHTML = "";
  97. var sd = new Date();
  98. var node = document.all.resultDiv;
  99. for (var r=0; r<480; r++){
  100. for (var i=0; i<json.lp.items.length; i++){
  101. var n = document.createElement("div");
  102. n.innerText = json.lp.text3;
  103. node.appendChild(n);
  104. var n2 = document.createElement("div");
  105. n2.className = "o2_profile_ideasSave";
  106. n2.innerText = json.lp.items[i].itemvalue;
  107. node.appendChild(n2);
  108. // if (json.lp.items[i].subs){
  109. // for (var j=0; j<json.lp.items[i].subs.length; j++){
  110. // var n3 = document.createElement("div");
  111. // n3.className = "o2_profile_ideasSave";
  112. // n3.innerText = json.lp.items[i].subs[j].subvalue;
  113. // node.appendChild(n3);
  114. // }
  115. // }
  116. }
  117. }
  118. document.all.result.value = node.innerHTML;
  119. var ed = new Date();
  120. alert(ed.getTime()-sd.getTime());
  121. }
  122. function test(){
  123. var sd = new Date();
  124. var t = document.all.content.value;
  125. var r = "";
  126. for (var z=0; z<480; z++){
  127. r += parseHtml(t, json);
  128. }
  129. document.all.result.value = r;
  130. document.all.resultDiv.innerHTML = r;
  131. var ed = new Date();
  132. alert(ed.getTime()-sd.getTime());
  133. }
  134. function _typeOf(item){
  135. if (item == null) return 'null';
  136. if (item.$family != null) return item.$family();
  137. if (item.constructor == window.Array) return "array";
  138. if (item.nodeName){
  139. if (item.nodeType == 1) return 'element';
  140. if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
  141. } else if (typeof item.length == 'number'){
  142. if (item.callee) return 'arguments';
  143. }
  144. return typeof item;
  145. }
  146. function getIfBlockEnd(v){
  147. var rex = /(\{\{if\s+)|(\{\{\s*end if\s*\}\})/gmi;
  148. var rexEnd = /\{\{\s*end if\s*\}\}/gmi;
  149. var subs = 1;
  150. while ((match = rex.exec(v)) !== null) {
  151. var fullMatch = match[0];
  152. if (fullMatch.search(rexEnd)!==-1){
  153. subs--;
  154. if (subs==0) break;
  155. }else{
  156. subs++
  157. }
  158. }
  159. if (match) return {"codeIndex": match.index, "lastIndex": rex.lastIndex};
  160. return {"codeIndex": v.length-1, "lastIndex": v.length-1};
  161. }
  162. function getEachBlockEnd(v){
  163. var rex = /(\{\{each\s+)|(\{\{\s*end each\s*\}\})/gmi;
  164. var rexEnd = /\{\{\s*end each\s*\}\}/gmi;
  165. var subs = 1;
  166. while ((match = rex.exec(v)) !== null) {
  167. var fullMatch = match[0];
  168. if (fullMatch.search(rexEnd)!==-1){
  169. subs--;
  170. if (subs==0) break;
  171. }else{
  172. subs++;
  173. }
  174. }
  175. if (match) return {"codeIndex": match.index, "lastIndex": rex.lastIndex};
  176. return {"codeIndex": v.length-1, "lastIndex": v.length-1};
  177. }
  178. function parseHtml(str, json){
  179. var v = str;
  180. var rex = /(\{\{\s*)[\s\S]*?(\s*\}\})/gmi;
  181. var match;
  182. while ((match = rex.exec(v)) !== null) {
  183. var fullMatch = match[0];
  184. var offset = 0;
  185. //if statement begin
  186. if (fullMatch.search(/\{\{if\s+/i)!==-1){
  187. //找到对应的end if
  188. var condition = fullMatch.replace(/^\{\{if\s*/i, "");
  189. condition = condition.replace(/\s*\}\}$/i, "");
  190. var flag = _jsonText(json, condition, "boolean");
  191. var tmpStr = v.substring(rex.lastIndex, v.length);
  192. var endIfIndex = getIfBlockEnd(tmpStr);
  193. if (flag){ //if 为 true
  194. var parseStr = parseHtml(tmpStr.substring(0, endIfIndex.codeIndex), json);
  195. var vLeft = v.substring(0, match.index);
  196. var vRight = v.substring(rex.lastIndex+endIfIndex.lastIndex, v.length);
  197. v = vLeft + parseStr + vRight;
  198. offset = parseStr.length - fullMatch.length;
  199. }else{
  200. v = v.substring(0, match.index) + v.substring(rex.lastIndex+endIfIndex.lastIndex, v.length);
  201. offset = 0-fullMatch.length;
  202. }
  203. }else if (fullMatch.search(/\{\{each\s+/)!==-1) { //each statement
  204. var itemString = fullMatch.replace(/^\{\{each\s*/, "");
  205. itemString = itemString.replace(/\s*\}\}$/, "");
  206. var eachValue = _jsonText(json, itemString, "object");
  207. var tmpEachStr = v.substring(rex.lastIndex, v.length);
  208. var endEachIndex = getEachBlockEnd(tmpEachStr);
  209. var parseEachStr = tmpEachStr.substring(0, endEachIndex.codeIndex);
  210. var eachResult = "";
  211. if (eachValue && _typeOf(eachValue)==="array"){
  212. for (var i=0; i<eachValue.length; i++){
  213. eachValue[i]._ = json;
  214. var parseEachResultStr = parseHtml(parseEachStr, eachValue[i]);
  215. eachResult += parseEachResultStr;
  216. }
  217. var eLeft = v.substring(0, match.index);
  218. var eRight = v.substring(rex.lastIndex+endEachIndex.lastIndex, v.length);
  219. v = eLeft + eachResult + eRight;
  220. offset = eachResult.length - fullMatch.length;
  221. }else{
  222. v = v.substring(0, match.index) + v.substring(rex.lastIndex+endEachIndex.lastIndex, v.length);
  223. offset = 0-fullMatch.length;
  224. }
  225. }else{ //text statement
  226. var text = fullMatch.replace(/^\{\{\s*/, "");
  227. text = text.replace(/\}\}\s*$/, "");
  228. var value = _jsonText(json, text);
  229. offset = value.length-fullMatch.length;
  230. v = v.substring(0, match.index) + value + v.substring(rex.lastIndex, v.length);
  231. }
  232. rex.lastIndex = rex.lastIndex + offset;
  233. }
  234. return v;
  235. }
  236. function parseHtml2(str, blocks){
  237. var v = str;
  238. var rex = /(\{\{\s*)[\s\S]*?(\s*\}\})/g;
  239. var block = null, ifBlock = null, eachBlock = null;
  240. if (blocks && blocks.length){
  241. for (var i=blocks.length-1; i>=0; i--){
  242. if (i===blocks.length-1) block = blocks[i];
  243. if (!ifBlock && blocks[i].type==="if") ifBlock = blocks[i];
  244. if (!eachBlock && blocks[i].type==="each") eachBlock = blocks[i];
  245. if (block && ifBlock && eachBlock) break;
  246. }
  247. }
  248. var match;
  249. while ((match = rex.exec(v)) !== null) {
  250. var fullMatch = match[0];
  251. var offset = 0;
  252. //if statement begin
  253. if (fullMatch.search(/^\{\{if\s+/)!==-1){
  254. var ifBlockObj = {"start": match.index, "type": "if"};
  255. var condition = fullMatch.replace(/^\{\{if\s*/, "");
  256. condition = condition.replace(/\s*\}\}$/, "");
  257. ifBlockObj.value = _jsonText(json, condition, "boolean");
  258. if (!blocks) blocks = [];
  259. blocks.push(ifBlockObj);
  260. block = ifBlockObj;
  261. ifBlock = ifBlockObj;
  262. v = v.substring(0, match.index) + v.substring(rex.lastIndex, v.length);
  263. offset = 0 - fullMatch.length;
  264. }else if (fullMatch.search(/\{\{\s*end if\s*\}\}/)!==-1){ //if statement end
  265. if (ifBlock && !ifBlock.value){
  266. v = v.substring(0, ifBlock.start) + v.substring(rex.lastIndex, v.length);
  267. offset = ifBlock.start - rex.lastIndex;
  268. }else{
  269. v = v.substring(0, match.index) + v.substring(rex.lastIndex, v.length);
  270. offset = 0 - fullMatch.length;
  271. }
  272. }else if (fullMatch.search(/^\{\{each\s+/)!==-1) { //each statement
  273. var eachBlockObj = {"start": match.index, "type": "each"};
  274. var itemString = fullMatch.replace(/^\{\{each\s*/, "");
  275. itemString = itemString.replace(/\s*\}\}$/, "");
  276. eachBlockObj.value = _jsonText(json, itemString, "object");
  277. if (!blocks) blocks = [];
  278. blocks.push(eachBlockObj);
  279. block = eachBlockObj;
  280. eachBlock = eachBlockObj;
  281. v = v.substring(0, match.index) + v.substring(rex.lastIndex, v.length);
  282. offset = 0 - fullMatch.length;
  283. }else if (fullMatch.search(/\{\{\s*end each\s*\}\}/)!==-1) { //each statement end
  284. }else{ //text statement
  285. if (ifBlock && !ifBlock.value){
  286. v = v.substring(0, ifBlock.start) + v.substring(rex.lastIndex, v.length);
  287. offset = ifBlock.start - rex.lastIndex;
  288. }else{
  289. var text = fullMatch.replace(/^\{\{\s*/, "");
  290. text = text.replace(/\}\}\s*$/, "");
  291. var value = _jsonText(((eachBlock) ? eachBlock.value : json), text);
  292. offset = value.length-fullMatch.length;
  293. v = v.substring(0, match.index) + value + v.substring(rex.lastIndex, v.length);
  294. }
  295. }
  296. rex.lastIndex = rex.lastIndex + offset;
  297. }
  298. return v;
  299. }
  300. function _jsonText(json, text, type){
  301. try {
  302. var $ = json;
  303. var f = eval("(function($){\n return "+text+";\n})");
  304. returnValue = f.apply(json, [$]);
  305. if (returnValue===undefined) returnValue="";
  306. if (type==="boolean") return (!!returnValue);
  307. if (type==="object") return returnValue;
  308. returnValue = returnValue.toString();
  309. return returnValue || "";
  310. }catch(e){
  311. if (type==="boolean") return false;
  312. if (type==="object") return null;
  313. return "";
  314. }
  315. }
  316. </script>
  317. </body>
  318. </html>