asciidoctor 1.5.8 → 2.0.0.rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +162 -17
- data/LICENSE +1 -1
- data/README-de.adoc +12 -13
- data/README-fr.adoc +11 -12
- data/README-jp.adoc +11 -12
- data/README-zh_CN.adoc +12 -13
- data/README.adoc +6 -7
- data/asciidoctor.gemspec +19 -24
- data/bin/asciidoctor +5 -4
- data/data/reference/syntax.adoc +283 -0
- data/data/stylesheets/asciidoctor-default.css +56 -52
- data/data/stylesheets/coderay-asciidoctor.css +7 -9
- data/lib/asciidoctor.rb +171 -232
- data/lib/asciidoctor/abstract_block.rb +96 -105
- data/lib/asciidoctor/abstract_node.rb +118 -139
- data/lib/asciidoctor/attribute_list.rb +10 -14
- data/lib/asciidoctor/block.rb +20 -19
- data/lib/asciidoctor/callouts.rb +4 -2
- data/lib/asciidoctor/cli.rb +3 -2
- data/lib/asciidoctor/cli/invoker.rb +14 -21
- data/lib/asciidoctor/cli/options.rb +64 -54
- data/lib/asciidoctor/converter.rb +357 -185
- data/lib/asciidoctor/converter/composite.rb +40 -48
- data/lib/asciidoctor/converter/docbook5.rb +604 -640
- data/lib/asciidoctor/converter/html5.rb +949 -963
- data/lib/asciidoctor/converter/manpage.rb +569 -548
- data/lib/asciidoctor/converter/template.rb +231 -272
- data/lib/asciidoctor/core_ext.rb +5 -18
- data/lib/asciidoctor/core_ext/float/truncate.rb +19 -0
- data/lib/asciidoctor/core_ext/match_data/names.rb +7 -0
- data/lib/asciidoctor/core_ext/nil_or_empty.rb +1 -0
- data/lib/asciidoctor/core_ext/regexp/is_match.rb +4 -2
- data/lib/asciidoctor/document.rb +399 -377
- data/lib/asciidoctor/extensions.rb +72 -140
- data/lib/asciidoctor/helpers.rb +122 -83
- data/lib/asciidoctor/inline.rb +5 -1
- data/lib/asciidoctor/list.rb +13 -11
- data/lib/asciidoctor/logging.rb +17 -16
- data/lib/asciidoctor/parser.rb +390 -423
- data/lib/asciidoctor/path_resolver.rb +10 -5
- data/lib/asciidoctor/reader.rb +286 -263
- data/lib/asciidoctor/rouge_ext.rb +39 -0
- data/lib/asciidoctor/section.rb +9 -8
- data/lib/asciidoctor/stylesheets.rb +19 -37
- data/lib/asciidoctor/substitutors.rb +364 -509
- data/lib/asciidoctor/syntax_highlighter.rb +238 -0
- data/lib/asciidoctor/syntax_highlighter/coderay.rb +87 -0
- data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +26 -0
- data/lib/asciidoctor/syntax_highlighter/html_pipeline.rb +10 -0
- data/lib/asciidoctor/syntax_highlighter/prettify.rb +27 -0
- data/lib/asciidoctor/syntax_highlighter/pygments.rb +149 -0
- data/lib/asciidoctor/syntax_highlighter/rouge.rb +129 -0
- data/lib/asciidoctor/table.rb +73 -66
- data/lib/asciidoctor/timings.rb +4 -2
- data/lib/asciidoctor/version.rb +2 -1
- data/lib/asciidoctor/writer.rb +30 -0
- data/man/asciidoctor.1 +19 -15
- data/man/asciidoctor.adoc +14 -12
- metadata +69 -216
- data/CONTRIBUTING.adoc +0 -185
- data/Gemfile +0 -60
- data/Rakefile +0 -129
- data/bin/asciidoctor-safe +0 -15
- data/features/open_block.feature +0 -92
- data/features/pass_block.feature +0 -66
- data/features/step_definitions.rb +0 -49
- data/features/text_formatting.feature +0 -57
- data/features/xref.feature +0 -1039
- data/lib/asciidoctor/converter/base.rb +0 -59
- data/lib/asciidoctor/converter/docbook45.rb +0 -93
- data/lib/asciidoctor/converter/factory.rb +0 -226
- data/lib/asciidoctor/core_ext/1.8.7/base64/strict_encode64.rb +0 -6
- data/lib/asciidoctor/core_ext/1.8.7/concurrent/hash.rb +0 -5
- data/lib/asciidoctor/core_ext/1.8.7/hash/key.rb +0 -4
- data/lib/asciidoctor/core_ext/1.8.7/io/binread.rb +0 -6
- data/lib/asciidoctor/core_ext/1.8.7/io/write.rb +0 -5
- data/lib/asciidoctor/core_ext/1.8.7/string/chr.rb +0 -6
- data/lib/asciidoctor/core_ext/1.8.7/string/limit_bytesize.rb +0 -29
- data/lib/asciidoctor/core_ext/1.8.7/symbol/empty.rb +0 -6
- data/lib/asciidoctor/core_ext/1.8.7/symbol/length.rb +0 -6
- data/lib/asciidoctor/core_ext/string/limit_bytesize.rb +0 -10
- data/test/api_test.rb +0 -1240
- data/test/attribute_list_test.rb +0 -242
- data/test/attributes_test.rb +0 -1623
- data/test/blocks_test.rb +0 -3870
- data/test/converter_test.rb +0 -470
- data/test/document_test.rb +0 -1853
- data/test/extensions_test.rb +0 -1560
- data/test/fixtures/asciidoc_index.txt +0 -521
- data/test/fixtures/basic-docinfo-footer.html +0 -6
- data/test/fixtures/basic-docinfo-footer.xml +0 -8
- data/test/fixtures/basic-docinfo.html +0 -1
- data/test/fixtures/basic-docinfo.xml +0 -4
- data/test/fixtures/basic.asciidoc +0 -5
- data/test/fixtures/chapter-a.adoc +0 -3
- data/test/fixtures/child-include.adoc +0 -5
- data/test/fixtures/circle.svg +0 -9
- data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +0 -6
- data/test/fixtures/custom-backends/haml/docbook45/block_paragraph.xml.haml +0 -6
- data/test/fixtures/custom-backends/haml/html5-tweaks/block_paragraph.html.haml +0 -1
- data/test/fixtures/custom-backends/haml/html5/block_paragraph.html.haml +0 -3
- data/test/fixtures/custom-backends/haml/html5/block_sidebar.html.haml +0 -5
- data/test/fixtures/custom-backends/slim/docbook45/block_paragraph.xml.slim +0 -6
- data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +0 -3
- data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +0 -5
- data/test/fixtures/custom-docinfodir/basic-docinfo.html +0 -1
- data/test/fixtures/custom-docinfodir/docinfo.html +0 -1
- data/test/fixtures/docinfo-footer.html +0 -1
- data/test/fixtures/docinfo-footer.xml +0 -9
- data/test/fixtures/docinfo.html +0 -1
- data/test/fixtures/docinfo.xml +0 -3
- data/test/fixtures/doctime-localtime.adoc +0 -2
- data/test/fixtures/dot.gif +0 -0
- data/test/fixtures/encoding.asciidoc +0 -13
- data/test/fixtures/file-with-missing-include.adoc +0 -1
- data/test/fixtures/grandchild-include.adoc +0 -3
- data/test/fixtures/hello-asciidoctor.pdf +0 -69
- data/test/fixtures/include-file.asciidoc +0 -24
- data/test/fixtures/include-file.jsx +0 -8
- data/test/fixtures/include-file.ml +0 -3
- data/test/fixtures/include-file.xml +0 -5
- data/test/fixtures/lists.adoc +0 -96
- data/test/fixtures/master.adoc +0 -5
- data/test/fixtures/mismatched-end-tag.adoc +0 -7
- data/test/fixtures/other-chapters.adoc +0 -11
- data/test/fixtures/outer-include.adoc +0 -5
- data/test/fixtures/parent-include-restricted.adoc +0 -5
- data/test/fixtures/parent-include.adoc +0 -5
- data/test/fixtures/sample.asciidoc +0 -30
- data/test/fixtures/section-a.adoc +0 -4
- data/test/fixtures/stylesheets/custom.css +0 -3
- data/test/fixtures/subdir/index.adoc +0 -3
- data/test/fixtures/subdir/inner-include.adoc +0 -3
- data/test/fixtures/subdir/middle-include.adoc +0 -5
- data/test/fixtures/subs-docinfo.html +0 -2
- data/test/fixtures/subs.adoc +0 -6
- data/test/fixtures/tagged-class-enclosed.rb +0 -25
- data/test/fixtures/tagged-class.rb +0 -23
- data/test/fixtures/tip.gif +0 -0
- data/test/fixtures/unclosed-tag.adoc +0 -3
- data/test/fixtures/unexpected-end-tag.adoc +0 -4
- data/test/invoker_test.rb +0 -745
- data/test/links_test.rb +0 -855
- data/test/lists_test.rb +0 -5151
- data/test/logger_test.rb +0 -211
- data/test/manpage_test.rb +0 -660
- data/test/options_test.rb +0 -262
- data/test/paragraphs_test.rb +0 -562
- data/test/parser_test.rb +0 -742
- data/test/paths_test.rb +0 -395
- data/test/preamble_test.rb +0 -173
- data/test/reader_test.rb +0 -2161
- data/test/sections_test.rb +0 -3575
- data/test/substitutions_test.rb +0 -2066
- data/test/tables_test.rb +0 -2036
- data/test/test_helper.rb +0 -447
- data/test/text_test.rb +0 -309
data/test/reader_test.rb
DELETED
@@ -1,2161 +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
|
-
class ReaderTest < Minitest::Test
|
8
|
-
DIRNAME = File.expand_path File.dirname __FILE__
|
9
|
-
|
10
|
-
SAMPLE_DATA = <<-EOS.chomp.split(::Asciidoctor::LF)
|
11
|
-
first line
|
12
|
-
second line
|
13
|
-
third line
|
14
|
-
EOS
|
15
|
-
|
16
|
-
context 'Reader' do
|
17
|
-
context 'Prepare lines' do
|
18
|
-
test 'should prepare lines from Array data' do
|
19
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
20
|
-
assert_equal SAMPLE_DATA, reader.lines
|
21
|
-
end
|
22
|
-
|
23
|
-
test 'should prepare lines from String data' do
|
24
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
25
|
-
assert_equal SAMPLE_DATA, reader.lines
|
26
|
-
end
|
27
|
-
|
28
|
-
test 'should remove UTF-8 BOM from first line of String data' do
|
29
|
-
data = "\xef\xbb\xbf#{SAMPLE_DATA.join ::Asciidoctor::LF}"
|
30
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
31
|
-
assert_equal 'f', reader.lines.first.chr
|
32
|
-
assert_equal SAMPLE_DATA, reader.lines
|
33
|
-
end
|
34
|
-
|
35
|
-
test 'should remove UTF-8 BOM from first line of Array data' do
|
36
|
-
data = SAMPLE_DATA.dup
|
37
|
-
data[0] = "\xef\xbb\xbf#{data.first}"
|
38
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
39
|
-
assert_equal 'f', reader.lines.first.chr
|
40
|
-
assert_equal SAMPLE_DATA, reader.lines
|
41
|
-
end
|
42
|
-
|
43
|
-
if Asciidoctor::COERCE_ENCODING
|
44
|
-
test 'should encode UTF-16LE string to UTF-8 when BOM is found' do
|
45
|
-
data = "\ufeff#{SAMPLE_DATA.join ::Asciidoctor::LF}".encode('UTF-16LE').force_encoding('UTF-8')
|
46
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
47
|
-
assert_equal 'f', reader.lines.first.chr
|
48
|
-
assert_equal SAMPLE_DATA, reader.lines
|
49
|
-
end
|
50
|
-
|
51
|
-
test 'should encode UTF-16LE string array to UTF-8 when BOM is found' do
|
52
|
-
data = "\ufeff#{SAMPLE_DATA.join ::Asciidoctor::LF}".encode('UTF-16LE').force_encoding('UTF-8').lines.to_a
|
53
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
54
|
-
assert_equal 'f', reader.lines.first.chr
|
55
|
-
assert_equal SAMPLE_DATA, reader.lines
|
56
|
-
end
|
57
|
-
|
58
|
-
test 'should encode UTF-16BE string to UTF-8 when BOM is found' do
|
59
|
-
data = "\ufeff#{SAMPLE_DATA.join ::Asciidoctor::LF}".encode('UTF-16BE').force_encoding('UTF-8')
|
60
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
61
|
-
assert_equal 'f', reader.lines.first.chr
|
62
|
-
assert_equal SAMPLE_DATA, reader.lines
|
63
|
-
end
|
64
|
-
|
65
|
-
test 'should encode UTF-16BE string array to UTF-8 when BOM is found' do
|
66
|
-
data = "\ufeff#{SAMPLE_DATA.join ::Asciidoctor::LF}".encode('UTF-16BE').force_encoding('UTF-8').lines.to_a
|
67
|
-
reader = Asciidoctor::Reader.new data, nil, :normalize => true
|
68
|
-
assert_equal 'f', reader.lines.first.chr
|
69
|
-
assert_equal SAMPLE_DATA, reader.lines
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
context 'With empty data' do
|
75
|
-
test 'has_more_lines? should return false with empty data' do
|
76
|
-
refute Asciidoctor::Reader.new.has_more_lines?
|
77
|
-
end
|
78
|
-
|
79
|
-
test 'empty? should return true with empty data' do
|
80
|
-
assert Asciidoctor::Reader.new.empty?
|
81
|
-
assert Asciidoctor::Reader.new.eof?
|
82
|
-
end
|
83
|
-
|
84
|
-
test 'next_line_empty? should return true with empty data' do
|
85
|
-
assert Asciidoctor::Reader.new.next_line_empty?
|
86
|
-
end
|
87
|
-
|
88
|
-
test 'peek_line should return nil with empty data' do
|
89
|
-
assert_nil Asciidoctor::Reader.new.peek_line
|
90
|
-
end
|
91
|
-
|
92
|
-
test 'peek_lines should return empty Array with empty data' do
|
93
|
-
assert_equal [], Asciidoctor::Reader.new.peek_lines(1)
|
94
|
-
end
|
95
|
-
|
96
|
-
test 'read_line should return nil with empty data' do
|
97
|
-
assert_nil Asciidoctor::Reader.new.read_line
|
98
|
-
#assert_nil Asciidoctor::Reader.new.get_line
|
99
|
-
end
|
100
|
-
|
101
|
-
test 'read_lines should return empty Array with empty data' do
|
102
|
-
assert_equal [], Asciidoctor::Reader.new.read_lines
|
103
|
-
#assert_equal [], Asciidoctor::Reader.new.get_lines
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
context 'With data' do
|
108
|
-
test 'has_more_lines? should return true if there are lines remaining' do
|
109
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
110
|
-
assert reader.has_more_lines?
|
111
|
-
end
|
112
|
-
|
113
|
-
test 'empty? should return false if there are lines remaining' do
|
114
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
115
|
-
refute reader.empty?
|
116
|
-
refute reader.eof?
|
117
|
-
end
|
118
|
-
|
119
|
-
test 'next_line_empty? should return false if next line is not blank' do
|
120
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
121
|
-
refute reader.next_line_empty?
|
122
|
-
end
|
123
|
-
|
124
|
-
test 'next_line_empty? should return true if next line is blank' do
|
125
|
-
reader = Asciidoctor::Reader.new ['', 'second line']
|
126
|
-
assert reader.next_line_empty?
|
127
|
-
end
|
128
|
-
|
129
|
-
test 'peek_line should return next line if there are lines remaining' do
|
130
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
131
|
-
assert_equal SAMPLE_DATA.first, reader.peek_line
|
132
|
-
end
|
133
|
-
|
134
|
-
test 'peek_line should not consume line or increment line number' do
|
135
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
136
|
-
assert_equal SAMPLE_DATA.first, reader.peek_line
|
137
|
-
assert_equal SAMPLE_DATA.first, reader.peek_line
|
138
|
-
assert_equal 1, reader.lineno
|
139
|
-
end
|
140
|
-
|
141
|
-
test 'peek_line should return next lines if there are lines remaining' do
|
142
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
143
|
-
assert_equal SAMPLE_DATA[0..1], reader.peek_lines(2)
|
144
|
-
end
|
145
|
-
|
146
|
-
test 'peek_lines should not consume lines or increment line number' do
|
147
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
148
|
-
assert_equal SAMPLE_DATA[0..1], reader.peek_lines(2)
|
149
|
-
assert_equal SAMPLE_DATA[0..1], reader.peek_lines(2)
|
150
|
-
assert_equal 1, reader.lineno
|
151
|
-
end
|
152
|
-
|
153
|
-
test 'peek_lines should not increment line number if reader overruns buffer' do
|
154
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
155
|
-
assert_equal SAMPLE_DATA, (reader.peek_lines SAMPLE_DATA.size * 2)
|
156
|
-
assert_equal 1, reader.lineno
|
157
|
-
end
|
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
|
-
|
165
|
-
test 'peek_lines should not invert order of lines' do
|
166
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
167
|
-
assert_equal SAMPLE_DATA, reader.lines
|
168
|
-
reader.peek_lines 3
|
169
|
-
assert_equal SAMPLE_DATA, reader.lines
|
170
|
-
end
|
171
|
-
|
172
|
-
test 'read_line should return next line if there are lines remaining' do
|
173
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
174
|
-
assert_equal SAMPLE_DATA.first, reader.read_line
|
175
|
-
end
|
176
|
-
|
177
|
-
test 'read_line should consume next line and increment line number' do
|
178
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
179
|
-
assert_equal SAMPLE_DATA[0], reader.read_line
|
180
|
-
assert_equal SAMPLE_DATA[1], reader.read_line
|
181
|
-
assert_equal 3, reader.lineno
|
182
|
-
end
|
183
|
-
|
184
|
-
test 'advance should consume next line and return a Boolean indicating if a line was consumed' do
|
185
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
186
|
-
assert reader.advance
|
187
|
-
assert reader.advance
|
188
|
-
assert reader.advance
|
189
|
-
refute reader.advance
|
190
|
-
end
|
191
|
-
|
192
|
-
test 'read_lines should return all lines' do
|
193
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
194
|
-
assert_equal SAMPLE_DATA, reader.read_lines
|
195
|
-
end
|
196
|
-
|
197
|
-
test 'read should return all lines joined as String' do
|
198
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
199
|
-
assert_equal SAMPLE_DATA.join(::Asciidoctor::LF), reader.read
|
200
|
-
end
|
201
|
-
|
202
|
-
test 'has_more_lines? should return false after read_lines is invoked' do
|
203
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
204
|
-
reader.read_lines
|
205
|
-
refute reader.has_more_lines?
|
206
|
-
end
|
207
|
-
|
208
|
-
test 'unshift puts line onto Reader as next line to read' do
|
209
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA, nil, :normalize => true
|
210
|
-
reader.unshift 'line zero'
|
211
|
-
assert_equal 'line zero', reader.peek_line
|
212
|
-
assert_equal 'line zero', reader.read_line
|
213
|
-
assert_equal 1, reader.lineno
|
214
|
-
end
|
215
|
-
|
216
|
-
test 'terminate should consume all lines and update line number' do
|
217
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
218
|
-
reader.terminate
|
219
|
-
assert reader.eof?
|
220
|
-
assert_equal 4, reader.lineno
|
221
|
-
end
|
222
|
-
|
223
|
-
test 'skip_blank_lines should skip blank lines' do
|
224
|
-
reader = Asciidoctor::Reader.new ['', ''].concat(SAMPLE_DATA)
|
225
|
-
reader.skip_blank_lines
|
226
|
-
assert_equal SAMPLE_DATA.first, reader.peek_line
|
227
|
-
end
|
228
|
-
|
229
|
-
test 'lines should return remaining lines' do
|
230
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
231
|
-
reader.read_line
|
232
|
-
assert_equal SAMPLE_DATA[1..-1], reader.lines
|
233
|
-
end
|
234
|
-
|
235
|
-
test 'source_lines should return copy of original data Array' do
|
236
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
237
|
-
reader.read_lines
|
238
|
-
assert_equal SAMPLE_DATA, reader.source_lines
|
239
|
-
end
|
240
|
-
|
241
|
-
test 'source should return original data Array joined as String' do
|
242
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA
|
243
|
-
reader.read_lines
|
244
|
-
assert_equal SAMPLE_DATA.join(::Asciidoctor::LF), reader.source
|
245
|
-
end
|
246
|
-
|
247
|
-
end
|
248
|
-
|
249
|
-
context 'Line context' do
|
250
|
-
test 'to_s should return file name and line number of current line' do
|
251
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA, 'sample.adoc'
|
252
|
-
reader.read_line
|
253
|
-
assert_equal 'sample.adoc: line 2', reader.to_s
|
254
|
-
end
|
255
|
-
|
256
|
-
test 'line_info should return file name and line number of current line' do
|
257
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA, 'sample.adoc'
|
258
|
-
reader.read_line
|
259
|
-
assert_equal 'sample.adoc: line 2', reader.line_info
|
260
|
-
assert_equal 'sample.adoc: line 2', reader.cursor.to_s
|
261
|
-
end
|
262
|
-
|
263
|
-
test 'cursor_at_prev_line should return file name and line number of previous line read' do
|
264
|
-
reader = Asciidoctor::Reader.new SAMPLE_DATA, 'sample.adoc'
|
265
|
-
reader.read_line
|
266
|
-
assert_equal 'sample.adoc: line 1', reader.cursor_at_prev_line.to_s
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'Read lines until' do
|
271
|
-
test 'Read lines until until end' do
|
272
|
-
lines = <<-EOS.lines.entries
|
273
|
-
This is one paragraph.
|
274
|
-
|
275
|
-
This is another paragraph.
|
276
|
-
EOS
|
277
|
-
|
278
|
-
reader = Asciidoctor::Reader.new lines, nil, :normalize => true
|
279
|
-
result = reader.read_lines_until
|
280
|
-
assert_equal 3, result.size
|
281
|
-
assert_equal lines.map {|l| l.chomp }, result
|
282
|
-
refute reader.has_more_lines?
|
283
|
-
assert reader.eof?
|
284
|
-
end
|
285
|
-
|
286
|
-
test 'Read lines until until blank line' do
|
287
|
-
lines = <<-EOS.lines.entries
|
288
|
-
This is one paragraph.
|
289
|
-
|
290
|
-
This is another paragraph.
|
291
|
-
EOS
|
292
|
-
|
293
|
-
reader = Asciidoctor::Reader.new lines, nil, :normalize => true
|
294
|
-
result = reader.read_lines_until :break_on_blank_lines => true
|
295
|
-
assert_equal 1, result.size
|
296
|
-
assert_equal lines.first.chomp, result.first
|
297
|
-
assert_equal lines.last.chomp, reader.peek_line
|
298
|
-
end
|
299
|
-
|
300
|
-
test 'Read lines until until blank line preserving last line' do
|
301
|
-
lines = <<-EOS.chomp.split(::Asciidoctor::LF)
|
302
|
-
This is one paragraph.
|
303
|
-
|
304
|
-
This is another paragraph.
|
305
|
-
EOS
|
306
|
-
|
307
|
-
reader = Asciidoctor::Reader.new lines
|
308
|
-
result = reader.read_lines_until :break_on_blank_lines => true, :preserve_last_line => true
|
309
|
-
assert_equal 1, result.size
|
310
|
-
assert_equal lines.first.chomp, result.first
|
311
|
-
assert reader.next_line_empty?
|
312
|
-
end
|
313
|
-
|
314
|
-
test 'Read lines until until condition is true' do
|
315
|
-
lines = <<-EOS.chomp.split(::Asciidoctor::LF)
|
316
|
-
--
|
317
|
-
This is one paragraph inside the block.
|
318
|
-
|
319
|
-
This is another paragraph inside the block.
|
320
|
-
--
|
321
|
-
|
322
|
-
This is a paragraph outside the block.
|
323
|
-
EOS
|
324
|
-
|
325
|
-
reader = Asciidoctor::Reader.new lines
|
326
|
-
reader.read_line
|
327
|
-
result = reader.read_lines_until {|line| line == '--' }
|
328
|
-
assert_equal 3, result.size
|
329
|
-
assert_equal lines[1, 3], result
|
330
|
-
assert reader.next_line_empty?
|
331
|
-
end
|
332
|
-
|
333
|
-
test 'Read lines until until condition is true, taking last line' do
|
334
|
-
lines = <<-EOS.chomp.split(::Asciidoctor::LF)
|
335
|
-
--
|
336
|
-
This is one paragraph inside the block.
|
337
|
-
|
338
|
-
This is another paragraph inside the block.
|
339
|
-
--
|
340
|
-
|
341
|
-
This is a paragraph outside the block.
|
342
|
-
EOS
|
343
|
-
|
344
|
-
reader = Asciidoctor::Reader.new lines
|
345
|
-
reader.read_line
|
346
|
-
result = reader.read_lines_until(:read_last_line => true) {|line| line == '--' }
|
347
|
-
assert_equal 4, result.size
|
348
|
-
assert_equal lines[1, 4], result
|
349
|
-
assert reader.next_line_empty?
|
350
|
-
end
|
351
|
-
|
352
|
-
test 'Read lines until until condition is true, taking and preserving last line' do
|
353
|
-
lines = <<-EOS.chomp.split(::Asciidoctor::LF)
|
354
|
-
--
|
355
|
-
This is one paragraph inside the block.
|
356
|
-
|
357
|
-
This is another paragraph inside the block.
|
358
|
-
--
|
359
|
-
|
360
|
-
This is a paragraph outside the block.
|
361
|
-
EOS
|
362
|
-
|
363
|
-
reader = Asciidoctor::Reader.new lines
|
364
|
-
reader.read_line
|
365
|
-
result = reader.read_lines_until(:read_last_line => true, :preserve_last_line => true) {|line| line == '--' }
|
366
|
-
assert_equal 4, result.size
|
367
|
-
assert_equal lines[1, 4], result
|
368
|
-
assert_equal '--', reader.peek_line
|
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
|
414
|
-
end
|
415
|
-
end
|
416
|
-
|
417
|
-
context 'PreprocessorReader' do
|
418
|
-
context 'Type hierarchy' do
|
419
|
-
test 'PreprocessorReader should extend from Reader' do
|
420
|
-
reader = empty_document.reader
|
421
|
-
assert_kind_of Asciidoctor::PreprocessorReader, reader
|
422
|
-
end
|
423
|
-
|
424
|
-
test 'PreprocessorReader should invoke or emulate Reader initializer' do
|
425
|
-
doc = Asciidoctor::Document.new SAMPLE_DATA
|
426
|
-
reader = doc.reader
|
427
|
-
assert_equal SAMPLE_DATA, reader.lines
|
428
|
-
assert_equal 1, reader.lineno
|
429
|
-
end
|
430
|
-
end
|
431
|
-
|
432
|
-
context 'Prepare lines' do
|
433
|
-
test 'should prepare and normalize lines from Array data' do
|
434
|
-
data = SAMPLE_DATA.map {|line| line.chomp}
|
435
|
-
data.unshift ''
|
436
|
-
data.push ''
|
437
|
-
doc = Asciidoctor::Document.new data
|
438
|
-
reader = doc.reader
|
439
|
-
assert_equal SAMPLE_DATA, reader.lines
|
440
|
-
end
|
441
|
-
|
442
|
-
test 'should prepare and normalize lines from String data' do
|
443
|
-
data = SAMPLE_DATA.map {|line| line.chomp}
|
444
|
-
data.unshift ' '
|
445
|
-
data.push ' '
|
446
|
-
data_as_string = data * ::Asciidoctor::LF
|
447
|
-
doc = Asciidoctor::Document.new data_as_string
|
448
|
-
reader = doc.reader
|
449
|
-
assert_equal SAMPLE_DATA, reader.lines
|
450
|
-
end
|
451
|
-
|
452
|
-
test 'should clean CRLF from end of lines' do
|
453
|
-
input = <<-EOS
|
454
|
-
source\r
|
455
|
-
with\r
|
456
|
-
CRLF\r
|
457
|
-
endlines\r
|
458
|
-
EOS
|
459
|
-
|
460
|
-
[input, input.lines.to_a, input.split(::Asciidoctor::LF), input.split(::Asciidoctor::LF).join(::Asciidoctor::LF)].each do |lines|
|
461
|
-
doc = Asciidoctor::Document.new lines
|
462
|
-
reader = doc.reader
|
463
|
-
reader.lines.each do |line|
|
464
|
-
refute line.end_with?("\r"), "CRLF not properly cleaned for source lines: #{lines.inspect}"
|
465
|
-
refute line.end_with?("\r\n"), "CRLF not properly cleaned for source lines: #{lines.inspect}"
|
466
|
-
refute line.end_with?("\n"), "CRLF not properly cleaned for source lines: #{lines.inspect}"
|
467
|
-
end
|
468
|
-
end
|
469
|
-
end
|
470
|
-
|
471
|
-
test 'should not skip front matter by default' do
|
472
|
-
input = <<-EOS
|
473
|
-
---
|
474
|
-
layout: post
|
475
|
-
title: Document Title
|
476
|
-
author: username
|
477
|
-
tags: [ first, second ]
|
478
|
-
---
|
479
|
-
= Document Title
|
480
|
-
Author Name
|
481
|
-
|
482
|
-
preamble
|
483
|
-
EOS
|
484
|
-
|
485
|
-
doc = Asciidoctor::Document.new input
|
486
|
-
reader = doc.reader
|
487
|
-
refute doc.attributes.key?('front-matter')
|
488
|
-
assert_equal '---', reader.peek_line
|
489
|
-
end
|
490
|
-
|
491
|
-
test 'should skip front matter if specified by skip-front-matter attribute' do
|
492
|
-
front_matter = %(layout: post
|
493
|
-
title: Document Title
|
494
|
-
author: username
|
495
|
-
tags: [ first, second ])
|
496
|
-
input = <<-EOS
|
497
|
-
---
|
498
|
-
#{front_matter}
|
499
|
-
---
|
500
|
-
= Document Title
|
501
|
-
Author Name
|
502
|
-
|
503
|
-
preamble
|
504
|
-
EOS
|
505
|
-
|
506
|
-
doc = Asciidoctor::Document.new input, :attributes => {'skip-front-matter' => ''}
|
507
|
-
reader = doc.reader
|
508
|
-
assert_equal '= Document Title', reader.peek_line
|
509
|
-
assert_equal front_matter, doc.attributes['front-matter']
|
510
|
-
end
|
511
|
-
end
|
512
|
-
|
513
|
-
context 'Include Stack' do
|
514
|
-
test 'PreprocessorReader#push_include method should return reader' do
|
515
|
-
reader = empty_document.reader
|
516
|
-
append_lines = %w(one two three)
|
517
|
-
result = reader.push_include append_lines, '<stdin>', '<stdin>'
|
518
|
-
assert_equal reader, result
|
519
|
-
end
|
520
|
-
|
521
|
-
test 'PreprocessorReader#push_include method should put lines on top of stack' do
|
522
|
-
lines = %w(a b c)
|
523
|
-
doc = Asciidoctor::Document.new lines
|
524
|
-
reader = doc.reader
|
525
|
-
append_lines = %w(one two three)
|
526
|
-
reader.push_include append_lines, '', '<stdin>'
|
527
|
-
assert_equal 1, reader.include_stack.size
|
528
|
-
assert_equal 'one', reader.read_line.rstrip
|
529
|
-
end
|
530
|
-
|
531
|
-
test 'PreprocessorReader#push_include method should gracefully handle file and path' do
|
532
|
-
lines = %w(a b c)
|
533
|
-
doc = Asciidoctor::Document.new lines
|
534
|
-
reader = doc.reader
|
535
|
-
append_lines = %w(one two three)
|
536
|
-
reader.push_include append_lines
|
537
|
-
assert_equal 1, reader.include_stack.size
|
538
|
-
assert_equal 'one', reader.read_line.rstrip
|
539
|
-
assert_nil reader.file
|
540
|
-
assert_equal '<stdin>', reader.path
|
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
|
572
|
-
end
|
573
|
-
|
574
|
-
context 'Include Directive' do
|
575
|
-
test 'include directive is disabled by default and becomes a link' do
|
576
|
-
input = <<-EOS
|
577
|
-
include::include-file.asciidoc[]
|
578
|
-
EOS
|
579
|
-
doc = Asciidoctor::Document.new input
|
580
|
-
reader = doc.reader
|
581
|
-
assert_equal 'link:include-file.asciidoc[]', reader.read_line
|
582
|
-
end
|
583
|
-
|
584
|
-
test 'include directive is enabled when safe mode is less than SECURE' do
|
585
|
-
input = <<-EOS
|
586
|
-
include::fixtures/include-file.asciidoc[]
|
587
|
-
EOS
|
588
|
-
|
589
|
-
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
590
|
-
output = doc.convert
|
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?
|
604
|
-
end
|
605
|
-
|
606
|
-
test 'include directive should resolve file with spaces in name' do
|
607
|
-
input = <<-EOS
|
608
|
-
include::fixtures/include file.asciidoc[]
|
609
|
-
EOS
|
610
|
-
|
611
|
-
include_file = File.join DIRNAME, 'fixtures', 'include-file.asciidoc'
|
612
|
-
include_file_with_sp = File.join DIRNAME, 'fixtures', 'include file.asciidoc'
|
613
|
-
begin
|
614
|
-
FileUtils.cp include_file, include_file_with_sp
|
615
|
-
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
616
|
-
output = doc.convert
|
617
|
-
assert_match(/included content/, output)
|
618
|
-
ensure
|
619
|
-
FileUtils.rm include_file_with_sp
|
620
|
-
end
|
621
|
-
end
|
622
|
-
|
623
|
-
test 'include directive should resolve file with {sp} in name' do
|
624
|
-
input = <<-EOS
|
625
|
-
include::fixtures/include{sp}file.asciidoc[]
|
626
|
-
EOS
|
627
|
-
|
628
|
-
include_file = File.join DIRNAME, 'fixtures', 'include-file.asciidoc'
|
629
|
-
include_file_with_sp = File.join DIRNAME, 'fixtures', 'include file.asciidoc'
|
630
|
-
begin
|
631
|
-
FileUtils.cp include_file, include_file_with_sp
|
632
|
-
doc = document_from_string input, :safe => :safe, :header_footer => false, :base_dir => DIRNAME
|
633
|
-
output = doc.convert
|
634
|
-
assert_match(/included content/, output)
|
635
|
-
ensure
|
636
|
-
FileUtils.rm include_file_with_sp
|
637
|
-
end
|
638
|
-
end
|
639
|
-
|
640
|
-
test 'include directive should resolve file relative to current include' do
|
641
|
-
input = <<-EOS
|
642
|
-
include::fixtures/parent-include.adoc[]
|
643
|
-
EOS
|
644
|
-
|
645
|
-
pseudo_docfile = File.join DIRNAME, 'include-master.adoc'
|
646
|
-
fixtures_dir = File.join DIRNAME, 'fixtures'
|
647
|
-
parent_include_docfile = File.join fixtures_dir, 'parent-include.adoc'
|
648
|
-
child_include_docfile = File.join fixtures_dir, 'child-include.adoc'
|
649
|
-
grandchild_include_docfile = File.join fixtures_dir, 'grandchild-include.adoc'
|
650
|
-
|
651
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
652
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, pseudo_docfile, :normalize => true
|
653
|
-
|
654
|
-
assert_equal pseudo_docfile, reader.file
|
655
|
-
assert_equal DIRNAME, reader.dir
|
656
|
-
assert_equal 'include-master.adoc', reader.path
|
657
|
-
|
658
|
-
assert_equal 'first line of parent', reader.read_line
|
659
|
-
|
660
|
-
assert_equal 'fixtures/parent-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
661
|
-
assert_equal parent_include_docfile, reader.file
|
662
|
-
assert_equal fixtures_dir, reader.dir
|
663
|
-
assert_equal 'fixtures/parent-include.adoc', reader.path
|
664
|
-
|
665
|
-
reader.skip_blank_lines
|
666
|
-
|
667
|
-
assert_equal 'first line of child', reader.read_line
|
668
|
-
|
669
|
-
assert_equal 'fixtures/child-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
670
|
-
assert_equal child_include_docfile, reader.file
|
671
|
-
assert_equal fixtures_dir, reader.dir
|
672
|
-
assert_equal 'fixtures/child-include.adoc', reader.path
|
673
|
-
|
674
|
-
reader.skip_blank_lines
|
675
|
-
|
676
|
-
assert_equal 'first line of grandchild', reader.read_line
|
677
|
-
|
678
|
-
assert_equal 'fixtures/grandchild-include.adoc: line 1', reader.cursor_at_prev_line.to_s
|
679
|
-
assert_equal grandchild_include_docfile, reader.file
|
680
|
-
assert_equal fixtures_dir, reader.dir
|
681
|
-
assert_equal 'fixtures/grandchild-include.adoc', reader.path
|
682
|
-
|
683
|
-
reader.skip_blank_lines
|
684
|
-
|
685
|
-
assert_equal 'last line of grandchild', reader.read_line
|
686
|
-
|
687
|
-
reader.skip_blank_lines
|
688
|
-
|
689
|
-
assert_equal 'last line of child', reader.read_line
|
690
|
-
|
691
|
-
reader.skip_blank_lines
|
692
|
-
|
693
|
-
assert_equal 'last line of parent', reader.read_line
|
694
|
-
|
695
|
-
assert_equal 'fixtures/parent-include.adoc: line 5', reader.cursor_at_prev_line.to_s
|
696
|
-
assert_equal parent_include_docfile, reader.file
|
697
|
-
assert_equal fixtures_dir, reader.dir
|
698
|
-
assert_equal 'fixtures/parent-include.adoc', reader.path
|
699
|
-
end
|
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
|
-
|
720
|
-
test 'missing file referenced by include directive is replaced by warning' do
|
721
|
-
input = <<-EOS
|
722
|
-
include::fixtures/no-such-file.adoc[]
|
723
|
-
|
724
|
-
trailing content
|
725
|
-
EOS
|
726
|
-
|
727
|
-
begin
|
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
|
734
|
-
end
|
735
|
-
rescue
|
736
|
-
flunk 'include directive should not raise exception on missing file'
|
737
|
-
end
|
738
|
-
end
|
739
|
-
|
740
|
-
test 'unreadable file referenced by include directive is replaced by warning' do
|
741
|
-
include_file = File.join DIRNAME, 'fixtures', 'chapter-a.adoc'
|
742
|
-
FileUtils.chmod 0000, include_file
|
743
|
-
input = <<-EOS
|
744
|
-
include::fixtures/chapter-a.adoc[]
|
745
|
-
|
746
|
-
trailing content
|
747
|
-
EOS
|
748
|
-
|
749
|
-
begin
|
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
|
756
|
-
end
|
757
|
-
rescue
|
758
|
-
flunk 'include directive should not raise exception on missing file'
|
759
|
-
ensure
|
760
|
-
FileUtils.chmod 0644, include_file
|
761
|
-
end
|
762
|
-
end unless windows?
|
763
|
-
|
764
|
-
# IMPORTANT this test needs to be run on Windows to verify proper behavior in Windows
|
765
|
-
test 'can resolve include directive with absolute path' do
|
766
|
-
include_path = ::File.join DIRNAME, 'fixtures', 'chapter-a.adoc'
|
767
|
-
input = <<-EOS
|
768
|
-
include::#{include_path}[]
|
769
|
-
EOS
|
770
|
-
result = document_from_string input, :safe => :safe
|
771
|
-
assert_equal 'Chapter A', result.doctitle
|
772
|
-
|
773
|
-
result = document_from_string input, :safe => :unsafe, :base_dir => ::Dir.tmpdir
|
774
|
-
assert_equal 'Chapter A', result.doctitle
|
775
|
-
end
|
776
|
-
|
777
|
-
test 'include directive can retrieve data from uri' do
|
778
|
-
url = %(http://#{resolve_localhost}:9876/name/asciidoctor)
|
779
|
-
input = <<-EOS
|
780
|
-
....
|
781
|
-
include::#{url}[]
|
782
|
-
....
|
783
|
-
EOS
|
784
|
-
expect = /\{"name": "asciidoctor"\}/
|
785
|
-
output = using_test_webserver do
|
786
|
-
convert_string_to_embedded input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
787
|
-
end
|
788
|
-
|
789
|
-
refute_nil output
|
790
|
-
assert_match(expect, output)
|
791
|
-
end
|
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 = convert_string_to_embedded 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
|
-
convert_string_to_embedded 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
|
-
convert_string_to_embedded 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
|
-
convert_string_to_embedded 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
|
-
|
879
|
-
test 'inaccessible uri referenced by include directive does not crash processor' do
|
880
|
-
url = %(http://#{resolve_localhost}:9876/no_such_file)
|
881
|
-
input = <<-EOS
|
882
|
-
....
|
883
|
-
include::#{url}[]
|
884
|
-
....
|
885
|
-
EOS
|
886
|
-
|
887
|
-
begin
|
888
|
-
using_memory_logger do |logger|
|
889
|
-
output = using_test_webserver do
|
890
|
-
convert_string_to_embedded input, :safe => :safe, :attributes => {'allow-uri-read' => ''}
|
891
|
-
end
|
892
|
-
refute_nil output
|
893
|
-
assert_match(/Unresolved directive/, output)
|
894
|
-
assert_message logger, :ERROR, %(<stdin>: line 2: include uri not readable: #{url}), Hash
|
895
|
-
end
|
896
|
-
rescue
|
897
|
-
flunk 'include directive should not raise exception on inaccessible uri'
|
898
|
-
end
|
899
|
-
end
|
900
|
-
|
901
|
-
test 'include directive supports selecting lines by line number' do
|
902
|
-
input = <<-EOS
|
903
|
-
include::fixtures/include-file.asciidoc[lines=1;3..4;6..-1]
|
904
|
-
EOS
|
905
|
-
|
906
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
907
|
-
assert_match(/first line/, output)
|
908
|
-
refute_match(/second line/, output)
|
909
|
-
assert_match(/third line/, output)
|
910
|
-
assert_match(/fourth line/, output)
|
911
|
-
refute_match(/fifth line/, output)
|
912
|
-
assert_match(/sixth line/, output)
|
913
|
-
assert_match(/seventh line/, output)
|
914
|
-
assert_match(/eighth line/, output)
|
915
|
-
assert_match(/last line of included content/, output)
|
916
|
-
end
|
917
|
-
|
918
|
-
test 'include directive supports line ranges specified in quoted attribute value' do
|
919
|
-
input = <<-EOS
|
920
|
-
include::fixtures/include-file.asciidoc[lines="1, 3..4 , 6 .. -1"]
|
921
|
-
EOS
|
922
|
-
|
923
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
924
|
-
assert_match(/first line/, output)
|
925
|
-
refute_match(/second line/, output)
|
926
|
-
assert_match(/third line/, output)
|
927
|
-
assert_match(/fourth line/, output)
|
928
|
-
refute_match(/fifth line/, output)
|
929
|
-
assert_match(/sixth line/, output)
|
930
|
-
assert_match(/seventh line/, output)
|
931
|
-
assert_match(/eighth line/, output)
|
932
|
-
assert_match(/last line of included content/, output)
|
933
|
-
end
|
934
|
-
|
935
|
-
test 'include directive supports implicit endless range' do
|
936
|
-
input = <<-EOS
|
937
|
-
include::fixtures/include-file.asciidoc[lines=6..]
|
938
|
-
EOS
|
939
|
-
|
940
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
941
|
-
refute_match(/first line/, output)
|
942
|
-
refute_match(/second line/, output)
|
943
|
-
refute_match(/third line/, output)
|
944
|
-
refute_match(/fourth line/, output)
|
945
|
-
refute_match(/fifth line/, output)
|
946
|
-
assert_match(/sixth line/, output)
|
947
|
-
assert_match(/seventh line/, output)
|
948
|
-
assert_match(/eighth line/, output)
|
949
|
-
assert_match(/last line of included content/, output)
|
950
|
-
end
|
951
|
-
|
952
|
-
test 'include directive ignores empty lines attribute' do
|
953
|
-
input = <<-EOS
|
954
|
-
++++
|
955
|
-
include::fixtures/include-file.asciidoc[lines=]
|
956
|
-
++++
|
957
|
-
EOS
|
958
|
-
|
959
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
960
|
-
assert_includes output, 'first line of included content'
|
961
|
-
assert_includes output, 'last line of included content'
|
962
|
-
end
|
963
|
-
|
964
|
-
test 'include directive supports selecting lines by tag' do
|
965
|
-
input = <<-EOS
|
966
|
-
include::fixtures/include-file.asciidoc[tag=snippetA]
|
967
|
-
EOS
|
968
|
-
|
969
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
970
|
-
assert_match(/snippetA content/, output)
|
971
|
-
refute_match(/snippetB content/, output)
|
972
|
-
refute_match(/non-tagged content/, output)
|
973
|
-
refute_match(/included content/, output)
|
974
|
-
end
|
975
|
-
|
976
|
-
test 'include directive supports selecting lines by tags' do
|
977
|
-
input = <<-EOS
|
978
|
-
include::fixtures/include-file.asciidoc[tags=snippetA;snippetB]
|
979
|
-
EOS
|
980
|
-
|
981
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
982
|
-
assert_match(/snippetA content/, output)
|
983
|
-
assert_match(/snippetB content/, output)
|
984
|
-
refute_match(/non-tagged content/, output)
|
985
|
-
refute_match(/included content/, output)
|
986
|
-
end
|
987
|
-
|
988
|
-
test 'include directive supports selecting lines by tag in language that uses circumfix comments' do
|
989
|
-
{
|
990
|
-
'include-file.xml' => '<snippet>content</snippet>',
|
991
|
-
'include-file.ml' => 'let s = SS.empty;;',
|
992
|
-
'include-file.jsx' => '<p>Welcome to the club.</p>'
|
993
|
-
}.each do |filename, expect|
|
994
|
-
input = <<-EOS
|
995
|
-
[source,xml]
|
996
|
-
----
|
997
|
-
include::fixtures/#{filename}[tag=snippet,indent=0]
|
998
|
-
----
|
999
|
-
EOS
|
1000
|
-
|
1001
|
-
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
1002
|
-
assert_equal expect, doc.blocks[0].source
|
1003
|
-
end
|
1004
|
-
end
|
1005
|
-
|
1006
|
-
test 'include directive supports selecting tagged lines in file that has CRLF endlines' do
|
1007
|
-
begin
|
1008
|
-
tmp_include = Tempfile.new %w(include- .adoc)
|
1009
|
-
tmp_include_dir, tmp_include_path = File.split tmp_include.path
|
1010
|
-
tmp_include.write %(do not include\r\ntag::include-me[]\r\nincluded line\r\nend::include-me[]\r\ndo not include\r\n)
|
1011
|
-
tmp_include.close
|
1012
|
-
input = <<-EOS
|
1013
|
-
include::#{tmp_include_path}[tag=include-me]
|
1014
|
-
EOS
|
1015
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => tmp_include_dir
|
1016
|
-
assert_includes output, 'included line'
|
1017
|
-
refute_includes output, 'do not include'
|
1018
|
-
ensure
|
1019
|
-
tmp_include.close!
|
1020
|
-
end
|
1021
|
-
end
|
1022
|
-
|
1023
|
-
test 'include directive finds closing tag on last line of file without a trailing newline' do
|
1024
|
-
begin
|
1025
|
-
tmp_include = Tempfile.new %w(include- .adoc)
|
1026
|
-
tmp_include_dir, tmp_include_path = File.split tmp_include.path
|
1027
|
-
tmp_include.write %(line not included\ntag::include-me[]\nline included\nend::include-me[])
|
1028
|
-
tmp_include.close
|
1029
|
-
input = <<-EOS
|
1030
|
-
include::#{tmp_include_path}[tag=include-me]
|
1031
|
-
EOS
|
1032
|
-
using_memory_logger do |logger|
|
1033
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => tmp_include_dir
|
1034
|
-
assert_empty logger.messages
|
1035
|
-
assert_includes output, 'line included'
|
1036
|
-
refute_includes output, 'line not included'
|
1037
|
-
end
|
1038
|
-
ensure
|
1039
|
-
tmp_include.close!
|
1040
|
-
end
|
1041
|
-
end
|
1042
|
-
|
1043
|
-
test 'include directive does not select lines with tag directives within selected tag region' do
|
1044
|
-
input = <<-EOS
|
1045
|
-
++++
|
1046
|
-
include::fixtures/include-file.asciidoc[tags=snippet]
|
1047
|
-
++++
|
1048
|
-
EOS
|
1049
|
-
|
1050
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1051
|
-
expect = %(snippetA content
|
1052
|
-
|
1053
|
-
non-tagged content
|
1054
|
-
|
1055
|
-
snippetB content)
|
1056
|
-
assert_equal expect, output
|
1057
|
-
end
|
1058
|
-
|
1059
|
-
test 'include directive skips lines marked with negated tags' do
|
1060
|
-
input = <<-EOS
|
1061
|
-
----
|
1062
|
-
include::fixtures/tagged-class-enclosed.rb[tags=all;!bark]
|
1063
|
-
----
|
1064
|
-
EOS
|
1065
|
-
|
1066
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1067
|
-
expected = %(class Dog
|
1068
|
-
def initialize breed
|
1069
|
-
@breed = breed
|
1070
|
-
end
|
1071
|
-
end)
|
1072
|
-
assert_includes output, expected
|
1073
|
-
end
|
1074
|
-
|
1075
|
-
test 'include directive takes all lines without tag directives when value is double asterisk' do
|
1076
|
-
input = <<-EOS
|
1077
|
-
----
|
1078
|
-
include::fixtures/tagged-class.rb[tags=**]
|
1079
|
-
----
|
1080
|
-
EOS
|
1081
|
-
|
1082
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1083
|
-
expected = %(class Dog
|
1084
|
-
def initialize breed
|
1085
|
-
@breed = breed
|
1086
|
-
end
|
1087
|
-
|
1088
|
-
def bark
|
1089
|
-
if @breed == 'beagle'
|
1090
|
-
'woof woof woof woof woof'
|
1091
|
-
else
|
1092
|
-
'woof woof'
|
1093
|
-
end
|
1094
|
-
end
|
1095
|
-
end)
|
1096
|
-
assert_includes output, expected
|
1097
|
-
end
|
1098
|
-
|
1099
|
-
test 'include directive takes all lines except negated tags when value contains double asterisk' do
|
1100
|
-
input = <<-EOS
|
1101
|
-
----
|
1102
|
-
include::fixtures/tagged-class.rb[tags=**;!bark]
|
1103
|
-
----
|
1104
|
-
EOS
|
1105
|
-
|
1106
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1107
|
-
expected = %(class Dog
|
1108
|
-
def initialize breed
|
1109
|
-
@breed = breed
|
1110
|
-
end
|
1111
|
-
end)
|
1112
|
-
assert_includes output, expected
|
1113
|
-
end
|
1114
|
-
|
1115
|
-
test 'include directive selects lines for all tags when value of tags attribute is wildcard' do
|
1116
|
-
input = <<-EOS
|
1117
|
-
----
|
1118
|
-
include::fixtures/tagged-class-enclosed.rb[tags=*]
|
1119
|
-
----
|
1120
|
-
EOS
|
1121
|
-
|
1122
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1123
|
-
expected = %(class Dog
|
1124
|
-
def initialize breed
|
1125
|
-
@breed = breed
|
1126
|
-
end
|
1127
|
-
|
1128
|
-
def bark
|
1129
|
-
if @breed == 'beagle'
|
1130
|
-
'woof woof woof woof woof'
|
1131
|
-
else
|
1132
|
-
'woof woof'
|
1133
|
-
end
|
1134
|
-
end
|
1135
|
-
end)
|
1136
|
-
assert_includes output, expected
|
1137
|
-
end
|
1138
|
-
|
1139
|
-
test 'include directive selects lines for all tags except exclusions when value of tags attribute is wildcard' do
|
1140
|
-
input = <<-EOS
|
1141
|
-
----
|
1142
|
-
include::fixtures/tagged-class-enclosed.rb[tags=*;!init]
|
1143
|
-
----
|
1144
|
-
EOS
|
1145
|
-
|
1146
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1147
|
-
expected = %(class Dog
|
1148
|
-
|
1149
|
-
def bark
|
1150
|
-
if @breed == 'beagle'
|
1151
|
-
'woof woof woof woof woof'
|
1152
|
-
else
|
1153
|
-
'woof woof'
|
1154
|
-
end
|
1155
|
-
end
|
1156
|
-
end)
|
1157
|
-
assert_includes output, expected
|
1158
|
-
end
|
1159
|
-
|
1160
|
-
test 'include directive skips lines all tagged lines when value of tags attribute is negated wildcard' do
|
1161
|
-
input = <<-EOS
|
1162
|
-
----
|
1163
|
-
include::fixtures/tagged-class.rb[tags=!*]
|
1164
|
-
----
|
1165
|
-
EOS
|
1166
|
-
|
1167
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1168
|
-
expected = %(class Dog
|
1169
|
-
end)
|
1170
|
-
assert_includes output, expected
|
1171
|
-
end
|
1172
|
-
|
1173
|
-
test 'include directive selects specified tagged lines and ignores the other tag directives' do
|
1174
|
-
input = <<-EOS
|
1175
|
-
[indent=0]
|
1176
|
-
----
|
1177
|
-
include::fixtures/tagged-class.rb[tags=bark;!bark-other]
|
1178
|
-
----
|
1179
|
-
EOS
|
1180
|
-
|
1181
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1182
|
-
expected = %(def bark
|
1183
|
-
if @breed == 'beagle'
|
1184
|
-
'woof woof woof woof woof'
|
1185
|
-
end
|
1186
|
-
end)
|
1187
|
-
assert_includes output, expected
|
1188
|
-
end
|
1189
|
-
|
1190
|
-
test 'should warn if specified tag is not found in include file' do
|
1191
|
-
input = <<-EOS
|
1192
|
-
include::fixtures/include-file.asciidoc[tag=no-such-tag]
|
1193
|
-
EOS
|
1194
|
-
|
1195
|
-
using_memory_logger do |logger|
|
1196
|
-
convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1197
|
-
assert_message logger, :WARN, %(~<stdin>: line 1: tag 'no-such-tag' not found in include file), Hash
|
1198
|
-
end
|
1199
|
-
end
|
1200
|
-
|
1201
|
-
test 'should warn if specified tags are not found in include file' do
|
1202
|
-
input = <<-EOS
|
1203
|
-
++++
|
1204
|
-
include::fixtures/include-file.asciidoc[tags=no-such-tag-b;no-such-tag-a]
|
1205
|
-
++++
|
1206
|
-
EOS
|
1207
|
-
|
1208
|
-
using_memory_logger do |logger|
|
1209
|
-
convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1210
|
-
# NOTE Ruby 1.8 swaps the order of the list for some silly reason
|
1211
|
-
expected_tags = ::RUBY_MIN_VERSION_1_9 ? 'no-such-tag-b, no-such-tag-a' : 'no-such-tag-a, no-such-tag-b'
|
1212
|
-
assert_message logger, :WARN, %(~<stdin>: line 2: tags '#{expected_tags}' not found in include file), Hash
|
1213
|
-
end
|
1214
|
-
end
|
1215
|
-
|
1216
|
-
test 'should warn if specified tag in include file is not closed' do
|
1217
|
-
input = <<-EOS
|
1218
|
-
++++
|
1219
|
-
include::fixtures/unclosed-tag.adoc[tag=a]
|
1220
|
-
++++
|
1221
|
-
EOS
|
1222
|
-
|
1223
|
-
using_memory_logger do |logger|
|
1224
|
-
result = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1225
|
-
assert_equal 'a', result
|
1226
|
-
assert_message logger, :WARN, %(~<stdin>: line 2: detected unclosed tag 'a' starting at line 2 of include file), Hash
|
1227
|
-
refute_nil logger.messages[0][:message][:include_location]
|
1228
|
-
end
|
1229
|
-
end
|
1230
|
-
|
1231
|
-
test 'should warn if end tag in included file is mismatched' do
|
1232
|
-
input = <<-EOS
|
1233
|
-
++++
|
1234
|
-
include::fixtures/mismatched-end-tag.adoc[tags=a;b]
|
1235
|
-
++++
|
1236
|
-
EOS
|
1237
|
-
|
1238
|
-
inc_path = File.join DIRNAME, 'fixtures/mismatched-end-tag.adoc'
|
1239
|
-
using_memory_logger do |logger|
|
1240
|
-
result = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1241
|
-
assert_equal %(a\nb), result
|
1242
|
-
assert_message logger, :WARN, %(<stdin>: line 2: mismatched end tag (expected 'b' but found 'a') at line 5 of include file: #{inc_path}), Hash
|
1243
|
-
refute_nil logger.messages[0][:message][:include_location]
|
1244
|
-
end
|
1245
|
-
end
|
1246
|
-
|
1247
|
-
test 'should warn if unexpected end tag is found in included file' do
|
1248
|
-
input = <<-EOS
|
1249
|
-
++++
|
1250
|
-
include::fixtures/unexpected-end-tag.adoc[tags=a]
|
1251
|
-
++++
|
1252
|
-
EOS
|
1253
|
-
|
1254
|
-
inc_path = File.join DIRNAME, 'fixtures/unexpected-end-tag.adoc'
|
1255
|
-
using_memory_logger do |logger|
|
1256
|
-
result = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1257
|
-
assert_equal 'a', result
|
1258
|
-
assert_message logger, :WARN, %(<stdin>: line 2: unexpected end tag 'a' at line 4 of include file: #{inc_path}), Hash
|
1259
|
-
refute_nil logger.messages[0][:message][:include_location]
|
1260
|
-
end
|
1261
|
-
end
|
1262
|
-
|
1263
|
-
test 'include directive ignores tags attribute when empty' do
|
1264
|
-
['tag', 'tags'].each do |attr_name|
|
1265
|
-
input = <<-EOS
|
1266
|
-
++++
|
1267
|
-
include::fixtures/include-file.xml[#{attr_name}=]
|
1268
|
-
++++
|
1269
|
-
EOS
|
1270
|
-
|
1271
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1272
|
-
assert_match(/(?:tag|end)::/, output, 2)
|
1273
|
-
end
|
1274
|
-
end
|
1275
|
-
|
1276
|
-
test 'lines attribute takes precedence over tags attribute in include directive' do
|
1277
|
-
input = <<-EOS
|
1278
|
-
include::fixtures/include-file.asciidoc[lines=1, tags=snippetA;snippetB]
|
1279
|
-
EOS
|
1280
|
-
|
1281
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1282
|
-
assert_match(/first line of included content/, output)
|
1283
|
-
refute_match(/snippetA content/, output)
|
1284
|
-
refute_match(/snippetB content/, output)
|
1285
|
-
end
|
1286
|
-
|
1287
|
-
test 'indent of included file can be reset to size of indent attribute' do
|
1288
|
-
input = <<-EOS
|
1289
|
-
[source, xml]
|
1290
|
-
----
|
1291
|
-
include::fixtures/basic-docinfo.xml[lines=2..3, indent=0]
|
1292
|
-
----
|
1293
|
-
EOS
|
1294
|
-
|
1295
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1296
|
-
result = xmlnodes_at_xpath('//pre', output, 1).text
|
1297
|
-
assert_equal "<year>2013</year>\n<holder>Acme™, Inc.</holder>", result
|
1298
|
-
end
|
1299
|
-
|
1300
|
-
test 'should substitute attribute references in attrlist' do
|
1301
|
-
input = <<-EOS
|
1302
|
-
:name-of-tag: snippetA
|
1303
|
-
include::fixtures/include-file.asciidoc[tag={name-of-tag}]
|
1304
|
-
EOS
|
1305
|
-
|
1306
|
-
output = convert_string_to_embedded input, :safe => :safe, :base_dir => DIRNAME
|
1307
|
-
assert_match(/snippetA content/, output)
|
1308
|
-
refute_match(/snippetB content/, output)
|
1309
|
-
refute_match(/non-tagged content/, output)
|
1310
|
-
refute_match(/included content/, output)
|
1311
|
-
end
|
1312
|
-
|
1313
|
-
test 'should fall back to built-in include directive behavior when not handled by include processor' do
|
1314
|
-
input = <<-EOS
|
1315
|
-
include::fixtures/include-file.asciidoc[]
|
1316
|
-
EOS
|
1317
|
-
|
1318
|
-
include_processor = Class.new {
|
1319
|
-
def initialize document
|
1320
|
-
end
|
1321
|
-
|
1322
|
-
def handles? target
|
1323
|
-
false
|
1324
|
-
end
|
1325
|
-
|
1326
|
-
def process reader, target, attributes
|
1327
|
-
raise 'TestIncludeHandler should not have been invoked'
|
1328
|
-
end
|
1329
|
-
}
|
1330
|
-
|
1331
|
-
document = empty_safe_document :base_dir => DIRNAME
|
1332
|
-
reader = Asciidoctor::PreprocessorReader.new document, input, nil, :normalize => true
|
1333
|
-
reader.instance_variable_set '@include_processors', [include_processor.new(document)]
|
1334
|
-
lines = reader.read_lines
|
1335
|
-
source = lines * ::Asciidoctor::LF
|
1336
|
-
assert_match(/included content/, source)
|
1337
|
-
end
|
1338
|
-
|
1339
|
-
test 'leveloffset attribute entries should be added to content if leveloffset attribute is specified' do
|
1340
|
-
input = <<-EOS
|
1341
|
-
include::fixtures/master.adoc[]
|
1342
|
-
EOS
|
1343
|
-
|
1344
|
-
expected = <<-EOS.chomp.split(::Asciidoctor::LF)
|
1345
|
-
= Master Document
|
1346
|
-
|
1347
|
-
preamble
|
1348
|
-
|
1349
|
-
:leveloffset: +1
|
1350
|
-
|
1351
|
-
= Chapter A
|
1352
|
-
|
1353
|
-
content
|
1354
|
-
|
1355
|
-
:leveloffset!:
|
1356
|
-
EOS
|
1357
|
-
|
1358
|
-
document = Asciidoctor.load input, :safe => :safe, :base_dir => DIRNAME, :parse => false
|
1359
|
-
assert_equal expected, document.reader.read_lines
|
1360
|
-
end
|
1361
|
-
|
1362
|
-
test 'attributes are substituted in target of include directive' do
|
1363
|
-
input = <<-EOS
|
1364
|
-
:fixturesdir: fixtures
|
1365
|
-
:ext: asciidoc
|
1366
|
-
|
1367
|
-
include::{fixturesdir}/include-file.{ext}[]
|
1368
|
-
EOS
|
1369
|
-
|
1370
|
-
doc = document_from_string input, :safe => :safe, :base_dir => DIRNAME
|
1371
|
-
output = doc.convert
|
1372
|
-
assert_match(/included content/, output)
|
1373
|
-
end
|
1374
|
-
|
1375
|
-
test 'line is skipped by default if target of include directive resolves to empty' do
|
1376
|
-
input = <<-EOS
|
1377
|
-
include::{foodir}/include-file.asciidoc[]
|
1378
|
-
EOS
|
1379
|
-
|
1380
|
-
using_memory_logger do |logger|
|
1381
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1382
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1383
|
-
line = reader.read_line
|
1384
|
-
assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.asciidoc[]', line
|
1385
|
-
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1386
|
-
end
|
1387
|
-
end
|
1388
|
-
|
1389
|
-
test 'line is dropped if target of include directive resolves to empty and attribute-missing attribute is not skip' do
|
1390
|
-
input = <<-EOS
|
1391
|
-
include::{foodir}/include-file.asciidoc[]
|
1392
|
-
EOS
|
1393
|
-
|
1394
|
-
using_memory_logger do |logger|
|
1395
|
-
doc = empty_safe_document :base_dir => DIRNAME, :attributes => {'attribute-missing' => 'drop'}
|
1396
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1397
|
-
line = reader.read_line
|
1398
|
-
assert_nil line
|
1399
|
-
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1400
|
-
end
|
1401
|
-
end
|
1402
|
-
|
1403
|
-
test 'line following dropped include is not dropped' do
|
1404
|
-
input = <<-EOS
|
1405
|
-
include::{foodir}/include-file.asciidoc[]
|
1406
|
-
yo
|
1407
|
-
EOS
|
1408
|
-
|
1409
|
-
using_memory_logger do |logger|
|
1410
|
-
doc = empty_safe_document :base_dir => DIRNAME, :attributes => {'attribute-missing' => 'drop'}
|
1411
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1412
|
-
line = reader.read_line
|
1413
|
-
assert_equal 'yo', line
|
1414
|
-
assert_message logger, :WARN, 'dropping line containing reference to missing attribute: foodir'
|
1415
|
-
end
|
1416
|
-
end
|
1417
|
-
|
1418
|
-
test 'escaped include directive is left unprocessed' do
|
1419
|
-
input = <<-EOS
|
1420
|
-
\\include::fixtures/include-file.asciidoc[]
|
1421
|
-
\\escape preserved here
|
1422
|
-
EOS
|
1423
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1424
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, :normalize => true
|
1425
|
-
# we should be able to peek it multiple times and still have the backslash preserved
|
1426
|
-
# this is the test for @unescape_next_line
|
1427
|
-
assert_equal 'include::fixtures/include-file.asciidoc[]', reader.peek_line
|
1428
|
-
assert_equal 'include::fixtures/include-file.asciidoc[]', reader.peek_line
|
1429
|
-
assert_equal 'include::fixtures/include-file.asciidoc[]', reader.read_line
|
1430
|
-
assert_equal '\\escape preserved here', reader.read_line
|
1431
|
-
end
|
1432
|
-
|
1433
|
-
test 'include directive not at start of line is ignored' do
|
1434
|
-
input = <<-EOS
|
1435
|
-
include::include-file.asciidoc[]
|
1436
|
-
EOS
|
1437
|
-
para = block_from_string input
|
1438
|
-
assert_equal 1, para.lines.size
|
1439
|
-
# NOTE the space gets stripped because the line is treated as an inline literal
|
1440
|
-
assert_equal :literal, para.context
|
1441
|
-
assert_equal 'include::include-file.asciidoc[]', para.source
|
1442
|
-
end
|
1443
|
-
|
1444
|
-
test 'include directive is disabled when max-include-depth attribute is 0' do
|
1445
|
-
input = <<-EOS
|
1446
|
-
include::include-file.asciidoc[]
|
1447
|
-
EOS
|
1448
|
-
para = block_from_string input, :safe => :safe, :attributes => { 'max-include-depth' => 0 }
|
1449
|
-
assert_equal 1, para.lines.size
|
1450
|
-
assert_equal 'include::include-file.asciidoc[]', para.source
|
1451
|
-
end
|
1452
|
-
|
1453
|
-
test 'max-include-depth cannot be set by document' do
|
1454
|
-
input = <<-EOS
|
1455
|
-
:max-include-depth: 1
|
1456
|
-
|
1457
|
-
include::include-file.asciidoc[]
|
1458
|
-
EOS
|
1459
|
-
para = block_from_string input, :safe => :safe, :attributes => { 'max-include-depth' => 0 }
|
1460
|
-
assert_equal 1, para.lines.size
|
1461
|
-
assert_equal 'include::include-file.asciidoc[]', para.source
|
1462
|
-
end
|
1463
|
-
|
1464
|
-
test 'include directive should be disabled if max include depth has been exceeded' do
|
1465
|
-
input = <<-EOS
|
1466
|
-
include::fixtures/parent-include.adoc[depth=1]
|
1467
|
-
EOS
|
1468
|
-
|
1469
|
-
using_memory_logger do |logger|
|
1470
|
-
pseudo_docfile = File.join DIRNAME, 'include-master.adoc'
|
1471
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1472
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, Asciidoctor::Reader::Cursor.new(pseudo_docfile), :normalize => true
|
1473
|
-
lines = reader.readlines
|
1474
|
-
assert_includes lines, 'include::child-include.adoc[]'
|
1475
|
-
assert_message logger, :ERROR, 'fixtures/parent-include.adoc: line 3: maximum include depth of 1 exceeded', Hash
|
1476
|
-
end
|
1477
|
-
end
|
1478
|
-
|
1479
|
-
test 'include directive should be disabled if max include depth set in nested context has been exceeded' do
|
1480
|
-
input = <<-EOS
|
1481
|
-
include::fixtures/parent-include-restricted.adoc[depth=3]
|
1482
|
-
EOS
|
1483
|
-
|
1484
|
-
using_memory_logger do |logger|
|
1485
|
-
pseudo_docfile = File.join DIRNAME, 'include-master.adoc'
|
1486
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1487
|
-
reader = Asciidoctor::PreprocessorReader.new doc, input, Asciidoctor::Reader::Cursor.new(pseudo_docfile), :normalize => true
|
1488
|
-
lines = reader.readlines
|
1489
|
-
assert_includes lines, 'first line of child'
|
1490
|
-
assert_includes lines, 'include::grandchild-include.adoc[]'
|
1491
|
-
assert_message logger, :ERROR, 'fixtures/child-include.adoc: line 3: maximum include depth of 1 exceeded', Hash
|
1492
|
-
end
|
1493
|
-
end
|
1494
|
-
|
1495
|
-
test 'read_lines_until should not process lines if process option is false' do
|
1496
|
-
lines = <<-EOS.each_line.to_a
|
1497
|
-
////
|
1498
|
-
include::fixtures/no-such-file.adoc[]
|
1499
|
-
////
|
1500
|
-
EOS
|
1501
|
-
|
1502
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1503
|
-
reader = Asciidoctor::PreprocessorReader.new doc, lines, nil, :normalize => true
|
1504
|
-
reader.read_line
|
1505
|
-
result = reader.read_lines_until(:terminator => '////', :skip_processing => true)
|
1506
|
-
assert_equal lines.map {|l| l.chomp}[1..1], result
|
1507
|
-
end
|
1508
|
-
|
1509
|
-
test 'skip_comment_lines should not process lines read' do
|
1510
|
-
lines = <<-EOS.each_line.to_a
|
1511
|
-
////
|
1512
|
-
include::fixtures/no-such-file.adoc[]
|
1513
|
-
////
|
1514
|
-
EOS
|
1515
|
-
|
1516
|
-
using_memory_logger do |logger|
|
1517
|
-
doc = empty_safe_document :base_dir => DIRNAME
|
1518
|
-
reader = Asciidoctor::PreprocessorReader.new doc, lines, nil, :normalize => true
|
1519
|
-
reader.skip_comment_lines
|
1520
|
-
assert reader.empty?
|
1521
|
-
assert logger.empty?
|
1522
|
-
end
|
1523
|
-
end
|
1524
|
-
end
|
1525
|
-
|
1526
|
-
context 'Conditional Inclusions' do
|
1527
|
-
test 'process_line returns nil if cursor advanced' do
|
1528
|
-
input = <<-EOS
|
1529
|
-
ifdef::asciidoctor[]
|
1530
|
-
Asciidoctor!
|
1531
|
-
endif::asciidoctor[]
|
1532
|
-
EOS
|
1533
|
-
|
1534
|
-
doc = Asciidoctor::Document.new input
|
1535
|
-
reader = doc.reader
|
1536
|
-
assert_nil reader.process_line(reader.lines.first)
|
1537
|
-
end
|
1538
|
-
|
1539
|
-
test 'peek_line advances cursor to next conditional line of content' do
|
1540
|
-
input = <<-EOS
|
1541
|
-
ifdef::asciidoctor[]
|
1542
|
-
Asciidoctor!
|
1543
|
-
endif::asciidoctor[]
|
1544
|
-
EOS
|
1545
|
-
|
1546
|
-
doc = Asciidoctor::Document.new input
|
1547
|
-
reader = doc.reader
|
1548
|
-
assert_equal 1, reader.lineno
|
1549
|
-
assert_equal 'Asciidoctor!', reader.peek_line
|
1550
|
-
assert_equal 2, reader.lineno
|
1551
|
-
end
|
1552
|
-
|
1553
|
-
test 'peek_lines should preprocess lines if direct is false' do
|
1554
|
-
input = <<-EOS
|
1555
|
-
The Asciidoctor
|
1556
|
-
ifdef::asciidoctor[is in.]
|
1557
|
-
EOS
|
1558
|
-
doc = Asciidoctor::Document.new input
|
1559
|
-
reader = doc.reader
|
1560
|
-
result = reader.peek_lines 2, false
|
1561
|
-
assert_equal ['The Asciidoctor', 'is in.'], result
|
1562
|
-
end
|
1563
|
-
|
1564
|
-
test 'peek_lines should not preprocess lines if direct is true' do
|
1565
|
-
input = <<-EOS
|
1566
|
-
The Asciidoctor
|
1567
|
-
ifdef::asciidoctor[is in.]
|
1568
|
-
EOS
|
1569
|
-
doc = Asciidoctor::Document.new input
|
1570
|
-
reader = doc.reader
|
1571
|
-
result = reader.peek_lines 2, true
|
1572
|
-
assert_equal ['The Asciidoctor', 'ifdef::asciidoctor[is in.]'], result
|
1573
|
-
end
|
1574
|
-
|
1575
|
-
test 'peek_lines should not prevent subsequent preprocessing of peeked lines' do
|
1576
|
-
input = <<-EOS
|
1577
|
-
The Asciidoctor
|
1578
|
-
ifdef::asciidoctor[is in.]
|
1579
|
-
EOS
|
1580
|
-
doc = Asciidoctor::Document.new input
|
1581
|
-
reader = doc.reader
|
1582
|
-
result = reader.peek_lines 2, true
|
1583
|
-
result = reader.peek_lines 2, false
|
1584
|
-
assert_equal ['The Asciidoctor', 'is in.'], result
|
1585
|
-
end
|
1586
|
-
|
1587
|
-
test 'process_line returns line if cursor not advanced' do
|
1588
|
-
input = <<-EOS
|
1589
|
-
content
|
1590
|
-
ifdef::asciidoctor[]
|
1591
|
-
Asciidoctor!
|
1592
|
-
endif::asciidoctor[]
|
1593
|
-
EOS
|
1594
|
-
|
1595
|
-
doc = Asciidoctor::Document.new input
|
1596
|
-
reader = doc.reader
|
1597
|
-
refute_nil reader.process_line(reader.lines.first)
|
1598
|
-
end
|
1599
|
-
|
1600
|
-
test 'peek_line does not advance cursor when on a regular content line' do
|
1601
|
-
input = <<-EOS
|
1602
|
-
content
|
1603
|
-
ifdef::asciidoctor[]
|
1604
|
-
Asciidoctor!
|
1605
|
-
endif::asciidoctor[]
|
1606
|
-
EOS
|
1607
|
-
|
1608
|
-
doc = Asciidoctor::Document.new input
|
1609
|
-
reader = doc.reader
|
1610
|
-
assert_equal 1, reader.lineno
|
1611
|
-
assert_equal 'content', reader.peek_line
|
1612
|
-
assert_equal 1, reader.lineno
|
1613
|
-
end
|
1614
|
-
|
1615
|
-
test 'peek_line returns nil if cursor advances past end of source' do
|
1616
|
-
input = <<-EOS
|
1617
|
-
ifdef::foobar[]
|
1618
|
-
swallowed content
|
1619
|
-
endif::foobar[]
|
1620
|
-
EOS
|
1621
|
-
|
1622
|
-
doc = Asciidoctor::Document.new input
|
1623
|
-
reader = doc.reader
|
1624
|
-
assert_equal 1, reader.lineno
|
1625
|
-
assert_nil reader.peek_line
|
1626
|
-
assert_equal 4, reader.lineno
|
1627
|
-
end
|
1628
|
-
|
1629
|
-
test 'ifdef with defined attribute includes content' do
|
1630
|
-
input = <<-EOS
|
1631
|
-
ifdef::holygrail[]
|
1632
|
-
There is a holy grail!
|
1633
|
-
endif::holygrail[]
|
1634
|
-
EOS
|
1635
|
-
|
1636
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'holygrail' => '' }
|
1637
|
-
reader = doc.reader
|
1638
|
-
lines = []
|
1639
|
-
while reader.has_more_lines?
|
1640
|
-
lines << reader.read_line
|
1641
|
-
end
|
1642
|
-
assert_equal 'There is a holy grail!', (lines * ::Asciidoctor::LF)
|
1643
|
-
end
|
1644
|
-
|
1645
|
-
test 'ifdef with defined attribute includes text in brackets' do
|
1646
|
-
input = <<-EOS
|
1647
|
-
On our quest we go...
|
1648
|
-
ifdef::holygrail[There is a holy grail!]
|
1649
|
-
There was much rejoicing.
|
1650
|
-
EOS
|
1651
|
-
|
1652
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'holygrail' => '' }
|
1653
|
-
reader = doc.reader
|
1654
|
-
lines = []
|
1655
|
-
while reader.has_more_lines?
|
1656
|
-
lines << reader.read_line
|
1657
|
-
end
|
1658
|
-
assert_equal "On our quest we go...\nThere is a holy grail!\nThere was much rejoicing.", (lines * ::Asciidoctor::LF)
|
1659
|
-
end
|
1660
|
-
|
1661
|
-
test 'ifdef with defined attribute processes include directive in brackets' do
|
1662
|
-
input = <<-EOS
|
1663
|
-
ifdef::asciidoctor-version[include::fixtures/include-file.asciidoc[tag=snippetA]]
|
1664
|
-
EOS
|
1665
|
-
|
1666
|
-
doc = Asciidoctor::Document.new input, :safe => :safe, :base_dir => DIRNAME
|
1667
|
-
reader = doc.reader
|
1668
|
-
lines = []
|
1669
|
-
while reader.has_more_lines?
|
1670
|
-
lines << reader.read_line
|
1671
|
-
end
|
1672
|
-
assert_equal 'snippetA content', lines[0]
|
1673
|
-
end
|
1674
|
-
|
1675
|
-
test 'ifdef attribute name is not case sensitive' do
|
1676
|
-
input = <<-EOS
|
1677
|
-
ifdef::showScript[]
|
1678
|
-
The script is shown!
|
1679
|
-
endif::showScript[]
|
1680
|
-
EOS
|
1681
|
-
|
1682
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'showscript' => '' }
|
1683
|
-
result = doc.reader.read
|
1684
|
-
assert_equal 'The script is shown!', result
|
1685
|
-
end
|
1686
|
-
|
1687
|
-
test 'ifndef with defined attribute does not include text in brackets' do
|
1688
|
-
input = <<-EOS
|
1689
|
-
On our quest we go...
|
1690
|
-
ifndef::hardships[There is a holy grail!]
|
1691
|
-
There was no rejoicing.
|
1692
|
-
EOS
|
1693
|
-
|
1694
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'hardships' => '' }
|
1695
|
-
reader = doc.reader
|
1696
|
-
lines = []
|
1697
|
-
while reader.has_more_lines?
|
1698
|
-
lines << reader.read_line
|
1699
|
-
end
|
1700
|
-
assert_equal "On our quest we go...\nThere was no rejoicing.", (lines * ::Asciidoctor::LF)
|
1701
|
-
end
|
1702
|
-
|
1703
|
-
test 'include with non-matching nested exclude' do
|
1704
|
-
input = <<-EOS
|
1705
|
-
ifdef::grail[]
|
1706
|
-
holy
|
1707
|
-
ifdef::swallow[]
|
1708
|
-
swallow
|
1709
|
-
endif::swallow[]
|
1710
|
-
grail
|
1711
|
-
endif::grail[]
|
1712
|
-
EOS
|
1713
|
-
|
1714
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'grail' => '' }
|
1715
|
-
reader = doc.reader
|
1716
|
-
lines = []
|
1717
|
-
while reader.has_more_lines?
|
1718
|
-
lines << reader.read_line
|
1719
|
-
end
|
1720
|
-
assert_equal "holy\ngrail", (lines * ::Asciidoctor::LF)
|
1721
|
-
end
|
1722
|
-
|
1723
|
-
test 'nested excludes with same condition' do
|
1724
|
-
input = <<-EOS
|
1725
|
-
ifndef::grail[]
|
1726
|
-
ifndef::grail[]
|
1727
|
-
not here
|
1728
|
-
endif::grail[]
|
1729
|
-
endif::grail[]
|
1730
|
-
EOS
|
1731
|
-
|
1732
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'grail' => '' }
|
1733
|
-
reader = doc.reader
|
1734
|
-
lines = []
|
1735
|
-
while reader.has_more_lines?
|
1736
|
-
lines << reader.read_line
|
1737
|
-
end
|
1738
|
-
assert_equal '', (lines * ::Asciidoctor::LF)
|
1739
|
-
end
|
1740
|
-
|
1741
|
-
test 'include with nested exclude of inverted condition' do
|
1742
|
-
input = <<-EOS
|
1743
|
-
ifdef::grail[]
|
1744
|
-
holy
|
1745
|
-
ifndef::grail[]
|
1746
|
-
not here
|
1747
|
-
endif::grail[]
|
1748
|
-
grail
|
1749
|
-
endif::grail[]
|
1750
|
-
EOS
|
1751
|
-
|
1752
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'grail' => '' }
|
1753
|
-
reader = doc.reader
|
1754
|
-
lines = []
|
1755
|
-
while reader.has_more_lines?
|
1756
|
-
lines << reader.read_line
|
1757
|
-
end
|
1758
|
-
assert_equal "holy\ngrail", (lines * ::Asciidoctor::LF)
|
1759
|
-
end
|
1760
|
-
|
1761
|
-
test 'exclude with matching nested exclude' do
|
1762
|
-
input = <<-EOS
|
1763
|
-
poof
|
1764
|
-
ifdef::swallow[]
|
1765
|
-
no
|
1766
|
-
ifdef::swallow[]
|
1767
|
-
swallow
|
1768
|
-
endif::swallow[]
|
1769
|
-
here
|
1770
|
-
endif::swallow[]
|
1771
|
-
gone
|
1772
|
-
EOS
|
1773
|
-
|
1774
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'grail' => '' }
|
1775
|
-
reader = doc.reader
|
1776
|
-
lines = []
|
1777
|
-
while reader.has_more_lines?
|
1778
|
-
lines << reader.read_line
|
1779
|
-
end
|
1780
|
-
assert_equal "poof\ngone", (lines * ::Asciidoctor::LF)
|
1781
|
-
end
|
1782
|
-
|
1783
|
-
test 'exclude with nested include using shorthand end' do
|
1784
|
-
input = <<-EOS
|
1785
|
-
poof
|
1786
|
-
ifndef::grail[]
|
1787
|
-
no grail
|
1788
|
-
ifndef::swallow[]
|
1789
|
-
or swallow
|
1790
|
-
endif::[]
|
1791
|
-
in here
|
1792
|
-
endif::[]
|
1793
|
-
gone
|
1794
|
-
EOS
|
1795
|
-
|
1796
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'grail' => '' }
|
1797
|
-
reader = doc.reader
|
1798
|
-
lines = []
|
1799
|
-
while reader.has_more_lines?
|
1800
|
-
lines << reader.read_line
|
1801
|
-
end
|
1802
|
-
assert_equal "poof\ngone", (lines * ::Asciidoctor::LF)
|
1803
|
-
end
|
1804
|
-
|
1805
|
-
test 'ifdef with one alternative attribute set includes content' do
|
1806
|
-
input = <<-EOS
|
1807
|
-
ifdef::holygrail,swallow[]
|
1808
|
-
Our quest is complete!
|
1809
|
-
endif::holygrail,swallow[]
|
1810
|
-
EOS
|
1811
|
-
|
1812
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'swallow' => '' }
|
1813
|
-
reader = doc.reader
|
1814
|
-
lines = []
|
1815
|
-
while reader.has_more_lines?
|
1816
|
-
lines << reader.read_line
|
1817
|
-
end
|
1818
|
-
assert_equal 'Our quest is complete!', (lines * ::Asciidoctor::LF)
|
1819
|
-
end
|
1820
|
-
|
1821
|
-
test 'ifdef with no alternative attributes set does not include content' do
|
1822
|
-
input = <<-EOS
|
1823
|
-
ifdef::holygrail,swallow[]
|
1824
|
-
Our quest is complete!
|
1825
|
-
endif::holygrail,swallow[]
|
1826
|
-
EOS
|
1827
|
-
|
1828
|
-
doc = Asciidoctor::Document.new input
|
1829
|
-
reader = doc.reader
|
1830
|
-
lines = []
|
1831
|
-
while reader.has_more_lines?
|
1832
|
-
lines << reader.read_line
|
1833
|
-
end
|
1834
|
-
assert_equal '', (lines * ::Asciidoctor::LF)
|
1835
|
-
end
|
1836
|
-
|
1837
|
-
test 'ifdef with all required attributes set includes content' do
|
1838
|
-
input = <<-EOS
|
1839
|
-
ifdef::holygrail+swallow[]
|
1840
|
-
Our quest is complete!
|
1841
|
-
endif::holygrail+swallow[]
|
1842
|
-
EOS
|
1843
|
-
|
1844
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'holygrail' => '', 'swallow' => '' }
|
1845
|
-
reader = doc.reader
|
1846
|
-
lines = []
|
1847
|
-
while reader.has_more_lines?
|
1848
|
-
lines << reader.read_line
|
1849
|
-
end
|
1850
|
-
assert_equal 'Our quest is complete!', (lines * ::Asciidoctor::LF)
|
1851
|
-
end
|
1852
|
-
|
1853
|
-
test 'ifdef with missing required attributes does not include content' do
|
1854
|
-
input = <<-EOS
|
1855
|
-
ifdef::holygrail+swallow[]
|
1856
|
-
Our quest is complete!
|
1857
|
-
endif::holygrail+swallow[]
|
1858
|
-
EOS
|
1859
|
-
|
1860
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'holygrail' => '' }
|
1861
|
-
reader = doc.reader
|
1862
|
-
lines = []
|
1863
|
-
while reader.has_more_lines?
|
1864
|
-
lines << reader.read_line
|
1865
|
-
end
|
1866
|
-
assert_equal '', (lines * ::Asciidoctor::LF)
|
1867
|
-
end
|
1868
|
-
|
1869
|
-
test 'ifdef should permit leading, trailing, and repeat operators' do
|
1870
|
-
{
|
1871
|
-
'asciidoctor,' => 'content',
|
1872
|
-
',asciidoctor' => 'content',
|
1873
|
-
'asciidoctor+' => '',
|
1874
|
-
'+asciidoctor' => '',
|
1875
|
-
'asciidoctor,,asciidoctor-version' => 'content',
|
1876
|
-
'asciidoctor++asciidoctor-version' => ''
|
1877
|
-
}.each do |condition, expected|
|
1878
|
-
input = <<-EOS
|
1879
|
-
ifdef::#{condition}[]
|
1880
|
-
content
|
1881
|
-
endif::[]
|
1882
|
-
EOS
|
1883
|
-
assert_equal expected, (document_from_string input, :parse => false).reader.read
|
1884
|
-
end
|
1885
|
-
end
|
1886
|
-
|
1887
|
-
test 'ifndef with undefined attribute includes block' do
|
1888
|
-
input = <<-EOS
|
1889
|
-
ifndef::holygrail[]
|
1890
|
-
Our quest continues to find the holy grail!
|
1891
|
-
endif::holygrail[]
|
1892
|
-
EOS
|
1893
|
-
|
1894
|
-
doc = Asciidoctor::Document.new input
|
1895
|
-
reader = doc.reader
|
1896
|
-
lines = []
|
1897
|
-
while reader.has_more_lines?
|
1898
|
-
lines << reader.read_line
|
1899
|
-
end
|
1900
|
-
assert_equal 'Our quest continues to find the holy grail!', (lines * ::Asciidoctor::LF)
|
1901
|
-
end
|
1902
|
-
|
1903
|
-
test 'ifndef with one alternative attribute set does not include content' do
|
1904
|
-
input = <<-EOS
|
1905
|
-
ifndef::holygrail,swallow[]
|
1906
|
-
Our quest is complete!
|
1907
|
-
endif::holygrail,swallow[]
|
1908
|
-
EOS
|
1909
|
-
|
1910
|
-
result = (Asciidoctor::Document.new input, :attributes => { 'swallow' => '' }).reader.read
|
1911
|
-
assert_empty result
|
1912
|
-
end
|
1913
|
-
|
1914
|
-
test 'ifndef with both alternative attributes set does not include content' do
|
1915
|
-
input = <<-EOS
|
1916
|
-
ifndef::holygrail,swallow[]
|
1917
|
-
Our quest is complete!
|
1918
|
-
endif::holygrail,swallow[]
|
1919
|
-
EOS
|
1920
|
-
|
1921
|
-
result = (Asciidoctor::Document.new input, :attributes => { 'swallow' => '', 'holygrail' => '' }).reader.read
|
1922
|
-
assert_empty result
|
1923
|
-
end
|
1924
|
-
|
1925
|
-
test 'ifndef with no alternative attributes set includes content' do
|
1926
|
-
input = <<-EOS
|
1927
|
-
ifndef::holygrail,swallow[]
|
1928
|
-
Our quest is complete!
|
1929
|
-
endif::holygrail,swallow[]
|
1930
|
-
EOS
|
1931
|
-
|
1932
|
-
result = (Asciidoctor::Document.new input).reader.read
|
1933
|
-
assert_equal 'Our quest is complete!', result
|
1934
|
-
end
|
1935
|
-
|
1936
|
-
test 'ifndef with no required attributes set includes content' do
|
1937
|
-
input = <<-EOS
|
1938
|
-
ifndef::holygrail+swallow[]
|
1939
|
-
Our quest is complete!
|
1940
|
-
endif::holygrail+swallow[]
|
1941
|
-
EOS
|
1942
|
-
|
1943
|
-
result = (Asciidoctor::Document.new input).reader.read
|
1944
|
-
assert_equal 'Our quest is complete!', result
|
1945
|
-
end
|
1946
|
-
|
1947
|
-
test 'ifndef with all required attributes set does not include content' do
|
1948
|
-
input = <<-EOS
|
1949
|
-
ifndef::holygrail+swallow[]
|
1950
|
-
Our quest is complete!
|
1951
|
-
endif::holygrail+swallow[]
|
1952
|
-
EOS
|
1953
|
-
|
1954
|
-
result = (Asciidoctor::Document.new input, :attributes => { 'swallow' => '', 'holygrail' => '' }).reader.read
|
1955
|
-
assert_empty result
|
1956
|
-
end
|
1957
|
-
|
1958
|
-
test 'ifndef with at least one required attributes set does not include content' do
|
1959
|
-
input = <<-EOS
|
1960
|
-
ifndef::holygrail+swallow[]
|
1961
|
-
Our quest is complete!
|
1962
|
-
endif::holygrail+swallow[]
|
1963
|
-
EOS
|
1964
|
-
|
1965
|
-
result = (Asciidoctor::Document.new input, :attributes => { 'swallow' => '' }).reader.read
|
1966
|
-
assert_equal 'Our quest is complete!', result
|
1967
|
-
end
|
1968
|
-
|
1969
|
-
test 'escaped ifdef is unescaped and ignored' do
|
1970
|
-
input = <<-EOS
|
1971
|
-
\\ifdef::holygrail[]
|
1972
|
-
content
|
1973
|
-
\\endif::holygrail[]
|
1974
|
-
EOS
|
1975
|
-
|
1976
|
-
doc = Asciidoctor::Document.new input
|
1977
|
-
reader = doc.reader
|
1978
|
-
lines = []
|
1979
|
-
while reader.has_more_lines?
|
1980
|
-
lines << reader.read_line
|
1981
|
-
end
|
1982
|
-
assert_equal "ifdef::holygrail[]\ncontent\nendif::holygrail[]", (lines * ::Asciidoctor::LF)
|
1983
|
-
end
|
1984
|
-
|
1985
|
-
test 'ifeval comparing missing attribute to nil includes content' do
|
1986
|
-
input = <<-EOS
|
1987
|
-
ifeval::['{foo}' == '']
|
1988
|
-
No foo for you!
|
1989
|
-
endif::[]
|
1990
|
-
EOS
|
1991
|
-
|
1992
|
-
doc = Asciidoctor::Document.new input
|
1993
|
-
reader = doc.reader
|
1994
|
-
lines = []
|
1995
|
-
while reader.has_more_lines?
|
1996
|
-
lines << reader.read_line
|
1997
|
-
end
|
1998
|
-
assert_equal 'No foo for you!', (lines * ::Asciidoctor::LF)
|
1999
|
-
end
|
2000
|
-
|
2001
|
-
test 'ifeval comparing missing attribute to 0 drops content' do
|
2002
|
-
input = <<-EOS
|
2003
|
-
ifeval::[{leveloffset} == 0]
|
2004
|
-
I didn't make the cut!
|
2005
|
-
endif::[]
|
2006
|
-
EOS
|
2007
|
-
|
2008
|
-
doc = Asciidoctor::Document.new input
|
2009
|
-
reader = doc.reader
|
2010
|
-
lines = []
|
2011
|
-
while reader.has_more_lines?
|
2012
|
-
lines << reader.read_line
|
2013
|
-
end
|
2014
|
-
assert_equal '', (lines * ::Asciidoctor::LF)
|
2015
|
-
end
|
2016
|
-
|
2017
|
-
test 'ifeval comparing double-quoted attribute to matching string includes content' do
|
2018
|
-
input = <<-EOS
|
2019
|
-
ifeval::["{gem}" == "asciidoctor"]
|
2020
|
-
Asciidoctor it is!
|
2021
|
-
endif::[]
|
2022
|
-
EOS
|
2023
|
-
|
2024
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'gem' => 'asciidoctor' }
|
2025
|
-
reader = doc.reader
|
2026
|
-
lines = []
|
2027
|
-
while reader.has_more_lines?
|
2028
|
-
lines << reader.read_line
|
2029
|
-
end
|
2030
|
-
assert_equal 'Asciidoctor it is!', (lines * ::Asciidoctor::LF)
|
2031
|
-
end
|
2032
|
-
|
2033
|
-
test 'ifeval comparing single-quoted attribute to matching string includes content' do
|
2034
|
-
input = <<-EOS
|
2035
|
-
ifeval::['{gem}' == 'asciidoctor']
|
2036
|
-
Asciidoctor it is!
|
2037
|
-
endif::[]
|
2038
|
-
EOS
|
2039
|
-
|
2040
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'gem' => 'asciidoctor' }
|
2041
|
-
reader = doc.reader
|
2042
|
-
lines = []
|
2043
|
-
while reader.has_more_lines?
|
2044
|
-
lines << reader.read_line
|
2045
|
-
end
|
2046
|
-
assert_equal 'Asciidoctor it is!', (lines * ::Asciidoctor::LF)
|
2047
|
-
end
|
2048
|
-
|
2049
|
-
test 'ifeval comparing quoted attribute to non-matching string drops content' do
|
2050
|
-
input = <<-EOS
|
2051
|
-
ifeval::['{gem}' == 'asciidoctor']
|
2052
|
-
Asciidoctor it is!
|
2053
|
-
endif::[]
|
2054
|
-
EOS
|
2055
|
-
|
2056
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'gem' => 'tilt' }
|
2057
|
-
reader = doc.reader
|
2058
|
-
lines = []
|
2059
|
-
while reader.has_more_lines?
|
2060
|
-
lines << reader.read_line
|
2061
|
-
end
|
2062
|
-
assert_equal '', (lines * ::Asciidoctor::LF)
|
2063
|
-
end
|
2064
|
-
|
2065
|
-
test 'ifeval comparing attribute to lower version number includes content' do
|
2066
|
-
input = <<-EOS
|
2067
|
-
ifeval::['{asciidoctor-version}' >= '0.1.0']
|
2068
|
-
That version will do!
|
2069
|
-
endif::[]
|
2070
|
-
EOS
|
2071
|
-
|
2072
|
-
doc = Asciidoctor::Document.new input
|
2073
|
-
reader = doc.reader
|
2074
|
-
lines = []
|
2075
|
-
while reader.has_more_lines?
|
2076
|
-
lines << reader.read_line
|
2077
|
-
end
|
2078
|
-
assert_equal 'That version will do!', (lines * ::Asciidoctor::LF)
|
2079
|
-
end
|
2080
|
-
|
2081
|
-
test 'ifeval comparing attribute to self includes content' do
|
2082
|
-
input = <<-EOS
|
2083
|
-
ifeval::['{asciidoctor-version}' == '{asciidoctor-version}']
|
2084
|
-
Of course it's the same!
|
2085
|
-
endif::[]
|
2086
|
-
EOS
|
2087
|
-
|
2088
|
-
doc = Asciidoctor::Document.new input
|
2089
|
-
reader = doc.reader
|
2090
|
-
lines = []
|
2091
|
-
while reader.has_more_lines?
|
2092
|
-
lines << reader.read_line
|
2093
|
-
end
|
2094
|
-
assert_equal 'Of course it\'s the same!', (lines * ::Asciidoctor::LF)
|
2095
|
-
end
|
2096
|
-
|
2097
|
-
test 'ifeval arguments can be transposed' do
|
2098
|
-
input = <<-EOS
|
2099
|
-
ifeval::['0.1.0' <= '{asciidoctor-version}']
|
2100
|
-
That version will do!
|
2101
|
-
endif::[]
|
2102
|
-
EOS
|
2103
|
-
|
2104
|
-
doc = Asciidoctor::Document.new input
|
2105
|
-
reader = doc.reader
|
2106
|
-
lines = []
|
2107
|
-
while reader.has_more_lines?
|
2108
|
-
lines << reader.read_line
|
2109
|
-
end
|
2110
|
-
assert_equal 'That version will do!', (lines * ::Asciidoctor::LF)
|
2111
|
-
end
|
2112
|
-
|
2113
|
-
test 'ifeval matching numeric equality includes content' do
|
2114
|
-
input = <<-EOS
|
2115
|
-
ifeval::[{rings} == 1]
|
2116
|
-
One ring to rule them all!
|
2117
|
-
endif::[]
|
2118
|
-
EOS
|
2119
|
-
|
2120
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'rings' => '1' }
|
2121
|
-
reader = doc.reader
|
2122
|
-
lines = []
|
2123
|
-
while reader.has_more_lines?
|
2124
|
-
lines << reader.read_line
|
2125
|
-
end
|
2126
|
-
assert_equal 'One ring to rule them all!', (lines * ::Asciidoctor::LF)
|
2127
|
-
end
|
2128
|
-
|
2129
|
-
test 'ifeval matching numeric inequality includes content' do
|
2130
|
-
input = <<-EOS
|
2131
|
-
ifeval::[{rings} != 0]
|
2132
|
-
One ring to rule them all!
|
2133
|
-
endif::[]
|
2134
|
-
EOS
|
2135
|
-
|
2136
|
-
doc = Asciidoctor::Document.new input, :attributes => { 'rings' => '1' }
|
2137
|
-
reader = doc.reader
|
2138
|
-
lines = []
|
2139
|
-
while reader.has_more_lines?
|
2140
|
-
lines << reader.read_line
|
2141
|
-
end
|
2142
|
-
assert_equal 'One ring to rule them all!', (lines * ::Asciidoctor::LF)
|
2143
|
-
end
|
2144
|
-
|
2145
|
-
test 'ifdef with no target is ignored' do
|
2146
|
-
input = <<-EOS
|
2147
|
-
ifdef::[]
|
2148
|
-
content
|
2149
|
-
EOS
|
2150
|
-
|
2151
|
-
doc = Asciidoctor::Document.new input
|
2152
|
-
reader = doc.reader
|
2153
|
-
lines = []
|
2154
|
-
while reader.has_more_lines?
|
2155
|
-
lines << reader.read_line
|
2156
|
-
end
|
2157
|
-
assert_equal "ifdef::[]\ncontent", (lines * ::Asciidoctor::LF)
|
2158
|
-
end
|
2159
|
-
end
|
2160
|
-
end
|
2161
|
-
end
|