1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# frozen_string_literal: true
require_relative 'spec_helper'
describe 'Asciidoctor::PDF::Converter - Footnote' do
it 'should place footnotes at the end of each chapter when doctype is book' do
pdf = to_pdf <<~'EOS', doctype: :book, attribute_overrides: { 'notitle' => '' }, analyze: true
== Chapter A
About this thing.footnote:[More about that thing.] And so on.
== Chapter B
Yada yada yada.
EOS
strings, text = pdf.strings, pdf.text
(expect (strings.slice 2, 3).join).to eql '[1]'
# superscript
(expect text[2][:y]).to be > text[1][:y]
(expect text[2][:font_size]).to be < text[1][:font_size]
(expect text[3][:font_color]).to eql '428BCA'
# superscript group
(expect (text.slice 2, 3).map {|it| [it[:y], it[:font_size]] }.uniq).to have_size 1
# footnote item
(expect (strings.slice 6, 3).join).to eql '[1] More about that thing.'
(expect text[6][:y]).to be < text[5][:y]
(expect text[6][:page_number]).to be 1
(expect text[6][:font_size]).to be 8
(expect (text.slice 6, 3).map {|it| [it[:y], it[:font_size]] }.uniq).to have_size 1
# next chapter
(expect text[9][:page_number]).to be 2
end
it 'should place footnotes at the end of document when doctype is not book' do
pdf = to_pdf <<~'EOS', attributes_overrides: { 'notitle' => '' }, analyze: true
== Section A
About this thing.footnote:[More about that thing.] And so on.
<<<
== Section B
Yada yada yada.
EOS
strings, text = pdf.strings, pdf.text
(expect (strings.slice 2, 3).join).to eql '[1]'
# superscript
(expect text[2][:y]).to be > text[1][:y]
(expect text[2][:font_size]).to be < text[1][:font_size]
(expect text[3][:font_color]).to eql '428BCA'
# superscript group
(expect (text.slice 2, 3).map {|it| [it[:y], it[:font_size]] }.uniq).to have_size 1
(expect text[2][:font_size]).to be < text[1][:font_size]
# footnote item
(expect (pdf.find_text 'Section B')[0][:order]).to be < (pdf.find_text '] More about that thing.')[0][:order]
(expect strings.slice(-3, 3).join).to eql '[1] More about that thing.'
(expect text[-1][:page_number]).to be 2
(expect text[-1][:font_size]).to be 8
end
it 'should add title to footnotes block if footnotes-title is set' do
pdf = to_pdf <<~'EOS', analyze: true
:footnotes-title: Footnotes
main content.footnote:[This is a footnote, just so you know.]
EOS
footnotes_title_text = (pdf.find_text 'Footnotes')[0]
(expect footnotes_title_text).not_to be_nil
(expect footnotes_title_text[:font_name]).to eql 'NotoSerif-Italic'
(expect footnotes_title_text[:y]).to be < (pdf.find_text 'main content.')[0][:y]
end
it 'should create bidirectional links between footnote ref and def' do
pdf = to_pdf <<~'EOS', doctype: :book, attribute_overrides: { 'notitle' => '' }
= Document Title
== Chapter A
About this thing.footnote:[More about that thing.] And so on.
EOS
annotations = (get_annotations pdf, 1).sort_by {|it| it[:Rect][1] }.reverse
(expect annotations).to have_size 2
footnote_label_y = annotations[0][:Rect][3]
footnote_item_y = annotations[1][:Rect][3]
names = get_names pdf
(expect footnote_label_y - pdf.objects[names['_footnoteref_1']][3]).to be < 1
(expect pdf.objects[names['_footnotedef_1']][3]).to eql footnote_item_y
end
it 'should render footnotes in table cell that are directly adjacent to text' do
pdf = to_pdf <<~'EOS', analyze: true
|===
|``German``footnote:[Other non-English languages may be supported in the future depending on demand.]
| 80footnote:[Width and Length is overridden by the actual terminal or window size, if available.]
|===
EOS
(expect pdf.lines.slice 0, 2).to eql ['German[1]', '80[2]']
end
it 'should use number of target footnote in footnote reference' do
if asciidoctor_1_5_7_or_better?
pdf = to_pdf <<~'EOS', analyze: true
You can download patches from the product page.footnote:sub[Only available if you have an active subscription.]
If you have problems running the software, you can submit a support request.footnote:sub[]
EOS
else
pdf = to_pdf <<~'EOS', analyze: true
You can download patches from the product page.footnoteref:[sub,Only available if you have an active subscription.]
If you have problems running the software, you can submit a support request.footnoteref:[sub]
EOS
end
text = pdf.text
p1 = (pdf.find_text %r/download/)[0]
fn1 = (text.slice p1[:order], 3).reduce('') {|accum, it| accum + it[:string] }
(expect fn1).to eql '[1]'
p2 = (pdf.find_text %r/support request/)[0]
fn2 = (text.slice p2[:order], 3).reduce('') {|accum, it| accum + it[:string] }
(expect fn2).to eql '[1]'
f1 = (pdf.find_text font_size: 8).reduce('') {|accum, it| accum + it[:string] }
(expect f1).to eql '[1] Only available if you have an active subscription.'
end
it 'should not duplicate footnotes that are included in keep together content' do
pdf = to_pdf <<~'EOS', analyze: true
****
____
Make it rain.footnote:[money]
____
****
Make it snow.footnote:[dollar bills]
EOS
combined_text = pdf.strings.join
(expect combined_text).to include 'Make it rain.[1]'
(expect combined_text).to include '[1] money'
(expect combined_text).to include 'Make it snow.[2]'
(expect combined_text).to include '[2] dollar bills'
(expect combined_text.scan '[1]').to have_size 2
(expect combined_text.scan '[2]').to have_size 2
(expect combined_text.scan '[3]').to be_empty
end
it 'should allow a bibliography ref to be used inside the text of a footnote' do
pdf = to_pdf <<~'EOS', analyze: true
There are lots of things to know.footnote:[Be sure to read <<wells>> to learn about it.]
[bibliography]
== Bibliography
* [[[wells]]] Ashley Wells. 'Stuff About Stuff'. Publishistas. 2010.
EOS
lines = pdf.lines
(expect lines[0]).to eql 'There are lots of things to know.[1]'
(expect lines[-1]).to eql '[1] Be sure to read [wells] to learn about it.'
end
it 'should allow a link to be used in footnote when media is print' do
pdf = to_pdf <<~'EOS', attribute_overrides: { 'media' => 'print' }, analyze: true
When in doubt, search.footnote:[Use a search engine like https://google.com[Google]]
EOS
lines = pdf.lines
(expect lines[0]).to eql 'When in doubt, search.[1]'
(expect lines[-1]).to eql '[1] Use a search engine like Google [https://google.com]'
end
end
|