|
1 /** |
|
2 * @class |
|
3 <pre> |
|
4 This is a lightly modified version of Kevin Jones' JavaScript |
|
5 library Data.Dump. To download the original visit: |
|
6 <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a> |
|
7 |
|
8 AUTHORS |
|
9 |
|
10 The Data.Dump JavaScript module is written by Kevin Jones |
|
11 (kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no), |
|
12 based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu). |
|
13 |
|
14 COPYRIGHT |
|
15 |
|
16 Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas. |
|
17 Copyright 1996-1998 Gurusamy Sarathy. |
|
18 |
|
19 This program is free software; you can redistribute it and/or modify |
|
20 it under the terms of the Perl Artistic License |
|
21 |
|
22 See http://www.perl.com/perl/misc/Artistic.html |
|
23 </pre> |
|
24 * @static |
|
25 */ |
|
26 Dumper = { |
|
27 /** @param [...] The objects to dump. */ |
|
28 dump: function () { |
|
29 if (arguments.length > 1) |
|
30 return this._dump(arguments); |
|
31 else if (arguments.length == 1) |
|
32 return this._dump(arguments[0]); |
|
33 else |
|
34 return "()"; |
|
35 }, |
|
36 |
|
37 _dump: function (obj) { |
|
38 if (typeof obj == 'undefined') return 'undefined'; |
|
39 var out; |
|
40 if (obj.serialize) { return obj.serialize(); } |
|
41 var type = this._typeof(obj); |
|
42 if (obj.circularReference) obj.circularReference++; |
|
43 switch (type) { |
|
44 case 'circular': |
|
45 out = "{ //circularReference\n}"; |
|
46 break; |
|
47 case 'object': |
|
48 var pairs = new Array; |
|
49 |
|
50 for (var prop in obj) { |
|
51 if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties |
|
52 pairs.push(prop + ': ' + this._dump(obj[prop])); |
|
53 } |
|
54 } |
|
55 |
|
56 out = '{' + this._format_list(pairs) + '}'; |
|
57 break; |
|
58 |
|
59 case 'string': |
|
60 for (var prop in Dumper.ESC) { |
|
61 if (Dumper.ESC.hasOwnProperty(prop)) { |
|
62 obj = obj.replace(prop, Dumper.ESC[prop]); |
|
63 } |
|
64 } |
|
65 |
|
66 // Escape UTF-8 Strings |
|
67 if (obj.match(/^[\x00-\x7f]*$/)) { |
|
68 out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"'; |
|
69 } |
|
70 else { |
|
71 out = "unescape('"+escape(obj)+"')"; |
|
72 } |
|
73 break; |
|
74 |
|
75 case 'array': |
|
76 var elems = new Array; |
|
77 |
|
78 for (var i=0; i<obj.length; i++) { |
|
79 elems.push( this._dump(obj[i]) ); |
|
80 } |
|
81 |
|
82 out = '[' + this._format_list(elems) + ']'; |
|
83 break; |
|
84 |
|
85 case 'date': |
|
86 // firefox returns GMT strings from toUTCString()... |
|
87 var utc_string = obj.toUTCString().replace(/GMT/,'UTC'); |
|
88 out = 'new Date("' + utc_string + '")'; |
|
89 break; |
|
90 |
|
91 case 'element': |
|
92 // DOM element |
|
93 out = this._dump_dom(obj); |
|
94 break; |
|
95 |
|
96 default: |
|
97 out = obj; |
|
98 } |
|
99 |
|
100 out = String(out).replace(/\n/g, '\n '); |
|
101 out = out.replace(/\n (.*)$/,"\n$1"); |
|
102 |
|
103 return out; |
|
104 }, |
|
105 |
|
106 _format_list: function (list) { |
|
107 if (!list.length) return ''; |
|
108 var nl = list.toString().length > 60 ? '\n' : ' '; |
|
109 return nl + list.join(',' + nl) + nl; |
|
110 }, |
|
111 |
|
112 _typeof: function (obj) { |
|
113 if (obj && obj.circularReference && obj.circularReference > 1) return 'circular'; |
|
114 if (Array.prototype.isPrototypeOf(obj)) return 'array'; |
|
115 if (Date.prototype.isPrototypeOf(obj)) return 'date'; |
|
116 if (typeof obj.nodeType != 'undefined') return 'element'; |
|
117 return typeof(obj); |
|
118 }, |
|
119 |
|
120 _dump_dom: function (obj) { |
|
121 return '"' + Dumper.nodeTypes[obj.nodeType] + '"'; |
|
122 } |
|
123 }; |
|
124 |
|
125 Dumper.ESC = { |
|
126 "\t": "\\t", |
|
127 "\n": "\\n", |
|
128 "\f": "\\f" |
|
129 }; |
|
130 |
|
131 Dumper.nodeTypes = { |
|
132 1: "ELEMENT_NODE", |
|
133 2: "ATTRIBUTE_NODE", |
|
134 3: "TEXT_NODE", |
|
135 4: "CDATA_SECTION_NODE", |
|
136 5: "ENTITY_REFERENCE_NODE", |
|
137 6: "ENTITY_NODE", |
|
138 7: "PROCESSING_INSTRUCTION_NODE", |
|
139 8: "COMMENT_NODE", |
|
140 9: "DOCUMENT_NODE", |
|
141 10: "DOCUMENT_TYPE_NODE", |
|
142 11: "DOCUMENT_FRAGMENT_NODE", |
|
143 12: "NOTATION_NODE" |
|
144 }; |