asciidoctor 1.5.6.2 → 1.5.7
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of asciidoctor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +330 -143
- data/README-fr.adoc +441 -0
- data/README-jp.adoc +418 -0
- data/README-zh_CN.adoc +430 -0
- data/README.adoc +454 -0
- data/Rakefile +57 -0
- data/asciidoctor.gemspec +7 -1
- data/data/locale/attributes-ar.adoc +22 -0
- data/data/locale/attributes-bg.adoc +22 -0
- data/data/locale/attributes-ca.adoc +22 -0
- data/data/locale/attributes-cs.adoc +22 -0
- data/data/locale/attributes-da.adoc +22 -0
- data/data/locale/attributes-de.adoc +22 -0
- data/data/locale/attributes-en.adoc +23 -0
- data/data/locale/attributes-es.adoc +22 -0
- data/data/locale/attributes-fa.adoc +22 -0
- data/data/locale/attributes-fi.adoc +22 -0
- data/data/locale/attributes-fr.adoc +22 -0
- data/data/locale/attributes-hu.adoc +22 -0
- data/data/locale/attributes-id.adoc +22 -0
- data/data/locale/attributes-it.adoc +22 -0
- data/data/locale/attributes-ja.adoc +22 -0
- data/data/locale/attributes-kr.adoc +22 -0
- data/data/locale/attributes-nb.adoc +22 -0
- data/data/locale/attributes-nl.adoc +22 -0
- data/data/locale/attributes-nn.adoc +22 -0
- data/data/locale/attributes-pl.adoc +22 -0
- data/data/locale/attributes-pt.adoc +22 -0
- data/data/locale/attributes-pt_BR.adoc +22 -0
- data/data/locale/attributes-ro.adoc +22 -0
- data/data/locale/attributes-ru.adoc +22 -0
- data/data/locale/attributes-sr.adoc +22 -0
- data/data/locale/attributes-sr_Latn.adoc +22 -0
- data/data/locale/attributes-tr.adoc +22 -0
- data/data/locale/attributes-uk.adoc +22 -0
- data/data/locale/attributes-zh_CN.adoc +22 -0
- data/data/locale/attributes-zh_TW.adoc +22 -0
- data/data/locale/attributes.adoc +8 -649
- data/data/stylesheets/asciidoctor-default.css +77 -72
- data/features/xref.feature +366 -7
- data/lib/asciidoctor.rb +107 -93
- data/lib/asciidoctor/abstract_block.rb +247 -239
- data/lib/asciidoctor/abstract_node.rb +56 -58
- data/lib/asciidoctor/block.rb +3 -3
- data/lib/asciidoctor/callouts.rb +1 -1
- data/lib/asciidoctor/cli/invoker.rb +36 -9
- data/lib/asciidoctor/cli/options.rb +63 -25
- data/lib/asciidoctor/converter.rb +23 -13
- data/lib/asciidoctor/converter/base.rb +4 -0
- data/lib/asciidoctor/converter/docbook45.rb +16 -9
- data/lib/asciidoctor/converter/docbook5.rb +115 -97
- data/lib/asciidoctor/converter/factory.rb +29 -31
- data/lib/asciidoctor/converter/html5.rb +229 -192
- data/lib/asciidoctor/converter/manpage.rb +72 -50
- data/lib/asciidoctor/converter/template.rb +12 -12
- data/lib/asciidoctor/core_ext.rb +5 -1
- data/lib/asciidoctor/core_ext/1.8.7/base64/strict_encode64.rb +6 -0
- data/lib/asciidoctor/document.rb +168 -77
- data/lib/asciidoctor/extensions.rb +79 -47
- data/lib/asciidoctor/helpers.rb +33 -11
- data/lib/asciidoctor/inline.rb +3 -2
- data/lib/asciidoctor/list.rb +2 -1
- data/lib/asciidoctor/logging.rb +122 -0
- data/lib/asciidoctor/parser.rb +406 -382
- data/lib/asciidoctor/path_resolver.rb +169 -162
- data/lib/asciidoctor/reader.rb +166 -121
- data/lib/asciidoctor/section.rb +45 -28
- data/lib/asciidoctor/stylesheets.rb +13 -5
- data/lib/asciidoctor/substitutors.rb +328 -254
- data/lib/asciidoctor/table.rb +105 -48
- data/lib/asciidoctor/timings.rb +34 -6
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +41 -23
- data/man/asciidoctor.adoc +14 -8
- data/test/api_test.rb +1004 -0
- data/test/attributes_test.rb +241 -50
- data/test/blocks_test.rb +549 -124
- data/test/converter_test.rb +170 -78
- data/test/document_test.rb +208 -767
- data/test/extensions_test.rb +188 -53
- data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +1 -1
- data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +1 -1
- data/test/fixtures/file-with-missing-include.adoc +1 -0
- data/test/fixtures/include-file.jsx +8 -0
- data/test/fixtures/lists.adoc +96 -0
- data/test/fixtures/other-chapters.adoc +11 -0
- data/test/fixtures/outer-include.adoc +5 -0
- data/test/fixtures/sample.asciidoc +5 -1
- data/test/fixtures/subdir/index.adoc +3 -0
- data/test/fixtures/subdir/inner-include.adoc +3 -0
- data/test/fixtures/subdir/middle-include.adoc +5 -0
- data/test/fixtures/tagged-class-enclosed.rb +0 -1
- data/test/fixtures/unclosed-tag.adoc +3 -0
- data/test/fixtures/unexpected-end-tag.adoc +4 -0
- data/test/invoker_test.rb +101 -40
- data/test/links_test.rb +266 -72
- data/test/lists_test.rb +243 -45
- data/test/logger_test.rb +211 -0
- data/test/manpage_test.rb +124 -6
- data/test/options_test.rb +46 -1
- data/test/paragraphs_test.rb +23 -10
- data/test/parser_test.rb +30 -1
- data/test/paths_test.rb +115 -33
- data/test/preamble_test.rb +1 -1
- data/test/reader_test.rb +337 -81
- data/test/sections_test.rb +656 -72
- data/test/substitutions_test.rb +182 -57
- data/test/tables_test.rb +324 -57
- data/test/test_helper.rb +77 -32
- data/test/text_test.rb +7 -7
- metadata +67 -3
data/test/paragraphs_test.rb
CHANGED
@@ -194,7 +194,7 @@ Note that multi-entry terms generate separate index entries.
|
|
194
194
|
EOS
|
195
195
|
|
196
196
|
output = render_embedded_string input
|
197
|
-
|
197
|
+
assert_includes output, '*<Hey Jude>*'
|
198
198
|
end
|
199
199
|
|
200
200
|
test 'normal paragraph should honor specialchars shorthand' do
|
@@ -204,7 +204,7 @@ Note that multi-entry terms generate separate index entries.
|
|
204
204
|
EOS
|
205
205
|
|
206
206
|
output = render_embedded_string input
|
207
|
-
|
207
|
+
assert_includes output, '*<Hey Jude>*'
|
208
208
|
end
|
209
209
|
|
210
210
|
test 'should add a hardbreak at end of each line when hardbreaks option is set' do
|
@@ -218,7 +218,7 @@ lips
|
|
218
218
|
output = render_embedded_string input
|
219
219
|
assert_css 'br', output, 2
|
220
220
|
assert_xpath '//p', output, 1
|
221
|
-
|
221
|
+
assert_includes output, "<p>read<br>\nmy<br>\nlips</p>"
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
@@ -371,7 +371,7 @@ _GET /groups/link:#group-id[\{group-id\}]_
|
|
371
371
|
EOS
|
372
372
|
|
373
373
|
output = render_embedded_string input
|
374
|
-
|
374
|
+
assert_includes output, '<pre class="content"><em>GET /groups/<a href="#group-id">{group-id}</a></em></pre>'
|
375
375
|
end
|
376
376
|
|
377
377
|
test 'quote paragraph should honor explicit subs list' do
|
@@ -382,7 +382,7 @@ _GET /groups/link:#group-id[\{group-id\}]_
|
|
382
382
|
EOS
|
383
383
|
|
384
384
|
output = render_embedded_string input
|
385
|
-
|
385
|
+
assert_includes output, '*Hey Jude*'
|
386
386
|
end
|
387
387
|
end
|
388
388
|
|
@@ -465,6 +465,9 @@ As you can see here.
|
|
465
465
|
|
466
466
|
[quote]
|
467
467
|
Wise words from a wise person.
|
468
|
+
|
469
|
+
[open]
|
470
|
+
Make it what you want.
|
468
471
|
EOS
|
469
472
|
|
470
473
|
output = render_string input, :backend => 'docbook'
|
@@ -473,6 +476,18 @@ Wise words from a wise person.
|
|
473
476
|
assert_css 'sidebar > simpara', output, 1
|
474
477
|
assert_css 'informalexample > simpara', output, 1
|
475
478
|
assert_css 'blockquote > simpara', output, 1
|
479
|
+
assert_css 'chapter > simpara', output, 1
|
480
|
+
end
|
481
|
+
|
482
|
+
test 'should convert open paragraph to open block' do
|
483
|
+
input = <<-EOS
|
484
|
+
[open]
|
485
|
+
Make it what you want.
|
486
|
+
EOS
|
487
|
+
|
488
|
+
output = render_embedded_string input
|
489
|
+
assert_css '.openblock', output, 1
|
490
|
+
assert_css '.openblock p', output, 0
|
476
491
|
end
|
477
492
|
|
478
493
|
test 'should wrap text in simpara for styled paragraphs with title when rendered to DocBook' do
|
@@ -536,13 +551,11 @@ Wise words from a wise person.
|
|
536
551
|
|
537
552
|
test 'should output nil and warn if first block is not a paragraph' do
|
538
553
|
input = '* bullet'
|
539
|
-
|
540
|
-
warnings = redirect_streams do |_, err|
|
554
|
+
using_memory_logger do |logger|
|
541
555
|
output = render_string input, :doctype => 'inline'
|
542
|
-
|
556
|
+
assert_nil output
|
557
|
+
assert_message logger, :WARN, '~no inline candidate'
|
543
558
|
end
|
544
|
-
assert_nil output
|
545
|
-
assert_includes warnings, 'no inline candidate'
|
546
559
|
end
|
547
560
|
end
|
548
561
|
end
|
data/test/parser_test.rb
CHANGED
@@ -351,7 +351,7 @@ context "Parser" do
|
|
351
351
|
attributes = {1 => '%header', 'options' => 'footer', 'footer-option' => ''}
|
352
352
|
style = Asciidoctor::Parser.parse_style_attribute(attributes)
|
353
353
|
assert_nil style
|
354
|
-
assert_equal 'header
|
354
|
+
assert_equal 'footer,header', attributes['options']
|
355
355
|
assert_equal '', attributes['header-option']
|
356
356
|
assert_equal '', attributes['footer-option']
|
357
357
|
end
|
@@ -526,6 +526,13 @@ context "Parser" do
|
|
526
526
|
assert_equal 'John Smith', metadata['author_2']
|
527
527
|
end
|
528
528
|
|
529
|
+
test 'skips blank author entries in implicit author line' do
|
530
|
+
metadata, _ = parse_header_metadata 'Doc Writer; ; John Smith <john.smith@asciidoc.org>;'
|
531
|
+
assert_equal 2, metadata['authorcount']
|
532
|
+
assert_equal 'Doc Writer', metadata['author_1']
|
533
|
+
assert_equal 'John Smith', metadata['author_2']
|
534
|
+
end
|
535
|
+
|
529
536
|
test 'parse name with more than 3 parts in author attribute' do
|
530
537
|
doc = empty_document
|
531
538
|
parse_header_metadata ':author: Leroy Harold Scherer, Jr.', doc
|
@@ -535,6 +542,14 @@ context "Parser" do
|
|
535
542
|
assert_equal 'Scherer, Jr.', doc.attributes['lastname']
|
536
543
|
end
|
537
544
|
|
545
|
+
test 'sets authorcount to 0 if document has no authors' do
|
546
|
+
input = ''
|
547
|
+
doc = empty_document
|
548
|
+
metadata, _ = parse_header_metadata input, doc
|
549
|
+
assert_equal 0, doc.attributes['authorcount']
|
550
|
+
assert_equal 0, metadata['authorcount']
|
551
|
+
end
|
552
|
+
|
538
553
|
test 'does not drop name joiner when using multiple authors' do
|
539
554
|
input = <<-EOS
|
540
555
|
Kismet Chameleon; Lazarus het_Draeke
|
@@ -712,6 +727,20 @@ v0.0.7, 2013-12-18
|
|
712
727
|
assert_equal '2013-12-18', metadata['revdate']
|
713
728
|
end
|
714
729
|
|
730
|
+
test 'break header at line with three forward slashes' do
|
731
|
+
input = <<-EOS
|
732
|
+
Joe Cool
|
733
|
+
v1.0
|
734
|
+
///
|
735
|
+
stuff
|
736
|
+
EOS
|
737
|
+
metadata, _ = parse_header_metadata input
|
738
|
+
assert_equal 7, metadata.size
|
739
|
+
assert_equal 1, metadata['authorcount']
|
740
|
+
assert_equal 'Joe Cool', metadata['author']
|
741
|
+
assert_equal '1.0', metadata['revnumber']
|
742
|
+
end
|
743
|
+
|
715
744
|
test 'attribute entry overrides generated author initials' do
|
716
745
|
doc = empty_document
|
717
746
|
metadata, _ = parse_header_metadata %(Stuart Rackham <founder@asciidoc.org>\n:Author Initials: SJR), doc
|
data/test/paths_test.rb
CHANGED
@@ -89,6 +89,7 @@ context 'Path Resolver' do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
test 'posixifies windows paths' do
|
92
|
+
@resolver.file_separator = '\\'
|
92
93
|
assert_equal '/images', @resolver.web_path('\\images')
|
93
94
|
assert_equal '../images', @resolver.web_path('..\\images')
|
94
95
|
assert_equal '/images', @resolver.web_path('\\..\\images')
|
@@ -103,29 +104,47 @@ context 'Path Resolver' do
|
|
103
104
|
|
104
105
|
context 'System Paths' do
|
105
106
|
JAIL = '/home/doctor/docs'
|
107
|
+
default_logger = Asciidoctor::LoggerManager.logger
|
106
108
|
|
107
109
|
def setup
|
108
110
|
@resolver = Asciidoctor::PathResolver.new
|
111
|
+
@logger = (Asciidoctor::LoggerManager.logger = Asciidoctor::MemoryLogger.new)
|
109
112
|
end
|
110
113
|
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
+
teardown do
|
115
|
+
Asciidoctor::LoggerManager.logger = default_logger
|
116
|
+
end
|
117
|
+
|
118
|
+
test 'raises security error if jail is not an absolute path' do
|
119
|
+
begin
|
120
|
+
@resolver.system_path('images/tiger.png', '/etc', 'foo')
|
121
|
+
flunk 'Expecting SecurityError to be raised'
|
122
|
+
rescue SecurityError
|
114
123
|
end
|
124
|
+
end
|
125
|
+
|
126
|
+
#test 'raises security error if jail is not a canoncial path' do
|
127
|
+
# begin
|
128
|
+
# @resolver.system_path('images/tiger.png', '/etc', %(#{JAIL}/../foo))
|
129
|
+
# flunk 'Expecting SecurityError to be raised'
|
130
|
+
# rescue SecurityError
|
131
|
+
# end
|
132
|
+
#end
|
133
|
+
|
134
|
+
test 'prevents access to paths outside of jail' do
|
135
|
+
result = @resolver.system_path '../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL
|
115
136
|
assert_equal %(#{JAIL}/css), result
|
116
|
-
|
137
|
+
assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
|
117
138
|
|
118
|
-
|
119
|
-
|
120
|
-
end
|
139
|
+
@logger.clear
|
140
|
+
result = @resolver.system_path '/../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL
|
121
141
|
assert_equal %(#{JAIL}/css), result
|
122
|
-
|
142
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
123
143
|
|
124
|
-
|
125
|
-
|
126
|
-
end
|
144
|
+
@logger.clear
|
145
|
+
result = @resolver.system_path '../../../css', '../../..', JAIL
|
127
146
|
assert_equal %(#{JAIL}/css), result
|
128
|
-
|
147
|
+
assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
|
129
148
|
end
|
130
149
|
|
131
150
|
test 'throws exception for illegal path access if recover is false' do
|
@@ -141,15 +160,39 @@ context 'Path Resolver' do
|
|
141
160
|
assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path(nil, "#{JAIL}/assets/stylesheets", JAIL)
|
142
161
|
end
|
143
162
|
|
163
|
+
test 'expands parent references in start path if target is empty' do
|
164
|
+
assert_equal "#{JAIL}/stylesheets", @resolver.system_path('', "#{JAIL}/assets/../stylesheets", JAIL)
|
165
|
+
end
|
166
|
+
|
167
|
+
test 'expands parent references in start path if target is not empty' do
|
168
|
+
assert_equal "#{JAIL}/stylesheets/site.css", @resolver.system_path('site.css', "#{JAIL}/assets/../stylesheets", JAIL)
|
169
|
+
end
|
170
|
+
|
144
171
|
test 'resolves start path if target is dot' do
|
145
172
|
assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('.', "#{JAIL}/assets/stylesheets", JAIL)
|
146
173
|
assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('./', "#{JAIL}/assets/stylesheets", JAIL)
|
147
174
|
end
|
148
175
|
|
149
|
-
test 'treats absolute target as relative when jail is specified' do
|
150
|
-
|
151
|
-
assert_equal
|
152
|
-
|
176
|
+
test 'treats absolute target outside of jail as relative when jail is specified' do
|
177
|
+
result = @resolver.system_path '/', "#{JAIL}/assets/stylesheets", JAIL
|
178
|
+
assert_equal JAIL, result
|
179
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
180
|
+
|
181
|
+
@logger.clear
|
182
|
+
result = @resolver.system_path '/foo', "#{JAIL}/assets/stylesheets", JAIL
|
183
|
+
assert_equal "#{JAIL}/foo", result
|
184
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
185
|
+
|
186
|
+
@logger.clear
|
187
|
+
result = @resolver.system_path '/../foo', "#{JAIL}/assets/stylesheets", JAIL
|
188
|
+
assert_equal "#{JAIL}/foo", result
|
189
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
190
|
+
|
191
|
+
@logger.clear
|
192
|
+
@resolver.file_separator = '\\'
|
193
|
+
result = @resolver.system_path 'baz.adoc', 'C:/foo', 'C:/bar'
|
194
|
+
assert_equal 'C:/bar/baz.adoc', result
|
195
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
153
196
|
end
|
154
197
|
|
155
198
|
test 'allows use of absolute target or start if resolved path is sub-path of jail' do
|
@@ -158,6 +201,9 @@ context 'Path Resolver' do
|
|
158
201
|
assert_equal "#{JAIL}/my/path", @resolver.system_path('', "#{JAIL}/my/path", JAIL)
|
159
202
|
assert_equal "#{JAIL}/my/path", @resolver.system_path(nil, "#{JAIL}/my/path", JAIL)
|
160
203
|
assert_equal "#{JAIL}/my/path", @resolver.system_path('path', "#{JAIL}/my", JAIL)
|
204
|
+
assert_equal '/foo/bar/baz.adoc', @resolver.system_path('/foo/bar/baz.adoc', nil, '/')
|
205
|
+
assert_equal '/foo/bar/baz.adoc', @resolver.system_path('baz.adoc', '/foo/bar', '/')
|
206
|
+
assert_equal '/foo/bar/baz.adoc', @resolver.system_path('baz.adoc', 'foo/bar', '/')
|
161
207
|
end
|
162
208
|
|
163
209
|
test 'uses jail path if start path is empty' do
|
@@ -165,20 +211,59 @@ context 'Path Resolver' do
|
|
165
211
|
assert_equal "#{JAIL}/images/tiger.png", @resolver.system_path('images/tiger.png', nil, JAIL)
|
166
212
|
end
|
167
213
|
|
168
|
-
test '
|
214
|
+
test 'warns if start is not contained within jail' do
|
215
|
+
result = @resolver.system_path 'images/tiger.png', '/etc', JAIL
|
216
|
+
assert_equal %(#{JAIL}/images/tiger.png), result
|
217
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
218
|
+
|
219
|
+
@logger.clear
|
220
|
+
result = @resolver.system_path '.', '/etc', JAIL
|
221
|
+
assert_equal JAIL, result
|
222
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
223
|
+
|
224
|
+
@logger.clear
|
225
|
+
@resolver.file_separator = '\\'
|
226
|
+
result = @resolver.system_path '.', 'C:/foo', 'C:/bar'
|
227
|
+
assert_equal 'C:/bar', result
|
228
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
229
|
+
end
|
230
|
+
|
231
|
+
test 'allows start path to be parent of jail if resolved target is inside jail' do
|
232
|
+
assert_equal "#{JAIL}/foo/path", @resolver.system_path('foo/path', JAIL, "#{JAIL}/foo")
|
233
|
+
@resolver.file_separator = '\\'
|
234
|
+
assert_equal "C:/dev/project/README.adoc", @resolver.system_path('project/README.adoc', 'C:/dev', 'C:/dev/project')
|
235
|
+
end
|
236
|
+
|
237
|
+
test 'relocates target to jail if resolved value fails outside of jail' do
|
238
|
+
result = @resolver.system_path 'bar/baz.adoc', JAIL, "#{JAIL}/foo"
|
239
|
+
assert_equal %(#{JAIL}/foo/bar/baz.adoc), result
|
240
|
+
assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
|
241
|
+
|
242
|
+
@logger.clear
|
243
|
+
@resolver.file_separator = '\\'
|
244
|
+
result = @resolver.system_path 'bar/baz.adoc', 'D:/', 'C:/foo'
|
245
|
+
assert_equal 'C:/foo/bar/baz.adoc', result
|
246
|
+
assert_message @logger, :WARN, '~outside of jail root'
|
247
|
+
end
|
248
|
+
|
249
|
+
test 'raises security error if start is not contained within jail and recover is disabled' do
|
169
250
|
begin
|
170
|
-
@resolver.system_path('images/tiger.png', '/etc', JAIL)
|
251
|
+
@resolver.system_path('images/tiger.png', '/etc', JAIL, :recover => false)
|
171
252
|
flunk 'Expecting SecurityError to be raised'
|
172
253
|
rescue SecurityError
|
173
254
|
end
|
174
255
|
|
175
256
|
begin
|
176
|
-
@resolver.system_path('.', '/etc', JAIL)
|
257
|
+
@resolver.system_path('.', '/etc', JAIL, :recover => false)
|
177
258
|
flunk 'Expecting SecurityError to be raised'
|
178
259
|
rescue SecurityError
|
179
260
|
end
|
180
261
|
end
|
181
262
|
|
263
|
+
test 'expands parent references in absolute path if jail is not specified' do
|
264
|
+
assert_equal '/etc/stylesheet.css', @resolver.system_path('/usr/share/../../etc/stylesheet.css')
|
265
|
+
end
|
266
|
+
|
182
267
|
test 'resolves absolute directory if jail is not specified' do
|
183
268
|
assert_equal '/usr/share/stylesheet.css', @resolver.system_path('/usr/share/stylesheet.css', '/home/dallen/docs/assets/stylesheets')
|
184
269
|
end
|
@@ -208,19 +293,19 @@ context 'Path Resolver' do
|
|
208
293
|
assert_equal "#{pwd}/.images/tiger.png", @resolver.system_path('.images/tiger.png', nil)
|
209
294
|
end
|
210
295
|
|
211
|
-
test 'resolves and normalizes start
|
296
|
+
test 'resolves and normalizes start when target is empty' do
|
212
297
|
pwd = File.expand_path Dir.pwd
|
213
298
|
assert_equal '/home/doctor/docs', (@resolver.system_path '', '/home/doctor/docs')
|
299
|
+
assert_equal '/home/doctor/docs', (@resolver.system_path '', '/home/doctor/./docs')
|
214
300
|
assert_equal '/home/doctor/docs', (@resolver.system_path nil, '/home/doctor/docs')
|
301
|
+
assert_equal '/home/doctor/docs', (@resolver.system_path nil, '/home/doctor/./docs')
|
215
302
|
assert_equal %(#{pwd}/assets/images), (@resolver.system_path nil, 'assets/images')
|
216
|
-
|
217
|
-
|
218
|
-
end
|
219
|
-
assert_equal %(#{JAIL}/assets/images), result
|
220
|
-
assert_includes warnings, 'path has illegal reference to ancestor of jail'
|
303
|
+
@resolver.system_path '', '../assets/images', JAIL
|
304
|
+
assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
|
221
305
|
end
|
222
306
|
|
223
307
|
test 'posixifies windows paths' do
|
308
|
+
@resolver.file_separator = '\\'
|
224
309
|
assert_equal "#{JAIL}/assets/css", @resolver.system_path('..\\css', 'assets\\stylesheets', JAIL)
|
225
310
|
end
|
226
311
|
|
@@ -229,17 +314,14 @@ context 'Path Resolver' do
|
|
229
314
|
|
230
315
|
assert_equal 'C:/data/docs', (@resolver.system_path '..', 'C:\\data\\docs\\assets', 'C:\\data\\docs')
|
231
316
|
|
232
|
-
result
|
233
|
-
[(@resolver.system_path '..\\..', 'C:\\data\\docs\\assets', 'C:\\data\\docs'), err.string]
|
234
|
-
end
|
317
|
+
result = @resolver.system_path '..\\..', 'C:\\data\\docs\\assets', 'C:\\data\\docs'
|
235
318
|
assert_equal 'C:/data/docs', result
|
236
|
-
|
319
|
+
assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
|
237
320
|
|
238
|
-
|
239
|
-
|
240
|
-
end
|
321
|
+
@logger.clear
|
322
|
+
result = @resolver.system_path '..\\..\\css', 'C:\\data\\docs\\assets', 'C:\\data\\docs'
|
241
323
|
assert_equal 'C:/data/docs/css', result
|
242
|
-
|
324
|
+
assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
|
243
325
|
end
|
244
326
|
|
245
327
|
test 'should calculate relative path' do
|
data/test/preamble_test.rb
CHANGED
@@ -145,7 +145,7 @@ The axe came swinging.
|
|
145
145
|
|
146
146
|
d = document_from_string(input)
|
147
147
|
assert_equal 'book', d.doctype
|
148
|
-
output = d.
|
148
|
+
output = d.convert
|
149
149
|
assert_xpath '//h1', output, 3
|
150
150
|
assert_xpath %{//*[@id="preamble"]//p[text() = "Back then#{decode_char 8230}#{decode_char 8203}"]}, output, 1
|
151
151
|
end
|
data/test/reader_test.rb
CHANGED
@@ -5,7 +5,7 @@ unless defined? ASCIIDOCTOR_PROJECT_DIR
|
|
5
5
|
end
|
6
6
|
|
7
7
|
class ReaderTest < Minitest::Test
|
8
|
-
DIRNAME = File.expand_path
|
8
|
+
DIRNAME = File.expand_path File.dirname __FILE__
|
9
9
|
|
10
10
|
SAMPLE_DATA = <<-EOS.chomp.split(::Asciidoctor::LF)
|
11
11
|
first line
|
@@ -156,6 +156,12 @@ third line
|
|
156
156
|
assert_equal 1, reader.lineno
|
157
157
|
end
|
158
158
|
|
159
|
+
test 'peek_lines should peek all lines if no arguments are given' do
|
160
|
+
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
161
|
+
assert_equal SAMPLE_DATA, reader.peek_lines
|
162
|
+
assert_equal 1, reader.lineno
|
163
|
+
end
|
164
|
+
|
159
165
|
test 'peek_lines should not invert order of lines' do
|
160
166
|
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
161
167
|
assert_equal SAMPLE_DATA, reader.lines
|
@@ -251,13 +257,13 @@ third line
|
|
251
257
|
reader = Asciidoctor::Reader.new SAMPLE_DATA, 'sample.adoc'
|
252
258
|
reader.read_line
|
253
259
|
assert_equal 'sample.adoc: line 2', reader.line_info
|
254
|
-
assert_equal 'sample.adoc: line 2', reader.
|
260
|
+
assert_equal 'sample.adoc: line 2', reader.cursor.to_s
|
255
261
|
end
|
256
262
|
|
257
|
-
test '
|
263
|
+
test 'cursor_at_prev_line should return file name and line number of previous line read' do
|
258
264
|
reader = Asciidoctor::Reader.new SAMPLE_DATA, 'sample.adoc'
|
259
265
|
reader.read_line
|
260
|
-
assert_equal 'sample.adoc: line 1', reader.
|
266
|
+
assert_equal 'sample.adoc: line 1', reader.cursor_at_prev_line.to_s
|
261
267
|
end
|
262
268
|
end
|
263
269
|
|
@@ -361,6 +367,50 @@ This is a paragraph outside the block.
|
|
361
367
|
assert_equal lines[1, 4], result
|
362
368
|
assert_equal '--', reader.peek_line
|
363
369
|
end
|
370
|
+
|
371
|
+
test 'read lines until terminator' do
|
372
|
+
lines = <<-EOS.each_line.to_a
|
373
|
+
****
|
374
|
+
captured
|
375
|
+
|
376
|
+
also captured
|
377
|
+
****
|
378
|
+
|
379
|
+
not captured
|
380
|
+
EOS
|
381
|
+
|
382
|
+
expected = ['captured', '', 'also captured']
|
383
|
+
|
384
|
+
doc = empty_safe_document :base_dir => DIRNAME
|
385
|
+
reader = Asciidoctor::PreprocessorReader.new doc, lines, nil, :normalize => true
|
386
|
+
terminator = reader.read_line
|
387
|
+
result = reader.read_lines_until :terminator => terminator, :skip_processing => true
|
388
|
+
assert_equal expected, result
|
389
|
+
refute reader.unterminated
|
390
|
+
end
|
391
|
+
|
392
|
+
test 'should flag reader as unterminated if reader reaches end of source without finding terminator' do
|
393
|
+
lines = <<-EOS.each_line.to_a
|
394
|
+
****
|
395
|
+
captured
|
396
|
+
|
397
|
+
also captured
|
398
|
+
|
399
|
+
captured yet again
|
400
|
+
EOS
|
401
|
+
|
402
|
+
expected = lines[1..-1].map {|l| l.chomp }
|
403
|
+
|
404
|
+
using_memory_logger do |logger|
|
405
|
+
doc = empty_safe_document :base_dir => DIRNAME
|
406
|
+
reader = Asciidoctor::PreprocessorReader.new doc, lines, nil, :normalize => true
|
407
|
+
terminator = reader.peek_line
|
408
|
+
result = reader.read_lines_until :terminator => terminator, :skip_first_line => true, :skip_processing => true
|
409
|
+
assert_equal expected, result
|
410
|
+
assert reader.unterminated
|
411
|
+
assert_message logger, :WARN, '<stdin>: line 1: unterminated **** block', Hash
|
412
|
+
end
|
413
|
+
end
|
364
414
|
end
|
365
415
|
end
|
366
416
|
|
@@ -368,7 +418,7 @@ This is a paragraph outside the block.
|
|
368
418
|
context 'Type hierarchy' do
|
369
419
|
test 'PreprocessorReader should extend from Reader' do
|
370
420
|
reader = empty_document.reader
|
371
|
-
|
421
|
+
assert_kind_of Asciidoctor::PreprocessorReader, reader
|
372
422
|
end
|
373
423
|
|
374
424
|
test 'PreprocessorReader should invoke or emulate Reader initializer' do
|
@@ -489,6 +539,36 @@ preamble
|
|
489
539
|
assert_nil reader.file
|
490
540
|
assert_equal '<stdin>', reader.path
|
491
541
|
end
|
542
|
+
|
543
|
+
test 'PreprocessorReader#push_include method should set path from file automatically if not specified' do
|
544
|
+
lines = %w(a b c)
|
545
|
+
doc = Asciidoctor::Document.new lines
|
546
|
+
reader = doc.reader
|
547
|
+
append_lines = %w(one two three)
|
548
|
+
reader.push_include append_lines, '/tmp/lines.adoc'
|
549
|
+
assert_equal '/tmp/lines.adoc', reader.file
|
550
|
+
assert_equal 'lines.adoc', reader.path
|
551
|
+
end
|
552
|
+
|
553
|
+
test 'PreprocessorReader#push_include method should accept file as a URI and compute dir and path' do
|
554
|
+
file_uri = ::URI.parse 'http://example.com/docs/file.adoc'
|
555
|
+
dir_uri = ::URI.parse 'http://example.com/docs'
|
556
|
+
reader = empty_document.reader
|
557
|
+
reader.push_include %w(one two three), file_uri
|
558
|
+
assert_same file_uri, reader.file
|
559
|
+
assert_equal dir_uri, reader.dir
|
560
|
+
assert_equal 'file.adoc', reader.path
|
561
|
+
end
|
562
|
+
|
563
|
+
test 'PreprocessorReader#push_include method should accept file as a top-level URI and compute dir and path' do
|
564
|
+
file_uri = ::URI.parse 'http://example.com/index.adoc'
|
565
|
+
dir_uri = ::URI.parse 'http://example.com'
|
566
|
+
reader = empty_document.reader
|
567
|
+
reader.push_include %w(one two three), file_uri
|
568
|
+
assert_same file_uri, reader.file
|
569
|
+
assert_equal dir_uri, reader.dir
|
570
|
+
assert_equal 'index.adoc', reader.path
|
571
|
+
end
|
492
572
|
end
|
493
573
|
|
494
574
|
context 'Include Directive' do
|
@@ -507,8 +587,20 @@ include::fixtures/include-file.asciidoc[]
|
|
507
587
|
EOS
|
508
588
|
|
509
589
|
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
510
|
-
output = doc.
|
590
|
+
output = doc.convert
|
511
591
|
assert_match(/included content/, output)
|
592
|
+
assert doc.catalog[:includes]['fixtures/include-file']
|
593
|
+
end
|
594
|
+
|
595
|
+
test 'should not track include in catalog for non-AsciiDoc include files' do
|
596
|
+
input = <<-EOS
|
597
|
+
----
|
598
|
+
include::fixtures/circle.svg[]
|
599
|
+
----
|
600
|
+
EOS
|
601
|
+
|
602
|
+
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
603
|
+
assert doc.catalog[:includes].empty?
|
512
604
|
end
|
513
605
|
|
514
606
|
test 'include directive should resolve file with spaces in name' do
|
@@ -521,7 +613,7 @@ include::fixtures/include file.asciidoc[]
|
|
521
613
|
begin
|
522
614
|
FileUtils.cp include_file, include_file_with_sp
|
523
615
|
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
524
|
-
output = doc.
|
616
|
+
output = doc.convert
|
525
617
|
assert_match(/included content/, output)
|
526
618
|
ensure
|
527
619
|
FileUtils.rm include_file_with_sp
|
@@ -538,7 +630,7 @@ include::fixtures/include{sp}file.asciidoc[]
|
|
538
630
|
begin
|
539
631
|
FileUtils.cp include_file, include_file_with_sp
|
540
632
|
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
541
|
-
output = doc.
|
633
|
+
output = doc.convert
|
542
634
|
assert_match(/included content/, output)
|
543
635
|
ensure
|
544
636
|
FileUtils.rm include_file_with_sp
|
@@ -565,7 +657,7 @@ include::fixtures/parent-include.adoc[]
|
|
565
657
|
|
566
658
|
assert_equal 'first line of parent', reader.read_line
|
567
659
|
|
568
|
-
assert_equal 'fixtures/parent-include.adoc: line 1', reader.
|
660
|
+
assert_equal 'fixtures/parent-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
569
661
|
assert_equal parent_include_docfile, reader.file
|
570
662
|
assert_equal fixtures_dir, reader.dir
|
571
663
|
assert_equal 'fixtures/parent-include.adoc', reader.path
|
@@ -574,7 +666,7 @@ include::fixtures/parent-include.adoc[]
|
|
574
666
|
|
575
667
|
assert_equal 'first line of child', reader.read_line
|
576
668
|
|
577
|
-
assert_equal 'fixtures/child-include.adoc: line 1', reader.
|
669
|
+
assert_equal 'fixtures/child-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
578
670
|
assert_equal child_include_docfile, reader.file
|
579
671
|
assert_equal fixtures_dir, reader.dir
|
580
672
|
assert_equal 'fixtures/child-include.adoc', reader.path
|
@@ -583,7 +675,7 @@ include::fixtures/parent-include.adoc[]
|
|
583
675
|
|
584
676
|
assert_equal 'first line of grandchild', reader.read_line
|
585
677
|
|
586
|
-
assert_equal 'fixtures/grandchild-include.adoc: line 1', reader.
|
678
|
+
assert_equal 'fixtures/grandchild-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
587
679
|
assert_equal grandchild_include_docfile, reader.file
|
588
680
|
assert_equal fixtures_dir, reader.dir
|
589
681
|
assert_equal 'fixtures/grandchild-include.adoc', reader.path
|
@@ -600,12 +692,31 @@ include::fixtures/parent-include.adoc[]
|
|
600
692
|
|
601
693
|
assert_equal 'last line of parent', reader.read_line
|
602
694
|
|
603
|
-
assert_equal 'fixtures/parent-include.adoc: line 5', reader.
|
695
|
+
assert_equal 'fixtures/parent-include.adoc: line 5', reader.cursor_at_prev_line.to_s
|
604
696
|
assert_equal parent_include_docfile, reader.file
|
605
697
|
assert_equal fixtures_dir, reader.dir
|
606
698
|
assert_equal 'fixtures/parent-include.adoc', reader.path
|
607
699
|
end
|
608
700
|
|
701
|
+
test 'missing file referenced by include directive is skipped when optional option is set' do
|
702
|
+
input = <<-EOS
|
703
|
+
include::fixtures/no-such-file.adoc[opts=optional]
|
704
|
+
|
705
|
+
trailing content
|
706
|
+
EOS
|
707
|
+
|
708
|
+
begin
|
709
|
+
using_memory_logger do |logger|
|
710
|
+
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
711
|
+
assert_equal 1, doc.blocks.size
|
712
|
+
assert_equal ['trailing content'], doc.blocks[0].lines
|
713
|
+
assert logger.empty?
|
714
|
+
end
|
715
|
+
rescue
|
716
|
+
flunk 'include directive should not raise exception on missing file'
|
717
|
+
end
|
718
|
+
end
|
719
|
+
|
609
720
|
test 'missing file referenced by include directive is replaced by warning' do
|
610
721
|
input = <<-EOS
|
611
722
|
include::fixtures/no-such-file.adoc[]
|
@@ -614,13 +725,13 @@ trailing content
|
|
614
725
|
EOS
|
615
726
|
|
616
727
|
begin
|
617
|
-
|
618
|
-
|
728
|
+
using_memory_logger do |logger|
|
729
|
+
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
730
|
+
assert_equal 2, doc.blocks.size
|
731
|
+
assert_equal ['Unresolved directive in <stdin> - include::fixtures/no-such-file.adoc[]'], doc.blocks[0].lines
|
732
|
+
assert_equal ['trailing content'], doc.blocks[1].lines
|
733
|
+
assert_message logger, :ERROR, '~<stdin>: line 1: include file not found', Hash
|
619
734
|
end
|
620
|
-
assert_equal 2, doc.blocks.size
|
621
|
-
assert_equal ['Unresolved directive in <stdin> - include::fixtures/no-such-file.adoc[]'], doc.blocks[0].lines
|
622
|
-
assert_equal ['trailing content'], doc.blocks[1].lines
|
623
|
-
assert_includes warnings, 'include file not found'
|
624
735
|
rescue
|
625
736
|
flunk 'include directive should not raise exception on missing file'
|
626
737
|
end
|
@@ -636,13 +747,13 @@ trailing content
|
|
636
747
|
EOS
|
637
748
|
|
638
749
|
begin
|
639
|
-
|
640
|
-
|
750
|
+
using_memory_logger do |logger|
|
751
|
+
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
752
|
+
assert_equal 2, doc.blocks.size
|
753
|
+
assert_equal ['Unresolved directive in <stdin> - include::fixtures/chapter-a.adoc[]'], doc.blocks[0].lines
|
754
|
+
assert_equal ['trailing content'], doc.blocks[1].lines
|
755
|
+
assert_message logger, :ERROR, '~<stdin>: line 1: include file not readable', Hash
|
641
756
|
end
|
642
|
-
assert_equal 2, doc.blocks.size
|
643
|
-
assert_equal ['Unresolved directive in <stdin> - include::fixtures/chapter-a.adoc[]'], doc.blocks[0].lines
|
644
|
-
assert_equal ['trailing content'], doc.blocks[1].lines
|
645
|
-
assert_includes warnings, 'include file not readable'
|
646
757
|
rescue
|
647
758
|
flunk 'include directive should not raise exception on missing file'
|
648
759
|
ensure
|
@@ -664,7 +775,6 @@ include::#{include_path}[]
|
|
664
775
|
end
|
665
776
|
|
666
777
|
test 'include directive can retrieve data from uri' do
|
667
|
-
#url = 'http://echo.jsontest.com/name/asciidoctor'
|
668
778
|
url = %(http://#{resolve_localhost}:9876/name/asciidoctor)
|
669
779
|
input = <<-EOS
|
670
780
|
....
|
@@ -680,6 +790,92 @@ include::#{url}[]
|
|
680
790
|
assert_match(expect, output)
|
681
791
|
end
|
682
792
|
|
793
|
+
test 'nested include directives are resolved relative to current file' do
|
794
|
+
input = <<-EOS
|
795
|
+
....
|
796
|
+
include::fixtures/outer-include.adoc[]
|
797
|
+
....
|
798
|
+
EOS
|
799
|
+
|
800
|
+
output = render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
801
|
+
expected = 'first line of outer
|
802
|
+
|
803
|
+
first line of middle
|
804
|
+
|
805
|
+
first line of inner
|
806
|
+
|
807
|
+
last line of inner
|
808
|
+
|
809
|
+
last line of middle
|
810
|
+
|
811
|
+
last line of outer'
|
812
|
+
assert_includes output, expected
|
813
|
+
end
|
814
|
+
|
815
|
+
test 'nested remote include directive is resolved relative to uri of current file' do
|
816
|
+
url = %(http://#{resolve_localhost}:9876/fixtures/outer-include.adoc)
|
817
|
+
input = <<-EOS
|
818
|
+
....
|
819
|
+
include::#{url}[]
|
820
|
+
....
|
821
|
+
EOS
|
822
|
+
output = using_test_webserver do
|
823
|
+
render_embedded_string input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
824
|
+
end
|
825
|
+
|
826
|
+
expected = 'first line of outer
|
827
|
+
|
828
|
+
first line of middle
|
829
|
+
|
830
|
+
first line of inner
|
831
|
+
|
832
|
+
last line of inner
|
833
|
+
|
834
|
+
last line of middle
|
835
|
+
|
836
|
+
last line of outer'
|
837
|
+
assert_includes output, expected
|
838
|
+
end
|
839
|
+
|
840
|
+
test 'nested remote include directive that cannot be resolved does not crash processor' do
|
841
|
+
include_url = %(http://#{resolve_localhost}:9876/fixtures/file-with-missing-include.adoc)
|
842
|
+
nested_include_url = 'no-such-file.adoc'
|
843
|
+
input = <<-EOS
|
844
|
+
....
|
845
|
+
include::#{include_url}[]
|
846
|
+
....
|
847
|
+
EOS
|
848
|
+
begin
|
849
|
+
using_memory_logger do |logger|
|
850
|
+
result = using_test_webserver do
|
851
|
+
render_embedded_string input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
852
|
+
end
|
853
|
+
assert_includes result, %(Unresolved directive in #{include_url} - include::#{nested_include_url}[])
|
854
|
+
assert_message logger, :ERROR, %(#{include_url}: line 1: include uri not readable: http://#{resolve_localhost}:9876/fixtures/#{nested_include_url}), Hash
|
855
|
+
end
|
856
|
+
rescue
|
857
|
+
flunk 'include directive should not raise exception on missing file'
|
858
|
+
end
|
859
|
+
end
|
860
|
+
|
861
|
+
test 'tag filtering is supported for remote includes' do
|
862
|
+
url = %(http://#{resolve_localhost}:9876/fixtures/tagged-class.rb)
|
863
|
+
input = <<-EOS
|
864
|
+
[source,ruby]
|
865
|
+
----
|
866
|
+
include::#{url}[tag=init,indent=0]
|
867
|
+
----
|
868
|
+
EOS
|
869
|
+
output = using_test_webserver do
|
870
|
+
render_embedded_string input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
871
|
+
end
|
872
|
+
|
873
|
+
expected = '<code class="language-ruby" data-lang="ruby">def initialize breed
|
874
|
+
@breed = breed
|
875
|
+
end</code>'
|
876
|
+
assert_includes output, expected
|
877
|
+
end
|
878
|
+
|
683
879
|
test 'inaccessible uri referenced by include directive does not crash processor' do
|
684
880
|
url = %(http://#{resolve_localhost}:9876/no_such_file)
|
685
881
|
input = <<-EOS
|
@@ -689,22 +885,20 @@ include::#{url}[]
|
|
689
885
|
EOS
|
690
886
|
|
691
887
|
begin
|
692
|
-
|
693
|
-
redirect_streams do |_, err|
|
888
|
+
using_memory_logger do |logger|
|
694
889
|
output = using_test_webserver do
|
695
890
|
render_embedded_string input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
696
891
|
end
|
697
|
-
|
892
|
+
refute_nil output
|
893
|
+
assert_match(/Unresolved directive/, output)
|
894
|
+
assert_message logger, :ERROR, %(<stdin>: line 2: include uri not readable: #{url}), Hash
|
698
895
|
end
|
699
|
-
refute_nil output
|
700
|
-
assert_match(/Unresolved directive/, output)
|
701
|
-
assert_includes warnings, 'include uri not readable'
|
702
896
|
rescue
|
703
897
|
flunk 'include directive should not raise exception on inaccessible uri'
|
704
898
|
end
|
705
899
|
end
|
706
900
|
|
707
|
-
test 'include directive supports line
|
901
|
+
test 'include directive supports selecting lines by line number' do
|
708
902
|
input = <<-EOS
|
709
903
|
include::fixtures/include-file.asciidoc[lines=1;3..4;6..-1]
|
710
904
|
EOS
|
@@ -721,7 +915,7 @@ include::fixtures/include-file.asciidoc[lines=1;3..4;6..-1]
|
|
721
915
|
assert_match(/last line of included content/, output)
|
722
916
|
end
|
723
917
|
|
724
|
-
test 'include directive supports line
|
918
|
+
test 'include directive supports line ranges specified in quoted attribute value' do
|
725
919
|
input = <<-EOS
|
726
920
|
include::fixtures/include-file.asciidoc[lines="1, 3..4 , 6 .. -1"]
|
727
921
|
EOS
|
@@ -750,7 +944,7 @@ include::fixtures/include-file.asciidoc[lines=]
|
|
750
944
|
assert_includes output, 'last line of included content'
|
751
945
|
end
|
752
946
|
|
753
|
-
test 'include directive supports
|
947
|
+
test 'include directive supports selecting lines by tag' do
|
754
948
|
input = <<-EOS
|
755
949
|
include::fixtures/include-file.asciidoc[tag=snippetA]
|
756
950
|
EOS
|
@@ -762,7 +956,7 @@ include::fixtures/include-file.asciidoc[tag=snippetA]
|
|
762
956
|
refute_match(/included content/, output)
|
763
957
|
end
|
764
958
|
|
765
|
-
test 'include directive supports
|
959
|
+
test 'include directive supports selecting lines by tags' do
|
766
960
|
input = <<-EOS
|
767
961
|
include::fixtures/include-file.asciidoc[tags=snippetA;snippetB]
|
768
962
|
EOS
|
@@ -774,15 +968,16 @@ include::fixtures/include-file.asciidoc[tags=snippetA;snippetB]
|
|
774
968
|
refute_match(/included content/, output)
|
775
969
|
end
|
776
970
|
|
777
|
-
test 'include directive supports
|
971
|
+
test 'include directive supports selecting lines by tag in language that uses circumfix comments' do
|
778
972
|
{
|
779
973
|
'include-file.xml' => '<snippet>content</snippet>',
|
780
|
-
'include-file.ml' => 'let s = SS.empty;;'
|
974
|
+
'include-file.ml' => 'let s = SS.empty;;',
|
975
|
+
'include-file.jsx' => '<p>Welcome to the club.</p>'
|
781
976
|
}.each do |filename, expect|
|
782
977
|
input = <<-EOS
|
783
|
-
[source,xml
|
978
|
+
[source,xml]
|
784
979
|
----
|
785
|
-
include::fixtures/#{filename}[tag=snippet]
|
980
|
+
include::fixtures/#{filename}[tag=snippet,indent=0]
|
786
981
|
----
|
787
982
|
EOS
|
788
983
|
|
@@ -791,7 +986,24 @@ include::fixtures/#{filename}[tag=snippet]
|
|
791
986
|
end
|
792
987
|
end
|
793
988
|
|
794
|
-
test 'include directive
|
989
|
+
test 'include directive supports selecting tagged lines in file that has CRLF endlines' do
|
990
|
+
begin
|
991
|
+
tmp_include = Tempfile.new %w(include- .adoc)
|
992
|
+
tmp_include_dir, tmp_include_path = File.split tmp_include.path
|
993
|
+
tmp_include.write %(do not include\r\ntag::include-me[]\r\nincluded line\r\nend::include-me[]\r\ndo not include\r\n)
|
994
|
+
tmp_include.close
|
995
|
+
input = <<-EOS
|
996
|
+
include::#{tmp_include_path}[tag=include-me]
|
997
|
+
EOS
|
998
|
+
output = render_embedded_string input, :safe => :safe, :base_dir => tmp_include_dir
|
999
|
+
assert_includes output, 'included line'
|
1000
|
+
refute_includes output, 'do not include'
|
1001
|
+
ensure
|
1002
|
+
tmp_include.close!
|
1003
|
+
end
|
1004
|
+
end
|
1005
|
+
|
1006
|
+
test 'include directive does not select lines with tag directives within selected tag region' do
|
795
1007
|
input = <<-EOS
|
796
1008
|
++++
|
797
1009
|
include::fixtures/include-file.asciidoc[tags=snippet]
|
@@ -938,20 +1150,44 @@ end)
|
|
938
1150
|
assert_includes output, expected
|
939
1151
|
end
|
940
1152
|
|
941
|
-
test 'should warn if tag is not found in include file' do
|
1153
|
+
test 'should warn if specified tag is not found in include file' do
|
942
1154
|
input = <<-EOS
|
943
|
-
include::fixtures/include-file.asciidoc[tag=
|
1155
|
+
include::fixtures/include-file.asciidoc[tag=no-such-tag]
|
944
1156
|
EOS
|
945
1157
|
|
946
|
-
|
947
|
-
$stderr = StringIO.new
|
948
|
-
begin
|
1158
|
+
using_memory_logger do |logger|
|
949
1159
|
render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
950
|
-
|
951
|
-
|
952
|
-
|
953
|
-
|
954
|
-
|
1160
|
+
assert_message logger, :WARN, %(~<stdin>: line 1: tag 'no-such-tag' not found in include file), Hash
|
1161
|
+
end
|
1162
|
+
end
|
1163
|
+
|
1164
|
+
test 'should warn if specified tags are not found in include file' do
|
1165
|
+
input = <<-EOS
|
1166
|
+
++++
|
1167
|
+
include::fixtures/include-file.asciidoc[tags=no-such-tag-b;no-such-tag-a]
|
1168
|
+
++++
|
1169
|
+
EOS
|
1170
|
+
|
1171
|
+
using_memory_logger do |logger|
|
1172
|
+
render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
1173
|
+
# NOTE Ruby 1.8 swaps the order of the list for some silly reason
|
1174
|
+
expected_tags = ::RUBY_MIN_VERSION_1_9 ? 'no-such-tag-b, no-such-tag-a' : 'no-such-tag-a, no-such-tag-b'
|
1175
|
+
assert_message logger, :WARN, %(~<stdin>: line 2: tags '#{expected_tags}' not found in include file), Hash
|
1176
|
+
end
|
1177
|
+
end
|
1178
|
+
|
1179
|
+
test 'should warn if specified tag in include file is not closed' do
|
1180
|
+
input = <<-EOS
|
1181
|
+
++++
|
1182
|
+
include::fixtures/unclosed-tag.adoc[tag=a]
|
1183
|
+
++++
|
1184
|
+
EOS
|
1185
|
+
|
1186
|
+
using_memory_logger do |logger|
|
1187
|
+
result = render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
1188
|
+
assert_equal 'a', result
|
1189
|
+
assert_message logger, :WARN, %(~<stdin>: line 2: detected unclosed tag 'a' starting at line 2 of include file), Hash
|
1190
|
+
refute_nil logger.messages[0][:message][:include_location]
|
955
1191
|
end
|
956
1192
|
end
|
957
1193
|
|
@@ -962,12 +1198,29 @@ include::fixtures/mismatched-end-tag.adoc[tags=a;b]
|
|
962
1198
|
++++
|
963
1199
|
EOS
|
964
1200
|
|
965
|
-
|
966
|
-
|
1201
|
+
inc_path = File.join DIRNAME, 'fixtures/mismatched-end-tag.adoc'
|
1202
|
+
using_memory_logger do |logger|
|
1203
|
+
result = render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
1204
|
+
assert_equal %(a\nb), result
|
1205
|
+
assert_message logger, :WARN, %(<stdin>: line 2: mismatched end tag (expected 'b' but found 'a') at line 5 of include file: #{inc_path}), Hash
|
1206
|
+
refute_nil logger.messages[0][:message][:include_location]
|
1207
|
+
end
|
1208
|
+
end
|
1209
|
+
|
1210
|
+
test 'should warn if unexpected end tag is found in included file' do
|
1211
|
+
input = <<-EOS
|
1212
|
+
++++
|
1213
|
+
include::fixtures/unexpected-end-tag.adoc[tags=a]
|
1214
|
+
++++
|
1215
|
+
EOS
|
1216
|
+
|
1217
|
+
inc_path = File.join DIRNAME, 'fixtures/unexpected-end-tag.adoc'
|
1218
|
+
using_memory_logger do |logger|
|
1219
|
+
result = render_embedded_string input, :safe => :safe, :base_dir => DIRNAME
|
1220
|
+
assert_equal 'a', result
|
1221
|
+
assert_message logger, :WARN, %(<stdin>: line 2: unexpected end tag 'a' at line 4 of include file: #{inc_path}), Hash
|
1222
|
+
refute_nil logger.messages[0][:message][:include_location]
|
967
1223
|
end
|
968
|
-
assert_equal %(a\nb), result
|
969
|
-
refute_nil warnings
|
970
|
-
assert_match(/WARNING: .*end tag/, warnings)
|
971
1224
|
end
|
972
1225
|
|
973
1226
|
test 'include directive ignores tags attribute when empty' do
|
@@ -1065,7 +1318,7 @@ include::{fixturesdir}/include-file.{ext}[]
|
|
1065
1318
|
EOS
|
1066
1319
|
|
1067
1320
|
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
1068
|
-
output = doc.
|
1321
|
+
output = doc.convert
|
1069
1322
|
assert_match(/included content/, output)
|
1070
1323
|
end
|
1071
1324
|
|
@@ -1074,13 +1327,13 @@ include::{fixturesdir}/include-file.{ext}[]
|
|
1074
1327
|
include::{foodir}/include-file.asciidoc[]
|
1075
1328
|
EOS
|
1076
1329
|
|
1077
|
-
|
1330
|
+
using_memory_logger do |logger|
|
1078
1331
|
doc = empty_safe_document :base_dir => DIRNAME
|
1079
1332
|
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1080
|
-
|
1333
|
+
line = reader.read_line
|
1334
|
+
assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.asciidoc[]', line
|
1335
|
+
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1081
1336
|
end
|
1082
|
-
assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.asciidoc[]', line
|
1083
|
-
assert_includes warnings, 'dropping line containing reference to missing attribute'
|
1084
1337
|
end
|
1085
1338
|
|
1086
1339
|
test 'line is dropped if target of include directive resolves to empty and attribute-missing attribute is not skip' do
|
@@ -1088,13 +1341,13 @@ include::{foodir}/include-file.asciidoc[]
|
|
1088
1341
|
include::{foodir}/include-file.asciidoc[]
|
1089
1342
|
EOS
|
1090
1343
|
|
1091
|
-
|
1344
|
+
using_memory_logger do |logger|
|
1092
1345
|
doc = empty_safe_document :base_dir => DIRNAME, :attributes => {'attribute-missing' => 'drop'}
|
1093
1346
|
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1094
|
-
|
1347
|
+
line = reader.read_line
|
1348
|
+
assert_nil line
|
1349
|
+
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1095
1350
|
end
|
1096
|
-
assert_nil line
|
1097
|
-
assert_includes warnings, 'dropping line containing reference to missing attribute'
|
1098
1351
|
end
|
1099
1352
|
|
1100
1353
|
test 'line following dropped include is not dropped' do
|
@@ -1103,13 +1356,13 @@ include::{foodir}/include-file.asciidoc[]
|
|
1103
1356
|
yo
|
1104
1357
|
EOS
|
1105
1358
|
|
1106
|
-
|
1359
|
+
using_memory_logger do |logger|
|
1107
1360
|
doc = empty_safe_document :base_dir => DIRNAME, :attributes => {'attribute-missing' => 'drop'}
|
1108
1361
|
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1109
|
-
|
1362
|
+
line = reader.read_line
|
1363
|
+
assert_equal 'yo', line
|
1364
|
+
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1110
1365
|
end
|
1111
|
-
assert_equal 'yo', line
|
1112
|
-
assert_includes warnings, 'dropping line containing reference to missing attribute'
|
1113
1366
|
end
|
1114
1367
|
|
1115
1368
|
test 'escaped include directive is left unprocessed' do
|
@@ -1163,14 +1416,14 @@ include::include-file.asciidoc[]
|
|
1163
1416
|
include::fixtures/parent-include.adoc[depth=1]
|
1164
1417
|
EOS
|
1165
1418
|
|
1166
|
-
|
1419
|
+
using_memory_logger do |logger|
|
1167
1420
|
pseudo_docfile = File.join DIRNAME, 'include-master.adoc'
|
1168
1421
|
doc = empty_safe_document :base_dir => DIRNAME
|
1169
1422
|
reader = Asciidoctor::PreprocessorReader.new doc, input, Asciidoctor::Reader::Cursor.new(pseudo_docfile), :normalize => true
|
1170
|
-
|
1423
|
+
lines = reader.readlines
|
1424
|
+
assert_includes lines, 'include::child-include.adoc[]'
|
1425
|
+
assert_message logger, :ERROR, 'fixtures/parent-include.adoc: line 3: maximum include depth of 1 exceeded', Hash
|
1171
1426
|
end
|
1172
|
-
assert lines.include?('include::child-include.adoc[]')
|
1173
|
-
assert_match(/maximum include depth .* exceeded/, warnings)
|
1174
1427
|
end
|
1175
1428
|
|
1176
1429
|
test 'include directive should be disabled if max include depth set in nested context has been exceeded' do
|
@@ -1178,15 +1431,15 @@ include::fixtures/parent-include.adoc[depth=1]
|
|
1178
1431
|
include::fixtures/parent-include-restricted.adoc[depth=3]
|
1179
1432
|
EOS
|
1180
1433
|
|
1181
|
-
|
1434
|
+
using_memory_logger do |logger|
|
1182
1435
|
pseudo_docfile = File.join DIRNAME, 'include-master.adoc'
|
1183
1436
|
doc = empty_safe_document :base_dir => DIRNAME
|
1184
1437
|
reader = Asciidoctor::PreprocessorReader.new doc, input, Asciidoctor::Reader::Cursor.new(pseudo_docfile), :normalize => true
|
1185
|
-
|
1438
|
+
lines = reader.readlines
|
1439
|
+
assert_includes lines, 'first line of child'
|
1440
|
+
assert_includes lines, 'include::grandchild-include.adoc[]'
|
1441
|
+
assert_message logger, :ERROR, 'fixtures/child-include.adoc: line 3: maximum include depth of 1 exceeded', Hash
|
1186
1442
|
end
|
1187
|
-
assert lines.include?('first line of child')
|
1188
|
-
assert lines.include?('include::grandchild-include.adoc[]')
|
1189
|
-
assert_match(/maximum include depth .* exceeded/, warnings)
|
1190
1443
|
end
|
1191
1444
|
|
1192
1445
|
test 'read_lines_until should not process lines if process option is false' do
|
@@ -1210,10 +1463,13 @@ include::fixtures/no-such-file.adoc[]
|
|
1210
1463
|
////
|
1211
1464
|
EOS
|
1212
1465
|
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
|
1466
|
+
using_memory_logger do |logger|
|
1467
|
+
doc = empty_safe_document :base_dir => DIRNAME
|
1468
|
+
reader = Asciidoctor::PreprocessorReader.new doc, lines, nil, :normalize => true
|
1469
|
+
reader.skip_comment_lines
|
1470
|
+
assert reader.empty?
|
1471
|
+
assert logger.empty?
|
1472
|
+
end
|
1217
1473
|
end
|
1218
1474
|
end
|
1219
1475
|
|