mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-31 15:23:02 +00:00 
			
		
		
		
	Code cosmetics comic reader
This commit is contained in:
		| @@ -8,6 +8,8 @@ | ||||
|  * Copyright(c) 2011 Google Inc. | ||||
|  */ | ||||
|  | ||||
| /* global bitjs */ | ||||
|  | ||||
| var bitjs = bitjs || {}; | ||||
| bitjs.archive = bitjs.archive || {}; | ||||
|  | ||||
| @@ -15,7 +17,7 @@ bitjs.archive = bitjs.archive || {}; | ||||
|  | ||||
|     // =========================================================================== | ||||
|     // Stolen from Closure because it's the best way to do Java-like inheritance. | ||||
|     bitjs.base = function(me, optMethodName, var_args) { | ||||
|     bitjs.base = function(me, optMethodName, varArgs) { | ||||
|         var caller = arguments.callee.caller; | ||||
|         if (caller.superClass_) { | ||||
|             // This is a constructor. Call the superclass constructor. | ||||
| @@ -48,10 +50,10 @@ bitjs.archive = bitjs.archive || {}; | ||||
|     }; | ||||
|     bitjs.inherits = function(childCtor, parentCtor) { | ||||
|         /** @constructor */ | ||||
|         function tempCtor() {}; | ||||
|         tempCtor.prototype = parentCtor.prototype; | ||||
|         function TempCtor() {} | ||||
|         TempCtor.prototype = parentCtor.prototype; | ||||
|         childCtor.superClass_ = parentCtor.prototype; | ||||
|         childCtor.prototype = new tempCtor(); | ||||
|         childCtor.prototype = new TempCtor(); | ||||
|         childCtor.prototype.constructor = childCtor; | ||||
|     }; | ||||
|     // =========================================================================== | ||||
| @@ -141,12 +143,12 @@ bitjs.archive = bitjs.archive || {}; | ||||
|      * Progress event. | ||||
|      */ | ||||
|     bitjs.archive.UnarchiveProgressEvent = function( | ||||
|         currentFilename, | ||||
|         currentFileNumber, | ||||
|         currentBytesUnarchivedInFile, | ||||
|         currentBytesUnarchived, | ||||
|         totalUncompressedBytesInArchive, | ||||
|         totalFilesInArchive) | ||||
|             currentFilename, | ||||
|             currentFileNumber, | ||||
|             currentBytesUnarchivedInFile, | ||||
|             currentBytesUnarchived, | ||||
|             totalUncompressedBytesInArchive, | ||||
|             totalFilesInArchive) | ||||
|     { | ||||
|         bitjs.base(this, bitjs.archive.UnarchiveEvent.Type.PROGRESS); | ||||
|  | ||||
| @@ -296,7 +298,7 @@ bitjs.archive = bitjs.archive || {}; | ||||
|             }; | ||||
|  | ||||
|             this.worker_.onmessage = function(e) { | ||||
|                 if (typeof e.data == "string") { | ||||
|                 if (typeof e.data === "string") { | ||||
|                     // Just log any strings the workers pump our way. | ||||
|                     console.log(e.data); | ||||
|                 } else { | ||||
|   | ||||
| @@ -9,6 +9,8 @@ | ||||
|  * Copyright(c) 2011 antimatter15 | ||||
|  */ | ||||
|  | ||||
| /* global bitjs, Uint8Array */ | ||||
|  | ||||
| var bitjs = bitjs || {}; | ||||
| bitjs.io = bitjs.io || {}; | ||||
|  | ||||
| @@ -58,16 +60,16 @@ bitjs.io = bitjs.io || {}; | ||||
|      * @return {number} The peeked bits, as an unsigned number. | ||||
|      */ | ||||
|     bitjs.io.BitStream.prototype.peekBitsLtr = function(n, movePointers) { | ||||
|         if (n <= 0 || typeof n != typeof 1) { | ||||
|         if (n <= 0 || typeof n !== typeof 1) { | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         movePointers = movePointers || false, | ||||
|             bytePtr = this.bytePtr, | ||||
|             bitPtr = this.bitPtr, | ||||
|             result = 0, | ||||
|             bitsIn = 0, | ||||
|             bytes = this.bytes; | ||||
|         var movePointers = movePointers || false; | ||||
|         var bytePtr = this.bytePtr; | ||||
|         var bitPtr = this.bitPtr; | ||||
|         var result = 0; | ||||
|         var bitsIn = 0; | ||||
|         var bytes = this.bytes; | ||||
|  | ||||
|         // keep going until we have no more bits left to peek at | ||||
|         // TODO: Consider putting all bits from bytes we will need into a variable and then | ||||
| @@ -123,11 +125,11 @@ bitjs.io = bitjs.io || {}; | ||||
|             return 0; | ||||
|         } | ||||
|  | ||||
|         var movePointers = movePointers || false, | ||||
|             bytePtr = this.bytePtr, | ||||
|             bitPtr = this.bitPtr, | ||||
|             result = 0, | ||||
|             bytes = this.bytes; | ||||
|         var movePointers = movePointers || false; | ||||
|         var bytePtr = this.bytePtr; | ||||
|         var bitPtr = this.bitPtr; | ||||
|         var result = 0; | ||||
|         var bytes = this.bytes; | ||||
|  | ||||
|         // keep going until we have no more bits left to peek at | ||||
|         // TODO: Consider putting all bits from bytes we will need into a variable and then | ||||
| @@ -138,7 +140,7 @@ bitjs.io = bitjs.io || {}; | ||||
|             if (bytePtr >= bytes.length) { | ||||
|                 throw "Error!  Overflowed the bit stream! n=" + n + ", bytePtr=" + bytePtr + ", bytes.length=" + | ||||
|                     bytes.length + ", bitPtr=" + bitPtr; | ||||
|                 return -1; | ||||
|                 // return -1; | ||||
|             } | ||||
|  | ||||
|             var numBitsLeftInThisByte = (8 - bitPtr); | ||||
| @@ -207,8 +209,8 @@ bitjs.io = bitjs.io || {}; | ||||
|         } | ||||
|  | ||||
|         movePointers = movePointers || false; | ||||
|         var bytePtr = this.bytePtr, | ||||
|             bitPtr = this.bitPtr; | ||||
|         var bytePtr = this.bytePtr; | ||||
|         // var bitPtr = this.bitPtr; | ||||
|  | ||||
|         var result = this.bytes.subarray(bytePtr, bytePtr + n); | ||||
|  | ||||
| @@ -255,7 +257,7 @@ bitjs.io = bitjs.io || {}; | ||||
|      */ | ||||
|     bitjs.io.ByteStream.prototype.peekNumber = function(n) { | ||||
|         // TODO: return error if n would go past the end of the stream? | ||||
|         if (n <= 0 || typeof n !== typeof 1){ | ||||
|         if (n <= 0 || typeof n !== typeof 1) { | ||||
|             return -1; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -8,7 +8,7 @@ | ||||
|  * | ||||
|  * http://kthoom.googlecode.com/hg/docs/unrar.html | ||||
|  */ | ||||
| /* global bitjs */ | ||||
| /* global bitjs, importScripts */ | ||||
|  | ||||
| // This file expects to be invoked as a Worker (see onmessage below). | ||||
| importScripts("io.js"); | ||||
| @@ -42,23 +42,23 @@ var postProgress = function() { | ||||
| // shows a byte value as its hex representation | ||||
| var nibble = "0123456789ABCDEF"; | ||||
| var byteValueToHexString = function(num) { | ||||
|     return nibble[num>>4] + nibble[num&0xF]; | ||||
|     return nibble[num>>4] + nibble[num & 0xF]; | ||||
| }; | ||||
| var twoByteValueToHexString = function(num) { | ||||
|     return nibble[(num>>12)&0xF] + nibble[(num>>8)&0xF] + nibble[(num>>4)&0xF] + nibble[num&0xF]; | ||||
|     return nibble[(num>>12) & 0xF] + nibble[(num>>8) & 0xF] + nibble[(num>>4) & 0xF] + nibble[num & 0xF]; | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Volume Types | ||||
| var MARK_HEAD      = 0x72, | ||||
|     MAIN_HEAD      = 0x73, | ||||
| // MARK_HEAD      = 0x72; | ||||
| var MAIN_HEAD      = 0x73, | ||||
|     FILE_HEAD      = 0x74, | ||||
|     COMM_HEAD      = 0x75, | ||||
|     AV_HEAD        = 0x76, | ||||
|     SUB_HEAD       = 0x77, | ||||
|     PROTECT_HEAD   = 0x78, | ||||
|     SIGN_HEAD      = 0x79, | ||||
|     NEWSUB_HEAD    = 0x7a, | ||||
|     // COMM_HEAD      = 0x75, | ||||
|     // AV_HEAD        = 0x76, | ||||
|     // SUB_HEAD       = 0x77, | ||||
|     // PROTECT_HEAD   = 0x78, | ||||
|     // SIGN_HEAD      = 0x79, | ||||
|     // NEWSUB_HEAD    = 0x7a, | ||||
|     ENDARC_HEAD    = 0x7b; | ||||
|  | ||||
| // bstream is a bit stream | ||||
| @@ -66,7 +66,7 @@ var RarVolumeHeader = function(bstream) { | ||||
|  | ||||
|     var headPos = bstream.bytePtr; | ||||
|     // byte 1,2 | ||||
|     info("Rar Volume Header @"+bstream.bytePtr); | ||||
|     info("Rar Volume Header @" + bstream.bytePtr); | ||||
|  | ||||
|     this.crc = bstream.readBits(16); | ||||
|     info("  crc=" + this.crc); | ||||
| @@ -147,7 +147,7 @@ var RarVolumeHeader = function(bstream) { | ||||
|                 this.HighPackSize = 0; | ||||
|                 this.HighUnpSize = 0; | ||||
|                 if (this.unpackedSize == 0xffffffff) { | ||||
|                     this.HighUnpSize = 0x7fffffff | ||||
|                     this.HighUnpSize = 0x7fffffff; | ||||
|                     this.unpackedSize = 0xffffffff; | ||||
|                 } | ||||
|             } | ||||
| @@ -160,7 +160,7 @@ var RarVolumeHeader = function(bstream) { | ||||
|             // read in filename | ||||
|  | ||||
|             this.filename = bstream.readBytes(this.nameSize); | ||||
|             for (var _i = 0, _s = ''; _i < this.filename.length; _i++) { | ||||
|             for (var _i = 0, _s = ""; _i < this.filename.length ; _i++) { | ||||
|                 _s += String.fromCharCode(this.filename[_i]); | ||||
|             } | ||||
|  | ||||
| @@ -177,14 +177,16 @@ var RarVolumeHeader = function(bstream) { | ||||
|  | ||||
|                 // this is adapted straight out of arcread.cpp, Archive::ReadHeader() | ||||
|                 for (var I = 0; I < 4; ++I) { | ||||
|                     var rmode = extTimeFlags >> ((3-I)*4); | ||||
|                     var rmode = extTimeFlags >> ((3 - I) * 4); | ||||
|                     if ((rmode & 8)==0) | ||||
|                         continue; | ||||
|                     if (I!=0) | ||||
|                     if (I!=0) { | ||||
|                         bstream.readBits(16); | ||||
|                         var count = (rmode&3); | ||||
|                         for (var J = 0; J < count; ++J) | ||||
|                             bstream.readBits(8); | ||||
|                     } | ||||
|                     var count = (rmode & 3); | ||||
|                     for (var J = 0; J < count; ++J) { | ||||
|                         bstream.readBits(8); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| @@ -193,7 +195,7 @@ var RarVolumeHeader = function(bstream) { | ||||
|             } | ||||
|  | ||||
|  | ||||
|             while(headPos + this.headSize > bstream.bytePtr) bstream.readBits(1); | ||||
|             while (headPos + this.headSize > bstream.bytePtr) bstream.readBits(1); | ||||
|  | ||||
|             info("Found FILE_HEAD with packSize=" + this.packSize + ", unpackedSize= " + this.unpackedSize + ", hostOS=" + this.hostOS + ", unpVer=" + this.unpVer + ", method=" + this.method + ", filename=" + this.filename); | ||||
|  | ||||
| @@ -206,24 +208,24 @@ var RarVolumeHeader = function(bstream) { | ||||
|     } | ||||
| }; | ||||
|  | ||||
| var BLOCK_LZ  = 0, | ||||
|     BLOCK_PPM = 1; | ||||
| var BLOCK_LZ  = 0; | ||||
|     // BLOCK_PPM = 1; | ||||
|  | ||||
| var rLDecode = [0,1,2,3,4,5,6,7,8,10,12,14,16,20,24,28,32,40,48,56,64,80,96,112,128,160,192,224], | ||||
|     rLBits = [0,0,0,0,0,0,0,0,1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5], | ||||
|     rDBitLengthCounts = [4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,0,12], | ||||
|     rSDDecode = [0,4,8,16,32,64,128,192], | ||||
| var rLDecode = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224],  | ||||
|     rLBits = [0, 0, 0, 0, 0, 0, 0, 0, 1,  1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4,  4,  5,  5,  5,  5], | ||||
|     rDBitLengthCounts = [4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 14, 0, 12], | ||||
|     rSDDecode = [0, 4, 8, 16, 32, 64, 128, 192], | ||||
|     rSDBits = [2,2,3, 4, 5, 6,  6,  6]; | ||||
|    | ||||
| var rDDecode = [0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, | ||||
| 			48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, | ||||
| 			4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, | ||||
| 			131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, | ||||
| 			655360, 720896, 786432, 851968, 917504, 983040]; | ||||
|     48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, | ||||
|     4096, 6144, 8192, 12288, 16384, 24576, 32768, 49152, 65536, 98304, | ||||
|     131072, 196608, 262144, 327680, 393216, 458752, 524288, 589824, | ||||
|     655360, 720896, 786432, 851968, 917504, 983040]; | ||||
|  | ||||
| var rDBits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, | ||||
| 			5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, | ||||
| 			15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]; | ||||
|     5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, | ||||
|     15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16]; | ||||
|  | ||||
| var rLOW_DIST_REP_COUNT = 16; | ||||
|  | ||||
| @@ -232,35 +234,35 @@ var rNC = 299, | ||||
|     rLDC = 17, | ||||
|     rRC = 28, | ||||
|     rBC = 20, | ||||
|     rHUFF_TABLE_SIZE = (rNC+rDC+rRC+rLDC); | ||||
|     rHUFF_TABLE_SIZE = (rNC + rDC + rRC + rLDC); | ||||
|  | ||||
| var UnpBlockType = BLOCK_LZ; | ||||
| var UnpOldTable = new Array(rHUFF_TABLE_SIZE); | ||||
|  | ||||
| var BD = { //bitdecode | ||||
|   DecodeLen: new Array(16), | ||||
|   DecodePos: new Array(16), | ||||
|   DecodeNum: new Array(rBC) | ||||
|     DecodeLen: new Array(16), | ||||
|     DecodePos: new Array(16), | ||||
|     DecodeNum: new Array(rBC) | ||||
| }; | ||||
| var LD = { //litdecode | ||||
|   DecodeLen: new Array(16), | ||||
|   DecodePos: new Array(16), | ||||
|   DecodeNum: new Array(rNC) | ||||
|     DecodeLen: new Array(16), | ||||
|     DecodePos: new Array(16), | ||||
|     DecodeNum: new Array(rNC) | ||||
| }; | ||||
| var DD = { //distdecode | ||||
|   DecodeLen: new Array(16), | ||||
|   DecodePos: new Array(16), | ||||
|   DecodeNum: new Array(rDC) | ||||
|     DecodeLen: new Array(16), | ||||
|     DecodePos: new Array(16), | ||||
|     DecodeNum: new Array(rDC) | ||||
| }; | ||||
| var LDD = { //low dist decode | ||||
|   DecodeLen: new Array(16), | ||||
|   DecodePos: new Array(16), | ||||
|   DecodeNum: new Array(rLDC) | ||||
|     DecodeLen: new Array(16), | ||||
|     DecodePos: new Array(16), | ||||
|     DecodeNum: new Array(rLDC) | ||||
| }; | ||||
| var RD = { //rep decode | ||||
|   DecodeLen: new Array(16), | ||||
|   DecodePos: new Array(16), | ||||
|   DecodeNum: new Array(rRC) | ||||
|     DecodeLen: new Array(16), | ||||
|     DecodePos: new Array(16), | ||||
|     DecodeNum: new Array(rRC) | ||||
| }; | ||||
|  | ||||
| var rBuffer; | ||||
| @@ -742,7 +744,7 @@ function unpack(v) { | ||||
|    | ||||
|     rBuffer = new bitjs.io.ByteBuffer(v.header.unpackedSize); | ||||
|  | ||||
|     info("Unpacking "+v.filename+" RAR v"+Ver); | ||||
|     info("Unpacking " + v.filename+" RAR v" + Ver); | ||||
|      | ||||
|     switch(Ver) { | ||||
|         case 15: // rar 1.5 compression | ||||
| @@ -816,7 +818,7 @@ var unrar = function(arrayBuffer) { | ||||
|  | ||||
|     postMessage(new bitjs.archive.UnarchiveStartEvent()); | ||||
|     var bstream = new bitjs.io.BitStream(arrayBuffer, false /* rtl */); | ||||
|    | ||||
|  | ||||
|     var header = new RarVolumeHeader(bstream); | ||||
|     if (header.crc == 0x6152 && | ||||
|         header.headType == 0x72 && | ||||
|   | ||||
| @@ -7,11 +7,10 @@ | ||||
|  * | ||||
|  * TAR format: http://www.gnu.org/software/automake/manual/tar/Standard.html | ||||
|  */ | ||||
| /* global bitjs */ | ||||
|  | ||||
| // This file expects to be invoked as a Worker (see onmessage below). | ||||
| importScripts("io.js"); | ||||
| importScripts("archive.js"); | ||||
| importScripts('io.js'); | ||||
| importScripts('archive.js'); | ||||
|  | ||||
| // Progress variables. | ||||
| var currentFilename = ""; | ||||
| @@ -23,147 +22,147 @@ var totalFilesInArchive = 0; | ||||
|  | ||||
| // Helper functions. | ||||
| var info = function(str) { | ||||
|     postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); | ||||
|   postMessage(new bitjs.archive.UnarchiveInfoEvent(str)); | ||||
| }; | ||||
| var err = function(str) { | ||||
|     postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); | ||||
|   postMessage(new bitjs.archive.UnarchiveErrorEvent(str)); | ||||
| }; | ||||
| var postProgress = function() { | ||||
|     postMessage(new bitjs.archive.UnarchiveProgressEvent( | ||||
|         currentFilename, | ||||
|         currentFileNumber, | ||||
|         currentBytesUnarchivedInFile, | ||||
|         currentBytesUnarchived, | ||||
|         totalUncompressedBytesInArchive, | ||||
|         totalFilesInArchive)); | ||||
|   postMessage(new bitjs.archive.UnarchiveProgressEvent( | ||||
|       currentFilename, | ||||
|       currentFileNumber, | ||||
|       currentBytesUnarchivedInFile, | ||||
|       currentBytesUnarchived, | ||||
|       totalUncompressedBytesInArchive, | ||||
|       totalFilesInArchive)); | ||||
| }; | ||||
|  | ||||
| // Removes all characters from the first zero-byte in the string onwards. | ||||
| var readCleanString = function(bstr, numBytes) { | ||||
|     var str = bstr.readString(numBytes); | ||||
|     var zIndex = str.indexOf(String.fromCharCode(0)); | ||||
|     return zIndex !== -1 ? str.substr(0, zIndex) : str; | ||||
|   var str = bstr.readString(numBytes); | ||||
|   var zIndex = str.indexOf(String.fromCharCode(0)); | ||||
|   return zIndex != -1 ? str.substr(0, zIndex) : str; | ||||
| }; | ||||
|  | ||||
| // takes a ByteStream and parses out the local file information | ||||
| var TarLocalFile = function(bstream) { | ||||
|     this.isValid = false; | ||||
|   this.isValid = false; | ||||
|  | ||||
|     // Read in the header block | ||||
|     this.name = readCleanString(bstream, 100); | ||||
|     this.mode = readCleanString(bstream, 8); | ||||
|     this.uid = readCleanString(bstream, 8); | ||||
|     this.gid = readCleanString(bstream, 8); | ||||
|     this.size = parseInt(readCleanString(bstream, 12), 8); | ||||
|     this.mtime = readCleanString(bstream, 12); | ||||
|     this.chksum = readCleanString(bstream, 8); | ||||
|     this.typeflag = readCleanString(bstream, 1); | ||||
|     this.linkname = readCleanString(bstream, 100); | ||||
|     this.maybeMagic = readCleanString(bstream, 6); | ||||
|   // Read in the header block | ||||
|   this.name = readCleanString(bstream, 100); | ||||
|   this.mode = readCleanString(bstream, 8); | ||||
|   this.uid = readCleanString(bstream, 8); | ||||
|   this.gid = readCleanString(bstream, 8); | ||||
|   this.size = parseInt(readCleanString(bstream, 12), 8); | ||||
|   this.mtime = readCleanString(bstream, 12); | ||||
|   this.chksum = readCleanString(bstream, 8); | ||||
|   this.typeflag = readCleanString(bstream, 1); | ||||
|   this.linkname = readCleanString(bstream, 100); | ||||
|   this.maybeMagic = readCleanString(bstream, 6); | ||||
|  | ||||
|     if (this.maybeMagic === "ustar") { | ||||
|         this.version = readCleanString(bstream, 2); | ||||
|         this.uname = readCleanString(bstream, 32); | ||||
|         this.gname = readCleanString(bstream, 32); | ||||
|         this.devmajor = readCleanString(bstream, 8); | ||||
|         this.devminor = readCleanString(bstream, 8); | ||||
|         this.prefix = readCleanString(bstream, 155); | ||||
|   if (this.maybeMagic == "ustar") { | ||||
|   	this.version = readCleanString(bstream, 2); | ||||
|   	this.uname = readCleanString(bstream, 32); | ||||
|   	this.gname = readCleanString(bstream, 32); | ||||
|   	this.devmajor = readCleanString(bstream, 8); | ||||
|   	this.devminor = readCleanString(bstream, 8); | ||||
|   	this.prefix = readCleanString(bstream, 155); | ||||
|  | ||||
|         if (this.prefix.length) { | ||||
|             this.name = this.prefix + this.name; | ||||
|         } | ||||
|         bstream.readBytes(12); // 512 - 500 | ||||
|     } else { | ||||
|         bstream.readBytes(255); // 512 - 257 | ||||
|     } | ||||
|   	if (this.prefix.length) { | ||||
|       this.name = this.prefix + this.name; | ||||
|   	} | ||||
|   	bstream.readBytes(12); // 512 - 500 | ||||
|   } else { | ||||
|   	bstream.readBytes(255); // 512 - 257 | ||||
|   } | ||||
|    | ||||
|     // Done header, now rest of blocks are the file contents. | ||||
|     this.filename = this.name; | ||||
|     this.fileData = null; | ||||
|   // Done header, now rest of blocks are the file contents. | ||||
|   this.filename = this.name; | ||||
|   this.fileData = null; | ||||
|  | ||||
|     info("Untarring file '" + this.filename + "'"); | ||||
|     info("  size = " + this.size); | ||||
|     info("  typeflag = " + this.typeflag); | ||||
|   info("Untarring file '" + this.filename + "'"); | ||||
|   info("  size = " + this.size); | ||||
|   info("  typeflag = " + this.typeflag); | ||||
|  | ||||
|     // A regular file. | ||||
|     if (this.typeflag === 0) { | ||||
|         info("  This is a regular file."); | ||||
|         var sizeInBytes = parseInt(this.size); | ||||
|         this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.size); | ||||
|         if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) { | ||||
|             this.isValid = true; | ||||
|         } | ||||
|   // A regular file. | ||||
|   if (this.typeflag == 0) { | ||||
|   	info("  This is a regular file."); | ||||
|   	var sizeInBytes = parseInt(this.size); | ||||
|   	this.fileData = new Uint8Array(bstream.bytes.buffer, bstream.ptr, this.size); | ||||
|     if (this.name.length > 0 && this.size > 0 && this.fileData && this.fileData.buffer) { | ||||
|       this.isValid = true; | ||||
|   	} | ||||
|  | ||||
|         bstream.readBytes(this.size); | ||||
|     bstream.readBytes(this.size); | ||||
|  | ||||
|         // Round up to 512-byte blocks. | ||||
|         var remaining = 512 - this.size % 512; | ||||
|         if (remaining > 0 && remaining < 512) { | ||||
|             bstream.readBytes(remaining); | ||||
|         } | ||||
|     } else if (this.typeflag === 5) { | ||||
|         info("  This is a directory."); | ||||
|     } | ||||
|   	// Round up to 512-byte blocks. | ||||
|   	var remaining = 512 - this.size % 512; | ||||
|   	if (remaining > 0 && remaining < 512) { | ||||
|       bstream.readBytes(remaining); | ||||
|   	} | ||||
|   } else if (this.typeflag == 5) { | ||||
|   	 info("  This is a directory.") | ||||
|   } | ||||
| }; | ||||
|  | ||||
| // Takes an ArrayBuffer of a tar file in | ||||
| // returns null on error | ||||
| // returns an array of DecompressedFile objects on success | ||||
| var untar = function(arrayBuffer) { | ||||
|     currentFilename = ""; | ||||
|     currentFileNumber = 0; | ||||
|     currentBytesUnarchivedInFile = 0; | ||||
|     currentBytesUnarchived = 0; | ||||
|     totalUncompressedBytesInArchive = 0; | ||||
|     totalFilesInArchive = 0; | ||||
|   currentFilename = ""; | ||||
|   currentFileNumber = 0; | ||||
|   currentBytesUnarchivedInFile = 0; | ||||
|   currentBytesUnarchived = 0; | ||||
|   totalUncompressedBytesInArchive = 0; | ||||
|   totalFilesInArchive = 0; | ||||
|  | ||||
|     postMessage(new bitjs.archive.UnarchiveStartEvent()); | ||||
|     var bstream = new bitjs.io.ByteStream(arrayBuffer); | ||||
|     var localFiles = []; | ||||
|   postMessage(new bitjs.archive.UnarchiveStartEvent()); | ||||
|   var bstream = new bitjs.io.ByteStream(arrayBuffer); | ||||
|   var localFiles = []; | ||||
|  | ||||
|     // While we don't encounter an empty block, keep making TarLocalFiles. | ||||
|     while (bstream.peekNumber(4) !== 0) { | ||||
|         var oneLocalFile = new TarLocalFile(bstream); | ||||
|         if (oneLocalFile && oneLocalFile.isValid) { | ||||
|             localFiles.push(oneLocalFile); | ||||
|             totalUncompressedBytesInArchive += oneLocalFile.size; | ||||
|         } | ||||
|     } | ||||
|     totalFilesInArchive = localFiles.length; | ||||
|   // While we don't encounter an empty block, keep making TarLocalFiles. | ||||
|   while (bstream.peekNumber(4) != 0) { | ||||
|   	var oneLocalFile = new TarLocalFile(bstream); | ||||
|   	if (oneLocalFile && oneLocalFile.isValid) { | ||||
|       localFiles.push(oneLocalFile); | ||||
|       totalUncompressedBytesInArchive += oneLocalFile.size; | ||||
|   	} | ||||
|   } | ||||
|   totalFilesInArchive = localFiles.length; | ||||
|  | ||||
|     // got all local files, now sort them | ||||
|     localFiles.sort(function(a, b) { | ||||
|         var aname = a.filename.toLowerCase(); | ||||
|         var bname = b.filename.toLowerCase(); | ||||
|         return aname > bname ? 1 : -1; | ||||
|     }); | ||||
|  | ||||
|     // report # files and total length | ||||
|     if (localFiles.length > 0) { | ||||
|         postProgress(); | ||||
|     } | ||||
|  | ||||
|     // now do the shipping of each file | ||||
|     for (var i = 0; i < localFiles.length; ++i) { | ||||
|         var localfile = localFiles[i]; | ||||
|         info("Sending file '" + localfile.filename + "' up"); | ||||
|  | ||||
|         // update progress | ||||
|         currentFilename = localfile.filename; | ||||
|         currentFileNumber = i; | ||||
|         currentBytesUnarchivedInFile = localfile.size; | ||||
|         currentBytesUnarchived += localfile.size; | ||||
|         postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); | ||||
|         postProgress(); | ||||
|     } | ||||
|   // got all local files, now sort them | ||||
|   localFiles.sort(function(a,b) { | ||||
|       var aname = a.filename.toLowerCase(); | ||||
|       var bname = b.filename.toLowerCase(); | ||||
|       return aname > bname ? 1 : -1; | ||||
|   }); | ||||
|  | ||||
|   // report # files and total length | ||||
|   if (localFiles.length > 0) { | ||||
|     postProgress(); | ||||
|   } | ||||
|  | ||||
|     postMessage(new bitjs.archive.UnarchiveFinishEvent()); | ||||
|   // now do the shipping of each file | ||||
|   for (var i = 0; i < localFiles.length; ++i) { | ||||
|     var localfile = localFiles[i]; | ||||
|     info("Sending file '" + localfile.filename + "' up"); | ||||
|  | ||||
|     // update progress | ||||
|     currentFilename = localfile.filename; | ||||
|     currentFileNumber = i; | ||||
|     currentBytesUnarchivedInFile = localfile.size; | ||||
|     currentBytesUnarchived += localfile.size; | ||||
|     postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); | ||||
|     postProgress(); | ||||
|   } | ||||
|  | ||||
|   postProgress(); | ||||
|  | ||||
|   postMessage(new bitjs.archive.UnarchiveFinishEvent()); | ||||
| }; | ||||
|  | ||||
| // event.data.file has the ArrayBuffer. | ||||
| onmessage = function(event) { | ||||
|     var ab = event.data.file; | ||||
|     untar(ab); | ||||
|   var ab = event.data.file; | ||||
|   untar(ab); | ||||
| }; | ||||
|   | ||||
| @@ -9,7 +9,7 @@ | ||||
|  * ZIP format: http://www.pkware.com/documents/casestudies/APPNOTE.TXT | ||||
|  * DEFLATE format: http://tools.ietf.org/html/rfc1951 | ||||
|  */ | ||||
| /* global bitjs */  | ||||
| /* global bitjs, importScripts, Uint8Array  */ | ||||
|  | ||||
| // This file expects to be invoked as a Worker (see onmessage below). | ||||
| importScripts("io.js"); | ||||
| @@ -44,12 +44,12 @@ var zLocalFileHeaderSignature = 0x04034b50; | ||||
| var zArchiveExtraDataSignature = 0x08064b50; | ||||
| var zCentralFileHeaderSignature = 0x02014b50; | ||||
| var zDigitalSignatureSignature = 0x05054b50; | ||||
| var zEndOfCentralDirSignature = 0x06064b50; | ||||
| var zEndOfCentralDirLocatorSignature = 0x07064b50; | ||||
| //var zEndOfCentralDirSignature = 0x06064b50; | ||||
| //var zEndOfCentralDirLocatorSignature = 0x07064b50; | ||||
|  | ||||
| // takes a ByteStream and parses out the local file information | ||||
| var ZipLocalFile = function(bstream) { | ||||
|     if (typeof bstream != typeof {} || !bstream.readNumber || typeof bstream.readNumber != typeof function(){}) { | ||||
|     if (typeof bstream !== typeof {} || !bstream.readNumber || typeof bstream.readNumber != typeof function() {} ) { | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
| @@ -100,7 +100,7 @@ var ZipLocalFile = function(bstream) { | ||||
|     // "This descriptor exists only if bit 3 of the general purpose bit flag is set" | ||||
|     // But how do you figure out how big the file data is if you don't know the compressedSize | ||||
|     // from the header?!? | ||||
|     if ((this.generalPurpose & bitjs.BIT[3]) != 0) { | ||||
|     if ((this.generalPurpose & bitjs.BIT[3]) !== 0) { | ||||
|         this.crc32 = bstream.readNumber(4); | ||||
|         this.compressedSize = bstream.readNumber(4); | ||||
|         this.uncompressedSize = bstream.readNumber(4); | ||||
| @@ -111,13 +111,13 @@ var ZipLocalFile = function(bstream) { | ||||
| ZipLocalFile.prototype.unzip = function() { | ||||
|  | ||||
|     // Zip Version 1.0, no compression (store only) | ||||
|     if (this.compressionMethod == 0 ) { | ||||
|         info("ZIP v"+this.version+", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); | ||||
|     if (this.compressionMethod === 0 ) { | ||||
|         info("ZIP v" + this.version + ", store only: " + this.filename + " (" + this.compressedSize + " bytes)"); | ||||
|         currentBytesUnarchivedInFile = this.compressedSize; | ||||
|         currentBytesUnarchived += this.compressedSize; | ||||
|     } | ||||
|     // version == 20, compression method == 8 (DEFLATE) | ||||
|     else if (this.compressionMethod == 8) { | ||||
|     else if (this.compressionMethod === 8) { | ||||
|         info("ZIP v2.0, DEFLATE: " + this.filename + " (" + this.compressedSize + " bytes)"); | ||||
|         this.fileData = inflate(this.fileData, this.uncompressedSize); | ||||
|     } | ||||
| @@ -144,10 +144,10 @@ var unzip = function(arrayBuffer) { | ||||
|  | ||||
|     var bstream = new bitjs.io.ByteStream(arrayBuffer); | ||||
|     // detect local file header signature or return null | ||||
|     if (bstream.peekNumber(4) == zLocalFileHeaderSignature) { | ||||
|     if (bstream.peekNumber(4) === zLocalFileHeaderSignature) { | ||||
|         var localFiles = []; | ||||
|         // loop until we don't see any more local files | ||||
|         while (bstream.peekNumber(4) == zLocalFileHeaderSignature) { | ||||
|         while (bstream.peekNumber(4) === zLocalFileHeaderSignature) { | ||||
|             var oneLocalFile = new ZipLocalFile(bstream); | ||||
|             // this should strip out directories/folders | ||||
|             if (oneLocalFile && oneLocalFile.uncompressedSize > 0 && oneLocalFile.fileData) { | ||||
| @@ -158,14 +158,14 @@ var unzip = function(arrayBuffer) { | ||||
|         totalFilesInArchive = localFiles.length; | ||||
|  | ||||
|         // got all local files, now sort them | ||||
|         localFiles.sort(function(a,b) { | ||||
|         localFiles.sort(function(a, b) { | ||||
|             var aname = a.filename.toLowerCase(); | ||||
|             var bname = b.filename.toLowerCase(); | ||||
|             return aname > bname ? 1 : -1; | ||||
|         }); | ||||
|  | ||||
|         // archive extra data record | ||||
|         if (bstream.peekNumber(4) == zArchiveExtraDataSignature) { | ||||
|         if (bstream.peekNumber(4) === zArchiveExtraDataSignature) { | ||||
|             info(" Found an Archive Extra Data Signature"); | ||||
|  | ||||
|             // skipping this record for now | ||||
| @@ -176,11 +176,11 @@ var unzip = function(arrayBuffer) { | ||||
|  | ||||
|         // central directory structure | ||||
|         // TODO: handle the rest of the structures (Zip64 stuff) | ||||
|         if (bstream.peekNumber(4) == zCentralFileHeaderSignature) { | ||||
|         if (bstream.peekNumber(4) === zCentralFileHeaderSignature) { | ||||
|             info(" Found a Central File Header"); | ||||
|  | ||||
|             // read all file headers | ||||
|             while (bstream.peekNumber(4) == zCentralFileHeaderSignature) { | ||||
|             while (bstream.peekNumber(4) === zCentralFileHeaderSignature) { | ||||
|                 bstream.readNumber(4); // signature | ||||
|                 bstream.readNumber(2); // version made by | ||||
|                 bstream.readNumber(2); // version needed to extract | ||||
| @@ -206,7 +206,7 @@ var unzip = function(arrayBuffer) { | ||||
|         } | ||||
|  | ||||
|         // digital signature | ||||
|         if (bstream.peekNumber(4) == zDigitalSignatureSignature) { | ||||
|         if (bstream.peekNumber(4) === zDigitalSignatureSignature) { | ||||
|             info(" Found a Digital Signature"); | ||||
|  | ||||
|             bstream.readNumber(4); | ||||
| @@ -231,66 +231,66 @@ var unzip = function(arrayBuffer) { | ||||
|             // actually do the unzipping | ||||
|             localfile.unzip(); | ||||
|  | ||||
|             if (localfile.fileData != null) { | ||||
|             if (localfile.fileData !== null) { | ||||
|                 postMessage(new bitjs.archive.UnarchiveExtractEvent(localfile)); | ||||
|                 postProgress(); | ||||
|             } | ||||
|         } | ||||
|         postProgress(); | ||||
|         postMessage(new bitjs.archive.UnarchiveFinishEvent()); | ||||
|   } | ||||
| } | ||||
|     } | ||||
| }; | ||||
|  | ||||
| // returns a table of Huffman codes  | ||||
| // each entry's index is its code and its value is a JavaScript object  | ||||
| // containing {length: 6, symbol: X} | ||||
| function getHuffmanCodes(bitLengths) { | ||||
|     // ensure bitLengths is an array containing at least one element | ||||
|     if (typeof bitLengths != typeof [] || bitLengths.length < 1) { | ||||
|     if (typeof bitLengths !== typeof [] || bitLengths.length < 1) { | ||||
|         err("Error! getHuffmanCodes() called with an invalid array"); | ||||
|         return null; | ||||
|     } | ||||
|  | ||||
|     // Reference: http://tools.ietf.org/html/rfc1951#page-8 | ||||
|     var numLengths = bitLengths.length, | ||||
|         bl_count = [], | ||||
|         blCount = [], | ||||
|         MAX_BITS = 1; | ||||
|  | ||||
|     // Step 1: count up how many codes of each length we have | ||||
|     for (var i = 0; i < numLengths; ++i) { | ||||
|         var length = bitLengths[i]; | ||||
|         var len = bitLengths[i]; | ||||
|         // test to ensure each bit length is a positive, non-zero number | ||||
|         if (typeof length != typeof 1 || length < 0) { | ||||
|             err("bitLengths contained an invalid number in getHuffmanCodes(): " + length + " of type " + (typeof length)); | ||||
|         if (typeof len !== typeof 1 || len < 0) { | ||||
|             err("bitLengths contained an invalid number in getHuffmanCodes(): " + len + " of type " + (typeof len)); | ||||
|             return null; | ||||
|         } | ||||
|         // increment the appropriate bitlength count | ||||
|         if (bl_count[length] == undefined) bl_count[length] = 0; | ||||
|         if (blCount[len] === undefined) blCount[len] = 0; | ||||
|         // a length of zero means this symbol is not participating in the huffman coding | ||||
|         if (length > 0) bl_count[length]++; | ||||
|         if (len > 0) blCount[len]++; | ||||
|  | ||||
|         if (length > MAX_BITS) MAX_BITS = length; | ||||
|         if (len > MAX_BITS) MAX_BITS = len; | ||||
|     } | ||||
|  | ||||
|     // Step 2: Find the numerical value of the smallest code for each code length | ||||
|     var next_code = [], | ||||
|     var nextCode = [], | ||||
|         code = 0; | ||||
|     for (var bits = 1; bits <= MAX_BITS; ++bits) { | ||||
|         var length = bits-1; | ||||
|         var len = bits-1; | ||||
|         // ensure undefined lengths are zero | ||||
|         if (bl_count[length] == undefined) bl_count[length] = 0; | ||||
|         code = (code + bl_count[bits-1]) << 1; | ||||
|         next_code[bits] = code; | ||||
|         if (blCount[len] == undefined) blCount[len] = 0; | ||||
|         code = (code + blCount[bits-1]) << 1; | ||||
|         nextCode[bits] = code; | ||||
|     } | ||||
|  | ||||
|     // Step 3: Assign numerical values to all codes | ||||
|     var table = {}, tableLength = 0; | ||||
|     for (var n = 0; n < numLengths; ++n) { | ||||
|         var len = bitLengths[n]; | ||||
|         if (len != 0) { | ||||
|             table[next_code[len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(next_code[len],len) }; | ||||
|         if (len !== 0) { | ||||
|             table[nextCode[len]] = { length: len, symbol: n }; //, bitstring: binaryValueToString(nextCode[len],len) }; | ||||
|             tableLength++; | ||||
|             next_code[len]++; | ||||
|             nextCode[len]++; | ||||
|         } | ||||
|     } | ||||
|     table.maxLength = tableLength; | ||||
| @@ -322,9 +322,9 @@ function getFixedLiteralTable() { | ||||
|     if (!fixedHCtoLiteral) { | ||||
|         var bitlengths = new Array(288); | ||||
|         for (var i = 0; i <= 143; ++i) bitlengths[i] = 8; | ||||
|         for (i = 144; i <= 255; ++i) bitlengths[i] = 9; | ||||
|         for (i = 256; i <= 279; ++i) bitlengths[i] = 7; | ||||
|         for (i = 280; i <= 287; ++i) bitlengths[i] = 8; | ||||
|         for (var i = 144; i <= 255; ++i) bitlengths[i] = 9; | ||||
|         for (var i = 256; i <= 279; ++i) bitlengths[i] = 7; | ||||
|         for (var i = 280; i <= 287; ++i) bitlengths[i] = 8; | ||||
|  | ||||
|         // get huffman code table | ||||
|         fixedHCtoLiteral = getHuffmanCodes(bitlengths); | ||||
| @@ -335,7 +335,9 @@ function getFixedDistanceTable() { | ||||
|     // create once | ||||
|     if (!fixedHCtoDistance) { | ||||
|         var bitlengths = new Array(32); | ||||
|         for (var i = 0; i < 32; ++i) { bitlengths[i] = 5; } | ||||
|         for (var i = 0; i < 32; ++i) { | ||||
|             bitlengths[i] = 5; | ||||
|         } | ||||
|  | ||||
|         // get huffman code table | ||||
|         fixedHCtoDistance = getHuffmanCodes(bitlengths); | ||||
| @@ -347,7 +349,7 @@ function getFixedDistanceTable() { | ||||
| // then return that symbol | ||||
| function decodeSymbol(bstream, hcTable) { | ||||
|     var code = 0, len = 0; | ||||
|     var match = false; | ||||
|     // var match = false; | ||||
|  | ||||
|     // loop until we match | ||||
|     for (;;) { | ||||
| @@ -389,14 +391,14 @@ var CodeLengthCodeOrder = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2 | ||||
|  | ||||
|     */ | ||||
| var LengthLookupTable = [ | ||||
|         [0,3], [0,4], [0,5], [0,6], | ||||
|         [0,7], [0,8], [0,9], [0,10], | ||||
|         [1,11], [1,13], [1,15], [1,17], | ||||
|         [2,19], [2,23], [2,27], [2,31], | ||||
|         [3,35], [3,43], [3,51], [3,59], | ||||
|         [4,67], [4,83], [4,99], [4,115], | ||||
|         [5,131], [5,163], [5,195], [5,227], | ||||
|         [0,258] | ||||
|         [0, 3], [0, 4], [0, 5], [0, 6], | ||||
|         [0, 7], [0, 8], [0, 9], [0, 10], | ||||
|         [1, 11], [1, 13], [1, 15], [1, 17], | ||||
|         [2, 19], [2, 23], [2, 27], [2, 31], | ||||
|         [3, 35], [3, 43], [3, 51], [3, 59], | ||||
|         [4, 67], [4, 83], [4, 99], [4, 115], | ||||
|         [5, 131], [5, 163], [5, 195], [5, 227], | ||||
|         [0, 258] | ||||
| ]; | ||||
|     /* | ||||
|           Extra           Extra                Extra | ||||
| @@ -414,20 +416,20 @@ var LengthLookupTable = [ | ||||
|        9   3  25-32   19   8   769-1024   29   13 24577-32768 | ||||
|     */ | ||||
| var DistLookupTable = [ | ||||
|     [0,1], [0,2], [0,3], [0,4], | ||||
|     [1,5], [1,7], | ||||
|     [2,9], [2,13], | ||||
|     [3,17], [3,25], | ||||
|     [4,33], [4,49], | ||||
|     [5,65], [5,97], | ||||
|     [6,129], [6,193], | ||||
|     [7,257], [7,385], | ||||
|     [8,513], [8,769], | ||||
|     [9,1025], [9,1537], | ||||
|     [10,2049], [10,3073], | ||||
|     [11,4097], [11,6145], | ||||
|     [12,8193], [12,12289], | ||||
|     [13,16385], [13,24577] | ||||
|     [0, 1], [0, 2], [0, 3], [0, 4], | ||||
|     [1, 5], [1, 7], | ||||
|     [2, 9], [2, 13], | ||||
|     [3, 17], [3, 25], | ||||
|     [4, 33], [4, 49], | ||||
|     [5, 65], [5, 97], | ||||
|     [6, 129], [6, 193], | ||||
|     [7, 257], [7, 385], | ||||
|     [8, 513], [8, 769], | ||||
|     [9, 1025], [9, 1537], | ||||
|     [10, 2049], [10, 3073], | ||||
|     [11, 4097], [11, 6145], | ||||
|     [12, 8193], [12, 12289], | ||||
|     [13, 16385], [13, 24577] | ||||
| ]; | ||||
|  | ||||
| function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { | ||||
| @@ -457,7 +459,7 @@ function inflateBlockData(bstream, hcLiteralTable, hcDistanceTable, buffer) { | ||||
|         } | ||||
|         else { | ||||
|             // end of block reached | ||||
|             if (symbol == 256) { | ||||
|             if (symbol === 256) { | ||||
|                 break; | ||||
|             } | ||||
|             else { | ||||
| @@ -504,12 +506,13 @@ function inflate(compressedData, numDecompressedBytes) { | ||||
|         compressedData.byteOffset, | ||||
|         compressedData.byteLength); | ||||
|     var buffer = new bitjs.io.ByteBuffer(numDecompressedBytes); | ||||
|     var numBlocks = 0, blockSize = 0; | ||||
|     var numBlocks = 0; | ||||
|     var blockSize = 0; | ||||
|  | ||||
|     // block format: http://tools.ietf.org/html/rfc1951#page-9 | ||||
|     do { | ||||
|         var bFinal = bstream.readBits(1), | ||||
|             bType = bstream.readBits(2); | ||||
|         var bFinal = bstream.readBits(1); | ||||
|         var bType = bstream.readBits(2); | ||||
|         blockSize = 0; | ||||
|         ++numBlocks; | ||||
|         // no compression | ||||
| @@ -524,17 +527,17 @@ function inflate(compressedData, numDecompressedBytes) { | ||||
|             blockSize = len; | ||||
|         } | ||||
|         // fixed Huffman codes | ||||
|         else if(bType == 1) { | ||||
|         else if(bType === 1) { | ||||
|             blockSize = inflateBlockData(bstream, getFixedLiteralTable(), getFixedDistanceTable(), buffer); | ||||
|         } | ||||
|         // dynamic Huffman codes | ||||
|         else if(bType == 2) { | ||||
|         else if(bType === 2) { | ||||
|             var numLiteralLengthCodes = bstream.readBits(5) + 257; | ||||
|             var numDistanceCodes = bstream.readBits(5) + 1, | ||||
|                 numCodeLengthCodes = bstream.readBits(4) + 4; | ||||
|  | ||||
|             // populate the array of code length codes (first de-compaction) | ||||
|             var codeLengthsCodeLengths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; | ||||
|             var codeLengthsCodeLengths = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; | ||||
|             for (var i = 0; i < numCodeLengthCodes; ++i) { | ||||
|                 codeLengthsCodeLengths[ CodeLengthCodeOrder[i] ] = bstream.readBits(3); | ||||
|             } | ||||
| @@ -566,19 +569,19 @@ function inflate(compressedData, numDecompressedBytes) { | ||||
|                     literalCodeLengths.push(symbol); | ||||
|                     prevCodeLength = symbol; | ||||
|                 } | ||||
|                 else if (symbol == 16) { | ||||
|                 else if (symbol === 16) { | ||||
|                     var repeat = bstream.readBits(2) + 3; | ||||
|                     while (repeat--) { | ||||
|                         literalCodeLengths.push(prevCodeLength); | ||||
|                     } | ||||
|                 } | ||||
|                 else if (symbol == 17) { | ||||
|                 else if (symbol === 17) { | ||||
|                     var repeat = bstream.readBits(3) + 3; | ||||
|                     while (repeat--) { | ||||
|                         literalCodeLengths.push(0); | ||||
|                     } | ||||
|                 } | ||||
|                 else if (symbol == 18) { | ||||
|                 else if (symbol === 18) { | ||||
|                     var repeat = bstream.readBits(7) + 11; | ||||
|                     while (repeat--) { | ||||
|                         literalCodeLengths.push(0); | ||||
| @@ -605,7 +608,7 @@ function inflate(compressedData, numDecompressedBytes) { | ||||
|         currentBytesUnarchived += blockSize; | ||||
|         postProgress(); | ||||
|  | ||||
|     } while (bFinal != 1); | ||||
|     } while (bFinal !== 1); | ||||
|     // we are done reading blocks if the bFinal bit was set for this block | ||||
|  | ||||
|     // return the buffer data bytes | ||||
|   | ||||
| @@ -33,7 +33,7 @@ | ||||
|     </div> | ||||
|     <button type="submit" name="submit" value="submit" class="btn btn-default">{{_('Save settings')}}</button> | ||||
|     <button type="submit" name="test" value="test" class="btn btn-default">{{_('Save settings and send Test E-Mail')}}</button> | ||||
|     <a href="{{ url_for('admin') }}" class="btn btn-default">{{_('Back')}}</a> | ||||
|     <a href="{{ url_for('admin') }}" id="back" class="btn btn-default">{{_('Back')}}</a> | ||||
|   </form> | ||||
|  | ||||
| </div> | ||||
|   | ||||
| @@ -6,7 +6,7 @@ | ||||
|   <div class="row"> | ||||
|  | ||||
|     {% for entry in random %} | ||||
|     <div class="col-sm-3 col-lg-2 col-xs-6 book"> | ||||
|     <div class="col-sm-3 col-lg-2 col-xs-6 book" id="books_rand"> | ||||
|       <div class="cover"> | ||||
|           <a href="{{ url_for('show_book', book_id=entry.id) }}" data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"> | ||||
|             {% if entry.has_cover %} | ||||
| @@ -42,7 +42,7 @@ | ||||
|   <div class="row"> | ||||
|     {% if entries[0] %} | ||||
|     {% for entry in entries %} | ||||
|     <div class="col-sm-3 col-lg-2 col-xs-6 book"> | ||||
|     <div class="col-sm-3 col-lg-2 col-xs-6 book" id="books"> | ||||
|       <div class="cover"> | ||||
|           <a href="{{ url_for('show_book', book_id=entry.id) }}" data-toggle="modal" data-target="#bookDetailsModal" data-remote="false"> | ||||
|             {% if entry.has_cover %} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 OzzieIsaacs
					OzzieIsaacs