From 65ab46c72c51cdeb0f343efacb12402012ca7b90 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Feb 2017 20:17:10 +0530 Subject: [PATCH] Support direct editing of bookpos in the URL --- src/pyj/read_book/ui.pyj | 3 ++- src/pyj/read_book/view.pyj | 36 ++++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/pyj/read_book/ui.pyj b/src/pyj/read_book/ui.pyj index 66c1644b76..a1cf258baa 100644 --- a/src/pyj/read_book/ui.pyj +++ b/src/pyj/read_book/ui.pyj @@ -415,6 +415,7 @@ class ReadUI: same = False break if same: - pass # TODO: Implement this to move book position if different from current + if current_state.bookpos is not current_query.bookpos and current_query.bookpos: + self.view.goto_bookpos(current_query.bookpos) else: self.load_book(int(current_query.book_id), current_query.fmt, library_data.metadata[current_query.book_id]) diff --git a/src/pyj/read_book/view.pyj b/src/pyj/read_book/view.pyj index 926cc2c24f..f3e833d110 100644 --- a/src/pyj/read_book/view.pyj +++ b/src/pyj/read_book/view.pyj @@ -265,6 +265,20 @@ class View: def hide_loading(self): self.overlay.hide_loading_message() + def parse_cfi(self, encoded_cfi, book): + name = cfi = None + if encoded_cfi and encoded_cfi.startswith('epubcfi(/'): + cfi = encoded_cfi[len('epubcfi(/'):-1] + snum, rest = cfi.partition('/')[::2] + try: + snum = int(snum) + except Exception: + print('Invalid spine number in CFI:', snum) + if jstype(snum) is 'number': + name = book.manifest.spine[(int(snum) // 2) - 1] or name + cfi = '/' + rest + return name, cfi + def display_book(self, book): self.book = current_book.book = book self.ui.db.update_last_read_time(book) @@ -278,16 +292,10 @@ class View: cfi = q.bookpos elif book.last_read_position and book.last_read_position[unkey]: cfi = book.last_read_position[unkey] - if cfi and cfi.startswith('epubcfi(/'): - cfi = cfi[len('epubcfi(/'):-1] - snum, rest = cfi.partition('/')[::2] - try: - snum = int(snum) - except Exception: - print('Invalid spine number in CFI:', snum) - if jstype(snum) == 'number': - name = book.manifest.spine[(int(snum) // 2) - 1] or name - pos.type, pos.cfi = 'cfi', '/' + rest + cfiname, internal_cfi = self.parse_cfi(cfi, book) + if cfiname and internal_cfi: + name = cfiname + pos.type, pos.cfi = 'cfi', internal_cfi self.show_name(name, initial_position=pos) def redisplay_book(self): @@ -323,6 +331,14 @@ class View: def on_scroll_to_anchor(self, data): self.show_name(data.name, initial_position={'type':'anchor', 'anchor':data.frag, 'replace_history':False}) + def goto_bookpos(self, bookpos): + cfiname, internal_cfi = self.parse_cfi(bookpos, self.book) + if cfiname and internal_cfi: + pos = {} + name = cfiname + pos.type, pos.cfi = 'cfi', internal_cfi + self.show_name(name, initial_position=pos) + def goto_named_destination(self, name, frag): if self.currently_showing.name is name: self.send_message('scroll_to_anchor', frag=frag)