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/links_test.rb
CHANGED
@@ -74,6 +74,26 @@ context 'Links' do
|
|
74
74
|
assert_xpath '//a[@href="http://github.com/asciidoctor"]', render_string('Asciidoctor GitHub organization: <**http://github.com/asciidoctor**>'), 1
|
75
75
|
end
|
76
76
|
|
77
|
+
test 'link with quoted text should not be separated into attributes when linkattrs is set' do
|
78
|
+
assert_xpath '//a[@href="http://search.example.com"][text()="Google, Yahoo, Bing"]', render_embedded_string('http://search.example.com["Google, Yahoo, Bing"]', :attributes => {'linkattrs' => ''}), 1
|
79
|
+
end
|
80
|
+
|
81
|
+
test 'role and window attributes on link are processed when linkattrs is set' do
|
82
|
+
assert_xpath '//a[@href="http://google.com"][@class="external"][@target="_blank"]', render_embedded_string('http://google.com[Google, role="external", window="_blank"]', :attributes => {'linkattrs' => ''}), 1
|
83
|
+
end
|
84
|
+
|
85
|
+
test 'link text that ends in ^ should set link window to _blank' do
|
86
|
+
assert_xpath '//a[@href="http://google.com"][@target="_blank"]', render_embedded_string('http://google.com[Google^]'), 1
|
87
|
+
end
|
88
|
+
|
89
|
+
test 'inline irc link' do
|
90
|
+
assert_xpath '//a[@href="irc://irc.freenode.net"][text()="irc://irc.freenode.net"]', render_embedded_string('irc://irc.freenode.net'), 1
|
91
|
+
end
|
92
|
+
|
93
|
+
test 'inline irc link with text' do
|
94
|
+
assert_xpath '//a[@href="irc://irc.freenode.net"][text()="Freenode IRC"]', render_embedded_string('irc://irc.freenode.net[Freenode IRC]'), 1
|
95
|
+
end
|
96
|
+
|
77
97
|
test 'inline ref' do
|
78
98
|
doc = document_from_string 'Here you can read about tigers.[[tigers]]'
|
79
99
|
output = doc.render
|
@@ -119,6 +139,14 @@ context 'Links' do
|
|
119
139
|
assert_xpath %{//a[@href="#tigers"][text() = "about\ntigers"]}, render_string("Want to learn <<tigers,about\ntigers>>?"), 1
|
120
140
|
end
|
121
141
|
|
142
|
+
test 'xref with escaped text' do
|
143
|
+
# when \x0 was used as boundary character for passthrough, it was getting stripped
|
144
|
+
# now using \e as boundary character, which resolves issue
|
145
|
+
input = 'See the <<tigers , `[tigers]`>> section for data about tigers'
|
146
|
+
output = render_embedded_string input
|
147
|
+
assert_xpath %(//a[@href="#tigers"]/code[text()="[tigers]"]), output, 1
|
148
|
+
end
|
149
|
+
|
122
150
|
test 'xref using macro syntax' do
|
123
151
|
doc = document_from_string 'xref:tigers[]'
|
124
152
|
doc.references[:ids]['tigers'] = '[tigers]'
|
data/test/lists_test.rb
CHANGED
@@ -322,6 +322,23 @@ para
|
|
322
322
|
assert_xpath '(//ul/li)[1]/*[@class="literalblock"]/following-sibling::*[@class="paragraph"]/p[text()="para"]', output, 1
|
323
323
|
end
|
324
324
|
|
325
|
+
test 'an admonition paragraph attached by a line continuation to a list item with wrapped text should produce admonition' do
|
326
|
+
input = <<-EOS
|
327
|
+
- first-line text
|
328
|
+
wrapped text
|
329
|
+
+
|
330
|
+
NOTE: This is a note.
|
331
|
+
EOS
|
332
|
+
|
333
|
+
output = render_embedded_string input
|
334
|
+
assert_css 'ul', output, 1
|
335
|
+
assert_css 'ul > li', output, 1
|
336
|
+
assert_css 'ul > li > p', output, 1
|
337
|
+
assert_xpath %(//ul/li/p[text()="first-line text\nwrapped text"]), output, 1
|
338
|
+
assert_css 'ul > li > p + .admonitionblock.note', output, 1
|
339
|
+
assert_xpath '//ul/li/*[@class="admonitionblock note"]//td[@class="content"][normalize-space(text())="This is a note."]', output, 1
|
340
|
+
end
|
341
|
+
|
325
342
|
test 'appends line as paragraph if attached by continuation following line comment' do
|
326
343
|
input = <<-EOS
|
327
344
|
- list item 1
|
@@ -1020,7 +1037,7 @@ Lists
|
|
1020
1037
|
assert_xpath '//ul/li[1]/p', output, 1
|
1021
1038
|
assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"][@class = "listingblock"]', output, 1
|
1022
1039
|
assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]/div[@class="title"][starts-with(text(),"Read")]', output, 1
|
1023
|
-
assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]//code[@class="ruby"][starts-with(text(),"5.times")]', output, 1
|
1040
|
+
assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]//code[@class="ruby language-ruby"][starts-with(text(),"5.times")]', output, 1
|
1024
1041
|
end
|
1025
1042
|
|
1026
1043
|
test 'trailing block attribute line attached by continuation should not create block' do
|
@@ -1681,6 +1698,22 @@ def2
|
|
1681
1698
|
assert_xpath '(//dl/dt)[2]/following-sibling::dd/p[text() = "def2"]', output, 1
|
1682
1699
|
end
|
1683
1700
|
|
1701
|
+
test 'consecutive terms share same varlistentry in docbook' do
|
1702
|
+
input = <<-EOS
|
1703
|
+
term::
|
1704
|
+
alt term::
|
1705
|
+
definition
|
1706
|
+
|
1707
|
+
last::
|
1708
|
+
EOS
|
1709
|
+
output = render_embedded_string input, :backend => 'docbook'
|
1710
|
+
assert_xpath '//varlistentry', output, 2
|
1711
|
+
assert_xpath '(//varlistentry)[1]/term', output, 2
|
1712
|
+
assert_xpath '(//varlistentry)[2]/term', output, 1
|
1713
|
+
assert_xpath '(//varlistentry)[2]/listitem', output, 1
|
1714
|
+
assert_xpath '(//varlistentry)[2]/listitem[normalize-space(text())=""]', output, 1
|
1715
|
+
end
|
1716
|
+
|
1684
1717
|
test "multi-line elements with blank line before paragraph content" do
|
1685
1718
|
input = <<-EOS
|
1686
1719
|
term1::
|
@@ -2192,6 +2225,23 @@ term 2:: def 2
|
|
2192
2225
|
assert_css '.dlist dt:not([class])', output, 2
|
2193
2226
|
end
|
2194
2227
|
|
2228
|
+
test 'consecutive glossary terms should share same glossentry element in docbook' do
|
2229
|
+
input = <<-EOS
|
2230
|
+
[glossary]
|
2231
|
+
term::
|
2232
|
+
alt term::
|
2233
|
+
definition
|
2234
|
+
|
2235
|
+
last::
|
2236
|
+
EOS
|
2237
|
+
output = render_embedded_string input, :backend => 'docbook'
|
2238
|
+
assert_xpath '/glossentry', output, 2
|
2239
|
+
assert_xpath '(/glossentry)[1]/glossterm', output, 2
|
2240
|
+
assert_xpath '(/glossentry)[2]/glossterm', output, 1
|
2241
|
+
assert_xpath '(/glossentry)[2]/glossdef', output, 1
|
2242
|
+
assert_xpath '(/glossentry)[2]/glossdef[normalize-space(text())=""]', output, 1
|
2243
|
+
end
|
2244
|
+
|
2195
2245
|
test 'should render horizontal list with proper markup' do
|
2196
2246
|
input = <<-EOS
|
2197
2247
|
[horizontal]
|
@@ -2204,7 +2254,7 @@ second term:: definition
|
|
2204
2254
|
output = render_embedded_string input
|
2205
2255
|
assert_css '.hdlist', output, 1
|
2206
2256
|
assert_css '.hdlist table', output, 1
|
2207
|
-
assert_css '.hdlist table colgroup
|
2257
|
+
assert_css '.hdlist table colgroup', output, 0
|
2208
2258
|
assert_css '.hdlist table tr', output, 2
|
2209
2259
|
assert_xpath '/*[@class="hdlist"]/table/tr[1]/td', output, 2
|
2210
2260
|
assert_xpath '/*[@class="hdlist"]/table/tr[1]/td[@class="hdlist1"]', output, 1
|
@@ -2219,6 +2269,74 @@ second term:: definition
|
|
2219
2269
|
assert_xpath '((//tr)[2]/td)[2]/p[normalize-space(text())="definition"]', output, 1
|
2220
2270
|
end
|
2221
2271
|
|
2272
|
+
test 'should set col widths of item and label if specified' do
|
2273
|
+
input = <<-EOS
|
2274
|
+
[horizontal]
|
2275
|
+
[labelwidth="25", itemwidth="75"]
|
2276
|
+
term:: def
|
2277
|
+
EOS
|
2278
|
+
|
2279
|
+
output = render_embedded_string input
|
2280
|
+
assert_css 'table', output, 1
|
2281
|
+
assert_css 'table > colgroup', output, 1
|
2282
|
+
assert_css 'table > colgroup > col', output, 2
|
2283
|
+
assert_xpath '(//table/colgroup/col)[1][@style="width:25%;"]', output, 1
|
2284
|
+
assert_xpath '(//table/colgroup/col)[2][@style="width:75%;"]', output, 1
|
2285
|
+
end
|
2286
|
+
|
2287
|
+
test 'consecutive terms in horizontal list should share same cell' do
|
2288
|
+
input = <<-EOS
|
2289
|
+
[horizontal]
|
2290
|
+
term::
|
2291
|
+
alt term::
|
2292
|
+
definition
|
2293
|
+
|
2294
|
+
last::
|
2295
|
+
EOS
|
2296
|
+
output = render_embedded_string input
|
2297
|
+
assert_xpath '//tr', output, 2
|
2298
|
+
assert_xpath '(//tr)[1]/td[@class="hdlist1"]', output, 1
|
2299
|
+
assert_xpath '(//tr)[1]/td[@class="hdlist1"]/br', output, 2
|
2300
|
+
assert_xpath '(//tr)[2]/td[@class="hdlist2"]', output, 1
|
2301
|
+
end
|
2302
|
+
|
2303
|
+
test 'consecutive terms in horizontal list should share same entry in docbook' do
|
2304
|
+
input = <<-EOS
|
2305
|
+
[horizontal]
|
2306
|
+
term::
|
2307
|
+
alt term::
|
2308
|
+
definition
|
2309
|
+
|
2310
|
+
last::
|
2311
|
+
EOS
|
2312
|
+
output = render_embedded_string input, :backend => 'docbook'
|
2313
|
+
assert_xpath '//row', output, 2
|
2314
|
+
assert_xpath '(//row)[1]/entry', output, 2
|
2315
|
+
assert_xpath '((//row)[1]/entry)[1]/simpara', output, 2
|
2316
|
+
assert_xpath '(//row)[2]/entry', output, 2
|
2317
|
+
assert_xpath '((//row)[2]/entry)[2][normalize-space(text())=""]', output, 1
|
2318
|
+
end
|
2319
|
+
|
2320
|
+
test 'should render horizontal list in docbook with proper markup' do
|
2321
|
+
input = <<-EOS
|
2322
|
+
.Terms
|
2323
|
+
[horizontal]
|
2324
|
+
first term:: definition
|
2325
|
+
+
|
2326
|
+
more detail
|
2327
|
+
|
2328
|
+
second term:: definition
|
2329
|
+
EOS
|
2330
|
+
output = render_embedded_string input, :backend => 'docbook'
|
2331
|
+
assert_xpath '/table', output, 1
|
2332
|
+
assert_xpath '/table[@tabstyle="horizontal"]', output, 1
|
2333
|
+
assert_xpath '/table[@tabstyle="horizontal"]/title[text()="Terms"]', output, 1
|
2334
|
+
assert_xpath '/table//row', output, 2
|
2335
|
+
assert_xpath '(/table//row)[1]/entry', output, 2
|
2336
|
+
assert_xpath '(/table//row)[2]/entry', output, 2
|
2337
|
+
assert_xpath '((/table//row)[1]/entry)[2]/simpara', output, 2
|
2338
|
+
end
|
2339
|
+
|
2222
2340
|
test 'should render qanda list in HTML with proper semantics' do
|
2223
2341
|
input = <<-EOS
|
2224
2342
|
[qanda]
|
@@ -2261,6 +2379,24 @@ Question 2::
|
|
2261
2379
|
end
|
2262
2380
|
end
|
2263
2381
|
|
2382
|
+
test 'consecutive questions should share same question element in docbook' do
|
2383
|
+
input = <<-EOS
|
2384
|
+
[qanda]
|
2385
|
+
question::
|
2386
|
+
follow-up question::
|
2387
|
+
response
|
2388
|
+
|
2389
|
+
last question::
|
2390
|
+
EOS
|
2391
|
+
output = render_embedded_string input, :backend => 'docbook'
|
2392
|
+
assert_xpath '//qandaentry', output, 2
|
2393
|
+
assert_xpath '(//qandaentry)[1]/question', output, 1
|
2394
|
+
assert_xpath '(//qandaentry)[1]/question/simpara', output, 2
|
2395
|
+
assert_xpath '(//qandaentry)[2]/question', output, 1
|
2396
|
+
assert_xpath '(//qandaentry)[2]/answer', output, 1
|
2397
|
+
assert_xpath '(//qandaentry)[2]/answer[normalize-space(text())=""]', output, 1
|
2398
|
+
end
|
2399
|
+
|
2264
2400
|
test 'should render bibliography list with proper semantics' do
|
2265
2401
|
input = <<-EOS
|
2266
2402
|
[bibliography]
|
@@ -3297,7 +3433,7 @@ end
|
|
3297
3433
|
context 'Callout lists' do
|
3298
3434
|
test 'listing block with sequential callouts followed by adjacent callout list' do
|
3299
3435
|
input = <<-EOS
|
3300
|
-
[source]
|
3436
|
+
[source, ruby]
|
3301
3437
|
----
|
3302
3438
|
require 'asciidoctor' # <1>
|
3303
3439
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
@@ -3321,7 +3457,7 @@ puts doc.render # <3>
|
|
3321
3457
|
|
3322
3458
|
test 'listing block with sequential callouts followed by non-adjacent callout list' do
|
3323
3459
|
input = <<-EOS
|
3324
|
-
[source]
|
3460
|
+
[source, ruby]
|
3325
3461
|
----
|
3326
3462
|
require 'asciidoctor' # <1>
|
3327
3463
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
@@ -3349,7 +3485,7 @@ Paragraph.
|
|
3349
3485
|
|
3350
3486
|
test 'listing block with a callout that refers to two different lines' do
|
3351
3487
|
input = <<-EOS
|
3352
|
-
[source]
|
3488
|
+
[source, ruby]
|
3353
3489
|
----
|
3354
3490
|
require 'asciidoctor' # <1>
|
3355
3491
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
@@ -3371,7 +3507,7 @@ puts doc.render # <2>
|
|
3371
3507
|
|
3372
3508
|
test 'listing block with non-sequential callouts followed by adjacent callout list' do
|
3373
3509
|
input = <<-EOS
|
3374
|
-
[source]
|
3510
|
+
[source, ruby]
|
3375
3511
|
----
|
3376
3512
|
require 'asciidoctor' # <2>
|
3377
3513
|
doc = Asciidoctor::Document.new('Hello, World!') # <3>
|
@@ -3396,13 +3532,13 @@ puts doc.render # <1>
|
|
3396
3532
|
test 'two listing blocks can share the same callout list' do
|
3397
3533
|
input = <<-EOS
|
3398
3534
|
.Import library
|
3399
|
-
[source]
|
3535
|
+
[source, ruby]
|
3400
3536
|
----
|
3401
3537
|
require 'asciidoctor' # <1>
|
3402
3538
|
----
|
3403
3539
|
|
3404
3540
|
.Use library
|
3405
|
-
[source]
|
3541
|
+
[source, ruby]
|
3406
3542
|
----
|
3407
3543
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
3408
3544
|
puts doc.render # <3>
|
@@ -3427,14 +3563,14 @@ puts doc.render # <3>
|
|
3427
3563
|
test 'two listing blocks each followed by an adjacent callout list' do
|
3428
3564
|
input = <<-EOS
|
3429
3565
|
.Import library
|
3430
|
-
[source]
|
3566
|
+
[source, ruby]
|
3431
3567
|
----
|
3432
3568
|
require 'asciidoctor' # <1>
|
3433
3569
|
----
|
3434
3570
|
<1> Describe the first line
|
3435
3571
|
|
3436
3572
|
.Use library
|
3437
|
-
[source]
|
3573
|
+
[source, ruby]
|
3438
3574
|
----
|
3439
3575
|
doc = Asciidoctor::Document.new('Hello, World!') # <1>
|
3440
3576
|
puts doc.render # <2>
|
@@ -3459,7 +3595,7 @@ puts doc.render # <2>
|
|
3459
3595
|
|
3460
3596
|
test 'callout list with block content' do
|
3461
3597
|
input = <<-EOS
|
3462
|
-
[source]
|
3598
|
+
[source, ruby]
|
3463
3599
|
----
|
3464
3600
|
require 'asciidoctor' # <1>
|
3465
3601
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
@@ -3486,7 +3622,7 @@ You can write this to file rather than printing to stdout.
|
|
3486
3622
|
|
3487
3623
|
test 'escaped callout should not be interpreted as a callout' do
|
3488
3624
|
input = <<-EOS
|
3489
|
-
[source]
|
3625
|
+
[source, ruby]
|
3490
3626
|
----
|
3491
3627
|
require 'asciidoctor' # \\<1>
|
3492
3628
|
----
|
@@ -3518,7 +3654,7 @@ Violets are blue <2>
|
|
3518
3654
|
|
3519
3655
|
test 'callout list with icons enabled' do
|
3520
3656
|
input = <<-EOS
|
3521
|
-
[source]
|
3657
|
+
[source, ruby]
|
3522
3658
|
----
|
3523
3659
|
require 'asciidoctor' # <1>
|
3524
3660
|
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
@@ -3538,4 +3674,27 @@ puts doc.render # <3>
|
|
3538
3674
|
assert_xpath %((/div[@class="colist arabic"]//td/img)[#{i}][@src="./images/icons/callouts/#{i}.png"][@alt="#{i}"]), output, 1
|
3539
3675
|
end
|
3540
3676
|
end
|
3677
|
+
|
3678
|
+
test 'callout list with font-based icons enabled' do
|
3679
|
+
input = <<-EOS
|
3680
|
+
[source]
|
3681
|
+
----
|
3682
|
+
require 'asciidoctor' # <1>
|
3683
|
+
doc = Asciidoctor::Document.new('Hello, World!') # <2>
|
3684
|
+
puts doc.render # <3>
|
3685
|
+
----
|
3686
|
+
<1> Describe the first line
|
3687
|
+
<2> Describe the second line
|
3688
|
+
<3> Describe the third line
|
3689
|
+
EOS
|
3690
|
+
output = render_embedded_string input, :attributes => {'icons' => 'font'}
|
3691
|
+
assert_css '.listingblock code > i', output, 3
|
3692
|
+
(1..3).each do |i|
|
3693
|
+
assert_xpath %((/div[@class="listingblock"]//code/i)[#{i}][@class="conum"][text() = "#{i}"]), output, 1
|
3694
|
+
end
|
3695
|
+
assert_css '.colist table td i', output, 3
|
3696
|
+
(1..3).each do |i|
|
3697
|
+
assert_xpath %((/div[@class="colist arabic"]//td/i)[#{i}][@class="conum"][text() = "#{i}"]), output, 1
|
3698
|
+
end
|
3699
|
+
end
|
3541
3700
|
end
|
data/test/options_test.rb
CHANGED
@@ -20,9 +20,9 @@ context 'Options' do
|
|
20
20
|
|
21
21
|
test 'should return error code 1 when option has invalid argument' do
|
22
22
|
redirect_streams do |stdout, stderr|
|
23
|
-
exitval = Asciidoctor::Cli::Options.parse!(%w(-
|
23
|
+
exitval = Asciidoctor::Cli::Options.parse!(%w(-d chapter input.ad)) # had to change for #320
|
24
24
|
assert_equal 1, exitval
|
25
|
-
assert_equal 'asciidoctor: invalid argument: -
|
25
|
+
assert_equal 'asciidoctor: invalid argument: -d chapter', stderr.string.chomp
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -65,4 +65,31 @@ context 'Options' do
|
|
65
65
|
assert_equal '', options[:attributes]['icons']
|
66
66
|
end
|
67
67
|
|
68
|
+
test 'should only split attribute key/value pairs on first equal sign' do
|
69
|
+
options = Asciidoctor::Cli::Options.parse!(%w(-a name=value=value test/fixtures/sample.asciidoc))
|
70
|
+
|
71
|
+
assert_equal 'value=value', options[:attributes]['name']
|
72
|
+
end
|
73
|
+
|
74
|
+
test 'should allow any backend to be specified' do
|
75
|
+
options = Asciidoctor::Cli::Options.parse!(%w(-b my_custom_backend test/fixtures/sample.asciidoc))
|
76
|
+
|
77
|
+
assert_equal 'my_custom_backend', options[:attributes]['backend']
|
78
|
+
end
|
79
|
+
|
80
|
+
test 'article doctype assignment' do
|
81
|
+
options = Asciidoctor::Cli::Options.parse!(%w(-d article test/fixtures/sample.asciidoc))
|
82
|
+
assert_equal 'article', options[:attributes]['doctype']
|
83
|
+
end
|
84
|
+
|
85
|
+
test 'book doctype assignment' do
|
86
|
+
options = Asciidoctor::Cli::Options.parse!(%w(-d book test/fixtures/sample.asciidoc))
|
87
|
+
assert_equal 'book', options[:attributes]['doctype']
|
88
|
+
end
|
89
|
+
|
90
|
+
test 'inline doctype assignment' do
|
91
|
+
options = Asciidoctor::Cli::Options.parse!(%w(-d inline test/fixtures/sample.asciidoc))
|
92
|
+
assert_equal 'inline', options[:attributes]['doctype']
|
93
|
+
end
|
94
|
+
|
68
95
|
end
|
data/test/paragraphs_test.rb
CHANGED
@@ -252,7 +252,7 @@ use the source, luke!
|
|
252
252
|
die 'zomg perl sucks';
|
253
253
|
EOS
|
254
254
|
output = render_embedded_string input
|
255
|
-
assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="perl"][text()="die 'zomg perl sucks';"]), output, 1
|
255
|
+
assert_xpath %(/*[@class="listingblock"]//pre[@class="highlight"]/code[@class="perl language-perl"][text()="die 'zomg perl sucks';"]), output, 1
|
256
256
|
end
|
257
257
|
|
258
258
|
test 'literal paragraph terminates at block attribute list' do
|
@@ -292,28 +292,12 @@ normal text
|
|
292
292
|
end
|
293
293
|
|
294
294
|
context 'Quote' do
|
295
|
-
test "quote block" do
|
296
|
-
output = render_string("____\nFamous quote.\n____")
|
297
|
-
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
298
|
-
assert_xpath '//*[@class = "quoteblock"]//p[text() = "Famous quote."]', output, 1
|
299
|
-
end
|
300
|
-
|
301
|
-
test "quote block with attribution" do
|
302
|
-
output = render_string("[quote, A famous person, A famous book (1999)]\n____\nFamous quote.\n____")
|
303
|
-
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
304
|
-
assert_xpath '//*[@class = "quoteblock"]/*[@class = "attribution"]', output, 1
|
305
|
-
assert_xpath '//*[@class = "quoteblock"]/*[@class = "attribution"]/cite[text() = "A famous book (1999)"]', output, 1
|
306
|
-
# TODO I can't seem to match the attribution (author) w/ xpath
|
307
|
-
end
|
308
|
-
|
309
|
-
test "quote block with section body" do
|
310
|
-
output = render_string("____\nFamous quote.\n\nNOTE: That was inspiring.\n____")
|
311
|
-
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
312
|
-
assert_xpath '//*[@class = "quoteblock"]//*[@class = "admonitionblock note"]', output, 1
|
313
|
-
end
|
314
|
-
|
315
295
|
test "single-line quote paragraph" do
|
316
|
-
|
296
|
+
input = <<-EOS
|
297
|
+
[quote]
|
298
|
+
Famous quote.
|
299
|
+
EOS
|
300
|
+
output = render_string input
|
317
301
|
assert_xpath '//*[@class = "quoteblock"]', output, 1
|
318
302
|
assert_xpath '//*[@class = "quoteblock"]//p', output, 0
|
319
303
|
assert_xpath '//*[@class = "quoteblock"]//*[contains(text(), "Famous quote.")]', output, 1
|
@@ -339,31 +323,6 @@ A famouse quote.
|
|
339
323
|
assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1
|
340
324
|
end
|
341
325
|
|
342
|
-
test "single-line verse block" do
|
343
|
-
output = render_string("[verse]\n____\nFamous verse.\n____")
|
344
|
-
assert_xpath '//*[@class = "verseblock"]', output, 1
|
345
|
-
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
346
|
-
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
347
|
-
assert_xpath '//*[@class = "verseblock"]/pre[normalize-space(text()) = "Famous verse."]', output, 1
|
348
|
-
end
|
349
|
-
|
350
|
-
test "multi-line verse block" do
|
351
|
-
output = render_string("[verse]\n____\nFamous verse.\n\nStanza two.\n____")
|
352
|
-
assert_xpath '//*[@class = "verseblock"]', output, 1
|
353
|
-
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
354
|
-
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
355
|
-
assert_xpath '//*[@class = "verseblock"]/pre[contains(text(), "Famous verse.")]', output, 1
|
356
|
-
assert_xpath '//*[@class = "verseblock"]/pre[contains(text(), "Stanza two.")]', output, 1
|
357
|
-
end
|
358
|
-
|
359
|
-
test "verse block does not contain block elements" do
|
360
|
-
output = render_string("[verse]\n____\nFamous verse.\n\n....\nnot a literal\n....\n____")
|
361
|
-
assert_xpath '//*[@class = "verseblock"]', output, 1
|
362
|
-
assert_xpath '//*[@class = "verseblock"]/pre', output, 1
|
363
|
-
assert_xpath '//*[@class = "verseblock"]//p', output, 0
|
364
|
-
assert_xpath '//*[@class = "verseblock"]//*[@class = "literalblock"]', output, 0
|
365
|
-
end
|
366
|
-
|
367
326
|
test 'quote paragraph should honor explicit subs list' do
|
368
327
|
input = <<-EOS
|
369
328
|
[subs="specialcharacters"]
|
@@ -407,5 +366,104 @@ Content goes here
|
|
407
366
|
result = render_string(input)
|
408
367
|
assert_xpath "//*[@class='sidebarblock']//p", result, 1
|
409
368
|
end
|
369
|
+
|
370
|
+
context 'Styled Paragraphs' do
|
371
|
+
test 'should wrap text in simpara for styled paragraphs when rendered to DocBook' do
|
372
|
+
input = <<-EOS
|
373
|
+
= Book
|
374
|
+
:doctype: book
|
375
|
+
|
376
|
+
[preface]
|
377
|
+
= About this book
|
378
|
+
|
379
|
+
[abstract]
|
380
|
+
An abstract for the book.
|
381
|
+
|
382
|
+
= Part 1
|
383
|
+
|
384
|
+
[partintro]
|
385
|
+
An intro to this part.
|
386
|
+
|
387
|
+
[sidebar]
|
388
|
+
Just a side note.
|
389
|
+
|
390
|
+
[example]
|
391
|
+
As you can see here.
|
392
|
+
|
393
|
+
[quote]
|
394
|
+
Wise words from a wise person.
|
395
|
+
EOS
|
396
|
+
|
397
|
+
output = render_string input, :backend => 'docbook'
|
398
|
+
assert_css 'abstract > simpara', output, 1
|
399
|
+
assert_css 'partintro > simpara', output, 1
|
400
|
+
assert_css 'sidebar > simpara', output, 1
|
401
|
+
assert_css 'informalexample > simpara', output, 1
|
402
|
+
assert_css 'blockquote > simpara', output, 1
|
403
|
+
end
|
404
|
+
|
405
|
+
test 'should wrap text in simpara for styled paragraphs with title when rendered to DocBook' do
|
406
|
+
input = <<-EOS
|
407
|
+
= Book
|
408
|
+
:doctype: book
|
409
|
+
|
410
|
+
[preface]
|
411
|
+
= About this book
|
412
|
+
|
413
|
+
[abstract]
|
414
|
+
.Abstract title
|
415
|
+
An abstract for the book.
|
416
|
+
|
417
|
+
= Part 1
|
418
|
+
|
419
|
+
[partintro]
|
420
|
+
.Part intro title
|
421
|
+
An intro to this part.
|
422
|
+
|
423
|
+
[sidebar]
|
424
|
+
.Sidebar title
|
425
|
+
Just a side note.
|
426
|
+
|
427
|
+
[example]
|
428
|
+
.Example title
|
429
|
+
As you can see here.
|
430
|
+
|
431
|
+
[quote]
|
432
|
+
.Quote title
|
433
|
+
Wise words from a wise person.
|
434
|
+
EOS
|
435
|
+
|
436
|
+
output = render_string input, :backend => 'docbook'
|
437
|
+
assert_css 'abstract > title', output, 1
|
438
|
+
assert_xpath '//abstract/title[text() = "Abstract title"]', output, 1
|
439
|
+
assert_css 'abstract > title + simpara', output, 1
|
440
|
+
assert_css 'partintro > title', output, 1
|
441
|
+
assert_xpath '//partintro/title[text() = "Part intro title"]', output, 1
|
442
|
+
assert_css 'partintro > title + simpara', output, 1
|
443
|
+
assert_css 'sidebar > title', output, 1
|
444
|
+
assert_xpath '//sidebar/title[text() = "Sidebar title"]', output, 1
|
445
|
+
assert_css 'sidebar > title + simpara', output, 1
|
446
|
+
assert_css 'example > title', output, 1
|
447
|
+
assert_xpath '//example/title[text() = "Example title"]', output, 1
|
448
|
+
assert_css 'example > title + simpara', output, 1
|
449
|
+
assert_css 'blockquote > title', output, 1
|
450
|
+
assert_xpath '//blockquote/title[text() = "Quote title"]', output, 1
|
451
|
+
assert_css 'blockquote > title + simpara', output, 1
|
452
|
+
end
|
453
|
+
end
|
454
|
+
|
455
|
+
context 'Inline doctype' do
|
456
|
+
test 'should only format and output text in first paragraph when doctype is inline' do
|
457
|
+
input = "http://asciidoc.org[AsciiDoc] is a _lightweight_ markup language...\n\nignored"
|
458
|
+
output = render_string input, :doctype => 'inline'
|
459
|
+
assert_equal '<a href="http://asciidoc.org">AsciiDoc</a> is a <em>lightweight</em> markup language…', output
|
460
|
+
end
|
461
|
+
|
462
|
+
test 'should output empty string if first block is not a paragraph' do
|
463
|
+
input = '* bullet'
|
464
|
+
output = render_string input, :doctype => 'inline'
|
465
|
+
assert output.empty?
|
466
|
+
end
|
467
|
+
end
|
410
468
|
end
|
411
469
|
end
|