mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-22 06:50:47 -04:00
Start work on links/outlines in the new engine
This commit is contained in:
parent
abb8aa16e7
commit
cfd76b43e8
Binary file not shown.
@ -92,6 +92,31 @@ class BookIndexing
|
|||||||
this.last_check = [body.scrollWidth, body.scrollHeight]
|
this.last_check = [body.scrollWidth, body.scrollHeight]
|
||||||
return ans
|
return ans
|
||||||
|
|
||||||
|
all_links_and_anchors: () ->
|
||||||
|
body = document.body
|
||||||
|
links = []
|
||||||
|
anchors = {}
|
||||||
|
for a in document.querySelectorAll("body a[href], body [id], body a[name]")
|
||||||
|
if window.paged_display?.in_paged_mode
|
||||||
|
geom = window.paged_display.column_location(a)
|
||||||
|
else
|
||||||
|
br = a.getBoundingClientRect()
|
||||||
|
[left, top] = viewport_to_document(br.left, br.top, a.ownerDocument)
|
||||||
|
geom = {'left':left, 'top':top, 'width':br.right-br.left, 'height':br.bottom-br.top}
|
||||||
|
|
||||||
|
href = a.getAttribute('href')
|
||||||
|
if href
|
||||||
|
links.push([href, geom])
|
||||||
|
id = a.getAttribute("id")
|
||||||
|
if id and id not in anchors
|
||||||
|
anchors[id] = geom
|
||||||
|
if a.tagName in ['A', "a"]
|
||||||
|
name = a.getAttribute("name")
|
||||||
|
if name and name not in anchors
|
||||||
|
anchors[name] = geom
|
||||||
|
|
||||||
|
return {'links':links, 'anchors':anchors}
|
||||||
|
|
||||||
if window?
|
if window?
|
||||||
window.book_indexing = new BookIndexing()
|
window.book_indexing = new BookIndexing()
|
||||||
|
|
||||||
|
@ -242,6 +242,18 @@ class PagedDisplay
|
|||||||
# Return the number of the column that contains xpos
|
# Return the number of the column that contains xpos
|
||||||
return Math.floor(xpos/this.page_width)
|
return Math.floor(xpos/this.page_width)
|
||||||
|
|
||||||
|
column_location: (elem) ->
|
||||||
|
# Return the location of elem relative to its containing column
|
||||||
|
br = elem.getBoundingClientRect()
|
||||||
|
[left, top] = calibre_utils.viewport_to_document(br.left, br.top, elem.ownerDocument)
|
||||||
|
c = this.column_at(left)
|
||||||
|
width = Math.min(br.right, (c+1)*this.page_width) - br.left
|
||||||
|
if br.bottom < br.top
|
||||||
|
br.bottom = window.innerHeight
|
||||||
|
height = Math.min(br.bottom, window.innerHeight) - br.top
|
||||||
|
left -= c*this.page_width
|
||||||
|
return {'column':c, 'left':left, 'top':top, 'width':width, 'height':height}
|
||||||
|
|
||||||
column_boundaries: () ->
|
column_boundaries: () ->
|
||||||
# Return the column numbers at the left edge and after the right edge
|
# Return the column numbers at the left edge and after the right edge
|
||||||
# of the viewport
|
# of the viewport
|
||||||
|
@ -20,7 +20,6 @@ from calibre.ebooks.oeb.display.webview import load_html
|
|||||||
from calibre.ebooks.pdf.render.engine import PdfDevice
|
from calibre.ebooks.pdf.render.engine import PdfDevice
|
||||||
from calibre.ebooks.pdf.render.common import (inch, cm, mm, pica, cicero,
|
from calibre.ebooks.pdf.render.common import (inch, cm, mm, pica, cicero,
|
||||||
didot, PAPER_SIZES)
|
didot, PAPER_SIZES)
|
||||||
from calibre.ebooks.pdf.outline_writer import Outline
|
|
||||||
|
|
||||||
def get_page_size(opts, for_comic=False): # {{{
|
def get_page_size(opts, for_comic=False): # {{{
|
||||||
use_profile = not (opts.override_profile_size or
|
use_profile = not (opts.override_profile_size or
|
||||||
@ -145,7 +144,6 @@ class PDFWriter(QObject):
|
|||||||
|
|
||||||
def dump(self, items, out_stream, pdf_metadata):
|
def dump(self, items, out_stream, pdf_metadata):
|
||||||
opts = self.opts
|
opts = self.opts
|
||||||
self.outline = Outline(self.toc, items)
|
|
||||||
page_size = get_page_size(self.opts)
|
page_size = get_page_size(self.opts)
|
||||||
xdpi, ydpi = self.view.logicalDpiX(), self.view.logicalDpiY()
|
xdpi, ydpi = self.view.logicalDpiX(), self.view.logicalDpiY()
|
||||||
ml, mr = opts.margin_left, opts.margin_right
|
ml, mr = opts.margin_left, opts.margin_right
|
||||||
@ -254,11 +252,14 @@ class PDFWriter(QObject):
|
|||||||
paged_display.set_geometry(1, %d, %d, %d);
|
paged_display.set_geometry(1, %d, %d, %d);
|
||||||
paged_display.layout();
|
paged_display.layout();
|
||||||
paged_display.fit_images();
|
paged_display.fit_images();
|
||||||
|
py_bridge.value = book_indexing.all_links_and_anchors();
|
||||||
'''%(self.margin_top, self.margin_size, self.margin_bottom))
|
'''%(self.margin_top, self.margin_size, self.margin_bottom))
|
||||||
|
|
||||||
|
amap = self.bridge_value
|
||||||
|
if not isinstance(amap, dict):
|
||||||
|
amap = {'links':[], 'anchors':{}} # Some javascript error occurred
|
||||||
|
|
||||||
mf = self.view.page().mainFrame()
|
mf = self.view.page().mainFrame()
|
||||||
start_page = self.current_page_num
|
|
||||||
dx = 0
|
|
||||||
while True:
|
while True:
|
||||||
self.doc.init_page()
|
self.doc.init_page()
|
||||||
self.painter.save()
|
self.painter.save()
|
||||||
@ -268,18 +269,7 @@ class PDFWriter(QObject):
|
|||||||
self.doc.end_page()
|
self.doc.end_page()
|
||||||
if not nsl[1] or nsl[0] <= 0:
|
if not nsl[1] or nsl[0] <= 0:
|
||||||
break
|
break
|
||||||
dx = nsl[0]
|
evaljs('window.scrollTo(%d, 0)'%nsl[0])
|
||||||
evaljs('window.scrollTo(%d, 0)'%dx)
|
|
||||||
if self.doc.errors_occurred:
|
if self.doc.errors_occurred:
|
||||||
break
|
break
|
||||||
|
|
||||||
self.bridge_value = tuple(self.outline.anchor_map[self.current_item])
|
|
||||||
evaljs('py_bridge.value = book_indexing.anchor_positions(py_bridge.value)')
|
|
||||||
amap = self.bridge_value
|
|
||||||
if not isinstance(amap, dict):
|
|
||||||
amap = {} # Some javascript error occurred
|
|
||||||
self.outline.set_pos(self.current_item, None, start_page, 0)
|
|
||||||
for anchor, x in amap.iteritems():
|
|
||||||
pagenum, ypos = x
|
|
||||||
self.outline.set_pos(self.current_item, anchor, start_page + pagenum, ypos)
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user