asciidoctor 1.5.5 → 1.5.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of asciidoctor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +216 -1
- data/CONTRIBUTING.adoc +2 -2
- data/Gemfile +20 -1
- data/LICENSE.adoc +1 -1
- data/README-fr.adoc +4 -3
- data/README-jp.adoc +11 -10
- data/README-zh_CN.adoc +4 -3
- data/README.adoc +17 -202
- data/Rakefile +41 -25
- data/asciidoctor.gemspec +9 -10
- data/data/locale/attributes.adoc +216 -34
- data/data/stylesheets/asciidoctor-default.css +23 -16
- data/features/step_definitions.rb +15 -19
- data/features/xref.feature +584 -20
- data/lib/asciidoctor.rb +292 -278
- data/lib/asciidoctor/abstract_block.rb +155 -94
- data/lib/asciidoctor/abstract_node.rb +108 -94
- data/lib/asciidoctor/attribute_list.rb +30 -22
- data/lib/asciidoctor/block.rb +7 -7
- data/lib/asciidoctor/cli/invoker.rb +47 -34
- data/lib/asciidoctor/cli/options.rb +22 -11
- data/lib/asciidoctor/converter.rb +3 -3
- data/lib/asciidoctor/converter/base.rb +2 -2
- data/lib/asciidoctor/converter/composite.rb +1 -1
- data/lib/asciidoctor/converter/docbook45.rb +2 -2
- data/lib/asciidoctor/converter/docbook5.rb +132 -87
- data/lib/asciidoctor/converter/factory.rb +0 -1
- data/lib/asciidoctor/converter/html5.rb +116 -98
- data/lib/asciidoctor/converter/manpage.rb +51 -52
- data/lib/asciidoctor/converter/template.rb +47 -36
- data/lib/asciidoctor/core_ext.rb +8 -2
- data/lib/asciidoctor/core_ext/1.8.7/hash/key.rb +4 -0
- data/lib/asciidoctor/core_ext/1.8.7/io/binread.rb +6 -0
- data/lib/asciidoctor/core_ext/1.8.7/io/write.rb +5 -0
- data/lib/asciidoctor/core_ext/1.8.7/string/chr.rb +1 -1
- data/lib/asciidoctor/core_ext/1.8.7/string/{limit.rb → limit_bytesize.rb} +7 -6
- data/lib/asciidoctor/core_ext/1.8.7/symbol/empty.rb +6 -0
- data/lib/asciidoctor/core_ext/1.8.7/symbol/length.rb +1 -1
- data/lib/asciidoctor/core_ext/nil_or_empty.rb +5 -5
- data/lib/asciidoctor/core_ext/regexp/is_match.rb +3 -0
- data/lib/asciidoctor/core_ext/string/{limit.rb → limit_bytesize.rb} +2 -2
- data/lib/asciidoctor/document.rb +216 -213
- data/lib/asciidoctor/extensions.rb +318 -185
- data/lib/asciidoctor/helpers.rb +35 -35
- data/lib/asciidoctor/inline.rb +32 -1
- data/lib/asciidoctor/list.rb +22 -6
- data/lib/asciidoctor/parser.rb +1008 -1038
- data/lib/asciidoctor/path_resolver.rb +46 -50
- data/lib/asciidoctor/reader.rb +275 -251
- data/lib/asciidoctor/section.rb +86 -58
- data/lib/asciidoctor/stylesheets.rb +6 -6
- data/lib/asciidoctor/substitutors.rb +567 -649
- data/lib/asciidoctor/table.rb +163 -108
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +18 -16
- data/man/asciidoctor.adoc +15 -13
- data/test/attributes_test.rb +138 -22
- data/test/blocks_test.rb +377 -97
- data/test/converter_test.rb +13 -0
- data/test/document_test.rb +244 -34
- data/test/extensions_test.rb +409 -42
- data/test/fixtures/asciidoc_index.txt +521 -0
- data/test/fixtures/basic-docinfo-footer.html +6 -0
- data/test/fixtures/basic-docinfo-footer.xml +8 -0
- data/test/fixtures/basic-docinfo.html +1 -0
- data/test/fixtures/basic-docinfo.xml +4 -0
- data/test/fixtures/basic.asciidoc +5 -0
- data/test/fixtures/chapter-a.adoc +3 -0
- data/test/fixtures/child-include.adoc +5 -0
- data/test/fixtures/circle.svg +9 -0
- data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +6 -0
- data/test/fixtures/custom-backends/haml/docbook45/block_paragraph.xml.haml +6 -0
- data/test/fixtures/custom-backends/haml/html5-tweaks/block_paragraph.html.haml +1 -0
- data/test/fixtures/custom-backends/haml/html5/block_paragraph.html.haml +3 -0
- data/test/fixtures/custom-backends/haml/html5/block_sidebar.html.haml +5 -0
- data/test/fixtures/custom-backends/slim/docbook45/block_paragraph.xml.slim +6 -0
- data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +3 -0
- data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +5 -0
- data/test/fixtures/custom-docinfodir/basic-docinfo.html +1 -0
- data/test/fixtures/custom-docinfodir/docinfo.html +1 -0
- data/test/fixtures/docinfo-footer.html +1 -0
- data/test/fixtures/docinfo-footer.xml +9 -0
- data/test/fixtures/docinfo.html +1 -0
- data/test/fixtures/docinfo.xml +3 -0
- data/test/fixtures/dot.gif +0 -0
- data/test/fixtures/encoding.asciidoc +13 -0
- data/test/fixtures/grandchild-include.adoc +3 -0
- data/test/fixtures/hello-asciidoctor.pdf +69 -0
- data/test/fixtures/include-file.asciidoc +24 -0
- data/test/fixtures/include-file.ml +3 -0
- data/test/fixtures/include-file.xml +5 -0
- data/test/fixtures/master.adoc +5 -0
- data/test/fixtures/mismatched-end-tag.adoc +7 -0
- data/test/fixtures/parent-include-restricted.adoc +5 -0
- data/test/fixtures/parent-include.adoc +5 -0
- data/test/fixtures/sample.asciidoc +26 -0
- data/test/fixtures/stylesheets/custom.css +3 -0
- data/test/fixtures/subs-docinfo.html +2 -0
- data/test/fixtures/subs.adoc +7 -0
- data/test/fixtures/tagged-class-enclosed.rb +26 -0
- data/test/fixtures/tagged-class.rb +23 -0
- data/test/fixtures/tip.gif +0 -0
- data/test/invoker_test.rb +82 -4
- data/test/links_test.rb +312 -37
- data/test/lists_test.rb +204 -25
- data/test/manpage_test.rb +191 -4
- data/test/options_test.rb +18 -1
- data/test/paragraphs_test.rb +32 -7
- data/test/parser_test.rb +150 -30
- data/test/paths_test.rb +47 -13
- data/test/preamble_test.rb +1 -1
- data/test/reader_test.rb +366 -126
- data/test/sections_test.rb +203 -56
- data/test/substitutions_test.rb +339 -131
- data/test/tables_test.rb +315 -15
- data/test/test_helper.rb +400 -0
- data/test/text_test.rb +5 -5
- metadata +110 -22
data/test/links_test.rb
CHANGED
@@ -10,6 +10,10 @@ context 'Links' do
|
|
10
10
|
assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'http://asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org.")
|
11
11
|
end
|
12
12
|
|
13
|
+
test 'qualified url with role inline with text' do
|
14
|
+
assert_xpath "//a[@href='http://asciidoc.org'][@class='bare project'][text() = 'http://asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org[,role=project].", :attributes => {'linkattrs' => ''})
|
15
|
+
end
|
16
|
+
|
13
17
|
test 'qualified http url inline with hide-uri-scheme set' do
|
14
18
|
assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org.", :attributes => {'hide-uri-scheme' => ''})
|
15
19
|
end
|
@@ -30,10 +34,18 @@ context 'Links' do
|
|
30
34
|
assert_xpath "//a[@href='http://asciidoc.org'][text() = '[Ascii]Doc']", render_string("We're parsing http://asciidoc.org[[Ascii\\]Doc] markup")
|
31
35
|
end
|
32
36
|
|
37
|
+
test 'qualified url with backslash label' do
|
38
|
+
assert_xpath "//a[@href='https://google.com'][text() = 'Google for \\']", render_string("I advise you to https://google.com[Google for +\\+]")
|
39
|
+
end
|
40
|
+
|
33
41
|
test 'qualified url with label using link macro' do
|
34
42
|
assert_xpath "//a[@href='http://asciidoc.org'][text() = 'AsciiDoc']", render_string("We're parsing link:http://asciidoc.org[AsciiDoc] markup")
|
35
43
|
end
|
36
44
|
|
45
|
+
test 'qualified url with role using link macro' do
|
46
|
+
assert_xpath "//a[@href='http://asciidoc.org'][@class='bare project'][text() = 'http://asciidoc.org']", render_string("We're parsing link:http://asciidoc.org[,role=project] markup", :attributes => {'linkattrs' => ''})
|
47
|
+
end
|
48
|
+
|
37
49
|
test 'qualified url using macro syntax with multi-line label inline with text' do
|
38
50
|
assert_xpath %{//a[@href='http://asciidoc.org'][text() = 'AsciiDoc\nmarkup']}, render_string("We're parsing link:http://asciidoc.org[AsciiDoc\nmarkup]")
|
39
51
|
end
|
@@ -48,6 +60,19 @@ context 'Links' do
|
|
48
60
|
assert_match '<ulink url="http://example.com">[bracket1]</ulink>', doc.convert, 1
|
49
61
|
end
|
50
62
|
|
63
|
+
test 'link macro with empty target' do
|
64
|
+
input = 'Link to link:[this page].'
|
65
|
+
output = render_embedded_string input
|
66
|
+
assert_xpath '//a', output, 1
|
67
|
+
assert_xpath '//a[@href=""]', output, 1
|
68
|
+
end
|
69
|
+
|
70
|
+
test 'should not recognize link macro with double colons' do
|
71
|
+
input = 'The link::http://example.org[example domain] is reserved for tests and documentation.'
|
72
|
+
output = render_embedded_string input
|
73
|
+
assert_includes output, 'link::http://example.org[example domain]'
|
74
|
+
end
|
75
|
+
|
51
76
|
test 'qualified url surrounded by angled brackets' do
|
52
77
|
assert_xpath '//a[@href="http://asciidoc.org"][text()="http://asciidoc.org"]', render_string('<http://asciidoc.org> is the project page for AsciiDoc.'), 1
|
53
78
|
end
|
@@ -72,6 +97,24 @@ context 'Links' do
|
|
72
97
|
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('(http://asciidoctor.org): where text gets parsed'), 1
|
73
98
|
end
|
74
99
|
|
100
|
+
test 'qualified url with trailing round bracket followed by colon' do
|
101
|
+
result = render_embedded_string '(from http://asciidoctor.org): where text gets parsed'
|
102
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', result, 1
|
103
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]/preceding-sibling::text()[.="(from "]', result, 1
|
104
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]/following-sibling::text()[.="): where text gets parsed"]', result, 1
|
105
|
+
end
|
106
|
+
|
107
|
+
test 'qualified url in round brackets with trailing semi-colon' do
|
108
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('(http://asciidoctor.org); where text gets parsed'), 1
|
109
|
+
end
|
110
|
+
|
111
|
+
test 'qualified url with trailing round bracket followed by semi-colon' do
|
112
|
+
result = render_embedded_string '(from http://asciidoctor.org); where text gets parsed'
|
113
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', result, 1
|
114
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]/preceding-sibling::text()[.="(from "]', result, 1
|
115
|
+
assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]/following-sibling::text()[.="); where text gets parsed"]', result, 1
|
116
|
+
end
|
117
|
+
|
75
118
|
test 'qualified url containing round brackets' do
|
76
119
|
assert_xpath '//a[@href="http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)"][text()="addModule() adds a Ruby module"]', render_string('http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)[addModule() adds a Ruby module]'), 1
|
77
120
|
end
|
@@ -84,6 +127,10 @@ context 'Links' do
|
|
84
127
|
assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', render_string(')http://asciidoc.org[AsciiDoc] project page.'), 1
|
85
128
|
end
|
86
129
|
|
130
|
+
test 'qualified url following no-break space' do
|
131
|
+
assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', render_string(%(#{[0xa0].pack 'U1'}http://asciidoc.org[AsciiDoc] project page.)), 1
|
132
|
+
end if ::RUBY_MIN_VERSION_1_9
|
133
|
+
|
87
134
|
test 'qualified url following smart apostrophe' do
|
88
135
|
output = render_embedded_string("l’http://www.irit.fr[IRIT]")
|
89
136
|
assert_match(/l’<a href=/, output)
|
@@ -110,11 +157,11 @@ context 'Links' do
|
|
110
157
|
end
|
111
158
|
|
112
159
|
test 'inline qualified url followed by an endline should not include endline in link' do
|
113
|
-
assert_xpath '//a[@href="
|
160
|
+
assert_xpath '//a[@href="https://github.com/asciidoctor"]', render_string("The source code for Asciidoctor can be found at https://github.com/asciidoctor\nwhich is a GitHub organization."), 1
|
114
161
|
end
|
115
162
|
|
116
163
|
test 'qualified url divided by endline using macro syntax should not create link' do
|
117
|
-
assert_xpath '//a', render_string("The source code for Asciidoctor can be found at link:
|
164
|
+
assert_xpath '//a', render_string("The source code for Asciidoctor can be found at link:https://github.com/asciidoctor\n[]which is a GitHub organization."), 0
|
118
165
|
end
|
119
166
|
|
120
167
|
test 'qualified url containing whitespace using macro syntax should not create link' do
|
@@ -126,7 +173,7 @@ context 'Links' do
|
|
126
173
|
end
|
127
174
|
|
128
175
|
test 'inline quoted qualified url should not consume surrounding angled brackets' do
|
129
|
-
assert_xpath '//a[@href="
|
176
|
+
assert_xpath '//a[@href="https://github.com/asciidoctor"]', render_string('Asciidoctor GitHub organization: <**https://github.com/asciidoctor**>'), 1
|
130
177
|
end
|
131
178
|
|
132
179
|
test 'link with quoted text should not be separated into attributes when linkattrs is set' do
|
@@ -141,10 +188,34 @@ context 'Links' do
|
|
141
188
|
assert_xpath '//a[@href="http://google.com"][@class="external"][@target="_blank"]', render_embedded_string('http://google.com[Google, role="external", window="_blank"]', :attributes => {'linkattrs' => ''}), 1
|
142
189
|
end
|
143
190
|
|
191
|
+
test 'link macro with attributes but no text should use URL as text when linkattrs is set' do
|
192
|
+
url = 'https://fonts.googleapis.com/css?family=Roboto:400,400italic,'
|
193
|
+
assert_xpath %(//a[@href="#{url}"][text()="#{url}"]), render_embedded_string(%(link:#{url}[family=Roboto,weight=400]), :attributes => {'linkattrs' => ''}), 1
|
194
|
+
end
|
195
|
+
|
196
|
+
test 'link macro with comma but no explicit attributes in text should not parse text when linkattrs is set' do
|
197
|
+
url = 'https://fonts.googleapis.com/css?family=Roboto:400,400italic,'
|
198
|
+
assert_xpath %(//a[@href="#{url}"][text()="Roboto,400"]), render_embedded_string(%(link:#{url}[Roboto,400]), :attributes => {'linkattrs' => ''}), 1
|
199
|
+
end
|
200
|
+
|
144
201
|
test 'link text that ends in ^ should set link window to _blank' do
|
145
202
|
assert_xpath '//a[@href="http://google.com"][@target="_blank"]', render_embedded_string('http://google.com[Google^]'), 1
|
146
203
|
end
|
147
204
|
|
205
|
+
test 'rel=noopener should be added to a link that targets the _blank window' do
|
206
|
+
assert_xpath '//a[@href="http://google.com"][@target="_blank"][@rel="noopener"]', render_embedded_string('http://google.com[Google^]'), 1
|
207
|
+
end
|
208
|
+
|
209
|
+
test 'rel=noopener should be added to a link that targets a named window when the noopener option is set' do
|
210
|
+
assert_xpath '//a[@href="http://google.com"][@target="name"][@rel="noopener"]', render_embedded_string('http://google.com[Google,window=name,opts=noopener]', :attributes => {'linkattrs' => ''}), 1
|
211
|
+
end
|
212
|
+
|
213
|
+
test 'rel=noopener should not be added to a link if it does not target a window' do
|
214
|
+
result = render_embedded_string 'http://google.com[Google,opts=noopener]', :attributes => {'linkattrs' => ''}
|
215
|
+
assert_xpath '//a[@href="http://google.com"]', result, 1
|
216
|
+
assert_xpath '//a[@href="http://google.com"][@rel="noopener"]', result, 0
|
217
|
+
end
|
218
|
+
|
148
219
|
test 'id attribute on link are processed when linkattrs is set' do
|
149
220
|
assert_xpath '//a[@href="http://google.com"][@id="link-1"]', render_embedded_string('http://google.com[Google, id="link-1"]', :attributes => {'linkattrs' => ''}), 1
|
150
221
|
end
|
@@ -166,45 +237,145 @@ context 'Links' do
|
|
166
237
|
variations.each do |anchor|
|
167
238
|
doc = document_from_string %(Here you can read about tigers.#{anchor})
|
168
239
|
output = doc.render
|
169
|
-
assert_equal '[tigers]', doc.
|
240
|
+
assert_equal '[tigers]', doc.catalog[:ids]['tigers']
|
241
|
+
assert doc.catalog[:refs]['tigers'].is_a? Asciidoctor::Inline
|
242
|
+
assert_nil doc.catalog[:refs]['tigers'].text
|
170
243
|
assert_xpath '//a[@id = "tigers"]', output, 1
|
171
244
|
assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
|
172
245
|
end
|
173
246
|
end
|
174
247
|
|
175
|
-
test 'inline ref
|
176
|
-
variations = %w([[tigers
|
248
|
+
test 'escaped inline ref' do
|
249
|
+
variations = %w([[tigers]] anchor:tigers[])
|
177
250
|
variations.each do |anchor|
|
251
|
+
doc = document_from_string %(Here you can read about tigers.\\#{anchor})
|
252
|
+
output = doc.render
|
253
|
+
refute doc.catalog[:ids].key?('tigers')
|
254
|
+
refute doc.catalog[:refs].key?('tigers')
|
255
|
+
assert_xpath '//a[@id = "tigers"]', output, 0
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
test 'inline ref can start with colon' do
|
260
|
+
input = '[[:idname]] text'
|
261
|
+
output = render_embedded_string input
|
262
|
+
assert_xpath '//a[@id = ":idname"]', output, 1
|
263
|
+
end
|
264
|
+
|
265
|
+
test 'inline ref cannot start with digit' do
|
266
|
+
input = '[[1-install]] text'
|
267
|
+
output = render_embedded_string input
|
268
|
+
assert_includes output, '[[1-install]]'
|
269
|
+
assert_xpath '//a[@id = "1-install"]', output, 0
|
270
|
+
end
|
271
|
+
|
272
|
+
test 'inline ref with reftext' do
|
273
|
+
%w([[tigers,Tigers]] anchor:tigers[Tigers]).each do |anchor|
|
178
274
|
doc = document_from_string %(Here you can read about tigers.#{anchor})
|
179
275
|
output = doc.render
|
180
|
-
assert_equal 'Tigers', doc.
|
276
|
+
assert_equal 'Tigers', doc.catalog[:ids]['tigers']
|
277
|
+
assert doc.catalog[:refs]['tigers'].is_a? Asciidoctor::Inline
|
278
|
+
assert_equal 'Tigers', doc.catalog[:refs]['tigers'].text
|
181
279
|
assert_xpath '//a[@id = "tigers"]', output, 1
|
182
280
|
assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
|
183
281
|
end
|
184
282
|
end
|
185
283
|
|
186
|
-
test '
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
284
|
+
test 'should encode double quotes in reftext of anchor macro in DocBook output' do
|
285
|
+
input = 'anchor:uncola[the "un"-cola]'
|
286
|
+
result = render_inline_string input, :backend => :docbook
|
287
|
+
assert_equal '<anchor xml:id="uncola" xreflabel="the "un"-cola"/>', result
|
288
|
+
end
|
289
|
+
|
290
|
+
test 'should substitute attribute references in reftext when registering inline ref' do
|
291
|
+
%w([[tigers,{label-tigers}]] anchor:tigers[{label-tigers}]).each do |anchor|
|
292
|
+
doc = document_from_string %(Here you can read about tigers.#{anchor}), :attributes => { 'label-tigers' => 'Tigers' }
|
293
|
+
doc.render
|
294
|
+
assert doc.catalog[:refs]['tigers'].is_a? Asciidoctor::Inline
|
295
|
+
assert_equal 'Tigers', doc.catalog[:refs]['tigers'].text
|
296
|
+
assert_equal 'Tigers', doc.catalog[:ids]['tigers']
|
193
297
|
end
|
194
298
|
end
|
195
299
|
|
300
|
+
test 'inline ref with reftext converted to DocBook' do
|
301
|
+
%w([[tigers,<Tigers>]] anchor:tigers[<Tigers>]).each do |anchor|
|
302
|
+
doc = document_from_string %(Here you can read about tigers.#{anchor}), :backend => :docbook45
|
303
|
+
output = doc.convert :header_footer => false
|
304
|
+
assert doc.catalog[:refs]['tigers'].is_a? Asciidoctor::Inline
|
305
|
+
assert_equal '<Tigers>', doc.catalog[:refs]['tigers'].text
|
306
|
+
assert_equal '<Tigers>', doc.references[:ids]['tigers']
|
307
|
+
assert_includes output, '<anchor id="tigers" xreflabel="<Tigers>"/>'
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
test 'does not match bibliography anchor in prose when scanning for inline anchor' do
|
312
|
+
doc = document_from_string 'Use [[[label]]] to assign a label to a bibliography entry.'
|
313
|
+
refute doc.catalog[:ids].key?('label')
|
314
|
+
refute doc.catalog[:refs].key?('label')
|
315
|
+
end
|
316
|
+
|
317
|
+
test 'repeating inline anchor macro with empty reftext' do
|
318
|
+
input = 'anchor:one[] anchor:two[] anchor:three[]'
|
319
|
+
result = render_inline_string input
|
320
|
+
assert_equal '<a id="one"></a> <a id="two"></a> <a id="three"></a>', result
|
321
|
+
end
|
322
|
+
|
323
|
+
test 'mixed inline anchor macro and anchor shorthand with empty reftext' do
|
324
|
+
input = 'anchor:one[][[two]]anchor:three[][[four]]anchor:five[]'
|
325
|
+
result = render_inline_string input
|
326
|
+
assert_equal '<a id="one"></a><a id="two"></a><a id="three"></a><a id="four"></a><a id="five"></a>', result
|
327
|
+
end
|
328
|
+
|
329
|
+
test 'assigns xreflabel value for anchor macro without reftext in DocBook output' do
|
330
|
+
input = 'anchor:foo[]'
|
331
|
+
result = render_inline_string input, :backend => :docbook
|
332
|
+
assert_equal '<anchor xml:id="foo" xreflabel="[foo]"/>', result
|
333
|
+
end
|
334
|
+
|
335
|
+
test 'unescapes square bracket in reftext of anchor macro' do
|
336
|
+
input = 'see <<foo>>
|
337
|
+
|
338
|
+
anchor:foo[b[a\]r]text'
|
339
|
+
result = render_embedded_string input
|
340
|
+
assert_includes result, 'see <a href="#foo">b[a]r</a>'
|
341
|
+
end
|
342
|
+
|
343
|
+
test 'unescapes square bracket in reftext of anchor macro in DocBook output' do
|
344
|
+
input = 'anchor:foo[b[a\]r]'
|
345
|
+
result = render_inline_string input, :backend => :docbook
|
346
|
+
assert_equal '<anchor xml:id="foo" xreflabel="b[a]r"/>', result
|
347
|
+
end
|
348
|
+
|
196
349
|
test 'xref using angled bracket syntax' do
|
197
350
|
doc = document_from_string '<<tigers>>'
|
198
|
-
doc.
|
351
|
+
doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, '[tigers]', :type => :ref, :target => 'tigers'), '[tigers]']
|
199
352
|
assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', doc.render, 1
|
200
353
|
end
|
201
354
|
|
355
|
+
test 'xref using angled bracket syntax with explicit hash' do
|
356
|
+
doc = document_from_string '<<#tigers>>'
|
357
|
+
doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
|
358
|
+
assert_xpath '//a[@href="#tigers"][text() = "Tigers"]', doc.render, 1
|
359
|
+
end
|
360
|
+
|
202
361
|
test 'xref using angled bracket syntax with label' do
|
203
|
-
|
362
|
+
input = <<-EOS
|
363
|
+
<<tigers,About Tigers>>
|
364
|
+
|
365
|
+
[#tigers]
|
366
|
+
== Tigers
|
367
|
+
EOS
|
368
|
+
assert_xpath '//a[@href="#tigers"][text() = "About Tigers"]', render_string(input), 1
|
204
369
|
end
|
205
370
|
|
206
371
|
test 'xref using angled bracket syntax with quoted label' do
|
207
|
-
|
372
|
+
input = <<-EOS
|
373
|
+
<<tigers,"About Tigers">>
|
374
|
+
|
375
|
+
[#tigers]
|
376
|
+
== Tigers
|
377
|
+
EOS
|
378
|
+
assert_xpath %q(//a[@href="#tigers"][text() = '"About Tigers"']), render_string(input), 1
|
208
379
|
end
|
209
380
|
|
210
381
|
test 'xref using angled bracket syntax with path sans extension' do
|
@@ -212,6 +383,16 @@ context 'Links' do
|
|
212
383
|
assert_xpath '//a[@href="tigers.html"][text() = "[tigers]"]', doc.render, 1
|
213
384
|
end
|
214
385
|
|
386
|
+
test 'inter-document xref should not truncate after period if path has no extension' do
|
387
|
+
result = render_embedded_string '<<using-.net-web-services#,Using .NET web services>>'
|
388
|
+
assert_xpath '//a[@href="using-.net-web-services.html"][text() = "Using .NET web services"]', result, 1
|
389
|
+
end
|
390
|
+
|
391
|
+
test 'inter-document xref should only remove the file extension part if the path contains a period elsewhere' do
|
392
|
+
result = render_embedded_string '<<using-.net-web-services.adoc#,Using .NET web services>>'
|
393
|
+
assert_xpath '//a[@href="using-.net-web-services.html"][text() = "Using .NET web services"]', result, 1
|
394
|
+
end
|
395
|
+
|
215
396
|
test 'xref using angled bracket syntax with path sans extension using docbook backend' do
|
216
397
|
doc = document_from_string '<<tigers#>>', :header_footer => false, :backend => 'docbook'
|
217
398
|
assert_match '<link xl:href="tigers.xml">tigers.xml</link>', doc.render, 1
|
@@ -252,70 +433,164 @@ context 'Links' do
|
|
252
433
|
|
253
434
|
test 'xref using angled bracket syntax with path which has been included in this document' do
|
254
435
|
doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false
|
255
|
-
doc.
|
436
|
+
doc.catalog[:includes] << 'tigers'
|
256
437
|
assert_xpath '//a[@href="#about"][text() = "About Tigers"]', doc.render, 1
|
257
438
|
end
|
258
439
|
|
259
440
|
test 'xref using angled bracket syntax with nested path which has been included in this document' do
|
260
441
|
doc = document_from_string '<<part1/tigers#about,About Tigers>>', :header_footer => false
|
261
|
-
doc.
|
442
|
+
doc.catalog[:includes] << 'part1/tigers'
|
262
443
|
assert_xpath '//a[@href="#about"][text() = "About Tigers"]', doc.render, 1
|
263
444
|
end
|
264
445
|
|
265
446
|
test 'xref using angled bracket syntax inline with text' do
|
266
|
-
|
447
|
+
input = <<-EOS
|
448
|
+
Want to learn <<tigers,about tigers>>?
|
449
|
+
|
450
|
+
[#tigers]
|
451
|
+
== Tigers
|
452
|
+
EOS
|
453
|
+
assert_xpath '//a[@href="#tigers"][text() = "about tigers"]', render_string(input), 1
|
267
454
|
end
|
268
455
|
|
269
456
|
test 'xref using angled bracket syntax with multi-line label inline with text' do
|
270
|
-
|
457
|
+
input = <<-EOS
|
458
|
+
Want to learn <<tigers,about
|
459
|
+
tigers>>?
|
460
|
+
|
461
|
+
[#tigers]
|
462
|
+
== Tigers
|
463
|
+
EOS
|
464
|
+
assert_xpath %{//a[@href="#tigers"][normalize-space(text()) = "about tigers"]}, render_string(input), 1
|
271
465
|
end
|
272
466
|
|
273
467
|
test 'xref with escaped text' do
|
274
468
|
# when \x0 was used as boundary character for passthrough, it was getting stripped
|
275
469
|
# now using unicode marks as boundary characters, which resolves issue
|
276
|
-
input =
|
470
|
+
input = <<-EOS
|
471
|
+
See the <<tigers, `+[tigers]+`>> section for details about tigers.
|
472
|
+
|
473
|
+
[#tigers]
|
474
|
+
== Tigers
|
475
|
+
EOS
|
277
476
|
output = render_embedded_string input
|
278
477
|
assert_xpath %(//a[@href="#tigers"]/code[text()="[tigers]"]), output, 1
|
279
478
|
end
|
280
479
|
|
480
|
+
test 'xref with target that begins with attribute reference in title' do
|
481
|
+
['<<{lessonsdir}/lesson-1#,Lesson 1>>', 'xref:{lessonsdir}/lesson-1#[Lesson 1]'].each do |xref|
|
482
|
+
input = <<-EOS
|
483
|
+
:lessonsdir: lessons
|
484
|
+
|
485
|
+
[#lesson-1-listing]
|
486
|
+
== #{xref}
|
487
|
+
|
488
|
+
A summary of the first lesson.
|
489
|
+
EOS
|
490
|
+
|
491
|
+
output = render_embedded_string input
|
492
|
+
assert_xpath '//h2/a[@href="lessons/lesson-1.html"]', output, 1
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
281
496
|
test 'xref using macro syntax' do
|
282
497
|
doc = document_from_string 'xref:tigers[]'
|
283
|
-
doc.
|
498
|
+
doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, '[tigers]', :type => :ref, :target => 'tigers'), '[tigers]']
|
284
499
|
assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', doc.render, 1
|
285
500
|
end
|
286
501
|
|
502
|
+
test 'xref using macro syntax with explicit hash' do
|
503
|
+
doc = document_from_string 'xref:#tigers[]'
|
504
|
+
doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
|
505
|
+
assert_xpath '//a[@href="#tigers"][text() = "Tigers"]', doc.render, 1
|
506
|
+
end
|
507
|
+
|
287
508
|
test 'xref using macro syntax with label' do
|
288
|
-
|
509
|
+
input = <<-EOS
|
510
|
+
xref:tigers[About Tigers]
|
511
|
+
|
512
|
+
[#tigers]
|
513
|
+
== Tigers
|
514
|
+
EOS
|
515
|
+
assert_xpath '//a[@href="#tigers"][text() = "About Tigers"]', render_string(input), 1
|
289
516
|
end
|
290
517
|
|
291
518
|
test 'xref using macro syntax inline with text' do
|
292
|
-
|
519
|
+
input = <<-EOS
|
520
|
+
Want to learn xref:tigers[about tigers]?
|
521
|
+
|
522
|
+
[#tigers]
|
523
|
+
== Tigers
|
524
|
+
EOS
|
525
|
+
|
526
|
+
assert_xpath '//a[@href="#tigers"][text() = "about tigers"]', render_string(input), 1
|
293
527
|
end
|
294
528
|
|
295
529
|
test 'xref using macro syntax with multi-line label inline with text' do
|
296
|
-
|
530
|
+
input = <<-EOS
|
531
|
+
Want to learn xref:tigers[about
|
532
|
+
tigers]?
|
533
|
+
|
534
|
+
[#tigers]
|
535
|
+
== Tigers
|
536
|
+
EOS
|
537
|
+
assert_xpath %{//a[@href="#tigers"][normalize-space(text()) = "about tigers"]}, render_string(input), 1
|
538
|
+
end
|
539
|
+
|
540
|
+
test 'xref using macro syntax with text that contains an escaped closing bracket' do
|
541
|
+
input = <<-EOS
|
542
|
+
xref:tigers[[tigers\\]]
|
543
|
+
|
544
|
+
[#tigers]
|
545
|
+
== Tigers
|
546
|
+
EOS
|
547
|
+
assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', render_string(input), 1
|
548
|
+
end
|
549
|
+
|
550
|
+
test 'unescapes square bracket in reftext used by xref' do
|
551
|
+
input = 'anchor:foo[b[a\]r]about
|
552
|
+
|
553
|
+
see <<foo>>'
|
554
|
+
result = render_embedded_string input
|
555
|
+
assert_xpath '//a[@href="#foo"]', result, 1
|
556
|
+
assert_xpath '//a[@href="#foo"][text()="b[a]r"]', result, 1
|
297
557
|
end
|
298
558
|
|
299
559
|
test 'xref using invalid macro syntax does not create link' do
|
300
560
|
doc = document_from_string 'xref:tigers'
|
301
|
-
doc.
|
561
|
+
doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
|
302
562
|
assert_xpath '//a', doc.render, 0
|
303
563
|
end
|
304
564
|
|
305
|
-
test '
|
306
|
-
|
307
|
-
|
565
|
+
test 'should warn and create link if verbose flag is set and reference is not found' do
|
566
|
+
input = <<-EOS
|
567
|
+
[#foobar]
|
568
|
+
== Foobar
|
569
|
+
|
570
|
+
== Section B
|
571
|
+
|
572
|
+
See <<foobaz>>.
|
573
|
+
EOS
|
574
|
+
begin
|
575
|
+
old_verbose, $VERBOSE = $VERBOSE, true
|
576
|
+
output, warnings = redirect_streams {|_, err| [(render_embedded_string input), err.string] }
|
577
|
+
assert_xpath '//a[@href="#foobaz"][text() = "[foobaz]"]', output, 1
|
578
|
+
refute warnings.empty?
|
579
|
+
assert_includes warnings, 'asciidoctor: WARNING: invalid reference: foobaz'
|
580
|
+
ensure
|
581
|
+
$VERBOSE = old_verbose
|
582
|
+
end
|
308
583
|
end
|
309
584
|
|
310
|
-
test 'xref
|
585
|
+
test 'xref uses title of target as label for forward and backward references in html output' do
|
311
586
|
input = <<-EOS
|
312
587
|
== Section A
|
313
588
|
|
314
|
-
|
589
|
+
<<_section_b>>
|
315
590
|
|
316
591
|
== Section B
|
317
592
|
|
318
|
-
|
593
|
+
<<_section_a>>
|
319
594
|
EOS
|
320
595
|
|
321
596
|
output = render_embedded_string input
|
@@ -327,21 +602,21 @@ context 'Links' do
|
|
327
602
|
|
328
603
|
test 'anchor creates reference' do
|
329
604
|
doc = document_from_string "[[tigers]]Tigers roam here."
|
330
|
-
assert_equal({'tigers' => '[tigers]'}, doc.
|
605
|
+
assert_equal({'tigers' => '[tigers]'}, doc.catalog[:ids])
|
331
606
|
end
|
332
607
|
|
333
608
|
test 'anchor with label creates reference' do
|
334
609
|
doc = document_from_string "[[tigers,Tigers]]Tigers roam here."
|
335
|
-
assert_equal({'tigers' => 'Tigers'}, doc.
|
610
|
+
assert_equal({'tigers' => 'Tigers'}, doc.catalog[:ids])
|
336
611
|
end
|
337
612
|
|
338
613
|
test 'anchor with quoted label creates reference with quoted label text' do
|
339
614
|
doc = document_from_string %([[tigers,"Tigers roam here"]]Tigers roam here.)
|
340
|
-
assert_equal({'tigers' => '"Tigers roam here"'}, doc.
|
615
|
+
assert_equal({'tigers' => '"Tigers roam here"'}, doc.catalog[:ids])
|
341
616
|
end
|
342
617
|
|
343
618
|
test 'anchor with label containing a comma creates reference' do
|
344
619
|
doc = document_from_string %([[tigers,Tigers, scary tigers, roam here]]Tigers roam here.)
|
345
|
-
assert_equal({'tigers' => 'Tigers, scary tigers, roam here'}, doc.
|
620
|
+
assert_equal({'tigers' => 'Tigers, scary tigers, roam here'}, doc.catalog[:ids])
|
346
621
|
end
|
347
622
|
end
|