fix
[librarian.git] / tests / test_html_annotations.py
1 # This file is part of Librarian, licensed under GNU Affero GPLv3 or later.
2 # Copyright © Fundacja Wolne Lektury. See NOTICE for more information.
3 #
4 import io
5 import unittest
6 from librarian.builders import HtmlBuilder
7 from librarian.document import WLDocument
8 from librarian.html import extract_annotations
9
10
11 class AnnotationsTests(unittest.TestCase):
12     maxDiff = None
13
14     def _test_annotation(self, expected, got, name):
15         self.assertTrue(
16             got[0].startswith('anchor-'),
17             "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
18         )
19         self.assertEqual(
20             expected[0], got[1],
21             "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1])
22         )
23         self.assertEqual(
24             expected[1], got[2],
25             "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2])
26         )
27         self.assertEqual(
28             expected[2], got[3],
29             "%s: Unexpected text representation, expected '%s', got '%s'" % (name, expected[2], got[3])
30         )
31         exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
32         self.assertEqual(
33             exp_html, got[4],
34             "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4])
35         )
36
37     def test_annotations(self):
38         annotations = (
39         ('<pe/>', (
40             'pe',
41             [],
42             '[przypis edytorski]',
43             '<p> [przypis edytorski]</p>'
44             ),
45             'Empty footnote'),
46
47         ('<pr>Definiendum --- definiens.</pr>', (
48             'pr',
49             [],
50             'Definiendum \u2014 definiens. [przypis redakcyjny]',
51             '<p>Definiendum \u2014 definiens. [przypis redakcyjny]</p>'
52             ),
53             'Plain footnote.'),
54
55         ('<pt><slowo_obce>Definiendum</slowo_obce> --- definiens.</pt>', (
56             'pt',
57             [],
58             'Definiendum \u2014 definiens. [przypis tłumacza]',
59             '<p><em class="foreign-word">Definiendum</em> \u2014 definiens. [przypis tłumacza]</p>'
60             ),
61             'Standard footnote.'),
62
63         ('<pr>Definiendum (łac.) --- definiens.</pr>', (
64             'pr',
65             ['łac.'],
66             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
67             '<p>Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]</p>'
68             ),
69             'Plain footnote with qualifier'),
70
71         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- definiens.</pe>', (
72             'pe',
73             ['łac.'],
74             'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
75             '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 definiens. [przypis edytorski]</p>'
76             ),
77             'Standard footnote with qualifier.'),
78
79         ('<pt> <slowo_obce>Definiendum</slowo_obce> (daw.) --- definiens.</pt>', (
80             'pt',
81             ['daw.'],
82             'Definiendum (daw.) \u2014 definiens. [przypis tłumacza]',
83             '<p> <em class="foreign-word">Definiendum</em> (daw.) \u2014 definiens. [przypis tłumacza]</p>'
84             ),
85             'Standard footnote with leading whitespace and qualifier.'),
86
87         ('<pr>Definiendum (łac.) --- <slowo_obce>definiens</slowo_obce>.</pr>', (
88             'pr',
89             ['łac.'],
90             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
91             '<p>Definiendum (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis redakcyjny]</p>'
92             ),
93             'Plain footnote with qualifier and some emphasis.'),
94
95         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- <slowo_obce>definiens</slowo_obce>.</pe>', (
96             'pe',
97             ['łac.'],
98             'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
99             '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis edytorski]</p>'
100             ),
101             'Standard footnote with qualifier and some emphasis.'),
102
103         ('<pe>Definiendum (łac.) --- definiens (some) --- more text.</pe>', (
104             'pe',
105             ['łac.'],
106             'Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]',
107             '<p>Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]</p>',
108             ),
109             'Footnote with a second parentheses and mdash.'),
110
111         ('<pe><slowo_obce>gemajna</slowo_obce> (daw., z niem. <slowo_obce>gemein</slowo_obce>: zwykły) --- '
112          'częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
113             'pe',
114             ['daw.', 'niem.'],
115             'gemajna (daw., z\u00A0niem. gemein: zwykły) \u2014 częściej: gemajn, '
116             'szeregowiec w\u00A0wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]',
117             '<p><em class="foreign-word">gemajna</em> (daw., z\u00A0niem. <em class="foreign-word">gemein</em>: zwykły) '
118             '\u2014 częściej: gemajn, szeregowiec w\u00A0wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]</p>'
119             ),
120             'Footnote with multiple and qualifiers and emphasis.'),
121         )
122
123         xml_src = '''<utwor><akap> %s </akap></utwor>''' % "".join(
124             t[0] for t in annotations)
125         html = WLDocument(
126             filename=io.BytesIO(xml_src.encode('utf-8'))
127         ).build(HtmlBuilder, base_url='/').get_file()
128         res_annotations = list(extract_annotations(html))
129
130         for i, (src, expected, name) in enumerate(annotations):
131             with self.subTest(i=i):
132                 self._test_annotation(expected, res_annotations[i], name)