calibre/src/pyj/read_book/globals.pyj

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)
)