PageRenderTime 16ms CodeModel.GetById 8ms app.highlight 7ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/jsdoc_toolkit-2.4.0/jsdoc-toolkit/app/frame/Dumper.js

http://jsdoc-toolkit.googlecode.com/
JavaScript | 144 lines | 97 code | 18 blank | 29 comment | 26 complexity | 840202dce50234da4ca45a1a6882c529 MD5 | raw file
  1/**
  2 * @class
  3<pre>
  4This is a lightly modified version of Kevin Jones' JavaScript
  5library 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
  8AUTHORS
  9
 10The Data.Dump JavaScript module is written by Kevin Jones 
 11(kevinj@cpan.org), based on Data::Dump by Gisle Aas (gisle@aas.no),
 12based on Data::Dumper by Gurusamy Sarathy (gsar@umich.edu).
 13
 14COPYRIGHT
 15
 16Copyright 2007 Kevin Jones. Copyright 1998-2000,2003-2004 Gisle Aas.
 17Copyright 1996-1998 Gurusamy Sarathy.
 18
 19This program is free software; you can redistribute it and/or modify
 20it under the terms of the Perl Artistic License
 21
 22See http://www.perl.com/perl/misc/Artistic.html
 23</pre>
 24 * @static
 25 */
 26Dumper = {
 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
125Dumper.ESC = {
126    "\t": "\\t",
127    "\n": "\\n",
128    "\f": "\\f"
129};
130
131Dumper.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};