1 /** 2 * @namespace 3 * オブジェクト、配列などのデータの内容をダンプする機能を提供します。 <br> 4 * この名前空間をテンプレートから使用する場合、以下のようにテンプレート自身でjsファイルをロードしておく必要があります。 5 * <div class="example_in_desc" > 6 * IO.include("frame/Dumper.js"); 7 * </div> 8 * <pre class="org_comment"> 9 * This is a lightly modified version of Kevin Jones' JavaScript 10 * library Data.Dump. To download the original visit: 11 * <a href="http://openjsan.org/doc/k/ke/kevinj/Data/Dump/">http://openjsan.org/doc/k/ke/kevinj/Data/Dump/</a> 12 * 13 * AUTHORS 14 * 15 * The Data.Dump JavaScript module is written by Kevin Jones 16 * (kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no), 17 * based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu). 18 * 19 * COPYRIGHT 20 * 21 * Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas. 22 * Copyright 1996-1998 Gurusamy Sarathy. 23 * 24 * This program is free software; you can redistribute it and/or modify 25 * it under the terms of the Perl Artistic License 26 * 27 * See http://www.perl.com/perl/misc/Artistic.html 28 * </pre> 29 */ 30 Dumper = { 31 /** 32 * 指定されたデータを展開し、内容を文字列化して返します。 33 * @param {*} [args,...] 処理対象のデータ。複数のパラメタを指定できます。 34 * <p class="org_comment">The objects to dump.</p> 35 * @return {String} 展開されたデータ 36 */ 37 dump: function () { 38 if (arguments.length > 1) 39 return this._dump(arguments); 40 else if (arguments.length == 1) 41 return this._dump(arguments[0]); 42 else 43 return "()"; 44 }, 45 46 _dump: function (obj) { 47 if (typeof obj == 'undefined') return 'undefined'; 48 var out; 49 if (obj.serialize) { return obj.serialize(); } 50 var type = this._typeof(obj); 51 if (obj.circularReference) obj.circularReference++; 52 switch (type) { 53 case 'circular': 54 out = "{ //circularReference\n}"; 55 break; 56 case 'object': 57 var pairs = new Array; 58 59 for (var prop in obj) { 60 if (prop != "circularReference" && obj.hasOwnProperty(prop)) { //hide inherited properties 61 pairs.push(prop + ': ' + this._dump(obj[prop])); 62 } 63 } 64 65 out = '{' + this._format_list(pairs) + '}'; 66 break; 67 68 case 'string': 69 for (var prop in Dumper.ESC) { 70 if (Dumper.ESC.hasOwnProperty(prop)) { 71 obj = obj.replace(prop, Dumper.ESC[prop]); 72 } 73 } 74 75 // Escape UTF-8 Strings 76 if (obj.match(/^[\x00-\x7f]*$/)) { 77 out = '"' + obj.replace(/\"/g, "\\\"").replace(/([\n\r]+)/g, "\\$1") + '"'; 78 } 79 else { 80 out = "unescape('"+escape(obj)+"')"; 81 } 82 break; 83 84 case 'array': 85 var elems = new Array; 86 87 for (var i=0; i<obj.length; i++) { 88 elems.push( this._dump(obj[i]) ); 89 } 90 91 out = '[' + this._format_list(elems) + ']'; 92 break; 93 94 case 'date': 95 // firefox returns GMT strings from toUTCString()... 96 var utc_string = obj.toUTCString().replace(/GMT/,'UTC'); 97 out = 'new Date("' + utc_string + '")'; 98 break; 99 100 case 'element': 101 // DOM element 102 out = this._dump_dom(obj); 103 break; 104 105 default: 106 out = obj; 107 } 108 109 out = String(out).replace(/\n/g, '\n '); 110 out = out.replace(/\n (.*)$/,"\n$1"); 111 112 return out; 113 }, 114 115 _format_list: function (list) { 116 if (!list.length) return ''; 117 var nl = list.toString().length > 60 ? '\n' : ' '; 118 return nl + list.join(',' + nl) + nl; 119 }, 120 121 _typeof: function (obj) { 122 if (obj && obj.circularReference && obj.circularReference > 1) return 'circular'; 123 if (Array.prototype.isPrototypeOf(obj)) return 'array'; 124 if (Date.prototype.isPrototypeOf(obj)) return 'date'; 125 if (typeof obj.nodeType != 'undefined') return 'element'; 126 return typeof(obj); 127 }, 128 129 _dump_dom: function (obj) { 130 return '"' + Dumper.nodeTypes[obj.nodeType] + '"'; 131 } 132 }; 133 134 Dumper.ESC = { 135 "\t": "\\t", 136 "\n": "\\n", 137 "\f": "\\f" 138 }; 139 140 Dumper.nodeTypes = { 141 1: "ELEMENT_NODE", 142 2: "ATTRIBUTE_NODE", 143 3: "TEXT_NODE", 144 4: "CDATA_SECTION_NODE", 145 5: "ENTITY_REFERENCE_NODE", 146 6: "ENTITY_NODE", 147 7: "PROCESSING_INSTRUCTION_NODE", 148 8: "COMMENT_NODE", 149 9: "DOCUMENT_NODE", 150 10: "DOCUMENT_TYPE_NODE", 151 11: "DOCUMENT_FRAGMENT_NODE", 152 12: "NOTATION_NODE" 153 };