mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Update RapydScript
This commit is contained in:
parent
37f604c0a1
commit
d559ab9e01
Binary file not shown.
@ -1,26 +1,28 @@
|
||||
# vim:fileencoding=utf-8
|
||||
# License: BSD Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
||||
|
||||
def base64encode(bytes):
|
||||
def base64encode(bytes, altchars, pad_char):
|
||||
# Convert an array of bytes into a base-64 encoded string
|
||||
l = bytes.length
|
||||
remainder = l % 3
|
||||
main_length = l - remainder
|
||||
encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
|
||||
encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + (altchars or '+/')
|
||||
pad_char = '=' if pad_char is undefined else pad_char
|
||||
ans = v'[]'
|
||||
for v'var i = 0; i < main_length; i += 3':
|
||||
chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]
|
||||
ans.push(encodings[(chunk & 16515072) >> 18], encodings[(chunk & 258048) >> 12], encodings[(chunk & 4032) >> 6], encodings[chunk & 63])
|
||||
if remainder is 1:
|
||||
chunk = bytes[main_length]
|
||||
ans.push(encodings[(chunk & 252) >> 2], encodings[(chunk & 3) << 4], '=', '=')
|
||||
ans.push(encodings[(chunk & 252) >> 2], encodings[(chunk & 3) << 4], pad_char, pad_char)
|
||||
elif remainder is 2:
|
||||
chunk = (bytes[main_length] << 8) | bytes[main_length + 1]
|
||||
ans.push(encodings[(chunk & 64512) >> 10], encodings[(chunk & 1008) >> 4], encodings[(chunk & 15) << 2], '=')
|
||||
ans.push(encodings[(chunk & 64512) >> 10], encodings[(chunk & 1008) >> 4], encodings[(chunk & 15) << 2], pad_char)
|
||||
return ans.join('')
|
||||
|
||||
def base64decode(string):
|
||||
# convert the output of base64encode back into an array of bytes (Uint8Array)
|
||||
# convert the output of base64encode back into an array of bytes
|
||||
# (Uint8Array) only works with the standard altchars and pad_char
|
||||
if jstype(window) is not 'undefined':
|
||||
chars = window.atob(string)
|
||||
else:
|
||||
@ -30,6 +32,13 @@ def base64decode(string):
|
||||
ans[i] = chars.charCodeAt(i)
|
||||
return ans
|
||||
|
||||
def urlsafe_b64encode(bytes, pad_char):
|
||||
return base64encode(bytes, '-_', pad_char)
|
||||
|
||||
def urlsafe_b64decode(string):
|
||||
string = String.prototype.replace.call(string, /[_-]/g, def(m): return '+' if m is '-' else '/';)
|
||||
return base64decode(string)
|
||||
|
||||
def hexlify(bytes):
|
||||
ans = v'[]'
|
||||
for v'var i = 0; i < bytes.length; i++':
|
||||
|
77
resources/rapydscript/lib/uuid.pyj
Normal file
77
resources/rapydscript/lib/uuid.pyj
Normal file
@ -0,0 +1,77 @@
|
||||
# vim:fileencoding=utf-8
|
||||
# License: BSD Copyright: 2017, Kovid Goyal <kovid at kovidgoyal.net>
|
||||
# globals: crypto
|
||||
from __python__ import hash_literals
|
||||
|
||||
from encodings import hexlify, urlsafe_b64decode, urlsafe_b64encode
|
||||
|
||||
RFC_4122 = 1
|
||||
|
||||
if jstype(crypto) is 'object' and crypto.getRandomValues:
|
||||
random_bytes = def (num):
|
||||
ans = Uint8Array(num or 16)
|
||||
crypto.getRandomValues(ans)
|
||||
return ans
|
||||
else:
|
||||
random_bytes = def (num):
|
||||
ans = Uint8Array(num or 16)
|
||||
for i in range(ans.length):
|
||||
ans[i] = Math.floor(Math.random() * 256)
|
||||
return ans
|
||||
|
||||
|
||||
def uuid4_bytes():
|
||||
data = random_bytes()
|
||||
data[6] = 0b01000000 | (data[6] & 0b1111)
|
||||
data[8] = (((data[8] >> 4) & 0b11 | 0b1000) << 4) | (data[8] & 0b1111)
|
||||
return data
|
||||
|
||||
|
||||
def as_str():
|
||||
h = this.hex
|
||||
return h[:8] + '-' + h[8:12] + '-' + h[12:16] + '-' + h[16:20] + '-' + h[20:]
|
||||
|
||||
|
||||
def uuid4():
|
||||
b = uuid4_bytes()
|
||||
return {
|
||||
'hex': hexlify(b),
|
||||
'bytes': b,
|
||||
'variant': RFC_4122,
|
||||
'version': 4,
|
||||
'__str__': as_str,
|
||||
'toString': as_str,
|
||||
}
|
||||
|
||||
|
||||
def num_to_string(numbers, alphabet, pad_to_length):
|
||||
ans = v'[]'
|
||||
alphabet_len = alphabet.length
|
||||
numbers = Array.prototype.slice.call(numbers)
|
||||
for v'var i = 0; i < numbers.length - 1; i++':
|
||||
x = divmod(numbers[i], alphabet_len)
|
||||
numbers[i] = x[0]
|
||||
numbers[i+1] += x[1]
|
||||
for v'var i = 0; i < numbers.length; i++':
|
||||
number = numbers[i]
|
||||
while number:
|
||||
x = divmod(number, alphabet_len)
|
||||
number = x[0]
|
||||
ans.push(alphabet[x[1]])
|
||||
if pad_to_length and pad_to_length > ans.length:
|
||||
ans.push(alphabet[0].repeat(pad_to_length - ans.length))
|
||||
return ans.join('')
|
||||
|
||||
|
||||
def short_uuid():
|
||||
# A totally random uuid encoded using only URL and filename safe characters
|
||||
return urlsafe_b64encode(random_bytes(), '')
|
||||
|
||||
|
||||
def short_uuid4():
|
||||
# A uuid4 encoded using only URL and filename safe characters
|
||||
return urlsafe_b64encode(uuid4_bytes(), '')
|
||||
|
||||
|
||||
def decode_short_uuid(val):
|
||||
return urlsafe_b64decode(val + '==')
|
Loading…
x
Reference in New Issue
Block a user