Start work on porting book reader

This commit is contained in:
Kovid Goyal 2017-02-15 18:04:01 +05:30
parent d0e94fdb12
commit 5b03d668ec
7 changed files with 39 additions and 20 deletions

View File

@ -14,7 +14,7 @@ from date import format_date
from session import get_interface_data
from utils import fmt_sidx, parse_url_params, conditional_timeout
from book_list.router import back
from book_list.router import back, open_book
from book_list.library_data import book_metadata, cover_url, set_book_metadata, current_library_id, library_data, download_url, load_status
from book_list.top_bar import create_top_bar, set_title, add_button
from book_list.ui import set_panel_handler
@ -311,7 +311,7 @@ def preferred_format(book_id):
def read_format(book_id, fmt):
get_boss().read_book(self.current_book_id, fmt, self.interface_data.metadata[self.current_book_id])
open_book(book_id, fmt)
def read_book(book_id):

View File

@ -33,3 +33,9 @@ def get_translations(val):
if val:
get_translations.ans = val
return get_translations.ans
def get_read_ui(val):
if val:
get_read_ui.ans = val
return get_read_ui.ans

View File

@ -15,7 +15,7 @@ from book_list.constants import book_list_container_id, read_book_container_id
from book_list.library_data import fetch_init_data, update_library_data, url_books_query
from book_list.theme import get_color
from book_list.router import update_window_title, set_default_mode_handler, apply_url, set_mode_handler, on_pop_state
from book_list.globals import get_db, set_session_data
from book_list.globals import get_db, set_session_data, get_read_ui
from book_list.ui import apply_url_state as book_list_mode_handler
from read_book.ui import ReadUI
@ -43,10 +43,8 @@ def onerror(msg, script_url, line_number, column_number, error_object):
except:
console.log('There was an error in the unhandled exception handler')
read_ui = None
def init_ui():
nonlocal read_ui
install_event_filters()
set_default_mode_handler(book_list_mode_handler)
window.onerror = onerror
@ -69,6 +67,7 @@ def init_ui():
read_ui = ReadUI()
get_db(read_ui.db)
set_mode_handler('read_book', read_ui.apply_url_state.bind(read_ui))
get_read_ui(read_ui)
apply_url()

View File

@ -48,11 +48,11 @@ def apply_url(ignore_handler):
handler(data)
history_count = 0
def open_book(book_id, fmt, replace=False):
push_state({'book_id':book_id, 'fmt':fmt}, replace=replace, mode=read_book_mode)
def push_state(query, replace=False, mode='book_list', call_handler=True):
nonlocal history_count
query = {k:query[k] for k in query}
if mode is not 'book_list':
query.mode = mode
@ -61,19 +61,18 @@ def push_state(query, replace=False, mode='book_list', call_handler=True):
window.history.replaceState(None, '', query)
else:
window.history.pushState(None, '', query)
history_count += 1
push_state.history_count += 1
apply_url(not call_handler)
push_state.history_count = 0
def on_pop_state(ev):
nonlocal history_count
history_count = max(0, history_count - 1)
push_state.history_count = max(0, push_state.history_count - 1)
apply_url()
def back():
nonlocal history_count
if history_count > 0:
if push_state.history_count > 0:
window.history.back()
else:
cq = get_current_query()

View File

@ -6,8 +6,11 @@ from gettext import gettext as _
from encodings import base64encode, base64decode
from modals import error_dialog
from book_list.library_data import current_library_id
from book_list.router import is_reading_book
current_library_id
def upgrade_schema(idb, old_version, new_version):
print('upgrade_schema:', old_version, new_version)
if not idb.objectStoreNames.contains('books'):
@ -128,7 +131,7 @@ class DB:
# The key has to be a JavaScript array as otherwise it cannot be stored
# into indexed db, because the RapydScript list has properties that
# refer to non-serializable objects like functions.
key = v'[self.interface_data.library_id, book_id, fmt]'
key = v'[current_library_id(), book_id, fmt]'
self.do_op(['books'], key, _('Failed to read from the books database'), def(result):
proceed(result or {
'key':key,

View File

@ -13,6 +13,7 @@ from utils import human_readable, debounce
from book_list.constants import read_book_container_id
from read_book.db import get_db
from book_list.router import update_window_title
from book_list.library_data import library_data, current_library_id
from read_book.view import View
RENDER_VERSION = __RENDER_VERSION__
@ -21,6 +22,7 @@ MATHJAX_VERSION = "__MATHJAX_VERSION__"
class ReadUI:
def __init__(self):
self.base_url_data = {}
self.current_metadata = {'title': _('Unknown book')}
self.current_book_id = None
self.manifest_xhr = None
@ -72,7 +74,7 @@ class ReadUI:
a = div.lastChild.firstChild
if self.current_book_id:
a.setAttribute('href', encode_query({
'library_id':self.interface_data.library_id,
'library_id':current_library_id(),
'book-id': (self.current_book_id + ''),
'panel':'book-details'
}))
@ -106,7 +108,7 @@ class ReadUI:
def reload_book(self):
book_id = self.base_url_data.book_id
metadata = self.metadata or self.interface_data.metadata[book_id]
metadata = self.metadata or library_data.metadata[book_id]
self.load_book(book_id, self.base_url_data.fmt, metadata, True)
def redisplay_book(self):
@ -136,7 +138,7 @@ class ReadUI:
def start_load(self, book_id, fmt, metadata, force_reload):
self.current_book_id = book_id
metadata = metadata or self.interface_data.metadata[book_id]
metadata = metadata or library_data.metadata[book_id]
self.current_metadata = metadata or {'title':_('Book id #') + book_id}
update_window_title('', self.current_metadata.title)
self.init_ui()
@ -406,4 +408,13 @@ class ReadUI:
self.view.display_book(book)
def apply_url_state(self, current_query):
pass
same = True
current_state = self.url_data
for k in v"['book_id', 'fmt']":
if str(current_query[k]) is not str(current_state[k]):
same = False
break
if same:
pass # TODO: Implement this to move book position if different from current
else:
self.load_book(int(current_query.book_id), current_query.fmt, library_data.metadata[current_query.book_id])

View File

@ -6,6 +6,7 @@ from dom import set_css, add_extra_css, build_rule, svgicon
from elementmaker import E
from gettext import gettext as _
from utils import html_escape
from session import get_interface_data
from modals import error_dialog, warning_dialog
from book_list.globals import get_session_data, main_js, get_translations
@ -269,7 +270,7 @@ class View:
self.ui.db.update_last_read_time(book)
self.loaded_resources = {}
pos = {'replace_history':True}
unkey = username_key(self.ui.interface_data.username)
unkey = username_key(get_interface_data().username)
name = book.manifest.spine[0]
cfi = None
q = parse_url_params()
@ -355,8 +356,8 @@ class View:
def on_update_cfi(self, data):
self.currently_showing.bookpos = data.cfi
push_state(self.url_data, replace=data.replace_history, mode=read_book_mode)
unkey = username_key(self.ui.interface_data.username)
push_state(self.ui.url_data, replace=data.replace_history, mode=read_book_mode)
unkey = username_key(get_interface_data().username)
if not self.book.last_read_position:
self.book.last_read_position = {}
self.book.last_read_position[unkey] = data.cfi