Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
b4bd7507
Commit
b4bd7507
authored
Oct 22, 2017
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
git://github.com/janeczku/calibre-web
parents
674baad4
9182d891
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
324 additions
and
300 deletions
+324
-300
.gitignore
.gitignore
+0
-2
Descript.ion
Descript.ion
+0
-1
archive.js
cps/static/js/archive.js
+13
-11
io.js
cps/static/js/io.js
+18
-16
epub.js
cps/static/js/reading/epub.js
+7
-2
unrar.js
cps/static/js/unrar.js
+52
-50
untar.js
cps/static/js/untar.js
+120
-121
unzip.js
cps/static/js/unzip.js
+75
-72
detail.html
cps/templates/detail.html
+2
-2
email_edit.html
cps/templates/email_edit.html
+1
-1
index.html
cps/templates/index.html
+2
-2
index.xml
cps/templates/index.xml
+1
-1
layout.html
cps/templates/layout.html
+9
-7
read.html
cps/templates/read.html
+2
-1
ub.py
cps/ub.py
+9
-3
web.py
cps/web.py
+13
-8
No files found.
.gitignore
View file @
b4bd7507
...
...
@@ -28,5 +28,3 @@ settings.yaml
gdrive_credentials
vendor
metadata.db
Descript.ion
deleted
100644 → 0
View file @
674baad4
cps zexit()
cps/static/js/archive.js
View file @
b4bd7507
...
...
@@ -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
_a
rgs
)
{
bitjs
.
base
=
function
(
me
,
optMethodName
,
var
A
rgs
)
{
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
()
{};
t
empCtor
.
prototype
=
parentCtor
.
prototype
;
function
TempCtor
()
{}
T
empCtor
.
prototype
=
parentCtor
.
prototype
;
childCtor
.
superClass_
=
parentCtor
.
prototype
;
childCtor
.
prototype
=
new
t
empCtor
();
childCtor
.
prototype
=
new
T
empCtor
();
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
{
...
...
cps/static/js/io.js
View file @
b4bd7507
...
...
@@ -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
;
}
...
...
cps/static/js/reading/epub.js
View file @
b4bd7507
...
...
@@ -10,8 +10,13 @@
restore
:
true
,
bookmarks
:
calibre
.
bookmark
?
[
calibre
.
bookmark
]
:
[]
});
reader
.
on
(
"reader:bookmarked"
,
updateBookmark
.
bind
(
reader
,
"add"
));
reader
.
on
(
"reader:unbookmarked"
,
updateBookmark
.
bind
(
reader
,
"remove"
));
if
(
calibre
.
useBookmarks
)
{
reader
.
on
(
"reader:bookmarked"
,
updateBookmark
.
bind
(
reader
,
"add"
));
reader
.
on
(
"reader:unbookmarked"
,
updateBookmark
.
bind
(
reader
,
"remove"
));
}
else
{
$
(
"#bookmark, #show-Bookmarks"
).
remove
();
}
/**
* @param {string} action - Add or remove bookmark
...
...
cps/static/js/unrar.js
View file @
b4bd7507
...
...
@@ -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
&&
...
...
cps/static/js/untar.js
View file @
b4bd7507
...
...
@@ -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
;
// 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
.
prefix
.
length
)
{
this
.
name
=
this
.
prefix
+
this
.
name
;
}
bstream
.
readBytes
(
12
);
// 512 - 500
}
else
{
bstream
.
readBytes
(
255
);
// 512 - 257
}
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
);
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
}
// 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
);
// 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
);
// 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."
);
}
// 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
);
// 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
);
// 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
;
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
;
// 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
();
}
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
=
[];
// 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
();
}
postProgress
();
postMessage
(
new
bitjs
.
archive
.
UnarchiveFinishEvent
());
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
);
};
cps/static/js/unzip.js
View file @
b4bd7507
...
...
@@ -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
_c
ount
=
[],
bl
C
ount
=
[],
MAX_BITS
=
1
;
// Step 1: count up how many codes of each length we have
for
(
var
i
=
0
;
i
<
numLengths
;
++
i
)
{
var
len
gth
=
bitLengths
[
i
];
var
len
=
bitLengths
[
i
];
// test to ensure each bit length is a positive, non-zero number
if
(
typeof
len
gth
!=
typeof
1
||
length
<
0
)
{
err
(
"bitLengths contained an invalid number in getHuffmanCodes(): "
+
len
gth
+
" 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
(
bl
Count
[
len
]
===
undefined
)
blCount
[
len
]
=
0
;
// a length of zero means this symbol is not participating in the huffman coding
if
(
len
gth
>
0
)
bl_count
[
length
]
++
;
if
(
len
>
0
)
blCount
[
len
]
++
;
if
(
len
gth
>
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
_c
ode
=
[],
var
next
C
ode
=
[],
code
=
0
;
for
(
var
bits
=
1
;
bits
<=
MAX_BITS
;
++
bits
)
{
var
len
gth
=
bits
-
1
;
var
len
=
bits
-
1
;
// ensure undefined lengths are zero
if
(
bl
_count
[
length
]
==
undefined
)
bl_count
[
length
]
=
0
;
code
=
(
code
+
bl
_c
ount
[
bits
-
1
])
<<
1
;
next
_c
ode
[
bits
]
=
code
;
if
(
bl
Count
[
len
]
==
undefined
)
blCount
[
len
]
=
0
;
code
=
(
code
+
bl
C
ount
[
bits
-
1
])
<<
1
;
next
C
ode
[
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_c
ode[len],len) };
if
(
len
!=
=
0
)
{
table
[
next
Code
[
len
]]
=
{
length
:
len
,
symbol
:
n
};
//, bitstring: binaryValueToString(nextC
ode[len],len) };
tableLength
++
;
next
_c
ode
[
len
]
++
;
next
C
ode
[
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
...
...
cps/templates/detail.html
View file @
b4bd7507
...
...
@@ -42,7 +42,7 @@
{% if g.user.kindle_mail and g.user.is_authenticated %}
<a
href=
"{{url_for('send_to_kindle', book_id=entry.id)}}"
id=
"sendbtn"
class=
"btn btn-primary"
role=
"button"
><span
class=
"glyphicon glyphicon-send"
></span>
{{_('Send to Kindle')}}
</a>
{% endif %}
{% if (g.user.role_download() and g.user.is_anonymous
()
) or g.user.is_authenticated %}
{% if (g.user.role_download() and g.user.is_anonymous) or g.user.is_authenticated %}
<div
class=
"btn-group"
role=
"group"
>
<button
id=
"read-in-browser"
type=
"button"
class=
"btn btn-primary dropdown-toggle"
data-toggle=
"dropdown"
aria-haspopup=
"true"
aria-expanded=
"false"
>
<span
class=
"glyphicon glyphicon-eye-open"
></span>
{{_('Read in browser')}}
...
...
@@ -157,7 +157,7 @@
</p>
</div>
{% endif %}
{% if not g.user.is_anonymous
()
%}
{% if not g.user.is_anonymous %}
<div
class=
"custom_columns"
>
<p>
...
...
cps/templates/email_edit.html
View file @
b4bd7507
...
...
@@ -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>
...
...
cps/templates/index.html
View file @
b4bd7507
...
...
@@ -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 %}
...
...
cps/templates/index.xml
View file @
b4bd7507
...
...
@@ -34,7 +34,7 @@
<id>
{{url_for('feed_discover')}}
</id>
<content
type=
"text"
>
{{_('Show Random Books')}}
</content>
</entry>
{% if not current_user.is_anonymous
()
%}
{% if not current_user.is_anonymous %}
<entry>
<title>
{{_('Read Books')}}
</title>
<link
rel=
"subsection"
href=
"{{url_for('feed_read_books')}}"
type=
"application/atom+xml;profile=opds-catalog"
/>
...
...
cps/templates/layout.html
View file @
b4bd7507
...
...
@@ -34,7 +34,7 @@
</button>
<a
class=
"navbar-brand"
href=
"{{url_for('index')}}"
>
{{instance}}
</a>
</div>
{% if g.user.is_authenticated or g.user.is_anonymous
()
%}
{% if g.user.is_authenticated or g.user.is_anonymous %}
<form
class=
"navbar-form navbar-left"
role=
"search"
action=
"{{url_for('search')}}"
method=
"GET"
>
<div
class=
"form-group input-group input-group-sm"
>
<label
for=
"query"
class=
"sr-only"
>
{{_('Search')}}
</label>
...
...
@@ -46,13 +46,13 @@
</form>
{% endif %}
<div
class=
"navbar-collapse collapse"
>
{% if g.user.is_authenticated or g.user.is_anonymous
()
%}
{% if g.user.is_authenticated or g.user.is_anonymous %}
<ul
class=
"nav navbar-nav "
>
<li><a
href=
"{{url_for('advanced_search')}}"
><span
class=
"glyphicon glyphicon-search"
></span><span
class=
"hidden-sm"
>
{{_('Advanced Search')}}
</span></a></li>
</ul>
{% endif %}
<ul
class=
"nav navbar-nav navbar-right"
id=
"main-nav"
>
{% if g.user.is_authenticated or g.user.is_anonymous
()
%}
{% if g.user.is_authenticated or g.user.is_anonymous %}
{% if g.user.role_upload() or g.user.role_admin()%}
{% if g.allow_upload %}
<li>
...
...
@@ -68,7 +68,7 @@
<li><a
id=
"top_admin"
href=
"{{url_for('admin')}}"
><span
class=
"glyphicon glyphicon-dashboard"
></span><span
class=
"hidden-sm"
>
{{_('Admin')}}
</span></a></li>
{% endif %}
<li><a
id=
"top_user"
href=
"{{url_for('profile')}}"
><span
class=
"glyphicon glyphicon-user"
></span><span
class=
"hidden-sm"
>
{{g.user.nickname}}
</span></a></li>
{% if not g.user.is_anonymous
()
%}
{% if not g.user.is_anonymous %}
<li><a
id=
"logout"
href=
"{{url_for('logout')}}"
><span
class=
"glyphicon glyphicon-log-out"
></span><span
class=
"hidden-sm"
>
{{_('Logout')}}
</span></a></li>
{% endif %}
{% endif %}
...
...
@@ -99,7 +99,7 @@
{% endfor %}
<div
class=
"container-fluid"
>
<div
class=
"row-fluid"
>
{% if g.user.is_authenticated or g.user.is_anonymous
()
%}
{% if g.user.is_authenticated or g.user.is_anonymous %}
<div
class=
"col-sm-2"
>
<nav
class=
"navigation"
>
<ul
class=
"list-unstyled"
id=
"scnd-nav"
intent
in-standard-append=
"nav.navigation"
in-mobile-after=
"#main-nav"
in-mobile-class=
"nav navbar-nav"
>
...
...
@@ -136,11 +136,13 @@
{% if g.user.show_series() %}
<li
id=
"nav_serie"
><a
href=
"{{url_for('series_list')}}"
><span
class=
"glyphicon glyphicon-bookmark"
></span>
{{_('Series')}}
</a></li>
{%endif%}
{% if g.user.show_author() %}
<li
id=
"nav_author"
><a
href=
"{{url_for('author_list')}}"
><span
class=
"glyphicon glyphicon-user"
></span>
{{_('Authors')}}
</a></li>
{%endif%}
{% if g.user.filter_language() == 'all' and g.user.show_language() %}
<li
id=
"nav_lang"
><a
href=
"{{url_for('language_overview')}}"
><span
class=
"glyphicon glyphicon-flag"
></span>
{{_('Languages')}}
</a></li>
{%endif%}
{% if g.user.is_authenticated or g.user.is_anonymous
()
%}
{% if g.user.is_authenticated or g.user.is_anonymous %}
<li
class=
"nav-head hidden-xs"
>
{{_('Public Shelves')}}
</li>
{% for shelf in g.public_shelfes %}
<li><a
href=
"{{url_for('show_shelf', shelf_id=shelf.id)}}"
><span
class=
"glyphicon glyphicon-list"
></span>
{{shelf.name}}
</a></li>
...
...
@@ -149,7 +151,7 @@
{% for shelf in g.user.shelf %}
<li><a
href=
"{{url_for('show_shelf', shelf_id=shelf.id)}}"
><span
class=
"glyphicon glyphicon-list"
></span>
{{shelf.name}}
</a></li>
{% endfor %}
{% if not g.user.is_anonymous
()
%}
{% if not g.user.is_anonymous %}
<li
id=
"nav_createshelf"
class=
"create-shelf"
><a
href=
"{{url_for('create_shelf')}}"
>
{{_('Create a Shelf')}}
</a></li>
<li
id=
"nav_about"
><a
href=
"{{url_for('stats')}}"
><span
class=
"glyphicon glyphicon-info-sign"
></span>
{{_('About')}}
</a></li>
{% endif %}
...
...
cps/templates/read.html
View file @
b4bd7507
...
...
@@ -83,7 +83,8 @@
cssPath
:
"{{ url_for('static', filename='css/') }}"
,
bookUrl
:
"{{ url_for('static', filename=bookid) }}/"
,
bookmarkUrl
:
"{{ url_for('bookmark', book_id=bookid, book_format='EPUB') }}"
,
bookmark
:
"{{ bookmark.bookmark_key if bookmark != None }}"
bookmark
:
"{{ bookmark.bookmark_key if bookmark != None }}"
,
useBookmarks
:
{{
g
.
user
.
is_authenticated
|
tojson
}}
};
</script>
<script
src=
"{{ url_for('static', filename='js/libs/jquery.min.js') }}"
></script>
...
...
cps/ub.py
View file @
b4bd7507
...
...
@@ -51,7 +51,7 @@ DEVELOPMENT = False
class
UserBase
:
@
staticmethod
@
property
def
is_authenticated
(
self
):
return
True
...
...
@@ -97,11 +97,11 @@ class UserBase:
def
role_delete_books
(
self
):
return
bool
((
self
.
role
is
not
None
)
and
(
self
.
role
&
ROLE_DELETE_BOOKS
==
ROLE_DELETE_BOOKS
))
@
classmethod
@
property
def
is_active
(
self
):
return
True
@
classmethod
@
property
def
is_anonymous
(
self
):
return
False
...
...
@@ -172,6 +172,7 @@ class Anonymous(AnonymousUserMixin, UserBase):
settings
=
session
.
query
(
Settings
)
.
first
()
self
.
nickname
=
data
.
nickname
self
.
role
=
data
.
role
self
.
id
=
data
.
id
self
.
sidebar_view
=
data
.
sidebar_view
self
.
default_language
=
data
.
default_language
self
.
locale
=
data
.
locale
...
...
@@ -181,12 +182,17 @@ class Anonymous(AnonymousUserMixin, UserBase):
def
role_admin
(
self
):
return
False
@
property
def
is_active
(
self
):
return
False
@
property
def
is_anonymous
(
self
):
return
self
.
anon_browse
@
property
def
is_authenticated
(
self
):
return
False
# Baseclass representing Shelfs in calibre-web inapp.db
class
Shelf
(
Base
):
...
...
cps/web.py
View file @
b4bd7507
...
...
@@ -384,9 +384,12 @@ app.jinja_env.globals['url_for_other_page'] = url_for_other_page
def
login_required_if_no_ano
(
func
):
if
config
.
config_anonbrowse
==
1
:
return
func
return
login_required
(
func
)
@
wraps
(
func
)
def
decorated_view
(
*
args
,
**
kwargs
):
if
config
.
config_anonbrowse
==
1
:
return
func
(
*
args
,
**
kwargs
)
return
login_required
(
func
)(
*
args
,
**
kwargs
)
return
decorated_view
def
remote_login_required
(
f
):
...
...
@@ -1311,7 +1314,7 @@ def show_book(book_id):
for
entry
in
shelfs
:
book_in_shelfs
.
append
(
entry
.
shelf
)
if
not
current_user
.
is_anonymous
()
:
if
not
current_user
.
is_anonymous
:
matching_have_read_book
=
ub
.
session
.
query
(
ub
.
ReadBook
)
.
filter
(
ub
.
and_
(
ub
.
ReadBook
.
user_id
==
int
(
current_user
.
id
),
ub
.
ReadBook
.
book_id
==
book_id
))
.
all
()
have_read
=
len
(
matching_have_read_book
)
>
0
and
matching_have_read_book
[
0
]
.
is_read
...
...
@@ -1726,7 +1729,7 @@ def feed_get_cover(book_id):
def
render_read_books
(
page
,
are_read
,
as_xml
=
False
):
if
not
current_user
.
is_anonymous
()
:
if
not
current_user
.
is_anonymous
:
readBooks
=
ub
.
session
.
query
(
ub
.
ReadBook
)
.
filter
(
ub
.
ReadBook
.
user_id
==
int
(
current_user
.
id
))
.
filter
(
ub
.
ReadBook
.
is_read
==
True
)
.
all
()
readBookIds
=
[
x
.
book_id
for
x
in
readBooks
]
if
are_read
:
...
...
@@ -1799,7 +1802,9 @@ def read_book(book_id, book_format):
book_dir
=
os
.
path
.
join
(
config
.
get_main_dir
,
"cps"
,
"static"
,
str
(
book_id
))
if
not
os
.
path
.
exists
(
book_dir
):
os
.
mkdir
(
book_dir
)
bookmark
=
ub
.
session
.
query
(
ub
.
Bookmark
)
.
filter
(
ub
.
and_
(
ub
.
Bookmark
.
user_id
==
int
(
current_user
.
id
),
bookmark
=
None
if
current_user
.
is_authenticated
:
bookmark
=
ub
.
session
.
query
(
ub
.
Bookmark
)
.
filter
(
ub
.
and_
(
ub
.
Bookmark
.
user_id
==
int
(
current_user
.
id
),
ub
.
Bookmark
.
book_id
==
book_id
,
ub
.
Bookmark
.
format
==
book_format
.
upper
()))
.
first
()
if
book_format
.
lower
()
==
"epub"
:
...
...
@@ -2213,7 +2218,7 @@ def delete_shelf(shelf_id):
@
app
.
route
(
"/shelf/<int:shelf_id>"
)
@
login_required_if_no_ano
def
show_shelf
(
shelf_id
):
if
current_user
.
is_anonymous
()
:
if
current_user
.
is_anonymous
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
else
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
or_
(
ub
.
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
...
...
@@ -2248,7 +2253,7 @@ def order_shelf(shelf_id):
setattr
(
book
,
'order'
,
to_save
[
str
(
book
.
book_id
)])
counter
+=
1
ub
.
session
.
commit
()
if
current_user
.
is_anonymous
()
:
if
current_user
.
is_anonymous
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
else
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
or_
(
ub
.
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment