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,9 +1,25 @@
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 'Links' do
4
8
 
5
9
  test 'qualified url inline with text' do
6
- assert_xpath "//a[@href='http://asciidoc.org'][text() = 'http://asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org.")
10
+ assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'http://asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org.")
11
+ end
12
+
13
+ test 'qualified http url inline with hide-uri-scheme set' do
14
+ assert_xpath "//a[@href='http://asciidoc.org'][@class='bare'][text() = 'asciidoc.org']", render_string("The AsciiDoc project is located at http://asciidoc.org.", :attributes => {'hide-uri-scheme' => ''})
15
+ end
16
+
17
+ test 'qualified file url inline with label' do
18
+ assert_xpath "//a[@href='file:///home/user/bookmarks.html'][text() = 'My Bookmarks']", render_embedded_string('file:///home/user/bookmarks.html[My Bookmarks]')
19
+ end
20
+
21
+ test 'qualified file url inline with hide-uri-scheme set' do
22
+ assert_xpath "//a[@href='file:///etc/app.conf'][text() = '/etc/app.conf']", render_string('Edit the configuration file link:file:///etc/app.conf[]', :attributes => {'hide-uri-scheme' => ''})
7
23
  end
8
24
 
9
25
  test 'qualified url with label' do
@@ -30,6 +46,22 @@ context 'Links' do
30
46
  assert_xpath '//a[@href="http://asciidoc.org"][text()="http://asciidoc.org"]', render_string('(http://asciidoc.org) is the project page for AsciiDoc.'), 1
31
47
  end
32
48
 
49
+ test 'qualified url with trailing round bracket' do
50
+ assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('Asciidoctor is a Ruby-based AsciiDoc processor (see http://asciidoctor.org)'), 1
51
+ end
52
+
53
+ test 'qualified url with trailing semi-colon' do
54
+ assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('http://asciidoctor.org; where text gets parsed'), 1
55
+ end
56
+
57
+ test 'qualified url with trailing colon' do
58
+ assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('http://asciidoctor.org: where text gets parsed'), 1
59
+ end
60
+
61
+ test 'qualified url in round brackets with trailing colon' do
62
+ assert_xpath '//a[@href="http://asciidoctor.org"][text()="http://asciidoctor.org"]', render_string('(http://asciidoctor.org): where text gets parsed'), 1
63
+ end
64
+
33
65
  test 'qualified url containing round brackets' do
34
66
  assert_xpath '//a[@href="http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)"][text()="addModule() adds a Ruby module"]', render_string('http://jruby.org/apidocs/org/jruby/Ruby.html#addModule(org.jruby.RubyModule)[addModule() adds a Ruby module]'), 1
35
67
  end
@@ -42,6 +74,11 @@ context 'Links' do
42
74
  assert_xpath '//a[@href="http://asciidoc.org"][text()="AsciiDoc"]', render_string(')http://asciidoc.org[AsciiDoc] project page.'), 1
43
75
  end
44
76
 
77
+ test 'qualified url following smart apostrophe' do
78
+ output = render_embedded_string("l&#8217;http://www.irit.fr[IRIT]")
79
+ assert_match(/l&#8217;<a href=/, output)
80
+ end
81
+
45
82
  test 'qualified url using invalid link macro should not create link' do
46
83
  assert_xpath '//a', render_string('link:http://asciidoc.org is the project page for AsciiDoc.'), 0
47
84
  end
@@ -50,6 +87,14 @@ context 'Links' do
50
87
  assert_xpath '//a', render_string('\http://asciidoc.org is the project page for AsciiDoc.'), 0
51
88
  end
52
89
 
90
+ test 'url in link macro with at (@) sign should not create mailto link' do
91
+ assert_xpath '//a[@href="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"][text()="subscribe"]', render_string('http://xircles.codehaus.org/lists/dev@geb.codehaus.org[subscribe]')
92
+ end
93
+
94
+ test 'implicit url with at (@) sign should not create mailto link' do
95
+ assert_xpath '//a[@href="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"][text()="http://xircles.codehaus.org/lists/dev@geb.codehaus.org"]', render_string('http://xircles.codehaus.org/lists/dev@geb.codehaus.org')
96
+ end
97
+
53
98
  test 'escaped inline qualified url using macro syntax should not create link' do
54
99
  assert_xpath '//a', render_string('\http://asciidoc.org[AsciiDoc] is the key to good docs.'), 0
55
100
  end
@@ -75,7 +120,11 @@ context 'Links' do
75
120
  end
76
121
 
77
122
  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
123
+ assert_xpath '//a[@href="http://search.example.com"][text()="Google, Yahoo, Bing = Search Engines"]', render_embedded_string('http://search.example.com["Google, Yahoo, Bing = Search Engines"]', :attributes => {'linkattrs' => ''}), 1
124
+ end
125
+
126
+ test 'link with comma in text but no equal sign should not be separated into attributes when linkattrs is set' do
127
+ 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
128
  end
80
129
 
81
130
  test 'role and window attributes on link are processed when linkattrs is set' do
@@ -86,6 +135,14 @@ context 'Links' do
86
135
  assert_xpath '//a[@href="http://google.com"][@target="_blank"]', render_embedded_string('http://google.com[Google^]'), 1
87
136
  end
88
137
 
138
+ test 'id attribute on link are processed when linkattrs is set' do
139
+ assert_xpath '//a[@href="http://google.com"][@id="link-1"]', render_embedded_string('http://google.com[Google, id="link-1"]', :attributes => {'linkattrs' => ''}), 1
140
+ end
141
+
142
+ test 'title attribute on link are processed when linkattrs is set' do
143
+ assert_xpath '//a[@href="http://google.com"][@title="title-1"]', render_embedded_string('http://google.com[Google, title="title-1"]', :attributes => {'linkattrs' => ''}), 1
144
+ end
145
+
89
146
  test 'inline irc link' do
90
147
  assert_xpath '//a[@href="irc://irc.freenode.net"][text()="irc://irc.freenode.net"]', render_embedded_string('irc://irc.freenode.net'), 1
91
148
  end
@@ -95,26 +152,35 @@ context 'Links' do
95
152
  end
96
153
 
97
154
  test 'inline ref' do
98
- doc = document_from_string 'Here you can read about tigers.[[tigers]]'
99
- output = doc.render
100
- assert_equal '[tigers]', doc.references[:ids]['tigers']
101
- assert_xpath '//a[@id = "tigers"]', output, 1
102
- assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
155
+ variations = %w([[tigers]] anchor:tigers[])
156
+ variations.each do |anchor|
157
+ doc = document_from_string %(Here you can read about tigers.#{anchor})
158
+ output = doc.render
159
+ assert_equal '[tigers]', doc.references[:ids]['tigers']
160
+ assert_xpath '//a[@id = "tigers"]', output, 1
161
+ assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
162
+ end
103
163
  end
104
164
 
105
165
  test 'inline ref with reftext' do
106
- doc = document_from_string 'Here you can read about tigers.[[tigers,Tigers]]'
107
- output = doc.render
108
- assert_equal 'Tigers', doc.references[:ids]['tigers']
109
- assert_xpath '//a[@id = "tigers"]', output, 1
110
- assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
166
+ variations = %w([[tigers,Tigers]] anchor:tigers[Tigers])
167
+ variations.each do |anchor|
168
+ doc = document_from_string %(Here you can read about tigers.#{anchor})
169
+ output = doc.render
170
+ assert_equal 'Tigers', doc.references[:ids]['tigers']
171
+ assert_xpath '//a[@id = "tigers"]', output, 1
172
+ assert_xpath '//a[@id = "tigers"]/child::text()', output, 0
173
+ end
111
174
  end
112
175
 
113
176
  test 'escaped inline ref' do
114
- doc = document_from_string 'Here you can read about tigers.\[[tigers]]'
115
- output = doc.render
116
- assert !doc.references[:ids].has_key?('tigers')
117
- assert_xpath '//a[@id = "tigers"]', output, 0
177
+ variations = %w([[tigers]] anchor:tigers[])
178
+ variations.each do |anchor|
179
+ doc = document_from_string %(Here you can read about tigers.\\#{anchor})
180
+ output = doc.render
181
+ assert !doc.references[:ids].has_key?('tigers')
182
+ assert_xpath '//a[@id = "tigers"]', output, 0
183
+ end
118
184
  end
119
185
 
120
186
  test 'xref using angled bracket syntax' do
@@ -151,6 +217,12 @@ context 'Links' do
151
217
  assert_xpath '//a[@href="tigers.html#about"][text() = "About Tigers"]', doc.render, 1
152
218
  end
153
219
 
220
+ test 'xref using angled bracket syntax with path and custom relfilesuffix and outfilesuffix' do
221
+ attributes = {'relfileprefix' => '../', 'outfilesuffix' => '/'}
222
+ doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false, :attributes => attributes
223
+ assert_xpath '//a[@href="../tigers/#about"][text() = "About Tigers"]', doc.render, 1
224
+ end
225
+
154
226
  test 'xref using angled bracket syntax with path which has been included in this document' do
155
227
  doc = document_from_string '<<tigers#about,About Tigers>>', :header_footer => false
156
228
  doc.references[:includes] << 'tigers'
@@ -173,7 +245,7 @@ context 'Links' do
173
245
 
174
246
  test 'xref with escaped text' do
175
247
  # when \x0 was used as boundary character for passthrough, it was getting stripped
176
- # now using \e as boundary character, which resolves issue
248
+ # now using unicode marks as boundary characters, which resolves issue
177
249
  input = 'See the <<tigers , `[tigers]`>> section for data about tigers'
178
250
  output = render_embedded_string input
179
251
  assert_xpath %(//a[@href="#tigers"]/code[text()="[tigers]"]), output, 1
@@ -236,9 +308,13 @@ context 'Links' do
236
308
  assert_equal({'tigers' => 'Tigers'}, doc.references[:ids])
237
309
  end
238
310
 
239
- test 'anchor with quoted label creates reference' do
240
- doc = document_from_string %([["tigers","Tigers roam here"]]Tigers roam here.)
241
- assert_equal({'tigers' => "Tigers roam here"}, doc.references[:ids])
311
+ test 'anchor with quoted label creates reference with quoted label text' do
312
+ doc = document_from_string %([[tigers,"Tigers roam here"]]Tigers roam here.)
313
+ assert_equal({'tigers' => '"Tigers roam here"'}, doc.references[:ids])
242
314
  end
243
315
 
316
+ test 'anchor with label containing a comma creates reference' do
317
+ doc = document_from_string %([[tigers,Tigers, scary tigers, roam here]]Tigers roam here.)
318
+ assert_equal({'tigers' => 'Tigers, scary tigers, roam here'}, doc.references[:ids])
319
+ end
244
320
  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 "Bulleted lists (:ulist)" do
4
8
  context "Simple lists" do
@@ -622,7 +626,7 @@ List
622
626
  ====
623
627
 
624
628
  - I am *strong*.
625
- - I am 'stressed'.
629
+ - I am _stressed_.
626
630
  - I am `flexible`.
627
631
  EOS
628
632
  output = render_string input
@@ -639,7 +643,7 @@ List
639
643
  ====
640
644
  :foo: bar
641
645
 
642
- - side a {brvbar} side b
646
+ - side a {vbar} side b
643
647
  - Take me to a {foo}.
644
648
  EOS
645
649
  output = render_string input
@@ -944,7 +948,8 @@ List
944
948
  literal
945
949
  ....
946
950
  EOS
947
- output = render_embedded_string input
951
+ # use render_string so we can match all ulists easier
952
+ output = render_string input
948
953
  assert_xpath '//*[@class="ulist"]/ul', output, 2
949
954
  assert_xpath '(//*[@class="ulist"])[1]/following-sibling::*[@class="literalblock"]', output, 1
950
955
  assert_xpath '(//*[@class="ulist"])[1]/following-sibling::*[@class="literalblock"]/*[@class="title"]', output, 1
@@ -1028,7 +1033,7 @@ Item one, literal block
1028
1033
  assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@class = "literalblock"]', output, 1
1029
1034
  end
1030
1035
 
1031
- test "adjacent list continuation line attaches following block with block attributes" do
1036
+ test 'adjacent list continuation line attaches following block with block attributes' do
1032
1037
  input = <<-EOS
1033
1038
  Lists
1034
1039
  =====
@@ -1051,7 +1056,7 @@ Lists
1051
1056
  assert_xpath '//ul/li[1]/p', output, 1
1052
1057
  assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"][@class = "listingblock"]', output, 1
1053
1058
  assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]/div[@class="title"][starts-with(text(),"Read")]', output, 1
1054
- assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]//code[@class="ruby language-ruby"][starts-with(text(),"5.times")]', output, 1
1059
+ assert_xpath '(//ul/li[1]/p/following-sibling::*)[1][@id="beck"]//code[@data-lang="ruby"][starts-with(text(),"5.times")]', output, 1
1055
1060
  end
1056
1061
 
1057
1062
  test 'trailing block attribute line attached by continuation should not create block' do
@@ -1399,6 +1404,71 @@ bullet 1 paragraph
1399
1404
  assert_xpath '(((//ul)[1]/li)[1]/div[@class="ulist"]/ul/li/div[@class="ulist"]/ul/li/*)[2]/self::div[@class="openblock"]', output, 1
1400
1405
  end
1401
1406
 
1407
+ test 'indented outline list item with different marker offset by a blank line should be recognized as a nested list' do
1408
+ input = <<-EOS
1409
+ * item 1
1410
+
1411
+ . item 1.1
1412
+ +
1413
+ attached paragraph
1414
+
1415
+ . item 1.2
1416
+ +
1417
+ attached paragraph
1418
+
1419
+ * item 2
1420
+ EOS
1421
+
1422
+ output = render_embedded_string input
1423
+
1424
+ assert_css 'ul', output, 1
1425
+ assert_css 'ol', output, 1
1426
+ assert_css 'ul ol', output, 1
1427
+ assert_css 'ul > li', output, 2
1428
+ assert_xpath '((//ul/li)[1]/*)', output, 2
1429
+ assert_xpath '((//ul/li)[1]/*)[1]/self::p', output, 1
1430
+ assert_xpath '((//ul/li)[1]/*)[2]/self::div/ol', output, 1
1431
+ assert_xpath '((//ul/li)[1]/*)[2]/self::div/ol/li', output, 2
1432
+ (1..2).each do |idx|
1433
+ assert_xpath "(((//ul/li)[1]/*)[2]/self::div/ol/li)[#{idx}]/*", output, 2
1434
+ assert_xpath "((((//ul/li)[1]/*)[2]/self::div/ol/li)[#{idx}]/*)[1]/self::p", output, 1
1435
+ assert_xpath "((((//ul/li)[1]/*)[2]/self::div/ol/li)[#{idx}]/*)[2]/self::div[@class=\"paragraph\"]", output, 1
1436
+ end
1437
+ end
1438
+
1439
+ test 'indented labeled list item inside outline list item offset by a blank line should be recognized as a nested list' do
1440
+ input = <<-EOS
1441
+ * item 1
1442
+
1443
+ term a:: definition a
1444
+ +
1445
+ attached paragraph
1446
+
1447
+ term b:: definition b
1448
+ +
1449
+ attached paragraph
1450
+
1451
+ * item 2
1452
+ EOS
1453
+
1454
+ output = render_embedded_string input
1455
+
1456
+ assert_css 'ul', output, 1
1457
+ assert_css 'dl', output, 1
1458
+ assert_css 'ul dl', output, 1
1459
+ assert_css 'ul > li', output, 2
1460
+ assert_xpath '((//ul/li)[1]/*)', output, 2
1461
+ assert_xpath '((//ul/li)[1]/*)[1]/self::p', output, 1
1462
+ assert_xpath '((//ul/li)[1]/*)[2]/self::div/dl', output, 1
1463
+ assert_xpath '((//ul/li)[1]/*)[2]/self::div/dl/dt', output, 2
1464
+ assert_xpath '((//ul/li)[1]/*)[2]/self::div/dl/dd', output, 2
1465
+ (1..2).each do |idx|
1466
+ assert_xpath "(((//ul/li)[1]/*)[2]/self::div/dl/dd)[#{idx}]/*", output, 2
1467
+ assert_xpath "((((//ul/li)[1]/*)[2]/self::div/dl/dd)[#{idx}]/*)[1]/self::p", output, 1
1468
+ assert_xpath "((((//ul/li)[1]/*)[2]/self::div/dl/dd)[#{idx}]/*)[2]/self::div[@class=\"paragraph\"]", output, 1
1469
+ end
1470
+ end
1471
+
1402
1472
  # NOTE this is not consistent w/ AsciiDoc output, but this is some screwy input anyway
1403
1473
  =begin
1404
1474
  test "consecutive list continuation lines are folded" do
@@ -1606,10 +1676,40 @@ List
1606
1676
  assert_xpath '(//ol)[1]/li', output, 2
1607
1677
  assert_xpath '(//ol)[2]/li', output, 1
1608
1678
  end
1679
+
1680
+ test 'should use start number in docbook4.5 backend' do
1681
+ input = <<-EOS
1682
+ == List
1683
+
1684
+ [start=7]
1685
+ . item 7
1686
+ . item 8
1687
+ EOS
1688
+
1689
+ output = render_embedded_string input, :backend => 'docbook45'
1690
+ assert_xpath '//orderedlist', output, 1
1691
+ assert_xpath '(//orderedlist)/listitem', output, 2
1692
+ assert_xpath '(//orderedlist/listitem)[1][@override = "7"]', output, 1
1693
+ end
1694
+
1695
+ test 'should use start number in docbook5 backend' do
1696
+ input = <<-EOS
1697
+ == List
1698
+
1699
+ [start=7]
1700
+ . item 7
1701
+ . item 8
1702
+ EOS
1703
+
1704
+ output = render_embedded_string input, :backend => 'docbook5'
1705
+ assert_xpath '//orderedlist', output, 1
1706
+ assert_xpath '(//orderedlist)/listitem', output, 2
1707
+ assert_xpath '(//orderedlist)[@startingnumber = "7"]', output, 1
1708
+ end
1609
1709
  end
1610
1710
  end
1611
1711
 
1612
- context "Labeled lists (:dlist)" do
1712
+ context "Description lists (:dlist)" do
1613
1713
  context "Simple lists" do
1614
1714
  test "single-line adjacent elements" do
1615
1715
  input = <<-EOS
@@ -2382,8 +2482,23 @@ term:: def
2382
2482
  assert_css 'table', output, 1
2383
2483
  assert_css 'table > colgroup', output, 1
2384
2484
  assert_css 'table > colgroup > col', output, 2
2385
- assert_xpath '(//table/colgroup/col)[1][@style="width:25%;"]', output, 1
2386
- assert_xpath '(//table/colgroup/col)[2][@style="width:75%;"]', output, 1
2485
+ assert_xpath '(//table/colgroup/col)[1][@style="width: 25%;"]', output, 1
2486
+ assert_xpath '(//table/colgroup/col)[2][@style="width: 75%;"]', output, 1
2487
+ end
2488
+
2489
+ test 'should set col widths of item and label in docbook if specified' do
2490
+ input = <<-EOS
2491
+ [horizontal]
2492
+ [labelwidth="25", itemwidth="75"]
2493
+ term:: def
2494
+ EOS
2495
+
2496
+ output = render_embedded_string input, :backend => 'docbook'
2497
+ assert_css 'informaltable', output, 1
2498
+ assert_css 'informaltable > tgroup', output, 1
2499
+ assert_css 'informaltable > tgroup > colspec', output, 2
2500
+ assert_xpath '(/informaltable/tgroup/colspec)[1][@colwidth="25*"]', output, 1
2501
+ assert_xpath '(/informaltable/tgroup/colspec)[2][@colwidth="75*"]', output, 1
2387
2502
  end
2388
2503
 
2389
2504
  test 'should add strong class to label if strong option is set' do
@@ -2459,6 +2574,8 @@ Question 1::
2459
2574
  Answer 1.
2460
2575
  Question 2::
2461
2576
  Answer 2.
2577
+ +
2578
+ NOTE: A note about Answer 2.
2462
2579
  EOS
2463
2580
  output = render_embedded_string input
2464
2581
  assert_css '.qlist.qanda', output, 1
@@ -2471,6 +2588,7 @@ Question 2::
2471
2588
  assert_css ".qanda > ol > li:nth-child(#{idx}) > p:last-child > *", output, 0
2472
2589
  assert_xpath "/*[@class = 'qlist qanda']/ol/li[#{idx}]/p[2][normalize-space(text()) = 'Answer #{idx}.']", output, 1
2473
2590
  end
2591
+ assert_xpath "/*[@class = 'qlist qanda']/ol/li[2]/p[2]/following-sibling::div[@class='admonitionblock note']", output, 1
2474
2592
  end
2475
2593
 
2476
2594
  test 'should render qanda list in DocBook with proper semantics' do
@@ -2480,6 +2598,8 @@ Question 1::
2480
2598
  Answer 1.
2481
2599
  Question 2::
2482
2600
  Answer 2.
2601
+ +
2602
+ NOTE: A note about Answer 2.
2483
2603
  EOS
2484
2604
  output = render_embedded_string input, :backend => 'docbook'
2485
2605
  assert_css 'qandaset', output, 1
@@ -2492,6 +2612,7 @@ Question 2::
2492
2612
  assert_css "qandaset > qandaentry:nth-child(#{idx}) > answer > simpara", output, 1
2493
2613
  assert_xpath "/qandaset/qandaentry[#{idx}]/answer/simpara[normalize-space(text()) = 'Answer #{idx}.']", output, 1
2494
2614
  end
2615
+ assert_xpath "/qandaset/qandaentry[2]/answer/simpara/following-sibling::note", output, 1
2495
2616
  end
2496
2617
 
2497
2618
  test 'consecutive questions should share same question element in docbook' do
@@ -2531,10 +2652,29 @@ last question::
2531
2652
  text = xmlnodes_at_xpath '(//a)[1]/following-sibling::text()', output, 1
2532
2653
  assert text.text.start_with?('[taoup] ')
2533
2654
  end
2655
+
2656
+ test 'should render bibliography list with proper semantics to DocBook' do
2657
+ input = <<-EOS
2658
+ [bibliography]
2659
+ - [[[taoup]]] Eric Steven Raymond. 'The Art of Unix
2660
+ Programming'. Addison-Wesley. ISBN 0-13-142901-9.
2661
+ - [[[walsh-muellner]]] Norman Walsh & Leonard Muellner.
2662
+ 'DocBook - The Definitive Guide'. O'Reilly & Associates. 1999.
2663
+ ISBN 1-56592-580-7.
2664
+ EOS
2665
+ output = render_embedded_string input, :backend => 'docbook'
2666
+ assert_css 'bibliodiv', output, 1
2667
+ assert_css 'bibliodiv > bibliomixed', output, 2
2668
+ assert_css 'bibliodiv > bibliomixed > bibliomisc', output, 2
2669
+ assert_css 'bibliodiv > bibliomixed:nth-child(1) > bibliomisc > anchor', output, 1
2670
+ assert_css 'bibliodiv > bibliomixed:nth-child(1) > bibliomisc > anchor[xreflabel="[taoup]"]', output, 1
2671
+ assert_css 'bibliodiv > bibliomixed:nth-child(2) > bibliomisc > anchor', output, 1
2672
+ assert_css 'bibliodiv > bibliomixed:nth-child(2) > bibliomisc > anchor[xreflabel="[walsh-muellner]"]', output, 1
2673
+ end
2534
2674
  end
2535
2675
  end
2536
2676
 
2537
- context 'Labeled lists redux' do
2677
+ context 'Description lists redux' do
2538
2678
 
2539
2679
  context 'Label without text on same line' do
2540
2680
 
@@ -2674,7 +2814,7 @@ term1::
2674
2814
  output = render_embedded_string input
2675
2815
  assert_xpath '//*[@class="dlist"]/dl', output, 1
2676
2816
  assert_xpath '//*[@class="dlist"]//dd', output, 1
2677
- assert_xpath %(//*[@class="dlist"]//dd/p/em[text()="'"]), output, 1
2817
+ assert_xpath %(//*[@class="dlist"]//dd/p[text()="'''"]), output, 1
2678
2818
  end
2679
2819
 
2680
2820
  test 'folds text that looks like ruler offset by blank line and line comment' do
@@ -2690,7 +2830,7 @@ term1::
2690
2830
  output = render_embedded_string input
2691
2831
  assert_xpath '//*[@class="dlist"]/dl', output, 1
2692
2832
  assert_xpath '//*[@class="dlist"]//dd', output, 1
2693
- assert_xpath %(//*[@class="dlist"]//dd/p/em[text()="'"]), output, 1
2833
+ assert_xpath %(//*[@class="dlist"]//dd/p[text()="'''"]), output, 1
2694
2834
  end
2695
2835
 
2696
2836
  test 'folds text that looks like ruler and the line following it offset by blank line' do
@@ -2706,8 +2846,7 @@ continued
2706
2846
  output = render_embedded_string input
2707
2847
  assert_xpath '//*[@class="dlist"]/dl', output, 1
2708
2848
  assert_xpath '//*[@class="dlist"]//dd', output, 1
2709
- assert_xpath %(//*[@class="dlist"]//dd/p/em[text()="'"]), output, 1
2710
- assert_xpath %(//*[@class="dlist"]//dd/p[normalize-space(text())="continued"]), output, 1
2849
+ assert_xpath %(//*[@class="dlist"]//dd/p[normalize-space(text())="''' continued"]), output, 1
2711
2850
  end
2712
2851
 
2713
2852
  test 'folds text that looks like title offset by blank line' do
@@ -2755,6 +2894,22 @@ NOTE: def1
2755
2894
  assert_xpath '//*[@class="dlist"]//dd', output, 1
2756
2895
  assert_xpath '//*[@class="dlist"]//dd/p[text()="NOTE: def1"]', output, 1
2757
2896
  end
2897
+
2898
+ test 'folds text that looks like section title offset by blank line' do
2899
+ input = <<-EOS
2900
+ == Lists
2901
+
2902
+ term1::
2903
+
2904
+ == Another Section
2905
+ EOS
2906
+
2907
+ output = render_embedded_string input
2908
+ assert_xpath '//*[@class="dlist"]/dl', output, 1
2909
+ assert_xpath '//*[@class="dlist"]//dd', output, 1
2910
+ assert_xpath '//*[@class="dlist"]//dd/p[text()="== Another Section"]', output, 1
2911
+ assert_xpath '//h2', output, 1
2912
+ end
2758
2913
 
2759
2914
  test 'folds text of first literal line offset by blank line appends subsequent literals offset by blank line as blocks' do
2760
2915
  input = <<-EOS
@@ -3775,9 +3930,9 @@ exit 0
3775
3930
  EOS
3776
3931
  output = render_embedded_string input
3777
3932
  assert_xpath '//code/b', output, 6
3778
- assert_match(/ <b>\(1\)<\/b>$/, output)
3779
- assert_match(/ <b>\(2\)<\/b> <b>\(3\)<\/b> <b>\(4\)<\/b>$/, output)
3780
- assert_match(/ <b>\(5\)<\/b><b>\(6\)<\/b>$/, output)
3933
+ assert_match(/ <b class="conum">\(1\)<\/b>$/, output)
3934
+ assert_match(/ <b class="conum">\(2\)<\/b> <b class="conum">\(3\)<\/b> <b class="conum">\(4\)<\/b>$/, output)
3935
+ assert_match(/ <b class="conum">\(5\)<\/b><b class="conum">\(6\)<\/b>$/, output)
3781
3936
  end
3782
3937
 
3783
3938
  test 'should allow XML comment-style callouts' do
@@ -3938,14 +4093,18 @@ context 'Checklists' do
3938
4093
  input = <<-EOS
3939
4094
  - [ ] todo
3940
4095
  - [x] done
4096
+ - [ ] another todo
4097
+ - [*] another done
3941
4098
  - plain
3942
4099
  EOS
3943
4100
 
3944
4101
  output = render_embedded_string input
3945
4102
  assert_css '.ulist.checklist', output, 1
3946
- assert_css '.ulist.checklist li input[type="checkbox"][disabled]', output, 2
3947
- assert_css '.ulist.checklist li input[type="checkbox"][checked]', output, 1
3948
- assert_xpath '(/*[@class="ulist checklist"]/ul/li)[3]/p[text()="plain"]', output, 1
4103
+ assert_xpath %((/*[@class="ulist checklist"]/ul/li)[1]/p[text()="#{expand_entity 10063} todo"]), output, 1
4104
+ assert_xpath %((/*[@class="ulist checklist"]/ul/li)[2]/p[text()="#{expand_entity 10003} done"]), output, 1
4105
+ assert_xpath %((/*[@class="ulist checklist"]/ul/li)[3]/p[text()="#{expand_entity 10063} another todo"]), output, 1
4106
+ assert_xpath %((/*[@class="ulist checklist"]/ul/li)[4]/p[text()="#{expand_entity 10003} another done"]), output, 1
4107
+ assert_xpath '(/*[@class="ulist checklist"]/ul/li)[5]/p[text()="plain"]', output, 1
3949
4108
  end
3950
4109
 
3951
4110
  test 'should create checklist with font icons if at least one item has checkbox syntax and icons attribute is font' do
@@ -3957,8 +4116,8 @@ context 'Checklists' do
3957
4116
 
3958
4117
  output = render_embedded_string input, :attributes => {'icons' => 'font'}
3959
4118
  assert_css '.ulist.checklist', output, 1
3960
- assert_css '.ulist.checklist li i.icon-check', output, 1
3961
- assert_css '.ulist.checklist li i.icon-check-empty', output, 1
4119
+ assert_css '.ulist.checklist li i.fa-check-square-o', output, 1
4120
+ assert_css '.ulist.checklist li i.fa-square-o', output, 1
3962
4121
  assert_xpath '(/*[@class="ulist checklist"]/ul/li)[3]/p[text()="plain"]', output, 1
3963
4122
  end
3964
4123