Move HTML from the old transform sheet.
authorRadek Czajka <rczajka@rczajka.pl>
Wed, 11 Sep 2024 13:56:58 +0000 (15:56 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Wed, 11 Sep 2024 13:56:58 +0000 (15:56 +0200)
186 files changed:
scripts/book2html [deleted file]
setup.py
src/librarian/builders/daisy.py
src/librarian/builders/html.py
src/librarian/covers/marquise.py
src/librarian/dcparser.py
src/librarian/document.py
src/librarian/elements/base.py
src/librarian/elements/blocks/dedykacja.py
src/librarian/elements/blocks/nota.py
src/librarian/elements/comments/abstrakt.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/miejsce_czas.py
src/librarian/elements/drama/naglowek_listy.py
src/librarian/elements/drama/naglowek_osoba.py
src/librarian/elements/figures/animacja.py
src/librarian/elements/figures/ilustr.py
src/librarian/elements/figures/tabela.py
src/librarian/elements/footnotes/__init__.py
src/librarian/elements/front/autor_utworu.py
src/librarian/elements/front/base.py
src/librarian/elements/front/dzielo_nadrzedne.py
src/librarian/elements/front/motto.py
src/librarian/elements/front/motto_podpis.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/headers/podtytul_czesc.py
src/librarian/elements/headers/podtytul_podrozdzial.py
src/librarian/elements/headers/podtytul_rozdzial.py
src/librarian/elements/paragraphs/akap.py
src/librarian/elements/poetry/strofa.py
src/librarian/elements/poetry/wers.py
src/librarian/elements/poetry/wers_akap.py
src/librarian/elements/poetry/wers_cd.py
src/librarian/elements/poetry/wers_do_prawej.py
src/librarian/elements/poetry/wers_srodek.py
src/librarian/elements/poetry/wers_wciety.py
src/librarian/elements/styles/www.py
src/librarian/elements/tools/__init__.py
src/librarian/html.py
src/librarian/locale/pl/LC_MESSAGES/messages.po
src/librarian/picture.py [deleted file]
src/librarian/xslt/book2html.xslt [deleted file]
tests/files/picture/angelus-novus.jpeg [deleted file]
tests/files/picture/angelus-novus.xml [deleted file]
tests/files/tags/akap/1.expected.html [new file with mode: 0644]
tests/files/tags/akap/1.xml [new file with mode: 0644]
tests/files/tags/akap_cd/1.expected.html [new file with mode: 0644]
tests/files/tags/akap_cd/1.xml [new file with mode: 0644]
tests/files/tags/akap_dialog/1.expected.html [new file with mode: 0644]
tests/files/tags/akap_dialog/1.xml [new file with mode: 0644]
tests/files/tags/animacja/1.expected.html [new file with mode: 0644]
tests/files/tags/animacja/1.xml [new file with mode: 0644]
tests/files/tags/autor_utworu/1.expected.html [new file with mode: 0644]
tests/files/tags/autor_utworu/1.xml [new file with mode: 0644]
tests/files/tags/base.xml [new file with mode: 0644]
tests/files/tags/dedykacja/1.expected.html [new file with mode: 0644]
tests/files/tags/dedykacja/1.xml [new file with mode: 0644]
tests/files/tags/didask_tekst/1.expected.html [new file with mode: 0644]
tests/files/tags/didask_tekst/1.xml [new file with mode: 0644]
tests/files/tags/didaskalia/1.expected.html [new file with mode: 0644]
tests/files/tags/didaskalia/1.xml [new file with mode: 0644]
tests/files/tags/dlugi_cytat/1.expected.html [new file with mode: 0644]
tests/files/tags/dlugi_cytat/1.xml [new file with mode: 0644]
tests/files/tags/dzielo_nadrzedne/1.expected.html [new file with mode: 0644]
tests/files/tags/dzielo_nadrzedne/1.xml [new file with mode: 0644]
tests/files/tags/ilustr/1.expected.html [new file with mode: 0644]
tests/files/tags/ilustr/1.xml [new file with mode: 0644]
tests/files/tags/indeks_dolny/1.expected.html [new file with mode: 0644]
tests/files/tags/indeks_dolny/1.xml [new file with mode: 0644]
tests/files/tags/kwestia/1.expected.html [new file with mode: 0644]
tests/files/tags/kwestia/1.xml [new file with mode: 0644]
tests/files/tags/kwestia/2.expected.html [new file with mode: 0644]
tests/files/tags/kwestia/2.xml [new file with mode: 0644]
tests/files/tags/lista_osob/1.expected.html [new file with mode: 0644]
tests/files/tags/lista_osob/1.xml [new file with mode: 0644]
tests/files/tags/mat/1.expected.html [new file with mode: 0644]
tests/files/tags/mat/1.xml [new file with mode: 0644]
tests/files/tags/motto/1.expected.html [new file with mode: 0644]
tests/files/tags/motto/1.xml [new file with mode: 0644]
tests/files/tags/motto_podpis/1.expected.html [new file with mode: 0644]
tests/files/tags/motto_podpis/1.xml [new file with mode: 0644]
tests/files/tags/naglowek_akt/1.expected.html [new file with mode: 0644]
tests/files/tags/naglowek_akt/1.xml [new file with mode: 0644]
tests/files/tags/naglowek_czesc/1.expected.html [new file with mode: 0644]
tests/files/tags/naglowek_czesc/1.xml [new file with mode: 0644]
tests/files/tags/naglowek_osoba/1.expected.html [new file with mode: 0644]
tests/files/tags/naglowek_osoba/1.xml [new file with mode: 0644]
tests/files/tags/naglowek_podrozdzial/1.expected.html [new file with mode: 0644]
tests/files/tags/naglowek_podrozdzial/1.xml [new file with mode: 0644]
tests/files/tags/naglowek_rozdzial/1.expected.html [new file with mode: 0644]
tests/files/tags/naglowek_rozdzial/1.xml [new file with mode: 0644]
tests/files/tags/nazwa_utworu/1.expected.html [new file with mode: 0644]
tests/files/tags/nazwa_utworu/1.xml [new file with mode: 0644]
tests/files/tags/nota/1.expected.html [new file with mode: 0644]
tests/files/tags/nota/1.xml [new file with mode: 0644]
tests/files/tags/nota/2.expected.html [new file with mode: 0644]
tests/files/tags/nota/2.xml [new file with mode: 0644]
tests/files/tags/nota/3.expected.html [new file with mode: 0644]
tests/files/tags/nota/3.xml [new file with mode: 0644]
tests/files/tags/nota/4.expected.html [new file with mode: 0644]
tests/files/tags/nota/4.xml [new file with mode: 0644]
tests/files/tags/nota/5.expected.html [new file with mode: 0644]
tests/files/tags/nota/5.xml [new file with mode: 0644]
tests/files/tags/nota/6.expected.html [new file with mode: 0644]
tests/files/tags/nota/6.xml [new file with mode: 0644]
tests/files/tags/numeracja/1.expected.html [new file with mode: 0644]
tests/files/tags/numeracja/1.xml [new file with mode: 0644]
tests/files/tags/osoba/1.expected.html [new file with mode: 0644]
tests/files/tags/osoba/1.xml [new file with mode: 0644]
tests/files/tags/pa/1.expected.html [new file with mode: 0644]
tests/files/tags/pa/1.xml [new file with mode: 0644]
tests/files/tags/pe/1.expected.html [new file with mode: 0644]
tests/files/tags/pe/1.xml [new file with mode: 0644]
tests/files/tags/pe/2.expected.html [new file with mode: 0644]
tests/files/tags/pe/2.xml [new file with mode: 0644]
tests/files/tags/podtytul/1.expected.html [new file with mode: 0644]
tests/files/tags/podtytul/1.xml [new file with mode: 0644]
tests/files/tags/poezja_cyt/1.expected.html [new file with mode: 0644]
tests/files/tags/poezja_cyt/1.xml [new file with mode: 0644]
tests/files/tags/pr/1.expected.html [new file with mode: 0644]
tests/files/tags/pr/1.xml [new file with mode: 0644]
tests/files/tags/pt/1.expected.html [new file with mode: 0644]
tests/files/tags/pt/1.xml [new file with mode: 0644]
tests/files/tags/ref/1.expected.html [new file with mode: 0644]
tests/files/tags/ref/1.xml [new file with mode: 0644]
tests/files/tags/rownolegle/1.expected.html [new file with mode: 0644]
tests/files/tags/rownolegle/1.xml [new file with mode: 0644]
tests/files/tags/sekcja_asterysk/1.expected.html [new file with mode: 0644]
tests/files/tags/sekcja_asterysk/1.xml [new file with mode: 0644]
tests/files/tags/sekcja_swiatlo/1.expected.html [new file with mode: 0644]
tests/files/tags/sekcja_swiatlo/1.xml [new file with mode: 0644]
tests/files/tags/separator_linia/1.expected.html [new file with mode: 0644]
tests/files/tags/separator_linia/1.xml [new file with mode: 0644]
tests/files/tags/slowo_obce/1.expected.html [new file with mode: 0644]
tests/files/tags/slowo_obce/1.xml [new file with mode: 0644]
tests/files/tags/srodtytul/1.expected.html [new file with mode: 0644]
tests/files/tags/srodtytul/1.xml [new file with mode: 0644]
tests/files/tags/strofa/1.expected.html [new file with mode: 0644]
tests/files/tags/strofa/1.xml [new file with mode: 0644]
tests/files/tags/tab/1.expected.html [new file with mode: 0644]
tests/files/tags/tab/1.xml [new file with mode: 0644]
tests/files/tags/tabela/1.expected.html [new file with mode: 0644]
tests/files/tags/tabela/1.xml [new file with mode: 0644]
tests/files/tags/tytul_dziela/1.expected.html [new file with mode: 0644]
tests/files/tags/tytul_dziela/1.xml [new file with mode: 0644]
tests/files/tags/tytul_dziela/2.expected.html [new file with mode: 0644]
tests/files/tags/tytul_dziela/2.xml [new file with mode: 0644]
tests/files/tags/wers_cd/1.expected.html [new file with mode: 0644]
tests/files/tags/wers_cd/1.xml [new file with mode: 0644]
tests/files/tags/wers_do_prawej/1.expected.html [new file with mode: 0644]
tests/files/tags/wers_do_prawej/1.xml [new file with mode: 0644]
tests/files/tags/wers_wciety/1.expected.html [new file with mode: 0644]
tests/files/tags/wers_wciety/1.xml [new file with mode: 0644]
tests/files/tags/wers_wciety/2.expected.html [new file with mode: 0644]
tests/files/tags/wers_wciety/2.xml [new file with mode: 0644]
tests/files/tags/wieksze_odstepy/1.expected.html [new file with mode: 0644]
tests/files/tags/wieksze_odstepy/1.xml [new file with mode: 0644]
tests/files/tags/www/1.expected.html [new file with mode: 0644]
tests/files/tags/www/1.xml [new file with mode: 0644]
tests/files/tags/wyroznienie/1.expected.html [new file with mode: 0644]
tests/files/tags/wyroznienie/1.xml [new file with mode: 0644]
tests/files/tags/wywiad_pyt/1.expected.html [new file with mode: 0644]
tests/files/tags/wywiad_pyt/1.xml [new file with mode: 0644]
tests/files/tags/zastepnik_wersu/1.expected.html [new file with mode: 0644]
tests/files/tags/zastepnik_wersu/1.xml [new file with mode: 0644]
tests/files/text/abstrakt.expected.html [new file with mode: 0644]
tests/files/text/abstrakt.xml
tests/files/text/asnyk_miedzy_nami_expected.html
tests/files/text/asnyk_miedzy_nami_expected.legacy.html [deleted file]
tests/files/text/asnyk_miedzy_nami_fragments.html
tests/files/text/asnyk_miedzy_nami_refs.html
tests/test_html.py
tests/test_html_annotations.py
tests/test_html_examples.py [new file with mode: 0644]
tests/test_html_fragments.py
tests/test_html_transform_abstrakt.py
tests/test_picture.py [deleted file]
tests/test_ref.py
tox.ini

diff --git a/scripts/book2html b/scripts/book2html
deleted file mode 100755 (executable)
index 8eadb04..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env python
-# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
-#
-from librarian.book2anything import Book2Anything, Option
-
-
-class Book2Html(Book2Anything):
-    format_name = "HTML"
-    ext = "html"
-    uses_cover = False
-    uses_provider = False
-    transform_flags = [
-        Option('-r', '--raw', dest='full-page',
-                action='store_false', default=True,
-                help='output raw text for use in templates')
-    ]
-    transform_options = [
-        Option('--css', dest='css'),
-        Option(
-            '-b', '--base-url', dest='base_url', metavar='URL',
-            help='specifies the base URL for relative image references'
-        ),
-    ]
-    parser_options = [
-        Option('-i', '--ignore-dublin-core', dest='parse_dublincore', 
-                action='store_false', default=True,
-                help='don\'t try to parse dublin core metadata')
-    ]
-
-
-if __name__ == '__main__':
-    Book2Html.run()
index 494b3f2..184db52 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -40,7 +40,6 @@ setup(
         'Pillow>=9.1.0',
         'texml',
         'ebooklib',
-        'aeneas',
         'mutagen',
         'qrcode',
         'requests',
index c706cbd..4949879 100644 (file)
@@ -5,8 +5,6 @@ from copy import deepcopy
 import subprocess
 import tempfile
 import zipfile
-from aeneas.executetask import ExecuteTask
-from aeneas.task import Task
 from lxml import etree
 import mutagen
 from librarian import OutputFile, get_resource
@@ -117,75 +115,11 @@ class DaisyBuilder:
                 directory + "book%d.mp3" % i,
             )
 
-            config_string = "task_language=pol|is_text_type=unparsed|is_text_unparsed_id_regex=sec\d+$|is_text_unparsed_id_sort=numeric|os_task_file_format=tab"
-            task = Task(config_string=config_string)
-
-            with tempfile.TemporaryDirectory() as temp:
-                syncfile = temp + "/sync"
-                task.audio_file_path_absolute = mp3[i]
-                task.text_file_path_absolute = html.get_filename()
-                task.sync_map_file_path_absolute = syncfile
-
-                ExecuteTask(task).execute()
-                task.output_sync_map_file()
-
-                sync = []
-                with open(syncfile) as f:
-                    for line in f:
-                        start, end, sec = line.strip().split('\t')
-                        start = float(start)
-                        end = float(end)
-                        sync.append([start, end, sec])
-
-            hms = format_hms(durations[i])
-            elapsed_hms = format_hms(sum(durations[:i]))
-
-            context = {
-                "VERSION": "1.10",
-
-                "HHMMSSmmm": hms,
-                "HHMMSS": hms.split('.')[0],
-                "Sd": "%.1f" % durations[i],
-                "ELAPSED": elapsed_hms,
-
-                "TITLE": document.meta.title,
-                "PUBLISHER": document.meta.publisher[0],
-                "YEAR": document.meta.created_at[:4],
-                "MONTH": document.meta.created_at[5:7],
-                "AUTHOR": document.meta.author.readable(),
-
-                "NARRATOR": narrator,
-            }
-
-            with open(get_resource('res/daisy/content.smil')) as f:
-                tree = etree.parse(f)
             populate(tree.getroot(), context)
 
-            seq = tree.find('//seq')
-            for si, item in enumerate(sync):
-                par = etree.SubElement(seq, 'par', id="par%06d" % (si + 1), endsync="last")
-                etree.SubElement(
-                    par,
-                    "text",
-                    src="book%d.html#%s" % (i, item[2]))
-
-                audio = etree.SubElement(
-                    par,
-                    "audio",
-                    src="book%d.mp3" % i,
-                    **{
-                        "clip-begin": "npt=%.3fs" % item[0],
-                        "clip-end": "npt=%.3fs" % item[1],
-                    }
-                )
-
-            zipf.writestr(
+            zipf.write(
+                syncfiles[i],
                 directory + 'content%d.smil' % i,
-                etree.tostring(
-                    tree,
-                    xml_declaration=True,
-                    pretty_print=True,
-                ),
             )
 
         for fname in ('smil10.dtd', 'xhtml1-transitional.dtd', 'xhtml-lat1.ent', 'xhtml-special.ent', 'xhtml-symbol.ent'):
index 0499d43..f2177ae 100644 (file)
@@ -1,30 +1,38 @@
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
+from collections import defaultdict
+import os
 from urllib.request import urlopen
 from lxml import etree
-from librarian.html import add_anchors, add_table_of_contents, add_table_of_themes
+from librarian.html import add_table_of_contents, add_table_of_themes, add_image_sizes
 from librarian import OutputFile
 
 
 class HtmlBuilder:
     file_extension = "html"
-    with_anchors = True
     with_themes = True
     with_toc = True
     with_footnotes = True
     with_nota_red = True
+    with_ids = True
+    with_numbering = True
     no_externalities = False
     orphans = True
 
-    def __init__(self, base_url=None):
+    root_tag = 'div'
+    root_attrib = {'id': 'book-text'}
+
+    def __init__(self, gallery_path=None, gallery_url=None, base_url=None):
         self._base_url = base_url
+        self.gallery_path = gallery_path
+        self.gallery_url = gallery_url
 
-        self.tree = text = etree.Element('div', **{'id': 'book-text'})
+        self.tree = text = etree.Element(self.root_tag, **self.root_attrib)
         self.header = etree.Element('h1')
 
         self.footnotes = etree.Element('div', id='footnotes')
-        self.footnote_counter = 0
+        self.counters = defaultdict(lambda: 1)
 
         self.nota_red = etree.Element('div', id='nota_red')
 
@@ -61,19 +69,38 @@ class HtmlBuilder:
     def forget_fragment(self, name):
         del self.cursors[name]
 
-    def preprocess(self, document):
-        document._compat_assign_ordered_ids()
-        document._compat_assign_section_ids()
-
-    def build(self, document, **kwargs):
+    def build(self, document, element=None, **kwargs):
         self.document = document
 
-        self.preprocess(document)
-        document.tree.getroot().html_build(self)
+        self.assign_ids(self.document.tree)
+        self.prepare_images()
+
+        if element is None:
+            element = document.tree.getroot()
+
+        element.html_build(self)
         self.postprocess(document)
         return self.output()
 
+    def assign_ids(self, tree):
+        # Assign IDs depth-first, to account for any <numeracja> inside.
+        for _e, elem in etree.iterwalk(tree, events=('end',)):
+            if getattr(elem, 'NUMBERING', None):
+                elem.assign_id(self)
+
+    def prepare_images(self):
+        # Temporarily use the legacy method, before transitioning to external generators.
+        if self.gallery_path is None:
+            return
+        try:
+            os.makedirs(self.gallery_path)
+        except OSError:
+            pass
+        add_image_sizes(self.document.tree, self.gallery_path, self.gallery_url, self.base_url)
+
     def output(self):
+        if not len(self.tree):
+            return None
         return OutputFile.from_bytes(
             etree.tostring(
                 self.tree,
@@ -84,7 +111,7 @@ class HtmlBuilder:
         )
 
     def postprocess(self, document):
-        _ = document.tree.getroot().master.gettext
+        _ = document.tree.getroot().gettext
 
         if document.meta.translators:
             self.enter_fragment('header')
@@ -101,8 +128,6 @@ class HtmlBuilder:
         if len(self.header):
             self.tree.insert(0, self.header)
             
-        if self.with_anchors:
-            add_anchors(self.tree)
         if self.with_nota_red and len(self.nota_red):
             self.tree.append(self.nota_red)
         if self.with_themes:
@@ -110,7 +135,7 @@ class HtmlBuilder:
         if self.with_toc:
             add_table_of_contents(self.tree)
 
-        if self.footnote_counter:
+        if self.counters['fn'] > 1:
             fnheader = etree.Element("h3")
             fnheader.text = _("Footnotes")
             self.footnotes.insert(0, fnheader)
@@ -133,6 +158,15 @@ class HtmlBuilder:
         else:
             cursor.text = (cursor.text or '') + text
 
+    def add_visible_number(self, element):
+        assert '_id' in element.attrib, etree.tostring(element)
+        self.start_element('a', {
+            'href': f'#{element.attrib["_id"]}',
+            'class': 'wl-num',
+        })
+        self.push_text(element.attrib['_visible_numbering'])
+        self.end_element()
+
 
 class StandaloneHtmlBuilder(HtmlBuilder):
     css_url = "https://static.wolnelektury.pl/css/compressed/book_text.css"
@@ -148,7 +182,6 @@ class StandaloneHtmlBuilder(HtmlBuilder):
         head = etree.Element('head')
         tree.insert(0, head)
 
-
         etree.SubElement(head, 'meta', charset='utf-8')
         etree.SubElement(head, 'title').text = document.meta.title
 
@@ -185,23 +218,41 @@ class StandaloneHtmlBuilder(HtmlBuilder):
 
 
 class SnippetHtmlBuilder(HtmlBuilder):
-    with_anchors = False
     with_themes = False
     with_toc = False
     with_footnotes = False
     with_nota_red = False
-    with_refs = False
+    with_ids = False
+    with_numbering = False
+
+
+class AbstraktHtmlBuilder(HtmlBuilder):
+    with_themes = False
+    with_toc = False
+    with_footnotes = False
+    with_nota_red = False
+    with_ids = False
+    with_numbering = False
+
+    root_tag = 'blockquote'
+    root_attrib = {}
+
+    def build(self, document, element=None, **kwargs):
+        if element is None:
+            element = document.tree.find('//abstrakt')
+        element.attrib['_force'] = '1'
+        return super().build(document, element, **kwargs)
 
             
 class DaisyHtmlBuilder(StandaloneHtmlBuilder):
     file_extension = 'xhtml'
-    with_anchors = False
     with_themes = False
     with_toc = False
     with_footnotes = False
     with_nota_red = False
     with_deep_identifiers = False
     no_externalities = True
+    with_numbering = False
 
     def output(self):
         tree = etree.ElementTree(self.tree)
index 0b2349a..c56ae7a 100644 (file)
@@ -16,6 +16,7 @@ class MarquiseCover(Cover):
     additional_logos = []
     square_variant = False
 
+    background_color = '#000'
     width = 2100
     height = 2970
     margin = 100
index 910f5e1..ce03be2 100644 (file)
@@ -87,23 +87,7 @@ class Field:
         return False
 
 
-class DCInfo(type):
-    def __new__(mcs, classname, bases, class_dict):
-        fields = list(class_dict['FIELDS'])
-
-        for base in bases[::-1]:
-            if hasattr(base, 'FIELDS'):
-                for field in base.FIELDS[::-1]:
-                    try:
-                        fields.index(field)
-                    except ValueError:
-                        fields.insert(0, field)
-
-        class_dict['FIELDS'] = tuple(fields)
-        return super(DCInfo, mcs).__new__(mcs, classname, bases, class_dict)
-
-
-class WorkInfo(metaclass=DCInfo):
+class BookInfo:
     FIELDS = (
         Field(DCNS('creator'), 'authors', Person, salias='author',
               multiple=True),
@@ -140,6 +124,48 @@ class WorkInfo(metaclass=DCInfo):
         Field(WLNS('contentWarning'), 'content_warnings', multiple=True,
               required=False),
         Field(WLNS('developmentStage'), 'stage', required=False),
+
+        Field(DCNS('audience'), 'audiences', text.Audience, salias='audience', multiple=True,
+              required=False),
+
+        Field(DCNS('subject.period'), 'epochs', text.Epoch, salias='epoch', multiple=True,
+              required=False),
+        Field(DCNS('subject.type'), 'kinds', text.Kind, salias='kind', multiple=True,
+              required=False),
+        Field(DCNS('subject.genre'), 'genres', text.Genre, salias='genre', multiple=True,
+              required=False),
+        Field('category.legimi', 'legimi', text.LegimiCategory, required=False),
+        Field('category.thema.main', 'thema_main', text.MainThemaCategory, required=False),
+        Field('category.thema', 'thema', text.ThemaCategory, required=False, multiple=True),
+        Field(DCNS('subject.location'), 'location', required=False),
+
+        Field(DCNS('contributor.translator'), 'translators',
+              Person,  salias='translator', multiple=True, required=False),
+        Field(DCNS('relation.hasPart'), 'parts', WLURI,
+              multiple=True, required=False),
+        Field(DCNS('relation.isVariantOf'), 'variant_of', WLURI,
+              required=False),
+
+        Field(DCNS('relation.coverImage.url'), 'cover_url', required=False),
+        Field(DCNS('relation.coverImage.attribution'), 'cover_by',
+              required=False),
+        Field(DCNS('relation.coverImage.source'), 'cover_source',
+              required=False),
+        # WLCover-specific.
+        Field(WLNS('coverBarColor'), 'cover_bar_color', required=False),
+        Field(WLNS('coverBoxPosition'), 'cover_box_position', required=False),
+        Field(WLNS('coverClass'), 'cover_class', default=['default']),
+        Field(WLNS('coverLogoUrl'), 'cover_logo_urls', multiple=True,
+              required=False),
+        Field(WLNS('endnotes'), 'endnotes', BoolValue,
+              required=False),
+
+        Field('pdf-id',  'isbn_pdf',  required=False),
+        Field('epub-id', 'isbn_epub', required=False),
+        Field('mobi-id', 'isbn_mobi', required=False),
+        Field('txt-id',  'isbn_txt',  required=False),
+        Field('html-id', 'isbn_html', required=False),
+
     )
 
     @classmethod
@@ -350,50 +376,5 @@ class WorkInfo(metaclass=DCInfo):
         return result
 
 
-class BookInfo(WorkInfo):
-    FIELDS = (
-        Field(DCNS('audience'), 'audiences', text.Audience, salias='audience', multiple=True,
-              required=False),
-
-        Field(DCNS('subject.period'), 'epochs', text.Epoch, salias='epoch', multiple=True,
-              required=False),
-        Field(DCNS('subject.type'), 'kinds', text.Kind, salias='kind', multiple=True,
-              required=False),
-        Field(DCNS('subject.genre'), 'genres', text.Genre, salias='genre', multiple=True,
-              required=False),
-        Field('category.legimi', 'legimi', text.LegimiCategory, required=False),
-        Field('category.thema.main', 'thema_main', text.MainThemaCategory, required=False),
-        Field('category.thema', 'thema', text.ThemaCategory, required=False, multiple=True),
-        Field(DCNS('subject.location'), 'location', required=False),
-
-        Field(DCNS('contributor.translator'), 'translators',
-              Person,  salias='translator', multiple=True, required=False),
-        Field(DCNS('relation.hasPart'), 'parts', WLURI,
-              multiple=True, required=False),
-        Field(DCNS('relation.isVariantOf'), 'variant_of', WLURI,
-              required=False),
-
-        Field(DCNS('relation.coverImage.url'), 'cover_url', required=False),
-        Field(DCNS('relation.coverImage.attribution'), 'cover_by',
-              required=False),
-        Field(DCNS('relation.coverImage.source'), 'cover_source',
-              required=False),
-        # WLCover-specific.
-        Field(WLNS('coverBarColor'), 'cover_bar_color', required=False),
-        Field(WLNS('coverBoxPosition'), 'cover_box_position', required=False),
-        Field(WLNS('coverClass'), 'cover_class', default=['default']),
-        Field(WLNS('coverLogoUrl'), 'cover_logo_urls', multiple=True,
-              required=False),
-        Field(WLNS('endnotes'), 'endnotes', BoolValue,
-              required=False),
-
-        Field('pdf-id',  'isbn_pdf',  required=False),
-        Field('epub-id', 'isbn_epub', required=False),
-        Field('mobi-id', 'isbn_mobi', required=False),
-        Field('txt-id',  'isbn_txt',  required=False),
-        Field('html-id', 'isbn_html', required=False),
-    )
-
-
 def parse(file_name, cls=BookInfo):
     return cls.from_file(file_name)
index 7780b61..d61abb4 100644 (file)
@@ -18,6 +18,9 @@ class WLDocument:
         tree = etree.parse(source, parser=parser)
         self.tree = tree
         tree.getroot().document = self
+
+        self.preprocess()
+
         self.base_meta = dcparser.BookInfo({}, {
             DCNS('language'): ["pol"],
         }, validate_required=False)
@@ -33,6 +36,11 @@ class WLDocument:
         return self.tree.getroot().meta
         return master.meta
 
+    def preprocess(self):
+        # Change slash-verses into real verses.
+        for _e, elem in etree.iterwalk(self.tree, ('start',), 'strofa'):
+            elem.preprocess()
+
     @property
     def children(self):
         for part_uri in self.meta.parts or []:
@@ -46,76 +54,6 @@ class WLDocument:
     def build(self, builder, base_url=None, **kwargs):
         return builder(base_url=base_url).build(self, **kwargs)
 
-    def assign_ids(self, existing=None):
-        # Find all existing IDs.
-        existing = existing or set()
-        que = [self.tree.getroot()]
-        while que:
-            item = que.pop(0)
-            try:
-                item.normalize_insides()
-            except AttributeError:
-                pass
-            existing.add(item.attrib.get('id'))
-            que.extend(item)
-
-        i = 1
-        que = [self.tree.getroot()]
-        while que:
-            item = que.pop(0)
-            que.extend(item)
-            if item.attrib.get('id'):
-                continue
-            if not getattr(item, 'SHOULD_HAVE_ID', False):
-                continue
-            while f'e{i}' in existing:
-                i += 1
-            item.attrib['id'] = f'e{i}'
-            i += 1
-
-    def _compat_assign_ordered_ids(self):
-        """
-        Compatibility: ids in document order, to be roughly compatible with legacy
-        footnote ids. Just for testing consistency, change to some sane identifiers
-        at convenience.
-        """
-        EXPR = re.compile(r'/\s', re.MULTILINE | re.UNICODE)
-        def _compat_assign_ordered_ids_in_elem(elem, i):
-            if isinstance(elem, etree._Comment): return i
-            elem.attrib['_compat_ordered_id'] = str(i)
-            i += 1
-            if getattr(elem, 'HTML_CLASS', None) == 'stanza':
-                if elem.text:
-                    i += len(EXPR.split(elem.text)) - 1
-                for sub in elem:
-                    i = _compat_assign_ordered_ids_in_elem(sub, i)
-                    if sub.tail:
-                        i += len(EXPR.split(sub.tail)) - 1
-            else:
-                if elem.tag in ('uwaga', 'extra'):
-                    return i
-                for sub in elem:
-                    i = _compat_assign_ordered_ids_in_elem(sub, i)
-            return i
-
-        _compat_assign_ordered_ids_in_elem(self.tree.getroot(), 4)
-
-    def _compat_assign_section_ids(self):
-        """
-        Ids in master-section order. These need to be compatible with the
-        #secN anchors used by WL search results page to link to fragments.
-        """
-        def _compat_assigns_section_ids_in_elem(elem, prefix='sec'):
-            for i, child in enumerate(elem):
-                idfier = '{}{}'.format(prefix, i + 1)
-                try:
-                    child.attrib['_compat_section_id'] = idfier
-                except:
-                    pass
-                _compat_assigns_section_ids_in_elem(child, idfier + '-')
-        _compat_assigns_section_ids_in_elem(self.tree.getroot().master)
-
-
     def editors(self):
         persons = set(self.meta.editors
                       + self.meta.technical_editors)
index b0d16ed..2349f16 100644 (file)
@@ -40,6 +40,7 @@ class WLElement(etree.ElementBase):
    
     CAN_HAVE_TEXT = True
     STRIP = False
+    NUMBERING = None
 
     text_substitutions = [
         ('---', '—'),
@@ -85,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:
@@ -136,7 +146,8 @@ class WLElement(etree.ElementBase):
         for i, child in enumerate(self):
             if isinstance(child, WLElement):
                 getattr(child, build_method)(builder)
-            elif getattr(builder, 'debug') and child.tag is etree.Comment:
+            # 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)
@@ -167,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,
@@ -315,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):
index 4076541..265b268 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class Dedykacja(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_LEGACY_TOP_MARGIN = 2
 
index 8a8d8bd..dbba883 100644 (file)
@@ -9,3 +9,5 @@ class Nota(WLElement):
 
     EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "note"
+
+    SUPPRESS_NUMBERING = {'main': 'i'}
index 09be8ae..f54a455 100644 (file)
@@ -9,7 +9,9 @@ class Abstrakt(WLElement):
         pass
 
     def html_build(self, builder):
-        pass
+        if not self.attrib['_force']:
+            return
+        return super().html_build(builder)
 
     def epub_build(self, builder):
         pass
index ed43cae..8f461dd 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class Didaskalia(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_PARGIN = 2
     TXT_BOTTOM_MARGIN = 2
@@ -14,5 +14,5 @@ class Didaskalia(WLElement):
     TXT_PREFIX = "/ "
     TXT_SUFFIX = " /"
 
-    EPUB_TAG =_HTML_TAG = "div"
+    EPUB_TAG = HTML_TAG = "div"
     EPUB_CLASS = HTML_CLASS = "didaskalia"
index 0727698..f9e210d 100644 (file)
@@ -6,8 +6,8 @@ from ..base import WLElement
 
 
 class ListaOsob(WLElement):
+    NUMBERING = 'i'
     CAN_HAVE_TEXT = False
-    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 3
index e4243df..2341918 100644 (file)
@@ -5,6 +5,8 @@ from ..base import WLElement
 
 
 class ListaOsoba(WLElement):
+    NUMBERING = "i"
+
     TXT_TOP_MARGIN = 1
     TXT_BOTTOM_MARGIN = 1
     TXT_LEGACY_TOP_MARGIN = 1
@@ -12,6 +14,7 @@ class ListaOsoba(WLElement):
     TXT_PREFIX = " * "
 
     EPUB_TAG = HTML_TAG = "li"
+    HTML_CLASS = "wl"
 
     def html_build(self, builder):
         builder.enter_fragment('list')
index 313109c..48e748e 100644 (file)
@@ -5,8 +5,9 @@ from ..paragraphs import Akap
 
 
 class MiejsceCzas(Akap):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
+
+    HTML_CLASS = 'wl place-and-time'
 
     EPUB_TAG = "div"
-    EPUB_CLASS = HTML_CLASS = 'place-and-time'
-    
+    EPUB_CLASS = 'place-and-time'
index 646833c..0918ba8 100644 (file)
@@ -5,9 +5,10 @@ from ..base import WLElement
 
 
 class NaglowekListy(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     HTML_TAG = "h3"
+    HTML_CLASS = "wl"
 
     EPUB_TAG = "div"
     EPUB_CLASS = "h3"
index dde0c0c..43aa1d3 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class NaglowekOsoba(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
index 3479a02..6b0619a 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class Animacja(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     HTML_TAG = 'div'
     HTML_CLASS = "animacja cycle-slideshow"
index 4e848ac..51bae4e 100644 (file)
@@ -12,13 +12,36 @@ MAX_PNG_WEIGHT = 200000
 
 
 class Ilustr(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     EPUB_TAG = HTML_TAG = 'img'
 
     def get_html_attr(self, builder):
-        ## TODO: thumbnail.
+        cls = 'ilustr'
+        if self.attrib.get('wyrownanie'):
+            cls += ' ' + self.attrib['wyrownanie']
+        if self.attrib.get('oblew'):
+            cls += ' oblew'
+        attr = {
+            'class': cls,
+            'alt': self.attrib.get('alt', ''),
+            'title': self.attrib.get('alt', ''),
+            'src': self.attrib.get('src', ''),
+            }
+        if self.attrib.get('srcset'):
+            attr['srcset'] = self.attrib['srcset']
+            attr['sizes'] = '''
+            (min-width: 718px) 600px,
+            (min-width: 600px) calc(100vw - 118px),
+            (min-width: 320px) calc(100vw - 75px),
+            (min-width: 15em) calc(100wv - 60px),
+            calc(100wv - 40px)
+            '''
+        if self.attrib.get('szer'):
+            attr['style'] = 'width: ' + self.attrib['szer']
+        return attr
 
+    def get_epub_attr(self, builder):
         url = urllib.parse.urljoin(
             builder.base_url,
             self.get('src')
@@ -69,5 +92,3 @@ class Ilustr(WLElement):
             'alt': self.attrib.get('alt', ''),
             'title': self.attrib.get('alt', ''),
         }
-
-    get_epub_attr = get_html_attr
index 737166f..783fcb6 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class Tabela(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     EPUB_TAG = HTML_TAG = 'table'
 
index 76be8e8..a94b968 100644 (file)
@@ -6,8 +6,10 @@ from ..base import WLElement
 
 class Footnote(WLElement):
     NO_TOC = True
+    DISABLE_NUMBERING = True
     START_INLINE = True
     ASIDE = True
+    NUMBERING = 'fn'
 
     def signal(self, signal):
         if signal == 'INLINE':
@@ -22,10 +24,9 @@ class Footnote(WLElement):
         if not builder.with_footnotes:
             return
 
-        builder.footnote_counter += 1
-        fn_no = builder.footnote_counter
-        footnote_id = 'footnote-idm{}'.format(self.attrib['_compat_ordered_id'])
-        anchor_id = 'anchor-idm{}'.format(self.attrib['_compat_ordered_id'])
+        fn_no = self.attrib.get('_visible_numbering')
+        footnote_id = 'footnote-id{}'.format(fn_no)
+        anchor_id = 'anchor-id{}'.format(fn_no)
 
         # Add anchor.
         builder.start_element(
index 555cb92..3e35b0b 100644 (file)
@@ -8,7 +8,7 @@ class AutorUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 2
     TXT_LEGACY_BOTTOM_MARGIN = 2
 
-    HTML_CLASS = 'author'
+    HTML_CLASS = 'wl author'
 
     def epub_build(self, builder):
         return
index 04d286e..ad16ca3 100644 (file)
@@ -5,8 +5,8 @@ from ..base import WLElement
 
 
 class HeaderElement(WLElement):
+    NUMBERING = 'i'
     HTML_TAG = 'span'
-    SHOULD_HAVE_ID = True
     
     def txt_build(self, builder):
         builder.enter_fragment('header')
index bbc30b1..cc70164 100644 (file)
@@ -8,7 +8,7 @@ class DzieloNadrzedne(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
     TXT_LEGACY_BOTTOM_MARGIN = 1
 
-    HTML_CLASS = "collection"
+    HTML_CLASS = "wl collection"
 
     def epub_build(self, builder):
         return
index ab6d13c..a6769b8 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class Motto(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_LEGACY_TOP_MARGIN = 4
     TXT_LEGACY_BOTTOM_MARGIN = 2
index 3441263..199da84 100644 (file)
@@ -5,9 +5,10 @@ from ..base import WLElement
 
 
 class MottoPodpis(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
+
     HTML_TAG = "p"
-    EPUB_CLASS = HTML_CLASS = "motto_podpis"
+    HTML_CLASS = "wl motto_podpis"
 
     EPUB_TAG = "div"
-    
+    EPUB_CLASS = "motto_podpis"
index 376b932..dd40266 100644 (file)
@@ -8,7 +8,7 @@ class NazwaUtworu(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
     TXT_LEGACY_BOTTOM_MARGIN = 1
 
-    HTML_CLASS = 'title'
+    HTML_CLASS = 'wl title'
 
     EPUB_TAG = 'h2'
     EPUB_CLASS = 'intitle'
index e602571..711b3fa 100644 (file)
@@ -8,7 +8,7 @@ class Podtytul(HeaderElement):
     TXT_BOTTOM_MARGIN = 1
     TXT_LEGACY_BOTTOM_MARGIN = 1
 
-    HTML_CLASS = 'subtitle'
+    HTML_CLASS = 'wl subtitle'
 
     EPUB_TAG = 'h2'
     EPUB_CLASS = 'insubtitle'
index 9ce9ebb..11991ae 100644 (file)
@@ -5,8 +5,8 @@ from ..base import WLElement
 
 
 class NaglowekCzesc(WLElement):
+    NUMBERING = 's'
     SECTION_PRECEDENCE = 1
-    SHOULD_HAVE_ID = True
     
     TXT_TOP_MARGIN = 5
     TXT_BOTTOM_MARGIN = 2
@@ -14,6 +14,7 @@ class NaglowekCzesc(WLElement):
     TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_TAG = HTML_TAG = "h2"
+    HTML_CLASS = "wl"
 
     EPUB_CLASS = "h2"
     EPUB_START_CHUNK = True
index 26c8049..213ec00 100644 (file)
@@ -5,8 +5,8 @@ from ..base import WLElement
 
 
 class NaglowekPodrozdzial(WLElement):
+    NUMBERING = 's'
     SECTION_PRECEDENCE = 3
-    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 3
     TXT_BOTTOM_MARGIN = 2
index 65194d3..502dea1 100644 (file)
@@ -5,8 +5,8 @@ from ..base import WLElement
 
 
 class NaglowekRozdzial(WLElement):
+    NUMBERING = 's'
     SECTION_PRECEDENCE = 2
-    SHOULD_HAVE_ID = True
     
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
@@ -14,6 +14,7 @@ class NaglowekRozdzial(WLElement):
     TXT_LEGACY_BOTTOM_MARGIN = 0
 
     HTML_TAG = 'h3'
+    HTML_CLASS = 'wl'
 
     EPUB_TAG = 'h2'
     EPUB_CLASS = 'h3'
index eb2c356..e9ea5c7 100644 (file)
@@ -5,8 +5,8 @@ from ..base import WLElement
 
 
 class NaglowekScena(WLElement):
+    NUMBERING = 's'
     SECTION_PRECEDENCE = 2
-    SHOULD_HAVE_ID = True
 
     TXT_TOP_MARGIN = 4
     TXT_BOTTOM_MARGIN = 2
index 6b8ed75..14c6536 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class PodtytulCzesc(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
index bf3fcfe..239891e 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class PodtytulPodrozdzial(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
index ac455c3..f24fba7 100644 (file)
@@ -5,7 +5,7 @@ from ..base import WLElement
 
 
 class PodtytulRozdzial(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
index 9df8492..63f74b5 100644 (file)
@@ -6,15 +6,19 @@ from ..base import WLElement
 
 class Akap(WLElement):
     STRIP = True
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'main'
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
     TXT_LEGACY_TOP_MARGIN = 2
     TXT_LEGACY_BOTTOM_MARGIN = 0
 
+    EPUB_CLASS = 'paragraph'
+
     HTML_TAG = 'p'
-    EPUB_CLASS = HTML_CLASS = 'paragraph'
+    HTML_CLASS = 'wl paragraph'
+
+    has_visible_numbering = True
 
     @property
     def EPUB_TAG(self):
index 7ce3f3a..bccb01b 100644 (file)
@@ -8,7 +8,7 @@ from .wers import Wers
 
 
 class Strofa(WLElement):
-    SHOULD_HAVE_ID = True
+    NUMBERING = 'i'
 
     TXT_TOP_MARGIN = 2
     TXT_BOTTOM_MARGIN = 2
@@ -28,8 +28,8 @@ class Strofa(WLElement):
         )
         builder.push_text('\u00a0');
         builder.end_element()
-    
-    def get_verses(self):
+
+    def preprocess(self):
         from librarian.parser import parser
 
         verses = [
@@ -57,15 +57,15 @@ class Strofa(WLElement):
             else:
                 verses[-1].append(child)
 
-        for verse in verses:
-            verse.stanza = self
-            if len(verse) == 1 and isinstance(verse[0], Wers):
-                assert not (verse.text or '').strip()
-                assert not (verse[0].tail or '').strip()
-                yield verse[0]
-            else:
-                yield verse
+        verses = [
+            verse[0] if len(verse) == 1 and isinstance(verse[0], Wers)
+            else verse
+            for verse in verses
+        ]
+
+        while len(self):
+            self.remove(self[0])
+        self.text = None
 
-    def _build_inner(self, builder, build_method):
-        for child in self.get_verses():
-            getattr(child, build_method)(builder)
+        for verse in verses:
+            self.append(verse)
index edc4c7c..127d5bd 100644 (file)
@@ -13,7 +13,10 @@ class Wers(WLElement):
     TXT_LEGACY_BOTTOM_MARGIN = 0
 
     EPUB_TAG = HTML_TAG = 'div'
-    EPUB_CLASS = HTML_CLASS = 'verse'
+    EPUB_CLASS = 'verse'
+    HTML_CLASS = 'wl verse'
+
+    NUMBERING = 'main'
 
     @property
     def meta(self):
@@ -25,3 +28,27 @@ class Wers(WLElement):
         super()._epub_build_inner(builder)
         builder.push_text('''\u00a0''')
 
+    @property
+    def has_visible_numbering(self):
+        try:
+            number = int(self.attrib['_visible_numbering'])
+        except:
+            return False
+        return number == 1 or not(number % 5)
+
+    @property
+    def is_stretched(self):
+        return self.find('.//tab[@szer="*"]') is not None
+
+    def get_html_attr(self, builder):
+        attr = super().get_html_attr(builder)
+        if self.is_stretched:
+            attr['class'] += ' verse-stretched'
+        return attr
+
+    def _html_build_inner(self, builder):
+        if self.is_stretched:
+            builder.start_element('span')
+        super()._html_build_inner(builder)
+        if self.is_stretched:
+            builder.end_element()
index 394684c..8d0a9dc 100644 (file)
@@ -7,9 +7,7 @@ from .wers import Wers
 class WersAkap(Wers):
     TXT_PREFIX = '  '
 
-    HTML_ATTR = {
-        "style": "padding-left: 1em"
-    }
+    HTML_CLASS = Wers.HTML_CLASS + ' verse-p'
 
     EPUB_ATTR = {
         "style": "margin-left: 1em"
index 49d5a6b..2350c30 100644 (file)
@@ -4,14 +4,12 @@
 from .wers import Wers
 
 class WersCd(Wers):
+    HTML_CLASS = Wers.HTML_CLASS + ' verse-cont'
+
     def _txt_build_inner(self, builder):
         builder.push_text(' ' * 24, prepared=True)
         super(WersCd, self)._txt_build_inner(builder)
 
-    HTML_ATTR = {
-        "style": "padding-left: 12em",
-    }
-
     EPUB_ATTR = {
         "style": "margin-left: 12em",
     }
index b3c8ae9..59e639c 100644 (file)
@@ -7,6 +7,8 @@ from .wers import Wers
 class WersDoPrawej(Wers):
     TXT_PREFIX = '                       '
 
-    EPUB_ATTR = HTML_ATTR = {
+    HTML_CLASS = Wers.HTML_CLASS + ' verse-right'
+
+    EPUB_ATTR = {
         "style": "text-align: right",
     }
index b8088c5..eaef5c9 100644 (file)
@@ -7,6 +7,8 @@ from .wers import Wers
 class WersSrodek(Wers):
     TXT_PREFIX = '           '
 
-    EPUB_ATTR = HTML_ATTR = {
+    HTML_CLASS = Wers.HTML_CLASS + ' verse-center'
+
+    EPUB_ATTR = {
         "style": "text-align: center",
     }
index 8fbd175..4a2744a 100644 (file)
@@ -5,6 +5,8 @@ from .wers import Wers
 
 
 class WersWciety(Wers):
+    HTML_CLASS = Wers.HTML_CLASS + ' verse-indent'
+
     @property
     def typ(self):
         v = self.attrib.get('typ')
@@ -19,7 +21,7 @@ class WersWciety(Wers):
 
     def get_html_attr(self, builder):
         attr = super(WersWciety, self).get_html_attr(builder)
-        attr['style'] = "padding-left: {}em".format(self.typ)
+        attr['class'] += f" verse-indent-{self.typ}"
         return attr
 
     def get_epub_attr(self, builder):
index 7022d1f..4655829 100644 (file)
@@ -5,10 +5,15 @@ from ..base import WLElement
 
 
 class WWW(WLElement):
-    EPUB_TAG = 'a'
+    HTML_TAG = EPUB_TAG = 'a'
 
     def get_epub_attr(self, builder):
         attr = super().get_epub_attr(builder)
         attr['href'] = self.text
         return attr
 
+    def get_html_attr(self, builder):
+        attr = super().get_epub_attr(builder)
+        attr['target'] = '_blank'
+        attr['href'] = self.text
+        return attr
index 99f81d9..c4820b1 100644 (file)
@@ -5,11 +5,13 @@ from ..base import WLElement
 
 
 class Numeracja(WLElement):
-    pass
+    NUMBERING = True
+    def assign_id(self, builder):
+        builder.counters['_visible'] = int(self.get('start', 1))
 
 
 class Rownolegle(WLElement):
-    def build_epub(self, builder):
+    def epub_build(self, builder):
         for i, block in enumerate(self):
             attr = {"class": "rownolegly-blok"}
             if not i:
@@ -17,16 +19,49 @@ class Rownolegle(WLElement):
             if i == len(self) - 1:
                 attr['class'] += ' last'
             builder.start_element('div', attr)
-            self.build_epub(block, builder)
+            block.epub_build(builder)
             builder.end_element()
 
+    def html_build(self, builder):
+        for i, block in enumerate(self):
+            attr = {"class": "paralell-block"}
+            if not i:
+                attr['class'] += ' paralell-block-first'
+            if i == len(self) - 1:
+                attr['class'] += ' paralell-block-last'
+            builder.start_element('div', attr)
+            block.html_build(builder)
+            builder.end_element()
+
+
 
 class Tab(WLElement):
     EPUB_TAG = HTML_TAG = 'span'
 
+    def html_build(self, builder):
+        szer = self.get('szer', '1')
+        if szer == '*':
+            reopen = []
+            from lxml import etree
+            p = builder.cursor
+            while 'verse' not in p.attrib.get('class', ''):
+                reopen.append(p)
+                p = p.getparent()
+                builder.end_element()
+            builder.start_element('span', {'class': 'verse-stretched-space'})
+            builder.end_element()
+            while reopen:
+                p = reopen.pop()
+                builder.start_element(p.tag, p.attrib)
+        else:
+            super().html_build(builder)
+
     def get_html_attr(self, builder):
+        szer = self.get('szer', '1').strip()
+        if szer.endswith('em'):
+            szer = szer[:-2]
         try:
-            szer = int(self.get('szer', 1))
+            szer = int(szer)
         except:
             szer = 1
         return {
@@ -35,4 +70,3 @@ class Tab(WLElement):
         }
 
     get_epub_attr = get_html_attr
-
index 2919498..a96e975 100644 (file)
@@ -9,43 +9,9 @@ import urllib.parse
 import urllib.request
 
 from lxml import etree
-from librarian import XHTMLNS, ParseError, OutputFile
 from librarian import functions
 from PIL import Image
 
-from lxml.etree import XMLSyntaxError, XSLTApplyError
-
-
-functions.reg_substitute_entities()
-functions.reg_person_name()
-
-STYLESHEETS = {
-    'legacy': 'xslt/book2html.xslt',
-}
-
-
-def get_stylesheet(name):
-    return os.path.join(os.path.dirname(__file__), STYLESHEETS[name])
-
-
-def html_has_content(text):
-    return etree.ETXPath(
-        '//p|//{%(ns)s}p|//h1|//{%(ns)s}h1' % {'ns': str(XHTMLNS)}
-    )(text)
-
-
-def transform_abstrakt(abstrakt_element):
-    style_filename = get_stylesheet('legacy')
-    style = etree.parse(style_filename)
-    xml = etree.tostring(abstrakt_element, encoding='unicode')
-    document = etree.parse(io.StringIO(
-        xml.replace('<abstrakt', '<dlugi_cytat').replace('</abstrakt', '</dlugi_cytat')
-    ))  # HACK
-    result = document.xslt(style)
-    html = re.sub('<a name="sec[0-9]*"/>', '',
-                  etree.tostring(result, encoding='unicode'))
-    return re.sub('</?blockquote[^>]*>', '', html)
-
 
 def add_image_sizes(tree, gallery_path, gallery_url, base_url):
     widths = [360, 600, 1200, 1800, 2400]
@@ -92,65 +58,6 @@ def add_image_sizes(tree, gallery_path, gallery_url, base_url):
         f.close()
 
 
-def transform(wldoc, stylesheet='legacy', options=None, flags=None, css=None, gallery_path='img/', gallery_url='img/', base_url='file://./'):
-    """Transforms the WL document to XHTML.
-
-    If output_filename is None, returns an XML,
-    otherwise returns True if file has been written,False if it hasn't.
-    File won't be written if it has no content.
-    """
-    # Parse XSLT
-    try:
-        style_filename = get_stylesheet(stylesheet)
-        style = etree.parse(style_filename)
-
-        document = copy.deepcopy(wldoc)
-        del wldoc
-        document.swap_endlines()
-
-        if flags:
-            for flag in flags:
-                document.edoc.getroot().set(flag, 'yes')
-
-        document.clean_ed_note()
-        document.clean_ed_note('abstrakt')
-        document.fix_pa_akap()
-        
-        if not options:
-            options = {}
-
-        try:
-            os.makedirs(gallery_path)
-        except OSError:
-            pass
-
-        add_image_sizes(document.edoc, gallery_path, gallery_url, base_url)
-
-        css = (
-            css
-            or 'https://static.wolnelektury.pl/css/compressed/book_text.css'
-        )
-        css = "'%s'" % css
-        result = document.transform(style, css=css, **options)
-        del document  # no longer needed large object :)
-
-        if html_has_content(result):
-            add_anchors(result.getroot())
-            add_table_of_themes(result.getroot())
-            add_table_of_contents(result.getroot())
-
-            return OutputFile.from_bytes(etree.tostring(
-                result, method='html', xml_declaration=False,
-                pretty_print=True, encoding='utf-8'
-            ))
-        else:
-            return None
-    except KeyError:
-        raise ValueError("'%s' is not a valid stylesheet.")
-    except (XMLSyntaxError, XSLTApplyError) as e:
-        raise ParseError(e)
-
-
 class Fragment:
     def __init__(self, id, themes):
         super(Fragment, self).__init__()
@@ -265,7 +172,7 @@ def extract_fragments(input_filename):
         else:
             # Omit annotation tags
             if (len(element.get('name', '')) or
-                    element.get('class', '') in ('annotation', 'anchor')):
+                    element.get('class', '') in ('annotation-anchor', 'anchor', 'wl-num', 'reference')):
                 if event == 'end' and element.tail:
                     for fragment_id in open_fragments:
                         open_fragments[fragment_id].append(
@@ -283,24 +190,16 @@ def extract_fragments(input_filename):
     return closed_fragments, open_fragments
 
 
-def add_anchor(element, prefix, with_link=True, with_target=True,
-               link_text=None):
+def add_anchor(element, prefix, link_text=None):
     parent = element.getparent()
     index = parent.index(element)
 
-    if with_link:
-        if link_text is None:
-            link_text = prefix
-        anchor = etree.Element('a', href='#%s' % prefix)
-        anchor.set('class', 'anchor')
-        anchor.text = str(link_text)
-        parent.insert(index, anchor)
-
-    if with_target:
-        anchor_target = etree.Element('a', name='%s' % prefix)
-        anchor_target.set('class', 'target')
-        anchor_target.text = ' '
-        parent.insert(index, anchor_target)
+    if link_text is None:
+        link_text = prefix
+    anchor = etree.Element('a', href='#%s' % prefix)
+    anchor.set('class', 'anchor')
+    anchor.text = str(link_text)
+    parent.insert(index, anchor)
 
 
 def any_ancestor(element, test):
@@ -310,43 +209,9 @@ def any_ancestor(element, test):
     return False
 
 
-def add_anchors(root):
-    counter = 1
-    visible_counter = 1
-    for element in root.iterdescendants():
-        def f(e):
-            return (
-                e.get('class') in (
-                    'note', 'motto', 'motto_podpis', 'dedication', 'frame'
-                )
-                or e.get('id') == 'nota_red'
-                or e.tag == 'blockquote'
-                or e.get('id') == 'footnotes'
-            )
-
-        if element.get('class') == 'numeracja':
-            try:
-                visible_counter = int(element.get('data-start'))
-            except ValueError:
-                visible_counter = 1
-
-        if any_ancestor(element, f):
-            continue
-
-        if element.tag == 'div' and 'verse' in element.get('class', ''):
-            if visible_counter == 1 or visible_counter % 5 == 0:
-                add_anchor(element, "f%d" % counter, link_text=visible_counter)
-            counter += 1
-            visible_counter += 1
-        elif 'paragraph' in element.get('class', ''):
-            add_anchor(element, "f%d" % counter, link_text=visible_counter)
-            counter += 1
-            visible_counter += 1
-
-
 def raw_printable_text(element):
     working = copy.deepcopy(element)
-    for e in working.findall('a'):
+    for e in working.findall('.//a'):
         if e.get('class') in ('annotation', 'theme-begin'):
             e.text = ''
     return etree.tostring(working, method='text', encoding='unicode').strip()
@@ -354,7 +219,6 @@ def raw_printable_text(element):
 
 def add_table_of_contents(root):
     sections = []
-    counter = 1
     for element in root.iterdescendants():
         if element.tag in ('h2', 'h3'):
             if any_ancestor(
@@ -368,12 +232,13 @@ def add_table_of_contents(root):
             if (element.tag == 'h3' and len(sections)
                     and sections[-1][1] == 'h2'):
                 sections[-1][3].append(
-                    (counter, element.tag, element_text, [])
+                    (element.attrib['id'], element.tag, element_text, [])
                 )
             else:
-                sections.append((counter, element.tag, element_text, []))
-            add_anchor(element, "s%d" % counter, with_link=False)
-            counter += 1
+                sections.append((element.attrib['id'], element.tag, element_text, []))
+
+    if not sections:
+        return
 
     toc = etree.Element('div')
     toc.set('id', 'toc')
@@ -383,14 +248,14 @@ def add_table_of_contents(root):
 
     for n, section, text, subsections in sections:
         section_element = etree.SubElement(toc_list, 'li')
-        add_anchor(section_element, "s%d" % n, with_target=False,
+        add_anchor(section_element, n,
                    link_text=text)
 
         if len(subsections):
             subsection_list = etree.SubElement(section_element, 'ol')
             for n1, subsection, subtext, _ in subsections:
                 subsection_element = etree.SubElement(subsection_list, 'li')
-                add_anchor(subsection_element, "s%d" % n1, with_target=False,
+                add_anchor(subsection_element, n1,
                            link_text=subtext)
 
     root.insert(0, toc)
@@ -421,7 +286,13 @@ def add_table_of_themes(root):
             item = etree.SubElement(themes_li, 'a', href="#%s" % fragment)
             item.text = str(i + 1)
             item.tail = ' '
+
+    if not len(themes_ol):
+        return
+
     root.insert(0, themes_div)
+    themes_div.tail = root.text
+    root.text = None
 
 
 def extract_annotations(html_path):
@@ -458,8 +329,8 @@ def extract_annotations(html_path):
                     candidate = candidate.strip()
                     if candidate in FN_QUALIFIERS:
                         qualifiers.append(candidate)
-                    elif candidate.startswith('z '):
-                        subcandidate = candidate.split()[1]
+                    elif candidate.startswith('z\u00A0'):
+                        subcandidate = candidate.split('\u00A0')[1].split()[0]
                         if subcandidate in FN_QUALIFIERS:
                             qualifiers.append(subcandidate)
             else:
index c81c458..3c60fe2 100644 (file)
@@ -17,26 +17,26 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 2.3\n"
 
-#: src/librarian/builders/html.py:84
+#: src/librarian/builders/html.py:94
 msgid "translated by"
 msgstr "tłum."
 
-#: src/librarian/builders/html.py:104
+#: src/librarian/builders/html.py:118
 msgid "Footnotes"
 msgstr "Przypisy"
 
-#: src/librarian/elements/footnotes/__init__.py:55
+#: src/librarian/elements/footnotes/__init__.py:111
 msgid "author's footnote"
 msgstr "przypis autorski"
 
-#: src/librarian/elements/footnotes/__init__.py:63
+#: src/librarian/elements/footnotes/__init__.py:119
 msgid "translator's footnote"
 msgstr "przypis tłumacza"
 
-#: src/librarian/elements/footnotes/__init__.py:71
+#: src/librarian/elements/footnotes/__init__.py:127
 msgid "editor's footnote"
 msgstr "przypis redakcyjny"
 
-#: src/librarian/elements/footnotes/__init__.py:79
+#: src/librarian/elements/footnotes/__init__.py:135
 msgid "source editor's footnote"
 msgstr "przypis edytorski"
diff --git a/src/librarian/picture.py b/src/librarian/picture.py
deleted file mode 100644 (file)
index 8b2c882..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
-#
-from operator import and_
-import functools
-import io
-from .dcparser import Field, WorkInfo, DCNS
-from librarian import (RDFNS, ValidationError, NoDublinCore, ParseError, WLURI)
-from xml.parsers.expat import ExpatError
-from os import path
-from lxml import etree
-from lxml.etree import (XMLSyntaxError, XSLTApplyError, Element)
-import re
-
-
-class WLPictureURI(WLURI):
-    _re_wl_uri = re.compile(
-        'http://wolnelektury.pl/katalog/obraz/(?P<slug>[-a-z0-9]+)/?$'
-    )
-    template = 'http://wolnelektury.pl/katalog/obraz/%s/'
-
-
-def as_wlpictureuri_strict(text):
-    return WLPictureURI.strict(text)
-
-
-class PictureInfo(WorkInfo):
-    """
-    Dublin core metadata for a picture
-    """
-    FIELDS = (
-        Field(DCNS('language'), 'language', required=False),
-        Field(DCNS('subject.period'), 'epochs', salias='epoch', multiple=True),
-        Field(DCNS('subject.type'), 'kinds', salias='kind', multiple=True),
-        Field(DCNS('subject.genre'), 'genres', salias='genre', multiple=True,
-              required=False),
-        Field(DCNS('subject.style'), 'styles', salias='style', multiple=True,
-              required=False),
-
-        Field(DCNS('format.dimensions'), 'dimensions', required=False),
-        Field(DCNS('format.checksum.sha1'), 'sha1', required=True),
-        Field(DCNS('description.medium'), 'medium', required=False),
-        Field(DCNS('description.dimensions'), 'original_dimensions',
-              required=False),
-        Field(DCNS('format'), 'mime_type', required=False),
-        Field(DCNS('identifier.url'), 'url', WLPictureURI,
-              strict=as_wlpictureuri_strict)
-    )
-
-
-class ImageStore:
-    EXT = ['gif', 'jpeg', 'png', 'swf', 'psd', 'bmp'
-           'tiff', 'tiff', 'jpc', 'jp2', 'jpf', 'jb2', 'swc',
-           'aiff', 'wbmp', 'xbm']
-    MIME = ['image/gif', 'image/jpeg', 'image/png',
-            'application/x-shockwave-flash', 'image/psd', 'image/bmp',
-            'image/tiff', 'image/tiff', 'application/octet-stream',
-            'image/jp2', 'application/octet-stream',
-            'application/octet-stream', 'application/x-shockwave-flash',
-            'image/iff', 'image/vnd.wap.wbmp', 'image/xbm']
-
-    def __init__(self, dir_):
-        super(ImageStore, self).__init__()
-        self.dir = dir_
-
-    def path(self, slug, mime_type):
-        """
-        Finds file by slug and mime type in our iamge store.
-        Returns a file objects (perhaps should return a filename?)
-        """
-        try:
-            i = self.MIME.index(mime_type)
-        except ValueError:
-            err = ValueError(
-                "Picture %s has unknown mime type: %s"
-                % (slug, mime_type)
-            )
-            err.slug = slug
-            err.mime_type = mime_type
-            raise err
-        ext = self.EXT[i]
-        # add some common extensions tiff->tif, jpeg->jpg
-        return path.join(self.dir, slug + '.' + ext)
-
-
-class WLPicture:
-    def __init__(self, edoc, parse_dublincore=True, image_store=None):
-        self.edoc = edoc
-        self.image_store = image_store
-
-        root_elem = edoc.getroot()
-
-        dc_path = './/' + RDFNS('RDF')
-
-        if root_elem.tag != 'picture':
-            raise ValidationError(
-                "Invalid root element. Found '%s', should be 'picture'"
-                % root_elem.tag
-            )
-
-        if parse_dublincore:
-            self.rdf_elem = root_elem.find(dc_path)
-
-            if self.rdf_elem is None:
-                raise NoDublinCore(
-                    "Document has no DublinCore - which is required."
-                )
-
-            self.picture_info = PictureInfo.from_element(self.rdf_elem)
-        else:
-            self.picture_info = None
-        self.frame = None
-
-    @classmethod
-    def from_bytes(cls, xml, *args, **kwargs):
-        return cls.from_file(io.BytesIO(xml), *args, **kwargs)
-
-    @classmethod
-    def from_file(cls, xmlfile, parse_dublincore=True, image_store=None):
-
-        # first, prepare for parsing
-        if isinstance(xmlfile, str):
-            file = open(xmlfile, 'rb')
-            try:
-                data = file.read()
-            finally:
-                file.close()
-        else:
-            data = xmlfile.read()
-
-        if not isinstance(data, str):
-            data = data.decode('utf-8')
-
-        data = data.replace('\ufeff', '')
-
-        # assume images are in the same directory
-        if image_store is None and getattr(xmlfile, 'name', None):
-            image_store = ImageStore(path.dirname(xmlfile.name))
-
-        try:
-            parser = etree.XMLParser(remove_blank_text=False)
-            tree = etree.parse(io.BytesIO(data.encode('utf-8')), parser)
-
-            me = cls(tree, parse_dublincore=parse_dublincore,
-                     image_store=image_store)
-            me.load_frame_info()
-            return me
-        except (ExpatError, XMLSyntaxError, XSLTApplyError) as e:
-            raise ParseError(e)
-
-    @property
-    def mime_type(self):
-        if self.picture_info is None:
-            raise ValueError(
-                "DC is not loaded, hence we don't know the image type."
-            )
-        return self.picture_info.mime_type
-
-    @property
-    def slug(self):
-        return self.picture_info.url.slug
-
-    @property
-    def image_path(self):
-        if self.image_store is None:
-            raise ValueError("No image store associated with whis WLPicture.")
-
-        return self.image_store.path(self.slug, self.mime_type)
-
-    def image_file(self, *args, **kwargs):
-        return open(self.image_path, 'rb', *args, **kwargs)
-
-    def get_sem_coords(self, sem):
-        area = sem.find("div[@type='rect']")
-        if area is None:
-            area = sem.find("div[@type='whole']")
-            return [[0, 0], [-1, -1]]
-
-        def has_all_props(node, props):
-            return functools.reduce(
-                and_, map(lambda prop: prop in node.attrib, props)
-            )
-
-        if not has_all_props(area, ['x1', 'x2', 'y1', 'y2']):
-            return None
-
-        def n(prop): return int(area.get(prop))
-        return [[n('x1'), n('y1')], [n('x2'), n('y2')]]
-
-    def partiter(self):
-        """
-        Iterates the parts of this picture and returns them
-        and their metadata.
-        """
-        # omg no support for //sem[(@type='theme') or (@type='object')] ?
-        for part in list(self.edoc.iterfind("//sem[@type='theme']")) +\
-                list(self.edoc.iterfind("//sem[@type='object']")):
-            pd = {'type': part.get('type')}
-
-            coords = self.get_sem_coords(part)
-            if coords is None:
-                continue
-            pd['coords'] = coords
-
-            def want_unicode(x):
-                if not isinstance(x, str):
-                    return x.decode('utf-8')
-                else:
-                    return x
-            pd['object'] = (
-                part.attrib['type'] == 'object'
-                and want_unicode(part.attrib.get('object', ''))
-                or None
-            )
-            pd['themes'] = (
-                part.attrib['type'] == 'theme'
-                and [part.attrib.get('theme', '')]
-                or []
-            )
-            yield pd
-
-    def load_frame_info(self):
-        k = self.edoc.find("//sem[@object='kadr']")
-
-        if k is not None:
-            clip = self.get_sem_coords(k)
-            self.frame = clip
-            frm = Element("sem", {"type": "frame"})
-            frm.append(next(k.iter("div")))
-            self.edoc.getroot().append(frm)
-            k.getparent().remove(k)
-        else:
-            frm = self.edoc.find("//sem[@type='frame']")
-            if frm:
-                self.frame = self.get_sem_coords(frm)
-            else:
-                self.frame = None
-        return self
diff --git a/src/librarian/xslt/book2html.xslt b/src/librarian/xslt/book2html.xslt
deleted file mode 100644 (file)
index b009345..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-
-   This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
-   Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
-
--->
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-    xmlns:wl="http://wolnelektury.pl/functions"
-    xmlns:dc="http://purl.org/dc/elements/1.1/" >
-
-<xsl:output encoding="utf-8" indent="yes" omit-xml-declaration = "yes" version="2.0" />
-<xsl:strip-space  elements="opowiadanie powiesc dramat_wierszowany_l dramat_wierszowany_lp dramat_wspolczesny liryka_l liryka_lp wywiad"/>
-<xsl:template match="utwor">
-    <xsl:choose>
-        <xsl:when test="@full-page">
-            <html>
-            <head>
-                <title>Książka z serwisu WolneLektury.pl</title>
-               <meta charset="utf-8" />
-               <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
-               <link rel="stylesheet" type="text/css">
-                       <xsl:attribute name="href">
-                               <xsl:value-of select="$css" />
-                       </xsl:attribute>
-               </link>
-               <style>
-                 .ilustr.prawo img {
-                 float: right;
-                 }
-                 .ilustr.lewo img {
-                 float: left;
-                 }
-                 .ilustr.srodek {
-                 text-align: center;
-                 }
-                 .ilustr .stop {
-                 clear: both;
-                 }
-                 .ilustr.oblew .stop {
-                 clear: none;
-                 }
-
-                  .ilustr.oblew img {
-                    margin-bottom: 1em;
-                  }
-                  .ilustr.oblew.lewo img {
-                    margin-right: 2em;
-                    }
-                    .ilustr.oblew.prawo img {
-                    margin-left: 2em;
-                    }
-
-
-                    .ilustr img {
-                    min-width: 200px !important;
-                    }
-                    @media screen and (max-width: 320px) {
-                    .ilustr img {
-                    width: 100% !important;
-                    min-width: auto !important;
-                    }
-                    .ilustr.lewo img {
-                    float: none;
-                    }
-                    .ilustr.prawo img {
-                    float:none;
-                    }
-                    .ilustr.oblew.prawo img {
-                    margin-left: 0;
-                    }
-                    .ilustr.oblew.lewo img{
-                    margin-right: 0;
-                    }
-                    .ilustr .stop {
-                   clear: none;
-                    }
-
-                    }
-               </style>
-           </head>
-            <body>
-              <xsl:call-template name="book-text" />
-
-             <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
-             <script src="http://malsup.github.io/min/jquery.cycle2.min.js"></script>
-            </body>
-            </html>
-        </xsl:when>
-        <xsl:otherwise>
-            <xsl:call-template name="book-text" />
-        </xsl:otherwise>
-    </xsl:choose>
-</xsl:template>
-
-<xsl:template name="book-text">
-    <div id="book-text">
-        <xsl:apply-templates select="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny" />
-        <xsl:if test="count(descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)])">
-            <div id="footnotes">
-                <h3>Przypisy</h3>
-                <xsl:for-each select="descendant::*[self::pe or self::pa or self::pr or self::pt][not(parent::extra)]">
-                    <div>
-                        <xsl:attribute name="class">fn-<xsl:value-of select="name()" /></xsl:attribute>
-                        <a name="{concat('footnote-', generate-id(.))}" />
-                        <a href="{concat('#anchor-', generate-id(.))}" class="annotation">[<xsl:number value="count(preceding::*[self::pa or self::pe or self::pr or self::pt]) + 1" />]</a>
-                        <xsl:choose>
-                            <xsl:when test="count(akap|akap_cd|strofa) = 0">
-                                <p><xsl:apply-templates select="text()|*" mode="inline" />
-                                <xsl:if test="name()='pa'"> [przypis autorski]</xsl:if>
-                                <xsl:if test="name()='pt'"> [przypis tłumacza]</xsl:if>
-                                <xsl:if test="name()='pr'"> [przypis redakcyjny]</xsl:if>
-                                <xsl:if test="name()='pe'"> [przypis edytorski]</xsl:if>
-                                </p>
-                            </xsl:when>
-                            <xsl:otherwise>
-                              <xsl:apply-templates />
-                              <p>
-                                <xsl:if test="name()='pa'"> [przypis autorski]</xsl:if>
-                                <xsl:if test="name()='pt'"> [przypis tłumacza]</xsl:if>
-                                <xsl:if test="name()='pr'"> [przypis redakcyjny]</xsl:if>
-                                <xsl:if test="name()='pe'"> [przypis edytorski]</xsl:if>
-                              </p>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </div>
-                </xsl:for-each>
-            </div>
-        </xsl:if>
-    </div>
-</xsl:template>
-
-
-<!-- ============================================================================== -->
-<!-- = MASTER TAG                                                                 = -->
-<!-- = (can contain block tags, paragraph tags, standalone tags and special tags) = -->
-<!-- ============================================================================== -->
-<xsl:template match="powiesc|opowiadanie|liryka_l|liryka_lp|dramat_wierszowany_l|dramat_wierszowany_lp|dramat_wspolczesny">
-    <xsl:apply-templates select="nota_red" mode="special" />
-    <xsl:if test="nazwa_utworu">
-        <h1>
-            <xsl:apply-templates select="autor_utworu|dzielo_nadrzedne|nazwa_utworu|podtytul" mode="header" />
-            <xsl:call-template name="translators" />
-        </h1>
-    </xsl:if>
-    <xsl:apply-templates />
-</xsl:template>
-
-
-<!-- ==================================================================================== -->
-<!-- = BLOCK TAGS                                                                       = -->
-<!-- = (can contain other block tags, paragraph tags, standalone tags and special tags) = -->
-<!-- ==================================================================================== -->
-<xsl:template match="nota">
-    <div class="note"><xsl:apply-templates /></div>
-</xsl:template>
-
-<xsl:template match="lista_osob">
-    <xsl:call-template name="section-anchor"/>
-    <div class="person-list">
-        <h3><xsl:value-of select="naglowek_listy" /></h3>
-        <ol>
-            <xsl:apply-templates select="lista_osoba" />
-        </ol>
-    </div>
-</xsl:template>
-
-<xsl:template match="dedykacja">
-    <div class="dedication"><xsl:apply-templates /></div>
-</xsl:template>
-
-<xsl:template match="ramka">
-    <div class="frame"><xsl:apply-templates /></div>
-</xsl:template>
-
-<xsl:template match="kwestia">
-    <div class="kwestia">
-        <xsl:apply-templates select="strofa|akap|didaskalia" />
-    </div>
-</xsl:template>
-
-<xsl:template match="dlugi_cytat|poezja_cyt">
-    <blockquote><xsl:apply-templates /></blockquote>
-</xsl:template>
-
-<xsl:template match="motto">
-    <xsl:call-template name="section-anchor"/>
-    <div class="motto">
-      <xsl:call-template name="block-args" />
-      <xsl:apply-templates />
-    </div>
-</xsl:template>
-
-<xsl:template match="ilustr" mode="inline">
-    <xsl:apply-templates select="."/>
-</xsl:template>
-
-<xsl:template match="ilustr">
-  <div>
-    <xsl:call-template name="block-args" />
-
-    <xsl:attribute name="class">
-      <xsl:text>ilustr </xsl:text>
-      <xsl:value-of select="@wyrownanie"/>
-      <xsl:if test="@oblew">
-        <xsl:text> oblew</xsl:text>
-      </xsl:if>
-    </xsl:attribute>
-    
-    <img>
-      <xsl:attribute name="src">
-        <xsl:value-of select="@src" />
-      </xsl:attribute>
-      <xsl:attribute name="srcset">
-        <xsl:value-of select="@srcset" />
-      </xsl:attribute>
-      <xsl:attribute name="sizes">
-        (min-width: 718px) 600px,
-        (min-width: 600px) calc(100vw - 118px),
-        (min-width: 320px) calc(100vw - 75px),
-        (min-width: 15em) calc(100wv - 60px),
-        calc(100wv - 40px)
-      </xsl:attribute>
-      <xsl:attribute name="alt">
-        <xsl:value-of select="@alt" />
-      </xsl:attribute>
-      <xsl:attribute name="title">
-        <xsl:value-of select="@alt" />
-      </xsl:attribute>
-
-      <xsl:if test="@szer">
-        <xsl:attribute name="style">
-          <xsl:text>width: </xsl:text>
-          <xsl:value-of select="@szer"/>
-        </xsl:attribute>
-      </xsl:if>
-    </img>
-
-    <div class="stop"></div>
-  </div>
-</xsl:template>
-
-<xsl:template match="animacja">
-  <div class="animacja cycle-slideshow" data-cycle-pause-on-hover="true" data-cycle-next="> img" data-cycle-fx="fadeout" data-cycle-paused="true">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates/>
-  </div>
-</xsl:template>
-
-
-<!-- ========================================== -->
-<!-- = PARAGRAPH TAGS                         = -->
-<!-- = (can contain inline and special tags)  = -->
-<!-- ========================================== -->
-<!-- Title page -->
-<xsl:template match="autor_utworu" mode="header">
-  <span class="author">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </span>
-</xsl:template>
-
-<xsl:template match="nazwa_utworu" mode="header">
-  <span class="title">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </span>
-</xsl:template>
-
-<xsl:template match="dzielo_nadrzedne" mode="header">
-  <span class="collection">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </span>
-</xsl:template>
-
-<xsl:template match="podtytul" mode="header">
-  <span class="subtitle">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </span>
-</xsl:template>
-
-<!-- Section headers (included in index)-->
-<xsl:template match="naglowek_akt|naglowek_czesc|srodtytul">
-  <xsl:call-template name="section-anchor"/>
-  <h2>
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </h2>
-</xsl:template>
-
-<xsl:template match="podtytul_akt|podtytul_czesc">
-  <div class="subtitle2">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </div>
-</xsl:template>
-
-<xsl:template match="naglowek_scena|naglowek_rozdzial">
-    <xsl:call-template name="section-anchor"/>
-    <h3>
-      <xsl:call-template name="block-args" />
-      <xsl:apply-templates mode="inline" />
-    </h3>
-</xsl:template>
-
-<xsl:template match="podtytul_scena|podtytul_rozdzial">
-  <div class="subtitle3">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </div>
-</xsl:template>
-
-<xsl:template match="naglowek_osoba|naglowek_podrozdzial">
-  <xsl:call-template name="section-anchor"/>
-  <h4>
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </h4>
-</xsl:template>
-
-<xsl:template match="podtytul_podrozdzial">
-  <div class="subtitle4">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </div>
-</xsl:template>
-
-<!-- Other paragraph tags -->
-<xsl:template match="miejsce_czas">
-  <xsl:call-template name="section-anchor"/>
-  <p class="place-and-time">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </p>
-</xsl:template>
-
-<xsl:template match="didaskalia">
-  <xsl:call-template name="section-anchor"/>
-  <div class="didaskalia">
-    <xsl:call-template name="block-args" />
-    <xsl:apply-templates mode="inline" />
-  </div>
-</xsl:template>
-
-<xsl:template match="lista_osoba">
-    <li><xsl:apply-templates mode="inline" /></li>
-</xsl:template>
-
-<xsl:template match="akap|akap_dialog|akap_cd">
-    <p class="paragraph">
-      <xsl:call-template name="block-args" />
-      <xsl:call-template name="section-anchor"/>
-       <xsl:apply-templates mode="inline" />
-    </p>
-</xsl:template>
-
-<xsl:template match="strofa" mode="inline">
-    <xsl:apply-templates select="." />
-</xsl:template>
-
-<xsl:template match="strofa">
-  <div class="stanza">
-    <xsl:call-template name="block-args" />
-      <xsl:call-template name="section-anchor"/>
-        <xsl:choose>
-            <xsl:when test="count(br) > 0">
-                <xsl:call-template name="verse">
-                    <xsl:with-param name="verse-content" select="br[1]/preceding-sibling::text() | br[1]/preceding-sibling::node()" />
-                    <xsl:with-param name="verse-type" select="br[1]/preceding-sibling::*[name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd' or name() = 'wers_do_prawej' or name() = 'wers_srodek'][1]" />
-                </xsl:call-template>
-                <xsl:for-each select="br">             
-                               <!-- Each BR tag "consumes" text after it -->
-                    <xsl:variable name="lnum" select="count(preceding-sibling::br)" />
-                    <xsl:call-template name="verse">
-                        <xsl:with-param name="verse-content"
-                            select="following-sibling::text()[count(preceding-sibling::br) = $lnum+1] | following-sibling::node()[count(preceding-sibling::br) = $lnum+1]" />
-                        <xsl:with-param name="verse-type" select="following-sibling::*[count(preceding-sibling::br) = $lnum+1 and (name() = 'wers_wciety' or name() = 'wers_akap' or name() = 'wers_cd' or name() = 'wers_do_prawej' or name() = 'wers_srodek')][1]" />
-                    </xsl:call-template>
-                </xsl:for-each>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="verse">
-                    <xsl:with-param name="verse-content" select="text() | node()" />
-                    <xsl:with-param name="verse-type" select="wers_wciety|wers_akap|wers_cd|wers_do_prawej|wers_srodek[1]" />
-                 </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </div>
-</xsl:template>
-
-<xsl:template name="verse">
-    <xsl:param name="verse-content" />
-    <xsl:param name="verse-type" />
-    <div class="verse">
-      <xsl:attribute name="class">
-        <xsl:text>verse</xsl:text>
-        <xsl:choose>
-            <xsl:when test="name($verse-type) = 'wers_akap'">
-              <xsl:text> verse-p</xsl:text>
-            </xsl:when>
-            <xsl:when test="name($verse-type) = 'wers_wciety'">
-              <xsl:text> verse-indent</xsl:text>
-              <xsl:if test="$verse-content/@typ">
-                <xsl:text> verse-indent-</xsl:text>
-                <xsl:value-of select="$verse-content/@typ" />
-              </xsl:if>
-            </xsl:when>
-            <xsl:when test="name($verse-type) = 'wers_cd'">
-              <xsl:text> verse-cont</xsl:text>
-            </xsl:when>
-            <xsl:when test="name($verse-type) = 'wers_do_prawej'">
-              <xsl:text> verse-right</xsl:text>
-            </xsl:when>
-            <xsl:when test="name($verse-type) = 'wers_srodek'">
-              <xsl:text> verse-center</xsl:text>
-            </xsl:when>
-        </xsl:choose>
-      </xsl:attribute>
-      <xsl:apply-templates select="$verse-content" mode="inline" />
-    </div>
-</xsl:template>
-
-<xsl:template match="motto_podpis">
-    <xsl:call-template name="section-anchor"/>
-    <p class="motto_podpis">
-      <xsl:call-template name="block-args" />
-      <xsl:apply-templates mode="inline" />
-    </p>
-</xsl:template>
-
-<xsl:template match="tabela|tabelka">
-    <xsl:call-template name="section-anchor"/>
-    <xsl:choose>
-        <xsl:when test="@ramka = '1'">
-          <table class="border">
-            <xsl:call-template name="block-args" />
-            <xsl:apply-templates />
-          </table>
-        </xsl:when>
-        <xsl:otherwise>
-          <table>
-            <xsl:call-template name="block-args" />
-            <xsl:apply-templates />
-          </table>
-        </xsl:otherwise>
-    </xsl:choose>
-</xsl:template>
-<xsl:template match="wiersz">
-    <tr><xsl:apply-templates /></tr>
-</xsl:template>
-<xsl:template match="kol">
-    <td><xsl:apply-templates mode="inline" /></td>
-</xsl:template>
-
-<xsl:template match="mat">
-    <math xmlns="http://www.w3.org/1998/Math/MathML"><xsl:copy-of select="*" /></math>
-</xsl:template>
-
-
-<!-- ================================================ -->
-<!-- = INLINE TAGS                                  = -->
-<!-- = (contain other inline tags and special tags) = -->
-<!-- ================================================ -->
-<!-- Annotations -->
-<xsl:template match="pa|pe|pr|pt" mode="inline">
-    <a name="{concat('anchor-', generate-id(.))}" />
-    <a href="{concat('#footnote-', generate-id(.))}" class="annotation">[<xsl:number value="count(preceding::*[self::pa or self::pe or self::pr or self::pt]) + 1" />]</a>
-</xsl:template>
-
-<xsl:template match="ref" mode="inline">
-  <a class="reference" data-uri="">
-    <xsl:attribute name="data-uri">
-      <xsl:value-of select="@href"/>
-    </xsl:attribute>
-  </a>
-</xsl:template>
-
-<!-- Other inline tags -->
-<xsl:template match="mat" mode="inline">
-    <math xmlns="http://www.w3.org/1998/Math/MathML"><xsl:copy-of select="*|text()" /></math>
-</xsl:template>
-
-<xsl:template match="didask_tekst" mode="inline">
-    <em class="didaskalia"><xsl:apply-templates mode="inline" /></em>
-</xsl:template>
-
-<xsl:template match="slowo_obce" mode="inline">
-    <em class="foreign-word"><xsl:apply-templates mode="inline" /></em>
-</xsl:template>
-
-<xsl:template match="tytul_dziela" mode="inline">
-    <em class="book-title">
-        <xsl:if test="@typ = '1'">„</xsl:if><xsl:apply-templates mode="inline" /><xsl:if test="@typ = '1'">”</xsl:if>
-    </em>
-</xsl:template>
-
-<xsl:template match="wyroznienie" mode="inline">
-    <em class="author-emphasis"><xsl:apply-templates mode="inline" /></em>
-</xsl:template>
-
-<xsl:template match="wieksze_odstepy" mode="inline">
-    <em class="wieksze-odstepy"><xsl:apply-templates mode="inline" /></em>
-</xsl:template>
-
-<xsl:template match="indeks_dolny" mode="inline">
-    <sub><xsl:apply-templates mode="inline" /></sub>
-</xsl:template>
-
-<xsl:template match="osoba" mode="inline">
-    <em class="person"><xsl:apply-templates mode="inline" /></em>
-</xsl:template>
-
-<xsl:template match="www" mode="inline">
-    <a target="_blank">
-        <xsl:attribute name="href">
-            <xsl:value-of select="text()"/>
-        </xsl:attribute>
-        <xsl:apply-templates mode="inline" />
-    </a>
-</xsl:template>
-
-<!-- ============================================== -->
-<!-- = STANDALONE TAGS                            = -->
-<!-- = (cannot contain any other tags)            = -->
-<!-- ============================================== -->
-<xsl:template match="sekcja_swiatlo">
-    <hr class="spacer" />
-</xsl:template>
-
-<xsl:template match="sekcja_asterysk">
-    <p class="spacer-asterisk">*</p>
-</xsl:template>
-
-<xsl:template match="separator_linia">
-    <hr class="spacer-line" />
-</xsl:template>
-
-
-<!-- ================ -->
-<!-- = SPECIAL TAGS = -->
-<!-- ================ -->
-<!-- Themes -->
-<xsl:template match="begin" mode="inline">
-    <xsl:variable name="mnum" select="concat('m', substring(@id, 2))" />
-    <a name="m{substring(@id, 2)}" class="theme-begin" fid="{substring(@id, 2)}">
-        <xsl:value-of select="string(following::motyw[@id=$mnum]/text())" />
-    </a>
-</xsl:template>
-
-<xsl:template match="end" mode="inline">
-    <span class="theme-end" fid="{substring(@id, 2)}"> </span>
-</xsl:template>
-
-<xsl:template match="begin|end">
-    <xsl:apply-templates select='.' mode="inline" />
-</xsl:template>
-
-<xsl:template match="motyw" mode="inline" />
-
-
-<xsl:template match="nota_red" mode="special">
-    <div id="nota_red">
-        <xsl:apply-templates />
-    </div>
-</xsl:template>
-
-
-<xsl:template name="translators">
-    <xsl:if test="//dc:contributor.translator">
-        <span class="translator">
-            <xsl:text>tłum. </xsl:text>
-            <xsl:for-each select="//dc:contributor.translator">
-                <xsl:if test="position() != 1">, </xsl:if>
-                <xsl:apply-templates mode="person" />
-            </xsl:for-each>
-        </span>
-    </xsl:if>
-</xsl:template>
-
-<xsl:template match="text()" mode="person">
-    <xsl:value-of select="wl:person_name(.)" />
-</xsl:template>
-
-<xsl:template match="rownolegle">
-    <xsl:apply-templates mode="rownolegle" />
-</xsl:template>
-<xsl:template match="*" mode="rownolegle">
-  <!-- is it last? -->
-  <div>
-    <xsl:attribute name="class">
-      <xsl:text>rownolegly-blok</xsl:text>
-      <xsl:if test="not(following-sibling::*)">
-        <xsl:text> last</xsl:text>
-      </xsl:if>
-      <xsl:if test="not(preceding-sibling::*)">
-        <xsl:text> first</xsl:text>
-      </xsl:if>
-    </xsl:attribute>
-    <xsl:attribute name="style">
-      <xsl:text>border-left: 2px solid red; padding-left: .5em;</xsl:text>
-      <xsl:if test="not(following-sibling::*)">
-        <xsl:text> border-radius: 0 0 0 .75em;</xsl:text>
-      </xsl:if>
-      <xsl:if test="not(preceding-sibling::*)">
-        <xsl:text> border-radius: .75em 0 0 0;</xsl:text>
-      </xsl:if>
-    </xsl:attribute>
-    <xsl:apply-templates match="." />
-  </div>
-</xsl:template>
-
-<xsl:template match="tab" mode="inline">
-  <span>
-    <xsl:choose>
-      <xsl:when test="@szer">
-        <xsl:attribute name="style">display: inline-block; width: <xsl:value-of select="@szer" />em</xsl:attribute>
-      </xsl:when>
-      <xsl:otherwise>
-        <xsl:attribute name="style">display: inline-block; width: 1em</xsl:attribute>
-      </xsl:otherwise>
-    </xsl:choose>
-  </span>
-</xsl:template>
-
-
-<!-- ================ -->
-<!-- = IGNORED TAGS = -->
-<!-- ================ -->
-<xsl:template match="extra|uwaga" />
-<xsl:template match="extra|uwaga" mode="inline" />
-
-<xsl:template match="nota_red" />
-<xsl:template match="abstrakt" />
-
-<!-- ======== -->
-<!-- = TEXT = -->
-<!-- ======== -->
-<xsl:template match="text()" />
-<xsl:template match="text()" mode="inline">
-    <xsl:value-of select="wl:substitute_entities(.)" />
-</xsl:template>
-
-<!-- ========= -->
-<!-- = utils = -->
-<!-- ========= -->
-<xsl:template name="section-anchor">
-  <!-- 
-       this formula works as follows:
-       - get all ancestors including self
-       - choose the header (third one from root): utwor/book-type/header
-       - get all preceding siblings
-       - count them
-       - create an <a name="sec123"/> tag.
-  -->
-        <a name="{concat('sec', count(ancestor-or-self::*[last()-2]/preceding-sibling::*) + 1)}" />
-</xsl:template>
-
-<xsl:template name="block-args">
-  <xsl:if test="@id">
-    <xsl:attribute name="id">
-      <xsl:text>wl-</xsl:text>
-      <xsl:value-of select="@id"/>
-    </xsl:attribute>
-  </xsl:if>
-</xsl:template>
-
-<xsl:template match="numeracja">
-       <span class="numeracja">
-               <xsl:attribute name="data-start">
-                       <xsl:value-of select="@start" />
-               </xsl:attribute>
-       </span>
-</xsl:template>
-
-</xsl:stylesheet>
diff --git a/tests/files/picture/angelus-novus.jpeg b/tests/files/picture/angelus-novus.jpeg
deleted file mode 100644 (file)
index fd0394f..0000000
Binary files a/tests/files/picture/angelus-novus.jpeg and /dev/null differ
diff --git a/tests/files/picture/angelus-novus.xml b/tests/files/picture/angelus-novus.xml
deleted file mode 100644 (file)
index 1e70828..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<picture>
-  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/">
-    <rdf:Description rdf:about="http://redakcja.wolnelektury.pl/documents/image/angelus-novus/">
-      <dc:creator xml:lang="pl">Klee, Paul</dc:creator>
-      <dc:title xml:lang="la">Angelus Novus</dc:title>
-      <dc:publisher xml:lang="pl">Fundacja Wolne Lektury</dc:publisher>
-      <dc:contributor.editor xml:lang="pl" xmlns:dc="http://purl.org/dc/elements/1.1/">Sekuła, Aleksandra</dc:contributor.editor>
-      <dc:contributor.editor xml:lang="pl" xmlns:dc="http://purl.org/dc/elements/1.1/">Kwiatkowska, Katarzyna</dc:contributor.editor>
-      <dc:contributor.technical_editor xml:lang="pl" xmlns:dc="http://purl.org/dc/elements/1.1/">Trzeciak, Weronika</dc:contributor.technical_editor>
-      <dc:subject.period xml:lang="pl">Modernizm</dc:subject.period>
-      <dc:subject.type xml:lang="pl">Obraz</dc:subject.type>
-      <dc:description xml:lang="pl">Publikacja zrealizowana w ramach projektu Wolne Lektury (http://wolnelektury.pl). Reprodukcja cyfrowa wykonana przez Bibliotekę Narodową z egzemplarza pochodzącego ze zbiorów BN.</dc:description>
-      <dc:description.dimensions xml:lang="pl">31.8 × 24.2 cm</dc:description.dimensions>
-      <dc:description.medium xml:lang="pl">Akwarela na papierze</dc:description.medium>
-      <dc:identifier.url xml:lang="pl">http://wolnelektury.pl/katalog/obraz/angelus-novus</dc:identifier.url>
-      <dc:source.URL xml:lang="pl">http://katilifox.files.wordpress.com/2011/04/1190051611_angelus-novus.jpg</dc:source.URL>
-      <dc:source xml:lang="pl">Muzeum Narodowe, inw. 00000000.</dc:source>
-      <dc:rights xml:lang="pl">Domena publiczna - Paul Klee zm. 1940</dc:rights>
-      <dc:date.pd xml:lang="pl">1940</dc:date.pd>
-      <dc:type>Image</dc:type>
-      <dc:format xml:lang="pl">image/jpeg</dc:format>
-      <dc:format.dimensions xml:lang="pl">329 x 400 px</dc:format.dimensions>
-      <dc:format.checksum.sha1 xml:lang="pl">5ed8e8d24d92017c6341c0b8cfcc414dec55b8bf</dc:format.checksum.sha1>
-      <dc:date xml:lang="pl">1920</dc:date>
-      <dc:language xml:lang="pl" xmlns:dc="http://purl.org/dc/elements/1.1/">lat</dc:language>
-    </rdf:Description>
-  </rdf:RDF>
-  <sem type="object" object="obraz cały">
-    <div type="whole"/>
-  </sem>
-  <sem type="theme" theme="anioł historii">
-    <div type="area" x1="92" y1="42" x2="257" y2="346"/>
-  </sem>
-  <sem type="theme" theme="spojrzenie">
-    <div type="area" x1="138" y1="100" x2="211" y2="124"/>
-  </sem>
-  <sem type="object" object="skrzydło">
-    <div type="area" x1="94" y1="148" x2="139" y2="205"/>
-    <!--div type="area" x1="209" y1="152" x2="252" y2="1041"/-->
-  </sem>
-</picture>
diff --git a/tests/files/tags/akap/1.expected.html b/tests/files/tags/akap/1.expected.html
new file mode 100644 (file)
index 0000000..12fce96
--- /dev/null
@@ -0,0 +1,7 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Kali opowiedział, co zaszło, i ze słów jego pokazało się, że przyczyną wydarzenia była tylko zawziętość Fumby, gdy bowiem bitwa
+już ustała, chciał jeszcze dobić dwóch Samburów i od jednego z nich otrzymał cios włócznią.</p>
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Wiadomość rozbiegła się w mgnieniu oka między wszystkimi Wa-himami i naokół Kalego uczyniło się zbiegowisko.
+W chwilę później sześciu wojowników przyniosło na włóczniach starego króla, który nie był zabity, ale ciężko ranny i przed śmiercią chciał
+jeszcze zobaczyć potężnego, siedzącego na słoniu pana, prawdziwego zwycięzcę Samburu.</p>
+</div>
diff --git a/tests/files/tags/akap/1.xml b/tests/files/tags/akap/1.xml
new file mode 100644 (file)
index 0000000..6cac9b6
--- /dev/null
@@ -0,0 +1,6 @@
+<akap>Kali opowiedział, co zaszło, i ze słów jego pokazało się, że przyczyną wydarzenia była tylko zawziętość Fumby, gdy bowiem bitwa
+już ustała, chciał jeszcze dobić dwóch Samburów i od jednego z nich otrzymał cios włócznią.</akap>
+
+<akap>Wiadomość rozbiegła się w mgnieniu oka między wszystkimi Wa-himami i naokół Kalego uczyniło się zbiegowisko.
+W chwilę później sześciu wojowników przyniosło na włóczniach starego króla, który nie był zabity, ale ciężko ranny i przed śmiercią chciał
+jeszcze zobaczyć potężnego, siedzącego na słoniu pana, prawdziwego zwycięzcę Samburu.</akap>
diff --git a/tests/files/tags/akap_cd/1.expected.html b/tests/files/tags/akap_cd/1.expected.html
new file mode 100644 (file)
index 0000000..00861ef
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">dalszy-ciąg-akapitu</p>
+</div>
diff --git a/tests/files/tags/akap_cd/1.xml b/tests/files/tags/akap_cd/1.xml
new file mode 100644 (file)
index 0000000..2b818c4
--- /dev/null
@@ -0,0 +1 @@
+<akap_cd> dalszy-ciąg-akapitu </akap_cd>
diff --git a/tests/files/tags/akap_dialog/1.expected.html b/tests/files/tags/akap_dialog/1.expected.html
new file mode 100644 (file)
index 0000000..a8d3556
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">— Nel, potrafisz wyliczyć nasze podróże od Fajumu? — pytał Staś.</p>
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">— Potrafię.</p>
+<a href="#f3" class="wl-num">3</a><p class="wl paragraph" id="f3">To mówiąc dziewczynka podniosła w górę brwi i zaczęła rachować na paluszkach.</p>
+<a href="#f4" class="wl-num">4</a><p class="wl paragraph" id="f4">— Zaraz. Od Fajumu do Chartumu — to jedna; od Chartumu do Faszody — to druga; od Faszody do tego wąwozu, w którym znaleźliśmy
+Kinga — to trzecia; a od Góry Lindego do jeziora — to czwarta.</p>
+<a href="#f5" class="wl-num">5</a><p class="wl paragraph" id="f5">— Tak. Chyba nie ma na świecie drugiej muchy, która by przeleciała taki kawał Afryki.</p>
+<a href="#f6" class="wl-num">6</a><p class="wl paragraph" id="f6">— Ładnie by ta mucha wyglądała bez ciebie!</p>
+</div>
diff --git a/tests/files/tags/akap_dialog/1.xml b/tests/files/tags/akap_dialog/1.xml
new file mode 100644 (file)
index 0000000..5c05965
--- /dev/null
@@ -0,0 +1,12 @@
+<akap_dialog>--- Nel, potrafisz wyliczyć nasze podróże od Fajumu? --- pytał Staś.</akap_dialog>
+
+<akap_dialog>--- Potrafię.</akap_dialog>
+
+<akap>To mówiąc dziewczynka podniosła w górę brwi i zaczęła rachować na paluszkach.</akap>
+
+<akap_dialog>--- Zaraz. Od Fajumu do Chartumu --- to jedna; od Chartumu do Faszody --- to druga; od Faszody do tego wąwozu, w którym znaleźliśmy
+Kinga --- to trzecia; a od Góry Lindego do jeziora --- to czwarta.</akap_dialog>
+
+<akap_dialog>--- Tak. Chyba nie ma na świecie drugiej muchy, która by przeleciała taki kawał Afryki.</akap_dialog>
+
+<akap_dialog>--- Ładnie by ta mucha wyglądała bez ciebie!</akap_dialog>
diff --git a/tests/files/tags/animacja/1.expected.html b/tests/files/tags/animacja/1.expected.html
new file mode 100644 (file)
index 0000000..b38a92e
--- /dev/null
@@ -0,0 +1,4 @@
+<div id="book-text"><div data-cycle-pause-on-hover="true" data-cycle-next="&gt; img" data-cycle-fx="fadeout" data-cycle-paused="true" class="animacja cycle-slideshow" id="i3">
+  <img class="ilustr" alt="Wieloryb" title="Wieloryb" src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/wieloryb.jpg">
+  <img class="ilustr" alt="Kot" title="Kot" src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/kot.jpg">
+</div></div>
diff --git a/tests/files/tags/animacja/1.xml b/tests/files/tags/animacja/1.xml
new file mode 100644 (file)
index 0000000..f97c6a0
--- /dev/null
@@ -0,0 +1,4 @@
+<animacja>
+  <ilustr src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/wieloryb.jpg" alt="Wieloryb" />
+  <ilustr src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/kot.jpg" alt="Kot" />
+</animacja>
diff --git a/tests/files/tags/autor_utworu/1.expected.html b/tests/files/tags/autor_utworu/1.expected.html
new file mode 100644 (file)
index 0000000..bd35ca0
--- /dev/null
@@ -0,0 +1 @@
+<div id="book-text"><h1><span class="wl author" id="i1">Hans Christian Andersen</span></h1></div>
diff --git a/tests/files/tags/autor_utworu/1.xml b/tests/files/tags/autor_utworu/1.xml
new file mode 100644 (file)
index 0000000..d6a7534
--- /dev/null
@@ -0,0 +1 @@
+<autor_utworu>Hans Christian Andersen</autor_utworu>
diff --git a/tests/files/tags/base.xml b/tests/files/tags/base.xml
new file mode 100644 (file)
index 0000000..cf6f61f
--- /dev/null
@@ -0,0 +1,7 @@
+<utwor>
+  <opowiadanie>
+
+    <!-- INPUT -->
+    
+  </opowiadanie>
+</utwor>
diff --git a/tests/files/tags/dedykacja/1.expected.html b/tests/files/tags/dedykacja/1.expected.html
new file mode 100644 (file)
index 0000000..83995b5
--- /dev/null
@@ -0,0 +1,11 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Władysław Stanisław Reymont</span><span class="wl collection" id="i2">Chłopi</span><span class="wl title" id="i3">Część pierwsza — Jesień</span>
+</h1>
+<div class="dedication" id="i5">
+<div class="stanza" id="i4">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Miriamowi</div>
+<div class="wl verse" id="f2">(Zenonowi Przesmyckiemu)</div>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/dedykacja/1.xml b/tests/files/tags/dedykacja/1.xml
new file mode 100644 (file)
index 0000000..c4a4da6
--- /dev/null
@@ -0,0 +1,10 @@
+<autor_utworu>Władysław Stanisław Reymont</autor_utworu>
+<dzielo_nadrzedne>Chłopi</dzielo_nadrzedne>
+<nazwa_utworu>Część pierwsza --- Jesień</nazwa_utworu>
+
+<dedykacja>
+<strofa>
+Miriamowi/
+(Zenonowi Przesmyckiemu)
+</strofa>
+</dedykacja>
diff --git a/tests/files/tags/didask_tekst/1.expected.html b/tests/files/tags/didask_tekst/1.expected.html
new file mode 100644 (file)
index 0000000..33b94f3
--- /dev/null
@@ -0,0 +1,7 @@
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Oto, co może mówić kochające serce.</div>
+<div class="wl verse" id="f2"><em class="didaskalia">Do <em class="person">Filinta</em>, który się śmieje</em></div>
+<div class="wl verse" id="f3">Och, śmiejcie się do syta, panowie szyderce,</div>
+<div class="wl verse" id="f4">A ja cenię to wyżej niż te sztuczne kwiatki,</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Te fałszywe brylanty waszej muzy gładkiej.</div>
+</div></div>
diff --git a/tests/files/tags/didask_tekst/1.xml b/tests/files/tags/didask_tekst/1.xml
new file mode 100644 (file)
index 0000000..cdbb022
--- /dev/null
@@ -0,0 +1,5 @@
+<strofa>Oto, co może mówić kochające serce./
+<didask_tekst>Do <osoba>Filinta</osoba>, który się śmieje</didask_tekst>/
+Och, śmiejcie się do syta, panowie szyderce,/
+A ja cenię to wyżej niż te sztuczne kwiatki,/
+Te fałszywe brylanty waszej muzy gładkiej.</strofa>
diff --git a/tests/files/tags/didaskalia/1.expected.html b/tests/files/tags/didaskalia/1.expected.html
new file mode 100644 (file)
index 0000000..efefbab
--- /dev/null
@@ -0,0 +1,27 @@
+<div id="book-text">
+<h4 id="i1">CZEŚNIK</h4>
+<div class="kwestia">
+<div class="didaskalia" id="i2">obracając się ku niemu</div>
+<div class="stanza" id="i3">
+<a href="#f1" class="wl-num">1</a><div class="wl verse verse-cont" id="f1">Tu sęk właśnie!</div>
+Na toż bym się, mocium panie,<div class="wl verse" id="f2">Kawalerstwa dziś wyrzekał,</div>
+</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="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="stanza" id="i7">
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Ma dochody wprawdzie znaczne —</div>
+<div class="wl verse" id="f6">Podstolina ma znaczniejsze;</div>
+<div class="wl verse" id="f7">Z wdówką zatem działać zacznę.</div>
+</div>
+<div class="didaskalia" id="i8">po krótkim milczeniu</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>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/didaskalia/1.xml b/tests/files/tags/didaskalia/1.xml
new file mode 100644 (file)
index 0000000..466d912
--- /dev/null
@@ -0,0 +1,34 @@
+<naglowek_osoba>CZEŚNIK</naglowek_osoba>
+<kwestia>
+
+<didaskalia>obracając się ku niemu</didaskalia>
+
+<strofa>
+<wers_cd>Tu sęk właśnie!</wers_cd>
+Na toż bym się, mocium panie,/
+Kawalerstwa dziś wyrzekał,
+</strofa>
+
+<didaskalia>uderzając w stół</didaskalia>
+
+<strofa>
+By kto... niech go piorun trzaśnie!/
+Długo będzie na to czekał,
+</strofa>
+
+<didaskalia>po krótkim milczeniu, biorąc talerz</didaskalia>
+
+<strofa>
+Ma dochody wprawdzie znaczne ---/
+Podstolina ma znaczniejsze;/
+Z wdówką zatem działać zacznę.
+</strofa>
+
+<didaskalia>po krótkim milczeniu</didaskalia>
+
+<strofa>
+Bawi z nami --- w domu Klary,/
+Bo krewniaczka jej daleka,/
+Ale mnie się wszystko zdaje...
+</strofa>
+</kwestia>
diff --git a/tests/files/tags/dlugi_cytat/1.expected.html b/tests/files/tags/dlugi_cytat/1.expected.html
new file mode 100644 (file)
index 0000000..6872c0b
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text"><blockquote>
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">blok-akapitow-cytatu</p>
+</blockquote></div>
diff --git a/tests/files/tags/dlugi_cytat/1.xml b/tests/files/tags/dlugi_cytat/1.xml
new file mode 100644 (file)
index 0000000..1c38349
--- /dev/null
@@ -0,0 +1 @@
+<dlugi_cytat><akap> blok-akapitow-cytatu</akap></dlugi_cytat>
diff --git a/tests/files/tags/dzielo_nadrzedne/1.expected.html b/tests/files/tags/dzielo_nadrzedne/1.expected.html
new file mode 100644 (file)
index 0000000..e1a18ac
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text"><h1>
+<span class="wl author" id="i1">Bruno Jasieński</span><span class="wl collection" id="i2">But w butonierce</span><span class="wl title" id="i3">Deszcz</span>
+</h1></div>
diff --git a/tests/files/tags/dzielo_nadrzedne/1.xml b/tests/files/tags/dzielo_nadrzedne/1.xml
new file mode 100644 (file)
index 0000000..6327806
--- /dev/null
@@ -0,0 +1,3 @@
+<autor_utworu>Bruno Jasieński</autor_utworu>
+<dzielo_nadrzedne>But w butonierce</dzielo_nadrzedne>
+<nazwa_utworu>Deszcz</nazwa_utworu>
diff --git a/tests/files/tags/ilustr/1.expected.html b/tests/files/tags/ilustr/1.expected.html
new file mode 100644 (file)
index 0000000..3b8fc76
--- /dev/null
@@ -0,0 +1 @@
+<div id="book-text"><img class="ilustr" alt="Kot" title="Kot" src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/kot.jpg"></div>
diff --git a/tests/files/tags/ilustr/1.xml b/tests/files/tags/ilustr/1.xml
new file mode 100644 (file)
index 0000000..ec62695
--- /dev/null
@@ -0,0 +1 @@
+<ilustr src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/kot.jpg" alt="Kot" />
diff --git a/tests/files/tags/indeks_dolny/1.expected.html b/tests/files/tags/indeks_dolny/1.expected.html
new file mode 100644 (file)
index 0000000..a42c881
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">H<sub>2</sub>O.</p>
+</div>
diff --git a/tests/files/tags/indeks_dolny/1.xml b/tests/files/tags/indeks_dolny/1.xml
new file mode 100644 (file)
index 0000000..fd8a247
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  H<indeks_dolny>2</indeks_dolny>O.
+</akap>
diff --git a/tests/files/tags/kwestia/1.expected.html b/tests/files/tags/kwestia/1.expected.html
new file mode 100644 (file)
index 0000000..2fe9773
--- /dev/null
@@ -0,0 +1,15 @@
+<div id="book-text">
+<h4 id="i1">PUSTELNIK</h4>
+<div class="kwestia"><div class="stanza" id="i2">
+<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>
+<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>
+<div class="wl verse" id="f8">Jako różyczka z liści wychylona,</div>
+<div class="wl verse" id="f9">I wołał: caca! i na brylant biały</div>
+<a href="#f10" class="wl-num">10</a><div class="wl verse" id="f10">Różanych ustek perełkami świecił.</div>
+</div></div>
+</div>
diff --git a/tests/files/tags/kwestia/1.xml b/tests/files/tags/kwestia/1.xml
new file mode 100644 (file)
index 0000000..a8fc460
--- /dev/null
@@ -0,0 +1,16 @@
+<naglowek_osoba>PUSTELNIK</naglowek_osoba>
+
+<kwestia>
+<strofa>
+Więc jako dawniej czynili mocarze,/
+Z Lechem się mieniał Scyta na obrączki;/
+A pokochawszy mocniej sercem, w darze/
+Dał mu koronę... stąd nasza korona./
+Zbawiciel niegdyś wyciągając rączki/
+Szedł do niej z matki zadumanej łona/
+I ku rubinom podawał się cały/
+Jako różyczka z liści wychylona,/
+I wołał: caca! i na brylant biały/
+Różanych ustek perełkami świecił.
+</strofa>
+</kwestia>
diff --git a/tests/files/tags/kwestia/2.expected.html b/tests/files/tags/kwestia/2.expected.html
new file mode 100644 (file)
index 0000000..5783d97
--- /dev/null
@@ -0,0 +1,11 @@
+<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>
+</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.
+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>
diff --git a/tests/files/tags/kwestia/2.xml b/tests/files/tags/kwestia/2.xml
new file mode 100644 (file)
index 0000000..f4f053d
--- /dev/null
@@ -0,0 +1,16 @@
+<naglowek_osoba>GŁOS HESI</naglowek_osoba>
+
+<kwestia>
+<akap>
+Mamuńciu, tak zimno! troszkę ciepłej wody...
+</akap>
+</kwestia>
+
+<naglowek_osoba>DULSKA</naglowek_osoba>
+
+<kwestia>
+<akap>
+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ę.
+</akap>
+</kwestia>
diff --git a/tests/files/tags/lista_osob/1.expected.html b/tests/files/tags/lista_osob/1.expected.html
new file mode 100644 (file)
index 0000000..01617a4
--- /dev/null
@@ -0,0 +1,21 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Sofokles</span><span class="wl title" id="i2">Antygona</span>
+</h1>
+<div class="person-list" id="i14">
+<h3 class="wl" id="i3">OSOBY DRAMATU</h3>
+<ol>
+<li class="wl" id="i4">ANTYGONA, córka Edypa</li>
+<li class="wl" id="i5">ISMENA, jej siostra</li>
+<li class="wl" id="i6">CHÓR TEBANSKICH STARCÓW</li>
+<li class="wl" id="i7">KREON, król Teb</li>
+<li class="wl" id="i8">STRAŻNIK</li>
+<li class="wl" id="i9">HAJMON, syn Kreona</li>
+<li class="wl" id="i10">TYREZJASZ, wróżbita</li>
+<li class="wl" id="i11">POSŁANIEC.</li>
+<li class="wl" id="i12">EURYDYKA, żona Kreona</li>
+<li class="wl" id="i13">POSŁANIEC drugi</li>
+</ol>
+</div>
+<p class="wl place-and-time" id="i15">Rzecz dzieje się przed dworcem królewskim w Tebach</p>
+</div>
diff --git a/tests/files/tags/lista_osob/1.xml b/tests/files/tags/lista_osob/1.xml
new file mode 100644 (file)
index 0000000..c6f4e24
--- /dev/null
@@ -0,0 +1,21 @@
+<autor_utworu>Sofokles</autor_utworu>
+<nazwa_utworu>Antygona</nazwa_utworu>
+
+<lista_osob>
+
+<naglowek_listy>OSOBY DRAMATU</naglowek_listy>
+
+<lista_osoba>ANTYGONA, córka Edypa</lista_osoba>
+<lista_osoba>ISMENA, jej siostra</lista_osoba>
+<lista_osoba>CHÓR TEBANSKICH STARCÓW</lista_osoba>
+<lista_osoba>KREON, król Teb</lista_osoba>
+<lista_osoba>STRAŻNIK</lista_osoba>
+<lista_osoba>HAJMON, syn Kreona</lista_osoba>
+<lista_osoba>TYREZJASZ, wróżbita</lista_osoba>
+<lista_osoba>POSŁANIEC.</lista_osoba>
+<lista_osoba>EURYDYKA, żona Kreona</lista_osoba>
+<lista_osoba>POSŁANIEC drugi</lista_osoba>
+
+</lista_osob>
+
+<miejsce_czas>Rzecz dzieje się przed dworcem królewskim w Tebach</miejsce_czas>
diff --git a/tests/files/tags/mat/1.expected.html b/tests/files/tags/mat/1.expected.html
new file mode 100644 (file)
index 0000000..1a9163a
--- /dev/null
@@ -0,0 +1,42 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Oznaczmy odległość tych miejsc przez δ,
+  dalej odległość kliszy od kondensatora przez <em class="author-emphasis">h</em>,
+  długość płyt metalowych kondensatora przez <em class="author-emphasis">l</em>,
+  natężenie pola elektryczności przez <em class="author-emphasis">F</em>,
+  masę elektronu przez <em class="author-emphasis">m</em>,
+  jego ładunek przez <em class="author-emphasis">e</em>,
+  a prędkość przez <em class="author-emphasis">v</em>.
+  Możemy wyprowadzić wzór następujący
+  <math xmlns="http://www.w3.org/1998/Math/MathML"><mrow>
+    <mi>δ</mi>
+    <mo>=</mo>
+    <mfrac>
+      <mrow>
+        <mi>e</mi>
+        <mo>⁢</mo>
+        <mi>F</mi>
+        <mo>⁢</mo>
+        <mi>l</mi>
+        <mo>×</mo>
+        <mfenced><mrow>
+          <mfrac>
+            <mi>l</mi>
+            <mn>2</mn>
+          </mfrac>
+          <mo>+</mo>
+          <mi>h</mi>
+        </mrow>
+        </mfenced>
+      </mrow>
+      <mrow>
+        <mi>m</mi>
+        <mo>⁢</mo>
+        <msup>
+          <mi>v</mi>
+          <mn>2</mn>
+        </msup>
+      </mrow>
+    </mfrac>
+  </mrow></math>
+</p>
+</div>
diff --git a/tests/files/tags/mat/1.xml b/tests/files/tags/mat/1.xml
new file mode 100644 (file)
index 0000000..8c60418
--- /dev/null
@@ -0,0 +1,41 @@
+<akap>
+  Oznaczmy odległość tych miejsc przez δ,
+  dalej odległość kliszy od kondensatora przez <wyroznienie>h</wyroznienie>,
+  długość płyt metalowych kondensatora przez <wyroznienie>l</wyroznienie>,
+  natężenie pola elektryczności przez <wyroznienie>F</wyroznienie>,
+  masę elektronu przez <wyroznienie>m</wyroznienie>,
+  jego ładunek przez <wyroznienie>e</wyroznienie>,
+  a prędkość przez <wyroznienie>v</wyroznienie>.
+  Możemy wyprowadzić wzór następujący
+  <mat><mrow>
+    <mi>δ</mi>
+    <mo>=</mo>
+    <mfrac>
+      <mrow>
+        <mi>e</mi>
+        <mo>⁢</mo>
+        <mi>F</mi>
+        <mo>⁢</mo>
+        <mi>l</mi>
+        <mo>×</mo>
+        <mfenced><mrow>
+          <mfrac>
+            <mi>l</mi>
+            <mn>2</mn>
+          </mfrac>
+          <mo>+</mo>
+          <mi>h</mi>
+        </mrow>
+        </mfenced>
+      </mrow>
+      <mrow>
+        <mi>m</mi>
+        <mo>⁢</mo>
+        <msup>
+          <mi>v</mi>
+          <mn>2</mn>
+        </msup>
+      </mrow>
+    </mfrac>
+  </mrow></mat>
+</akap>
diff --git a/tests/files/tags/motto/1.expected.html b/tests/files/tags/motto/1.expected.html
new file mode 100644 (file)
index 0000000..6f71f42
--- /dev/null
@@ -0,0 +1,11 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Aleksander Fredro</span><span class="wl title" id="i2">Zemsta</span>
+</h1>
+<div class="motto" id="i3">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Nie masz nic tak złego, żeby się na dobre nie przydało. Bywa z węża dryjakiew, złe często dobremu okazyją daje.</p>
+</div>
+<p class="wl motto_podpis" id="i4">
+And. Maks. Fredro
+</p>
+</div>
diff --git a/tests/files/tags/motto/1.xml b/tests/files/tags/motto/1.xml
new file mode 100644 (file)
index 0000000..e3aec09
--- /dev/null
@@ -0,0 +1,10 @@
+<autor_utworu>Aleksander Fredro</autor_utworu>
+<nazwa_utworu>Zemsta</nazwa_utworu>
+
+<motto>
+<akap>Nie masz nic tak złego, żeby się na dobre nie przydało. Bywa z węża dryjakiew, złe często dobremu okazyją daje.</akap>
+</motto>
+
+<motto_podpis>
+And. Maks. Fredro
+</motto_podpis>
diff --git a/tests/files/tags/motto_podpis/1.expected.html b/tests/files/tags/motto_podpis/1.expected.html
new file mode 100644 (file)
index 0000000..1ff589b
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Adam Mickiewicz</span><span class="wl title" id="i2">Konrad Wallenrod</span><span class="wl subtitle" id="i3">Powieść historyczna</span><span class="wl subtitle" id="i4">(Z dziejów litewskich i pruskich)</span>
+</h1>
+<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...../
+bisogna essere volpe e leone.</em></div>
+</div>
+</div>
+<p class="wl motto_podpis" id="i7">MACCHIAVELLI</p>
+</div>
diff --git a/tests/files/tags/motto_podpis/1.xml b/tests/files/tags/motto_podpis/1.xml
new file mode 100644 (file)
index 0000000..709b324
--- /dev/null
@@ -0,0 +1,14 @@
+<autor_utworu>Adam Mickiewicz</autor_utworu>
+<nazwa_utworu>Konrad Wallenrod</nazwa_utworu>
+<podtytul>Powieść historyczna</podtytul>
+<podtytul>(Z dziejów litewskich i pruskich)</podtytul>
+
+<motto>
+<strofa>
+<slowo_obce>Dovete adunque sapere come sono/
+due generazioni da combattere...../
+bisogna essere volpe e leone.</slowo_obce>
+</strofa>
+</motto>
+
+<motto_podpis>MACCHIAVELLI</motto_podpis>
diff --git a/tests/files/tags/naglowek_akt/1.expected.html b/tests/files/tags/naglowek_akt/1.expected.html
new file mode 100644 (file)
index 0000000..f5c0f26
--- /dev/null
@@ -0,0 +1,12 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">AKT PIERWSZY</a><li><ol>
+<a href="#s2" class="anchor">SCENA PIERWSZA</a><li>
+</ol></li>
+</ol>
+</div>
+<h2 class="wl" id="s1">AKT PIERWSZY</h2>
+<h3 id="s2">SCENA PIERWSZA</h3>
+</div>
diff --git a/tests/files/tags/naglowek_akt/1.xml b/tests/files/tags/naglowek_akt/1.xml
new file mode 100644 (file)
index 0000000..85d24ec
--- /dev/null
@@ -0,0 +1,4 @@
+<naglowek_akt>AKT PIERWSZY</naglowek_akt>
+
+Pokój w zamku Cześnika, drzwi na prawo, lewo i w środku, stoły, krzesła etc., gitara angielska na ścianie.
+<naglowek_scena>SCENA PIERWSZA</naglowek_scena>
diff --git a/tests/files/tags/naglowek_czesc/1.expected.html b/tests/files/tags/naglowek_czesc/1.expected.html
new file mode 100644 (file)
index 0000000..d59489e
--- /dev/null
@@ -0,0 +1,22 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">PIEŚŃ I</a><li>
+</ol>
+</div>
+<h1>
+<span class="wl author" id="i1">Juliusz Słowacki</span><span class="wl title" id="i2">Beniowski</span>
+</h1>
+<h2 class="wl" id="s1">PIEŚŃ I</h2>
+<div class="stanza" id="i3">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Za panowania króla Stanisława</div>
+<div class="wl verse verse-indent verse-indent-1" id="f2">Mieszkał ubogi szlachcic na Podolu,</div>
+<div class="wl verse" id="f3">Wysoko potem go wyniosła sława;</div>
+<div class="wl verse verse-indent verse-indent-1" id="f4">Szczęścia miał mało w życiu, więcej bolu;</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Albowiem była to epoka krwawa,</div>
+<div class="wl verse verse-indent verse-indent-1" id="f6">I kraj był cały na rumaku, w polu;</div>
+<div class="wl verse" id="f7">Łany, ogrody leżały odłogiem,</div>
+<div class="wl verse" id="f8">Zaraza stała u domu za progiem.</div>
+</div>
+</div>
diff --git a/tests/files/tags/naglowek_czesc/1.xml b/tests/files/tags/naglowek_czesc/1.xml
new file mode 100644 (file)
index 0000000..3859aad
--- /dev/null
@@ -0,0 +1,15 @@
+<autor_utworu>Juliusz Słowacki</autor_utworu>
+<nazwa_utworu>Beniowski</nazwa_utworu>
+
+<naglowek_czesc>PIEŚŃ I</naglowek_czesc>
+
+<strofa>
+Za panowania króla Stanisława/
+<wers_wciety>Mieszkał ubogi szlachcic na Podolu,</wers_wciety>/
+Wysoko potem go wyniosła sława;/
+<wers_wciety>Szczęścia miał mało w życiu, więcej bolu;</wers_wciety>/
+Albowiem była to epoka krwawa,/
+<wers_wciety>I kraj był cały na rumaku, w polu;</wers_wciety>/
+Łany, ogrody leżały odłogiem,/
+Zaraza stała u domu za progiem.
+</strofa>
diff --git a/tests/files/tags/naglowek_osoba/1.expected.html b/tests/files/tags/naglowek_osoba/1.expected.html
new file mode 100644 (file)
index 0000000..4903bb3
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="book-text">
+<h4 id="i1">CZEŚNIK</h4>
+<div class="kwestia">
+<div class="didaskalia" id="i2">jakby do siebie</div>
+<div class="stanza" id="i3">
+<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>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Trzy folwarki!</div>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/naglowek_osoba/1.xml b/tests/files/tags/naglowek_osoba/1.xml
new file mode 100644 (file)
index 0000000..2aa172a
--- /dev/null
@@ -0,0 +1,12 @@
+<naglowek_osoba>CZEŚNIK</naglowek_osoba>
+
+<kwestia>
+<didaskalia>jakby do siebie</didaskalia>
+<strofa>
+Piękne dobra w każdym względzie ---/
+Lasy --- gleba wyśmienita ---/
+Dobrą żoną pewnie będzie ---/
+Co za czynsze! --- To kobiéta!.../
+Trzy folwarki!
+</strofa>...
+</kwestia>
diff --git a/tests/files/tags/naglowek_podrozdzial/1.expected.html b/tests/files/tags/naglowek_podrozdzial/1.expected.html
new file mode 100644 (file)
index 0000000..1194ffb
--- /dev/null
@@ -0,0 +1 @@
+<div id="book-text"><h4 id="s1"> numer-i/lub-tytuł-podrozdziału </h4></div>
diff --git a/tests/files/tags/naglowek_podrozdzial/1.xml b/tests/files/tags/naglowek_podrozdzial/1.xml
new file mode 100644 (file)
index 0000000..f0e14fd
--- /dev/null
@@ -0,0 +1 @@
+<naglowek_podrozdzial> numer-i/lub-tytuł-podrozdziału </naglowek_podrozdzial>
diff --git a/tests/files/tags/naglowek_rozdzial/1.expected.html b/tests/files/tags/naglowek_rozdzial/1.expected.html
new file mode 100644 (file)
index 0000000..578edc1
--- /dev/null
@@ -0,0 +1,12 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">I. Jak wygląda firma J. Mincel i S. Wokulski przez szkło butelek?</a><li>
+</ol>
+</div>
+<h1>
+<span class="wl author" id="i1">Bolesław Prus</span><span class="wl collection" id="i2">Lalka</span><span class="wl title" id="i3">Tom pierwszy</span>
+</h1>
+<h3 class="wl" id="s1">I. Jak wygląda firma J. Mincel i S. Wokulski przez szkło butelek?</h3>
+</div>
diff --git a/tests/files/tags/naglowek_rozdzial/1.xml b/tests/files/tags/naglowek_rozdzial/1.xml
new file mode 100644 (file)
index 0000000..4ee02e5
--- /dev/null
@@ -0,0 +1,6 @@
+<autor_utworu>Bolesław Prus</autor_utworu>
+<dzielo_nadrzedne>Lalka</dzielo_nadrzedne>
+<nazwa_utworu>Tom pierwszy</nazwa_utworu>
+
+<naglowek_rozdzial>I. Jak wygląda firma J. Mincel i S. Wokulski przez szkło butelek?</naglowek_rozdzial>
+
diff --git a/tests/files/tags/nazwa_utworu/1.expected.html b/tests/files/tags/nazwa_utworu/1.expected.html
new file mode 100644 (file)
index 0000000..b89798a
--- /dev/null
@@ -0,0 +1 @@
+<div id="book-text"><h1><span class="wl title" id="i1">Anioł</span></h1></div>
diff --git a/tests/files/tags/nazwa_utworu/1.xml b/tests/files/tags/nazwa_utworu/1.xml
new file mode 100644 (file)
index 0000000..0627acf
--- /dev/null
@@ -0,0 +1 @@
+<nazwa_utworu>Anioł</nazwa_utworu>
diff --git a/tests/files/tags/nota/1.expected.html b/tests/files/tags/nota/1.expected.html
new file mode 100644 (file)
index 0000000..e68a4bc
--- /dev/null
@@ -0,0 +1,7 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Henryk Sienkiewicz</span><span class="wl title" id="i2">Latarnik</span>
+</h1>
+<div class="note"><p class="wl paragraph" id="i3">Opowiadanie to osnute jest na wypadku rzeczywistym, o którym w swoim czasie pisał J. Horain
+   w jednej ze swoich korespondencyj z Ameryki.</p></div>
+</div>
diff --git a/tests/files/tags/nota/1.xml b/tests/files/tags/nota/1.xml
new file mode 100644 (file)
index 0000000..57991c6
--- /dev/null
@@ -0,0 +1,5 @@
+<autor_utworu>Henryk Sienkiewicz</autor_utworu>
+<nazwa_utworu>Latarnik</nazwa_utworu>
+
+<nota><akap>Opowiadanie to osnute jest na wypadku rzeczywistym, o którym w swoim czasie pisał J. Horain
+   w jednej ze swoich korespondencyj z Ameryki.</akap></nota>
diff --git a/tests/files/tags/nota/2.expected.html b/tests/files/tags/nota/2.expected.html
new file mode 100644 (file)
index 0000000..6006ef6
--- /dev/null
@@ -0,0 +1,18 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">III</a><li>
+</ol>
+</div>
+<h2 class="wl" id="s1">III</h2>
+<div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Każdego z takich, jak ty, świat nie może</div>
+<div class="wl verse" id="f2">Od razu przyjąć na spokojne łoże,</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>
+<div class="note"><p class="wl paragraph" id="i2">Pisałem w Paryżu 1856 w styczniu.</p></div>
+</div>
diff --git a/tests/files/tags/nota/2.xml b/tests/files/tags/nota/2.xml
new file mode 100644 (file)
index 0000000..efa9504
--- /dev/null
@@ -0,0 +1,14 @@
+<!-- lub czasem na końcu utworu: -->
+
+<naglowek_czesc>III</naglowek_czesc>
+
+<strofa>
+Każdego z takich, jak ty, świat nie może/
+Od razu przyjąć na spokojne łoże,/
+I nie przyjmował nigdy, jak wiek wiekiem./
+Bo glina w glinę wtapia się bez przerwy,/
+Gdy sprzeczne ciała zbija się aż ćwiekiem/
+Później... lub pierwéj...
+</strofa>
+
+<nota><akap>Pisałem w Paryżu 1856 w styczniu.</akap></nota>
diff --git a/tests/files/tags/nota/3.expected.html b/tests/files/tags/nota/3.expected.html
new file mode 100644 (file)
index 0000000..b7d62b4
--- /dev/null
@@ -0,0 +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,
+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,
+oznaczając te nazwiska tylko pierwszymi literami, z dodaniem czasami końcówek. [...]</p></div>
+</div>
diff --git a/tests/files/tags/nota/3.xml b/tests/files/tags/nota/3.xml
new file mode 100644 (file)
index 0000000..92e7980
--- /dev/null
@@ -0,0 +1,9 @@
+<!-- albo też przed rozdziałami albo podrozdziałami, których dotyczą, lub po nich: -->
+
+<akap>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.</akap>
+
+<nota><akap><wyroznienie>Uwaga tłumacza</wyroznienie>. Drukowane obecnie w ,,Nowej Reformie"
+<tytul_dziela>Wspomnienia Sybiraka</tytul_dziela> (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. [...]</akap></nota>
diff --git a/tests/files/tags/nota/4.expected.html b/tests/files/tags/nota/4.expected.html
new file mode 100644 (file)
index 0000000..ec32394
--- /dev/null
@@ -0,0 +1,12 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">Gospodarstwo</a><li>
+</ol>
+</div>
+<h3 class="wl" id="s1">Gospodarstwo</h3>
+<div class="note"><p class="wl paragraph" id="i1">Powrót panicza — Spotkanie się pierwsze w pokoiku, drugie u stołu — Ważna Sędziego
+nauka o grzeczności — Podkomorzego uwagi polityczne nad modami — Początek sporu o Kusego i Sokoła
+— Żale Wojskiego — Ostatni Woźny Trybunału — Rzut oka na ówczesny stan polityczny Litwy i Europy</p></div>
+</div>
diff --git a/tests/files/tags/nota/4.xml b/tests/files/tags/nota/4.xml
new file mode 100644 (file)
index 0000000..56ab06f
--- /dev/null
@@ -0,0 +1,7 @@
+<!-- Do tej samej kategorii należy dyspozycja (argument) rozdziału, podrozdziału (lub pieśni poematu), czyli krótkie przedstawienie jego treści, umieszczane bezpośrednio pod tytułem (nagłówkiem). -->
+
+<naglowek_rozdzial>Gospodarstwo</naglowek_rozdzial>
+
+<nota><akap>Powrót panicza --- Spotkanie się pierwsze w pokoiku, drugie u stołu --- Ważna Sędziego
+nauka o grzeczności --- Podkomorzego uwagi polityczne nad modami --- Początek sporu o Kusego i Sokoła
+--- Żale Wojskiego --- Ostatni Woźny Trybunału --- Rzut oka na ówczesny stan polityczny Litwy i Europy</akap></nota>
diff --git a/tests/files/tags/nota/5.expected.html b/tests/files/tags/nota/5.expected.html
new file mode 100644 (file)
index 0000000..dadf5f6
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="book-text">
+<h4 id="s1">II</h4>
+<div class="note"><p class="wl paragraph" id="i1">Moje wypadki • Ognisko w wąwozie • Uczta • Opowiadania skwatera • Nocleg • Głosy nocne
+• Niespokojne sny • Ranek • Polowanie z zasadzki • Pierwszy jeleń</p></div>
+</div>
diff --git a/tests/files/tags/nota/5.xml b/tests/files/tags/nota/5.xml
new file mode 100644 (file)
index 0000000..94747d3
--- /dev/null
@@ -0,0 +1,4 @@
+<naglowek_podrozdzial>II</naglowek_podrozdzial>
+
+<nota><akap>Moje wypadki • Ognisko w wąwozie • Uczta • Opowiadania skwatera • Nocleg • Głosy nocne
+• Niespokojne sny • Ranek • Polowanie z zasadzki • Pierwszy jeleń</akap></nota>
diff --git a/tests/files/tags/nota/6.expected.html b/tests/files/tags/nota/6.expected.html
new file mode 100644 (file)
index 0000000..b0465e4
--- /dev/null
@@ -0,0 +1,8 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Oto rozdziały dwudziesty piąty, szósty i siódmy przygotowują nadchodzącą chwilę.</p>
+<div class="note"><p class="wl paragraph" id="i1">Idea dobra zaczyna świecić</p></div>
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Już Arystofanes tłumaczy Erosa, który dwie płci wiąże, stwarzając mit, dając koncepcję
+„dążenia do jedności”. Dopiero teraz popęd płciowy wystąpi w jasnym, boskim świetle, jako
+nieświadome dążenie do nieśmiertelności. Pokaże się, że istoty żywe dlatego tylko zapłodnienia
+pragną, że zapłodnienie uczestniczy jakoś w wielkiej idei „nieśmiertelnego dobra”.</p>
+</div>
diff --git a/tests/files/tags/nota/6.xml b/tests/files/tags/nota/6.xml
new file mode 100644 (file)
index 0000000..63c88ae
--- /dev/null
@@ -0,0 +1,9 @@
+<!-- Rodzajami not są także komentarze do partii tekstu niewyodrębnionych w rozdziały czy podrozdziały, w wydaniach drukowanych umieszczane w tzw. okienku bocznym: -->
+
+<akap>Oto rozdziały dwudziesty piąty, szósty i siódmy przygotowują nadchodzącą chwilę.</akap>
+
+<nota><akap>Idea dobra zaczyna świecić</akap></nota>
+<akap>Już Arystofanes tłumaczy Erosa, który dwie płci wiąże, stwarzając mit, dając koncepcję
+,,dążenia do jedności". Dopiero teraz popęd płciowy wystąpi w jasnym, boskim świetle, jako
+nieświadome dążenie do nieśmiertelności. Pokaże się, że istoty żywe dlatego tylko zapłodnienia
+pragną, że zapłodnienie uczestniczy jakoś w wielkiej idei ,,nieśmiertelnego dobra".</akap>
diff --git a/tests/files/tags/numeracja/1.expected.html b/tests/files/tags/numeracja/1.expected.html
new file mode 100644 (file)
index 0000000..7ae68bb
--- /dev/null
@@ -0,0 +1,30 @@
+<div id="book-text">
+<div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Jednych tam śmierć porwała kres życiu znacząca,</div>
+<div class="wl verse" id="f2">Drugim z dala od ludzi Zeus życie rozkoszy</div>
+<div class="wl verse" id="f3">Dał pełne i umieścił ich u ziemi końca,</div>
+<div class="wl verse" id="f4">Gdzie żadna troska w sercu spokoju nie płoszy,</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">W Krainie Szczęścia nad pienistym Oceanem,</div>
+<a href="#f6" class="wl-num">100</a><div class="wl verse" id="f6">Z dala od bogów; Kronos jest nad nimi panem,</div>
+<div class="wl verse" id="f7">[Zwolniony z pęt przez bogów i ludzi rodzica.</div>
+<div class="wl verse" id="f8">Zeus im udzielił wielkiej czci, chwałą zaszczyca</div>
+<div class="wl verse" id="f9">I wyniósł ich jak żadne w porównaniu z niemi</div>
+<div class="wl verse" id="f10">Plemię z tych, które żyły na wszechpłodnej ziemi.]</div>
+<a href="#f11" class="wl-num">105</a><div class="wl verse" id="f11">Cni bohaterzy! Trzykroć w roku owoc wszelki,</div>
+<div class="wl verse" id="f12">Jak miód słodki, od ziemi biorą żywicielki.</div>
+</div>
+<div class="stanza" id="i2">
+<div class="wl verse" id="f13">Gdy masz przejść w bród przez piękne fale wiecznej rzeki,</div>
+<div class="wl verse" id="f14">Módl się wprzód, umyj ręce i spójrz w prąd daleki.</div>
+<a href="#f15" class="wl-num">740</a><div class="wl verse" id="f15">Tym, co wchodzą do rzeki, nie mocząc rąk, prości,</div>
+<div class="wl verse" id="f16">Bogowie odpłacają cierpieniem w przyszłości.</div>
+<div class="wl verse" id="f17">Gdy bogom uroczyste obiaty się palą,</div>
+</div>
+<div class="stanza" id="i3">
+<a href="#f18" class="wl-num">1</a><div class="wl verse" id="f18">Pilnie strzeż się na bliźnich mieść potwarzy brzemię.</div>
+<div class="wl verse" id="f19">Mały zachód, trud lekki popuścić jej wodze,</div>
+<div class="wl verse" id="f20">Lecz ciężko dźwigać, trudno ją zrzucić na ziemię.</div>
+<div class="wl verse" id="f21">Nigdy potwarz, jeżeli ją uprawia mnóstwo,</div>
+<a href="#f22" class="wl-num">5</a><div class="wl verse" id="f22">Nie ginie całkiem; to też w swym rodzaju bóstwo.</div>
+</div>
+</div>
diff --git a/tests/files/tags/numeracja/1.xml b/tests/files/tags/numeracja/1.xml
new file mode 100644 (file)
index 0000000..14d29c4
--- /dev/null
@@ -0,0 +1,32 @@
+<strofa>
+Jednych tam śmierć porwała kres życiu znacząca,/
+Drugim z dala od ludzi Zeus życie rozkoszy/
+Dał pełne i umieścił ich u ziemi końca,/
+Gdzie żadna troska w sercu spokoju nie płoszy,/
+W Krainie Szczęścia nad pienistym Oceanem,/
+<numeracja start="100"/>Z dala od bogów; Kronos jest nad nimi panem,/
+[Zwolniony z pęt przez bogów i ludzi rodzica./
+Zeus im udzielił wielkiej czci, chwałą zaszczyca/
+I wyniósł ich jak żadne w porównaniu z niemi/
+Plemię z tych, które żyły na wszechpłodnej ziemi.]/
+Cni bohaterzy! Trzykroć w roku owoc wszelki,/
+Jak miód słodki, od ziemi biorą żywicielki.
+</strofa>
+
+<numeracja start="738"/>
+
+<strofa>
+Gdy masz przejść w bród przez piękne fale wiecznej rzeki,/
+Módl się wprzód, umyj ręce i spójrz w prąd daleki./
+Tym, co wchodzą do rzeki, nie mocząc rąk, prości,/
+Bogowie odpłacają cierpieniem w przyszłości./
+Gdy bogom uroczyste obiaty się palą,
+</strofa>
+
+<numeracja/>
+
+<strofa>Pilnie strzeż się na bliźnich mieść potwarzy brzemię./
+Mały zachód, trud lekki popuścić jej wodze,/
+Lecz ciężko dźwigać, trudno ją zrzucić na ziemię./
+Nigdy potwarz, jeżeli ją uprawia mnóstwo,/
+Nie ginie całkiem; to też w swym rodzaju bóstwo.</strofa>
diff --git a/tests/files/tags/osoba/1.expected.html b/tests/files/tags/osoba/1.expected.html
new file mode 100644 (file)
index 0000000..50a9b9c
--- /dev/null
@@ -0,0 +1,23 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">AKT PIERWSZY</a><li><ol>
+<a href="#s2" class="anchor">SCENA PIERWSZA</a><li>
+</ol></li>
+</ol>
+</div>
+<h2 class="wl" id="s1">AKT PIERWSZY</h2>
+<div class="didaskalia" id="i1">
+Pokój w zamku
+<em class="person">Cześnika</em>,
+drzwi na prawo, lewo i w środku, stoły, krzesła etc., gitara angielska na ścianie.
+</div>
+<h3 id="s2">SCENA PIERWSZA</h3>
+<div class="didaskalia" id="i2">
+
+<em class="person">Cześnik</em>,
+<em class="person">Dyndalski</em>
+
+</div>
+</div>
diff --git a/tests/files/tags/osoba/1.xml b/tests/files/tags/osoba/1.xml
new file mode 100644 (file)
index 0000000..98bf0e0
--- /dev/null
@@ -0,0 +1,16 @@
+<naglowek_akt>AKT PIERWSZY</naglowek_akt>
+
+<didaskalia>
+Pokój w zamku
+<osoba>Cześnika</osoba>,
+drzwi na prawo, lewo i w środku, stoły, krzesła etc., gitara angielska na ścianie.
+</didaskalia>
+
+<naglowek_scena>SCENA PIERWSZA</naglowek_scena>
+
+<didaskalia>
+
+<osoba>Cześnik</osoba>,
+<osoba>Dyndalski</osoba>
+
+</didaskalia>
diff --git a/tests/files/tags/pa/1.expected.html b/tests/files/tags/pa/1.expected.html
new file mode 100644 (file)
index 0000000..f74cb3f
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Bieży<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a>.</p>
+<div id="footnotes">
+<h3>Przypisy</h3>
+<div class="fn-pa">
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p><em class="foreign-word">bieży</em> — biegnie. [przypis autorski]</p>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/pa/1.xml b/tests/files/tags/pa/1.xml
new file mode 100644 (file)
index 0000000..ebe4b29
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  Bieży<pa><slowo_obce>bieży</slowo_obce> --- biegnie.</pa>.
+</akap>
diff --git a/tests/files/tags/pe/1.expected.html b/tests/files/tags/pe/1.expected.html
new file mode 100644 (file)
index 0000000..777d900
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Bieży<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a>.</p>
+<div id="footnotes">
+<h3>Przypisy</h3>
+<div class="fn-pe">
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p><em class="foreign-word">bieży</em> — biegnie. [przypis edytorski]</p>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/pe/1.xml b/tests/files/tags/pe/1.xml
new file mode 100644 (file)
index 0000000..f28f30e
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  Bieży<pe><slowo_obce>bieży</slowo_obce> --- biegnie.</pe>.
+</akap>
diff --git a/tests/files/tags/pe/2.expected.html b/tests/files/tags/pe/2.expected.html
new file mode 100644 (file)
index 0000000..e30725e
--- /dev/null
@@ -0,0 +1,12 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Bieży<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a>.</p>
+<div id="footnotes">
+<h3>Przypisy</h3>
+<div class="fn-pe">
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p>
+  <p class="wl paragraph"><em class="foreign-word">bieży</em> — biegnie.</p>
+  <p class="wl paragraph">Drugi akapit przypisu.</p>
+   [przypis edytorski]</p>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/pe/2.xml b/tests/files/tags/pe/2.xml
new file mode 100644 (file)
index 0000000..ab00e06
--- /dev/null
@@ -0,0 +1,6 @@
+<akap>
+  Bieży<pe>
+  <akap><slowo_obce>bieży</slowo_obce> --- biegnie.</akap>
+  <akap>Drugi akapit przypisu.</akap>
+  </pe>.
+</akap>
diff --git a/tests/files/tags/podtytul/1.expected.html b/tests/files/tags/podtytul/1.expected.html
new file mode 100644 (file)
index 0000000..2fdf222
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text"><h1>
+<span class="wl author" id="i1">Daniel Defoe</span><span class="wl title" id="i2">Robinson Crusoe</span><span class="wl subtitle" id="i3">Jego życia losy, doświadczenia i przypadki</span>
+</h1></div>
diff --git a/tests/files/tags/podtytul/1.xml b/tests/files/tags/podtytul/1.xml
new file mode 100644 (file)
index 0000000..55415f3
--- /dev/null
@@ -0,0 +1,4 @@
+<autor_utworu>Daniel Defoe</autor_utworu>
+<nazwa_utworu>Robinson Crusoe</nazwa_utworu>
+
+<podtytul>Jego życia losy, doświadczenia i przypadki</podtytul>
diff --git a/tests/files/tags/poezja_cyt/1.expected.html b/tests/files/tags/poezja_cyt/1.expected.html
new file mode 100644 (file)
index 0000000..b0d195b
--- /dev/null
@@ -0,0 +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 class="wl verse" id="f2">Do tych pagórków leśnych, do tych łąk zielonych...</div>
+</div></blockquote></div>
diff --git a/tests/files/tags/poezja_cyt/1.xml b/tests/files/tags/poezja_cyt/1.xml
new file mode 100644 (file)
index 0000000..e003954
--- /dev/null
@@ -0,0 +1,6 @@
+<poezja_cyt>
+<strofa>
+Tymczasem przenoś duszę moją utęsknioną/
+Do tych pagórków leśnych, do tych łąk zielonych...
+</strofa>
+</poezja_cyt>
diff --git a/tests/files/tags/pr/1.expected.html b/tests/files/tags/pr/1.expected.html
new file mode 100644 (file)
index 0000000..72ec98a
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Bieży<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a>.</p>
+<div id="footnotes">
+<h3>Przypisy</h3>
+<div class="fn-pr">
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p><em class="foreign-word">bieży</em> — biegnie. [przypis redakcyjny]</p>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/pr/1.xml b/tests/files/tags/pr/1.xml
new file mode 100644 (file)
index 0000000..f111c8b
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  Bieży<pr><slowo_obce>bieży</slowo_obce> --- biegnie.</pr>.
+</akap>
diff --git a/tests/files/tags/pt/1.expected.html b/tests/files/tags/pt/1.expected.html
new file mode 100644 (file)
index 0000000..0cbd428
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Bieży<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a>.</p>
+<div id="footnotes">
+<h3>Przypisy</h3>
+<div class="fn-pt">
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p><em class="foreign-word">bieży</em> — biegnie. [przypis tłumacza]</p>
+</div>
+</div>
+</div>
diff --git a/tests/files/tags/pt/1.xml b/tests/files/tags/pt/1.xml
new file mode 100644 (file)
index 0000000..c832b38
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  Bieży<pt><slowo_obce>bieży</slowo_obce> --- biegnie.</pt>.
+</akap>
diff --git a/tests/files/tags/ref/1.expected.html b/tests/files/tags/ref/1.expected.html
new file mode 100644 (file)
index 0000000..85c374a
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">W roku 1872 dom pod numerem 7 przy Saville Row<a class="reference" data-uri="https://www.wikidata.org/wiki/Q1631609"></a>, Burlington Gardens, w którym w roku 1814 zmarł Sheridan<a class="reference" data-uri="https://www.wikidata.org/wiki/Q352725"></a>, był zamieszkany przez Phileasa Fogga, członka londyńskiego klubu „Reforma”<a class="reference" data-uri="https://www.wikidata.org/wiki/Q962177"></a>, osobistość wybitną i wielce oryginalną.</p>
+</div>
diff --git a/tests/files/tags/ref/1.xml b/tests/files/tags/ref/1.xml
new file mode 100644 (file)
index 0000000..6d46efe
--- /dev/null
@@ -0,0 +1 @@
+<akap>W roku 1872 dom pod numerem 7 przy Saville Row<ref href="https://www.wikidata.org/wiki/Q1631609"></ref>, Burlington Gardens, w którym w roku 1814 zmarł Sheridan<ref href="https://www.wikidata.org/wiki/Q352725"></ref>, był zamieszkany przez Phileasa Fogga, członka londyńskiego klubu ,,Reforma"<ref href="https://www.wikidata.org/wiki/Q962177"></ref>, osobistość wybitną i wielce oryginalną.</akap>
diff --git a/tests/files/tags/rownolegle/1.expected.html b/tests/files/tags/rownolegle/1.expected.html
new file mode 100644 (file)
index 0000000..36d9021
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="book-text">
+<div class="paralell-block paralell-block-first"><div class="kwestia">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Treść</p>
+</div></div>
+<div class="paralell-block paralell-block-last">
+    <div class="kwestia">
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Treść</p>
+</div>
+    <div class="kwestia">
+<a href="#f3" class="wl-num">3</a><p class="wl paragraph" id="f3">Treść</p>
+</div>
+  </div>
+</div>
diff --git a/tests/files/tags/rownolegle/1.xml b/tests/files/tags/rownolegle/1.xml
new file mode 100644 (file)
index 0000000..8775145
--- /dev/null
@@ -0,0 +1,16 @@
+<rownolegle>
+
+  <kwestia>
+    <akap>Treść</akap>
+  </kwestia>
+
+  <blok>
+    <kwestia>
+      <akap>Treść</akap>
+    </kwestia>
+    <kwestia>
+      <akap>Treść</akap>
+    </kwestia>
+  </blok>
+
+</rownolegle>
diff --git a/tests/files/tags/sekcja_asterysk/1.expected.html b/tests/files/tags/sekcja_asterysk/1.expected.html
new file mode 100644 (file)
index 0000000..d1d86b7
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Tekst</p>
+<p class="spacer-asterisk">*</p>
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Tekst</p>
+</div>
diff --git a/tests/files/tags/sekcja_asterysk/1.xml b/tests/files/tags/sekcja_asterysk/1.xml
new file mode 100644 (file)
index 0000000..c7b34ae
--- /dev/null
@@ -0,0 +1,5 @@
+<akap>Tekst</akap>
+
+<sekcja_asterysk />
+
+<akap>Tekst</akap>
diff --git a/tests/files/tags/sekcja_swiatlo/1.expected.html b/tests/files/tags/sekcja_swiatlo/1.expected.html
new file mode 100644 (file)
index 0000000..6985524
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Tekst</p>
+<hr class="spacer">
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Tekst</p>
+</div>
diff --git a/tests/files/tags/sekcja_swiatlo/1.xml b/tests/files/tags/sekcja_swiatlo/1.xml
new file mode 100644 (file)
index 0000000..34ac256
--- /dev/null
@@ -0,0 +1,5 @@
+<akap>Tekst</akap>
+
+<sekcja_swiatlo />
+
+<akap>Tekst</akap>
diff --git a/tests/files/tags/separator_linia/1.expected.html b/tests/files/tags/separator_linia/1.expected.html
new file mode 100644 (file)
index 0000000..4f54cff
--- /dev/null
@@ -0,0 +1,5 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Tekst</p>
+<hr class="spacer-line">
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">Tekst</p>
+</div>
diff --git a/tests/files/tags/separator_linia/1.xml b/tests/files/tags/separator_linia/1.xml
new file mode 100644 (file)
index 0000000..4c05f5e
--- /dev/null
@@ -0,0 +1,5 @@
+<akap>Tekst</akap>
+
+<separator_linia />
+
+<akap>Tekst</akap>
diff --git a/tests/files/tags/slowo_obce/1.expected.html b/tests/files/tags/slowo_obce/1.expected.html
new file mode 100644 (file)
index 0000000..8fa6808
--- /dev/null
@@ -0,0 +1,3 @@
+<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>
+</div>
diff --git a/tests/files/tags/slowo_obce/1.xml b/tests/files/tags/slowo_obce/1.xml
new file mode 100644 (file)
index 0000000..8e99a29
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+Na czwarty dzień przywiózł mu stójka z osłowickiej apteki <slowo_obce>diachylum</slowo_obce>; Zołzikiewicz rozsmarował na płatek...
+</akap>
diff --git a/tests/files/tags/srodtytul/1.expected.html b/tests/files/tags/srodtytul/1.expected.html
new file mode 100644 (file)
index 0000000..291f17f
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text">
+<div id="toc">
+<h2>Spis treści</h2>
+<ol>
+<a href="#s1" class="anchor">śródtytuł</a><li>
+</ol>
+</div>
+<h2 class="wl" id="s1"> śródtytuł </h2>
+</div>
diff --git a/tests/files/tags/srodtytul/1.xml b/tests/files/tags/srodtytul/1.xml
new file mode 100644 (file)
index 0000000..8132adf
--- /dev/null
@@ -0,0 +1 @@
+<srodtytul> śródtytuł </srodtytul>
diff --git a/tests/files/tags/strofa/1.expected.html b/tests/files/tags/strofa/1.expected.html
new file mode 100644 (file)
index 0000000..fb5cb9a
--- /dev/null
@@ -0,0 +1,13 @@
+<div id="book-text">
+<h1>
+<span class="wl author" id="i1">Mikołaj Sęp Szarzyński</span><span class="wl title" id="i2">Do Zosie</span>
+</h1>
+<div class="stanza" id="i3">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Będę się zawsze dziwował twojej pikności:</div>
+<div class="wl verse" id="f2">Nie szkodzi wiernej dalekość miłości;</div>
+<div class="wl verse" id="f3">Bo, gdzie ciałem nie mogę być, tam myślą będę,</div>
+<div class="wl verse" id="f4">A pierwej siebie, niż ciebie zabędę;</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">A dotąd się serce me smęcić nie przestanie,</div>
+<div class="wl verse" id="f6">Aż cię oglądam, me wdzięczne kochanie.</div>
+</div>
+</div>
diff --git a/tests/files/tags/strofa/1.xml b/tests/files/tags/strofa/1.xml
new file mode 100644 (file)
index 0000000..9310b33
--- /dev/null
@@ -0,0 +1,10 @@
+<autor_utworu>Mikołaj Sęp Szarzyński</autor_utworu>
+<nazwa_utworu>Do Zosie</nazwa_utworu>
+
+<strofa>Będę się zawsze dziwował twojej pikności:/
+Nie szkodzi wiernej dalekość miłości;/
+Bo, gdzie ciałem nie mogę być, tam myślą będę,/
+A pierwej siebie, niż ciebie zabędę;/
+A dotąd się serce me smęcić nie przestanie,/
+Aż cię oglądam, me wdzięczne kochanie.
+</strofa>
diff --git a/tests/files/tags/tab/1.expected.html b/tests/files/tags/tab/1.expected.html
new file mode 100644 (file)
index 0000000..e2afe7d
--- /dev/null
@@ -0,0 +1,21 @@
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">A<span display="inline-block" width="1em"></span>B</div>
+<div class="wl verse" id="f2">A<span display="inline-block" width="1em"></span>1</div>
+<div class="wl verse" id="f3">A<span display="inline-block" width="2em"></span>2</div>
+<div class="wl verse" id="f4">A<span display="inline-block" width="3em"></span>3</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">A<span display="inline-block" width="4em"></span>4</div>
+<div class="wl verse" id="f6">A<span display="inline-block" width="5em"></span>5</div>
+<div class="wl verse" id="f7">A<span display="inline-block" width="6em"></span>6</div>
+<div class="wl verse" id="f8">A<span display="inline-block" width="1em"></span>1em</div>
+<div class="wl verse" id="f9">A<span display="inline-block" width="2em"></span>2em</div>
+<a href="#f10" class="wl-num">10</a><div class="wl verse" id="f10">A<span display="inline-block" width="3em"></span>3em</div>
+<div class="wl verse" id="f11">A<span display="inline-block" width="4em"></span>4em</div>
+<div class="wl verse" id="f12">A<span display="inline-block" width="5em"></span>5em</div>
+<div class="wl verse" id="f13">A<span display="inline-block" width="6em"></span>6em</div>
+<div class="wl verse verse-stretched" id="f14">
+<span>A</span><span class="verse-stretched-space"></span><span>*</span>
+</div>
+<a href="#f15" class="wl-num">15</a><div class="wl verse verse-stretched" id="f15">
+<span>Rozszerzony tabulator <em class="author-emphasis">wewnątrz</em></span><span class="verse-stretched-space"></span><span><em class="author-emphasis">wyróżnienia</em></span>
+</div>
+</div></div>
diff --git a/tests/files/tags/tab/1.xml b/tests/files/tags/tab/1.xml
new file mode 100644 (file)
index 0000000..bd2dc46
--- /dev/null
@@ -0,0 +1,17 @@
+<strofa>
+  A<tab/>B/
+  A<tab szer="1" />1/
+  A<tab szer="2" />2/
+  A<tab szer="3" />3/
+  A<tab szer="4" />4/
+  A<tab szer="5" />5/
+  A<tab szer="6" />6/
+  A<tab szer="1em" />1em/
+  A<tab szer="2em" />2em/
+  A<tab szer="3em" />3em/
+  A<tab szer="4em" />4em/
+  A<tab szer="5em" />5em/
+  A<tab szer="6em" />6em/
+  A<tab szer="*" />*/
+  Rozszerzony tabulator <wyroznienie>wewnątrz<tab szer="*" />wyróżnienia</wyroznienie>
+</strofa>
diff --git a/tests/files/tags/tabela/1.expected.html b/tests/files/tags/tabela/1.expected.html
new file mode 100644 (file)
index 0000000..fe9ef5f
--- /dev/null
@@ -0,0 +1,22 @@
+<div id="book-text">
+<table>
+  <tr>
+    <td>a</td>
+    <td>b</td>
+  </tr>
+  <tr>
+    <td>c</td>
+    <td>d</td>
+  </tr>
+</table>
+<table class="border">
+  <tr>
+    <td>a</td>
+    <td>b</td>
+  </tr>
+  <tr>
+    <td>c</td>
+    <td>d</td>
+  </tr>
+</table>
+</div>
diff --git a/tests/files/tags/tabela/1.xml b/tests/files/tags/tabela/1.xml
new file mode 100644 (file)
index 0000000..5e8f12b
--- /dev/null
@@ -0,0 +1,21 @@
+<tabela>
+  <wiersz>
+    <kol>a</kol>
+    <kol>b</kol>
+  </wiersz>
+  <wiersz>
+    <kol>c</kol>
+    <kol>d</kol>
+  </wiersz>
+</tabela>
+
+<tabela ramka="1">
+  <wiersz>
+    <kol>a</kol>
+    <kol>b</kol>
+  </wiersz>
+  <wiersz>
+    <kol>c</kol>
+    <kol>d</kol>
+  </wiersz>
+</tabela>
diff --git a/tests/files/tags/tytul_dziela/1.expected.html b/tests/files/tags/tytul_dziela/1.expected.html
new file mode 100644 (file)
index 0000000..364942d
--- /dev/null
@@ -0,0 +1,8 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Przeczytałem wczoraj
+  <em class="book-title">
+    Kilka uwag o <em class="book-title">„Hamlecie”</em>
+    Szekspira
+  </em>
+  pióra...</p>
+</div>
diff --git a/tests/files/tags/tytul_dziela/1.xml b/tests/files/tags/tytul_dziela/1.xml
new file mode 100644 (file)
index 0000000..3b79afd
--- /dev/null
@@ -0,0 +1,9 @@
+<akap>
+  Przeczytałem wczoraj
+  <tytul_dziela>
+    Kilka uwag o
+    <tytul_dziela typ="1">Hamlecie</tytul_dziela>
+    Szekspira
+  </tytul_dziela>
+  pióra...
+</akap>
diff --git a/tests/files/tags/tytul_dziela/2.expected.html b/tests/files/tags/tytul_dziela/2.expected.html
new file mode 100644 (file)
index 0000000..b744afd
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Belzebub (z hebr.) — w <em class="book-title">Nowym Testamencie</em> pan piekieł i przywódca złych duchów. W utworze Krasińskiego ma on być twórcą „spróchniałego obrazu” raju, który to obraz — niby dekorację teatralną — złe duchy przechowują w sklepach, czyli podziemiach (staropolskie: <em class="foreign-word">sklep</em> — piwnica, loch, podziemie). Wokół interpretacji obrazu Edenu rozwinęła się polemika między A. Łuckim a Z. Niemojewską–Gruszczyńską (A. Łucki, <em class="book-title">Obraz Edenu w <em class="book-title">„Nie–Boskiej komedii”</em></em>, „Ruch literacki”, nr 3, s.65–67; Z. Niemojewska–Gruszczyńska, <em class="book-title">W sprawie obrazu Edenu w <em class="book-title">„Nie–Boskiej komedii”</em></em>, tamże, nr 5, s. 133–135; A. Łucki, <em class="book-title">Jeszcze w sprawie obrazu Edenu w <em class="book-title">„Nie–Boskiej komedii”</em></em>, tamże, nr 6, s.191–192). Kleiner sądzi, że obraz Edenu to przyroda „zespolona z jakimiś utopijnymi marzeniami”, „że plan pierwotny był odmienny”, przyroda „miała być narzędziem szatana”, kuszącego wyobraźnię poety. Za tą interpretacją idzie też wyd. Libery i Sawrymowicza. Według M. Janion interpretacja Edenu jako jednej z trzech wizji–kuszeń może być dwojaka. Po pierwsze można uznać, że Eden stanowi tu synonim natury, tak jak rozumieli ją romantycy: to raj utracony, stan naturalnej szczęśliwości, przeciwieństwo życia w cywilizacji, prosty i harmonijny żywot. Ale można rozumieć ów symboliczny Eden jako oświeceniowy „stan naturalny” człowieka związany z filozoficzną utopią XVIII–wiecznych racjonalistów. Wtedy pokusę szatańską łączyć należy z obrazem przyszłego szczęścia ludzkości, jaką roztacza Pankracy w rozmowie z hrabią Henrykiem.</p>
+</div>
diff --git a/tests/files/tags/tytul_dziela/2.xml b/tests/files/tags/tytul_dziela/2.xml
new file mode 100644 (file)
index 0000000..ce17d5c
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  Belzebub (z hebr.) --- w <tytul_dziela>Nowym Testamencie</tytul_dziela> pan piekieł i przywódca złych duchów. W utworze Krasińskiego ma on być twórcą ,,spróchniałego obrazu" raju, który to obraz --- niby dekorację teatralną --- złe duchy przechowują w sklepach, czyli podziemiach (staropolskie: <slowo_obce>sklep</slowo_obce> --- piwnica, loch, podziemie). Wokół interpretacji obrazu Edenu rozwinęła się polemika między A. Łuckim a Z. Niemojewską--Gruszczyńską (A. Łucki, <tytul_dziela>Obraz Edenu w <tytul_dziela typ="1">Nie--Boskiej komedii</tytul_dziela></tytul_dziela>, ,,Ruch literacki", nr 3, s.65--67; Z. Niemojewska--Gruszczyńska, <tytul_dziela>W sprawie obrazu Edenu w <tytul_dziela typ="1">Nie--Boskiej komedii</tytul_dziela></tytul_dziela>, tamże, nr 5, s. 133--135; A. Łucki, <tytul_dziela>Jeszcze w sprawie obrazu Edenu w <tytul_dziela typ="1">Nie--Boskiej komedii</tytul_dziela></tytul_dziela>, tamże, nr 6, s.191--192). Kleiner sądzi, że obraz Edenu to przyroda ,,zespolona z jakimiś utopijnymi marzeniami", ,,że plan pierwotny był odmienny", przyroda ,,miała być narzędziem szatana", kuszącego wyobraźnię poety. Za tą interpretacją idzie też wyd. Libery i Sawrymowicza. Według M. Janion interpretacja Edenu jako jednej z trzech wizji--kuszeń może być dwojaka. Po pierwsze można uznać, że Eden stanowi tu synonim natury, tak jak rozumieli ją romantycy: to raj utracony, stan naturalnej szczęśliwości, przeciwieństwo życia w cywilizacji, prosty i harmonijny żywot. Ale można rozumieć ów symboliczny Eden jako oświeceniowy ,,stan naturalny" człowieka związany z filozoficzną utopią XVIII--wiecznych racjonalistów. Wtedy pokusę szatańską łączyć należy z obrazem przyszłego szczęścia ludzkości, jaką roztacza Pankracy w rozmowie z hrabią Henrykiem.
+</akap>
diff --git a/tests/files/tags/wers_cd/1.expected.html b/tests/files/tags/wers_cd/1.expected.html
new file mode 100644 (file)
index 0000000..c0aea62
--- /dev/null
@@ -0,0 +1,17 @@
+<div id="book-text">
+<h4 id="i1">MARYNA</h4>
+<div class="kwestia"><div class="stanza" id="i2">
+<a href="#f1" class="wl-num">1</a><div class="wl verse verse-cont" id="f1">Więc?</div>
+
+</div></div>
+<h4 id="i3">POETA</h4>
+<div class="kwestia"><div class="stanza" id="i4">
+<div class="wl verse verse-cont" id="f2">Sztuka dla sztuki.</div>
+</div></div>
+<h4 id="i5">MARYNA</h4>
+<div class="kwestia"><div class="stanza" id="i6">
+<div class="wl verse" id="f3">Zawrót głowy, wielka chwała;</div>
+<div class="wl verse" id="f4">niech pan sztuki płata różne,</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">bylebym ja spokój miała.</div>
+</div></div>
+</div>
diff --git a/tests/files/tags/wers_cd/1.xml b/tests/files/tags/wers_cd/1.xml
new file mode 100644 (file)
index 0000000..c64c14c
--- /dev/null
@@ -0,0 +1,23 @@
+<naglowek_osoba>MARYNA</naglowek_osoba>
+<kwestia>
+<strofa>
+
+    <wers_cd>Więc?</wers_cd>
+
+</strofa>
+</kwestia>
+
+<naglowek_osoba>POETA</naglowek_osoba>
+<kwestia>
+<strofa>
+           <wers_cd>Sztuka dla sztuki.</wers_cd>
+</strofa>
+</kwestia>
+
+<naglowek_osoba>MARYNA</naglowek_osoba>
+<kwestia>
+<strofa>Zawrót głowy, wielka chwała;/
+niech pan sztuki płata różne,/
+bylebym ja spokój miała.
+</strofa>
+</kwestia>
diff --git a/tests/files/tags/wers_do_prawej/1.expected.html b/tests/files/tags/wers_do_prawej/1.expected.html
new file mode 100644 (file)
index 0000000..922ce4a
--- /dev/null
@@ -0,0 +1,8 @@
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Anioł ognisty — mój anioł lewy</div>
+<div class="wl verse verse-right" id="f2">Poruszył dawną miłości strunę.</div>
+<div class="wl verse" id="f3">Z tobą! o! z tobą, gdzie białe mewy,</div>
+<div class="wl verse verse-right" id="f4">Z tobą w podśnieżną sybirską trunę,</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Gdzie wiatry wyją tak jak hyjeny,</div>
+<div class="wl verse" id="f6">Tam, gdzie ty pasasz na grobach reny.</div>
+</div></div>
diff --git a/tests/files/tags/wers_do_prawej/1.xml b/tests/files/tags/wers_do_prawej/1.xml
new file mode 100644 (file)
index 0000000..0a32e1e
--- /dev/null
@@ -0,0 +1,7 @@
+<strofa>Anioł ognisty --- mój anioł lewy/
+<wers_do_prawej>Poruszył dawną miłości strunę.</wers_do_prawej>/
+Z tobą! o! z tobą, gdzie białe mewy,/
+<wers_do_prawej>Z tobą w podśnieżną sybirską trunę,</wers_do_prawej>/
+Gdzie wiatry wyją tak jak hyjeny,/
+Tam, gdzie ty pasasz na grobach reny.
+</strofa>
diff --git a/tests/files/tags/wers_wciety/1.expected.html b/tests/files/tags/wers_wciety/1.expected.html
new file mode 100644 (file)
index 0000000..0ee7c74
--- /dev/null
@@ -0,0 +1,13 @@
+<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>
+</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>
+<div class="wl verse verse-indent verse-indent-2" id="f2">Poruszył dawną miłości strunę.</div>
+<div class="wl verse" id="f3">Z tobą! o! z tobą, gdzie białe mewy,</div>
+<div class="wl verse verse-indent verse-indent-2" id="f4">Z tobą w podśnieżną sybirską trunę,</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">Gdzie wiatry wyją tak jak hyjeny,</div>
+<div class="wl verse" id="f6">Tam, gdzie ty pasasz na grobach reny.</div>
+</div>
+</div>
diff --git a/tests/files/tags/wers_wciety/1.xml b/tests/files/tags/wers_wciety/1.xml
new file mode 100644 (file)
index 0000000..db6c80d
--- /dev/null
@@ -0,0 +1,13 @@
+<autor_utworu>Julisz Słowacki</autor_utworu>
+<nazwa_utworu>Anioł ognisty --- mój anioł lewy...</nazwa_utworu>
+<strofa>Anioł ognisty --- mój anioł lewy/
+
+<wers_wciety typ="2">Poruszył dawną miłości strunę.</wers_wciety>/
+
+Z tobą! o! z tobą, gdzie białe mewy,/
+
+<wers_wciety typ="2">Z tobą w podśnieżną sybirską trunę,</wers_wciety>/
+
+Gdzie wiatry wyją tak jak hyjeny,/
+Tam, gdzie ty pasasz na grobach reny.
+</strofa>
diff --git a/tests/files/tags/wers_wciety/2.expected.html b/tests/files/tags/wers_wciety/2.expected.html
new file mode 100644 (file)
index 0000000..85b8e22
--- /dev/null
@@ -0,0 +1,8 @@
+<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>
diff --git a/tests/files/tags/wers_wciety/2.xml b/tests/files/tags/wers_wciety/2.xml
new file mode 100644 (file)
index 0000000..c31d2cb
--- /dev/null
@@ -0,0 +1,10 @@
+<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_do_prawej>do prawej</wers_do_prawej>
+</strofa>
diff --git a/tests/files/tags/wieksze_odstepy/1.expected.html b/tests/files/tags/wieksze_odstepy/1.expected.html
new file mode 100644 (file)
index 0000000..0ad94e4
--- /dev/null
@@ -0,0 +1,3 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1"><em class="wieksze-odstepy">tekst tekst tekst</em></p>
+</div>
diff --git a/tests/files/tags/wieksze_odstepy/1.xml b/tests/files/tags/wieksze_odstepy/1.xml
new file mode 100644 (file)
index 0000000..c647957
--- /dev/null
@@ -0,0 +1,3 @@
+<akap>
+  <wieksze_odstepy>tekst tekst tekst</wieksze_odstepy>
+</akap>
diff --git a/tests/files/tags/www/1.expected.html b/tests/files/tags/www/1.expected.html
new file mode 100644 (file)
index 0000000..9b44ed6
--- /dev/null
@@ -0,0 +1,4 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">Adres:
+  <a target="_blank" href="https://wolnelektury.pl">https://wolnelektury.pl</a></p>
+</div>
diff --git a/tests/files/tags/www/1.xml b/tests/files/tags/www/1.xml
new file mode 100644 (file)
index 0000000..36c0360
--- /dev/null
@@ -0,0 +1,4 @@
+<akap>
+  Adres:
+  <www>https://wolnelektury.pl</www>
+</akap>
diff --git a/tests/files/tags/wyroznienie/1.expected.html b/tests/files/tags/wyroznienie/1.expected.html
new file mode 100644 (file)
index 0000000..65cffe3
--- /dev/null
@@ -0,0 +1,9 @@
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Byłem u Ciebie w te dni przedostatnie</div>
+<div class="wl verse" id="f2">Niedocieczonego wątku — —</div>
+<div class="wl verse" id="f3">— Pełne jak mit,</div>
+<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>
+</div></div>
diff --git a/tests/files/tags/wyroznienie/1.xml b/tests/files/tags/wyroznienie/1.xml
new file mode 100644 (file)
index 0000000..243ae6a
--- /dev/null
@@ -0,0 +1,9 @@
+<strofa>
+Byłem u Ciebie w te dni przedostatnie/
+Niedocieczonego wątku --- ---/
+--- Pełne jak mit,/
+Blade jak świt,/
+--- Gdy życia koniec szepce do początku:/
+
+<wyroznienie>,,Nie stargam cię ja --- nie! --- Ja, u-wydatnię</wyroznienie>!..." 
+</strofa>
diff --git a/tests/files/tags/wywiad_pyt/1.expected.html b/tests/files/tags/wywiad_pyt/1.expected.html
new file mode 100644 (file)
index 0000000..e8b700d
--- /dev/null
@@ -0,0 +1,4 @@
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">blok akapitów pytania</p>
+<a href="#f2" class="wl-num">2</a><p class="wl paragraph" id="f2">blok akapitów odpowiedzi</p>
+</div>
diff --git a/tests/files/tags/wywiad_pyt/1.xml b/tests/files/tags/wywiad_pyt/1.xml
new file mode 100644 (file)
index 0000000..aa74999
--- /dev/null
@@ -0,0 +1,3 @@
+<wywiad_pyt><akap>blok akapitów pytania</akap></wywiad_pyt>
+
+<wywiad_odp><akap>blok akapitów odpowiedzi</akap></wywiad_odp>
diff --git a/tests/files/tags/zastepnik_wersu/1.expected.html b/tests/files/tags/zastepnik_wersu/1.expected.html
new file mode 100644 (file)
index 0000000..cd767f2
--- /dev/null
@@ -0,0 +1,8 @@
+<div id="book-text"><div class="stanza" id="i1">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">I powleczem korowód, smęcąc ujęte snem grody,</div>
+<div class="wl verse" id="f2">W bramy bijąc urnami, gwizdając w szczerby toporów,</div>
+<div class="wl verse" id="f3">Aż się mury Jerycha porozwalają jak kłody,</div>
+<div class="wl verse" id="f4">Serca zmdlałe ocucą, pleśń z oczu zgarną narody.</div>
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">. . . . . . . . . . . . . . . .</div>
+<div class="wl verse" id="f6">Dalej — dalej — —</div>
+</div></div>
diff --git a/tests/files/tags/zastepnik_wersu/1.xml b/tests/files/tags/zastepnik_wersu/1.xml
new file mode 100644 (file)
index 0000000..716699a
--- /dev/null
@@ -0,0 +1,10 @@
+<strofa>
+I powleczem korowód, smęcąc ujęte snem grody,/
+W bramy bijąc urnami, gwizdając w szczerby toporów,/
+Aż się mury Jerycha porozwalają jak kłody,/
+Serca zmdlałe ocucą, pleśń z oczu zgarną narody./
+
+<zastepnik_wersu />. . . . . . . . . . . . . . . ./
+
+Dalej --- dalej --- ---
+</strofa>
diff --git a/tests/files/text/abstrakt.expected.html b/tests/files/text/abstrakt.expected.html
new file mode 100644 (file)
index 0000000..94c33b6
--- /dev/null
@@ -0,0 +1,3 @@
+<blockquote>
+      <p class="wl paragraph"><em class="book-title">Przygody Tomka Sawyera</em> to najsłynniejsza powieść dla młodzieży autorstwa amerykańskiego pisarza Marka Twaina.</p>
+    </blockquote>
index 7a468a1..27d3cd5 100644 (file)
@@ -1,6 +1,7 @@
 <utwor>
-       <opowiadanie>
-               <abstrakt>
-               </abstrakt>
-       </opowiadanie>
+  <opowiadanie>
+    <abstrakt>
+      <akap><tytul_dziela>Przygody Tomka Sawyera</tytul_dziela> to najsłynniejsza powieść dla młodzieży autorstwa amerykańskiego pisarza Marka Twaina.</akap>
+    </abstrakt>
+  </opowiadanie>
 </utwor>
index 34fccdd..2450c02 100644 (file)
@@ -1,47 +1,43 @@
 <div id="book-text">
-<div id="toc">
-<h2>Spis treści</h2>
-<ol></ol>
-</div>
 <div id="themes"><ol>
 <li>Miłość platoniczna: <a href="#m1189062500041">1</a> </li>
 <li>Natura: <a href="#m1189062528872">1</a> </li>
 <li>Nicość: <a href="#m1">1</a> </li>
 </ol></div>
 <h1>
-<span class="author" id="sec2">Adam Asnyk</span><span class="title" id="sec3"><a class="theme-begin" fid="1189062500041" name="m1189062500041">Miłość platoniczna</a>Między nami nic nie było</span>
+<span class="wl author" id="i1">Adam Asnyk</span><span class="wl title" id="i2"><a class="theme-begin" fid="1189062500041" name="m1189062500041">Miłość platoniczna</a>Między nami nic nie było</span>
 </h1>
-<div class="stanza" id="sec4">
-<a name="f1" class="target"> </a><a href="#f1" class="anchor">1</a><div class="verse">Między nami <a class="theme-begin" fid="1" name="m1">Nicość</a>nic nie było!<span class="theme-end" fid="1"></span>
+<div class="stanza" id="i3">
+<a href="#f1" class="wl-num">1</a><div class="wl verse" id="f1">Między nami <a class="theme-begin" fid="1" name="m1">Nicość</a>nic nie było!<span class="theme-end" fid="1"></span>
 </div>
-<div class="verse">Żadnych zwierzeń, wyznań żadnych!</div>
-<div class="verse">Nic nas z sobą nie łączyło —</div>
-<div class="verse">Prócz wiosennych marzeń zdradnych;</div>
+<div class="wl verse" id="f2">Żadnych zwierzeń, wyznań żadnych!</div>
+<div class="wl verse" id="f3">Nic nas z sobą nie łączyło —</div>
+<div class="wl verse" id="f4">Prócz wiosennych marzeń zdradnych;</div>
 </div>
-<div class="stanza" id="sec5">
-<a name="f5" class="target"> </a><a href="#f5" class="anchor">5</a><div class="verse">
+<div class="stanza" id="i4">
+<a href="#f5" class="wl-num">5</a><div class="wl verse" id="f5">
 <a class="theme-begin" fid="1189062528872" name="m1189062528872">Natura</a>Prócz tych woni, barw i blasków,</div>
-<div class="verse">Unoszących się w przestrzeni;</div>
-<div class="verse">Prócz szumiących śpiewem lasków</div>
-<div class="verse">I tej świeżej łąk zieleni;</div>
+<div class="wl verse" id="f6">Unoszących się w przestrzeni;</div>
+<div class="wl verse" id="f7">Prócz szumiących śpiewem lasków</div>
+<div class="wl verse" id="f8">I tej świeżej łąk zieleni;</div>
 </div>
-<div class="stanza" id="sec6">
-<div class="verse">Prócz tych kaskad i potoków,</div>
-<a name="f10" class="target"> </a><a href="#f10" class="anchor">10</a><div class="verse">Zraszających każdy parów,</div>
-<div class="verse">Prócz girlandy tęcz, obłoków,</div>
-<div class="verse">Prócz natury słodkich czarów;</div>
+<div class="stanza" id="i5">
+<div class="wl verse" id="f9">Prócz tych kaskad i potoków,</div>
+<a href="#f10" class="wl-num">10</a><div class="wl verse" id="f10">Zraszających każdy parów,</div>
+<div class="wl verse" id="f11">Prócz girlandy tęcz, obłoków,</div>
+<div class="wl verse" id="f12">Prócz natury słodkich czarów;</div>
 </div>
-<div class="stanza" id="sec7">
-<div class="verse">Prócz tych wspólnych, jasnych zdrojów,</div>
-<div class="verse">Z których serce zachwyt piło;</div>
-<a name="f15" class="target"> </a><a href="#f15" class="anchor">15</a><div class="verse">Prócz pierwiosnków<a href="#footnote-idm55" class="annotation-anchor" id="anchor-idm55">[1]</a><a class="reference" data-uri="https://www.wikidata.org/wiki/Q158974"></a> i powojów,—</div>
-<div class="verse">Między nami nic nie było!<span class="theme-end" fid="1189062528872"></span><span class="theme-end" fid="1189062500041"></span>
+<div class="stanza" id="i6">
+<div class="wl verse" id="f13">Prócz tych wspólnych, jasnych zdrojów,</div>
+<div class="wl verse" id="f14">Z których serce zachwyt piło;</div>
+<a href="#f15" class="wl-num">15</a><div class="wl verse" id="f15">Prócz pierwiosnków<a href="#footnote-id1" class="annotation-anchor" id="anchor-id1">[1]</a><a class="reference" data-uri="https://www.wikidata.org/wiki/Q158974"></a> i powojów,—</div>
+<div class="wl verse" id="f16">Między nami nic nie było!<span class="theme-end" fid="1189062528872"></span><span class="theme-end" fid="1189062500041"></span>
 </div>
 </div>
 <div id="footnotes">
 <h3>Przypisy</h3>
 <div class="fn-pe">
-<a name="footnote-idm55"></a><a href="#anchor-idm55" class="annotation">[1]</a><p><em class="foreign-word">pierwiosnek</em> — taki kwiatek [przypis edytorski]</p>
+<a name="footnote-id1"></a><a href="#anchor-id1" class="annotation">[1]</a><p><em class="foreign-word">pierwiosnek</em> — taki kwiatek [przypis edytorski]</p>
 </div>
 </div>
 </div>
diff --git a/tests/files/text/asnyk_miedzy_nami_expected.legacy.html b/tests/files/text/asnyk_miedzy_nami_expected.legacy.html
deleted file mode 100644 (file)
index 7004f5a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-<div xmlns:wl="http://wolnelektury.pl/functions" xmlns:dc="http://purl.org/dc/elements/1.1/" id="book-text">
-<div id="toc">
-<h2>Spis treści</h2>
-<ol></ol>
-</div>
-<div id="themes"><ol>
-<li>Miłość platoniczna: <a href="#m1189062500041">1</a> <a href="#m1189062500041">2</a> </li>
-<li>Natura: <a href="#m1189062528872">1</a> </li>
-<li>Nicość: <a href="#m1">1</a> </li>
-</ol></div>
-<h1>
-<span class="author">Adam Asnyk</span><span class="title"><a name="m1189062500041" class="theme-begin" fid="1189062500041">Miłość platoniczna</a>Między nami nic nie było</span>
-</h1>
-<a name="m1189062500041" class="theme-begin" fid="1189062500041">Miłość platoniczna</a><div class="stanza">
-<a name="sec4"></a><a name="f1" class="target"> </a><a href="#f1" class="anchor">1</a><div class="verse">Między nami <a name="m1" class="theme-begin" fid="1">Nicość</a>nic nie było!<span class="theme-end" fid="1"></span>
-</div>
-<div class="verse">Żadnych zwierzeń, wyznań żadnych!</div>
-<div class="verse">Nic nas z sobą nie łączyło —</div>
-<div class="verse">Prócz wiosennych marzeń zdradnych;</div>
-</div>
-<div class="stanza">
-<a name="sec5"></a><a name="f5" class="target"> </a><a href="#f5" class="anchor">5</a><div class="verse">
-<a name="m1189062528872" class="theme-begin" fid="1189062528872">Natura</a>Prócz tych woni, barw i blasków,</div>
-<div class="verse">Unoszących się w przestrzeni;</div>
-<div class="verse">Prócz szumiących śpiewem lasków</div>
-<div class="verse">I tej świeżej łąk zieleni;</div>
-</div>
-<div class="stanza">
-<a name="sec6"></a><div class="verse">Prócz tych kaskad i potoków,</div>
-<a name="f10" class="target"> </a><a href="#f10" class="anchor">10</a><div class="verse">Zraszających każdy parów,</div>
-<div class="verse">Prócz girlandy tęcz, obłoków,</div>
-<div class="verse">Prócz natury słodkich czarów;</div>
-</div>
-<div class="stanza">
-<a name="sec7"></a><div class="verse">Prócz tych wspólnych, jasnych zdrojów,</div>
-<div class="verse">Z których serce zachwyt piło;</div>
-<a name="f15" class="target"> </a><a href="#f15" class="anchor">15</a><div class="verse">Prócz pierwiosnków<a name="anchor-idmNNN"></a><a href="#footnote-idmNNN" class="annotation">[1]</a><a class="reference" data-uri="https://www.wikidata.org/wiki/Q158974"></a> i powojów,—</div>
-<div class="verse">Między nami nic nie było!<span class="theme-end" fid="1189062528872"></span><span class="theme-end" fid="1189062500041"></span>
-</div>
-</div>
-<div id="footnotes">
-<h3>Przypisy</h3>
-<div class="fn-pe">
-<a name="footnote-idmNNN"></a><a href="#anchor-idmNNN" class="annotation">[1]</a><p><em class="foreign-word">pierwiosnek</em> — taki kwiatek [przypis edytorski]</p>
-</div>
-</div>
-</div>
index eeeaee6..9fd6a25 100644 (file)
@@ -1,54 +1,54 @@
 1: Nicość
-<div class="stanza"><div class="verse">nic nie było!</div>
+<div class="stanza"><div class="wl verse">nic nie było!</div>
 </div>
 
 
 1189062500041: Miłość platoniczna
-<h1 ><span class="title">Między nami nic nie było</span>
+<h1 ><span class="wl title">Między nami nic nie było</span>
 </h1>
 <div class="stanza">
-<div class="verse">Między nami nic nie było!
+<div class="wl verse">Między nami nic nie było!
 </div>
-<div class="verse">Żadnych zwierzeń, wyznań żadnych!</div>
-<div class="verse">Nic nas z sobą nie łączyło —</div>
-<div class="verse">Prócz wiosennych marzeń zdradnych;</div>
+<div class="wl verse">Żadnych zwierzeń, wyznań żadnych!</div>
+<div class="wl verse">Nic nas z sobą nie łączyło —</div>
+<div class="wl verse">Prócz wiosennych marzeń zdradnych;</div>
 </div>
 <div class="stanza">
-<div class="verse">
-Prócz tych woni, barw i blasków,</div>
-<div class="verse">Unoszących się w przestrzeni;</div>
-<div class="verse">Prócz szumiących śpiewem lasków</div>
-<div class="verse">I tej świeżej łąk zieleni;</div>
+<div class="wl verse">
+Prócz tych woni, barw i blasków,</div>
+<div class="wl verse">Unoszących się w przestrzeni;</div>
+<div class="wl verse">Prócz szumiących śpiewem lasków</div>
+<div class="wl verse">I tej świeżej łąk zieleni;</div>
 </div>
 <div class="stanza">
-<div class="verse">Prócz tych kaskad i potoków,</div>
-<div class="verse">Zraszających każdy parów,</div>
-<div class="verse">Prócz girlandy tęcz, obłoków,</div>
-<div class="verse">Prócz natury słodkich czarów;</div>
+<div class="wl verse">Prócz tych kaskad i potoków,</div>
+<div class="wl verse">Zraszających każdy parów,</div>
+<div class="wl verse">Prócz girlandy tęcz, obłoków,</div>
+<div class="wl verse">Prócz natury słodkich czarów;</div>
 </div>
 <div class="stanza">
-<div class="verse">Prócz tych wspólnych, jasnych zdrojów,</div>
-<div class="verse">Z których serce zachwyt piło;</div>
-<div class="verse">Prócz pierwiosnków<a class="reference" data-uri="https://www.wikidata.org/wiki/Q158974"></a> i powojów,—</div>
-<div class="verse">Między nami nic nie było!</div>
+<div class="wl verse">Prócz tych wspólnych, jasnych zdrojów,</div>
+<div class="wl verse">Z których serce zachwyt piło;</div>
+<div class="wl verse">Prócz pierwiosnków i powojów,—</div>
+<div class="wl verse">Między nami nic nie było!</div>
 </div>
 
 
 1189062528872: Natura
-<div class="stanza"><div class="verse">Prócz tych woni, barw i blasków,</div>
-<div class="verse">Unoszących się w przestrzeni;</div>
-<div class="verse">Prócz szumiących śpiewem lasków</div>
-<div class="verse">I tej świeżej łąk zieleni;</div>
+<div class="stanza"><div class="wl verse">Prócz tych woni, barw i blasków,</div>
+<div class="wl verse">Unoszących się w przestrzeni;</div>
+<div class="wl verse">Prócz szumiących śpiewem lasków</div>
+<div class="wl verse">I tej świeżej łąk zieleni;</div>
 </div>
 <div class="stanza">
-<div class="verse">Prócz tych kaskad i potoków,</div>
-<div class="verse">Zraszających każdy parów,</div>
-<div class="verse">Prócz girlandy tęcz, obłoków,</div>
-<div class="verse">Prócz natury słodkich czarów;</div>
+<div class="wl verse">Prócz tych kaskad i potoków,</div>
+<div class="wl verse">Zraszających każdy parów,</div>
+<div class="wl verse">Prócz girlandy tęcz, obłoków,</div>
+<div class="wl verse">Prócz natury słodkich czarów;</div>
 </div>
 <div class="stanza">
-<div class="verse">Prócz tych wspólnych, jasnych zdrojów,</div>
-<div class="verse">Z których serce zachwyt piło;</div>
-<div class="verse">Prócz pierwiosnków<a class="reference" data-uri="https://www.wikidata.org/wiki/Q158974"></a> i powojów,—</div>
-<div class="verse">Między nami nic nie było!</div>
+<div class="wl verse">Prócz tych wspólnych, jasnych zdrojów,</div>
+<div class="wl verse">Z których serce zachwyt piło;</div>
+<div class="wl verse">Prócz pierwiosnków i powojów,—</div>
+<div class="wl verse">Między nami nic nie było!</div>
 </div>
index 703d79c..8bd2327 100644 (file)
@@ -1,6 +1,6 @@
-sec7
-<div id="book-text"><div class="stanza" id="sec7">
-<div class="verse">Prócz tych wspólnych, jasnych zdrojów,</div>
-<div class="verse">Z których serce zachwyt piło;</div>
-<div class="verse">Prócz pierwiosnków</div>
+f15
+<div id="book-text"><div class="stanza">
+<div class="wl verse">Prócz tych wspólnych, jasnych zdrojów,</div>
+<div class="wl verse">Z których serce zachwyt piło;</div>
+<div class="wl verse">Prócz pierwiosnków</div>
 </div></div>
index 1d698fd..5e5ee30 100644 (file)
@@ -1,29 +1,16 @@
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
-import re
+import io
 from unittest import TestCase
-from librarian import NoDublinCore
 from librarian.builders import builders
 from librarian.document import WLDocument
-from librarian.parser import WLDocument as LegacyWLDocument
 from .utils import get_fixture
 
 
 class TransformTest(TestCase):
     maxDiff = None
 
-    def test_transform_legacy(self):
-        expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected.legacy.html')
-
-        html = LegacyWLDocument.from_file(
-            get_fixture('text', 'miedzy-nami-nic-nie-bylo.xml')
-        ).as_html().get_bytes().decode('utf-8')
-
-        html = re.sub(r'idm\d+', 'idmNNN', html)
-        with open(expected_output_file_path) as f:
-            self.assertEqual(f.read(), html)
-
     def test_transform(self):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_expected.html')
         html = WLDocument(
@@ -33,23 +20,9 @@ class TransformTest(TestCase):
         with open(expected_output_file_path) as f:
             self.assertEqual(html, f.read())
 
-    def test_no_dublincore(self):
-        with self.assertRaises(NoDublinCore):
-            LegacyWLDocument.from_file(
-                get_fixture('text', 'asnyk_miedzy_nami_nodc.xml')
-            ).as_html()
-
-    def test_passing_parse_dublincore_to_transform(self):
-        """Passing parse_dublincore=False to transform omits DublinCore parsing."""
-        LegacyWLDocument.from_file(
-            get_fixture('text', 'asnyk_miedzy_nami_nodc.xml'),
-            parse_dublincore=False,
-        ).as_html()
-
     def test_empty(self):
         self.assertIsNone(
-            LegacyWLDocument.from_bytes(
-                b'<utwor />',
-                parse_dublincore=False,
-            ).as_html()
+            WLDocument(
+                filename=io.BytesIO(b'<utwor />'),
+            ).build(builders['html'], base_url='/')
         )
index bdbe4fb..ccf8030 100644 (file)
@@ -1,12 +1,16 @@
 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
+import io
 import unittest
-from librarian.parser import WLDocument
+from librarian.builders import HtmlBuilder
+from librarian.document import WLDocument
 from librarian.html import extract_annotations
 
 
 class AnnotationsTests(unittest.TestCase):
+    maxDiff = None
+
     def _test_annotation(self, expected, got, name):
         self.assertTrue(
             got[0].startswith('anchor-'),
@@ -108,19 +112,19 @@ class AnnotationsTests(unittest.TestCase):
          'częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
             'pe',
             ['daw.', 'niem.'],
-            'gemajna (daw., z niem. gemein: zwykły) \u2014 częściej: gemajn, '
-            'szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]',
-            '<p><em class="foreign-word">gemajna</em> (daw., z niem. <em class="foreign-word">gemein</em>: zwykły) '
-            '\u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]</p>'
+            'gemajna (daw., z\u00A0niem. gemein: zwykły) \u2014 częściej: gemajn, '
+            'szeregowiec w\u00A0wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]',
+            '<p><em class="foreign-word">gemajna</em> (daw., z\u00A0niem. <em class="foreign-word">gemein</em>: zwykły) '
+            '\u2014 częściej: gemajn, szeregowiec w\u00A0wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]</p>'
             ),
             'Footnote with multiple and qualifiers and emphasis.'),
         )
 
         xml_src = '''<utwor><akap> %s </akap></utwor>''' % "".join(
             t[0] for t in annotations)
-        html = WLDocument.from_bytes(
-            xml_src.encode('utf-8'),
-            parse_dublincore=False).as_html().get_file()
+        html = WLDocument(
+            filename=io.BytesIO(xml_src.encode('utf-8'))
+        ).build(HtmlBuilder, base_url='/').get_file()
         res_annotations = list(extract_annotations(html))
 
         for i, (src, expected, name) in enumerate(annotations):
diff --git a/tests/test_html_examples.py b/tests/test_html_examples.py
new file mode 100644 (file)
index 0000000..582123c
--- /dev/null
@@ -0,0 +1,49 @@
+import io
+import os
+from unittest import TestCase
+from librarian.builders import HtmlBuilder
+from librarian.document import WLDocument
+from librarian.elements import WL_ELEMENTS
+from .utils import get_fixture, get_all_fixtures
+
+
+class HtmlExamplesTests(TestCase):
+    maxDiff = None
+
+    @classmethod
+    def setUpClass(cls):
+        with open(get_fixture('tags', 'base.xml'), 'rb') as f:
+            cls.base_xml = f.read()
+    
+    def test_examples(self):
+        for tag in WL_ELEMENTS:
+            with self.subTest(tag):
+                self.tag_test(tag)
+        for path in get_all_fixtures('tags'):
+            if os.path.isdir(path):
+                name = path.rsplit('/', 1)[1]
+                self.assertIn(name, WL_ELEMENTS)
+
+    def tag_test(self, tag):
+        for fixture in get_all_fixtures(f'tags/{tag}', '*.xml'):
+            with self.subTest(tag=tag, n=fixture.rsplit('/', 1)[-1].rsplit('.', 1)[0]):
+                with open(fixture, 'rb') as f:
+                    xml_input = f.read()
+                xml_file = io.BytesIO(self.base_xml.replace(b'<!-- INPUT -->', xml_input))
+                doc = WLDocument(filename=xml_file)
+                html = HtmlBuilder(base_url='/').build(doc).get_bytes().decode('utf-8')
+
+                with open(fixture.rsplit('.', 1)[0] + '.expected.html', 'r') as f:
+                    expected_html = f.read()
+                try:
+                    with open(fixture.rsplit('.', 1)[0] + '.expected.toc.html', 'r') as f:
+                        expected_toc = f.read()
+                except:
+                    expected_toc = ''
+                try:
+                    with open(fixture.rsplit('.', 1)[0] + '.expected.themes.html', 'r') as f:
+                        expected_themes = f.read()
+                except:
+                    expected_themes = ''
+
+                self.assertEqual(html, expected_html)
index 2d55362..a89e94f 100644 (file)
@@ -13,7 +13,7 @@ class FragmentsTest(unittest.TestCase):
         expected_output_file_path = get_fixture('text', 'asnyk_miedzy_nami_fragments.html')
 
         closed_fragments, open_fragments = extract_fragments(
-            get_fixture('text', 'asnyk_miedzy_nami_expected.legacy.html'))
+            get_fixture('text', 'asnyk_miedzy_nami_expected.html'))
         assert not open_fragments
         fragments_text = "\n\n".join("%s: %s\n%s" % (f.id, f.themes, f) for f in sorted(closed_fragments.values(), key=lambda f: f.id))
         with open(expected_output_file_path, 'rb') as f:
index 4f36b80..ae7fbe5 100644 (file)
@@ -2,16 +2,19 @@
 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
 #
 import unittest
-from librarian.parser import WLDocument
-from librarian.html import transform_abstrakt
+from librarian.document import WLDocument
+from librarian.builders.html import AbstraktHtmlBuilder
 from .utils import get_fixture
 
 
 class AbstractTests(unittest.TestCase):
     def test_abstrakt(self):
-        transform_abstrakt(
-            WLDocument.from_file(
-                get_fixture('text', 'abstrakt.xml'),
-                parse_dublincore=False
-            ).edoc.getroot().find('.//abstrakt')
-        )
+        builder = AbstraktHtmlBuilder()
+        got = builder.build(
+            WLDocument(
+                filename=get_fixture('text', 'abstrakt.xml'),
+            )
+        ).get_bytes().decode('utf-8')
+        with open(get_fixture('text', 'abstrakt.expected.html')) as f:
+            expected = f.read()
+        self.assertEqual(expected, got)
diff --git a/tests/test_picture.py b/tests/test_picture.py
deleted file mode 100644 (file)
index afa4da8..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-# This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
-# Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
-#
-from os import path
-import unittest
-from librarian import picture, dcparser
-from tests.utils import get_all_fixtures, get_fixture
-
-
-class PictureTests(unittest.TestCase):
-    def test_wlpictureuri(self):
-        uri = picture.WLPictureURI('http://wolnelektury.pl/katalog/obraz/angelus-novus')
-
-    def check_load(self, xml_file):
-        pi = dcparser.parse(xml_file, picture.PictureInfo)
-        self.assertIsNotNone(pi)
-        self.assertIsInstance(pi, picture.PictureInfo)
-    
-    def test_load(self):
-        for fixture in get_all_fixtures('picture', '*.xml'):
-            with self.subTest(fixture=fixture):
-                self.check_load(fixture)
-
-    def test_wlpicture(self):
-        with open(get_fixture('picture', 'angelus-novus.xml')) as f:
-            wlp = picture.WLPicture.from_file(f)
-        pi = wlp.picture_info
-
-        self.assertEqual(pi.type[0], "Image")
-        self.assertEqual(pi.mime_type, 'image/jpeg')
-        self.assertEqual(wlp.mime_type, 'image/jpeg')
-        self.assertEqual(wlp.slug, 'angelus-novus')
-        self.assertTrue(path.exists(wlp.image_path))
-    
-        f = wlp.image_file()
-        f.close()
-
-
-    def test_picture_parts(self):
-        with open(get_fixture('picture', 'angelus-novus.xml')) as f:
-            wlp = picture.WLPicture.from_file(f)
-        parts = list(wlp.partiter())
-        expect_parts = 4
-        self.assertEqual(len(parts), expect_parts, "there should be %d parts of the picture" % expect_parts)
-        motifs = set()
-        names = set()
-
-        for p in parts:
-            for m in p['themes']:
-                motifs.add(m)
-        for p in parts:
-            if p['object']:
-                names.add(p['object'])
-
-        self.assertEqual(motifs, {'anioł historii', 'spojrzenie'}, "missing motifs, got: %s" % motifs)
-        self.assertEqual(names, {'obraz cały', 'skrzydło'}, 'missing objects, got: %s' % names)
index 2383866..d75228e 100644 (file)
@@ -11,12 +11,14 @@ from lxml import etree
 class RefTests(TestCase):
     def test_snippet(self):
         doc = WLDocument(filename=get_fixture('text', 'miedzy-nami-nic-nie-bylo.xml'))
-        doc._compat_assign_section_ids()
+
+        hb = builders['html']()
+        hb.assign_ids(doc.tree)
 
         refs = []
         for ref in doc.references():
             snippet = ref.get_snippet()
-            b = builders['html']()
+            b = builders['html-snippet']()
 
             for s in snippet:
                 s.html_build(b)
diff --git a/tox.ini b/tox.ini
index ecf3ecc..5797049 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -1,17 +1,17 @@
 [tox]
 envlist =
     clean,
-    py{37,38,39,310,311},
+    py{38,39,310,311},
     stats
 
 [testenv]
 deps =
     coverage
-passenv = HOME  ; Needed to find locally installed fonts when testing PDF production.
+passenv = HOME  # Needed to find locally installed fonts when testing PDF production.
 download = true
 commands =
     coverage run
-install_command = pip install numpy; pip install --extra-index-url https://py.mdrn.pl/simple {packages}
+install_command = pip install --extra-index-url https://py.mdrn.pl/simple {packages}
 
 [testenv:clean]
 basepython = python3