OSDN Git Service

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