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