OSDN Git Service

Version 0.6.146, fix XHR.send, add RegExp free encodeURIComponent, fix X.Object.deepCopy.
[pettanr/clientJs.git] / 0.6.x / js / 01_core / 00_builtin.js
index b5cb1cb..8af9798 100644 (file)
@@ -140,79 +140,94 @@ Array.prototype.indexOf || (Array.prototype.indexOf = function( searchElement, f
  */\r
 \r
 /*\r
- * Window\r
+ * original:\r
  * by https://web.archive.org/web/20100413085309/http://nurucom-archives.hp.infoseek.co.jp/digital/trans-uri.html\r
  */\r
+var _builtin_skipEncodeURI = (function(){\r
+       var encodeURIComponentTarget = '!\'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~',\r
+               encodeURITarget = '#$&+,-/:;=?@',\r
+               obj = {}, i;\r
+       for( i = encodeURIComponentTarget.length; i; ){\r
+               obj[ encodeURIComponentTarget.charCodeAt( --i ) ] = 2;\r
+       };\r
+       for( i = encodeURITarget.length; i; ){\r
+               obj[ encodeURITarget.charCodeAt( --i ) ] = 1;\r
+       };\r
+       return obj;\r
+})();\r
 \r
-/*\r
- * //\r
-// TransURI (UTF-8): transURI.js (Ver.041211)\r
-//\r
-// Copyright (C) http://nurucom-archives.hp.infoseek.co.jp/digital/\r
-//\r
+// /[^!#$&-;=?-Z_a-z~]/g\r
+window.encodeURI || (window.encodeURI = function( x ){ return _builtin_encodeURI( x, 0 ); });\r
+// /[^!'-*.0-9A-Z_a-z~-]/g\r
+window.encodeURIComponent || (window.encodeURIComponent = function( x ){ return _builtin_encodeURI( x, 1 ); });\r
 \r
-EncodeURI=function(str){\r
-       return str.replace(/[^!#$&-;=?-Z_a-z~]/g,function(s){\r
-               var c=s.charCodeAt(0);\r
-               return (c<16?"%0"+c.toString(16):c<128?"%"+c.toString(16):c<2048?"%"+(c>>6|192).toString(16)+"%"+(c&63|128).toString(16):"%"+(c>>12|224).toString(16)+"%"+(c>>6&63|128).toString(16)+"%"+(c&63|128).toString(16)).toUpperCase()\r
-       })\r
+function _builtin_encodeURI( x, kind ){\r
+       var result = [],\r
+               skip   = _builtin_skipEncodeURI,\r
+               p      = '%',\r
+               i = 0, l, chr, c;\r
+       \r
+       x += '';\r
+       \r
+       for( l = x.length; i < l; ++i ){\r
+               if( !( kind < skip[ c = x.charCodeAt( i ) ] ) ){\r
+                       chr = (\r
+                               c < 16 ? '%0' + c.toString(16) :\r
+                               c < 128 ? p + c.toString(16) :\r
+                               c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
+                               p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
+                       ).toUpperCase();\r
+               } else {\r
+                       chr = x.charAt( i );\r
+               };\r
+               result[ i ] = chr;\r
+       };\r
+       \r
+       return result.join( '' );\r
 };\r
 \r
-EncodeURIComponent=function(str){\r
-       return str.replace(/[^!'-*.0-9A-Z_a-z~-]/g,function(s){\r
-               var c=s.charCodeAt(0);\r
-               return (c<16?'%0'+c.toString(16):c<128?'%'+c.toString(16):c<2048?'%'+(c>>6|192).toString(16)+'%'+(c&63|128).toString(16):'%'+(c>>12|224).toString(16)+'%'+(c>>6&63|128).toString(16)+'%'+(c&63|128).toString(16)).toUpperCase()\r
-       })\r
-};\r
 \r
-DecodeURI=function(str){\r
-       return str.replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig,function(s){\r
-               var c=parseInt(s.substring(1),16);\r
-               return String.fromCharCode(c<128?c:c<224?(c&31)<<6|parseInt(s.substring(4),16)&63:((c&15)<<6|parseInt(s.substring(4),16)&63)<<6|parseInt(s.substring(7),16)&63)\r
-       })\r
+function _builtin_decodeURI( x ){\r
+       var result    = [],\r
+               toInt     = parseInt,\r
+               toChrCode = String.fromCharCode,\r
+               n = -1, i = 0, l, chr, decode, code, memory;\r
+       \r
+       x += '';\r
+       \r
+       for( l = x.length; i < l; ++i ){\r
+               if( decode ){\r
+                       code = toInt( x.substr( i, 2 ), 16 );\r
+                       ++i;                                    \r
+                       if( 127 < code ){\r
+                               if( 223 < code ){\r
+                                       memory = ( code & 15 ) << 12;\r
+                                       code = toInt( x.substr( i + 2, 2 ), 16 ) & 63; // 00%00%00\r
+                                       i += 3;\r
+                                       memory += code << 6;                                                    \r
+                               } else {\r
+                                       memory = ( code & 63 ) << 6;\r
+                               };\r
+                               code = toInt( x.substr( i + 2, 2 ), 16 ) & 63;\r
+                               i += 3;\r
+                               code += memory;\r
+                       };\r
+                       // if( code !== code ) error\r
+                       //console.log( code );\r
+                       result[ ++n ] = toChrCode( code );\r
+                       decode = false;\r
+               } else {\r
+                       chr = x.charAt( i );\r
+                       if( !( decode = chr === '%' ) ){\r
+                               result[ ++n ] = chr;                    \r
+                       };\r
+               };\r
+       };\r
+       return result.join( '' );\r
 };\r
- */\r
-\r
-/* 正規表現が使われているため、まだ投入しない itozyun*/\r
-window.encodeURI || (window.encodeURI = function (x) {\r
-       return ("" + x).replace(/[^!#$&-;=?-Z_a-z~]/g, function (s) {\r
-               var c = s.charCodeAt(0), p = "%";\r
-               return (\r
-                       c < 16 ? "%0" + c.toString(16) :\r
-                       c < 128 ? p + c.toString(16) :\r
-                       c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
-                       p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
-               ).toUpperCase();\r
-       });\r
-});\r
-\r
-window.encodeURIComponent || (window.encodeURIComponent = function (x) {\r
-       return ("" + x).replace(/[^!'-*.0-9A-Z_a-z~-]/g, function (s) {\r
-               var c = s.charCodeAt(0), p = "%";\r
-               return (\r
-                       c < 16 ? "%0" + c.toString(16) :\r
-                       c < 128 ? p + c.toString(16) :\r
-                       c < 2048 ? p + (c >> 6 | 192).toString(16) + p + (c & 63 | 128).toString(16) :\r
-                       p + (c >> 12 | 224).toString(16) + p + (c >> 6 & 63 | 128).toString(16) + p + (c & 63 | 128).toString(16)\r
-               ).toUpperCase();\r
-       });\r
-});\r
-\r
-// 手抜き\r
-window.decodeURI || (window.decodeURI = function (x) {\r
-       return ("" + x).replace(/%(E(0%[AB]|[1-CEF]%[89AB]|D%[89])[0-9A-F]|C[2-9A-F]|D[0-9A-F])%[89AB][0-9A-F]|%[0-7][0-9A-F]/ig, function (s) {\r
-               var c = parseInt(s.substring(1), 16);\r
-               return String.fromCharCode(\r
-                       c < 128 ? c :\r
-                       c < 224 ? (c & 31) << 6 | parseInt(s.substring(4), 16) & 63 :\r
-                       ((c & 15) << 6 | parseInt(s.substring(4), 16) & 63) << 6 | parseInt(s.substring(7), 16) & 63\r
-               );\r
-       });\r
-});\r
-\r
-\r
 \r
-//window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI);\r
+window.decodeURI || (window.decodeURI = _builtin_decodeURI);\r
+window.decodeURIComponent || (window.decodeURIComponent = window.decodeURI);\r
 \r
 \r
 /*\r