1 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
5 from librarian.parser import WLDocument
6 from librarian.html import extract_annotations
9 class AnnotationsTests(unittest.TestCase):
10 def _test_annotation(self, expected, got, name):
12 got[0].startswith('anchor-'),
13 "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
17 "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1])
21 "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2])
25 "%s: Unexpected text representation, expected '%s', got '%s'" % (name, expected[2], got[3])
27 exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
30 "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4])
33 def test_annotations(self):
38 '[przypis edytorski]',
39 '<p> [przypis edytorski]</p>'
43 ('<pr>Definiendum --- definiens.</pr>', (
46 'Definiendum \u2014 definiens. [przypis redakcyjny]',
47 '<p>Definiendum \u2014 definiens. [przypis redakcyjny]</p>'
51 ('<pt><slowo_obce>Definiendum</slowo_obce> --- definiens.</pt>', (
54 'Definiendum \u2014 definiens. [przypis tłumacza]',
55 '<p><em class="foreign-word">Definiendum</em> \u2014 definiens. [przypis tłumacza]</p>'
57 'Standard footnote.'),
59 ('<pr>Definiendum (łac.) --- definiens.</pr>', (
62 'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
63 '<p>Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]</p>'
65 'Plain footnote with qualifier'),
67 ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- definiens.</pe>', (
70 'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
71 '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 definiens. [przypis edytorski]</p>'
73 'Standard footnote with qualifier.'),
75 ('<pt> <slowo_obce>Definiendum</slowo_obce> (daw.) --- definiens.</pt>', (
78 'Definiendum (daw.) \u2014 definiens. [przypis tłumacza]',
79 '<p> <em class="foreign-word">Definiendum</em> (daw.) \u2014 definiens. [przypis tłumacza]</p>'
81 'Standard footnote with leading whitespace and qualifier.'),
83 ('<pr>Definiendum (łac.) --- <slowo_obce>definiens</slowo_obce>.</pr>', (
86 'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
87 '<p>Definiendum (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis redakcyjny]</p>'
89 'Plain footnote with qualifier and some emphasis.'),
91 ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- <slowo_obce>definiens</slowo_obce>.</pe>', (
94 'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
95 '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis edytorski]</p>'
97 'Standard footnote with qualifier and some emphasis.'),
99 ('<pe>Definiendum (łac.) --- definiens (some) --- more text.</pe>', (
102 'Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]',
103 '<p>Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]</p>',
105 'Footnote with a second parentheses and mdash.'),
107 ('<pe><slowo_obce>gemajna</slowo_obce> (daw., z niem. <slowo_obce>gemein</slowo_obce>: zwykły) --- '
108 'częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
111 'gemajna (daw., z niem. gemein: zwykły) \u2014 częściej: gemajn, '
112 'szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]',
113 '<p><em class="foreign-word">gemajna</em> (daw., z niem. <em class="foreign-word">gemein</em>: zwykły) '
114 '\u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]</p>'
116 'Footnote with multiple and qualifiers and emphasis.'),
119 xml_src = '''<utwor><akap> %s </akap></utwor>''' % "".join(
120 t[0] for t in annotations)
121 html = WLDocument.from_bytes(
122 xml_src.encode('utf-8'),
123 parse_dublincore=False).as_html().get_file()
124 res_annotations = list(extract_annotations(html))
126 for i, (src, expected, name) in enumerate(annotations):
127 with self.subTest(i=i):
128 self._test_annotation(expected, res_annotations[i], name)