mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-08 02:34:06 -04:00
...
This commit is contained in:
parent
d21f3ffb52
commit
bd7796bcd2
@ -143,6 +143,14 @@ class Column(object):
|
|||||||
def add(self, elem):
|
def add(self, elem):
|
||||||
if elem in self.elements: return
|
if elem in self.elements: return
|
||||||
self.elements.append(elem)
|
self.elements.append(elem)
|
||||||
|
self._post_add()
|
||||||
|
|
||||||
|
def prepend(self, elem):
|
||||||
|
if elem in self.elements: return
|
||||||
|
self.elements.insert(0, elem)
|
||||||
|
self._post_add()
|
||||||
|
|
||||||
|
def _post_add(self):
|
||||||
self.elements.sort(cmp=lambda x,y:cmp(x.bottom,y.bottom))
|
self.elements.sort(cmp=lambda x,y:cmp(x.bottom,y.bottom))
|
||||||
self.top = self.elements[0].top
|
self.top = self.elements[0].top
|
||||||
self.bottom = self.elements[-1].bottom
|
self.bottom = self.elements[-1].bottom
|
||||||
@ -307,16 +315,14 @@ class Region(object):
|
|||||||
self.absorb_region(region, at)
|
self.absorb_region(region, at)
|
||||||
|
|
||||||
def absorb_region(self, region, at):
|
def absorb_region(self, region, at):
|
||||||
src_iter = lambda x:x if at == 'bottom' else reversed
|
|
||||||
if len(region.columns) <= len(self.columns):
|
if len(region.columns) <= len(self.columns):
|
||||||
for i in range(len(region.columns)):
|
for i in range(len(region.columns)):
|
||||||
src, dest = region.columns[i], self.columns[i]
|
src, dest = region.columns[i], self.columns[i]
|
||||||
for elem in src_iter(src):
|
if at != 'bottom':
|
||||||
if at == 'bottom':
|
src = reversed(list(iter(src)))
|
||||||
dest.append(elem)
|
for elem in src:
|
||||||
else:
|
func = dest.add if at == 'bottom' else dest.prepend
|
||||||
dest.insert(0, elem)
|
func(elem)
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
col_map = {}
|
col_map = {}
|
||||||
@ -331,15 +337,16 @@ class Region(object):
|
|||||||
max_overlap_index = j
|
max_overlap_index = j
|
||||||
col_map[i] = max_overlap_index
|
col_map[i] = max_overlap_index
|
||||||
lines = max(map(len, region.columns))
|
lines = max(map(len, region.columns))
|
||||||
for i in range(src_iter(lines)):
|
if at == 'bottom':
|
||||||
|
lines = range(lines)
|
||||||
|
else:
|
||||||
|
lines = range(lines-1, -1, -1)
|
||||||
|
for i in lines:
|
||||||
for j, src in enumerate(region.columns):
|
for j, src in enumerate(region.columns):
|
||||||
dest = self.columns[col_map[j]]
|
dest = self.columns[col_map[j]]
|
||||||
if i < len(src):
|
if i < len(src):
|
||||||
if at == 'bottom':
|
func = dest.add if at == 'bottom' else dest.prepend
|
||||||
dest.append(src[i])
|
func(src.elements[i])
|
||||||
else:
|
|
||||||
dest.insert(0, src[i])
|
|
||||||
|
|
||||||
|
|
||||||
def linearize(self):
|
def linearize(self):
|
||||||
self.elements = []
|
self.elements = []
|
||||||
@ -480,6 +487,8 @@ class Page(object):
|
|||||||
while found:
|
while found:
|
||||||
found = False
|
found = False
|
||||||
for i, region in enumerate(self.regions):
|
for i, region in enumerate(self.regions):
|
||||||
|
if region in absorbed:
|
||||||
|
continue
|
||||||
if region.is_small:
|
if region.is_small:
|
||||||
found = True
|
found = True
|
||||||
regions = [region]
|
regions = [region]
|
||||||
@ -504,23 +513,24 @@ class Page(object):
|
|||||||
absorb_into = None
|
absorb_into = None
|
||||||
else:
|
else:
|
||||||
absorb_into = prev_region
|
absorb_into = prev_region
|
||||||
if next_region.line_count >= prev_region.line_count:
|
if self.regions[next_region].line_count >= \
|
||||||
|
self.regions[prev_region].line_count:
|
||||||
avg_column_count = sum([len(r.columns) for r in
|
avg_column_count = sum([len(r.columns) for r in
|
||||||
regions])/float(len(regions))
|
regions])/float(len(regions))
|
||||||
if next_region.line_count > prev_region.line_count \
|
if self.regions[next_region].line_count > \
|
||||||
or abs(avg_column_count - len(prev_region.columns)) \
|
self.regions[prev_region].line_count \
|
||||||
> abs(avg_column_count - len(next_region.columns)):
|
or abs(avg_column_count -
|
||||||
|
len(self.regions[prev_region].columns)) \
|
||||||
|
> abs(avg_column_count -
|
||||||
|
len(self.regions[next_region].columns)):
|
||||||
absorb_into = next_region
|
absorb_into = next_region
|
||||||
absorb_at = 'top'
|
absorb_at = 'top'
|
||||||
if absorb_into is not None:
|
if absorb_into is not None:
|
||||||
absorb_into.absorb_regions(regions, absorb_at)
|
self.regions[absorb_into].absorb_regions(regions, absorb_at)
|
||||||
absorbed.update(regions)
|
absorbed.update(regions)
|
||||||
i = j
|
|
||||||
for region in absorbed:
|
for region in absorbed:
|
||||||
self.regions.remove(region)
|
self.regions.remove(region)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def sort_into_columns(self, elem, neighbors):
|
def sort_into_columns(self, elem, neighbors):
|
||||||
neighbors.add(elem)
|
neighbors.add(elem)
|
||||||
neighbors = sorted(neighbors, cmp=lambda x,y:cmp(x.left, y.left))
|
neighbors = sorted(neighbors, cmp=lambda x,y:cmp(x.left, y.left))
|
||||||
@ -639,8 +649,9 @@ class PDFDocument(object):
|
|||||||
for elem in self.elements:
|
for elem in self.elements:
|
||||||
html.extend(elem.to_html())
|
html.extend(elem.to_html())
|
||||||
html += ['</body>', '</html>']
|
html += ['</body>', '</html>']
|
||||||
|
raw = (u'\n'.join(html)).replace('</strong><strong>', '')
|
||||||
with open('index.html', 'wb') as f:
|
with open('index.html', 'wb') as f:
|
||||||
f.write((u'\n'.join(html)).encode('utf-8'))
|
f.write(raw.encode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user