mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/VisualEditor
synced 2024-11-30 00:55:00 +00:00
288da5b704
Bug: 66914 Change-Id: I7b0a9cfd4d4c10986769a868884688ffca833cb6
219 lines
5 KiB
JavaScript
219 lines
5 KiB
JavaScript
/**
|
|
Copyright (c) 2013, Specialisterne.
|
|
http://specialisterne.com/dk/
|
|
All rights reserved.
|
|
Authors:
|
|
Jacob Christian Munch-Andersen
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are met:
|
|
|
|
1. Redistributions of source code must retain the above copyright notice, this
|
|
list of conditions and the following disclaimer.
|
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
this list of conditions and the following disclaimer in the documentation
|
|
and/or other materials provided with the distribution.
|
|
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
|
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
**/
|
|
// For information and latest version see: https://github.com/Jacob-Christian-Munch-Andersen/Easy-Deflate
|
|
(function(){
|
|
|
|
var zip={};
|
|
function UTF8encode(str){
|
|
var out=[];
|
|
var a;
|
|
var c,c2;
|
|
for(a=0;a<str.length;a++){
|
|
c=str.charCodeAt(a);
|
|
if(c<128){
|
|
out.push(c);
|
|
}
|
|
else if(c<2048){
|
|
out.push((c >> 6)+192);
|
|
out.push((c & 63)+128);
|
|
}
|
|
else if(c<65536){
|
|
if(c>=0xD800 && c<0xDC00){
|
|
a++;
|
|
if(a>=str.length){
|
|
return null;
|
|
}
|
|
c2=str.charCodeAt(a);
|
|
if(c2>=0xDC00 && c2<0xE000){
|
|
c=65536+(c-0xD800)*1024+c2-0xDC00;
|
|
out.push((c >> 18)+240);
|
|
out.push(((c >> 12) & 63)+128);
|
|
out.push(((c >> 6) & 63)+128);
|
|
out.push((c & 63)+128);
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
else if(c>=0xDC00 && c<0xE000){
|
|
return null;
|
|
}
|
|
else{
|
|
out.push((c >> 12)+224);
|
|
out.push(((c >> 6) & 63)+128);
|
|
out.push((c & 63)+128);
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
return new Uint8Array(out);
|
|
}
|
|
function UTF8decodeA(arrarr){
|
|
var result="";
|
|
var intermediate;
|
|
var minvalue;
|
|
var missing=0;
|
|
var a,b;
|
|
var arr;
|
|
var c;
|
|
var lower,upper;
|
|
for(a=0;a<arrarr.length;a++){
|
|
arr=arrarr[a];
|
|
for(b=0;b<arr.length;b++){
|
|
c=arr[b];
|
|
if(missing){
|
|
if(c>127 && c<192){
|
|
intermediate=intermediate*64+c-128;
|
|
missing--;
|
|
if(!missing){
|
|
if(intermediate>=minvalue){
|
|
if(intermediate>=65536){
|
|
if(intermediate>0x10FFFF){
|
|
return null;
|
|
}
|
|
upper=(intermediate-65536)>>10;
|
|
lower=intermediate%1024;
|
|
result+=String.fromCharCode(upper+0xD800,lower+0xDC00);
|
|
}
|
|
else{
|
|
result+=String.fromCharCode(intermediate);
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
else if(c<128){
|
|
result+=String.fromCharCode(c);
|
|
}
|
|
else if(c>191 && c<248){
|
|
if(c<224){
|
|
intermediate=c-192;
|
|
minvalue=128;
|
|
missing=1;
|
|
}
|
|
else if(c<240){
|
|
intermediate=c-224;
|
|
minvalue=2048;
|
|
missing=2;
|
|
}
|
|
else{
|
|
intermediate=c-240;
|
|
minvalue=65536;
|
|
missing=3;
|
|
}
|
|
}
|
|
else{
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
if(missing){
|
|
return null;
|
|
}
|
|
return result;
|
|
}
|
|
function deflate(str){
|
|
var a,c;
|
|
var readlen=50000;
|
|
var resulta=[];
|
|
var results="";
|
|
var b,d;
|
|
var zipper=new zip.Deflater(9);
|
|
for(a=0;a<str.length;a+=readlen){
|
|
d=UTF8encode(str.substr(a,readlen));
|
|
if(d===null){ //This error may be due to a 4 byte charachter being split, retry with a string that is 1 longer to fix it.
|
|
d=UTF8encode(str.substr(a,readlen+1));
|
|
a+=1;
|
|
if(d===null){
|
|
return null;
|
|
}
|
|
}
|
|
b=zipper.append(d);
|
|
if(b.length!==0){
|
|
resulta.push(b);
|
|
}
|
|
}
|
|
b=zipper.flush();
|
|
if(b.length!==0){
|
|
resulta.push(b);
|
|
}
|
|
for(a=0;a<resulta.length;a++){
|
|
for(c=0;c<resulta[a].length;c++){
|
|
results+=String.fromCharCode(resulta[a][c]);
|
|
}
|
|
}
|
|
return "rawdeflate,"+btoa(results);
|
|
}
|
|
function inflate(dfl){
|
|
var unzipper=new zip.Inflater();
|
|
var resulta=[];
|
|
var dfls;
|
|
var a,c;
|
|
var b,d;
|
|
if(dfl.slice(0,11)!="rawdeflate,"){
|
|
return null;
|
|
}
|
|
try{
|
|
dfls=atob(dfl.slice(11));
|
|
}
|
|
catch(e){
|
|
return null;
|
|
}
|
|
try{
|
|
for(a=0;a<dfls.length;a+=50000){
|
|
b=new Uint8Array(Math.min(50000,dfls.length-a));
|
|
for(c=0;c<b.length;c++){
|
|
b[c]=dfls.charCodeAt(c+a);
|
|
}
|
|
d=unzipper.append(b);
|
|
if(d.length){
|
|
resulta.push(d);
|
|
}
|
|
}
|
|
return UTF8decodeA(resulta);
|
|
}
|
|
catch(e){
|
|
return null;
|
|
}
|
|
}
|
|
|
|
window.EasyDeflate = {
|
|
'zip': zip,
|
|
'inflate': inflate,
|
|
'deflate': deflate
|
|
};
|
|
|
|
})(); |