Skip to content

Commit 75a27b6

Browse files
committed
base64.js downgraded from 2.6 to 1.7
because otherwise it would have broken compatibility with data files.
1 parent 889eba4 commit 75a27b6

1 file changed

Lines changed: 206 additions & 108 deletions

File tree

js/base64.js

Lines changed: 206 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* $Id: base64.js,v 2.6 2012/08/24 05:23:18 dankogai Exp dankogai $
2+
* $Id: base64.js,v 1.7 2012/08/23 10:30:18 dankogai Exp dankogai $
33
*
44
* Licensed under the MIT license.
55
* http://www.opensource.org/licenses/mit-license.php
@@ -8,132 +8,230 @@
88
* http://en.wikipedia.org/wiki/Base64
99
*/
1010

11-
(function(global) {
12-
'use strict';
13-
// if node.js, we use Buffer
14-
var buffer;
15-
if (typeof module !== 'undefined' && module.exports) {
16-
buffer = require('buffer').Buffer;
17-
}
18-
// constants
11+
(function(global){
12+
1913
var b64chars
2014
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
21-
var b64tab = function(bin) {
15+
16+
var b64charcodes = function(){
17+
var a = [];
18+
var codeA = 'A'.charCodeAt(0);
19+
var codea = 'a'.charCodeAt(0);
20+
var code0 = '0'.charCodeAt(0);
21+
for (var i = 0; i < 26; i ++) a.push(codeA + i);
22+
for (var i = 0; i < 26; i ++) a.push(codea + i);
23+
for (var i = 0; i < 10; i ++) a.push(code0 + i);
24+
a.push('+'.charCodeAt(0));
25+
a.push('/'.charCodeAt(0));
26+
return a;
27+
}();
28+
29+
var b64tab = function(bin){
2230
var t = {};
2331
for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i;
2432
return t;
2533
}(b64chars);
26-
var fromCharCode = String.fromCharCode;
27-
// encoder stuff
28-
var cb_utob = function(c) {
29-
var cc = c.charCodeAt(0);
30-
return cc < 0x80 ? c
31-
: cc < 0x800 ? fromCharCode(0xc0 | (cc >>> 6))
32-
+ fromCharCode(0x80 | (cc & 0x3f))
33-
: fromCharCode(0xe0 | ((cc >>> 12) & 0x0f))
34-
+ fromCharCode(0x80 | ((cc >>> 6) & 0x3f))
35-
+ fromCharCode(0x80 | ( cc & 0x3f));
34+
35+
var stringToArray = function(s){
36+
var a = [];
37+
for (var i = 0, l = s.length; i < l; i ++) a[i] = s.charCodeAt(i);
38+
return a;
3639
};
37-
var utob = function(u) {
38-
return u.replace(/[^\x00-\x7F]/g, cb_utob);
40+
41+
var convertUTF8ArrayToBase64 = function(bin){
42+
var padlen = 0;
43+
while (bin.length % 3){
44+
bin.push(0);
45+
padlen++;
46+
};
47+
var b64 = [];
48+
for (var i = 0, l = bin.length; i < l; i += 3){
49+
var c0 = bin[i], c1 = bin[i+1], c2 = bin[i+2];
50+
if (c0 >= 256 || c1 >= 256 || c2 >= 256)
51+
throw 'unsupported character found';
52+
var n = (c0 << 16) | (c1 << 8) | c2;
53+
b64.push(
54+
b64charcodes[ n >>> 18],
55+
b64charcodes[(n >>> 12) & 63],
56+
b64charcodes[(n >>> 6) & 63],
57+
b64charcodes[ n & 63]
58+
);
59+
}
60+
while (padlen--) b64[b64.length - padlen - 1] = '='.charCodeAt(0);
61+
return chunkStringFromCharCodeApply(b64);
3962
};
40-
var cb_encode = function(ccc) {
41-
var padlen = [0, 2, 1][ccc.length % 3],
42-
ord = ccc.charCodeAt(0) << 16
43-
| ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8)
44-
| ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)),
45-
chars = [
46-
b64chars.charAt( ord >>> 18),
47-
b64chars.charAt((ord >>> 12) & 63),
48-
padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63),
49-
padlen >= 1 ? '=' : b64chars.charAt(ord & 63)
50-
];
51-
return chars.join('');
63+
64+
var convertBase64ToUTF8Array = function(b64){
65+
b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, '');
66+
var bin = [];
67+
var padlen = b64.length % 4;
68+
for (var i = 0, l = b64.length; i < l; i += 4){
69+
var n = ((b64tab[b64.charAt(i )] || 0) << 18)
70+
| ((b64tab[b64.charAt(i+1)] || 0) << 12)
71+
| ((b64tab[b64.charAt(i+2)] || 0) << 6)
72+
| ((b64tab[b64.charAt(i+3)] || 0));
73+
bin.push(
74+
( n >> 16 ),
75+
( (n >> 8) & 0xff ),
76+
( n & 0xff )
77+
);
78+
}
79+
bin.length -= [0,0,2,1][padlen];
80+
return bin;
5281
};
53-
var btoa = global.btoa || function(b) {
54-
return b.replace(/[\s\S]{1,3}/g, cb_encode);
82+
83+
var convertUTF16ArrayToUTF8Array = function(uni){
84+
var bin = [];
85+
for (var i = 0, l = uni.length; i < l; i++){
86+
var n = uni[i];
87+
if (n < 0x80)
88+
bin.push(n);
89+
else if (n < 0x800)
90+
bin.push(
91+
0xc0 | (n >>> 6),
92+
0x80 | (n & 0x3f));
93+
else
94+
bin.push(
95+
0xe0 | ((n >>> 12) & 0x0f),
96+
0x80 | ((n >>> 6) & 0x3f),
97+
0x80 | (n & 0x3f));
98+
}
99+
return bin;
55100
};
56-
var _encode = buffer
57-
? function (u) { return (new buffer(u)).toString('base64') }
58-
: function (u) { return btoa(utob(u)) }
59-
;
60-
var encode = function(u, urisafe) {
61-
return !urisafe
62-
? _encode(u)
63-
: _encode(u).replace(/[+\/]/g, function(m0) {
64-
return m0 == '+' ? '-' : '_';
65-
});
101+
102+
var convertUTF8ArrayToUTF16Array = function(bin){
103+
var uni = [];
104+
for (var i = 0, l = bin.length; i < l; i++){
105+
var c0 = bin[i];
106+
if (c0 < 0x80){
107+
uni.push(c0);
108+
}else{
109+
var c1 = bin[++i];
110+
if (c0 < 0xe0){
111+
uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f));
112+
}else{
113+
var c2 = bin[++i];
114+
uni.push(
115+
((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f)
116+
);
117+
}
118+
}
119+
}
120+
return uni;
66121
};
67-
var encodeURI = function(u) { return encode(u, true) };
68-
// decoder stuff
69-
var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}/g;
70-
var cb_btou = function(ccc) {
71-
return fromCharCode(
72-
ccc.length < 3 ? ((0x1f & ccc.charCodeAt(0)) << 6)
73-
| (0x3f & ccc.charCodeAt(1))
74-
: ((0x0f & ccc.charCodeAt(0)) << 12)
75-
| ((0x3f & ccc.charCodeAt(1)) << 6)
76-
| (0x3f & ccc.charCodeAt(2))
77-
);
122+
123+
var convertUTF8StringToBase64 = function(bin){
124+
return convertUTF8ArrayToBase64(stringToArray(bin));
78125
};
79-
var btou = function(b) {
80-
return b.replace(re_btou, cb_btou);
126+
127+
var convertBase64ToUTF8String = function(b64){
128+
return chunkStringFromCharCodeApply(convertBase64ToUTF8Array(b64));
81129
};
82-
var cb_decode = function(cccc) {
83-
var len = cccc.length,
84-
padlen = len % 4,
85-
n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0)
86-
| (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0)
87-
| (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0)
88-
| (len > 3 ? b64tab[cccc.charAt(3)] : 0),
89-
chars = [
90-
fromCharCode( n >>> 16),
91-
fromCharCode((n >>> 8) & 0xff),
92-
fromCharCode( n & 0xff)
93-
];
94-
chars.length -= [0, 0, 2, 1][padlen];
95-
return chars.join('');
130+
131+
var convertUTF8StringToUTF16Array = function(bin){
132+
return convertUTF8ArrayToUTF16Array(stringToArray(bin));
96133
};
97-
var atob = global.atob || function(a){
98-
return a.replace(/[\s\S]{1,4}/g, cb_decode);
134+
135+
var convertUTF8ArrayToUTF16String = function(bin){
136+
return chunkStringFromCharCodeApply(convertUTF8ArrayToUTF16Array(bin));
99137
};
100-
var _decode = buffer
101-
? function(a) { return (new buffer(a, 'base64')).toString() }
102-
: function(a) { return btou(atob(a)) }
103-
;
104-
var decode = function(a){
105-
return _decode(
106-
a.replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' })
107-
.replace(/[^A-Za-z0-9\+\/]/g, '')
138+
139+
var convertUTF8StringToUTF16String = function(bin){
140+
return chunkStringFromCharCodeApply(
141+
convertUTF8ArrayToUTF16Array(stringToArray(bin))
108142
);
109143
};
110-
// export Base64
111-
global.Base64 = {
112-
atob: atob,
113-
btoa: btoa,
114-
fromBase64: decode,
115-
toBase64: encode,
116-
utob: utob,
117-
encode: encode,
118-
encodeURI: encodeURI,
119-
btou: btou,
120-
decode: decode
144+
145+
var convertUTF16StringToUTF8Array = function(uni){
146+
return convertUTF16ArrayToUTF8Array(stringToArray(uni));
121147
};
122-
// if ES5 is available, make Base64.extendString() available
123-
if (typeof Object.defineProperty === 'function') {
124-
var noEnum = function(v){
125-
return {value:v,enumerable:false,writable:true,configurable:true};
148+
149+
var convertUTF16ArrayToUTF8String = function(uni){
150+
return chunkStringFromCharCodeApply(convertUTF16ArrayToUTF8Array(uni));
151+
};
152+
153+
var convertUTF16StringToUTF8String = function(uni){
154+
return chunkStringFromCharCodeApply(
155+
convertUTF16ArrayToUTF8Array(stringToArray(uni))
156+
);
157+
};
158+
159+
/*
160+
* String.fromCharCode.apply will only handle arrays as big as 65536,
161+
* after that it'll return a truncated string with no warning.
162+
*/
163+
var chunkStringFromCharCodeApply = function(arr){
164+
var strs = [], i;
165+
for (i = 0; i < arr.length; i += 65536){
166+
strs.push(String.fromCharCode.apply(String, arr.slice(i, i+65536)));
167+
}
168+
return strs.join('');
169+
};
170+
171+
if (global.btoa){
172+
var btoa = global.btoa;
173+
var convertUTF16StringToBase64 = function (uni){
174+
return btoa(convertUTF16StringToUTF8String(uni));
126175
};
127-
global.Base64.extendString = function () {
128-
Object.defineProperty(
129-
String.prototype, 'fromBase64', noEnum(function () {
130-
return decode(this)
131-
}));
132-
Object.defineProperty(
133-
String.prototype, 'toBase64', noEnum(function (urisafe) {
134-
return encode(this, urisafe)
135-
}));
176+
}
177+
else {
178+
var btoa = convertUTF8StringToBase64;
179+
var convertUTF16StringToBase64 = function (uni){
180+
return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni));
136181
};
137182
}
138-
// that's it!
183+
184+
if (global.atob){
185+
var atob = global.atob;
186+
var convertBase64ToUTF16String = function (b64){
187+
return convertUTF8StringToUTF16String(atob(b64));
188+
};
189+
}
190+
else {
191+
var atob = convertBase64ToUTF8String;
192+
var convertBase64ToUTF16String = function (b64){
193+
return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64));
194+
};
195+
}
196+
197+
global.Base64 = {
198+
convertUTF8ArrayToBase64:convertUTF8ArrayToBase64,
199+
convertByteArrayToBase64:convertUTF8ArrayToBase64,
200+
convertBase64ToUTF8Array:convertBase64ToUTF8Array,
201+
convertBase64ToByteArray:convertBase64ToUTF8Array,
202+
convertUTF16ArrayToUTF8Array:convertUTF16ArrayToUTF8Array,
203+
convertUTF16ArrayToByteArray:convertUTF16ArrayToUTF8Array,
204+
convertUTF8ArrayToUTF16Array:convertUTF8ArrayToUTF16Array,
205+
convertByteArrayToUTF16Array:convertUTF8ArrayToUTF16Array,
206+
convertUTF8StringToBase64:convertUTF8StringToBase64,
207+
convertBase64ToUTF8String:convertBase64ToUTF8String,
208+
convertUTF8StringToUTF16Array:convertUTF8StringToUTF16Array,
209+
convertUTF8ArrayToUTF16String:convertUTF8ArrayToUTF16String,
210+
convertByteArrayToUTF16String:convertUTF8ArrayToUTF16String,
211+
convertUTF8StringToUTF16String:convertUTF8StringToUTF16String,
212+
convertUTF16StringToUTF8Array:convertUTF16StringToUTF8Array,
213+
convertUTF16StringToByteArray:convertUTF16StringToUTF8Array,
214+
convertUTF16ArrayToUTF8String:convertUTF16ArrayToUTF8String,
215+
convertUTF16StringToUTF8String:convertUTF16StringToUTF8String,
216+
convertUTF16StringToBase64:convertUTF16StringToBase64,
217+
convertBase64ToUTF16String:convertBase64ToUTF16String,
218+
fromBase64:convertBase64ToUTF8String,
219+
toBase64:convertUTF8StringToBase64,
220+
atob:atob,
221+
btoa:btoa,
222+
utob:convertUTF16StringToUTF8String,
223+
btou:convertUTF8StringToUTF16String,
224+
encode:convertUTF16StringToBase64,
225+
encodeURI:function(u){
226+
return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0){
227+
return m0 == '+' ? '-' : '_';
228+
}).replace(/=+$/, '');
229+
},
230+
decode:function(a){
231+
return convertBase64ToUTF16String(a.replace(/[-_]/g, function(m0){
232+
return m0 == '-' ? '+' : '/';
233+
}));
234+
}
235+
};
236+
139237
})(this);

0 commit comments

Comments
 (0)