add atob and btoa polyfills

This commit is contained in:
rolux 2012-06-15 10:39:22 +02:00
parent f0ca4fc7c2
commit 1e47435058

View file

@ -2,6 +2,47 @@
Ox.polyfill = {};
(function() {
var digits = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
/*@
Ox.polyfill.atob <f> see https://developer.mozilla.org/en/DOM/window.atob
> Ox.polyfill.atob('Cg==')
'\n'
> Ox.polyfill.atob('Zm9v')
'foo'
@*/
Ox.polyfill.atob = function(string) {
var binary = '', ret = '';
String(string).replace(/=/g, '').split('').forEach(function(char) {
binary += Ox.pad(digits.indexOf(char).toString(2), 'left', 6, '0');
});
while (binary.length >= 8) {
ret += Ox.char(parseInt(binary.slice(0, 8), 2));
binary = binary.slice(8);
}
return ret;
};
/*@
Ox.polyfill.btoa <f> see https://developer.mozilla.org/en/DOM/window.btoa
> Ox.polyfill.btoa('\n')
'Cg=='
> Ox.polyfill.btoa('foo')
'Zm9v'
@*/
Ox.polyfill.btoa = function(string) {
var binary = '', ret = '';
String(string).split('').forEach(function(char) {
binary += Ox.pad(char.charCodeAt(0).toString(2), 'left', 8, '0');
});
binary = Ox.pad(binary, Math.ceil(binary.length / 6) * 6, '0')
while (binary) {
ret += digits[parseInt(binary.slice(0, 6), 2)];
binary = binary.slice(6);
}
return Ox.pad(ret, Math.ceil(ret.length / 4) * 4, '=');
};
}());
(function(window) {
/*@
Ox.polyfill.bind <f> see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind
@ -343,7 +384,8 @@ Ox.polyfill.trim = function() {
for (key in Ox.polyfill) {
object = key == 'bind' ? Function.prototype
: key == 'isArray' ? Array
: key == 'JSON' || key == 'localStorage' ? window
: key == 'atob' || key == 'btoa'
|| key == 'JSON' || key == 'localStorage' ? window
: key == 'keys' ? Object
: key == 'trim' ? String.prototype
: Array.prototype;