asciidoctor 1.5.8 → 2.0.0.rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +162 -17
  3. data/LICENSE +1 -1
  4. data/README-de.adoc +12 -13
  5. data/README-fr.adoc +11 -12
  6. data/README-jp.adoc +11 -12
  7. data/README-zh_CN.adoc +12 -13
  8. data/README.adoc +6 -7
  9. data/asciidoctor.gemspec +19 -24
  10. data/bin/asciidoctor +5 -4
  11. data/data/reference/syntax.adoc +283 -0
  12. data/data/stylesheets/asciidoctor-default.css +56 -52
  13. data/data/stylesheets/coderay-asciidoctor.css +7 -9
  14. data/lib/asciidoctor.rb +171 -232
  15. data/lib/asciidoctor/abstract_block.rb +96 -105
  16. data/lib/asciidoctor/abstract_node.rb +118 -139
  17. data/lib/asciidoctor/attribute_list.rb +10 -14
  18. data/lib/asciidoctor/block.rb +20 -19
  19. data/lib/asciidoctor/callouts.rb +4 -2
  20. data/lib/asciidoctor/cli.rb +3 -2
  21. data/lib/asciidoctor/cli/invoker.rb +14 -21
  22. data/lib/asciidoctor/cli/options.rb +64 -54
  23. data/lib/asciidoctor/converter.rb +357 -185
  24. data/lib/asciidoctor/converter/composite.rb +40 -48
  25. data/lib/asciidoctor/converter/docbook5.rb +604 -640
  26. data/lib/asciidoctor/converter/html5.rb +949 -963
  27. data/lib/asciidoctor/converter/manpage.rb +569 -548
  28. data/lib/asciidoctor/converter/template.rb +231 -272
  29. data/lib/asciidoctor/core_ext.rb +5 -18
  30. data/lib/asciidoctor/core_ext/float/truncate.rb +19 -0
  31. data/lib/asciidoctor/core_ext/match_data/names.rb +7 -0
  32. data/lib/asciidoctor/core_ext/nil_or_empty.rb +1 -0
  33. data/lib/asciidoctor/core_ext/regexp/is_match.rb +4 -2
  34. data/lib/asciidoctor/document.rb +399 -377
  35. data/lib/asciidoctor/extensions.rb +72 -140
  36. data/lib/asciidoctor/helpers.rb +122 -83
  37. data/lib/asciidoctor/inline.rb +5 -1
  38. data/lib/asciidoctor/list.rb +13 -11
  39. data/lib/asciidoctor/logging.rb +17 -16
  40. data/lib/asciidoctor/parser.rb +390 -423
  41. data/lib/asciidoctor/path_resolver.rb +10 -5
  42. data/lib/asciidoctor/reader.rb +286 -263
  43. data/lib/asciidoctor/rouge_ext.rb +39 -0
  44. data/lib/asciidoctor/section.rb +9 -8
  45. data/lib/asciidoctor/stylesheets.rb +19 -37
  46. data/lib/asciidoctor/substitutors.rb +364 -509
  47. data/lib/asciidoctor/syntax_highlighter.rb +238 -0
  48. data/lib/asciidoctor/syntax_highlighter/coderay.rb +87 -0
  49. data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +26 -0
  50. data/lib/asciidoctor/syntax_highlighter/html_pipeline.rb +10 -0
  51. data/lib/asciidoctor/syntax_highlighter/prettify.rb +27 -0
  52. data/lib/asciidoctor/syntax_highlighter/pygments.rb +149 -0
  53. data/lib/asciidoctor/syntax_highlighter/rouge.rb +129 -0
  54. data/lib/asciidoctor/table.rb +73 -66
  55. data/lib/asciidoctor/timings.rb +4 -2
  56. data/lib/asciidoctor/version.rb +2 -1
  57. data/lib/asciidoctor/writer.rb +30 -0
  58. data/man/asciidoctor.1 +19 -15
  59. data/man/asciidoctor.adoc +14 -12
  60. metadata +69 -216
  61. data/CONTRIBUTING.adoc +0 -185
  62. data/Gemfile +0 -60
  63. data/Rakefile +0 -129
  64. data/bin/asciidoctor-safe +0 -15
  65. data/features/open_block.feature +0 -92
  66. data/features/pass_block.feature +0 -66
  67. data/features/step_definitions.rb +0 -49
  68. data/features/text_formatting.feature +0 -57
  69. data/features/xref.feature +0 -1039
  70. data/lib/asciidoctor/converter/base.rb +0 -59
  71. data/lib/asciidoctor/converter/docbook45.rb +0 -93
  72. data/lib/asciidoctor/converter/factory.rb +0 -226
  73. data/lib/asciidoctor/core_ext/1.8.7/base64/strict_encode64.rb +0 -6
  74. data/lib/asciidoctor/core_ext/1.8.7/concurrent/hash.rb +0 -5
  75. data/lib/asciidoctor/core_ext/1.8.7/hash/key.rb +0 -4
  76. data/lib/asciidoctor/core_ext/1.8.7/io/binread.rb +0 -6
  77. data/lib/asciidoctor/core_ext/1.8.7/io/write.rb +0 -5
  78. data/lib/asciidoctor/core_ext/1.8.7/string/chr.rb +0 -6
  79. data/lib/asciidoctor/core_ext/1.8.7/string/limit_bytesize.rb +0 -29
  80. data/lib/asciidoctor/core_ext/1.8.7/symbol/empty.rb +0 -6
  81. data/lib/asciidoctor/core_ext/1.8.7/symbol/length.rb +0 -6
  82. data/lib/asciidoctor/core_ext/string/limit_bytesize.rb +0 -10
  83. data/test/api_test.rb +0 -1240
  84. data/test/attribute_list_test.rb +0 -242
  85. data/test/attributes_test.rb +0 -1623
  86. data/test/blocks_test.rb +0 -3870
  87. data/test/converter_test.rb +0 -470
  88. data/test/document_test.rb +0 -1853
  89. data/test/extensions_test.rb +0 -1560
  90. data/test/fixtures/asciidoc_index.txt +0 -521
  91. data/test/fixtures/basic-docinfo-footer.html +0 -6
  92. data/test/fixtures/basic-docinfo-footer.xml +0 -8
  93. data/test/fixtures/basic-docinfo.html +0 -1
  94. data/test/fixtures/basic-docinfo.xml +0 -4
  95. data/test/fixtures/basic.asciidoc +0 -5
  96. data/test/fixtures/chapter-a.adoc +0 -3
  97. data/test/fixtures/child-include.adoc +0 -5
  98. data/test/fixtures/circle.svg +0 -9
  99. data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +0 -6
  100. data/test/fixtures/custom-backends/haml/docbook45/block_paragraph.xml.haml +0 -6
  101. data/test/fixtures/custom-backends/haml/html5-tweaks/block_paragraph.html.haml +0 -1
  102. data/test/fixtures/custom-backends/haml/html5/block_paragraph.html.haml +0 -3
  103. data/test/fixtures/custom-backends/haml/html5/block_sidebar.html.haml +0 -5
  104. data/test/fixtures/custom-backends/slim/docbook45/block_paragraph.xml.slim +0 -6
  105. data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +0 -3
  106. data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +0 -5
  107. data/test/fixtures/custom-docinfodir/basic-docinfo.html +0 -1
  108. data/test/fixtures/custom-docinfodir/docinfo.html +0 -1
  109. data/test/fixtures/docinfo-footer.html +0 -1
  110. data/test/fixtures/docinfo-footer.xml +0 -9
  111. data/test/fixtures/docinfo.html +0 -1
  112. data/test/fixtures/docinfo.xml +0 -3
  113. data/test/fixtures/doctime-localtime.adoc +0 -2
  114. data/test/fixtures/dot.gif +0 -0
  115. data/test/fixtures/encoding.asciidoc +0 -13
  116. data/test/fixtures/file-with-missing-include.adoc +0 -1
  117. data/test/fixtures/grandchild-include.adoc +0 -3
  118. data/test/fixtures/hello-asciidoctor.pdf +0 -69
  119. data/test/fixtures/include-file.asciidoc +0 -24
  120. data/test/fixtures/include-file.jsx +0 -8
  121. data/test/fixtures/include-file.ml +0 -3
  122. data/test/fixtures/include-file.xml +0 -5
  123. data/test/fixtures/lists.adoc +0 -96
  124. data/test/fixtures/master.adoc +0 -5
  125. data/test/fixtures/mismatched-end-tag.adoc +0 -7
  126. data/test/fixtures/other-chapters.adoc +0 -11
  127. data/test/fixtures/outer-include.adoc +0 -5
  128. data/test/fixtures/parent-include-restricted.adoc +0 -5
  129. data/test/fixtures/parent-include.adoc +0 -5
  130. data/test/fixtures/sample.asciidoc +0 -30
  131. data/test/fixtures/section-a.adoc +0 -4
  132. data/test/fixtures/stylesheets/custom.css +0 -3
  133. data/test/fixtures/subdir/index.adoc +0 -3
  134. data/test/fixtures/subdir/inner-include.adoc +0 -3
  135. data/test/fixtures/subdir/middle-include.adoc +0 -5
  136. data/test/fixtures/subs-docinfo.html +0 -2
  137. data/test/fixtures/subs.adoc +0 -6
  138. data/test/fixtures/tagged-class-enclosed.rb +0 -25
  139. data/test/fixtures/tagged-class.rb +0 -23
  140. data/test/fixtures/tip.gif +0 -0
  141. data/test/fixtures/unclosed-tag.adoc +0 -3
  142. data/test/fixtures/unexpected-end-tag.adoc +0 -4
  143. data/test/invoker_test.rb +0 -745
  144. data/test/links_test.rb +0 -855
  145. data/test/lists_test.rb +0 -5151
  146. data/test/logger_test.rb +0 -211
  147. data/test/manpage_test.rb +0 -660
  148. data/test/options_test.rb +0 -262
  149. data/test/paragraphs_test.rb +0 -562
  150. data/test/parser_test.rb +0 -742
  151. data/test/paths_test.rb +0 -395
  152. data/test/preamble_test.rb +0 -173
  153. data/test/reader_test.rb +0 -2161
  154. data/test/sections_test.rb +0 -3575
  155. data/test/substitutions_test.rb +0 -2066
  156. data/test/tables_test.rb +0 -2036
  157. data/test/test_helper.rb +0 -447
  158. data/test/text_test.rb +0 -309
@@ -1,855 +0,0 @@
1
- # encoding: UTF-8
2
- unless defined? ASCIIDOCTOR_PROJECT_DIR
3
- $: << File.dirname(__FILE__); $:.uniq!
4
- require 'test_helper'
5
- end
6
-
7
- context 'Links' do
8
-
9
- test 'qualified url inline with text' do
10
- assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'http://asciidoc.org']", convert_string("The AsciiDoc project is located at http://asciidoc.org.")
11
- end
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']", convert_string("The AsciiDoc project is located at http://asciidoc.org[role=project].")
15
- end
16
-
17
- test 'qualified http url inline with hide-uri-scheme set' do
18
- assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'asciidoc.org']", convert_string("The AsciiDoc project is located at http://asciidoc.org.", :attributes => {'hide-uri-scheme' => ''})
19
- end
20
-
21
- test 'qualified file url inline with label' do
22
- assert_xpath "//a[@href='file:///home/user/bookmarks.html'][text() = 'My Bookmarks']", convert_string_to_embedded('file:///home/user/bookmarks.html[My Bookmarks]')
23
- end
24
-
25
- test 'qualified file url inline with hide-uri-scheme set' do
26
- assert_xpath "//a[@href='file:///etc/app.conf'][text() = '/etc/app.conf']", convert_string('Edit the configuration file link:file:///etc/app.conf[]', :attributes => {'hide-uri-scheme' => ''})
27
- end
28
-
29
- test 'should not hide bare URI scheme in implicit text of link macro when hide-uri-scheme is set' do
30
- {
31
- 'link:https://[]' => 'https://',
32
- 'link:ssh://[]' => 'ssh://'
33
- }.each do |input, expected|
34
- assert_xpath %(/a[text() = "#{expected}"]), (convert_inline_string input, :attributes => { 'hide-uri-scheme' => '' })
35
- end
36
- end
37
-
38
- test 'qualified url with label' do
39
- assert_xpath "//a[@href='http://asciidoc.org'][text() = 'AsciiDoc']", convert_string("We're parsing http://asciidoc.org[AsciiDoc] markup")
40
- end
41
-
42
- test 'qualified url with label containing escaped right square bracket' do
43
- assert_xpath "//a[@href='http://asciidoc.org'][text() = '[Ascii]Doc']", convert_string("We're parsing http://asciidoc.org[[Ascii\\]Doc] markup")
44
- end
45
-
46
- test 'qualified url with backslash label' do
47
- assert_xpath "//a[@href='https://google.com'][text() = 'Google for \\']", convert_string("I advise you to https://google.com[Google for +\\+]")
48
- end
49
-
50
- test 'qualified url with label using link macro' do
51
- assert_xpath "//a[@href='http://asciidoc.org'][text() = 'AsciiDoc']", convert_string("We're parsing link:http://asciidoc.org[AsciiDoc] markup")
52
- end
53
-
54
- test 'qualified url with role using link macro' do
55
- assert_xpath "//a[@href='http://asciidoc.org'][@class='bare project'][text() = 'http://asciidoc.org']", convert_string("We're parsing link:http://asciidoc.org[role=project] markup")
56
- end
57
-
58
- test 'qualified url using macro syntax with multi-line label inline with text' do
59
- assert_xpath %{//a[@href='http://asciidoc.org'][text() = 'AsciiDoc\nmarkup']}, convert_string("We're parsing link:http://asciidoc.org[AsciiDoc\nmarkup]")
60
- end
61
-
62
- test 'qualified url with label containing square brackets using link macro' do
63
- str = 'http://example.com[[bracket1\]]'
64
- doc = document_from_string str, :header_footer => false, :doctype => 'inline'
65
- assert_match '<a href="http://example.com">[bracket1]</a>', doc.convert, 1
66
- doc = document_from_string str, :header_footer => false, :backend => 'docbook', :doctype => 'inline'
67
- assert_match '<link xl:href="http://example.com">[bracket1]</link>', doc.convert, 1
68
- doc = document_from_string str, :header_footer => false, :backend => 'docbook45', :doctype => 'inline'
69
- assert_match '<ulink url="http://example.com">[bracket1]</ulink>', doc.convert, 1
70
- end
71
-
72
- test 'link macro with empty target' do
73
- input = 'Link to link:[this page].'
74
- output = convert_string_to_embedded input
75
- assert_xpath '//a', output, 1
76
- assert_xpath '//a[@href=""]', output, 1
77
- end
78
-
79
- test 'should not recognize link macro with double colons' do
80
- input = 'The link::http://example.org[example domain] is reserved for tests and documentation.'
81
- output = convert_string_to_embedded input
82
- assert_includes output, 'link::http://example.org[example domain]'
83
- end
84
-
85
- test 'qualified url surrounded by angled brackets' do
86
- assert_xpath '//a[@href="http://asciidoc.org"][text()="http://asciidoc.org"]', convert_string('<http://asciidoc.org> is the project page for AsciiDoc.'), 1
87
- end
88
-
89
- test 'qualified url surrounded by round brackets' do
90
- assert_xpath '//a[@href="http://asciidoc.org"][text()="http://asciidoc.org"]', convert_string('(http://asciidoc.org) is the project page for AsciiDoc.'), 1
91
- end
92
-
93
- test 'qualified url with trailing round bracket' do
94
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', convert_string('Asciidoctor is a Ruby-based AsciiDoc processor (see https://asciidoctor.org)'), 1
95
- end
96
-
97
- test 'qualified url with trailing semi-colon' do
98
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', convert_string('https://asciidoctor.org; where text gets parsed'), 1
99
- end
100
-
101
- test 'qualified url with trailing colon' do
102
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', convert_string('https://asciidoctor.org: where text gets parsed'), 1
103
- end
104
-
105
- test 'qualified url in round brackets with trailing colon' do
106
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', convert_string('(https://asciidoctor.org): where text gets parsed'), 1
107
- end
108
-
109
- test 'qualified url with trailing round bracket followed by colon' do
110
- result = convert_string_to_embedded '(from https://asciidoctor.org): where text gets parsed'
111
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', result, 1
112
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]/preceding-sibling::text()[.="(from "]', result, 1
113
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]/following-sibling::text()[.="): where text gets parsed"]', result, 1
114
- end
115
-
116
- test 'qualified url in round brackets with trailing semi-colon' do
117
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', convert_string('(https://asciidoctor.org); where text gets parsed'), 1
118
- end
119
-
120
- test 'qualified url with trailing round bracket followed by semi-colon' do
121
- result = convert_string_to_embedded '(from https://asciidoctor.org); where text gets parsed'
122
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]', result, 1
123
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]/preceding-sibling::text()[.="(from "]', result, 1
124
- assert_xpath '//a[@href="https://asciidoctor.org"][text()="https://asciidoctor.org"]/following-sibling::text()[.="); where text gets parsed"]', result, 1
125
- end
126
-
127
- test 'URI scheme with trailing characters should not be converted to a link' do
128
- input_sources = %w(
129
- (https://)
130
- http://;
131
- file://:
132
- <ftp://>
133
- )
134
- expected_outputs = %w(
135
- (https://)
136
- http://;
137
- file://:
138
- &lt;ftp://&gt;
139
- )
140
- input_sources.each_with_index do |input_source, i|
141
- expected_output = expected_outputs[i]
142
- actual = block_from_string input_source
143
- assert_equal expected_output, actual.content
144
- end
145
- end
146
-
147
- test 'qualified url containing round brackets' do
148
- assert_xpath '//a[@href="http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)"][text()="addModule() adds a Ruby module"]', convert_string('http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)[addModule() adds a Ruby module]'), 1
149
- end
150
-
151
- test 'qualified url adjacent to text in square brackets' do
152
- assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', convert_string(']http://asciidoc.org[AsciiDoc] project page.'), 1
153
- end
154
-
155
- test 'qualified url adjacent to text in round brackets' do
156
- assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', convert_string(')http://asciidoc.org[AsciiDoc] project page.'), 1
157
- end
158
-
159
- test 'qualified url following no-break space' do
160
- assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', convert_string(%(#{[0xa0].pack 'U1'}http://asciidoc.org[AsciiDoc] project page.)), 1
161
- end if ::RUBY_MIN_VERSION_1_9
162
-
163
- test 'qualified url following smart apostrophe' do
164
- output = convert_string_to_embedded("l&#8217;http://www.irit.fr[IRIT]")
165
- assert_match(/l&#8217;<a href=/, output)
166
- end
167
-
168
- test 'qualified url using invalid link macro should not create link' do
169
- assert_xpath '//a', convert_string('link:http://asciidoc.org is the project page for AsciiDoc.'), 0
170
- end
171
-
172
- test 'escaped inline qualified url should not create link' do
173
- assert_xpath '//a', convert_string('\http://asciidoc.org is the project page for AsciiDoc.'), 0
174
- end
175
-
176
- test 'url in link macro with at (@) sign should not create mailto link' do
177
- assert_xpath '//a[@href="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"][text()="subscribe"]', convert_string('http://xircles.codehaus.org/lists/dev@geb.codehaus.org[subscribe]')
178
- end
179
-
180
- test 'implicit url with at (@) sign should not create mailto link' do
181
- assert_xpath '//a[@href="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"][text()="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"]', convert_string('http://xircles.codehaus.org/lists/dev@geb.codehaus.org')
182
- end
183
-
184
- test 'escaped inline qualified url using macro syntax should not create link' do
185
- assert_xpath '//a', convert_string('\http://asciidoc.org[AsciiDoc] is the key to good docs.'), 0
186
- end
187
-
188
- test 'inline qualified url followed by an endline should not include endline in link' do
189
- assert_xpath '//a[@href="https://github.com/asciidoctor"]', convert_string("The source code for Asciidoctor can be found at https://github.com/asciidoctor\nwhich is a GitHub organization."), 1
190
- end
191
-
192
- test 'qualified url divided by endline using macro syntax should not create link' do
193
- assert_xpath '//a', convert_string("The source code for Asciidoctor can be found at link:https://github.com/asciidoctor\n[]which is a GitHub organization."), 0
194
- end
195
-
196
- test 'qualified url containing whitespace using macro syntax should not create link' do
197
- assert_xpath '//a', convert_string('I often need to refer to the chapter on link:http://asciidoc.org?q=attribute references[Attribute References].'), 0
198
- end
199
-
200
- test 'qualified url containing an encoded space using macro syntax should create a link' do
201
- assert_xpath '//a', convert_string('I often need to refer to the chapter on link:http://asciidoc.org?q=attribute%20references[Attribute References].'), 1
202
- end
203
-
204
- test 'inline quoted qualified url should not consume surrounding angled brackets' do
205
- assert_xpath '//a[@href="https://github.com/asciidoctor"]', convert_string('Asciidoctor GitHub organization: <**https://github.com/asciidoctor**>'), 1
206
- end
207
-
208
- test 'link with quoted text should not be separated into attributes when text contains an equal sign' do
209
- assert_xpath '//a[@href="http://search.example.com"][text()="Google, Yahoo, Bing = Search Engines"]', convert_string_to_embedded('http://search.example.com["Google, Yahoo, Bing = Search Engines"]'), 1
210
- end
211
-
212
- test 'link with quoted text but no equal sign should carry quotes over to output' do
213
- assert_xpath %(//a[@href="http://search.example.com"][text()='"Google, Yahoo, Bing"']), convert_string_to_embedded('http://search.example.com["Google, Yahoo, Bing"]'), 1
214
- end
215
-
216
- test 'link with comma in text but no equal sign should not be separated into attributes' do
217
- assert_xpath '//a[@href="http://search.example.com"][text()="Google, Yahoo, Bing"]', convert_string_to_embedded('http://search.example.com[Google, Yahoo, Bing]'), 1
218
- end
219
-
220
- test 'role and window attributes on link are processed' do
221
- assert_xpath '//a[@href="http://google.com"][@class="external"][@target="_blank"]', convert_string_to_embedded('http://google.com[Google, role=external, window="_blank"]'), 1
222
- end
223
-
224
- test 'link macro with attributes but no text should use URL as text' do
225
- url = 'https://fonts.googleapis.com/css?family=Roboto:400,400italic,'
226
- assert_xpath %(//a[@href="#{url}"][text()="#{url}"]), convert_string_to_embedded(%(link:#{url}[family=Roboto,weight=400])), 1
227
- end
228
-
229
- test 'link macro with attributes but blank text should use URL as text' do
230
- url = 'https://fonts.googleapis.com/css?family=Roboto:400,400italic,'
231
- assert_xpath %(//a[@href="#{url}"][text()="#{url}"]), convert_string_to_embedded(%(link:#{url}[,family=Roboto,weight=400])), 1
232
- end
233
-
234
- test 'link macro with comma but no explicit attributes in text should not parse text' do
235
- url = 'https://fonts.googleapis.com/css?family=Roboto:400,400italic,'
236
- assert_xpath %(//a[@href="#{url}"][text()="Roboto,400"]), convert_string_to_embedded(%(link:#{url}[Roboto,400])), 1
237
- end
238
-
239
- test 'link text that ends in ^ should set link window to _blank' do
240
- assert_xpath '//a[@href="http://google.com"][@target="_blank"]', convert_string_to_embedded('http://google.com[Google^]'), 1
241
- end
242
-
243
- test 'rel=noopener should be added to a link that targets the _blank window' do
244
- assert_xpath '//a[@href="http://google.com"][@target="_blank"][@rel="noopener"]', convert_string_to_embedded('http://google.com[Google^]'), 1
245
- end
246
-
247
- test 'rel=noopener should be added to a link that targets a named window when the noopener option is set' do
248
- assert_xpath '//a[@href="http://google.com"][@target="name"][@rel="noopener"]', convert_string_to_embedded('http://google.com[Google,window=name,opts=noopener]'), 1
249
- end
250
-
251
- test 'rel=noopener should not be added to a link if it does not target a window' do
252
- result = convert_string_to_embedded 'http://google.com[Google,opts=noopener]'
253
- assert_xpath '//a[@href="http://google.com"]', result, 1
254
- assert_xpath '//a[@href="http://google.com"][@rel="noopener"]', result, 0
255
- end
256
-
257
- test 'rel=nofollow should be added to a link when the nofollow option is set' do
258
- assert_xpath '//a[@href="http://google.com"][@target="name"][@rel="nofollow noopener"]', convert_string_to_embedded('http://google.com[Google,window=name,opts="nofollow,noopener"]'), 1
259
- end
260
-
261
- test 'id attribute on link is processed' do
262
- assert_xpath '//a[@href="http://google.com"][@id="link-1"]', convert_string_to_embedded('http://google.com[Google, id="link-1"]'), 1
263
- end
264
-
265
- test 'title attribute on link is processed' do
266
- assert_xpath '//a[@href="http://google.com"][@title="title-1"]', convert_string_to_embedded('http://google.com[Google, title="title-1"]'), 1
267
- end
268
-
269
- test 'inline irc link' do
270
- assert_xpath '//a[@href="irc://irc.freenode.net"][text()="irc://irc.freenode.net"]', convert_string_to_embedded('irc://irc.freenode.net'), 1
271
- end
272
-
273
- test 'inline irc link with text' do
274
- assert_xpath '//a[@href="irc://irc.freenode.net"][text()="Freenode IRC"]', convert_string_to_embedded('irc://irc.freenode.net[Freenode IRC]'), 1
275
- end
276
-
277
- test 'inline ref' do
278
- variations = %w([[tigers]] anchor:tigers[])
279
- variations.each do |anchor|
280
- doc = document_from_string %(Here you can read about tigers.#{anchor})
281
- output = doc.convert
282
- assert_equal '[tigers]', doc.catalog[:ids]['tigers']
283
- assert_kind_of Asciidoctor::Inline, doc.catalog[:refs]['tigers']
284
- assert_nil doc.catalog[:refs]['tigers'].text
285
- assert_xpath '//a[@id = "tigers"]', output, 1
286
- assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
287
- end
288
- end
289
-
290
- test 'escaped inline ref' do
291
- variations = %w([[tigers]] anchor:tigers[])
292
- variations.each do |anchor|
293
- doc = document_from_string %(Here you can read about tigers.\\#{anchor})
294
- output = doc.convert
295
- refute doc.catalog[:ids].key?('tigers')
296
- refute doc.catalog[:refs].key?('tigers')
297
- assert_xpath '//a[@id = "tigers"]', output, 0
298
- end
299
- end
300
-
301
- test 'inline ref can start with colon' do
302
- input = '[[:idname]] text'
303
- output = convert_string_to_embedded input
304
- assert_xpath '//a[@id = ":idname"]', output, 1
305
- end
306
-
307
- test 'inline ref cannot start with digit' do
308
- input = '[[1-install]] text'
309
- output = convert_string_to_embedded input
310
- assert_includes output, '[[1-install]]'
311
- assert_xpath '//a[@id = "1-install"]', output, 0
312
- end
313
-
314
- test 'inline ref with reftext' do
315
- %w([[tigers,Tigers]] anchor:tigers[Tigers]).each do |anchor|
316
- doc = document_from_string %(Here you can read about tigers.#{anchor})
317
- output = doc.convert
318
- assert_equal 'Tigers', doc.catalog[:ids]['tigers']
319
- assert_kind_of Asciidoctor::Inline, doc.catalog[:refs]['tigers']
320
- assert_equal 'Tigers', doc.catalog[:refs]['tigers'].text
321
- assert_xpath '//a[@id = "tigers"]', output, 1
322
- assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
323
- end
324
- end
325
-
326
- test 'should encode double quotes in reftext of anchor macro in DocBook output' do
327
- input = 'anchor:uncola[the "un"-cola]'
328
- result = convert_inline_string input, :backend => :docbook
329
- assert_equal '<anchor xml:id="uncola" xreflabel="the &quot;un&quot;-cola"/>', result
330
- end
331
-
332
- test 'should substitute attribute references in reftext when registering inline ref' do
333
- %w([[tigers,{label-tigers}]] anchor:tigers[{label-tigers}]).each do |anchor|
334
- doc = document_from_string %(Here you can read about tigers.#{anchor}), :attributes => { 'label-tigers' => 'Tigers' }
335
- doc.convert
336
- assert_kind_of Asciidoctor::Inline, doc.catalog[:refs]['tigers']
337
- assert_equal 'Tigers', doc.catalog[:refs]['tigers'].text
338
- assert_equal 'Tigers', doc.catalog[:ids]['tigers']
339
- end
340
- end
341
-
342
- test 'inline ref with reftext converted to DocBook' do
343
- %w([[tigers,<Tigers>]] anchor:tigers[<Tigers>]).each do |anchor|
344
- doc = document_from_string %(Here you can read about tigers.#{anchor}), :backend => :docbook45
345
- output = doc.convert :header_footer => false
346
- assert_kind_of Asciidoctor::Inline, doc.catalog[:refs]['tigers']
347
- assert_equal '<Tigers>', doc.catalog[:refs]['tigers'].text
348
- assert_equal '<Tigers>', doc.references[:ids]['tigers']
349
- assert_includes output, '<anchor id="tigers" xreflabel="&lt;Tigers&gt;"/>'
350
- end
351
- end
352
-
353
- test 'does not match bibliography anchor in prose when scanning for inline anchor' do
354
- doc = document_from_string 'Use [[[label]]] to assign a label to a bibliography entry.'
355
- refute doc.catalog[:ids].key?('label')
356
- refute doc.catalog[:refs].key?('label')
357
- end
358
-
359
- test 'repeating inline anchor macro with empty reftext' do
360
- input = 'anchor:one[] anchor:two[] anchor:three[]'
361
- result = convert_inline_string input
362
- assert_equal '<a id="one"></a> <a id="two"></a> <a id="three"></a>', result
363
- end
364
-
365
- test 'mixed inline anchor macro and anchor shorthand with empty reftext' do
366
- input = 'anchor:one[][[two]]anchor:three[][[four]]anchor:five[]'
367
- result = convert_inline_string input
368
- assert_equal '<a id="one"></a><a id="two"></a><a id="three"></a><a id="four"></a><a id="five"></a>', result
369
- end
370
-
371
- test 'assigns xreflabel value for anchor macro without reftext in DocBook output' do
372
- input = 'anchor:foo[]'
373
- result = convert_inline_string input, :backend => :docbook
374
- assert_equal '<anchor xml:id="foo" xreflabel="[foo]"/>', result
375
- end
376
-
377
- test 'unescapes square bracket in reftext of anchor macro' do
378
- input = 'see <<foo>>
379
-
380
- anchor:foo[b[a\]r]text'
381
- result = convert_string_to_embedded input
382
- assert_includes result, 'see <a href="#foo">b[a]r</a>'
383
- end
384
-
385
- test 'unescapes square bracket in reftext of anchor macro in DocBook output' do
386
- input = 'anchor:foo[b[a\]r]'
387
- result = convert_inline_string input, :backend => :docbook
388
- assert_equal '<anchor xml:id="foo" xreflabel="b[a]r"/>', result
389
- end
390
-
391
- test 'xref using angled bracket syntax' do
392
- doc = document_from_string '<<tigers>>'
393
- doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, '[tigers]', :type => :ref, :target => 'tigers'), '[tigers]']
394
- assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', doc.convert, 1
395
- end
396
-
397
- test 'xref using angled bracket syntax with explicit hash' do
398
- doc = document_from_string '<<#tigers>>'
399
- doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
400
- assert_xpath '//a[@href="#tigers"][text() = "Tigers"]', doc.convert, 1
401
- end
402
-
403
- test 'xref using angled bracket syntax with label' do
404
- input = <<-EOS
405
- <<tigers,About Tigers>>
406
-
407
- [#tigers]
408
- == Tigers
409
- EOS
410
- assert_xpath '//a[@href="#tigers"][text() = "About Tigers"]', convert_string(input), 1
411
- end
412
-
413
- test 'xref using angled bracket syntax with quoted label' do
414
- input = <<-EOS
415
- <<tigers,"About Tigers">>
416
-
417
- [#tigers]
418
- == Tigers
419
- EOS
420
- assert_xpath %q(//a[@href="#tigers"][text() = '"About Tigers"']), convert_string(input), 1
421
- end
422
-
423
- test 'should not interpret path sans extension in xref with angled bracket syntax in compat mode' do
424
- using_memory_logger do |logger|
425
- doc = document_from_string '<<tigers#>>', :header_footer => false, :attributes => { 'compat-mode' => '' }
426
- assert_xpath '//a[@href="#tigers#"][text() = "[tigers#]"]', doc.convert, 1
427
- end
428
- end
429
-
430
- test 'xref using angled bracket syntax with path sans extension' do
431
- doc = document_from_string '<<tigers#>>', :header_footer => false
432
- assert_xpath '//a[@href="tigers.html"][text() = "tigers.html"]', doc.convert, 1
433
- end
434
-
435
- test 'inter-document xref should not add suffix to path with a non-AsciiDoc extension' do
436
- {
437
- 'using-.net-web-services' => 'Using .NET web services',
438
- '../file.pdf' => 'Download the .pdf file'
439
- }.each do |path, text|
440
- result = convert_string_to_embedded %(<<#{path}#,#{text}>>)
441
- assert_xpath %(//a[@href="#{path}"][text() = "#{text}"]), result, 1
442
- end
443
- end
444
-
445
- test 'inter-document xref should only remove the file extension part if the path contains a period elsewhere' do
446
- result = convert_string_to_embedded '<<using-.net-web-services.adoc#,Using .NET web services>>'
447
- assert_xpath '//a[@href="using-.net-web-services.html"][text() = "Using .NET web services"]', result, 1
448
- end
449
-
450
- test 'xref using angled bracket syntax with path sans extension using docbook backend' do
451
- doc = document_from_string '<<tigers#>>', :header_footer => false, :backend => 'docbook'
452
- assert_match '<link xl:href="tigers.xml">tigers.xml</link>', doc.convert, 1
453
- doc = document_from_string '<<tigers#>>', :header_footer => false, :backend => 'docbook45'
454
- assert_match '<ulink url="tigers.xml">tigers.xml</ulink>', doc.convert, 1
455
- end
456
-
457
- test 'xref using angled bracket syntax with ancestor path sans extension' do
458
- doc = document_from_string '<<../tigers#,tigers>>', :header_footer => false
459
- assert_xpath '//a[@href="../tigers.html"][text() = "tigers"]', doc.convert, 1
460
- end
461
-
462
- test 'xref using angled bracket syntax with absolute path sans extension' do
463
- doc = document_from_string '<</path/to/tigers#,tigers>>', :header_footer => false
464
- assert_xpath '//a[@href="/path/to/tigers.html"][text() = "tigers"]', doc.convert, 1
465
- end
466
-
467
- test 'xref using angled bracket syntax with path and extension' do
468
- using_memory_logger do |logger|
469
- doc = document_from_string '<<tigers.adoc>>', :header_footer => false
470
- assert_xpath '//a[@href="#tigers.adoc"][text() = "[tigers.adoc]"]', doc.convert, 1
471
- end
472
- end
473
-
474
- test 'xref using angled bracket syntax with path and extension with hash' do
475
- doc = document_from_string '<<tigers.adoc#>>', :header_footer => false
476
- assert_xpath '//a[@href="tigers.html"][text() = "tigers.html"]', doc.convert, 1
477
- end
478
-
479
- test 'xref using angled bracket syntax with path and extension with fragment' do
480
- doc = document_from_string '<<tigers.adoc#id>>', :header_footer => false
481
- assert_xpath '//a[@href="tigers.html#id"][text() = "tigers.html"]', doc.convert, 1
482
- end
483
-
484
- test 'xref using macro syntax with path and extension in compat mode' do
485
- using_memory_logger do |logger|
486
- doc = document_from_string 'xref:tigers.adoc[]', :header_footer => false, :attributes => { 'compat-mode' => '' }
487
- assert_xpath '//a[@href="#tigers.adoc"][text() = "[tigers.adoc]"]', doc.convert, 1
488
- end
489
- end
490
-
491
- test 'xref using macro syntax with path and extension' do
492
- doc = document_from_string 'xref:tigers.adoc[]', :header_footer => false
493
- assert_xpath '//a[@href="tigers.html"][text() = "tigers.html"]', doc.convert, 1
494
- end
495
-
496
- test 'xref using angled bracket syntax with path and fragment' do
497
- doc = document_from_string '<<tigers#about>>', :header_footer => false
498
- assert_xpath '//a[@href="tigers.html#about"][text() = "tigers.html"]', doc.convert, 1
499
- end
500
-
501
- test 'xref using angled bracket syntax with path, fragment and text' do
502
- doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false
503
- assert_xpath '//a[@href="tigers.html#about"][text() = "About Tigers"]', doc.convert, 1
504
- end
505
-
506
- test 'xref using angled bracket syntax with path and custom relfilesuffix and outfilesuffix' do
507
- attributes = {'relfileprefix' => '../', 'outfilesuffix' => '/'}
508
- doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false, :attributes => attributes
509
- assert_xpath '//a[@href="../tigers/#about"][text() = "About Tigers"]', doc.convert, 1
510
- end
511
-
512
- test 'xref using angled bracket syntax with path and custom relfilesuffix' do
513
- attributes = { 'relfilesuffix' => '/' }
514
- doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false, :attributes => attributes
515
- assert_xpath '//a[@href="tigers/#about"][text() = "About Tigers"]', doc.convert, 1
516
- end
517
-
518
- test 'xref using angled bracket syntax with path which has been included in this document' do
519
- using_memory_logger do |logger|
520
- in_verbose_mode do
521
- doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false
522
- doc.catalog[:includes]['tigers'] = true
523
- output = doc.convert
524
- assert_xpath '//a[@href="#about"][text() = "About Tigers"]', output, 1
525
- assert_message logger, :WARN, 'invalid reference: about'
526
- end
527
- end
528
- end
529
-
530
- test 'xref using angled bracket syntax with nested path which has been included in this document' do
531
- using_memory_logger do |logger|
532
- in_verbose_mode do
533
- doc = document_from_string '<<part1/tigers#about,About Tigers>>', :header_footer => false
534
- doc.catalog[:includes]['part1/tigers'] = true
535
- output = doc.convert
536
- assert_xpath '//a[@href="#about"][text() = "About Tigers"]', output, 1
537
- assert_message logger, :WARN, 'invalid reference: about'
538
- end
539
- end
540
- end
541
-
542
- test 'xref using angled bracket syntax inline with text' do
543
- input = <<-EOS
544
- Want to learn <<tigers,about tigers>>?
545
-
546
- [#tigers]
547
- == Tigers
548
- EOS
549
- assert_xpath '//a[@href="#tigers"][text() = "about tigers"]', convert_string(input), 1
550
- end
551
-
552
- test 'xref using angled bracket syntax with multi-line label inline with text' do
553
- input = <<-EOS
554
- Want to learn <<tigers,about
555
- tigers>>?
556
-
557
- [#tigers]
558
- == Tigers
559
- EOS
560
- assert_xpath %{//a[@href="#tigers"][normalize-space(text()) = "about tigers"]}, convert_string(input), 1
561
- end
562
-
563
- test 'xref with escaped text' do
564
- # when \x0 was used as boundary character for passthrough, it was getting stripped
565
- # now using unicode marks as boundary characters, which resolves issue
566
- input = <<-EOS
567
- See the <<tigers, `+[tigers]+`>> section for details about tigers.
568
-
569
- [#tigers]
570
- == Tigers
571
- EOS
572
- output = convert_string_to_embedded input
573
- assert_xpath %(//a[@href="#tigers"]/code[text()="[tigers]"]), output, 1
574
- end
575
-
576
- test 'xref with target that begins with attribute reference in title' do
577
- ['<<{lessonsdir}/lesson-1#,Lesson 1>>', 'xref:{lessonsdir}/lesson-1#[Lesson 1]'].each do |xref|
578
- input = <<-EOS
579
- :lessonsdir: lessons
580
-
581
- [#lesson-1-listing]
582
- == #{xref}
583
-
584
- A summary of the first lesson.
585
- EOS
586
-
587
- output = convert_string_to_embedded input
588
- assert_xpath '//h2/a[@href="lessons/lesson-1.html"]', output, 1
589
- end
590
- end
591
-
592
- test 'xref using macro syntax' do
593
- doc = document_from_string 'xref:tigers[]'
594
- doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, '[tigers]', :type => :ref, :target => 'tigers'), '[tigers]']
595
- assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', doc.convert, 1
596
- end
597
-
598
- test 'multiple xref macros with implicit text in single line' do
599
- input = <<-EOS
600
- This document has two sections, xref:sect-a[] and xref:sect-b[].
601
-
602
- [#sect-a]
603
- == Section A
604
-
605
- [#sect-b]
606
- == Section B
607
- EOS
608
- result = convert_string_to_embedded input
609
- assert_xpath '//a[@href="#sect-a"][text() = "Section A"]', result, 1
610
- assert_xpath '//a[@href="#sect-b"][text() = "Section B"]', result, 1
611
- end
612
-
613
- test 'xref using macro syntax with explicit hash' do
614
- doc = document_from_string 'xref:#tigers[]'
615
- doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
616
- assert_xpath '//a[@href="#tigers"][text() = "Tigers"]', doc.convert, 1
617
- end
618
-
619
- test 'xref using macro syntax with label' do
620
- input = <<-EOS
621
- xref:tigers[About Tigers]
622
-
623
- [#tigers]
624
- == Tigers
625
- EOS
626
- assert_xpath '//a[@href="#tigers"][text() = "About Tigers"]', convert_string(input), 1
627
- end
628
-
629
- test 'xref using macro syntax inline with text' do
630
- input = <<-EOS
631
- Want to learn xref:tigers[about tigers]?
632
-
633
- [#tigers]
634
- == Tigers
635
- EOS
636
-
637
- assert_xpath '//a[@href="#tigers"][text() = "about tigers"]', convert_string(input), 1
638
- end
639
-
640
- test 'xref using macro syntax with multi-line label inline with text' do
641
- input = <<-EOS
642
- Want to learn xref:tigers[about
643
- tigers]?
644
-
645
- [#tigers]
646
- == Tigers
647
- EOS
648
- assert_xpath %{//a[@href="#tigers"][normalize-space(text()) = "about tigers"]}, convert_string(input), 1
649
- end
650
-
651
- test 'xref using macro syntax with text that ends with an escaped closing bracket' do
652
- input = <<-EOS
653
- xref:tigers[[tigers\\]]
654
-
655
- [#tigers]
656
- == Tigers
657
- EOS
658
- assert_xpath '//a[@href="#tigers"][text() = "[tigers]"]', convert_string_to_embedded(input), 1
659
- end
660
-
661
- test 'xref using macro syntax with text that contains an escaped closing bracket' do
662
- input = <<-EOS
663
- xref:tigers[[tigers\\] are cats]
664
-
665
- [#tigers]
666
- == Tigers
667
- EOS
668
- assert_xpath '//a[@href="#tigers"][text() = "[tigers] are cats"]', convert_string_to_embedded(input), 1
669
- end
670
-
671
- test 'unescapes square bracket in reftext used by xref' do
672
- input = 'anchor:foo[b[a\]r]about
673
-
674
- see <<foo>>'
675
- result = convert_string_to_embedded input
676
- assert_xpath '//a[@href="#foo"]', result, 1
677
- assert_xpath '//a[@href="#foo"][text()="b[a]r"]', result, 1
678
- end
679
-
680
- test 'xref using invalid macro syntax does not create link' do
681
- doc = document_from_string 'xref:tigers'
682
- doc.register :refs, ['tigers', (Asciidoctor::Inline.new doc, :anchor, 'Tigers', :type => :ref, :target => 'tigers'), 'Tigers']
683
- assert_xpath '//a', doc.convert, 0
684
- end
685
-
686
- test 'should warn and create link if verbose flag is set and reference is not found' do
687
- input = <<-EOS
688
- [#foobar]
689
- == Foobar
690
-
691
- == Section B
692
-
693
- See <<foobaz>>.
694
- EOS
695
- using_memory_logger do |logger|
696
- in_verbose_mode do
697
- output = convert_string_to_embedded input
698
- assert_xpath '//a[@href="#foobaz"][text() = "[foobaz]"]', output, 1
699
- assert_message logger, :WARN, 'invalid reference: foobaz'
700
- end
701
- end
702
- end
703
-
704
- test 'should warn and create link if verbose flag is set and reference using # notation is not found' do
705
- input = <<-EOS
706
- [#foobar]
707
- == Foobar
708
-
709
- == Section B
710
-
711
- See <<#foobaz>>.
712
- EOS
713
- using_memory_logger do |logger|
714
- in_verbose_mode do
715
- output = convert_string_to_embedded input
716
- assert_xpath '//a[@href="#foobaz"][text() = "[foobaz]"]', output, 1
717
- assert_message logger, :WARN, 'invalid reference: foobaz'
718
- end
719
- end
720
- end
721
-
722
- test 'should produce an internal anchor from an inter-document xref to file included into current file' do
723
- input = <<-'EOS'
724
- = Book Title
725
- :doctype: book
726
-
727
- [#ch1]
728
- == Chapter 1
729
-
730
- So it begins.
731
-
732
- Read <<other-chapters.adoc#ch2>> to find out what happens next!
733
-
734
- include::other-chapters.adoc[]
735
- EOS
736
-
737
- doc = document_from_string input, :safe => :safe, :base_dir => fixturedir
738
- assert doc.catalog[:includes].key?('other-chapters')
739
- assert doc.catalog[:includes]['other-chapters']
740
- output = doc.convert
741
- assert_xpath '//a[@href="#ch2"][text()="Chapter 2"]', output, 1
742
- end
743
-
744
- test 'should produce an internal anchor from an inter-document xref to file included entirely into current file using tags' do
745
- input = <<-'EOS'
746
- = Book Title
747
- :doctype: book
748
-
749
- [#ch1]
750
- == Chapter 1
751
-
752
- So it begins.
753
-
754
- Read <<other-chapters.adoc#ch2>> to find out what happens next!
755
-
756
- include::other-chapters.adoc[tags=**]
757
- EOS
758
-
759
- output = convert_string_to_embedded input, :safe => :safe, :base_dir => fixturedir
760
- assert_xpath '//a[@href="#ch2"][text()="Chapter 2"]', output, 1
761
- end
762
-
763
- test 'should not produce an internal anchor for inter-document xref to file partially included into current file' do
764
- input = <<-'EOS'
765
- = Book Title
766
- :doctype: book
767
-
768
- [#ch1]
769
- == Chapter 1
770
-
771
- So it begins.
772
-
773
- Read <<other-chapters.adoc#ch2,the next chapter>> to find out what happens next!
774
-
775
- include::other-chapters.adoc[tags=ch2]
776
- EOS
777
-
778
- doc = document_from_string input, :safe => :safe, :base_dir => fixturedir
779
- assert doc.catalog[:includes].key?('other-chapters')
780
- refute doc.catalog[:includes]['other-chapters']
781
- output = doc.convert
782
- assert_xpath '//a[@href="other-chapters.html#ch2"][text()="the next chapter"]', output, 1
783
- end
784
-
785
- test 'should warn and create link if debug mode is enabled, inter-document xref points to current doc, and reference not found' do
786
- input = <<-EOS
787
- [#foobar]
788
- == Foobar
789
-
790
- == Section B
791
-
792
- See <<test.adoc#foobaz>>.
793
- EOS
794
- using_memory_logger do |logger|
795
- in_verbose_mode do
796
- output = convert_string_to_embedded input, :attributes => { 'docname' => 'test' }
797
- assert_xpath '//a[@href="#foobaz"][text() = "[foobaz]"]', output, 1
798
- assert_message logger, :WARN, 'invalid reference: foobaz'
799
- end
800
- end
801
- end
802
-
803
- test 'should produce an internal anchor for inter-document xref to file outside of base directory' do
804
- input = <<-EOS
805
- = Document Title
806
-
807
- See <<../section-a.adoc#section-a>>.
808
-
809
- include::../section-a.adoc[]
810
- EOS
811
-
812
- doc = document_from_string input, :safe => :unsafe, :base_dir => (File.join fixturedir, 'subdir')
813
- assert_includes doc.catalog[:includes], '../section-a'
814
- output = doc.convert :header_footer => false
815
- assert_xpath '//a[@href="#section-a"][text()="Section A"]', output, 1
816
- end
817
-
818
- test 'xref uses title of target as label for forward and backward references in html output' do
819
- input = <<-EOS
820
- == Section A
821
-
822
- <<_section_b>>
823
-
824
- == Section B
825
-
826
- <<_section_a>>
827
- EOS
828
-
829
- output = convert_string_to_embedded input
830
- assert_xpath '//h2[@id="_section_a"][text()="Section A"]', output, 1
831
- assert_xpath '//a[@href="#_section_a"][text()="Section A"]', output, 1
832
- assert_xpath '//h2[@id="_section_b"][text()="Section B"]', output, 1
833
- assert_xpath '//a[@href="#_section_b"][text()="Section B"]', output, 1
834
- end
835
-
836
- test 'anchor creates reference' do
837
- doc = document_from_string "[[tigers]]Tigers roam here."
838
- assert_equal({'tigers' => '[tigers]'}, doc.catalog[:ids])
839
- end
840
-
841
- test 'anchor with label creates reference' do
842
- doc = document_from_string "[[tigers,Tigers]]Tigers roam here."
843
- assert_equal({'tigers' => 'Tigers'}, doc.catalog[:ids])
844
- end
845
-
846
- test 'anchor with quoted label creates reference with quoted label text' do
847
- doc = document_from_string %([[tigers,"Tigers roam here"]]Tigers roam here.)
848
- assert_equal({'tigers' => '"Tigers roam here"'}, doc.catalog[:ids])
849
- end
850
-
851
- test 'anchor with label containing a comma creates reference' do
852
- doc = document_from_string %([[tigers,Tigers, scary tigers, roam here]]Tigers roam here.)
853
- assert_equal({'tigers' => 'Tigers, scary tigers, roam here'}, doc.catalog[:ids])
854
- end
855
- end