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