asciidoctor 1.5.8 → 2.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
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