Text converter updated.
authorRadek Czajka <rczajka@rczajka.pl>
Mon, 16 Sep 2024 10:33:02 +0000 (12:33 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Mon, 16 Sep 2024 10:33:02 +0000 (12:33 +0200)
50 files changed:
setup.py
src/librarian/builders/txt.py
src/librarian/elements/__init__.py
src/librarian/elements/base.py
src/librarian/elements/blocks/dedykacja.py
src/librarian/elements/blocks/dlugi_cytat.py
src/librarian/elements/blocks/poezja_cyt.py
src/librarian/elements/drama/didaskalia.py
src/librarian/elements/drama/lista_osob.py
src/librarian/elements/drama/lista_osoba.py
src/librarian/elements/drama/naglowek_osoba.py
src/librarian/elements/figures/kol.py
src/librarian/elements/figures/tabela.py
src/librarian/elements/figures/wiersz.py
src/librarian/elements/front/autor_utworu.py
src/librarian/elements/front/dzielo_nadrzedne.py
src/librarian/elements/front/motto.py
src/librarian/elements/front/nazwa_utworu.py
src/librarian/elements/front/podtytul.py
src/librarian/elements/headers/naglowek_czesc.py
src/librarian/elements/headers/naglowek_podrozdzial.py
src/librarian/elements/headers/naglowek_rozdzial.py
src/librarian/elements/headers/naglowek_scena.py
src/librarian/elements/masters/__init__.py
src/librarian/elements/paragraphs/akap.py
src/librarian/elements/poetry/strofa.py
src/librarian/elements/poetry/wers.py
src/librarian/elements/separators/sekcja_asterysk.py
src/librarian/elements/separators/sekcja_swiatlo.py
src/librarian/elements/separators/separator_linia.py
src/librarian/elements/styles/__init__.py
src/librarian/elements/styles/mat.py
src/librarian/elements/tools/__init__.py
tests/files/tags/didaskalia/1.expected.html
tests/files/tags/kwestia/1.expected.html
tests/files/tags/kwestia/2.expected.html
tests/files/tags/motto_podpis/1.expected.html
tests/files/tags/naglowek_osoba/1.expected.html
tests/files/tags/nota/2.expected.html
tests/files/tags/nota/3.expected.html
tests/files/tags/poezja_cyt/1.expected.html
tests/files/tags/slowo_obce/1.expected.html
tests/files/tags/tabela/1.expected.html
tests/files/tags/tytul_dziela/1.expected.html
tests/files/tags/wers_wciety/1.expected.html
tests/files/tags/wers_wciety/2.expected.html
tests/files/tags/wers_wciety/2.xml
tests/files/tags/wyroznienie/1.expected.html
tests/files/text/asnyk_miedzy_nami_expected_raw.txt
tests/test_text.py

index 184db52..2af0a05 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -50,7 +50,7 @@ setup(
             "librarian=librarian.command_line:main"
         ]
     },
             "librarian=librarian.command_line:main"
         ]
     },
-    scripts=['scripts/book2html',
+    scripts=[
              'scripts/book2txt',
              'scripts/book2pdf',
              'scripts/book2fb2',
              'scripts/book2txt',
              'scripts/book2pdf',
              'scripts/book2fb2',
index 8302de5..28fe709 100644 (file)
@@ -15,14 +15,6 @@ class TxtFragment:
         self.current_margin = 0
         self.starting_block = True
 
         self.current_margin = 0
         self.starting_block = True
 
-    def push_legacy_margin(self, margin):
-        if margin:
-            if self.pieces:
-                self.pieces[-1] = self.pieces[-1].rstrip(' ')
-            self.pieces.append('\r\n' * margin)
-            self.current_margin += margin
-            self.starting_block = True
-        
     def push_margin(self, margin):
         if margin:
             if self.pieces:
     def push_margin(self, margin):
         if margin:
             if self.pieces:
@@ -47,8 +39,11 @@ class TxtBuilder:
     """
     file_extension = "txt"
     identifier = "txt"
     """
     file_extension = "txt"
     identifier = "txt"
+    after_child_fn = 'txt_after_child'
 
 
+    debug = False
     orphans = False
     orphans = False
+    normalize_whitespace = True
     
     default_license_description = {
         "pol": (
     
     default_license_description = {
         "pol": (
@@ -107,9 +102,6 @@ class TxtBuilder:
     def push_margin(self, margin):
         self.current_fragments[-1].push_margin(margin)
         
     def push_margin(self, margin):
         self.current_fragments[-1].push_margin(margin)
         
-    def push_legacy_margin(self, margin, where=None):
-        self.current_fragments[-1].push_legacy_margin(margin)
-        
     def build(self, document, raw_text=False, **kwargs):
         document.tree.getroot().txt_build(self)
         meta = document.meta
     def build(self, document, raw_text=False, **kwargs):
         document.tree.getroot().txt_build(self)
         meta = document.meta
@@ -123,27 +115,26 @@ class TxtBuilder:
                     for translator in meta.translators
                 )
             )
                     for translator in meta.translators
                 )
             )
-            #builder.push_margin(2)
-            self.push_legacy_margin(1)
+            builder.push_margin(2)
 
         if meta.isbn_txt:
 
         if meta.isbn_txt:
-            #builder.push_margin(2)
-            self.push_legacy_margin(1)
+            self.push_margin(2)
             isbn = meta.isbn_txt
             if isbn.startswith(('ISBN-' , 'ISBN ')):
                 isbn = isbn[5:]
             self.push_text('ISBN {isbn}'.format(isbn=isbn))
             #builder.push_margin(5)
 
             isbn = meta.isbn_txt
             if isbn.startswith(('ISBN-' , 'ISBN ')):
                 isbn = isbn[5:]
             self.push_text('ISBN {isbn}'.format(isbn=isbn))
             #builder.push_margin(5)
 
-        #builder.push_margin(4)
-        self.push_legacy_margin(1)
+        self.push_margin(4)
         self.exit_fragment()
         
         self.exit_fragment()
         
-        text = ''.join(self.fragments['header'].pieces) +  ''.join(self.fragments[None].pieces)
+        text = ''.join(self.fragments[None].pieces).lstrip()
 
         if raw_text:
             result = text
         else:
 
         if raw_text:
             result = text
         else:
+            text = ''.join(self.fragments['header'].pieces) +  text
+
             if meta.license:
                 license_description = self.license_description['pol'].format(meta=meta)
             else:
             if meta.license:
                 license_description = self.license_description['pol'].format(meta=meta)
             else:
index b08c3e1..0191ae5 100644 (file)
@@ -132,11 +132,11 @@ WL_ELEMENTS = {
     "wywiad_odp": blocks.WywiadOdp,
 
     # Inline MathML, should really be namespaced.
     "wywiad_odp": blocks.WywiadOdp,
 
     # Inline MathML, should really be namespaced.
-    "mrow": etree.ElementBase,
-    "mi": etree.ElementBase,
-    "mo": etree.ElementBase,
-    "msup": etree.ElementBase,
-    "mn": etree.ElementBase,
-    "mfrac": etree.ElementBase,
-    "mfenced": etree.ElementBase,
+    "mrow": styles.MRow,
+    "mi": styles.M,
+    "mo": styles.M,
+    "msup": styles.MSup,
+    "mn": styles.M,
+    "mfrac": styles.MFrac,
+    "mfenced": styles.MFenced,
 }
 }
index 2349f16..060449c 100644 (file)
@@ -45,12 +45,11 @@ class WLElement(etree.ElementBase):
     text_substitutions = [
         ('---', '—'),
         ('--', '–'),
     text_substitutions = [
         ('---', '—'),
         ('--', '–'),
-        #('...', '…'),  # Temporary turnoff for epub
+        ('...', '…'),
         (',,', '„'),
         ('"', '”'),
         ('\ufeff', ''),
         (',,', '„'),
         ('"', '”'),
         ('\ufeff', ''),
-
-        ("'", "\u2019"),    # This was enabled for epub.
+        ("'", "\u2019"),
     ]
 
     @property
     ]
 
     @property
@@ -118,9 +117,9 @@ class WLElement(etree.ElementBase):
         text = text or ''
         for e, s in self.text_substitutions:
             text = text.replace(e, s)
         text = text or ''
         for e, s in self.text_substitutions:
             text = text.replace(e, s)
-            # FIXME: TEmporary turnoff
-#        text = re.sub(r'\s+', ' ', text)
-### TODO: Added now for epub
+
+        if getattr(builder, 'normalize_whitespace', False):
+            text = re.sub(r'\s+', ' ', text)
 
         if getattr(builder, 'hyphenator', None) is not None:
             newt = ''
 
         if getattr(builder, 'hyphenator', None) is not None:
             newt = ''
@@ -144,8 +143,12 @@ class WLElement(etree.ElementBase):
                     text = text.rstrip()
             builder.push_text(text)
         for i, child in enumerate(self):
                     text = text.rstrip()
             builder.push_text(text)
         for i, child in enumerate(self):
+            real_child_count = 0
             if isinstance(child, WLElement):
                 getattr(child, build_method)(builder)
             if isinstance(child, WLElement):
                 getattr(child, build_method)(builder)
+                self.after_child(builder, real_child_count)
+                real_child_count += 1
+
             # FIXME base builder api
             elif getattr(builder, 'debug', False) and child.tag is etree.Comment:
                 builder.process_comment(child)
             # FIXME base builder api
             elif getattr(builder, 'debug', False) and child.tag is etree.Comment:
                 builder.process_comment(child)
@@ -155,21 +158,23 @@ class WLElement(etree.ElementBase):
                     text = text.rstrip()
                 builder.push_text(text)
 
                     text = text.rstrip()
                 builder.push_text(text)
 
+    def after_child(self, builder, child_count):
+        fn = getattr(builder, 'after_child_fn', None)
+        if fn:
+            getattr(self, builder.after_child_fn)(builder, child_count)
+
+    def txt_after_child(self, builder, child_count):
+        pass
+
     def _txt_build_inner(self, builder):
         self._build_inner(builder, 'txt_build')
 
     def txt_build(self, builder):
     def _txt_build_inner(self, builder):
         self._build_inner(builder, 'txt_build')
 
     def txt_build(self, builder):
-        if hasattr(self, 'TXT_LEGACY_TOP_MARGIN'):
-            builder.push_legacy_margin(self.TXT_LEGACY_TOP_MARGIN)
-        else:
-            builder.push_margin(self.TXT_TOP_MARGIN)
+        builder.push_margin(self.TXT_TOP_MARGIN)
         builder.push_text(self.TXT_PREFIX, True)
         self._txt_build_inner(builder)
         builder.push_text(self.TXT_SUFFIX, True)
         builder.push_text(self.TXT_PREFIX, True)
         self._txt_build_inner(builder)
         builder.push_text(self.TXT_SUFFIX, True)
-        if hasattr(self, 'TXT_LEGACY_BOTTOM_MARGIN'):
-            builder.push_legacy_margin(self.TXT_LEGACY_BOTTOM_MARGIN)
-        else:
-            builder.push_margin(self.TXT_BOTTOM_MARGIN)
+        builder.push_margin(self.TXT_BOTTOM_MARGIN)
 
     def _html_build_inner(self, builder):
         self._build_inner(builder, 'html_build')
 
     def _html_build_inner(self, builder):
         self._build_inner(builder, 'html_build')
index 265b268..ae00b72 100644 (file)
@@ -7,7 +7,8 @@ from ..base import WLElement
 class Dedykacja(WLElement):
     NUMBERING = 'i'
 
 class Dedykacja(WLElement):
     NUMBERING = 'i'
 
-    TXT_LEGACY_TOP_MARGIN = 2
+    TXT_TOP_MARGIN = 2
+    TXT_BOTTOM_MARGIN = 4
 
     EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "dedication"
 
     EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "dedication"
index 0a55833..bdac225 100644 (file)
@@ -8,9 +8,7 @@ class DlugiCytat(WLElement):
     CAN_HAVE_TEXT = False
 
     TXT_TOP_MARGIN = 3
     CAN_HAVE_TEXT = False
 
     TXT_TOP_MARGIN = 3
-    TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 0
+    TXT_BOTTOM_MARGIN = 3
 
     HTML_TAG = 'blockquote'
 
 
     HTML_TAG = 'blockquote'
 
index 2b351ca..dd26d13 100644 (file)
@@ -9,8 +9,6 @@ class PoezjaCyt(WLElement):
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
-    TXT_LEGACY_TOP_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = 'blockquote'
 
 
     HTML_TAG = 'blockquote'
 
index 8f461dd..b6b53f9 100644 (file)
@@ -9,8 +9,6 @@ class Didaskalia(WLElement):
 
     TXT_TOP_PARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_PARGIN = 2
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 2
-    TXT_LEGACY_BOTTOM_MARGIN = 0
     TXT_PREFIX = "/ "
     TXT_SUFFIX = " /"
 
     TXT_PREFIX = "/ "
     TXT_SUFFIX = " /"
 
index f9e210d..d8ea32a 100644 (file)
@@ -11,8 +11,6 @@ class ListaOsob(WLElement):
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
-    TXT_LEGACY_TOP_MARGIN = 3
-    TXT_LEGACY_BOTTOM_MARGIN = 1
 
     HTML_TAG = "div"
     HTML_CLASS = "person-list"
 
     HTML_TAG = "div"
     HTML_CLASS = "person-list"
index 2341918..7319321 100644 (file)
@@ -9,8 +9,6 @@ class ListaOsoba(WLElement):
 
     TXT_TOP_MARGIN = 1
     TXT_BOTTOM_MARGIN = 1
 
     TXT_TOP_MARGIN = 1
     TXT_BOTTOM_MARGIN = 1
-    TXT_LEGACY_TOP_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 0
     TXT_PREFIX = " * "
 
     EPUB_TAG = HTML_TAG = "li"
     TXT_PREFIX = " * "
 
     EPUB_TAG = HTML_TAG = "li"
index 43aa1d3..6ff6761 100644 (file)
@@ -9,8 +9,6 @@ class NaglowekOsoba(WLElement):
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 3
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = "h4"
 
 
     HTML_TAG = "h4"
 
index 9b425de..fa09fc7 100644 (file)
@@ -6,3 +6,4 @@ from ..base import WLElement
 
 class Kol(WLElement):
     EPUB_TAG = HTML_TAG = 'td'
 
 class Kol(WLElement):
     EPUB_TAG = HTML_TAG = 'td'
+    TXT_PREFIX = ' ' * 4
index 783fcb6..5ab04e0 100644 (file)
@@ -6,6 +6,10 @@ from ..base import WLElement
 
 class Tabela(WLElement):
     NUMBERING = 'i'
 
 class Tabela(WLElement):
     NUMBERING = 'i'
+    CAN_HAVE_TEXT = False
+
+    TXT_TOP_MARGIN = 3
+    TXT_BOTTOM_MARGIN = 3
 
     EPUB_TAG = HTML_TAG = 'table'
 
 
     EPUB_TAG = HTML_TAG = 'table'
 
index c5d355a..c013558 100644 (file)
@@ -5,4 +5,7 @@ from ..base import WLElement
 
 
 class Wiersz(WLElement):
 
 
 class Wiersz(WLElement):
+    CAN_HAVE_TEXT = False
     EPUB_TAG = HTML_TAG = 'tr'
     EPUB_TAG = HTML_TAG = 'tr'
+    TXT_TOP_MARGIN = 1
+    TXT_BOTTOM_MARGIN = 1
index 3e35b0b..0f71cb5 100644 (file)
@@ -6,7 +6,6 @@ from .base import HeaderElement
 
 class AutorUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 2
 
 class AutorUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_BOTTOM_MARGIN = 2
 
     HTML_CLASS = 'wl author'
 
 
     HTML_CLASS = 'wl author'
 
index cc70164..cc16a81 100644 (file)
@@ -6,7 +6,6 @@ from .base import HeaderElement
 
 class DzieloNadrzedne(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
 
 class DzieloNadrzedne(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 1
 
     HTML_CLASS = "wl collection"
 
 
     HTML_CLASS = "wl collection"
 
index a6769b8..ac9f209 100644 (file)
@@ -7,8 +7,8 @@ from ..base import WLElement
 class Motto(WLElement):
     NUMBERING = 'i'
 
 class Motto(WLElement):
     NUMBERING = 'i'
 
-    TXT_LEGACY_TOP_MARGIN = 4
-    TXT_LEGACY_BOTTOM_MARGIN = 2
+    TXT_TOP_MARGIN = 4
+    TXT_BOTTOM_MARGIN = 2
 
     EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "motto"
 
     EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "motto"
index dd40266..9e3bd51 100644 (file)
@@ -6,7 +6,6 @@ from .base import HeaderElement
 
 class NazwaUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
 
 class NazwaUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 1
 
     HTML_CLASS = 'wl title'
 
 
     HTML_CLASS = 'wl title'
 
index 711b3fa..01991d5 100644 (file)
@@ -6,7 +6,6 @@ from .base import HeaderElement
 
 class Podtytul(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
 
 class Podtytul(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 1
 
     HTML_CLASS = 'wl subtitle'
 
 
     HTML_CLASS = 'wl subtitle'
 
index 11991ae..7d2fa0d 100644 (file)
@@ -10,8 +10,6 @@ class NaglowekCzesc(WLElement):
     
     TXT_TOP_MARGIN = 5
     TXT_BOTTOM_MARGIN = 2
     
     TXT_TOP_MARGIN = 5
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 5
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_TAG = HTML_TAG = "h2"
     HTML_CLASS = "wl"
 
     EPUB_TAG = HTML_TAG = "h2"
     HTML_CLASS = "wl"
index 213ec00..6865362 100644 (file)
@@ -10,8 +10,6 @@ class NaglowekPodrozdzial(WLElement):
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 3
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = "h4"
 
 
     HTML_TAG = "h4"
 
index 502dea1..e61f6a7 100644 (file)
@@ -10,8 +10,6 @@ class NaglowekRozdzial(WLElement):
     
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
     
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 4
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = 'h3'
     HTML_CLASS = 'wl'
 
     HTML_TAG = 'h3'
     HTML_CLASS = 'wl'
index e9ea5c7..a0ae5be 100644 (file)
@@ -10,8 +10,6 @@ class NaglowekScena(WLElement):
 
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 4
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = 'h3'
 
 
     HTML_TAG = 'h3'
 
index d4f3cf0..54f5ba1 100644 (file)
@@ -7,4 +7,4 @@ from ..base import WLElement
 class Master(WLElement):
     CAN_HAVE_TEXT = False
 
 class Master(WLElement):
     CAN_HAVE_TEXT = False
 
-    TXT_LEGACY_BOTTOM_MARGIN = 2
+    TXT_BOTTOM_MARGIN = 2
index 63f74b5..6ee10d7 100644 (file)
@@ -10,8 +10,6 @@ class Akap(WLElement):
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 2
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_CLASS = 'paragraph'
 
 
     EPUB_CLASS = 'paragraph'
 
index bccb01b..f698bc3 100644 (file)
@@ -12,8 +12,6 @@ class Strofa(WLElement):
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
-    TXT_LEGACY_TOP_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_TAG = HTML_TAG = 'div'
     EPUB_CLASS = HTML_CLASS = 'stanza'
 
     EPUB_TAG = HTML_TAG = 'div'
     EPUB_CLASS = HTML_CLASS = 'stanza'
index 127d5bd..cf2089c 100644 (file)
@@ -9,8 +9,6 @@ class Wers(WLElement):
 
     TXT_TOP_MARGIN = 1
     TXT_BOTTOM_MARGIN = 1
 
     TXT_TOP_MARGIN = 1
     TXT_BOTTOM_MARGIN = 1
-    TXT_LEGACY_TOP_MARGIN = 1
-    TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_TAG = HTML_TAG = 'div'
     EPUB_CLASS = 'verse'
 
     EPUB_TAG = HTML_TAG = 'div'
     EPUB_CLASS = 'verse'
index 35bd7a7..3ba8270 100644 (file)
@@ -7,8 +7,6 @@ from ..base import WLElement
 class SekcjaAsterysk(WLElement):
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 4
 class SekcjaAsterysk(WLElement):
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 4
-    TXT_LEGACY_TOP_MARGIN = 2
-    TXT_LEGACY_BOTTOM_MARGIN = 2
 
     EPUB_TAG = HTML_TAG = "p"
     HTML_CLASS = HTML_CLASS = "spacer-asterisk"
 
     EPUB_TAG = HTML_TAG = "p"
     HTML_CLASS = HTML_CLASS = "spacer-asterisk"
index 805078e..e3ab103 100644 (file)
@@ -6,7 +6,6 @@ from ..base import WLElement
 
 class SekcjaSwiatlo(WLElement):
     TXT_BOTTOM_MARGIN = 6
 
 class SekcjaSwiatlo(WLElement):
     TXT_BOTTOM_MARGIN = 6
-    TXT_LEGACY_BOTTOM_MARGIN = 4
 
     HTML_TAG = "hr"
     HTML_CLASS = "spacer"
 
     HTML_TAG = "hr"
     HTML_CLASS = "spacer"
index 8874967..e5a5218 100644 (file)
@@ -7,8 +7,6 @@ from ..base import WLElement
 class SeparatorLinia(WLElement):
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 4
 class SeparatorLinia(WLElement):
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 4
-    TXT_LEGACY_TOP_MARGIN = 2
-    TXT_LEGACY_BOTTOM_MARGIN = 2
 
     EPUB_TAG = HTML_TAG = "hr"
     EPUB_CLASS = HTML_CLASS = "spacer-line"
 
     EPUB_TAG = HTML_TAG = "hr"
     EPUB_CLASS = HTML_CLASS = "spacer-line"
index 4453490..dd35dfc 100644 (file)
@@ -2,7 +2,7 @@
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 from .indeks_dolny import IndeksDolny
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 from .indeks_dolny import IndeksDolny
-from .mat import Mat
+from .mat import Mat, M, MRow, MFenced, MFrac, MSup
 from .slowo_obce import SlowoObce
 from .tytul_dziela import TytulDziela
 from .wieksze_odstepy import WiekszeOdstepy
 from .slowo_obce import SlowoObce
 from .tytul_dziela import TytulDziela
 from .wieksze_odstepy import WiekszeOdstepy
index 68fcc3f..1512c32 100644 (file)
@@ -6,6 +6,8 @@ from ..base import WLElement
 
 
 class Mat(WLElement):
 
 
 class Mat(WLElement):
+    STRIP = True
+
     def html_build(self, builder):
         e = copy(self)
         e.tag = 'math'
     def html_build(self, builder):
         e = copy(self)
         e.tag = 'math'
@@ -15,3 +17,31 @@ class Mat(WLElement):
     def epub_build(self, builder):
         builder.start_element('img', {"src": builder.mathml(self)})
         builder.end_element()
     def epub_build(self, builder):
         builder.start_element('img', {"src": builder.mathml(self)})
         builder.end_element()
+
+
+class M(WLElement):
+    STRIP = True
+
+
+class MRow(M):
+    pass
+
+
+class MFenced(M):
+    TXT_PREFIX = '('
+    TXT_SUFFIX = ')'
+
+
+class MFrac(M):
+    TXT_PREFIX = '('
+    TXT_SUFFIX = ')'
+
+    def txt_after_child(self, builder, child_count):
+        if child_count:
+            builder.push_text(') / (')
+
+
+class MSup(M):
+    def txt_after_child(self, builder, child_count):
+        if child_count:
+            builder.push_text(' ^ ')
index c4820b1..69a26ea 100644 (file)
@@ -70,3 +70,13 @@ class Tab(WLElement):
         }
 
     get_epub_attr = get_html_attr
         }
 
     get_epub_attr = get_html_attr
+
+    def txt_build(self, builder):
+        szer = self.get('szer', '1').strip()
+        if szer.endswith('em'):
+            szer = szer[:-2]
+        try:
+            szer = int(szer)
+        except:
+            szer = 1
+        builder.push_text(' ' * 4 * szer)
index efefbab..88137d5 100644 (file)
@@ -8,7 +8,7 @@ Na toż bym się, mocium panie,<div class="wl verse" id="f2">Kawalerstwa dziś w
 </div>
 <div class="didaskalia" id="i4">uderzając w stół</div>
 <div class="stanza" id="i5">
 </div>
 <div class="didaskalia" id="i4">uderzając w stół</div>
 <div class="stanza" id="i5">
-<div class="wl verse" id="f3">By kto... niech go piorun trzaśnie!</div>
+<div class="wl verse" id="f3">By kto niech go piorun trzaśnie!</div>
 <div class="wl verse" id="f4">Długo będzie na to czekał,</div>
 </div>
 <div class="didaskalia" id="i6">po krótkim milczeniu, biorąc talerz</div>
 <div class="wl verse" id="f4">Długo będzie na to czekał,</div>
 </div>
 <div class="didaskalia" id="i6">po krótkim milczeniu, biorąc talerz</div>
@@ -21,7 +21,7 @@ Na toż bym się, mocium panie,<div class="wl verse" id="f2">Kawalerstwa dziś w
 <div class="stanza" id="i9">
 <div class="wl verse" id="f8">Bawi z nami — w domu Klary,</div>
 <div class="wl verse" id="f9">Bo krewniaczka jej daleka,</div>
 <div class="stanza" id="i9">
 <div class="wl verse" id="f8">Bawi z nami — w domu Klary,</div>
 <div class="wl verse" id="f9">Bo krewniaczka jej daleka,</div>
-<a href="#f10" class="wl-num">10</a><div class="wl verse" id="f10">Ale mnie się wszystko zdaje...</div>
+<a href="#f10" class="wl-num">10</a><div class="wl verse" id="f10">Ale mnie się wszystko zdaje</div>
 </div>
 </div>
 </div>
 </div>
 </div>
 </div>
index 2fe9773..54109b5 100644 (file)
@@ -4,7 +4,7 @@
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Więc jako dawniej czynili mocarze,</div>
 <div class="wl verse" id="f2">Z Lechem się mieniał Scyta na obrączki;</div>
 <div class="wl verse" id="f3">A pokochawszy mocniej sercem, w darze</div>
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Więc jako dawniej czynili mocarze,</div>
 <div class="wl verse" id="f2">Z Lechem się mieniał Scyta na obrączki;</div>
 <div class="wl verse" id="f3">A pokochawszy mocniej sercem, w darze</div>
-<div class="wl verse" id="f4">Dał mu koronę... stąd nasza korona.</div>
+<div class="wl verse" id="f4">Dał mu koronę stąd nasza korona.</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Zbawiciel niegdyś wyciągając rączki</div>
 <div class="wl verse" id="f6">Szedł do niej z matki zadumanej łona</div>
 <div class="wl verse" id="f7">I ku rubinom podawał się cały</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Zbawiciel niegdyś wyciągając rączki</div>
 <div class="wl verse" id="f6">Szedł do niej z matki zadumanej łona</div>
 <div class="wl verse" id="f7">I ku rubinom podawał się cały</div>
index 5783d97..b73287a 100644 (file)
@@ -1,11 +1,11 @@
 <div id="book-text">
 <h4 id="i1">GŁOS HESI</h4>
 <div class="kwestia">
 <div id="book-text">
 <h4 id="i1">GŁOS HESI</h4>
 <div class="kwestia">
-<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Mamuńciu, tak zimno! troszkę ciepłej wody...</p>
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Mamuńciu, tak zimno! troszkę ciepłej wody</p>
 </div>
 <h4 id="i2">DULSKA</h4>
 <div class="kwestia">
 </div>
 <h4 id="i2">DULSKA</h4>
 <div class="kwestia">
-<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Jeszcze czego? Hartujcie się... Felicjan! wstajesz? Wiesz? ten błazen, twój syn, nie wrócił jeszcze do domu! Co? nic nie mówisz? naturalnie.
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Jeszcze czego? Hartujcie się Felicjan! wstajesz? Wiesz? ten błazen, twój syn, nie wrócił jeszcze do domu! Co? nic nie mówisz? naturalnie.
 Ojciec toleruje. Niedaleko padło jabłko od jabłoni. Ale jak będą dłużki małe — nie zapłacę.</p>
 </div>
 </div>
 Ojciec toleruje. Niedaleko padło jabłko od jabłoni. Ale jak będą dłużki małe — nie zapłacę.</p>
 </div>
 </div>
index 1ff589b..ec6cecb 100644 (file)
@@ -5,7 +5,7 @@
 <div class="motto" id="i6">
 <div class="stanza" id="i5">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1"><em class="foreign-word">Dovete adunque sapere come sono/
 <div class="motto" id="i6">
 <div class="stanza" id="i5">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1"><em class="foreign-word">Dovete adunque sapere come sono/
-due generazioni da combattere...../
+due generazioni da combattere../
 bisogna essere volpe e leone.</em></div>
 </div>
 </div>
 bisogna essere volpe e leone.</em></div>
 </div>
 </div>
index 4903bb3..1bbd782 100644 (file)
@@ -6,7 +6,7 @@
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Piękne dobra w każdym względzie —</div>
 <div class="wl verse" id="f2">Lasy — gleba wyśmienita —</div>
 <div class="wl verse" id="f3">Dobrą żoną pewnie będzie —</div>
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Piękne dobra w każdym względzie —</div>
 <div class="wl verse" id="f2">Lasy — gleba wyśmienita —</div>
 <div class="wl verse" id="f3">Dobrą żoną pewnie będzie —</div>
-<div class="wl verse" id="f4">Co za czynsze! — To kobiéta!...</div>
+<div class="wl verse" id="f4">Co za czynsze! — To kobiéta!</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Trzy folwarki!</div>
 </div>
 </div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Trzy folwarki!</div>
 </div>
 </div>
index 6006ef6..d78347f 100644 (file)
@@ -12,7 +12,7 @@
 <div class="wl verse" id="f3">I nie przyjmował nigdy, jak wiek wiekiem.</div>
 <div class="wl verse" id="f4">Bo glina w glinę wtapia się bez przerwy,</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Gdy sprzeczne ciała zbija się aż ćwiekiem</div>
 <div class="wl verse" id="f3">I nie przyjmował nigdy, jak wiek wiekiem.</div>
 <div class="wl verse" id="f4">Bo glina w glinę wtapia się bez przerwy,</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Gdy sprzeczne ciała zbija się aż ćwiekiem</div>
-<div class="wl verse" id="f6">Później... lub pierwéj...</div>
+<div class="wl verse" id="f6">Później… lub pierwéj…</div>
 </div>
 <div class="note"><p class="wl paragraph" id="i2">Pisałem w Paryżu 1856 w styczniu.</p></div>
 </div>
 </div>
 <div class="note"><p class="wl paragraph" id="i2">Pisałem w Paryżu 1856 w styczniu.</p></div>
 </div>
index b7d62b4..243db4a 100644 (file)
@@ -1,8 +1,8 @@
 <div id="book-text">
 <a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Jego marzenie się nie spełniło: nie ożenił się, choć był już na to zupełnie zdecydowany,
 <div id="book-text">
 <a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Jego marzenie się nie spełniło: nie ożenił się, choć był już na to zupełnie zdecydowany,
-gdy skończono oporządzać jego mieszkanie. [...] Rzecz dziwna, czym jest mundur dla takich ludzi.</p>
+gdy skończono oporządzać jego mieszkanie. [] Rzecz dziwna, czym jest mundur dla takich ludzi.</p>
 <div class="note"><p class="wl paragraph" id="i1"><em class="author-emphasis">Uwaga tłumacza</em>. Drukowane obecnie w „Nowej Reformie”
 <em class="book-title">Wspomnienia Sybiraka</em> (pamiętniki Józefa Bogusławskiego) pozwalają
 szczęśliwym trafem podać w całości nazwiska Polaków, o których mówi Dostojewski w swoich pamiętnikach,
 <div class="note"><p class="wl paragraph" id="i1"><em class="author-emphasis">Uwaga tłumacza</em>. Drukowane obecnie w „Nowej Reformie”
 <em class="book-title">Wspomnienia Sybiraka</em> (pamiętniki Józefa Bogusławskiego) pozwalają
 szczęśliwym trafem podać w całości nazwiska Polaków, o których mówi Dostojewski w swoich pamiętnikach,
-oznaczając te nazwiska tylko pierwszymi literami, z dodaniem czasami końcówek. [...]</p></div>
+oznaczając te nazwiska tylko pierwszymi literami, z dodaniem czasami końcówek. []</p></div>
 </div>
 </div>
index b0d195b..17e1d92 100644 (file)
@@ -1,4 +1,4 @@
 <div id="book-text"><blockquote><div class="stanza" id="i1">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Tymczasem przenoś duszę moją utęsknioną</div>
 <div id="book-text"><blockquote><div class="stanza" id="i1">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Tymczasem przenoś duszę moją utęsknioną</div>
-<div class="wl verse" id="f2">Do tych pagórków leśnych, do tych łąk zielonych...</div>
+<div class="wl verse" id="f2">Do tych pagórków leśnych, do tych łąk zielonych</div>
 </div></blockquote></div>
 </div></blockquote></div>
index 8fa6808..5c8ce78 100644 (file)
@@ -1,3 +1,3 @@
 <div id="book-text">
 <div id="book-text">
-<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Na czwarty dzień przywiózł mu stójka z osłowickiej apteki <em class="foreign-word">diachylum</em>; Zołzikiewicz rozsmarował na płatek...</p>
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Na czwarty dzień przywiózł mu stójka z osłowickiej apteki <em class="foreign-word">diachylum</em>; Zołzikiewicz rozsmarował na płatek</p>
 </div>
 </div>
index fe9ef5f..f839494 100644 (file)
@@ -1,22 +1,22 @@
 <div id="book-text">
 <table>
 <div id="book-text">
 <table>
-  <tr>
-    <td>a</td>
-    <td>b</td>
-  </tr>
-  <tr>
-    <td>c</td>
-    <td>d</td>
-  </tr>
+<tr>
+<td>a</td>
+<td>b</td>
+</tr>
+<tr>
+<td>c</td>
+<td>d</td>
+</tr>
 </table>
 <table class="border">
 </table>
 <table class="border">
-  <tr>
-    <td>a</td>
-    <td>b</td>
-  </tr>
-  <tr>
-    <td>c</td>
-    <td>d</td>
-  </tr>
+<tr>
+<td>a</td>
+<td>b</td>
+</tr>
+<tr>
+<td>c</td>
+<td>d</td>
+</tr>
 </table>
 </div>
 </table>
 </div>
index 364942d..f246117 100644 (file)
@@ -4,5 +4,5 @@
     Kilka uwag o <em class="book-title">„Hamlecie”</em>
     Szekspira
   </em>
     Kilka uwag o <em class="book-title">„Hamlecie”</em>
     Szekspira
   </em>
-  pióra...</p>
+  pióra</p>
 </div>
 </div>
index 0ee7c74..b2254fb 100644 (file)
@@ -1,6 +1,6 @@
 <div id="book-text">
 <h1>
 <div id="book-text">
 <h1>
-<span class="wl author" id="i1">Julisz Słowacki</span><span class="wl title" id="i2">Anioł ognisty — mój anioł lewy...</span>
+<span class="wl author" id="i1">Julisz Słowacki</span><span class="wl title" id="i2">Anioł ognisty — mój anioł lewy</span>
 </h1>
 <div class="stanza" id="i3">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Anioł ognisty — mój anioł lewy</div>
 </h1>
 <div class="stanza" id="i3">
 <a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Anioł ognisty — mój anioł lewy</div>
index 85b8e22..f502985 100644 (file)
@@ -1,8 +1,10 @@
-<div id="book-text"><div class="stanza" id="i1"><div class="wl verse" id="f9"><a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">zwykły</div>
-  <div class="wl verse verse-indent verse-indent-1" id="f2">wcięty</div>
-  <div class="wl verse verse-indent verse-indent-1" id="f3">wcięty 1</div>
-  <div class="wl verse verse-indent verse-indent-2" id="f4">wcięty 2</div>
-  <a href="#f5" class="wl-num">5</a><div class="wl verse verse-indent verse-indent-25" id="f5">wcięty 25</div>
-  <div class="wl verse verse-p" id="f6">akapitowy</div>
-  <div class="wl verse verse-center" id="f7">środek</div>
-  <div class="wl verse verse-right" id="f8">do prawej</div></div></div></div>
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">zwykły</div>
+<div class="wl verse verse-indent verse-indent-1" id="f2">wcięty</div>
+<div class="wl verse verse-indent verse-indent-1" id="f3">wcięty 1</div>
+<div class="wl verse verse-indent verse-indent-2" id="f4">wcięty 2</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse verse-indent verse-indent-25" id="f5">wcięty 25</div>
+<div class="wl verse verse-p" id="f6">akapitowy</div>
+<div class="wl verse verse-center" id="f7">środek</div>
+<div class="wl verse verse-right" id="f8">do prawej</div>
+</div></div>
index c31d2cb..9ce9f6a 100644 (file)
@@ -1,10 +1,10 @@
 <strofa>
 <strofa>
-  <wers>zwykły</wers>
-  <wers_wciety>wcięty</wers_wciety>
-  <wers_wciety typ="1">wcięty 1</wers_wciety>
-  <wers_wciety typ="2">wcięty 2</wers_wciety>
-  <wers_wciety typ="25">wcięty 25</wers_wciety>
-  <wers_akap>akapitowy</wers_akap>
-  <wers_srodek>środek</wers_srodek>
+  <wers>zwykły</wers>/
+  <wers_wciety>wcięty</wers_wciety>/
+  <wers_wciety typ="1">wcięty 1</wers_wciety>/
+  <wers_wciety typ="2">wcięty 2</wers_wciety>/
+  <wers_wciety typ="25">wcięty 25</wers_wciety>/
+  <wers_akap>akapitowy</wers_akap>/
+  <wers_srodek>środek</wers_srodek>/
   <wers_do_prawej>do prawej</wers_do_prawej>
 </strofa>
   <wers_do_prawej>do prawej</wers_do_prawej>
 </strofa>
index 65cffe3..d160084 100644 (file)
@@ -5,5 +5,5 @@
 <div class="wl verse" id="f4">Blade jak świt,</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">— Gdy życia koniec szepce do początku:</div>
 <div class="wl verse" id="f6">
 <div class="wl verse" id="f4">Blade jak świt,</div>
 <a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">— Gdy życia koniec szepce do początku:</div>
 <div class="wl verse" id="f6">
-<em class="author-emphasis">„Nie stargam cię ja — nie! — Ja, u-wydatnię</em>!...”</div>
+<em class="author-emphasis">„Nie stargam cię ja — nie! — Ja, u-wydatnię</em>!”</div>
 </div></div>
 </div></div>
index cac61d8..29e243a 100644 (file)
@@ -1,5 +1,3 @@
-\r
-\r
 Między nami nic nie było!\r
 Żadnych zwierzeń, wyznań żadnych!\r
 Nic nas z sobą nie łączyło —\r
 Między nami nic nie było!\r
 Żadnych zwierzeń, wyznań żadnych!\r
 Nic nas z sobą nie łączyło —\r
index 7797530..9109413 100644 (file)
@@ -2,9 +2,7 @@
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 import unittest
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 import unittest
-from librarian import NoDublinCore
 from librarian.builders import builders
 from librarian.builders import builders
-from librarian.parser import WLDocument as LegacyWLDocument
 from librarian.document import WLDocument
 from .utils import get_fixture
 
 from librarian.document import WLDocument
 from .utils import get_fixture
 
@@ -12,16 +10,6 @@ from .utils import get_fixture
 class TextTests(unittest.TestCase):
     maxDiff = None
 
 class TextTests(unittest.TestCase):
     maxDiff = None
 
-    def test_transform_legacy(self):
-        expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected.txt')
-
-        text = LegacyWLDocument.from_file(
-            get_fixture('text', 'miedzy-nami-nic-nie-bylo.xml')
-        ).as_text().get_bytes().decode('utf-8')
-
-        with open(expected_output_file_path, 'rb') as f:
-            self.assertEqual(text, f.read().decode('utf-8'))
-
     def test_transform(self):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected.txt')
 
     def test_transform(self):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected.txt')
 
@@ -36,22 +24,9 @@ class TextTests(unittest.TestCase):
     def test_transform_raw(self):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected_raw.txt')
 
     def test_transform_raw(self):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected_raw.txt')
 
-        text = LegacyWLDocument.from_file(
-            get_fixture('text', 'miedzy-nami-nic-nie-bylo.xml')
-        ).as_text(flags=['raw-text']).get_bytes().decode('utf-8')
+        text = WLDocument(
+            filename=get_fixture('text', 'miedzy-nami-nic-nie-bylo.xml')
+        ).build(builders['txt'], raw_text=True).get_bytes().decode('utf-8')
 
         with open(expected_output_file_path, 'rb') as f:
             self.assertEqual(text, f.read().decode('utf-8'))
 
         with open(expected_output_file_path, 'rb') as f:
             self.assertEqual(text, f.read().decode('utf-8'))
-
-    def test_no_dublincore(self):
-        with self.assertRaises(NoDublinCore):
-            LegacyWLDocument.from_file(
-                get_fixture('text', 'asnyk_miedzy_nami_nodc.xml')
-            ).as_text()
-
-    def test_passing_parse_dublincore_to_transform(self):
-        """Passing parse_dublincore=False to the constructor omits DublinCore parsing."""
-        LegacyWLDocument.from_file(
-            get_fixture('text', 'asnyk_miedzy_nami_nodc.xml'),
-            parse_dublincore=False,
-        ).as_text()