mirror of
https://github.com/kovidgoyal/calibre.git
synced 2026-04-14 13:11:56 -04:00
165 lines
4.8 KiB
Plaintext
165 lines
4.8 KiB
Plaintext
# vim:fileencoding=utf-8
|
|
# License: GPL v3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
|
|
from __python__ import hash_literals
|
|
|
|
from aes import GCM, random_bytes
|
|
from encodings import hexlify
|
|
from gettext import gettext as _, register_callback, gettext as gt
|
|
from utils import is_ios
|
|
|
|
_boss = None
|
|
|
|
def set_boss(b):
|
|
nonlocal _boss
|
|
_boss = b
|
|
|
|
def get_boss():
|
|
return _boss
|
|
|
|
def current_book():
|
|
return current_book.book
|
|
current_book.book = None
|
|
|
|
class Messenger:
|
|
|
|
def __init__(self):
|
|
self.secret = Uint8Array(64)
|
|
|
|
def reset(self):
|
|
window.crypto.getRandomValues(self.secret)
|
|
self.gcm_to_iframe = GCM(self.secret.subarray(0, 32))
|
|
self.gcm_from_iframe = GCM(self.secret.subarray(32))
|
|
|
|
def encrypt(self, data):
|
|
return self.gcm_to_iframe.encrypt(JSON.stringify(data))
|
|
|
|
def decrypt(self, data):
|
|
return JSON.parse(self.gcm_from_iframe.decrypt(data))
|
|
|
|
messenger = Messenger()
|
|
iframe_id = 'read-book-iframe'
|
|
uid = 'calibre-' + hexlify(random_bytes(12))
|
|
scroll_viewport = {}
|
|
|
|
def flow_viewport_x():
|
|
return window.pageXOffset
|
|
|
|
def flow_viewport_y():
|
|
return window.pageYOffset
|
|
|
|
def flow_viewport_scroll_to(x, y):
|
|
window.scrollTo(x, y)
|
|
|
|
def flow_viewport_scroll_into_view(elem):
|
|
elem.scrollIntoView()
|
|
|
|
def flow_reset_globals():
|
|
pass
|
|
|
|
def paged_viewport_y():
|
|
return 0
|
|
|
|
scroll_viewport.x = flow_viewport_x
|
|
scroll_viewport.y = flow_viewport_y
|
|
scroll_viewport.scroll_to = flow_viewport_scroll_to
|
|
scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view
|
|
scroll_viewport.reset_globals = flow_reset_globals
|
|
|
|
if is_ios:
|
|
window_width = def ():
|
|
return window_width.from_parent or window.innerWidth
|
|
window_height = def():
|
|
return window_height.from_parent or window.innerHeight
|
|
paged_viewport_scroll_to = def (x, y):
|
|
if x is 0:
|
|
document.documentElement.style.transform = 'none'
|
|
else:
|
|
x *= -1
|
|
document.documentElement.style.transform = f'translateX({x}px)'
|
|
boss = get_boss()
|
|
if boss:
|
|
boss.onscroll()
|
|
paged_viewport_x = def():
|
|
raw = document.documentElement.style.transform
|
|
if not raw or raw is 'none':
|
|
return 0
|
|
raw = raw[12:]
|
|
ans = parseInt(raw)
|
|
if isNaN(ans):
|
|
return 0
|
|
return ans
|
|
paged_viewport_scroll_into_view = def(elem):
|
|
left = elem.offsetLeft
|
|
if left is None:
|
|
return # element has display: none
|
|
elem.scrollIntoView()
|
|
window.scrollTo(0, 0)
|
|
p = elem.offsetParent
|
|
while p:
|
|
left += p.offsetLeft
|
|
p = p.offsetParent
|
|
# left -= window_width() // 2
|
|
paged_viewport_scroll_to(max(0, left), 0)
|
|
paged_reset_globals = def():
|
|
document.documentElement.style.transform = 'none'
|
|
|
|
else:
|
|
window_width = def():
|
|
return window.innerWidth
|
|
window_height = def():
|
|
return window.innerHeight
|
|
paged_viewport_scroll_to = flow_viewport_scroll_to
|
|
paged_viewport_x = flow_viewport_x
|
|
paged_viewport_scroll_into_view = flow_viewport_scroll_into_view
|
|
paged_reset_globals = flow_reset_globals
|
|
|
|
scroll_viewport.width = window_width
|
|
scroll_viewport.height = window_height
|
|
|
|
|
|
def current_layout_mode():
|
|
return current_layout_mode.value
|
|
current_layout_mode.value = 'flow'
|
|
|
|
def set_layout_mode(val):
|
|
current_layout_mode.value = val
|
|
if val is 'flow':
|
|
scroll_viewport.x = flow_viewport_x
|
|
scroll_viewport.y = flow_viewport_y
|
|
scroll_viewport.scroll_to = flow_viewport_scroll_to
|
|
scroll_viewport.scroll_into_view = flow_viewport_scroll_into_view
|
|
scroll_viewport.reset_globals = flow_reset_globals
|
|
else:
|
|
scroll_viewport.x = paged_viewport_x
|
|
scroll_viewport.y = paged_viewport_y
|
|
scroll_viewport.scroll_to = paged_viewport_scroll_to
|
|
scroll_viewport.scroll_into_view = paged_viewport_scroll_into_view
|
|
scroll_viewport.reset_globals = paged_reset_globals
|
|
|
|
def current_spine_item():
|
|
return current_spine_item.value
|
|
current_spine_item.value = None
|
|
|
|
def set_current_spine_item(val):
|
|
current_spine_item.value = val
|
|
|
|
def toc_anchor_map():
|
|
return toc_anchor_map.value
|
|
|
|
def set_toc_anchor_map(val):
|
|
toc_anchor_map.value = val
|
|
|
|
default_color_schemes = {
|
|
'white':{'foreground':'#000000', 'background':'#ffffff', 'name':_('White')},
|
|
'black':{'foreground':'#ffffff', 'background':'#000000', 'name':_('Black')},
|
|
'sepia-light':{'foreground':'#39322B', 'background':'#F6F3E9', 'name':_('Sepia light')},
|
|
'sepia-dark': {'background':'#39322B', 'foreground':'#F6F3E9', 'name':_('Sepia dark')},
|
|
}
|
|
|
|
register_callback(def():
|
|
# Ensure the color scheme names are translated
|
|
for key in default_color_schemes:
|
|
scheme = default_color_schemes[key]
|
|
scheme.name = gt(scheme.name)
|
|
)
|