asciidoctor 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of asciidoctor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +10 -0
- data/Guardfile +18 -0
- data/LICENSE +1 -1
- data/README.adoc +65 -21
- data/Rakefile +10 -0
- data/asciidoctor.gemspec +17 -35
- data/compat/asciidoc.conf +130 -13
- data/lib/asciidoctor.rb +107 -87
- data/lib/asciidoctor/abstract_block.rb +6 -2
- data/lib/asciidoctor/abstract_node.rb +21 -13
- data/lib/asciidoctor/attribute_list.rb +2 -5
- data/{stylesheets/asciidoctor.css → lib/asciidoctor/backends/_stylesheets.rb} +96 -46
- data/lib/asciidoctor/backends/base_template.rb +9 -4
- data/lib/asciidoctor/backends/docbook45.rb +246 -138
- data/lib/asciidoctor/backends/html5.rb +580 -381
- data/lib/asciidoctor/block.rb +2 -50
- data/lib/asciidoctor/cli/options.rb +9 -8
- data/lib/asciidoctor/document.rb +35 -45
- data/lib/asciidoctor/helpers.rb +10 -0
- data/lib/asciidoctor/lexer.rb +456 -148
- data/lib/asciidoctor/list_item.rb +0 -21
- data/lib/asciidoctor/path_resolver.rb +18 -12
- data/lib/asciidoctor/reader.rb +71 -26
- data/lib/asciidoctor/renderer.rb +2 -19
- data/lib/asciidoctor/section.rb +0 -1
- data/lib/asciidoctor/substituters.rb +150 -36
- data/lib/asciidoctor/table.rb +30 -24
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +22 -16
- data/man/asciidoctor.ad +24 -16
- data/test/attributes_test.rb +50 -0
- data/test/blocks_test.rb +660 -9
- data/test/document_test.rb +191 -14
- data/test/fixtures/encoding.asciidoc +8 -0
- data/test/invoker_test.rb +47 -0
- data/test/lexer_test.rb +172 -0
- data/test/links_test.rb +28 -0
- data/test/lists_test.rb +172 -13
- data/test/options_test.rb +29 -2
- data/test/paragraphs_test.rb +105 -47
- data/test/paths_test.rb +3 -3
- data/test/reader_test.rb +46 -0
- data/test/sections_test.rb +365 -12
- data/test/substitutions_test.rb +127 -11
- data/test/tables_test.rb +81 -14
- data/test/test_helper.rb +18 -7
- data/test/text_test.rb +17 -5
- metadata +9 -36
data/test/document_test.rb
CHANGED
@@ -19,6 +19,30 @@ context 'Document' do
|
|
19
19
|
assert_equal Asciidoctor::SafeMode::SECURE, doc.safe
|
20
20
|
end
|
21
21
|
|
22
|
+
test 'safe mode level set using string' do
|
23
|
+
doc = Asciidoctor::Document.new [], :safe => 'server'
|
24
|
+
assert_equal Asciidoctor::SafeMode::SERVER, doc.safe
|
25
|
+
|
26
|
+
doc = Asciidoctor::Document.new [], :safe => 'foo'
|
27
|
+
assert_equal Asciidoctor::SafeMode::SECURE, doc.safe
|
28
|
+
end
|
29
|
+
|
30
|
+
test 'safe mode level set using symbol' do
|
31
|
+
doc = Asciidoctor::Document.new [], :safe => :server
|
32
|
+
assert_equal Asciidoctor::SafeMode::SERVER, doc.safe
|
33
|
+
|
34
|
+
doc = Asciidoctor::Document.new [], :safe => :foo
|
35
|
+
assert_equal Asciidoctor::SafeMode::SECURE, doc.safe
|
36
|
+
end
|
37
|
+
|
38
|
+
test 'safe mode level set using integer' do
|
39
|
+
doc = Asciidoctor::Document.new [], :safe => 10
|
40
|
+
assert_equal Asciidoctor::SafeMode::SERVER, doc.safe
|
41
|
+
|
42
|
+
doc = Asciidoctor::Document.new [], :safe => 100
|
43
|
+
assert_equal 100, doc.safe
|
44
|
+
end
|
45
|
+
|
22
46
|
test 'safe mode attributes are set on document' do
|
23
47
|
doc = Asciidoctor::Document.new
|
24
48
|
assert_equal Asciidoctor::SafeMode::SECURE, doc.attr('safe-mode-level')
|
@@ -99,6 +123,65 @@ preamble
|
|
99
123
|
assert !doc.attr?('docfile')
|
100
124
|
assert_equal doc.base_dir, doc.attr('docdir')
|
101
125
|
end
|
126
|
+
|
127
|
+
test 'should accept attributes as array' do
|
128
|
+
# NOTE there's a tab character before idseparator
|
129
|
+
doc = Asciidoctor.load('text', :attributes => %w(toc numbered source-highlighter=coderay idprefix idseparator=-))
|
130
|
+
assert doc.attributes.is_a?(Hash)
|
131
|
+
assert doc.attr?('toc')
|
132
|
+
assert_equal '', doc.attr('toc')
|
133
|
+
assert doc.attr?('numbered')
|
134
|
+
assert_equal '', doc.attr('numbered')
|
135
|
+
assert doc.attr?('source-highlighter')
|
136
|
+
assert_equal 'coderay', doc.attr('source-highlighter')
|
137
|
+
assert doc.attr?('idprefix')
|
138
|
+
assert_equal '', doc.attr('idprefix')
|
139
|
+
assert doc.attr?('idseparator')
|
140
|
+
assert_equal '-', doc.attr('idseparator')
|
141
|
+
end
|
142
|
+
|
143
|
+
test 'should accept attributes as empty array' do
|
144
|
+
doc = Asciidoctor.load('text', :attributes => [])
|
145
|
+
assert doc.attributes.is_a?(Hash)
|
146
|
+
end
|
147
|
+
|
148
|
+
test 'should accept attributes as string' do
|
149
|
+
# NOTE there's a tab character before idseparator
|
150
|
+
doc = Asciidoctor.load('text', :attributes => 'toc numbered source-highlighter=coderay idprefix idseparator=-')
|
151
|
+
assert doc.attributes.is_a?(Hash)
|
152
|
+
assert doc.attr?('toc')
|
153
|
+
assert_equal '', doc.attr('toc')
|
154
|
+
assert doc.attr?('numbered')
|
155
|
+
assert_equal '', doc.attr('numbered')
|
156
|
+
assert doc.attr?('source-highlighter')
|
157
|
+
assert_equal 'coderay', doc.attr('source-highlighter')
|
158
|
+
assert doc.attr?('idprefix')
|
159
|
+
assert_equal '', doc.attr('idprefix')
|
160
|
+
assert doc.attr?('idseparator')
|
161
|
+
assert_equal '-', doc.attr('idseparator')
|
162
|
+
end
|
163
|
+
|
164
|
+
test 'should accept values containing spaces in attributes string' do
|
165
|
+
# NOTE there's a tab character before self:
|
166
|
+
doc = Asciidoctor.load('text', :attributes => 'idprefix idseparator=- note-caption=Note\ to\ self: toc')
|
167
|
+
assert doc.attributes.is_a?(Hash)
|
168
|
+
assert doc.attr?('idprefix')
|
169
|
+
assert_equal '', doc.attr('idprefix')
|
170
|
+
assert doc.attr?('idseparator')
|
171
|
+
assert_equal '-', doc.attr('idseparator')
|
172
|
+
assert doc.attr?('note-caption')
|
173
|
+
assert_equal "Note to self:", doc.attr('note-caption')
|
174
|
+
end
|
175
|
+
|
176
|
+
test 'should accept attributes as empty string' do
|
177
|
+
doc = Asciidoctor.load('text', :attributes => '')
|
178
|
+
assert doc.attributes.is_a?(Hash)
|
179
|
+
end
|
180
|
+
|
181
|
+
test 'should accept attributes as nil' do
|
182
|
+
doc = Asciidoctor.load('text', :attributes => nil)
|
183
|
+
assert doc.attributes.is_a?(Hash)
|
184
|
+
end
|
102
185
|
end
|
103
186
|
|
104
187
|
context 'Render APIs' do
|
@@ -114,6 +197,18 @@ preamble
|
|
114
197
|
assert_xpath '/html/body/*[@id="header"]/h1[text() = "Document Title"]', output, 1
|
115
198
|
end
|
116
199
|
|
200
|
+
test 'should accept attributes as array' do
|
201
|
+
sample_input_path = fixture_path('sample.asciidoc')
|
202
|
+
output = Asciidoctor.render_file(sample_input_path, :attributes => %w(numbered idprefix idseparator=-))
|
203
|
+
assert_css '#section-a', output, 1
|
204
|
+
end
|
205
|
+
|
206
|
+
test 'should accept attributes as string' do
|
207
|
+
sample_input_path = fixture_path('sample.asciidoc')
|
208
|
+
output = Asciidoctor.render_file(sample_input_path, :attributes => 'numbered idprefix idseparator=-')
|
209
|
+
assert_css '#section-a', output, 1
|
210
|
+
end
|
211
|
+
|
117
212
|
test 'should include docinfo files for html backend' do
|
118
213
|
sample_input_path = fixture_path('basic.asciidoc')
|
119
214
|
|
@@ -309,6 +404,27 @@ text
|
|
309
404
|
end
|
310
405
|
end
|
311
406
|
|
407
|
+
test 'should render document to file when base dir is set' do
|
408
|
+
sample_input_path = fixture_path('sample.asciidoc')
|
409
|
+
sample_output_path = fixture_path('result.html')
|
410
|
+
fixture_dir = fixture_path('')
|
411
|
+
begin
|
412
|
+
Asciidoctor.render_file(sample_input_path, :to_file => 'result.html', :base_dir => fixture_dir)
|
413
|
+
assert File.exist?(sample_output_path)
|
414
|
+
output = File.read(sample_output_path)
|
415
|
+
assert !output.empty?
|
416
|
+
assert_xpath '/html', output, 1
|
417
|
+
assert_xpath '/html/head', output, 1
|
418
|
+
assert_xpath '/html/body', output, 1
|
419
|
+
assert_xpath '/html/head/title[text() = "Document Title"]', output, 1
|
420
|
+
assert_xpath '/html/body/*[@id="header"]/h1[text() = "Document Title"]', output, 1
|
421
|
+
rescue => e
|
422
|
+
flunk e.message
|
423
|
+
ensure
|
424
|
+
FileUtils::rm(sample_output_path, :force => true)
|
425
|
+
end
|
426
|
+
end
|
427
|
+
|
312
428
|
test 'in_place option must not be used with to_file option' do
|
313
429
|
sample_input_path = fixture_path('sample.asciidoc')
|
314
430
|
sample_output_path = fixture_path('result.html')
|
@@ -347,7 +463,7 @@ text
|
|
347
463
|
end
|
348
464
|
end
|
349
465
|
|
350
|
-
test 'missing directories should be created if
|
466
|
+
test 'missing directories should be created if mkdirs is enabled' do
|
351
467
|
sample_input_path = fixture_path('sample.asciidoc')
|
352
468
|
output_dir = File.join(File.join(File.dirname(sample_input_path), 'test_output'), 'subdir')
|
353
469
|
sample_output_path = File.join(output_dir, 'sample.html')
|
@@ -389,7 +505,7 @@ text
|
|
389
505
|
assert !renderer.nil?
|
390
506
|
views = renderer.views
|
391
507
|
assert !views.nil?
|
392
|
-
assert_equal
|
508
|
+
assert_equal 36, views.size
|
393
509
|
assert views.has_key? 'document'
|
394
510
|
assert views['document'].is_a?(Asciidoctor::HTML5::DocumentTemplate)
|
395
511
|
assert_equal 'ERB', views['document'].eruby.to_s
|
@@ -405,7 +521,7 @@ text
|
|
405
521
|
assert !renderer.nil?
|
406
522
|
views = renderer.views
|
407
523
|
assert !views.nil?
|
408
|
-
assert_equal
|
524
|
+
assert_equal 36, views.size
|
409
525
|
assert views.has_key? 'document'
|
410
526
|
assert views['document'].is_a?(Asciidoctor::DocBook45::DocumentTemplate)
|
411
527
|
assert_equal 'ERB', views['document'].eruby.to_s
|
@@ -450,27 +566,49 @@ preamble
|
|
450
566
|
|
451
567
|
test 'document with title attribute entry overrides doctitle' do
|
452
568
|
input = <<-EOS
|
453
|
-
= Title
|
454
|
-
:title:
|
569
|
+
= Document Title
|
570
|
+
:title: Override
|
455
571
|
|
456
|
-
|
572
|
+
{doctitle}
|
457
573
|
|
458
574
|
== First Section
|
459
575
|
EOS
|
460
576
|
doc = document_from_string input
|
461
|
-
assert_equal '
|
462
|
-
assert_equal '
|
577
|
+
assert_equal 'Override', doc.doctitle
|
578
|
+
assert_equal 'Override', doc.title
|
463
579
|
assert doc.has_header?
|
464
|
-
assert_equal 'Title', doc.header.title
|
465
|
-
assert_equal 'Title', doc.first_section.title
|
580
|
+
assert_equal 'Document Title', doc.header.title
|
581
|
+
assert_equal 'Document Title', doc.first_section.title
|
582
|
+
assert_xpath '//*[@id="preamble"]//p[text()="Document Title"]', doc.render, 1
|
583
|
+
end
|
584
|
+
|
585
|
+
test 'document with title attribute entry overrides doctitle attribute entry' do
|
586
|
+
input = <<-EOS
|
587
|
+
= Document Title
|
588
|
+
:snapshot: {doctitle}
|
589
|
+
:doctitle: doctitle
|
590
|
+
:title: Override
|
591
|
+
|
592
|
+
{snapshot}, {doctitle}
|
593
|
+
|
594
|
+
== First Section
|
595
|
+
EOS
|
596
|
+
doc = document_from_string input
|
597
|
+
assert_equal 'Override', doc.doctitle
|
598
|
+
assert_equal 'Override', doc.title
|
599
|
+
assert doc.has_header?
|
600
|
+
assert_equal 'doctitle', doc.header.title
|
601
|
+
assert_equal 'doctitle', doc.first_section.title
|
602
|
+
assert_xpath '//*[@id="preamble"]//p[text()="Document Title, doctitle"]', doc.render, 1
|
466
603
|
end
|
467
604
|
|
468
605
|
test 'document with doctitle attribute entry overrides header title and doctitle' do
|
469
606
|
input = <<-EOS
|
470
|
-
= Title
|
607
|
+
= Document Title
|
608
|
+
:snapshot: {doctitle}
|
471
609
|
:doctitle: Override
|
472
610
|
|
473
|
-
|
611
|
+
{snapshot}, {doctitle}
|
474
612
|
|
475
613
|
== First Section
|
476
614
|
EOS
|
@@ -480,14 +618,15 @@ preamble
|
|
480
618
|
assert doc.has_header?
|
481
619
|
assert_equal 'Override', doc.header.title
|
482
620
|
assert_equal 'Override', doc.first_section.title
|
621
|
+
assert_xpath '//*[@id="preamble"]//p[text()="Document Title, Override"]', doc.render, 1
|
483
622
|
end
|
484
623
|
|
485
624
|
test 'doctitle attribute entry above header overrides header title and doctitle' do
|
486
625
|
input = <<-EOS
|
487
626
|
:doctitle: Override
|
488
|
-
= Title
|
627
|
+
= Document Title
|
489
628
|
|
490
|
-
|
629
|
+
{doctitle}
|
491
630
|
|
492
631
|
== First Section
|
493
632
|
EOS
|
@@ -497,6 +636,7 @@ preamble
|
|
497
636
|
assert doc.has_header?
|
498
637
|
assert_equal 'Override', doc.header.title
|
499
638
|
assert_equal 'Override', doc.first_section.title
|
639
|
+
assert_xpath '//*[@id="preamble"]//p[text()="Override"]', doc.render, 1
|
500
640
|
end
|
501
641
|
|
502
642
|
test 'should recognize document title when preceded by blank lines' do
|
@@ -575,6 +715,23 @@ more info...
|
|
575
715
|
assert_xpath '/article/articleinfo/revhistory/revision/revremark[text() = "See changelog."]', output, 1
|
576
716
|
end
|
577
717
|
|
718
|
+
test 'with author defined using attribute entry to DocBook' do
|
719
|
+
input = <<-EOS
|
720
|
+
= Document Title
|
721
|
+
:author: Doc Writer
|
722
|
+
:email: thedoctor@asciidoc.org
|
723
|
+
|
724
|
+
content
|
725
|
+
EOS
|
726
|
+
|
727
|
+
output = render_string input, :backend => 'docbook'
|
728
|
+
assert_xpath '//articleinfo/author', output, 1
|
729
|
+
assert_xpath '//articleinfo/author/firstname[text() = "Doc"]', output, 1
|
730
|
+
assert_xpath '//articleinfo/author/surname[text() = "Writer"]', output, 1
|
731
|
+
assert_xpath '//articleinfo/author/email[text() = "thedoctor@asciidoc.org"]', output, 1
|
732
|
+
assert_xpath '//articleinfo/authorinitials[text() = "DW"]', output, 1
|
733
|
+
end
|
734
|
+
|
578
735
|
test 'should create authorgroup in DocBook when multiple authors' do
|
579
736
|
input = <<-EOS
|
580
737
|
= Document Title
|
@@ -591,6 +748,26 @@ content
|
|
591
748
|
assert_xpath '//articleinfo/authorgroup/author[2]/firstname[text() = "Junior"]', output, 1
|
592
749
|
end
|
593
750
|
|
751
|
+
test 'with authors defined using attribute entry to DocBook' do
|
752
|
+
input = <<-EOS
|
753
|
+
= Document Title
|
754
|
+
:authors: Doc Writer; Junior Writer
|
755
|
+
:email_1: thedoctor@asciidoc.org
|
756
|
+
:email_2: junior@asciidoc.org
|
757
|
+
|
758
|
+
content
|
759
|
+
EOS
|
760
|
+
|
761
|
+
output = render_string input, :backend => 'docbook'
|
762
|
+
assert_xpath '//articleinfo/author', output, 0
|
763
|
+
assert_xpath '//articleinfo/authorgroup', output, 1
|
764
|
+
assert_xpath '//articleinfo/authorgroup/author', output, 2
|
765
|
+
assert_xpath '(//articleinfo/authorgroup/author)[1]/firstname[text() = "Doc"]', output, 1
|
766
|
+
assert_xpath '(//articleinfo/authorgroup/author)[1]/email[text() = "thedoctor@asciidoc.org"]', output, 1
|
767
|
+
assert_xpath '(//articleinfo/authorgroup/author)[2]/firstname[text() = "Junior"]', output, 1
|
768
|
+
assert_xpath '(//articleinfo/authorgroup/author)[2]/email[text() = "junior@asciidoc.org"]', output, 1
|
769
|
+
end
|
770
|
+
|
594
771
|
test 'with header footer' do
|
595
772
|
doc = document_from_string "= Title\n\npreamble"
|
596
773
|
assert !doc.attr?('embedded')
|
@@ -3,3 +3,11 @@ Gregory Romé has written an AsciiDoc plugin for the Redmine project management
|
|
3
3
|
https://github.com/foo-users/foo
|
4
4
|
へと `vicmd` キーマップを足してみている試み、
|
5
5
|
アニメーションgifです。
|
6
|
+
|
7
|
+
tag::romé[]
|
8
|
+
Gregory Romé has written an AsciiDoc plugin for the Redmine project management application.
|
9
|
+
end::romé[]
|
10
|
+
|
11
|
+
== Überschrift
|
12
|
+
|
13
|
+
* Codierungen sind verrückt auf älteren Versionen von Ruby
|
data/test/invoker_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require 'test_helper'
|
2
3
|
require 'asciidoctor/cli/options'
|
3
4
|
require 'asciidoctor/cli/invoker'
|
@@ -234,6 +235,23 @@ context 'Invoker' do
|
|
234
235
|
assert_xpath '//h2[@id="idsection_a"]', output, 1
|
235
236
|
end
|
236
237
|
|
238
|
+
test 'should set attribute with value containing equal sign' do
|
239
|
+
invoker = invoke_cli_to_buffer %w(--trace -a toc -a toc-title=t=o=c -o -)
|
240
|
+
doc = invoker.document
|
241
|
+
assert_equal 't=o=c', doc.attr('toc-title')
|
242
|
+
output = invoker.read_output
|
243
|
+
assert_xpath '//*[@id="toctitle"][text() = "t=o=c"]', output, 1
|
244
|
+
end
|
245
|
+
|
246
|
+
test 'should set attribute with quoted value containing a space' do
|
247
|
+
# emulating commandline arguments: --trace -a toc -a note-caption="Note to self:" -o -
|
248
|
+
invoker = invoke_cli_to_buffer %w(--trace -a toc -a note-caption=Note\ to\ self: -o -)
|
249
|
+
doc = invoker.document
|
250
|
+
assert_equal 'Note to self:', doc.attr('note-caption')
|
251
|
+
output = invoker.read_output
|
252
|
+
assert_xpath %(//*[#{contains_class('admonitionblock')}]//*[@class='title'][text() = 'Note to self:']), output, 1
|
253
|
+
end
|
254
|
+
|
237
255
|
test 'should not set attribute ending in @ if defined in document' do
|
238
256
|
invoker = invoke_cli_to_buffer %w(--trace -a idprefix=id@ -s -o -)
|
239
257
|
doc = invoker.document
|
@@ -291,4 +309,33 @@ context 'Invoker' do
|
|
291
309
|
assert_equal 'erubis', doc.instance_variable_get('@options')[:eruby]
|
292
310
|
end
|
293
311
|
|
312
|
+
test 'should force default external encoding to UTF-8' do
|
313
|
+
executable = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'asciidoctor'))
|
314
|
+
input_path = fixture_path 'encoding.asciidoc'
|
315
|
+
old_lang = ENV['LANG']
|
316
|
+
ENV['LANG'] = 'US-ASCII'
|
317
|
+
begin
|
318
|
+
# using open3 to work around a bug in JRuby process_manager.rb,
|
319
|
+
# which tries to run a gsub on stdout prematurely breaking the test
|
320
|
+
require 'open3'
|
321
|
+
#cmd = "#{executable} -o - --trace #{input_path}"
|
322
|
+
cmd = "#{File.join RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']} #{executable} -o - --trace #{input_path}"
|
323
|
+
_, stdout, stderr = Open3.popen3 cmd
|
324
|
+
stderr_lines = stderr.readlines
|
325
|
+
puts stderr_lines.join unless stderr_lines.empty?
|
326
|
+
assert stderr_lines.empty?, 'Command failed. Expected to receive a rendered document.'
|
327
|
+
stdout_lines = stdout.readlines
|
328
|
+
assert !stdout_lines.empty?
|
329
|
+
if Asciidoctor::FORCE_ENCODING
|
330
|
+
stdout_lines.each do |l|
|
331
|
+
l.force_encoding Encoding::UTF_8
|
332
|
+
end
|
333
|
+
end
|
334
|
+
stdout_str = stdout_lines.join
|
335
|
+
assert stdout_str.include?('Codierungen sind verrückt auf älteren Versionen von Ruby')
|
336
|
+
ensure
|
337
|
+
ENV['LANG'] = old_lang
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
294
341
|
end
|
data/test/lexer_test.rb
CHANGED
@@ -71,6 +71,14 @@ context "Lexer" do
|
|
71
71
|
assert_equal expected, attributes
|
72
72
|
end
|
73
73
|
|
74
|
+
test "collect unnamed attribute in second position after empty attribute" do
|
75
|
+
attributes = {}
|
76
|
+
line = ', John Smith'
|
77
|
+
expected = {1 => nil, 2 => 'John Smith'}
|
78
|
+
Asciidoctor::AttributeList.new(line).parse_into(attributes)
|
79
|
+
assert_equal expected, attributes
|
80
|
+
end
|
81
|
+
|
74
82
|
test "collect unnamed attributes" do
|
75
83
|
attributes = {}
|
76
84
|
line = "first, second one, third"
|
@@ -182,6 +190,79 @@ context "Lexer" do
|
|
182
190
|
assert_equal expected, attributes
|
183
191
|
end
|
184
192
|
|
193
|
+
test 'parse style attribute with id and role' do
|
194
|
+
attributes = {1 => 'style#id.role'}
|
195
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
196
|
+
assert_equal 'style', style
|
197
|
+
assert_nil original_style
|
198
|
+
assert_equal 'style', attributes['style']
|
199
|
+
assert_equal 'id', attributes['id']
|
200
|
+
assert_equal 'role', attributes['role']
|
201
|
+
assert_equal 'style#id.role', attributes[1]
|
202
|
+
end
|
203
|
+
|
204
|
+
test 'parse style attribute with style, role and id' do
|
205
|
+
attributes = {1 => 'style.role#id'}
|
206
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
207
|
+
assert_equal 'style', style
|
208
|
+
assert_nil original_style
|
209
|
+
assert_equal 'style', attributes['style']
|
210
|
+
assert_equal 'id', attributes['id']
|
211
|
+
assert_equal 'role', attributes['role']
|
212
|
+
assert_equal 'style.role#id', attributes[1]
|
213
|
+
end
|
214
|
+
|
215
|
+
test 'parse style attribute with style, id and multiple roles' do
|
216
|
+
attributes = {1 => 'style#id.role1.role2'}
|
217
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
218
|
+
assert_equal 'style', style
|
219
|
+
assert_nil original_style
|
220
|
+
assert_equal 'style', attributes['style']
|
221
|
+
assert_equal 'id', attributes['id']
|
222
|
+
assert_equal 'role1 role2', attributes['role']
|
223
|
+
assert_equal 'style#id.role1.role2', attributes[1]
|
224
|
+
end
|
225
|
+
|
226
|
+
test 'parse style attribute with style, multiple roles and id' do
|
227
|
+
attributes = {1 => 'style.role1.role2#id'}
|
228
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
229
|
+
assert_equal 'style', style
|
230
|
+
assert_nil original_style
|
231
|
+
assert_equal 'style', attributes['style']
|
232
|
+
assert_equal 'id', attributes['id']
|
233
|
+
assert_equal 'role1 role2', attributes['role']
|
234
|
+
assert_equal 'style.role1.role2#id', attributes[1]
|
235
|
+
end
|
236
|
+
|
237
|
+
test 'parse style attribute with positional and original style' do
|
238
|
+
attributes = {1 => 'new_style', 'style' => 'original_style'}
|
239
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
240
|
+
assert_equal 'new_style', style
|
241
|
+
assert_equal 'original_style', original_style
|
242
|
+
assert_equal 'new_style', attributes['style']
|
243
|
+
assert_equal 'new_style', attributes[1]
|
244
|
+
end
|
245
|
+
|
246
|
+
test 'parse style attribute with id and role only' do
|
247
|
+
attributes = {1 => '#id.role'}
|
248
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
249
|
+
assert_nil style
|
250
|
+
assert_nil original_style
|
251
|
+
assert_equal 'id', attributes['id']
|
252
|
+
assert_equal 'role', attributes['role']
|
253
|
+
assert_equal '#id.role', attributes[1]
|
254
|
+
end
|
255
|
+
|
256
|
+
test 'parse empty style attribute' do
|
257
|
+
attributes = {1 => nil}
|
258
|
+
style, original_style = Asciidoctor::Lexer.parse_style_attribute(attributes)
|
259
|
+
assert_nil style
|
260
|
+
assert_nil original_style
|
261
|
+
assert_nil attributes['id']
|
262
|
+
assert_nil attributes['role']
|
263
|
+
assert_nil attributes[1]
|
264
|
+
end
|
265
|
+
|
185
266
|
test "parse author first" do
|
186
267
|
metadata, = parse_header_metadata 'Stuart'
|
187
268
|
assert_equal 5, metadata.size
|
@@ -406,4 +487,95 @@ context "Lexer" do
|
|
406
487
|
assert_equal 'SJR', blankdoc.attributes['authorinitials']
|
407
488
|
end
|
408
489
|
|
490
|
+
test 'reset block indent to 0' do
|
491
|
+
input = <<-EOS
|
492
|
+
def names
|
493
|
+
|
494
|
+
@name.split ' '
|
495
|
+
|
496
|
+
end
|
497
|
+
EOS
|
498
|
+
|
499
|
+
expected = <<-EOS
|
500
|
+
def names
|
501
|
+
|
502
|
+
@name.split ' '
|
503
|
+
|
504
|
+
end
|
505
|
+
EOS
|
506
|
+
|
507
|
+
lines = input.lines.entries
|
508
|
+
Asciidoctor::Lexer.reset_block_indent! lines
|
509
|
+
assert_equal expected, lines.join
|
510
|
+
end
|
511
|
+
|
512
|
+
test 'reset block indent mixed with tabs and spaces to 0' do
|
513
|
+
input = <<-EOS
|
514
|
+
def names
|
515
|
+
|
516
|
+
\t @name.split ' '
|
517
|
+
|
518
|
+
end
|
519
|
+
EOS
|
520
|
+
|
521
|
+
expected = <<-EOS
|
522
|
+
def names
|
523
|
+
|
524
|
+
@name.split ' '
|
525
|
+
|
526
|
+
end
|
527
|
+
EOS
|
528
|
+
|
529
|
+
lines = input.lines.entries
|
530
|
+
Asciidoctor::Lexer.reset_block_indent! lines
|
531
|
+
assert_equal expected, lines.join
|
532
|
+
end
|
533
|
+
|
534
|
+
test 'reset block indent to non-zero' do
|
535
|
+
input = <<-EOS
|
536
|
+
def names
|
537
|
+
|
538
|
+
@name.split ' '
|
539
|
+
|
540
|
+
end
|
541
|
+
EOS
|
542
|
+
|
543
|
+
expected = <<-EOS
|
544
|
+
def names
|
545
|
+
|
546
|
+
@name.split ' '
|
547
|
+
|
548
|
+
end
|
549
|
+
EOS
|
550
|
+
|
551
|
+
lines = input.lines.entries
|
552
|
+
Asciidoctor::Lexer.reset_block_indent! lines, 2
|
553
|
+
assert_equal expected, lines.join
|
554
|
+
end
|
555
|
+
|
556
|
+
test 'preserve block indent' do
|
557
|
+
input = <<-EOS
|
558
|
+
def names
|
559
|
+
|
560
|
+
@name.split ' '
|
561
|
+
|
562
|
+
end
|
563
|
+
EOS
|
564
|
+
|
565
|
+
expected = input
|
566
|
+
|
567
|
+
lines = input.lines.entries
|
568
|
+
Asciidoctor::Lexer.reset_block_indent! lines, nil
|
569
|
+
assert_equal expected, lines.join
|
570
|
+
end
|
571
|
+
|
572
|
+
test 'reset block indent hands empty lines gracefully' do
|
573
|
+
input = []
|
574
|
+
expected = input
|
575
|
+
|
576
|
+
lines = input.dup
|
577
|
+
Asciidoctor::Lexer.reset_block_indent! lines
|
578
|
+
assert_equal expected, lines
|
579
|
+
end
|
580
|
+
|
409
581
|
end
|