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 unittest
5 from librarian.parser import WLDocument
6 from librarian.html import extract_annotations
7
8
9 class AnnotationsTests(unittest.TestCase):
10     def _test_annotation(self, expected, got, name):
11         self.assertTrue(
12             got[0].startswith('anchor-'),
13             "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
14         )
15         self.assertEqual(
16             expected[0], got[1],
17             "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1])
18         )
19         self.assertEqual(
20             expected[1], got[2],
21             "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2])
22         )
23         self.assertEqual(
24             expected[2], got[3],
25             "%s: Unexpected text representation, expected '%s', got '%s'" % (name, expected[2], got[3])
26         )
27         exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
28         self.assertEqual(
29             exp_html, got[4],
30             "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4])
31         )
32
33     def test_annotations(self):
34         annotations = (
35         ('<pe/>', (
36             'pe',
37             [],
38             '[przypis edytorski]',
39             '<p> [przypis edytorski]</p>'
40             ),
41             'Empty footnote'),
42
43         ('<pr>Definiendum --- definiens.</pr>', (
44             'pr',
45             [],
46             'Definiendum \u2014 definiens. [przypis redakcyjny]',
47             '<p>Definiendum \u2014 definiens. [przypis redakcyjny]</p>'
48             ),
49             'Plain footnote.'),
50
51         ('<pt><slowo_obce>Definiendum</slowo_obce> --- definiens.</pt>', (
52             'pt',
53             [],
54             'Definiendum \u2014 definiens. [przypis tłumacza]',
55             '<p><em class="foreign-word">Definiendum</em> \u2014 definiens. [przypis tłumacza]</p>'
56             ),
57             'Standard footnote.'),
58
59         ('<pr>Definiendum (łac.) --- definiens.</pr>', (
60             'pr',
61             ['łac.'],
62             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
63             '<p>Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]</p>'
64             ),
65             'Plain footnote with qualifier'),
66
67         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- definiens.</pe>', (
68             'pe',
69             ['łac.'],
70             'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
71             '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 definiens. [przypis edytorski]</p>'
72             ),
73             'Standard footnote with qualifier.'),
74
75         ('<pt> <slowo_obce>Definiendum</slowo_obce> (daw.) --- definiens.</pt>', (
76             'pt',
77             ['daw.'],
78             'Definiendum (daw.) \u2014 definiens. [przypis tłumacza]',
79             '<p> <em class="foreign-word">Definiendum</em> (daw.) \u2014 definiens. [przypis tłumacza]</p>'
80             ),
81             'Standard footnote with leading whitespace and qualifier.'),
82
83         ('<pr>Definiendum (łac.) --- <slowo_obce>definiens</slowo_obce>.</pr>', (
84             'pr',
85             ['łac.'],
86             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
87             '<p>Definiendum (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis redakcyjny]</p>'
88             ),
89             'Plain footnote with qualifier and some emphasis.'),
90
91         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- <slowo_obce>definiens</slowo_obce>.</pe>', (
92             'pe',
93             ['łac.'],
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>'
96             ),
97             'Standard footnote with qualifier and some emphasis.'),
98
99         ('<pe>Definiendum (łac.) --- definiens (some) --- more text.</pe>', (
100             'pe',
101             ['łac.'],
102             'Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]',
103             '<p>Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]</p>',
104             ),
105             'Footnote with a second parentheses and mdash.'),
106
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>', (
109             'pe',
110             ['daw.', 'niem.'],
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>'
115             ),
116             'Footnote with multiple and qualifiers and emphasis.'),
117         )
118
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))
125
126         for i, (src, expected, name) in enumerate(annotations):
127             with self.subTest(i=i):
128                 self._test_annotation(expected, res_annotations[i], name)