From 9b8e737920ac3dcd647d731e27d16f0161c85a6a Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 26 Oct 2007 18:06:51 +0000 Subject: [PATCH] Handle anchors within tables. --- src/libprs500/ebooks/lrf/html/convert_from.py | 87 +++++++++---------- src/libprs500/ebooks/lrf/html/table.py | 15 ++-- 2 files changed, 48 insertions(+), 54 deletions(-) diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index 84ae3446c0..012710227c 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -220,9 +220,6 @@ class HTMLConverter(object): self.unindented_style = book.create_text_style(parindent=0) - # Set by table processing code so that any within the table - # point to the previous element - self.anchor_to_previous = None self.in_table = False # List processing self.list_level = 0 @@ -1213,51 +1210,43 @@ class HTMLConverter(object): return False def process_anchor(self, tag, tag_css, tag_pseudo_css): - key = 'name' if tag.has_key('name') else 'id' - name = tag[key].replace('#', '') - if self.anchor_to_previous: + if not self.in_table: # Anchors in tables are handled separately + key = 'name' if tag.has_key('name') else 'id' + name = tag[key].replace('#', '') + previous = self.current_block self.process_children(tag, tag_css, tag_pseudo_css) - for c in self.anchor_to_previous.contents: - if isinstance(c, (TextBlock, ImageBlock)): - self.targets[self.target_prefix+tag[key]] = c - return - tb = self.book.create_text_block() - tb.Paragraph(" ") - self.anchor_to_previous.append(tb) - self.targets[self.target_prefix+name] = tb - return - previous = self.current_block - self.process_children(tag, tag_css, tag_pseudo_css) - target = None - - if self.current_block == previous: - self.current_block.must_append = True - target = self.current_block + target = None + + if self.current_block == previous: + self.current_block.must_append = True + target = self.current_block + else: + found = False + for item in self.current_page.contents: + if item == previous: + found = True + continue + if found: + target = item + break + if target and not isinstance(target, (TextBlock, ImageBlock)): + if isinstance(target, RuledLine): + target = self.book.create_text_block(textStyle=self.current_block.textStyle, + blockStyle=self.current_block.blockStyle) + target.Paragraph(' ') + self.current_page.append(target) + else: + target = BlockSpace() + self.current_page.append(target) + if target == None: + if self.current_block.has_text(): + target = self.current_block + else: + target = BlockSpace() + self.current_page.append(target) + self.targets[self.target_prefix+name] = target else: - found = False - for item in self.current_page.contents: - if item == previous: - found = True - continue - if found: - target = item - break - if target and not isinstance(target, (TextBlock, ImageBlock)): - if isinstance(target, RuledLine): - target = self.book.create_text_block(textStyle=self.current_block.textStyle, - blockStyle=self.current_block.blockStyle) - target.Paragraph(' ') - self.current_page.append(target) - else: - target = BlockSpace() - self.current_page.append(target) - if target == None: - if self.current_block.has_text(): - target = self.current_block - else: - target = BlockSpace() - self.current_page.append(target) - self.targets[self.target_prefix+name] = target + self.process_children(tag, tag_css, tag_pseudo_css) def parse_tag(self, tag, parent_css): try: @@ -1540,12 +1529,14 @@ class HTMLConverter(object): table = Table(self, tag, tag_css, rowpad=rowpad, colpad=10) canvases = [] ps = self.current_page.pageStyle.attrs - for block, xpos, ypos, delta in table.blocks(int(ps['textwidth']), int(ps['textheight'])): + for block, xpos, ypos, delta, targets in table.blocks(int(ps['textwidth']), int(ps['textheight'])): if not block: if ypos > int(ps['textheight']): - raise Exception, 'Table has cell that is too large' + raise Exception, 'Table has cell that is too large' canvases.append(Canvas(int(self.current_page.pageStyle.attrs['textwidth']), ypos+rowpad, blockrule='block-fixed')) + for name in targets: + self.targets[self.target_prefix+name] = canvases[-1] else: canvases[-1].put_object(block, xpos + int(delta/2.), ypos) diff --git a/src/libprs500/ebooks/lrf/html/table.py b/src/libprs500/ebooks/lrf/html/table.py index 303aa1e592..292ccae677 100644 --- a/src/libprs500/ebooks/lrf/html/table.py +++ b/src/libprs500/ebooks/lrf/html/table.py @@ -221,9 +221,15 @@ class Row(object): self.cells = [] self.colpad = colpad cells = row.findAll(re.compile('td|th', re.IGNORECASE)) + self.targets = [] for cell in cells: ccss = conv.tag_css(cell, css)[0] - self.cells.append(Cell(conv, cell, ccss)) + self.cells.append(Cell(conv, cell, ccss)) + for a in row.findAll('a'): + name = a['name'] if a.has_key('name') else a['id'] if a.has_key('id') else None + if name is not None: + self.targets.append(name.replace('#', '')) + def number_of_cells(self): '''Number of cells in this row. Respects colspan''' @@ -284,14 +290,11 @@ class Table(object): self.rowpad = rowpad self.colpad = colpad rows = table.findAll('tr') - conv.anchor_to_previous = conv.current_page conv.in_table = True for row in rows: rcss = conv.tag_css(row, css)[0] self.rows.append(Row(conv, row, rcss, colpad)) conv.in_table = False - conv.anchor_to_previous = None - def number_of_columns(self): max = 0 @@ -373,7 +376,7 @@ class Table(object): if delta < 0: delta = 0 for r in range(len(cellmatrix)): - yield None, 0, heights[r], 0 + yield None, 0, heights[r], 0, self.rows[r].targets for c in range(len(cellmatrix[r])): cell = cellmatrix[r][c] if not cell: @@ -386,7 +389,7 @@ class Table(object): blockheight=cell.text_block_size(tb, width)[1], blockrule='horz-fixed') - yield tb, xpos[c], sypos, delta + yield tb, xpos[c], sypos, delta, None sypos += tb.blockStyle.attrs['blockheight']