forked from sebsauvage/ZeroBin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
57e6274
commit 7e5c36e
Showing
1 changed file
with
116 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,128 +1,139 @@ | ||
/* | ||
* $Id: base64.js,v 1.2 2011/12/27 14:34:49 dankogai Exp dankogai $ | ||
* $Id: base64.js,v 2.6 2012/08/24 05:23:18 dankogai Exp dankogai $ | ||
* | ||
* Licensed under the MIT license. | ||
* http://www.opensource.org/licenses/mit-license.php | ||
* | ||
* References: | ||
* http://en.wikipedia.org/wiki/Base64 | ||
*/ | ||
|
||
(function(global){ | ||
|
||
if (global.Base64) return; | ||
|
||
var b64chars | ||
(function(global) { | ||
'use strict'; | ||
// if node.js, we use Buffer | ||
var buffer; | ||
if (typeof module !== 'undefined' && module.exports) { | ||
buffer = require('buffer').Buffer; | ||
} | ||
// constants | ||
var b64chars | ||
= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | ||
var b64tab = function(bin){ | ||
var b64tab = function(bin) { | ||
var t = {}; | ||
for (var i = 0, l = bin.length; i < l; i++) t[bin.charAt(i)] = i; | ||
return t; | ||
}(b64chars); | ||
|
||
var sub_toBase64 = function(m){ | ||
var n = (m.charCodeAt(0) << 16) | ||
| (m.charCodeAt(1) << 8) | ||
| (m.charCodeAt(2) ); | ||
return b64chars.charAt( n >>> 18) | ||
+ b64chars.charAt((n >>> 12) & 63) | ||
+ b64chars.charAt((n >>> 6) & 63) | ||
+ b64chars.charAt( n & 63); | ||
var fromCharCode = String.fromCharCode; | ||
// encoder stuff | ||
var cb_utob = function(c) { | ||
var cc = c.charCodeAt(0); | ||
return cc < 0x80 ? c | ||
: cc < 0x800 ? fromCharCode(0xc0 | (cc >>> 6)) | ||
+ fromCharCode(0x80 | (cc & 0x3f)) | ||
: fromCharCode(0xe0 | ((cc >>> 12) & 0x0f)) | ||
+ fromCharCode(0x80 | ((cc >>> 6) & 0x3f)) | ||
+ fromCharCode(0x80 | ( cc & 0x3f)); | ||
}; | ||
|
||
var toBase64 = function(bin){ | ||
if (bin.match(/[^\x00-\xFF]/)) throw 'unsupported character found' ; | ||
var padlen = 0; | ||
while(bin.length % 3) { | ||
bin += '\0'; | ||
padlen++; | ||
}; | ||
var b64 = bin.replace(/[\x00-\xFF]{3}/g, sub_toBase64); | ||
if (!padlen) return b64; | ||
b64 = b64.substr(0, b64.length - padlen); | ||
while(padlen--) b64 += '='; | ||
return b64; | ||
var utob = function(u) { | ||
return u.replace(/[^\x00-\x7F]/g, cb_utob); | ||
}; | ||
|
||
var btoa = global.btoa || toBase64; | ||
|
||
var sub_fromBase64 = function(m){ | ||
var n = (b64tab[ m.charAt(0) ] << 18) | ||
| (b64tab[ m.charAt(1) ] << 12) | ||
| (b64tab[ m.charAt(2) ] << 6) | ||
| (b64tab[ m.charAt(3) ]); | ||
return String.fromCharCode( n >> 16 ) | ||
+ String.fromCharCode( (n >> 8) & 0xff ) | ||
+ String.fromCharCode( n & 0xff ); | ||
var cb_encode = function(ccc) { | ||
var padlen = [0, 2, 1][ccc.length % 3], | ||
ord = ccc.charCodeAt(0) << 16 | ||
| ((ccc.length > 1 ? ccc.charCodeAt(1) : 0) << 8) | ||
| ((ccc.length > 2 ? ccc.charCodeAt(2) : 0)), | ||
chars = [ | ||
b64chars.charAt( ord >>> 18), | ||
b64chars.charAt((ord >>> 12) & 63), | ||
padlen >= 2 ? '=' : b64chars.charAt((ord >>> 6) & 63), | ||
padlen >= 1 ? '=' : b64chars.charAt(ord & 63) | ||
]; | ||
return chars.join(''); | ||
}; | ||
|
||
var fromBase64 = function(b64){ | ||
b64 = b64.replace(/[^A-Za-z0-9\+\/]/g, ''); | ||
var padlen = 0; | ||
while(b64.length % 4){ | ||
b64 += 'A'; | ||
padlen++; | ||
} | ||
var bin = b64.replace(/[A-Za-z0-9\+\/]{4}/g, sub_fromBase64); | ||
if (padlen >= 2) | ||
bin = bin.substring(0, bin.length - [0,0,2,1][padlen]); | ||
return bin; | ||
var btoa = global.btoa || function(b) { | ||
return b.replace(/[\s\S]{1,3}/g, cb_encode); | ||
}; | ||
|
||
var atob = global.atob || fromBase64; | ||
|
||
var re_char_nonascii = /[^\x00-\x7F]/g; | ||
|
||
var sub_char_nonascii = function(m){ | ||
var n = m.charCodeAt(0); | ||
return n < 0x800 ? String.fromCharCode(0xc0 | (n >>> 6)) | ||
+ String.fromCharCode(0x80 | (n & 0x3f)) | ||
: String.fromCharCode(0xe0 | ((n >>> 12) & 0x0f)) | ||
+ String.fromCharCode(0x80 | ((n >>> 6) & 0x3f)) | ||
+ String.fromCharCode(0x80 | (n & 0x3f)) | ||
; | ||
var _encode = buffer | ||
? function (u) { return (new buffer(u)).toString('base64') } | ||
: function (u) { return btoa(utob(u)) } | ||
; | ||
var encode = function(u, urisafe) { | ||
return !urisafe | ||
? _encode(u) | ||
: _encode(u).replace(/[+\/]/g, function(m0) { | ||
return m0 == '+' ? '-' : '_'; | ||
}); | ||
}; | ||
|
||
var utob = function(uni){ | ||
return uni.replace(re_char_nonascii, sub_char_nonascii); | ||
var encodeURI = function(u) { return encode(u, true) }; | ||
// decoder stuff | ||
var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}/g; | ||
var cb_btou = function(ccc) { | ||
return fromCharCode( | ||
ccc.length < 3 ? ((0x1f & ccc.charCodeAt(0)) << 6) | ||
| (0x3f & ccc.charCodeAt(1)) | ||
: ((0x0f & ccc.charCodeAt(0)) << 12) | ||
| ((0x3f & ccc.charCodeAt(1)) << 6) | ||
| (0x3f & ccc.charCodeAt(2)) | ||
); | ||
}; | ||
|
||
var re_bytes_nonascii | ||
= /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; | ||
|
||
var sub_bytes_nonascii = function(m){ | ||
var c0 = m.charCodeAt(0); | ||
var c1 = m.charCodeAt(1); | ||
if(c0 < 0xe0){ | ||
return String.fromCharCode(((c0 & 0x1f) << 6) | (c1 & 0x3f)); | ||
}else{ | ||
var c2 = m.charCodeAt(2); | ||
return String.fromCharCode( | ||
((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | (c2 & 0x3f) | ||
); | ||
} | ||
var btou = function(b) { | ||
return b.replace(re_btou, cb_btou); | ||
}; | ||
|
||
var btou = function(bin){ | ||
return bin.replace(re_bytes_nonascii, sub_bytes_nonascii); | ||
var cb_decode = function(cccc) { | ||
var len = cccc.length, | ||
padlen = len % 4, | ||
n = (len > 0 ? b64tab[cccc.charAt(0)] << 18 : 0) | ||
| (len > 1 ? b64tab[cccc.charAt(1)] << 12 : 0) | ||
| (len > 2 ? b64tab[cccc.charAt(2)] << 6 : 0) | ||
| (len > 3 ? b64tab[cccc.charAt(3)] : 0), | ||
chars = [ | ||
fromCharCode( n >>> 16), | ||
fromCharCode((n >>> 8) & 0xff), | ||
fromCharCode( n & 0xff) | ||
]; | ||
chars.length -= [0, 0, 2, 1][padlen]; | ||
return chars.join(''); | ||
}; | ||
|
||
var atob = global.atob || function(a){ | ||
return a.replace(/[\s\S]{1,4}/g, cb_decode); | ||
}; | ||
var _decode = buffer | ||
? function(a) { return (new buffer(a, 'base64')).toString() } | ||
: function(a) { return btou(atob(a)) } | ||
; | ||
var decode = function(a){ | ||
return _decode( | ||
a.replace(/[-_]/g, function(m0) { return m0 == '-' ? '+' : '/' }) | ||
.replace(/[^A-Za-z0-9\+\/]/g, '') | ||
); | ||
}; | ||
// export Base64 | ||
global.Base64 = { | ||
fromBase64:fromBase64, | ||
toBase64:toBase64, | ||
atob:atob, | ||
btoa:btoa, | ||
utob:utob, | ||
btou:btou, | ||
encode:function(u){ return btoa(utob(u)) }, | ||
encodeURI:function(u){ | ||
return btoa(utob(u)).replace(/[+\/]/g, function(m0){ | ||
return m0 == '+' ? '-' : '_'; | ||
}).replace(/=+$/, ''); | ||
}, | ||
decode:function(a){ | ||
return btou(atob(a.replace(/[-_]/g, function(m0){ | ||
return m0 == '-' ? '+' : '/'; | ||
}))); | ||
} | ||
atob: atob, | ||
btoa: btoa, | ||
fromBase64: decode, | ||
toBase64: encode, | ||
utob: utob, | ||
encode: encode, | ||
encodeURI: encodeURI, | ||
btou: btou, | ||
decode: decode | ||
}; | ||
|
||
// if ES5 is available, make Base64.extendString() available | ||
if (typeof Object.defineProperty === 'function') { | ||
var noEnum = function(v){ | ||
return {value:v,enumerable:false,writable:true,configurable:true}; | ||
}; | ||
global.Base64.extendString = function () { | ||
Object.defineProperty( | ||
String.prototype, 'fromBase64', noEnum(function () { | ||
return decode(this) | ||
})); | ||
Object.defineProperty( | ||
String.prototype, 'toBase64', noEnum(function (urisafe) { | ||
return encode(this, urisafe) | ||
})); | ||
}; | ||
} | ||
// that's it! | ||
})(this); |