X-Git-Url: https://git.mdrn.pl/librarian.git/blobdiff_plain/bd97f61d25eb0c3e51a29286c7de509146eceb37..011b98a4661b754a0789ae78e145437b5b86e5fe:/src/librarian/elements/base.py diff --git a/src/librarian/elements/base.py b/src/librarian/elements/base.py index 8e83311..2349f16 100644 --- a/src/librarian/elements/base.py +++ b/src/librarian/elements/base.py @@ -1,3 +1,6 @@ +# This file is part of Librarian, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. +# import copy import re from lxml import etree @@ -37,13 +40,14 @@ class WLElement(etree.ElementBase): CAN_HAVE_TEXT = True STRIP = False + NUMBERING = None text_substitutions = [ - (u'---', u'—'), - (u'--', u'–'), - #(u'...', u'…'), # Temporary turnoff for epub - (u',,', u'„'), - (u'"', u'”'), + ('---', '—'), + ('--', '–'), + #('...', '…'), # Temporary turnoff for epub + (',,', '„'), + ('"', '”'), ('\ufeff', ''), ("'", "\u2019"), # This was enabled for epub. @@ -82,6 +86,15 @@ class WLElement(etree.ElementBase): except AttributeError: return parent.in_context_of(setting) + def get_context_map(self, setting, key, default=None): + parent = self.getparent() + if parent is None: + return default + try: + return getattr(parent, setting)[key] + except AttributeError: + return parent.get_context_map(setting, key, default) + def signal(self, signal): parent = self.getparent() if parent is not None: @@ -113,11 +126,11 @@ class WLElement(etree.ElementBase): newt = '' wlist = re.compile(r'\w+|[^\w]', re.UNICODE).findall(text) for w in wlist: - newt += builder.hyphenator.inserted(w, u'\u00AD') + newt += builder.hyphenator.inserted(w, '\u00AD') text = newt if builder.orphans: - text = re.sub(r'(?<=\s\w)\s+', u'\u00A0', text) + text = re.sub(r'(?<=\s\w)\s+', '\u00A0', text) return text @@ -133,6 +146,9 @@ class WLElement(etree.ElementBase): for i, child in enumerate(self): if isinstance(child, WLElement): getattr(child, build_method)(builder) + # FIXME base builder api + elif getattr(builder, 'debug', False) and child.tag is etree.Comment: + builder.process_comment(child) if self.CAN_HAVE_TEXT and child.tail: text = self.normalize_text(child.tail, builder) if self.STRIP and i == child_count - 1: @@ -162,14 +178,21 @@ class WLElement(etree.ElementBase): attr = self.HTML_ATTR.copy() if self.HTML_CLASS: attr['class'] = self.HTML_CLASS - # always copy the id attribute (?) - if self.attrib.get('id'): - attr['id'] = self.attrib['id'] - elif getattr(self, 'SHOULD_HAVE_ID', False) and '_compat_section_id' in self.attrib: - attr['id'] = self.attrib['_compat_section_id'] + if builder.with_ids: + # always copy the id attribute (?) + if self.attrib.get('id'): + attr['id'] = self.attrib['id'] + if self.attrib.get('_id'): + attr['id'] = self.attrib['_id'] return attr def html_build(self, builder): + # Do we need a number? + numbering = self.numbering + if numbering == 'main': + if builder.with_numbering and self.has_visible_numbering: + builder.add_visible_number(self) + if self.HTML_TAG: builder.start_element( self.HTML_TAG, @@ -195,7 +218,7 @@ class WLElement(etree.ElementBase): # TEMPORARY self.CAN_HAVE_TEXT = True self.STRIP = False - + start_chunk = self.EPUB_START_CHUNK and isinstance(self.getparent(), Master) if start_chunk: @@ -217,6 +240,11 @@ class WLElement(etree.ElementBase): attr = self.get_epub_attr(builder) if fragment: attr['id'] = fragment + if builder.debug: + chunkno, sourceline = 0, self.sourceline + if builder.splits: + chunkno, sourceline = len(builder.splits), sourceline - builder.splits[-1] + attr['data-debug'] = f'{chunkno}:{sourceline}' builder.start_element( self.EPUB_TAG, attr @@ -305,15 +333,38 @@ class WLElement(etree.ElementBase): return snipelem + @property + def numbering(self): + numbering = self.NUMBERING + if numbering is None or self.in_context_of('DISABLE_NUMBERING'): + return None + numbering = self.get_context_map('SUPPRESS_NUMBERING', numbering, numbering) + return numbering + + @property + def id_prefix(self): + prefix = self.numbering + if prefix == 'main': + # TODO: self.context.main_numbering_prefix + prefix = 'f' # default numbering prefix + return prefix + + def assign_id(self, builder): + numbering = self.numbering + if numbering: + number = str(builder.counters[numbering]) + self.attrib['_id'] = self.id_prefix + number + builder.counters[numbering] += 1 + + if numbering == 'main': + self.attrib['_visible_numbering'] = str(builder.counters['_visible']) + builder.counters['_visible'] += 1 + + if numbering == 'fn': + self.attrib['_visible_numbering'] = number + def get_link(self): - sec = getattr(self, 'SHOULD_HAVE_ID', False) and self.attrib.get('_compat_section_id') - if sec: - return sec - parent_index = self.getparent().index(self) - if parent_index: - return self.getparent()[parent_index - 1].get_link() - else: - return self.getparent().get_link() + return self.attrib.get('_id') or self.getparent().get_link() class Snippet(WLElement):