asciidoctor 0.1.4 → 1.5.0

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.

Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +209 -25
  3. data/{LICENSE → LICENSE.adoc} +4 -3
  4. data/README.adoc +392 -395
  5. data/Rakefile +94 -137
  6. data/benchmark/benchmark.rb +127 -0
  7. data/benchmark/sample-data/mdbasics.adoc +334 -0
  8. data/bin/asciidoctor +5 -8
  9. data/bin/asciidoctor-safe +4 -8
  10. data/compat/asciidoc.conf +78 -11
  11. data/compat/font-awesome-3-compat.css +397 -0
  12. data/data/stylesheets/asciidoctor-default.css +399 -0
  13. data/data/stylesheets/coderay-asciidoctor.css +89 -0
  14. data/features/open_block.feature +92 -0
  15. data/features/pass_block.feature +66 -0
  16. data/features/step_definitions.rb +42 -0
  17. data/features/text_formatting.feature +55 -0
  18. data/features/xref.feature +116 -0
  19. data/lib/asciidoctor.rb +1155 -605
  20. data/lib/asciidoctor/abstract_block.rb +157 -71
  21. data/lib/asciidoctor/abstract_node.rb +150 -93
  22. data/lib/asciidoctor/attribute_list.rb +85 -90
  23. data/lib/asciidoctor/block.rb +51 -24
  24. data/lib/asciidoctor/callouts.rb +4 -7
  25. data/lib/asciidoctor/cli.rb +3 -0
  26. data/lib/asciidoctor/cli/invoker.rb +86 -76
  27. data/lib/asciidoctor/cli/options.rb +111 -61
  28. data/lib/asciidoctor/converter.rb +232 -0
  29. data/lib/asciidoctor/converter/base.rb +58 -0
  30. data/lib/asciidoctor/converter/composite.rb +66 -0
  31. data/lib/asciidoctor/converter/docbook45.rb +94 -0
  32. data/lib/asciidoctor/converter/docbook5.rb +684 -0
  33. data/lib/asciidoctor/converter/factory.rb +225 -0
  34. data/lib/asciidoctor/converter/html5.rb +1081 -0
  35. data/lib/asciidoctor/converter/template.rb +296 -0
  36. data/lib/asciidoctor/core_ext.rb +7 -0
  37. data/lib/asciidoctor/core_ext/object/nil_or_empty.rb +23 -0
  38. data/lib/asciidoctor/core_ext/string/chr.rb +6 -0
  39. data/lib/asciidoctor/core_ext/symbol/length.rb +6 -0
  40. data/lib/asciidoctor/document.rb +590 -304
  41. data/lib/asciidoctor/extensions.rb +1100 -308
  42. data/lib/asciidoctor/helpers.rb +109 -46
  43. data/lib/asciidoctor/inline.rb +16 -9
  44. data/lib/asciidoctor/list.rb +23 -15
  45. data/lib/asciidoctor/opal_ext.rb +4 -0
  46. data/lib/asciidoctor/opal_ext/comparable.rb +38 -0
  47. data/lib/asciidoctor/opal_ext/dir.rb +13 -0
  48. data/lib/asciidoctor/opal_ext/error.rb +2 -0
  49. data/lib/asciidoctor/opal_ext/file.rb +125 -0
  50. data/lib/asciidoctor/{lexer.rb → parser.rb} +646 -455
  51. data/lib/asciidoctor/path_resolver.rb +141 -77
  52. data/lib/asciidoctor/reader.rb +257 -187
  53. data/lib/asciidoctor/section.rb +12 -16
  54. data/lib/asciidoctor/stylesheets.rb +91 -0
  55. data/lib/asciidoctor/substitutors.rb +1548 -0
  56. data/lib/asciidoctor/table.rb +73 -57
  57. data/lib/asciidoctor/timings.rb +39 -0
  58. data/lib/asciidoctor/version.rb +1 -1
  59. data/man/asciidoctor.1 +22 -14
  60. data/man/asciidoctor.adoc +18 -10
  61. data/test/attributes_test.rb +314 -14
  62. data/test/blocks_test.rb +763 -118
  63. data/test/converter_test.rb +352 -0
  64. data/test/document_test.rb +518 -199
  65. data/test/extensions_test.rb +273 -103
  66. data/test/fixtures/asciidoc_index.txt +27 -13
  67. data/test/fixtures/basic-docinfo.xml +1 -1
  68. data/test/fixtures/chapter-a.adoc +3 -0
  69. data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +6 -0
  70. data/test/fixtures/docinfo.xml +1 -1
  71. data/test/fixtures/include-file.asciidoc +2 -0
  72. data/test/fixtures/master.adoc +5 -0
  73. data/test/invoker_test.rb +173 -61
  74. data/test/links_test.rb +97 -21
  75. data/test/lists_test.rb +181 -22
  76. data/test/options_test.rb +86 -2
  77. data/test/paragraphs_test.rb +47 -5
  78. data/test/{lexer_test.rb → parser_test.rb} +128 -57
  79. data/test/paths_test.rb +36 -1
  80. data/test/preamble_test.rb +25 -17
  81. data/test/reader_test.rb +404 -249
  82. data/test/sections_test.rb +623 -58
  83. data/test/substitutions_test.rb +609 -132
  84. data/test/tables_test.rb +198 -24
  85. data/test/test_helper.rb +101 -31
  86. data/test/text_test.rb +88 -31
  87. metadata +160 -64
  88. data/Gemfile +0 -12
  89. data/Guardfile +0 -18
  90. data/asciidoctor.gemspec +0 -143
  91. data/lib/asciidoctor/backends/_stylesheets.rb +0 -466
  92. data/lib/asciidoctor/backends/base_template.rb +0 -114
  93. data/lib/asciidoctor/backends/docbook45.rb +0 -774
  94. data/lib/asciidoctor/backends/docbook5.rb +0 -103
  95. data/lib/asciidoctor/backends/html5.rb +0 -1214
  96. data/lib/asciidoctor/renderer.rb +0 -259
  97. data/lib/asciidoctor/substituters.rb +0 -1083
  98. data/test/fixtures/asciidoc.txt +0 -105
  99. data/test/fixtures/ascshort.txt +0 -32
  100. data/test/fixtures/list_elements.asciidoc +0 -10
  101. data/test/renderer_test.rb +0 -162
@@ -1,4 +1,8 @@
1
- require 'test_helper'
1
+ # encoding: UTF-8
2
+ unless defined? ASCIIDOCTOR_PROJECT_DIR
3
+ $: << File.dirname(__FILE__); $:.uniq!
4
+ require 'test_helper'
5
+ end
2
6
  require 'asciidoctor/cli/options'
3
7
 
4
8
  context 'Options' do
@@ -45,7 +49,7 @@ context 'Options' do
45
49
  test 'basic argument assignment' do
46
50
  options = Asciidoctor::Cli::Options.parse!(%w(-v -s -d book test/fixtures/sample.asciidoc))
47
51
 
48
- assert_equal true, options[:verbose]
52
+ assert_equal 2, options[:verbose]
49
53
  assert_equal false, options[:header_footer]
50
54
  assert_equal 'book', options[:attributes]['doctype']
51
55
  assert_equal 1, options[:input_files].size
@@ -108,4 +112,84 @@ context 'Options' do
108
112
  assert_equal ['custom-backend', 'custom-backend-hacks'], options[:template_dirs]
109
113
  end
110
114
 
115
+ test 'multiple -r flags requires specified libraries' do
116
+ options = Asciidoctor::Cli::Options.new
117
+ redirect_streams do |stdout, stderr|
118
+ exitval = options.parse! %w(-r foobar -r foobaz test/fixtures/sample.asciidoc)
119
+ assert_match(%(asciidoctor: FAILED: 'foobar' could not be loaded), stderr.string)
120
+ assert_equal 1, exitval
121
+ assert_equal ['foobar', 'foobaz'], options[:requires]
122
+ end
123
+ end
124
+
125
+ test '-r flag with multiple values requires specified libraries' do
126
+ options = Asciidoctor::Cli::Options.new
127
+ redirect_streams do |stdout, stderr|
128
+ exitval = options.parse! %w(-r foobar,foobaz test/fixtures/sample.asciidoc)
129
+ assert_match(%(asciidoctor: FAILED: 'foobar' could not be loaded), stderr.string)
130
+ assert_equal 1, exitval
131
+ assert_equal ['foobar', 'foobaz'], options[:requires]
132
+ end
133
+ end
134
+
135
+ test '-I option appends paths to $LOAD_PATH' do
136
+ options = Asciidoctor::Cli::Options.new
137
+ old_load_path = $LOAD_PATH.dup
138
+ begin
139
+ exitval = options.parse! %w(-I foobar -I foobaz test/fixtures/sample.asciidoc)
140
+ refute_equal 1, exitval
141
+ assert_equal old_load_path.size + 2, $LOAD_PATH.size
142
+ assert_equal File.expand_path('foobar'), $LOAD_PATH[0]
143
+ assert_equal File.expand_path('foobaz'), $LOAD_PATH[1]
144
+ assert_equal ['foobar', 'foobaz'], options[:load_paths]
145
+ ensure
146
+ ($LOAD_PATH.size - old_load_path.size).times { $LOAD_PATH.shift }
147
+ end
148
+ end
149
+
150
+ test '-I option appends multiple paths to $LOAD_PATH' do
151
+ options = Asciidoctor::Cli::Options.new
152
+ old_load_path = $LOAD_PATH.dup
153
+ begin
154
+ exitval = options.parse! %W(-I foobar#{File::PATH_SEPARATOR}foobaz test/fixtures/sample.asciidoc)
155
+ refute_equal 1, exitval
156
+ assert_equal old_load_path.size + 2, $LOAD_PATH.size
157
+ assert_equal File.expand_path('foobar'), $LOAD_PATH[0]
158
+ assert_equal File.expand_path('foobaz'), $LOAD_PATH[1]
159
+ assert_equal ['foobar', 'foobaz'], options[:load_paths]
160
+ ensure
161
+ ($LOAD_PATH.size - old_load_path.size).times { $LOAD_PATH.shift }
162
+ end
163
+ end
164
+
165
+ test 'should set verbose to 2 when -v flag is specified' do
166
+ options = Asciidoctor::Cli::Options.parse!(%w(-v test/fixtures/sample.asciidoc))
167
+ assert_equal 2, options[:verbose]
168
+ end
169
+
170
+ test 'should set verbose to 0 when -q flag is specified' do
171
+ options = Asciidoctor::Cli::Options.parse!(%w(-q test/fixtures/sample.asciidoc))
172
+ assert_equal 0, options[:verbose]
173
+ end
174
+
175
+ test 'should set verbose to 2 when -v flag is specified after -q flag' do
176
+ options = Asciidoctor::Cli::Options.parse!(%w(-q -v test/fixtures/sample.asciidoc))
177
+ assert_equal 2, options[:verbose]
178
+ end
179
+
180
+ test 'should set verbose to 0 when -q flag is specified after -v flag' do
181
+ options = Asciidoctor::Cli::Options.parse!(%w(-v -q test/fixtures/sample.asciidoc))
182
+ assert_equal 0, options[:verbose]
183
+ end
184
+
185
+ test 'should enable timings when -t flag is specified' do
186
+ options = Asciidoctor::Cli::Options.parse!(%w(-t test/fixtures/sample.asciidoc))
187
+ assert_equal true, options[:timings]
188
+ end
189
+
190
+ test 'timings option is disable by default' do
191
+ options = Asciidoctor::Cli::Options.parse!(%w(test/fixtures/sample.asciidoc))
192
+ assert_equal false, options[:timings]
193
+ end
194
+
111
195
  end
@@ -1,4 +1,8 @@
1
- require 'test_helper'
1
+ # encoding: UTF-8
2
+ unless defined? ASCIIDOCTOR_PROJECT_DIR
3
+ $: << File.dirname(__FILE__); $:.uniq!
4
+ require 'test_helper'
5
+ end
2
6
 
3
7
  context 'Paragraphs' do
4
8
  context 'Normal' do
@@ -186,11 +190,35 @@ Note that multi-entry terms generate separate index entries.
186
190
  test 'normal paragraph should honor explicit subs list' do
187
191
  input = <<-EOS
188
192
  [subs="specialcharacters"]
189
- *Hey Jude*
193
+ *<Hey Jude>*
190
194
  EOS
191
195
 
192
196
  output = render_embedded_string input
193
- assert output.include?('*Hey Jude*')
197
+ assert output.include?('*&lt;Hey Jude&gt;*')
198
+ end
199
+
200
+ test 'normal paragraph should honor specialchars shorthand' do
201
+ input = <<-EOS
202
+ [subs="specialchars"]
203
+ *<Hey Jude>*
204
+ EOS
205
+
206
+ output = render_embedded_string input
207
+ assert output.include?('*&lt;Hey Jude&gt;*')
208
+ end
209
+
210
+ test 'should add a hardbreak at end of each line when hardbreaks option is set' do
211
+ input = <<-EOS
212
+ [%hardbreaks]
213
+ read
214
+ my
215
+ lips
216
+ EOS
217
+
218
+ output = render_embedded_string input
219
+ assert_css 'br', output, 2
220
+ assert_xpath '//p', output, 1
221
+ assert output.include?("<p>read<br>\nmy<br>\nlips</p>")
194
222
  end
195
223
  end
196
224
 
@@ -265,7 +293,7 @@ use the source, luke!
265
293
  die 'zomg perl sucks';
266
294
  EOS
267
295
  output = render_embedded_string input
268
- assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="perl language-perl"][text()="die 'zomg perl sucks';"]), output, 1
296
+ assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="language-perl"][@data-lang="perl"][text()="die 'zomg perl sucks';"]), output, 1
269
297
  end
270
298
 
271
299
  test 'literal paragraph terminates at block attribute list' do
@@ -336,6 +364,16 @@ A famouse quote.
336
364
  assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1
337
365
  end
338
366
 
367
+ test 'should perform normal subs on a verse paragraph' do
368
+ input = <<-EOS
369
+ [verse]
370
+ _GET /groups/link:#group-id[\{group-id\}]_
371
+ EOS
372
+
373
+ output = render_embedded_string input
374
+ assert output.include?('<pre class="content"><em>GET /groups/<a href="#group-id">{group-id}</a></em></pre>')
375
+ end
376
+
339
377
  test 'quote paragraph should honor explicit subs list' do
340
378
  input = <<-EOS
341
379
  [subs="specialcharacters"]
@@ -397,6 +435,8 @@ An abstract for the book.
397
435
  [partintro]
398
436
  An intro to this part.
399
437
 
438
+ == Chapter 1
439
+
400
440
  [sidebar]
401
441
  Just a side note.
402
442
 
@@ -433,6 +473,8 @@ An abstract for the book.
433
473
  .Part intro title
434
474
  An intro to this part.
435
475
 
476
+ == Chapter 1
477
+
436
478
  [sidebar]
437
479
  .Sidebar title
438
480
  Just a side note.
@@ -469,7 +511,7 @@ Wise words from a wise person.
469
511
  test 'should only format and output text in first paragraph when doctype is inline' do
470
512
  input = "http://asciidoc.org[AsciiDoc] is a _lightweight_ markup language...\n\nignored"
471
513
  output = render_string input, :doctype => 'inline'
472
- assert_equal '<a href="http://asciidoc.org">AsciiDoc</a> is a <em>lightweight</em> markup language&#8230;', output
514
+ assert_equal '<a href="http://asciidoc.org">AsciiDoc</a> is a <em>lightweight</em> markup language&#8230;&#8203;', output
473
515
  end
474
516
 
475
517
  test 'should output empty string if first block is not a paragraph' do
@@ -1,16 +1,20 @@
1
- require 'test_helper'
1
+ # encoding: UTF-8
2
+ unless defined? ASCIIDOCTOR_PROJECT_DIR
3
+ $: << File.dirname(__FILE__); $:.uniq!
4
+ require 'test_helper'
5
+ end
2
6
 
3
- context "Lexer" do
7
+ context "Parser" do
4
8
 
5
9
  test "is_section_title?" do
6
- assert Asciidoctor::Lexer.is_section_title?('AsciiDoc Home Page', '==================')
7
- assert Asciidoctor::Lexer.is_section_title?('=== AsciiDoc Home Page')
10
+ assert Asciidoctor::Parser.is_section_title?('AsciiDoc Home Page', '==================')
11
+ assert Asciidoctor::Parser.is_section_title?('=== AsciiDoc Home Page')
8
12
  end
9
13
 
10
14
  test 'sanitize attribute name' do
11
- assert_equal 'foobar', Asciidoctor::Lexer.sanitize_attribute_name("Foo Bar")
12
- assert_equal 'foo', Asciidoctor::Lexer.sanitize_attribute_name("foo")
13
- assert_equal 'foo3-bar', Asciidoctor::Lexer.sanitize_attribute_name("Foo 3^ # - Bar[")
15
+ assert_equal 'foobar', Asciidoctor::Parser.sanitize_attribute_name("Foo Bar")
16
+ assert_equal 'foo', Asciidoctor::Parser.sanitize_attribute_name("foo")
17
+ assert_equal 'foo3-bar', Asciidoctor::Parser.sanitize_attribute_name("Foo 3^ # - Bar[")
14
18
  end
15
19
 
16
20
  test "collect unnamed attribute" do
@@ -198,7 +202,7 @@ context "Lexer" do
198
202
 
199
203
  test 'parse style attribute with id and role' do
200
204
  attributes = {1 => 'style#id.role'}
201
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
205
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
202
206
  assert_equal 'style', style
203
207
  assert_nil original_style
204
208
  assert_equal 'style', attributes['style']
@@ -209,7 +213,7 @@ context "Lexer" do
209
213
 
210
214
  test 'parse style attribute with style, role, id and option' do
211
215
  attributes = {1 => 'style.role#id%fragment'}
212
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
216
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
213
217
  assert_equal 'style', style
214
218
  assert_nil original_style
215
219
  assert_equal 'style', attributes['style']
@@ -222,7 +226,7 @@ context "Lexer" do
222
226
 
223
227
  test 'parse style attribute with style, id and multiple roles' do
224
228
  attributes = {1 => 'style#id.role1.role2'}
225
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
229
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
226
230
  assert_equal 'style', style
227
231
  assert_nil original_style
228
232
  assert_equal 'style', attributes['style']
@@ -233,7 +237,7 @@ context "Lexer" do
233
237
 
234
238
  test 'parse style attribute with style, multiple roles and id' do
235
239
  attributes = {1 => 'style.role1.role2#id'}
236
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
240
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
237
241
  assert_equal 'style', style
238
242
  assert_nil original_style
239
243
  assert_equal 'style', attributes['style']
@@ -244,7 +248,7 @@ context "Lexer" do
244
248
 
245
249
  test 'parse style attribute with positional and original style' do
246
250
  attributes = {1 => 'new_style', 'style' => 'original_style'}
247
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
251
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
248
252
  assert_equal 'new_style', style
249
253
  assert_equal 'original_style', original_style
250
254
  assert_equal 'new_style', attributes['style']
@@ -253,7 +257,7 @@ context "Lexer" do
253
257
 
254
258
  test 'parse style attribute with id and role only' do
255
259
  attributes = {1 => '#id.role'}
256
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
260
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
257
261
  assert_nil style
258
262
  assert_nil original_style
259
263
  assert_equal 'id', attributes['id']
@@ -263,7 +267,7 @@ context "Lexer" do
263
267
 
264
268
  test 'parse empty style attribute' do
265
269
  attributes = {1 => nil}
266
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
270
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
267
271
  assert_nil style
268
272
  assert_nil original_style
269
273
  assert_nil attributes['id']
@@ -273,7 +277,7 @@ context "Lexer" do
273
277
 
274
278
  test 'parse style attribute with option should preserve existing options' do
275
279
  attributes = {1 => '%header', 'options' => 'footer', 'footer-option' => ''}
276
- style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
280
+ style, original_style = Asciidoctor::Parser.parse_style_attribute(attributes)
277
281
  assert_nil style
278
282
  assert_nil original_style
279
283
  assert_equal 'header,footer', attributes['options']
@@ -282,7 +286,7 @@ context "Lexer" do
282
286
  end
283
287
 
284
288
  test "parse author first" do
285
- metadata, = parse_header_metadata 'Stuart'
289
+ metadata, _ = parse_header_metadata 'Stuart'
286
290
  assert_equal 5, metadata.size
287
291
  assert_equal 1, metadata['authorcount']
288
292
  assert_equal metadata['author'], metadata['authors']
@@ -291,7 +295,7 @@ context "Lexer" do
291
295
  end
292
296
 
293
297
  test "parse author first last" do
294
- metadata, = parse_header_metadata 'Yukihiro Matsumoto'
298
+ metadata, _ = parse_header_metadata 'Yukihiro Matsumoto'
295
299
  assert_equal 6, metadata.size
296
300
  assert_equal 1, metadata['authorcount']
297
301
  assert_equal 'Yukihiro Matsumoto', metadata['author']
@@ -302,7 +306,7 @@ context "Lexer" do
302
306
  end
303
307
 
304
308
  test "parse author first middle last" do
305
- metadata, = parse_header_metadata 'David Heinemeier Hansson'
309
+ metadata, _ = parse_header_metadata 'David Heinemeier Hansson'
306
310
  assert_equal 7, metadata.size
307
311
  assert_equal 1, metadata['authorcount']
308
312
  assert_equal 'David Heinemeier Hansson', metadata['author']
@@ -314,7 +318,7 @@ context "Lexer" do
314
318
  end
315
319
 
316
320
  test "parse author first middle last email" do
317
- metadata, = parse_header_metadata 'David Heinemeier Hansson <rails@ruby-lang.org>'
321
+ metadata, _ = parse_header_metadata 'David Heinemeier Hansson <rails@ruby-lang.org>'
318
322
  assert_equal 8, metadata.size
319
323
  assert_equal 1, metadata['authorcount']
320
324
  assert_equal 'David Heinemeier Hansson', metadata['author']
@@ -327,7 +331,7 @@ context "Lexer" do
327
331
  end
328
332
 
329
333
  test "parse author first email" do
330
- metadata, = parse_header_metadata 'Stuart <founder@asciidoc.org>'
334
+ metadata, _ = parse_header_metadata 'Stuart <founder@asciidoc.org>'
331
335
  assert_equal 6, metadata.size
332
336
  assert_equal 1, metadata['authorcount']
333
337
  assert_equal 'Stuart', metadata['author']
@@ -338,7 +342,7 @@ context "Lexer" do
338
342
  end
339
343
 
340
344
  test "parse author first last email" do
341
- metadata, = parse_header_metadata 'Stuart Rackham <founder@asciidoc.org>'
345
+ metadata, _ = parse_header_metadata 'Stuart Rackham <founder@asciidoc.org>'
342
346
  assert_equal 7, metadata.size
343
347
  assert_equal 1, metadata['authorcount']
344
348
  assert_equal 'Stuart Rackham', metadata['author']
@@ -350,7 +354,7 @@ context "Lexer" do
350
354
  end
351
355
 
352
356
  test "parse author with hyphen" do
353
- metadata, = parse_header_metadata 'Tim Berners-Lee <founder@www.org>'
357
+ metadata, _ = parse_header_metadata 'Tim Berners-Lee <founder@www.org>'
354
358
  assert_equal 7, metadata.size
355
359
  assert_equal 1, metadata['authorcount']
356
360
  assert_equal 'Tim Berners-Lee', metadata['author']
@@ -362,7 +366,7 @@ context "Lexer" do
362
366
  end
363
367
 
364
368
  test "parse author with single quote" do
365
- metadata, = parse_header_metadata 'Stephen O\'Grady <founder@redmonk.com>'
369
+ metadata, _ = parse_header_metadata 'Stephen O\'Grady <founder@redmonk.com>'
366
370
  assert_equal 7, metadata.size
367
371
  assert_equal 1, metadata['authorcount']
368
372
  assert_equal 'Stephen O\'Grady', metadata['author']
@@ -374,7 +378,7 @@ context "Lexer" do
374
378
  end
375
379
 
376
380
  test "parse author with dotted initial" do
377
- metadata, = parse_header_metadata 'Heiko W. Rupp <hwr@example.de>'
381
+ metadata, _ = parse_header_metadata 'Heiko W. Rupp <hwr@example.de>'
378
382
  assert_equal 8, metadata.size
379
383
  assert_equal 1, metadata['authorcount']
380
384
  assert_equal 'Heiko W. Rupp', metadata['author']
@@ -387,7 +391,7 @@ context "Lexer" do
387
391
  end
388
392
 
389
393
  test "parse author with underscore" do
390
- metadata, = parse_header_metadata 'Tim_E Fella'
394
+ metadata, _ = parse_header_metadata 'Tim_E Fella'
391
395
  assert_equal 6, metadata.size
392
396
  assert_equal 1, metadata['authorcount']
393
397
  assert_equal 'Tim E Fella', metadata['author']
@@ -397,8 +401,31 @@ context "Lexer" do
397
401
  assert_equal 'TF', metadata['authorinitials']
398
402
  end
399
403
 
404
+ test 'parse author name with letters outside basic latin' do
405
+ metadata, _ = parse_header_metadata 'Stéphane Brontë'
406
+ assert_equal 6, metadata.size
407
+ assert_equal 1, metadata['authorcount']
408
+ assert_equal 'Stéphane Brontë', metadata['author']
409
+ assert_equal metadata['author'], metadata['authors']
410
+ assert_equal 'Stéphane', metadata['firstname']
411
+ assert_equal 'Brontë', metadata['lastname']
412
+ assert_equal 'SB', metadata['authorinitials']
413
+ end if ::RUBY_MIN_VERSION_1_9
414
+
415
+ test 'parse ideographic author names' do
416
+ metadata, _ = parse_header_metadata '李 四 <si.li@example.com>'
417
+ assert_equal 7, metadata.size
418
+ assert_equal 1, metadata['authorcount']
419
+ assert_equal '李 四', metadata['author']
420
+ assert_equal metadata['author'], metadata['authors']
421
+ assert_equal '李', metadata['firstname']
422
+ assert_equal '四', metadata['lastname']
423
+ assert_equal 'si.li@example.com', metadata['email']
424
+ assert_equal '李四', metadata['authorinitials']
425
+ end if ::RUBY_MIN_VERSION_1_9
426
+
400
427
  test "parse author condenses whitespace" do
401
- metadata, = parse_header_metadata ' Stuart Rackham <founder@asciidoc.org>'
428
+ metadata, _ = parse_header_metadata ' Stuart Rackham <founder@asciidoc.org>'
402
429
  assert_equal 7, metadata.size
403
430
  assert_equal 1, metadata['authorcount']
404
431
  assert_equal 'Stuart Rackham', metadata['author']
@@ -410,7 +437,7 @@ context "Lexer" do
410
437
  end
411
438
 
412
439
  test "parse invalid author line becomes author" do
413
- metadata, = parse_header_metadata ' Stuart Rackham, founder of AsciiDoc <founder@asciidoc.org>'
440
+ metadata, _ = parse_header_metadata ' Stuart Rackham, founder of AsciiDoc <founder@asciidoc.org>'
414
441
  assert_equal 5, metadata.size
415
442
  assert_equal 1, metadata['authorcount']
416
443
  assert_equal 'Stuart Rackham, founder of AsciiDoc <founder@asciidoc.org>', metadata['author']
@@ -420,7 +447,7 @@ context "Lexer" do
420
447
  end
421
448
 
422
449
  test 'parse multiple authors' do
423
- metadata, = parse_header_metadata 'Doc Writer <doc.writer@asciidoc.org>; John Smith <john.smith@asciidoc.org>'
450
+ metadata, _ = parse_header_metadata 'Doc Writer <doc.writer@asciidoc.org>; John Smith <john.smith@asciidoc.org>'
424
451
  assert_equal 2, metadata['authorcount']
425
452
  assert_equal 'Doc Writer, John Smith', metadata['authors']
426
453
  assert_equal 'Doc Writer', metadata['author']
@@ -429,7 +456,11 @@ context "Lexer" do
429
456
  end
430
457
 
431
458
  test "parse rev number date remark" do
432
- metadata, = parse_header_metadata "Ryan Waldron\nv0.0.7, 2013-12-18: The first release you can stand on"
459
+ input = <<-EOS
460
+ Ryan Waldron
461
+ v0.0.7, 2013-12-18: The first release you can stand on
462
+ EOS
463
+ metadata, _ = parse_header_metadata input
433
464
  assert_equal 9, metadata.size
434
465
  assert_equal '0.0.7', metadata['revnumber']
435
466
  assert_equal '2013-12-18', metadata['revdate']
@@ -437,39 +468,64 @@ context "Lexer" do
437
468
  end
438
469
 
439
470
  test "parse rev date" do
440
- metadata, = parse_header_metadata "Ryan Waldron\n2013-12-18"
471
+ input = <<-EOS
472
+ Ryan Waldron
473
+ 2013-12-18
474
+ EOS
475
+ metadata, _ = parse_header_metadata input
441
476
  assert_equal 7, metadata.size
442
477
  assert_equal '2013-12-18', metadata['revdate']
443
478
  end
444
479
 
445
480
  # while compliant w/ AsciiDoc, this is just sloppy parsing
446
481
  test "treats arbitrary text on rev line as revdate" do
447
- metadata, = parse_header_metadata "Ryan Waldron\nfoobar\n"
482
+ input = <<-EOS
483
+ Ryan Waldron
484
+ foobar
485
+ EOS
486
+ metadata, _ = parse_header_metadata input
448
487
  assert_equal 7, metadata.size
449
488
  assert_equal 'foobar', metadata['revdate']
450
489
  end
451
490
 
452
491
  test "parse rev date remark" do
453
- metadata, = parse_header_metadata "Ryan Waldron\n2013-12-18: The first release you can stand on"
492
+ input = <<-EOS
493
+ Ryan Waldron
494
+ 2013-12-18: The first release you can stand on
495
+ EOS
496
+ metadata, _ = parse_header_metadata input
454
497
  assert_equal 8, metadata.size
455
498
  assert_equal '2013-12-18', metadata['revdate']
456
499
  assert_equal 'The first release you can stand on', metadata['revremark']
457
500
  end
458
501
 
459
502
  test "should not mistake attribute entry as rev remark" do
460
- metadata, = parse_header_metadata "Joe Cool\n:layout: post\n"
461
- assert_not_equal 'layout: post', metadata['revremark']
503
+ input = <<-EOS
504
+ Joe Cool
505
+ :page-layout: post
506
+ EOS
507
+ metadata, _ = parse_header_metadata input
508
+ refute_equal 'page-layout: post', metadata['revremark']
462
509
  assert !metadata.has_key?('revdate')
463
510
  end
464
511
 
465
512
  test "parse rev remark only" do
466
- metadata, = parse_header_metadata "Joe Cool\n :Must start line with space\n"
467
- assert_equal 'Must start line with space', metadata['revremark']
513
+ input = <<-EOS
514
+ Joe Cool
515
+ :Must start revremark-only line with space
516
+ EOS
517
+ metadata, _ = parse_header_metadata input
518
+ assert_equal 'Must start revremark-only line with space', metadata['revremark']
468
519
  assert_equal '', metadata['revdate']
469
520
  end
470
521
 
471
522
  test "skip line comments before author" do
472
- metadata, = parse_header_metadata "// Asciidoctor\n// release artist\nRyan Waldron"
523
+ input = <<-EOS
524
+ // Asciidoctor
525
+ // release artist
526
+ Ryan Waldron
527
+ EOS
528
+ metadata, _ = parse_header_metadata input
473
529
  assert_equal 6, metadata.size
474
530
  assert_equal 1, metadata['authorcount']
475
531
  assert_equal 'Ryan Waldron', metadata['author']
@@ -479,7 +535,14 @@ context "Lexer" do
479
535
  end
480
536
 
481
537
  test "skip block comment before author" do
482
- metadata, = parse_header_metadata "////\nAsciidoctor\nrelease artist\n////\nRyan Waldron"
538
+ input = <<-EOS
539
+ ////
540
+ Asciidoctor
541
+ release artist
542
+ ////
543
+ Ryan Waldron
544
+ EOS
545
+ metadata, _ = parse_header_metadata input
483
546
  assert_equal 6, metadata.size
484
547
  assert_equal 1, metadata['authorcount']
485
548
  assert_equal 'Ryan Waldron', metadata['author']
@@ -489,7 +552,15 @@ context "Lexer" do
489
552
  end
490
553
 
491
554
  test "skip block comment before rev" do
492
- metadata, = parse_header_metadata "Ryan Waldron\n////\nAsciidoctor\nrelease info\n////\nv0.0.7, 2013-12-18"
555
+ input = <<-EOS
556
+ Ryan Waldron
557
+ ////
558
+ Asciidoctor
559
+ release info
560
+ ////
561
+ v0.0.7, 2013-12-18
562
+ EOS
563
+ metadata, _ = parse_header_metadata input
493
564
  assert_equal 8, metadata.size
494
565
  assert_equal 1, metadata['authorcount']
495
566
  assert_equal 'Ryan Waldron', metadata['author']
@@ -500,13 +571,13 @@ context "Lexer" do
500
571
  test "attribute entry overrides generated author initials" do
501
572
  blankdoc = Asciidoctor::Document.new
502
573
  reader = Asciidoctor::Reader.new "Stuart Rackham <founder@asciidoc.org>\n:Author Initials: SJR".lines.entries
503
- metadata = Asciidoctor::Lexer.parse_header_metadata(reader, blankdoc)
574
+ metadata = Asciidoctor::Parser.parse_header_metadata(reader, blankdoc)
504
575
  assert_equal 'SR', metadata['authorinitials']
505
576
  assert_equal 'SJR', blankdoc.attributes['authorinitials']
506
577
  end
507
578
 
508
579
  test 'reset block indent to 0' do
509
- input = <<-EOS
580
+ input = <<-EOS.chomp
510
581
  def names
511
582
 
512
583
  @name.split ' '
@@ -514,7 +585,7 @@ context "Lexer" do
514
585
  end
515
586
  EOS
516
587
 
517
- expected = <<-EOS
588
+ expected = <<-EOS.chomp
518
589
  def names
519
590
 
520
591
  @name.split ' '
@@ -522,13 +593,13 @@ def names
522
593
  end
523
594
  EOS
524
595
 
525
- lines = input.lines.entries
526
- Asciidoctor::Lexer.reset_block_indent! lines
527
- assert_equal expected, lines.join
596
+ lines = input.split("\n")
597
+ Asciidoctor::Parser.reset_block_indent! lines
598
+ assert_equal expected, (lines * "\n")
528
599
  end
529
600
 
530
601
  test 'reset block indent mixed with tabs and spaces to 0' do
531
- input = <<-EOS
602
+ input = <<-EOS.chomp
532
603
  def names
533
604
 
534
605
  \t @name.split ' '
@@ -536,7 +607,7 @@ end
536
607
  end
537
608
  EOS
538
609
 
539
- expected = <<-EOS
610
+ expected = <<-EOS.chomp
540
611
  def names
541
612
 
542
613
  @name.split ' '
@@ -544,13 +615,13 @@ def names
544
615
  end
545
616
  EOS
546
617
 
547
- lines = input.lines.entries
548
- Asciidoctor::Lexer.reset_block_indent! lines
549
- assert_equal expected, lines.join
618
+ lines = input.split("\n")
619
+ Asciidoctor::Parser.reset_block_indent! lines
620
+ assert_equal expected, (lines * "\n")
550
621
  end
551
622
 
552
623
  test 'reset block indent to non-zero' do
553
- input = <<-EOS
624
+ input = <<-EOS.chomp
554
625
  def names
555
626
 
556
627
  @name.split ' '
@@ -558,7 +629,7 @@ end
558
629
  end
559
630
  EOS
560
631
 
561
- expected = <<-EOS
632
+ expected = <<-EOS.chomp
562
633
  def names
563
634
 
564
635
  @name.split ' '
@@ -566,9 +637,9 @@ end
566
637
  end
567
638
  EOS
568
639
 
569
- lines = input.lines.entries
570
- Asciidoctor::Lexer.reset_block_indent! lines, 2
571
- assert_equal expected, lines.join
640
+ lines = input.split("\n")
641
+ Asciidoctor::Parser.reset_block_indent! lines, 2
642
+ assert_equal expected, (lines * "\n")
572
643
  end
573
644
 
574
645
  test 'preserve block indent' do
@@ -583,7 +654,7 @@ end
583
654
  expected = input
584
655
 
585
656
  lines = input.lines.entries
586
- Asciidoctor::Lexer.reset_block_indent! lines, nil
657
+ Asciidoctor::Parser.reset_block_indent! lines, nil
587
658
  assert_equal expected, lines.join
588
659
  end
589
660
 
@@ -592,7 +663,7 @@ end
592
663
  expected = input
593
664
 
594
665
  lines = input.dup
595
- Asciidoctor::Lexer.reset_block_indent! lines
666
+ Asciidoctor::Parser.reset_block_indent! lines
596
667
  assert_equal expected, lines
597
668
  end
598
669