mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Fix bug in re-using of previously loaded resources
This commit is contained in:
parent
aeeaa167ed
commit
4d0850e5fd
@ -17,7 +17,7 @@ def create_link_pat(book):
|
|||||||
return RegExp(book.manifest.link_uid + r'\|([^|]+)\|', 'g')
|
return RegExp(book.manifest.link_uid + r'\|([^|]+)\|', 'g')
|
||||||
|
|
||||||
def load_resources(db, book, root_name, previous_resources, proceed):
|
def load_resources(db, book, root_name, previous_resources, proceed):
|
||||||
ans = {}
|
ans = Object.create(None)
|
||||||
pending_resources = v'[root_name]'
|
pending_resources = v'[root_name]'
|
||||||
link_pat = create_link_pat(book)
|
link_pat = create_link_pat(book)
|
||||||
|
|
||||||
@ -28,12 +28,12 @@ def load_resources(db, book, root_name, previous_resources, proceed):
|
|||||||
proceed(ans)
|
proceed(ans)
|
||||||
return
|
return
|
||||||
name = pending_resources.shift()
|
name = pending_resources.shift()
|
||||||
if name in ans:
|
if ans[name]:
|
||||||
return setTimeout(do_one, 0)
|
return setTimeout(do_one, 0)
|
||||||
if name in previous_resources:
|
if previous_resources[name]:
|
||||||
ans[name] = data = previous_resources[name]
|
ans[name] = data = previous_resources[name]
|
||||||
if type(data) is 'string':
|
if type(data[0]) is 'string':
|
||||||
find_virtualized_resources(data)
|
find_virtualized_resources(data[0])
|
||||||
return setTimeout(do_one, 0)
|
return setTimeout(do_one, 0)
|
||||||
db.get_file(book, name, got_one)
|
db.get_file(book, name, got_one)
|
||||||
|
|
||||||
@ -54,6 +54,7 @@ def load_resources(db, book, root_name, previous_resources, proceed):
|
|||||||
def find_virtualized_resources(text):
|
def find_virtualized_resources(text):
|
||||||
seen = set()
|
seen = set()
|
||||||
already_pending = {x.name for x in pending_resources}
|
already_pending = {x.name for x in pending_resources}
|
||||||
|
link_pat.lastIndex = 0
|
||||||
while True:
|
while True:
|
||||||
m = link_pat.exec(text)
|
m = link_pat.exec(text)
|
||||||
if not m:
|
if not m:
|
||||||
@ -67,7 +68,7 @@ def load_resources(db, book, root_name, previous_resources, proceed):
|
|||||||
do_one()
|
do_one()
|
||||||
|
|
||||||
def finalize_resources(book, root_name, resource_data):
|
def finalize_resources(book, root_name, resource_data):
|
||||||
blob_url_map = {}
|
blob_url_map = Object.create(None)
|
||||||
root_data = None
|
root_data = None
|
||||||
link_pat = create_link_pat(book)
|
link_pat = create_link_pat(book)
|
||||||
|
|
||||||
@ -89,17 +90,18 @@ def finalize_resources(book, root_name, resource_data):
|
|||||||
def replace_deps(text):
|
def replace_deps(text):
|
||||||
replacements = v'[]'
|
replacements = v'[]'
|
||||||
unresolved_deps = set()
|
unresolved_deps = set()
|
||||||
|
link_pat.lastIndex = 0
|
||||||
while True:
|
while True:
|
||||||
m = link_pat.exec(text)
|
m = link_pat.exec(text)
|
||||||
if not m:
|
if not m:
|
||||||
break
|
break
|
||||||
dname, frag = decode_url(m[1])
|
dname, frag = decode_url(m[1])
|
||||||
if dname in blob_url_map:
|
if blob_url_map[dname]:
|
||||||
rtext = blob_url_map[dname]
|
rtext = blob_url_map[dname]
|
||||||
if frag:
|
if frag:
|
||||||
rtext += '#' + frag
|
rtext += '#' + frag
|
||||||
replacements.push(v'[m.index, m[0].length, rtext]')
|
replacements.push(v'[m.index, m[0].length, rtext]')
|
||||||
elif unresolved_deps:
|
else:
|
||||||
unresolved_deps.add(dname)
|
unresolved_deps.add(dname)
|
||||||
for index, sz, repl in reversed(replacements):
|
for index, sz, repl in reversed(replacements):
|
||||||
text = text[:index] + repl + text[index + sz:]
|
text = text[:index] + repl + text[index + sz:]
|
||||||
@ -111,14 +113,16 @@ def finalize_resources(book, root_name, resource_data):
|
|||||||
deps = unresolved_deps_map[name]
|
deps = unresolved_deps_map[name]
|
||||||
if not deps or not deps.length:
|
if not deps or not deps.length:
|
||||||
return False
|
return False
|
||||||
deps = [x for x in deps if x not in blob_url_map]
|
for x in deps:
|
||||||
return deps.length > 0
|
if not blob_url_map[x]:
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
resolved = v'[]'
|
resolved = v'[]'
|
||||||
num = 0
|
num = 0
|
||||||
for name in resource_data:
|
for name in resource_data:
|
||||||
if name not in blob_url_map:
|
if not blob_url_map[name]:
|
||||||
num += 1
|
num += 1
|
||||||
text, mimetype = resource_data[name]
|
text, mimetype = resource_data[name]
|
||||||
if not has_unresolvable_deps(name):
|
if not has_unresolvable_deps(name):
|
||||||
@ -130,11 +134,11 @@ def finalize_resources(book, root_name, resource_data):
|
|||||||
if not num:
|
if not num:
|
||||||
break
|
break
|
||||||
if not resolved.length:
|
if not resolved.length:
|
||||||
unresolved = [name for name in resource_data if name not in blob_url_map]
|
unresolved = [name for name in resource_data if not blob_url_map[name]]
|
||||||
print('ERROR: Could not resolve all dependencies of {} because of a cyclic dependency. Remaining deps: {}'.format(root_name, unresolved))
|
print('ERROR: Could not resolve all dependencies of {} because of a cyclic dependency. Remaining deps: {}'.format(root_name, unresolved))
|
||||||
# Add the items anyway, without resolving remaining deps
|
# Add the items anyway, without resolving remaining deps
|
||||||
for name in resource_data:
|
for name in resource_data:
|
||||||
if name not in blob_url_map:
|
if not blob_url_map[name]:
|
||||||
text, mimetype = resource_data[name]
|
text, mimetype = resource_data[name]
|
||||||
text = replace_deps(text)[1]
|
text = replace_deps(text)[1]
|
||||||
add_virtualized_resource(name, text, mimetype)
|
add_virtualized_resource(name, text, mimetype)
|
||||||
|
@ -115,7 +115,7 @@ class View:
|
|||||||
self.show_loading(book.metadata.title)
|
self.show_loading(book.metadata.title)
|
||||||
self.ui.db.update_last_read_time(book)
|
self.ui.db.update_last_read_time(book)
|
||||||
# TODO: Check for last open position of book
|
# TODO: Check for last open position of book
|
||||||
self.show_name(book.manifest.spine[0])
|
self.show_name(book.manifest.spine[1])
|
||||||
|
|
||||||
def show_name(self, name, initial_scroll_fraction=0):
|
def show_name(self, name, initial_scroll_fraction=0):
|
||||||
self.currently_showing = {'name':name, 'cfi':None, 'initial_scroll_fraction':initial_scroll_fraction}
|
self.currently_showing = {'name':name, 'cfi':None, 'initial_scroll_fraction':initial_scroll_fraction}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user