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 };