+++ /dev/null
-#!/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()
'Pillow>=9.1.0',
'texml',
'ebooklib',
- 'aeneas',
'mutagen',
'qrcode',
'requests',
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
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'):
# 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')
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,
)
def postprocess(self, document):
- _ = document.tree.getroot().master.gettext
+ _ = document.tree.getroot().gettext
if document.meta.translators:
self.enter_fragment('header')
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:
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)
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"
head = etree.Element('head')
tree.insert(0, head)
-
etree.SubElement(head, 'meta', charset='utf-8')
etree.SubElement(head, 'title').text = document.meta.title
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)
additional_logos = []
square_variant = False
+ background_color = '#000'
width = 2100
height = 2970
margin = 100
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),
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
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)
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)
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 []:
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)
CAN_HAVE_TEXT = True
STRIP = False
+ NUMBERING = None
text_substitutions = [
('---', '—'),
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:
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)
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,
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):
class Dedykacja(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_LEGACY_TOP_MARGIN = 2
EPUB_TAG = HTML_TAG = "div"
EPUB_CLASS = HTML_CLASS = "note"
+
+ SUPPRESS_NUMBERING = {'main': 'i'}
pass
def html_build(self, builder):
- pass
+ if not self.attrib['_force']:
+ return
+ return super().html_build(builder)
def epub_build(self, builder):
pass
class Didaskalia(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_PARGIN = 2
TXT_BOTTOM_MARGIN = 2
TXT_PREFIX = "/ "
TXT_SUFFIX = " /"
- EPUB_TAG =_HTML_TAG = "div"
+ EPUB_TAG = HTML_TAG = "div"
EPUB_CLASS = HTML_CLASS = "didaskalia"
class ListaOsob(WLElement):
+ NUMBERING = 'i'
CAN_HAVE_TEXT = False
- SHOULD_HAVE_ID = True
TXT_TOP_MARGIN = 3
TXT_BOTTOM_MARGIN = 3
class ListaOsoba(WLElement):
+ NUMBERING = "i"
+
TXT_TOP_MARGIN = 1
TXT_BOTTOM_MARGIN = 1
TXT_LEGACY_TOP_MARGIN = 1
TXT_PREFIX = " * "
EPUB_TAG = HTML_TAG = "li"
+ HTML_CLASS = "wl"
def html_build(self, builder):
builder.enter_fragment('list')
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'
class NaglowekListy(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
HTML_TAG = "h3"
+ HTML_CLASS = "wl"
EPUB_TAG = "div"
EPUB_CLASS = "h3"
class NaglowekOsoba(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_MARGIN = 3
TXT_BOTTOM_MARGIN = 2
class Animacja(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
HTML_TAG = 'div'
HTML_CLASS = "animacja cycle-slideshow"
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')
'alt': self.attrib.get('alt', ''),
'title': self.attrib.get('alt', ''),
}
-
- get_epub_attr = get_html_attr
class Tabela(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
EPUB_TAG = HTML_TAG = 'table'
class Footnote(WLElement):
NO_TOC = True
+ DISABLE_NUMBERING = True
START_INLINE = True
ASIDE = True
+ NUMBERING = 'fn'
def signal(self, signal):
if signal == 'INLINE':
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(
TXT_BOTTOM_MARGIN = 2
TXT_LEGACY_BOTTOM_MARGIN = 2
- HTML_CLASS = 'author'
+ HTML_CLASS = 'wl author'
def epub_build(self, builder):
return
class HeaderElement(WLElement):
+ NUMBERING = 'i'
HTML_TAG = 'span'
- SHOULD_HAVE_ID = True
def txt_build(self, builder):
builder.enter_fragment('header')
TXT_BOTTOM_MARGIN = 1
TXT_LEGACY_BOTTOM_MARGIN = 1
- HTML_CLASS = "collection"
+ HTML_CLASS = "wl collection"
def epub_build(self, builder):
return
class Motto(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_LEGACY_TOP_MARGIN = 4
TXT_LEGACY_BOTTOM_MARGIN = 2
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"
TXT_BOTTOM_MARGIN = 1
TXT_LEGACY_BOTTOM_MARGIN = 1
- HTML_CLASS = 'title'
+ HTML_CLASS = 'wl title'
EPUB_TAG = 'h2'
EPUB_CLASS = 'intitle'
TXT_BOTTOM_MARGIN = 1
TXT_LEGACY_BOTTOM_MARGIN = 1
- HTML_CLASS = 'subtitle'
+ HTML_CLASS = 'wl subtitle'
EPUB_TAG = 'h2'
EPUB_CLASS = 'insubtitle'
class NaglowekCzesc(WLElement):
+ NUMBERING = 's'
SECTION_PRECEDENCE = 1
- SHOULD_HAVE_ID = True
TXT_TOP_MARGIN = 5
TXT_BOTTOM_MARGIN = 2
TXT_LEGACY_BOTTOM_MARGIN = 0
EPUB_TAG = HTML_TAG = "h2"
+ HTML_CLASS = "wl"
EPUB_CLASS = "h2"
EPUB_START_CHUNK = True
class NaglowekPodrozdzial(WLElement):
+ NUMBERING = 's'
SECTION_PRECEDENCE = 3
- SHOULD_HAVE_ID = True
TXT_TOP_MARGIN = 3
TXT_BOTTOM_MARGIN = 2
class NaglowekRozdzial(WLElement):
+ NUMBERING = 's'
SECTION_PRECEDENCE = 2
- SHOULD_HAVE_ID = True
TXT_TOP_MARGIN = 4
TXT_BOTTOM_MARGIN = 2
TXT_LEGACY_BOTTOM_MARGIN = 0
HTML_TAG = 'h3'
+ HTML_CLASS = 'wl'
EPUB_TAG = 'h2'
EPUB_CLASS = 'h3'
class NaglowekScena(WLElement):
+ NUMBERING = 's'
SECTION_PRECEDENCE = 2
- SHOULD_HAVE_ID = True
TXT_TOP_MARGIN = 4
TXT_BOTTOM_MARGIN = 2
class PodtytulCzesc(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_MARGIN = 2
TXT_BOTTOM_MARGIN = 2
class PodtytulPodrozdzial(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_MARGIN = 2
TXT_BOTTOM_MARGIN = 2
class PodtytulRozdzial(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_MARGIN = 2
TXT_BOTTOM_MARGIN = 2
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):
class Strofa(WLElement):
- SHOULD_HAVE_ID = True
+ NUMBERING = 'i'
TXT_TOP_MARGIN = 2
TXT_BOTTOM_MARGIN = 2
)
builder.push_text('\u00a0');
builder.end_element()
-
- def get_verses(self):
+
+ def preprocess(self):
from librarian.parser import parser
verses = [
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)
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):
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()
class WersAkap(Wers):
TXT_PREFIX = ' '
- HTML_ATTR = {
- "style": "padding-left: 1em"
- }
+ HTML_CLASS = Wers.HTML_CLASS + ' verse-p'
EPUB_ATTR = {
"style": "margin-left: 1em"
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",
}
class WersDoPrawej(Wers):
TXT_PREFIX = ' '
- EPUB_ATTR = HTML_ATTR = {
+ HTML_CLASS = Wers.HTML_CLASS + ' verse-right'
+
+ EPUB_ATTR = {
"style": "text-align: right",
}
class WersSrodek(Wers):
TXT_PREFIX = ' '
- EPUB_ATTR = HTML_ATTR = {
+ HTML_CLASS = Wers.HTML_CLASS + ' verse-center'
+
+ EPUB_ATTR = {
"style": "text-align: center",
}
class WersWciety(Wers):
+ HTML_CLASS = Wers.HTML_CLASS + ' verse-indent'
+
@property
def typ(self):
v = self.attrib.get('typ')
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):
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
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:
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 {
}
get_epub_attr = get_html_attr
-
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]
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__()
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(
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):
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()
def add_table_of_contents(root):
sections = []
- counter = 1
for element in root.iterdescendants():
if element.tag in ('h2', 'h3'):
if any_ancestor(
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')
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)
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):
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:
"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"
+++ /dev/null
-# 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
+++ /dev/null
-<?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>
+++ /dev/null
-<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<div id="book-text">
+<a href="#f1" class="wl-num">1</a><p class="wl paragraph" id="f1">dalszy-ciąg-akapitu</p>
+</div>
--- /dev/null
+<akap_cd> dalszy-ciąg-akapitu </akap_cd>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<div id="book-text"><div data-cycle-pause-on-hover="true" data-cycle-next="> 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>
--- /dev/null
+<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>
--- /dev/null
+<div id="book-text"><h1><span class="wl author" id="i1">Hans Christian Andersen</span></h1></div>
--- /dev/null
+<autor_utworu>Hans Christian Andersen</autor_utworu>
--- /dev/null
+<utwor>
+ <opowiadanie>
+
+ <!-- INPUT -->
+
+ </opowiadanie>
+</utwor>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<dlugi_cytat><akap> blok-akapitow-cytatu</akap></dlugi_cytat>
--- /dev/null
+<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>
--- /dev/null
+<autor_utworu>Bruno Jasieński</autor_utworu>
+<dzielo_nadrzedne>But w butonierce</dzielo_nadrzedne>
+<nazwa_utworu>Deszcz</nazwa_utworu>
--- /dev/null
+<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>
--- /dev/null
+<ilustr src="https://redakcja.wolnelektury.pl/media/images/kipling-takie-sobie-bajeczki-calosc/kot.jpg" alt="Kot" />
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ H<indeks_dolny>2</indeks_dolny>O.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<div id="book-text"><h4 id="s1"> numer-i/lub-tytuł-podrozdziału </h4></div>
--- /dev/null
+<naglowek_podrozdzial> numer-i/lub-tytuł-podrozdziału </naglowek_podrozdzial>
--- /dev/null
+<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>
--- /dev/null
+<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>
+
--- /dev/null
+<div id="book-text"><h1><span class="wl title" id="i1">Anioł</span></h1></div>
--- /dev/null
+<nazwa_utworu>Anioł</nazwa_utworu>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<!-- 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>
--- /dev/null
+<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>
--- /dev/null
+<!-- 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>
--- /dev/null
+<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>
--- /dev/null
+<!-- 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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<!-- 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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Bieży<pa><slowo_obce>bieży</slowo_obce> --- biegnie.</pa>.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Bieży<pe><slowo_obce>bieży</slowo_obce> --- biegnie.</pe>.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Bieży<pe>
+ <akap><slowo_obce>bieży</slowo_obce> --- biegnie.</akap>
+ <akap>Drugi akapit przypisu.</akap>
+ </pe>.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<autor_utworu>Daniel Defoe</autor_utworu>
+<nazwa_utworu>Robinson Crusoe</nazwa_utworu>
+
+<podtytul>Jego życia losy, doświadczenia i przypadki</podtytul>
--- /dev/null
+<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>
--- /dev/null
+<poezja_cyt>
+<strofa>
+Tymczasem przenoś duszę moją utęsknioną/
+Do tych pagórków leśnych, do tych łąk zielonych...
+</strofa>
+</poezja_cyt>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Bieży<pr><slowo_obce>bieży</slowo_obce> --- biegnie.</pr>.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Bieży<pt><slowo_obce>bieży</slowo_obce> --- biegnie.</pt>.
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<rownolegle>
+
+ <kwestia>
+ <akap>Treść</akap>
+ </kwestia>
+
+ <blok>
+ <kwestia>
+ <akap>Treść</akap>
+ </kwestia>
+ <kwestia>
+ <akap>Treść</akap>
+ </kwestia>
+ </blok>
+
+</rownolegle>
--- /dev/null
+<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>
--- /dev/null
+<akap>Tekst</akap>
+
+<sekcja_asterysk />
+
+<akap>Tekst</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>Tekst</akap>
+
+<sekcja_swiatlo />
+
+<akap>Tekst</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>Tekst</akap>
+
+<separator_linia />
+
+<akap>Tekst</akap>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<srodtytul> śródtytuł </srodtytul>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Przeczytałem wczoraj
+ <tytul_dziela>
+ Kilka uwag o
+ <tytul_dziela typ="1">Hamlecie</tytul_dziela>
+ Szekspira
+ </tytul_dziela>
+ pióra...
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ <wieksze_odstepy>tekst tekst tekst</wieksze_odstepy>
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<akap>
+ Adres:
+ <www>https://wolnelektury.pl</www>
+</akap>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<wywiad_pyt><akap>blok akapitów pytania</akap></wywiad_pyt>
+
+<wywiad_odp><akap>blok akapitów odpowiedzi</akap></wywiad_odp>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+<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>
<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>
<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>
+++ /dev/null
-<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>
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>
-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>
# 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(
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='/')
)
# 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-'),
'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):
--- /dev/null
+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)
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:
# 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)
+++ /dev/null
-# 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)
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)
[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