root/as3/Dumper/src/org/libspark/utils/Dumper.as

リビジョン 1194, 8.1 kB (コミッタ: dealforest, コミット時期: 1 年 前)

Dumper: ticket #55

add judge 'ExternalInterface?.available'

Line 
1 package org.libspark.utils {
2     import flash.external.ExternalInterface;
3     import flash.utils.getQualifiedClassName;
4
5     /**
6      * <p>Dataの中身を解析するクラス。perlのData::Dumperを参考にした。
7      * 現在対応しているのは、Object, Array, Number, String, Booleanのみ。
8      * XMLに関してはできるようにするつもり。
9      * 特徴としてはFireBugのconsoleに出力する機能をデフォルトでサポートしている。
10      * debug, info, warn, error の出力形式をサポートしている。</p>
11      * <listing>
12      * package {
13      *    import org.libspark.utils.Dumper;
14      *    public Class Hoge {
15      *        var test:Object = { a:'hoge', b:'fuga'};
16      *        Dumper.debug(test);
17      *        trace(Dumper.toString(test));
18      *    }
19      *    // output
20      *         $var0 = {
21      *                     'a' => 'hoge',
22      *                     'b' => 'fuga',
23      *                 }
24      *     
25      * }</listing>
26      * @author dealforest
27      * @version 0.102
28      */
29
30     public class Dumper {
31         private static const INDENT:String = "    ";
32         /*
33          * @default 4tab
34          */
35         private static var _dumpString:String = "";
36
37         /**
38          * 解析結果を文字列として返すことができます
39          *
40          * @param args 解析したい要素(引数全て)
41          * @return _txt フォーマットに合わせた解析した文字列
42          */
43         public static function toString(... args):String {
44             var _txt:String = _dumpString = '';
45             for (var a:String in args)
46                 _txt += parse(args[a]);
47             return _txt;
48         }
49
50         /**
51          * FireBugのコンソールに'debug'として表示
52          *
53          * @param args 解析したい要素(引数全て)
54          */
55         public static function debug(... args):void {
56             if (!ExternalInterface.available) return;
57
58             var _txt:String = _dumpString = '';
59             for (var a:String in args)
60                 _txt += parse(args[a]);
61             //interim action for IE
62             ExternalInterface.call('function (txt) { try { console.log(txt); } catch (e) {}; }', _txt);
63         }
64
65         /**
66          * FireBugのコンソールに'info'として表示
67          *
68          * @param args 解析したい要素(引数全て)
69          */
70         public static function info(... args):void {
71             if (!ExternalInterface.available) return;
72
73             var _txt:String = _dumpString = '';
74             for (var a:String in args)
75                 _txt += parse(args[a]);
76             //interim action for IE
77             ExternalInterface.call('function (txt) { try { console.info(txt); } catch (e) {}; }', _txt);
78         }
79
80         /**
81          * FireBugのコンソールに'warn'として表示
82          *
83          * @param args 解析したい要素(引数全て)
84          */
85         public static function warn(... args):void {
86             if (!ExternalInterface.available) return;
87
88             var _txt:String = _dumpString = '';
89             for (var a:String in args)
90                 _txt += parse(args[a]);
91             //interim action for IE
92             ExternalInterface.call('function (txt) { try { console.warn(txt); } catch (e) {}; }', _txt);
93         }
94
95         /**
96          * FireBugのコンソールに'error'として表示
97          *
98          * @param arg 解析したい要素(引数全て)
99          */
100         public static function error(... args):void {
101             if (!ExternalInterface.available) return;
102
103             var _txt:String = _dumpString = '';
104             for (var a:String in args)
105                 _txt += parse(args[a]);
106             //interim action for IE
107             ExternalInterface.call('function (txt) { try { console.error(txt); } catch (e) {}; }', _txt);
108         }
109
110         /**
111          * 要素の数だけ繰り返す。大元みたいなもん。
112          *
113          * @param arg 解析したい要素(引数のうちの1つ)
114          * @return 各要素単位の解析した文字列
115          * @private
116          */
117         public static function parse(arg:*):String {
118             var argIndent:String = ('$var'+ ' = ');
119             _dumpString += argIndent;
120             inspect(arg, argIndent.replace(/./g, ' '));
121             _dumpString += '\n';
122             return _dumpString;
123         }
124        
125         /**
126          * 再帰処理の前のイニシャライズみたいなもん。
127          *
128          * @param arg 解析したい要素(引数のうちの1つ)
129          * @param indent 表示する際の空白
130          * @private
131          */
132         private static function inspect(arg:*, indent:String):void {
133             var bracket:Object;
134
135             switch (getQualifiedClassName(arg)) {
136                 case 'Object':
137                     bracket = {start: '{', end: '}'};
138                 case 'Array':
139                     bracket ||= {start: '[', end: ']'};
140                     _dumpString += bracket.start + '\n';
141                     recursion(arg, indent + INDENT);
142                     _dumpString += (indent +bracket.end);
143                     break;
144                 default:
145                     _dumpString += format(arg, indent, true);
146             }
147         }
148            
149         /**
150          * 再帰で何度もこいつが呼び出される。
151          *
152          * @param arg 解析したい要素(引数のうちの1つ)
153          * @param indent 表示する際の空白
154          * @private
155          */
156         private static function recursion(arg:*, indent:String):void {
157             for (var index:String in arg) {
158                 var tmp:* = arg[index];
159                 var className:String = getQualifiedClassName(tmp);
160                 var bracket:Object;
161
162                 switch(className) {
163                     case 'Object':
164                         bracket = {start: '{', end: '}'};
165                     case 'Array':
166                         bracket ||= {start: '[', end: ']'};
167                         var str:String = (getQualifiedClassName(arg) == 'Object')
168                             ? '\'' + index + '\' => ' : '';
169                         var indent_str:String = str.replace(/./g, ' ');
170
171                         _dumpString += (indent + str + bracket.start + "\n");
172                         recursion(tmp, indent + indent_str + INDENT);
173                         _dumpString += (indent + indent_str + bracket.end + ",");
174                         break;
175                     default:
176                         _dumpString += format(tmp, indent, false, arg, index);
177                 }
178                 _dumpString += "\n";
179             }
180         }
181
182         /**
183          * 表示するフォーマットを整形している。
184          *
185          * @param target 表示対象のObject
186          * @param indent 表示する際の空白
187          * @param braket ,を表示するかしないか
188          * @param parent 一階層上のObject
189          * @param index Objectのkey
190          * @return フォーマットに整形された文字列
191          * @private
192          */
193         private static function format(target:Object, indent:String, bracket:Boolean, parent:* = null, index:String = null):String {
194             var className:String = getQualifiedClassName(target);
195             var str:String = "";
196
197             if (getQualifiedClassName(parent) == 'Object')
198                 return indent +  "\'" + index + "\'" + " => " + target + (bracket ? '' : ',');
199
200             switch (className) {
201                 case 'String':
202                     return (bracket)
203                         ? "\'" + target + "\'"
204                         : indent + "\'" + target + "\',";
205
206                 case 'Array':
207                 case 'int':
208                 case 'uint':
209                 case 'Number':
210                 case 'Boolean':
211                     return (bracket)
212                         ? target.toString()
213                         : indent + target.toString() + ",";
214                 default:
215                     return 'don\'t analyze';
216             }
217         }
218     }
219 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。