OSDN Git Service

Fix the bug of X.NodeAnime.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 07_XString.js
1 /*\r
2 http://shimax.cocolog-nifty.com/search/2006/09/post_b296.html\r
3 ここで、「String.fromCharCode(13,10)」というのは、「\r\n」のことであり、Windowsの改行コードです。もちろん、「\r\n」でも良いのですが、半角円マークが出現すると、LinuxのブラウザKonquerorで正しく動作しないことがあるため、半角円マークを使わないようにしています(参照:Konquerorとエスケープ文字(JavaScript謎のエラーを解く))。\r
4 */\r
5 \r
6 // ------------------------------------------------------------------------- //\r
7 // ------------ local variables -------------------------------------------- //\r
8 // ------------------------------------------------------------------------- //\r
9 var X_String_CRLF = String.fromCharCode( 13 ) + String.fromCharCode( 10 ), // String.fromCharCode( 13, 10 )\r
10         X_String_CHAR_REFS = {"¡":161,"¢":162,"£":163,"¤":164,"¥":165,"¦":166,"§":167,"¨":168,"©":169,\r
11 "ª":170,"«":171,\r
12 "¬":172,"­":173,"®":174,"¯":175,"°":176,"±":177,"²":178,"³":179,"´":180,"µ":181,"¶":182,\r
13 "·":183,"¸":184,"¹":185,"º":186,"»":187,"¼":188,"½":189,"¾":190,"¿":191,"À":192,\r
14 "Á":193,"Â":194,"Ã":195,"Ä":196,"Å":197,"Æ":198,"Ç":199,"È":200,"É":201,"Ê":202,\r
15 "Ë":203,"Ì":204,"Í":205,"Î":206,"Ï":207,"Ð":208,"Ñ":209,"Ò":210,"Ó":211,"Ô":212,\r
16 "Õ":213,"Ö":214,"×":215,"Ø":216,"Ù":217,"Ú":218,"Û":219,"Ü":220,"Ý":221,"Þ":222,\r
17 "ß":223,"à":224,"á":225,"â":226,"ã":227,"ä":228,"å":229,"æ":230,"ç":231,"è":232,\r
18 "é":233,"ê":234,"ë":235,"ì":236,"í":237,"î":238,"ï":239,"ð":240,"ñ":241,"ò":242,\r
19 "ó":243,"ô":244,"õ":245,"ö":246,"÷":247,"ø":248,"ù":249,"ú":250,"û":251,"ü":252,\r
20 "ý":253,"þ":254,"ÿ":255,"Œ":338,"œ":339,"Š":352,"š":353,"Ÿ":376,"ˆ":710,"˜":732,"ƒ":402,\r
21 "Α":913,"Β":914,"Γ":915,"Δ":916,"Ε":917,"Ζ":918,"Η":919,"Θ":920,"Ι":921,"Κ":922,"Λ":923,\r
22 "Μ":924,"Ν":925,"Ξ":926,"Ο":927,"Π":928,"Ρ":929,"Σ":931,"Τ":932,"Υ":933,"Φ":934,"Χ":935,"Ψ":936,\r
23 "Ω":937,"α":945,"β":946,"γ":947,"δ":948,"ε":949,"ζ":950,"η":951,"θ":952,"ι":953,"κ":954,\r
24 "λ":955,"μ":956,"ν":957,"ξ":958,"ο":959,"π":960,"ρ":961,"ς":962,"σ":963,"τ":964,"υ":965,"φ":966,\r
25 "χ":967,"ψ":968,"ω":969,"ϑ":977,"ϒ":978,"ϖ":982," ":8194," ":8195," ":8201,"‌":8204,"‍":8205,\r
26 "‎":8206,"‏":8207,"–":8211,"—":8212,"‘":8216,"’":8217,"‚":8218,"“":8220,"”":8221,"„":8222,\r
27 "†":8224,"‡":8225,"•":8226,"…":8230,"‰":8240,"′":8242,"″":8243,"‹":8249,"›":8250,"‾":8254,\r
28 "⁄":8260,"€":8364,"ℑ":8465,"&ewierp;":8472,"ℜ":8476,"™":8482,"ℵ":8501,"←":8592,"↑":8593,"→":8594,\r
29 "↓":8595,"↔":8596,"↵":8629,"⇐":8656,"⇑":8657,"⇒":8658,"⇓":8659,"⇔":8660,"∀":8704,"∂":8706,\r
30 "∃":8707,"∅":8709,"∇":8711,"∈":8712,"∉":8713,"∋":8715,"∏":8719,"∑":8721,"−":8722,"∗":8727,\r
31 "√":8730,"∝":8733,"∞":8734,"∠":8736,"∧":8743,"∨":8744,"∩":8745,"∪":8746,"∫":8747,"∴":8756,"∼":8764,\r
32 "≅":8773,"≈":8776,"≠":8800,"≡":8801,"≤":8804,"≥":8805,\r
33 "⊂":8834,"⊃":8835,"⊄":8836,"⊆":8838,"⊇":8839,"⊕":8853,"⊗":8855,"⊥":8869,"⋅":8901,\r
34 "⌈":8968,"⌉":8969,"⌊":8970,"⌋":8971,"⟨":9001,"⟩":9002,"◊":9674,"♠":9824,"♣":9827,\r
35 "♥":9829,"♦":9830\r
36 };\r
37 \r
38 // ------------------------------------------------------------------------- //\r
39 // --- interface ----------------------------------------------------------- //\r
40 // ------------------------------------------------------------------------- //\r
41 \r
42 /**\r
43  * 文字列に関する関数を集めたものです。\r
44  * @namespace X.String\r
45  * @alias X.String\r
46  */\r
47 X[ 'String' ] = {\r
48         \r
49         'parse'             : X_String_parse,\r
50         \r
51         'cleanupWhiteSpace' : X_String_cleanupWhiteSpace,\r
52         \r
53         'whiteSpaceToTag'   : X_String_whiteSpaceToTag,\r
54         \r
55         'chrReferanceTo'    : X_String_chrReferanceTo,\r
56         \r
57         'toChrReferance'    : X_String_toChrReferance,\r
58         \r
59         'isNumberString'    : X_String_isNumberString,\r
60         \r
61         'serialize'         : X_String_serialize\r
62 };\r
63 \r
64 // ------------------------------------------------------------------------- //\r
65 // --- implements ---------------------------------------------------------- //\r
66 // ------------------------------------------------------------------------- //\r
67 /**\r
68  * 文字列を数値、NaN,Infinity,-Infinity,bool値、null,undefinedに変換します。1e3等には未対応です。\r
69  * @alias X.String.parse\r
70  * @param {string}\r
71  * @return {*}\r
72  */\r
73 function X_String_parse( v ){\r
74         var _v;\r
75         \r
76         if( X_Type_isString( v ) ){\r
77                 switch( v ){\r
78                         case ''          : return v;\r
79                         //case '{}'        : return {};\r
80                         //case '[]'        : return [];\r
81                         case 'NaN'       : return NaN;\r
82                         case 'null'      : return null;\r
83                         case 'true'      : return true;\r
84                         case 'false'     : return false;\r
85                         case 'Infinity'  : return  1 / 0;//Number.POSITIVE_INFINITY;\r
86                         case '-Infinity' : return -1 / 0;//Number.NEGATIVE_INFINITY;\r
87                         //case 'void(0)'   :\r
88                         //case 'void 0'    :\r
89                         case 'undefined' : return;\r
90                 };\r
91                 _v = v.split( ' ' ).join( '' );\r
92                 if( X_String_isNumberString( _v ) ) return _v - 0;\r
93         };\r
94         return v;\r
95 };\r
96 \r
97 /**\r
98  * <p>空白文字を半角スペースに変換します。\n\r,\t,\r,\n,\f,\b\r
99  * <p>2つ以上の連続する半角スペースを一つの半角スペースにします。\r
100  * <p>undefined, null が与えられた場合は '' を返します。\r
101  * <p>数値,Object が与えられた場合は toString します。\r
102  * @alias X.String.cleanupWhiteSpace\r
103  * @param {string}\r
104  * @return {string}\r
105  */\r
106 function X_String_cleanupWhiteSpace( text ){\r
107         var _ = ' ', __ = '  '; //, CRLF = X_String_CRLF;\r
108         \r
109         if( text == null || text === '' ) return '';\r
110         \r
111         //text.indexOf( CRLF )   !== -1 && ( text = text.split( CRLF ).join( _ ) );\r
112         /*text.indexOf( '\n\r' ) !== -1 && ( text = text.split( '\n\r' ).join( _ ) );\r
113         text.indexOf( '\t' )   !== -1 && ( text = text.split( '\t' ).join( _ ) );\r
114         text.indexOf( '\r' )   !== -1 && ( text = text.split( '\r' ).join( _ ) );\r
115         text.indexOf( '\n' )   !== -1 && ( text = text.split( '\n' ).join( _ ) );\r
116         text.indexOf( '\f' )   !== -1 && ( text = text.split( '\f' ).join( _ ) );\r
117         text.indexOf( '\b' )   !== -1 && ( text = text.split( '\b' ).join( _ ) ); */\r
118         \r
119         text = text.toString()\r
120                         .split( X_String_CRLF ).join( _ )\r
121                         .split( '\r' ).join( _ )\r
122                         .split( '\n' ).join( _ )\r
123                         .split( '\t' ).join( _ )\r
124                         .split( '\f' ).join( _ )\r
125                         .split( '\b' ).join( _ );\r
126 \r
127         while( true ){\r
128                 text = text.split( __ );\r
129                 if( text.length < 2 ) return text[ 0 ];\r
130                 text = text.join( _ );\r
131         };\r
132 };\r
133 \r
134 /**\r
135  * 空白文字列を &lt;br&gt; に変換します。タブを &amp;nbsp; 4つに変換します。\r
136  * <p>undefined, null が与えられた場合は '' を返します。\r
137  * <p>数値,Object が与えられた場合は toString します。\r
138  * @alias X.String.whiteSpaceToTag\r
139  * @param {string}\r
140  * @return {string} html文字列\r
141  */\r
142 function X_String_whiteSpaceToTag( text ){\r
143     if( text == null || text === '' ) return '';\r
144     return text.toString()\r
145         //.split( '\r\n\r\n' ).join( '<br>' )\r
146         //.split( '\n\r\n\r' ).join( '<br>' )\r
147         //.split( '\r\n' ).join( '<br>' )\r
148         .split( X_String_CRLF ).join( '<br>' )\r
149         .split( '\r' ).join( '<br>' )\r
150         .split( '\n' ).join( '<br>' )\r
151         .split( '\t' ).join( '&nbsp;&nbsp;&nbsp;&nbsp;' )\r
152         .split( '\f' ).join( '' )\r
153         .split( '\b' ).join( '' );\r
154 };\r
155 \r
156 /**\r
157  * 一部の文字実体参照をデコードします。&quot;, &amp;, &lt;, &gt;, &nbsp;\r
158  * <p>undefined, null が与えられた場合は '' を返します。\r
159  * <p>数値,Object が与えられた場合は toString します。\r
160  * @alias X.String.chrReferanceTo\r
161  * @param {string}\r
162  * @return {string} html文字列\r
163  */\r
164 function X_String_chrReferanceTo( str ){\r
165         var refs, i, l, ref, k;\r
166         \r
167     if( str == null || str === '' ) return '';\r
168     if( str.indexOf( '&' ) === -1 ) return str;\r
169     \r
170     str = str.toString()\r
171         .split( '&quot;' ).join( '"' )\r
172         .split( '&apos;' ).join( "'" )\r
173         .split( '&lt;'   ).join( '<' )\r
174         .split( '&gt;'   ).join( '>' )\r
175         .split( '&nbsp;' ).join( ' ' );\r
176     \r
177     if( str.indexOf( '&' ) === -1 ) return str;\r
178     \r
179     refs = X_String_CHAR_REFS;\r
180     for( k in refs ){\r
181         str = str.split( k ).join( String.fromCharCode( refs[ k ] ) );\r
182     };\r
183   \r
184     return str.split( '&amp;'  ).join( '&' ); // last!\r
185 };\r
186 \r
187 /**\r
188  * htmlタグで使われる文字を文字実体参照に変換します。&quot;, &amp;, &lt;, &gt;, &nbsp;\r
189  * <p>undefined, null が与えられた場合は '' を返します。\r
190  * <p>数値,Object が与えられた場合は toString します。\r
191  * @alias X.String.chrReferanceTo\r
192  * @param {string}\r
193  * @return {string}\r
194  */\r
195 function X_String_toChrReferance( str ){\r
196     if( str == null || str === '' ) return '';\r
197     return str.toString()\r
198         .split( '&' ).join( '&amp;' ) // first!\r
199         .split( '"' ).join( '&quot;' )\r
200         .split( "'" ).join( '&apos;' )\r
201         .split( '<' ).join( '&lt;' )\r
202         .split( '>' ).join( '&gt;' )\r
203         .split( ' ' ).join( '&nbsp;' );\r
204 };\r
205 \r
206 /**\r
207  * 文字列化した数値か?調べます。\r
208  * @alias X.String.isNumberString\r
209  * @param {string}\r
210  * @return {boolean}\r
211  */\r
212 function X_String_isNumberString( v ){\r
213         var n = v - 0;\r
214         return '' + n === v || '' + n === '0' + v;\r
215 };\r
216 \r
217 /**\r
218  * postdata のために object を文字列に変換します。\r
219  * https://github.com/jquery/jquery/blob/master/src/serialize.js\r
220  * @alias X.String.serialize\r
221  * @param {object}\r
222  * @param {boolean} [traditional=]\r
223  * @return {string}\r
224  */\r
225 function X_String_serialize( a, traditional ) {\r
226         var prefix,\r
227                 list = [];\r
228 \r
229         // If an array was passed in, assume that it is an array of form elements.\r
230         //if ( X_Type_isArray( a ) && false ) {\r
231                 // Serialize the form elements\r
232                 //jQuery.each( a, function() {\r
233                 //      X_String_serialize_addParam( list, this.name, this.value );\r
234                 //});\r
235 \r
236         //} else {\r
237                 // If traditional, encode the 'old' way (the way 1.3.2 or older\r
238                 // did it), otherwise encode params recursively.\r
239                 for ( prefix in a ) {\r
240                         X_String_serialize_buildParams( list, prefix, a[ prefix ], !!traditional );\r
241                 }\r
242         //}\r
243 \r
244         // Return the resulting serialization\r
245         return list.join( '&' ).split( '%20' ).join( '+' );\r
246 };\r
247 \r
248 function X_String_serialize_addParam( list, key, value ){\r
249         // If value is a function, invoke it and return its value\r
250         value = X_Type_isFunction( value ) ? value() : ( value == null ? '' : value );\r
251         list[ list.length ] = encodeURIComponent( key ) + '=' + encodeURIComponent( value );\r
252 };\r
253 \r
254 function X_String_serialize_buildParams( list, prefix, obj, traditional ) {\r
255         var name, i, l, v;\r
256 \r
257         if ( X_Type_isArray( obj ) ) {\r
258                 // Serialize array item.\r
259                 for( i = 0, l = obj.length; i < l; ++i ){\r
260                         v = obj[ i ];\r
261                         if ( traditional || prefix === '[]' ) {\r
262                                 // Treat each array item as a scalar.\r
263                                 X_String_serialize_addParam( list, prefix, v );\r
264 \r
265                         } else {\r
266                                 // Item is non-scalar (array or object), encode its numeric index.\r
267                                 X_String_serialize_buildParams(\r
268                                         list,\r
269                                         prefix + '[' + ( X_Type_isObject( v ) ? i : '' ) + ']',\r
270                                         v,\r
271                                         traditional\r
272                                 );\r
273                         };              \r
274                 };\r
275 \r
276         } else\r
277         if ( !traditional && X_Type_isObject( obj ) ) {\r
278                 // Serialize object item.\r
279                 for ( name in obj ) {\r
280                         X_String_serialize_buildParams( list, prefix + '[' + name + ']', obj[ name ], traditional );\r
281                 };\r
282 \r
283         } else {\r
284                 // Serialize scalar item.\r
285                 X_String_serialize_addParam( list, prefix, obj );\r
286         };\r
287 };\r
288 \r