lxml update
[librarian.git] / tests / test_html_annotations.py
1 # -*- coding: utf-8
2 from __future__ import unicode_literals
3
4 from librarian.parser import WLDocument
5 from librarian.html import extract_annotations
6 from nose.tools import eq_
7
8
9 def _test_annotation(expected, got, name):
10     assert got[0].startswith('anchor-'), "%s: Unexpected anchor: '%s', should begin with 'anchor-'" % (name, got[0])
11     eq_(expected[0], got[1], "%s: Unexpected type, expected '%s', got '%s'" % (name, expected[0], got[1]))
12     eq_(expected[1], got[2], "%s: Unexpected qualifier, expected '%s', got '%s'" % (name, expected[1], got[2]))
13     eq_(expected[2], got[3], "%s: Unexpected text representation, expected '%s', got '%s'" %
14         (name, expected[2], got[3]))
15     exp_html = '<div class="fn-%s">%s</div>' % (expected[0], expected[3])
16     eq_(exp_html, got[4], "%s: Unexpected html representation, expected '%s', got '%s'" % (name, exp_html, got[4]))
17
18
19 def test_annotations():
20     annotations = (
21
22         ('<pe/>', (
23             'pe',
24             [],
25             '[przypis edytorski]',
26             '<p> [przypis edytorski]</p>'
27             ),
28             'Empty footnote'),
29
30         ('<pr>Definiendum --- definiens.</pr>', (
31             'pr',
32             [],
33             'Definiendum \u2014 definiens. [przypis redakcyjny]',
34             '<p>Definiendum \u2014 definiens. [przypis redakcyjny]</p>'
35             ),
36             'Plain footnote.'),
37
38         ('<pt><slowo_obce>Definiendum</slowo_obce> --- definiens.</pt>', (
39             'pt',
40             [],
41             'Definiendum \u2014 definiens. [przypis tłumacza]',
42             '<p><em class="foreign-word">Definiendum</em> \u2014 definiens. [przypis tłumacza]</p>'
43             ),
44             'Standard footnote.'),
45
46         ('<pr>Definiendum (łac.) --- definiens.</pr>', (
47             'pr',
48             ['łac.'],
49             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
50             '<p>Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]</p>'
51             ),
52             'Plain footnote with qualifier'),
53
54         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- definiens.</pe>', (
55             'pe',
56             ['łac.'],
57             'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
58             '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 definiens. [przypis edytorski]</p>'
59             ),
60             'Standard footnote with qualifier.'),
61
62         ('<pt> <slowo_obce>Definiendum</slowo_obce> (daw.) --- definiens.</pt>', (
63             'pt',
64             ['daw.'],
65             'Definiendum (daw.) \u2014 definiens. [przypis tłumacza]',
66             '<p> <em class="foreign-word">Definiendum</em> (daw.) \u2014 definiens. [przypis tłumacza]</p>'
67             ),
68             'Standard footnote with leading whitespace and qualifier.'),
69
70         ('<pr>Definiendum (łac.) --- <slowo_obce>definiens</slowo_obce>.</pr>', (
71             'pr',
72             ['łac.'],
73             'Definiendum (łac.) \u2014 definiens. [przypis redakcyjny]',
74             '<p>Definiendum (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis redakcyjny]</p>'
75             ),
76             'Plain footnote with qualifier and some emphasis.'),
77
78         ('<pe><slowo_obce>Definiendum</slowo_obce> (łac.) --- <slowo_obce>definiens</slowo_obce>.</pe>', (
79             'pe',
80             ['łac.'],
81             'Definiendum (łac.) \u2014 definiens. [przypis edytorski]',
82             '<p><em class="foreign-word">Definiendum</em> (łac.) \u2014 <em class="foreign-word">definiens</em>. [przypis edytorski]</p>'
83             ),
84             'Standard footnote with qualifier and some emphasis.'),
85
86         ('<pe>Definiendum (łac.) --- definiens (some) --- more text.</pe>', (
87             'pe',
88             ['łac.'],
89             'Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]',
90             '<p>Definiendum (łac.) \u2014 definiens (some) \u2014 more text. [przypis edytorski]</p>',
91             ),
92             'Footnote with a second parentheses and mdash.'),
93
94         ('<pe><slowo_obce>gemajna</slowo_obce> (daw., z niem. <slowo_obce>gemein</slowo_obce>: zwykły) --- '
95          'częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu.</pe>', (
96             'pe',
97             ['daw.', 'niem.'],
98             'gemajna (daw., z niem. gemein: zwykły) \u2014 częściej: gemajn, '
99             'szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]',
100             '<p><em class="foreign-word">gemajna</em> (daw., z niem. <em class="foreign-word">gemein</em>: zwykły) '
101             '\u2014 częściej: gemajn, szeregowiec w wojsku polskim cudzoziemskiego autoramentu. [przypis edytorski]</p>'
102             ),
103             'Footnote with multiple and qualifiers and emphasis.'),
104
105     )
106
107     xml_src = '''<utwor><akap> %s </akap></utwor>''' % "".join(
108         t[0] for t in annotations)
109     html = WLDocument.from_bytes(
110         xml_src.encode('utf-8'),
111         parse_dublincore=False).as_html().get_file()
112     res_annotations = list(extract_annotations(html))
113
114     for i, (src, expected, name) in enumerate(annotations):
115         yield _test_annotation, expected, res_annotations[i], name