Changed zouba directory heirarchy.
[ptas] / zouba / wrt / preview / script / xml2json.js
1 /*\r
2 xml2json v 1.1\r
3 copyright 2005-2007 Thomas Frank\r
4 \r
5 This program is free software under the terms of the \r
6 GNU General Public License version 2 as published by the Free \r
7 Software Foundation. It is distributed without any warranty.\r
8 */\r
9 \r
10 var xml2json={ \r
11         parser:function(xmlcode,ignoretags,debug){\r
12                 if(!ignoretags){ignoretags=""};\r
13                 xmlcode=xmlcode.replace(/\s*\/>/g,'/>');\r
14                 xmlcode=xmlcode.replace(/<\?[^>]*>/g,"").replace(/<\![^>]*>/g,"");\r
15                 if (!ignoretags.sort){ignoretags=ignoretags.split(",")};\r
16                 var x=this.no_fast_endings(xmlcode);\r
17                 x=this.attris_to_tags(x);\r
18                 x=escape(x);\r
19                 x=x.split("%3C").join("<").split("%3E").join(">").split("%3D").join("=").split("%22").join("\"");\r
20                 for (var i=0;i<ignoretags.length;i++){\r
21                         x=x.replace(new RegExp("<"+ignoretags[i]+">","g"),"*$**"+ignoretags[i]+"**$*");\r
22                         x=x.replace(new RegExp("</"+ignoretags[i]+">","g"),"*$***"+ignoretags[i]+"**$*")\r
23                 };\r
24                 x='<JSONTAGWRAPPER>'+x+'</JSONTAGWRAPPER>';\r
25                 this.xmlobject={};\r
26                 var y=this.xml_to_object(x).jsontagwrapper;\r
27                 if(debug){y=this.show_json_structure(y,debug)};\r
28                 return y\r
29         },\r
30         xml_to_object:function(xmlcode){\r
31                 var x=xmlcode.replace(/<\//g,"§");\r
32                 x=x.split("<");\r
33                 var y=[];\r
34                 var level=0;\r
35                 var opentags=[];\r
36                 for (var i=1;i<x.length;i++){\r
37                         var tagname=x[i].split(">")[0];\r
38                         opentags.push(tagname);\r
39                         level++\r
40                         y.push(level+"<"+x[i].split("§")[0]);\r
41                         while(x[i].indexOf("§"+opentags[opentags.length-1]+">")>=0){level--;opentags.pop()}\r
42                 };\r
43                 var oldniva=-1;\r
44                 var objname="this.xmlobject";\r
45                 for (var i=0;i<y.length;i++){\r
46                         var preeval="";\r
47                         var niva=y[i].split("<")[0];\r
48                         var tagnamn=y[i].split("<")[1].split(">")[0];\r
49                         tagnamn=tagnamn.toLowerCase();\r
50                         var rest=y[i].split(">")[1];\r
51                         if(niva<=oldniva){\r
52                                 var tabort=oldniva-niva+1;\r
53                                 for (var j=0;j<tabort;j++){objname=objname.substring(0,objname.lastIndexOf("."))}\r
54                         };\r
55                         objname+="."+tagnamn;\r
56                         var pobject=objname.substring(0,objname.lastIndexOf("."));\r
57                         if (eval("typeof "+pobject) != "object"){preeval+=pobject+"={value:"+pobject+"};\n"};\r
58                         var objlast=objname.substring(objname.lastIndexOf(".")+1);\r
59                         var already=false;\r
60                         for (k in eval(pobject)){if(k==objlast){already=true}};\r
61                         var onlywhites=true;\r
62                         for(var s=0;s<rest.length;s+=3){\r
63                                 if(rest.charAt(s)!="%"){onlywhites=false}\r
64                         };\r
65                         if (rest!="" && !onlywhites){\r
66                                 if(rest/1!=rest){\r
67                                         rest="'"+rest.replace(/\'/g,"\\'")+"'";\r
68                                         rest=rest.replace(/\*\$\*\*\*/g,"</");\r
69                                         rest=rest.replace(/\*\$\*\*/g,"<");\r
70                                         rest=rest.replace(/\*\*\$\*/g,">")\r
71                                 }\r
72                         } \r
73                         else {rest="{}"};\r
74                         if(rest.charAt(0)=="'"){rest='unescape('+rest+')'};\r
75                         if (already && !eval(objname+".sort")){preeval+=objname+"=["+objname+"];\n"};\r
76                         var before="=";after="";\r
77                         if (already){before=".push(";after=")"};\r
78                         var toeval=preeval+objname+before+rest+after;\r
79                         eval(toeval);\r
80                         if(eval(objname+".sort")){objname+="["+eval(objname+".length-1")+"]"};\r
81                         oldniva=niva\r
82                 };\r
83                 return this.xmlobject\r
84         },\r
85         show_json_structure:function(obj,debug,l){\r
86                 var x='';\r
87                 if (obj.sort){x+="[\n"} else {x+="{\n"};\r
88                 for (var i in obj){\r
89                         if (!obj.sort){x+=i+":"};\r
90                         if (typeof obj[i] == "object"){\r
91                                 x+=this.show_json_structure(obj[i],false,1)\r
92                         }\r
93                         else {\r
94                                 if(typeof obj[i]=="function"){\r
95                                         var v=obj[i]+"";\r
96                                         //v=v.replace(/\t/g,"");\r
97                                         x+=v\r
98                                 }\r
99                                 else if(typeof obj[i]!="string"){x+=obj[i]+",\n"}\r
100                                 else {x+="'"+obj[i].replace(/\'/g,"\\'").replace(/\n/g,"\\n").replace(/\t/g,"\\t").replace(/\r/g,"\\r")+"',\n"}\r
101                         }\r
102                 };\r
103                 if (obj.sort){x+="],\n"} else {x+="},\n"};\r
104                 if (!l){\r
105                         x=x.substring(0,x.lastIndexOf(","));\r
106                         x=x.replace(new RegExp(",\n}","g"),"\n}");\r
107                         x=x.replace(new RegExp(",\n]","g"),"\n]");\r
108                         var y=x.split("\n");x="";\r
109                         var lvl=0;\r
110                         for (var i=0;i<y.length;i++){\r
111                                 if(y[i].indexOf("}")>=0 || y[i].indexOf("]")>=0){lvl--};\r
112                                 tabs="";for(var j=0;j<lvl;j++){tabs+="\t"};\r
113                                 x+=tabs+y[i]+"\n";\r
114                                 if(y[i].indexOf("{")>=0 || y[i].indexOf("[")>=0){lvl++}\r
115                         };\r
116                         if(debug=="html"){\r
117                                 x=x.replace(/</g,"&lt;").replace(/>/g,"&gt;");\r
118                                 x=x.replace(/\n/g,"<BR>").replace(/\t/g,"&nbsp;&nbsp;&nbsp;&nbsp;")\r
119                         };\r
120                         if (debug=="compact"){x=x.replace(/\n/g,"").replace(/\t/g,"")}\r
121                 };\r
122                 return x\r
123         },\r
124         no_fast_endings:function(x){\r
125                 x=x.split("/>");\r
126                 for (var i=1;i<x.length;i++){\r
127                         var t=x[i-1].substring(x[i-1].lastIndexOf("<")+1).split(" ")[0];\r
128                         x[i]="></"+t+">"+x[i]\r
129                 }       ;\r
130                 x=x.join("");\r
131                 return x\r
132         },\r
133         attris_to_tags: function(x){\r
134                 var d=' ="\''.split("");\r
135                 x=x.split(">");\r
136                 for (var i=0;i<x.length;i++){\r
137                         var temp=x[i].split("<");\r
138                         for (var r=0;r<4;r++){temp[0]=temp[0].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")};\r
139                         if(temp[1]){\r
140                                 temp[1]=temp[1].replace(/'/g,'"');\r
141                                 temp[1]=temp[1].split('"');\r
142                                 for (var j=1;j<temp[1].length;j+=2){\r
143                                         for (var r=0;r<4;r++){temp[1][j]=temp[1][j].replace(new RegExp(d[r],"g"),"_jsonconvtemp"+r+"_")}\r
144                                 };\r
145                                 temp[1]=temp[1].join('"')\r
146                         };\r
147                         x[i]=temp.join("<")\r
148                 };\r
149                 x=x.join(">");\r
150                 x=x.replace(/ ([^=]*)=([^ |>]*)/g,"><$1>$2</$1");\r
151                 x=x.replace(/>"/g,">").replace(/"</g,"<");\r
152                 for (var r=0;r<4;r++){x=x.replace(new RegExp("_jsonconvtemp"+r+"_","g"),d[r])}  ;\r
153                 return x\r
154         }\r
155 };\r
156 \r
157 \r
158 if(!Array.prototype.push){\r
159         Array.prototype.push=function(x){\r
160                 this[this.length]=x;\r
161                 return true\r
162         }\r
163 };\r
164 \r
165 if (!Array.prototype.pop){\r
166         Array.prototype.pop=function(){\r
167                 var response = this[this.length-1];\r
168                 this.length--;\r
169                 return response\r
170         }\r
171 };\r
172 \r