asciidoctor 1.5.8 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +11 -0
  3. data/CHANGELOG.adoc +628 -45
  4. data/LICENSE +2 -1
  5. data/README-de.adoc +28 -38
  6. data/README-fr.adoc +30 -43
  7. data/README-jp.adoc +255 -201
  8. data/README-zh_CN.adoc +40 -44
  9. data/README.adoc +170 -143
  10. data/asciidoctor.gemspec +22 -34
  11. data/bin/asciidoctor +5 -4
  12. data/data/locale/attributes-ar.adoc +4 -3
  13. data/data/locale/attributes-be.adoc +23 -0
  14. data/data/locale/attributes-bg.adoc +4 -3
  15. data/data/locale/attributes-ca.adoc +6 -5
  16. data/data/locale/attributes-cs.adoc +4 -3
  17. data/data/locale/attributes-da.adoc +6 -5
  18. data/data/locale/attributes-de.adoc +6 -5
  19. data/data/locale/attributes-en.adoc +4 -4
  20. data/data/locale/attributes-es.adoc +6 -5
  21. data/data/locale/attributes-fa.adoc +4 -3
  22. data/data/locale/attributes-fi.adoc +4 -3
  23. data/data/locale/attributes-fr.adoc +8 -7
  24. data/data/locale/attributes-hu.adoc +4 -3
  25. data/data/locale/attributes-id.adoc +4 -3
  26. data/data/locale/attributes-it.adoc +6 -5
  27. data/data/locale/attributes-ja.adoc +4 -3
  28. data/data/locale/{attributes-kr.adoc → attributes-ko.adoc} +4 -3
  29. data/data/locale/attributes-nb.adoc +4 -3
  30. data/data/locale/attributes-nl.adoc +6 -5
  31. data/data/locale/attributes-nn.adoc +4 -3
  32. data/data/locale/attributes-pl.adoc +8 -7
  33. data/data/locale/attributes-pt.adoc +6 -5
  34. data/data/locale/attributes-pt_BR.adoc +6 -5
  35. data/data/locale/attributes-ro.adoc +4 -3
  36. data/data/locale/attributes-ru.adoc +6 -5
  37. data/data/locale/attributes-sr.adoc +4 -4
  38. data/data/locale/attributes-sr_Latn.adoc +4 -4
  39. data/data/locale/attributes-sv.adoc +4 -4
  40. data/data/locale/attributes-th.adoc +23 -0
  41. data/data/locale/attributes-tr.adoc +4 -3
  42. data/data/locale/attributes-uk.adoc +6 -5
  43. data/data/locale/attributes-vi.adoc +23 -0
  44. data/data/locale/attributes-zh_CN.adoc +4 -3
  45. data/data/locale/attributes-zh_TW.adoc +4 -3
  46. data/data/reference/syntax.adoc +296 -0
  47. data/data/stylesheets/asciidoctor-default.css +120 -114
  48. data/data/stylesheets/coderay-asciidoctor.css +15 -17
  49. data/lib/asciidoctor/abstract_block.rb +146 -140
  50. data/lib/asciidoctor/abstract_node.rb +152 -170
  51. data/lib/asciidoctor/attribute_list.rb +77 -89
  52. data/lib/asciidoctor/block.rb +29 -28
  53. data/lib/asciidoctor/callouts.rb +4 -2
  54. data/lib/asciidoctor/cli/invoker.rb +20 -24
  55. data/lib/asciidoctor/cli/options.rb +107 -96
  56. data/lib/asciidoctor/cli.rb +3 -2
  57. data/lib/asciidoctor/convert.rb +199 -0
  58. data/lib/asciidoctor/converter/composite.rb +40 -48
  59. data/lib/asciidoctor/converter/docbook5.rb +627 -644
  60. data/lib/asciidoctor/converter/html5.rb +1053 -951
  61. data/lib/asciidoctor/converter/manpage.rb +581 -532
  62. data/lib/asciidoctor/converter/template.rb +232 -271
  63. data/lib/asciidoctor/converter.rb +370 -185
  64. data/lib/asciidoctor/core_ext/float/truncate.rb +20 -0
  65. data/lib/asciidoctor/core_ext/hash/merge.rb +8 -0
  66. data/lib/asciidoctor/core_ext/match_data/names.rb +7 -0
  67. data/lib/asciidoctor/core_ext/nil_or_empty.rb +1 -0
  68. data/lib/asciidoctor/core_ext/regexp/is_match.rb +4 -2
  69. data/lib/asciidoctor/core_ext.rb +8 -17
  70. data/lib/asciidoctor/document.rb +503 -461
  71. data/lib/asciidoctor/extensions.rb +127 -174
  72. data/lib/asciidoctor/helpers.rb +184 -107
  73. data/lib/asciidoctor/inline.rb +9 -12
  74. data/lib/asciidoctor/list.rb +11 -29
  75. data/lib/asciidoctor/load.rb +119 -0
  76. data/lib/asciidoctor/logging.rb +22 -17
  77. data/lib/asciidoctor/parser.rb +673 -719
  78. data/lib/asciidoctor/path_resolver.rb +48 -33
  79. data/lib/asciidoctor/reader.rb +383 -338
  80. data/lib/asciidoctor/rouge_ext.rb +39 -0
  81. data/lib/asciidoctor/rx.rb +723 -0
  82. data/lib/asciidoctor/section.rb +17 -16
  83. data/lib/asciidoctor/stylesheets.rb +19 -37
  84. data/lib/asciidoctor/substitutors.rb +926 -1022
  85. data/lib/asciidoctor/syntax_highlighter/coderay.rb +88 -0
  86. data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +34 -0
  87. data/lib/asciidoctor/syntax_highlighter/html_pipeline.rb +10 -0
  88. data/lib/asciidoctor/syntax_highlighter/prettify.rb +30 -0
  89. data/lib/asciidoctor/syntax_highlighter/pygments.rb +157 -0
  90. data/lib/asciidoctor/syntax_highlighter/rouge.rb +143 -0
  91. data/lib/asciidoctor/syntax_highlighter.rb +253 -0
  92. data/lib/asciidoctor/table.rb +152 -114
  93. data/lib/asciidoctor/timings.rb +7 -5
  94. data/lib/asciidoctor/version.rb +2 -1
  95. data/lib/asciidoctor/writer.rb +30 -0
  96. data/lib/asciidoctor.rb +266 -1340
  97. data/man/asciidoctor.1 +49 -47
  98. data/man/asciidoctor.adoc +54 -45
  99. metadata +50 -245
  100. data/CONTRIBUTING.adoc +0 -185
  101. data/Gemfile +0 -60
  102. data/Rakefile +0 -129
  103. data/bin/asciidoctor-safe +0 -15
  104. data/features/open_block.feature +0 -92
  105. data/features/pass_block.feature +0 -66
  106. data/features/step_definitions.rb +0 -49
  107. data/features/text_formatting.feature +0 -57
  108. data/features/xref.feature +0 -1039
  109. data/lib/asciidoctor/converter/base.rb +0 -59
  110. data/lib/asciidoctor/converter/docbook45.rb +0 -93
  111. data/lib/asciidoctor/converter/factory.rb +0 -226
  112. data/lib/asciidoctor/core_ext/1.8.7/base64/strict_encode64.rb +0 -6
  113. data/lib/asciidoctor/core_ext/1.8.7/concurrent/hash.rb +0 -5
  114. data/lib/asciidoctor/core_ext/1.8.7/hash/key.rb +0 -4
  115. data/lib/asciidoctor/core_ext/1.8.7/io/binread.rb +0 -6
  116. data/lib/asciidoctor/core_ext/1.8.7/io/write.rb +0 -5
  117. data/lib/asciidoctor/core_ext/1.8.7/string/chr.rb +0 -6
  118. data/lib/asciidoctor/core_ext/1.8.7/string/limit_bytesize.rb +0 -29
  119. data/lib/asciidoctor/core_ext/1.8.7/symbol/empty.rb +0 -6
  120. data/lib/asciidoctor/core_ext/1.8.7/symbol/length.rb +0 -6
  121. data/lib/asciidoctor/core_ext/string/limit_bytesize.rb +0 -10
  122. data/test/api_test.rb +0 -1240
  123. data/test/attribute_list_test.rb +0 -242
  124. data/test/attributes_test.rb +0 -1623
  125. data/test/blocks_test.rb +0 -3870
  126. data/test/converter_test.rb +0 -470
  127. data/test/document_test.rb +0 -1853
  128. data/test/extensions_test.rb +0 -1560
  129. data/test/fixtures/asciidoc_index.txt +0 -521
  130. data/test/fixtures/basic-docinfo-footer.html +0 -6
  131. data/test/fixtures/basic-docinfo-footer.xml +0 -8
  132. data/test/fixtures/basic-docinfo.html +0 -1
  133. data/test/fixtures/basic-docinfo.xml +0 -4
  134. data/test/fixtures/basic.asciidoc +0 -5
  135. data/test/fixtures/chapter-a.adoc +0 -3
  136. data/test/fixtures/child-include.adoc +0 -5
  137. data/test/fixtures/circle.svg +0 -9
  138. data/test/fixtures/custom-backends/erb/html5/block_paragraph.html.erb +0 -6
  139. data/test/fixtures/custom-backends/haml/docbook45/block_paragraph.xml.haml +0 -6
  140. data/test/fixtures/custom-backends/haml/html5/block_paragraph.html.haml +0 -3
  141. data/test/fixtures/custom-backends/haml/html5/block_sidebar.html.haml +0 -5
  142. data/test/fixtures/custom-backends/haml/html5-tweaks/block_paragraph.html.haml +0 -1
  143. data/test/fixtures/custom-backends/slim/docbook45/block_paragraph.xml.slim +0 -6
  144. data/test/fixtures/custom-backends/slim/html5/block_paragraph.html.slim +0 -3
  145. data/test/fixtures/custom-backends/slim/html5/block_sidebar.html.slim +0 -5
  146. data/test/fixtures/custom-docinfodir/basic-docinfo.html +0 -1
  147. data/test/fixtures/custom-docinfodir/docinfo.html +0 -1
  148. data/test/fixtures/docinfo-footer.html +0 -1
  149. data/test/fixtures/docinfo-footer.xml +0 -9
  150. data/test/fixtures/docinfo.html +0 -1
  151. data/test/fixtures/docinfo.xml +0 -3
  152. data/test/fixtures/doctime-localtime.adoc +0 -2
  153. data/test/fixtures/dot.gif +0 -0
  154. data/test/fixtures/encoding.asciidoc +0 -13
  155. data/test/fixtures/file-with-missing-include.adoc +0 -1
  156. data/test/fixtures/grandchild-include.adoc +0 -3
  157. data/test/fixtures/hello-asciidoctor.pdf +0 -69
  158. data/test/fixtures/include-file.asciidoc +0 -24
  159. data/test/fixtures/include-file.jsx +0 -8
  160. data/test/fixtures/include-file.ml +0 -3
  161. data/test/fixtures/include-file.xml +0 -5
  162. data/test/fixtures/lists.adoc +0 -96
  163. data/test/fixtures/master.adoc +0 -5
  164. data/test/fixtures/mismatched-end-tag.adoc +0 -7
  165. data/test/fixtures/other-chapters.adoc +0 -11
  166. data/test/fixtures/outer-include.adoc +0 -5
  167. data/test/fixtures/parent-include-restricted.adoc +0 -5
  168. data/test/fixtures/parent-include.adoc +0 -5
  169. data/test/fixtures/sample.asciidoc +0 -30
  170. data/test/fixtures/section-a.adoc +0 -4
  171. data/test/fixtures/stylesheets/custom.css +0 -3
  172. data/test/fixtures/subdir/index.adoc +0 -3
  173. data/test/fixtures/subdir/inner-include.adoc +0 -3
  174. data/test/fixtures/subdir/middle-include.adoc +0 -5
  175. data/test/fixtures/subs-docinfo.html +0 -2
  176. data/test/fixtures/subs.adoc +0 -6
  177. data/test/fixtures/tagged-class-enclosed.rb +0 -25
  178. data/test/fixtures/tagged-class.rb +0 -23
  179. data/test/fixtures/tip.gif +0 -0
  180. data/test/fixtures/unclosed-tag.adoc +0 -3
  181. data/test/fixtures/unexpected-end-tag.adoc +0 -4
  182. data/test/invoker_test.rb +0 -745
  183. data/test/links_test.rb +0 -855
  184. data/test/lists_test.rb +0 -5151
  185. data/test/logger_test.rb +0 -211
  186. data/test/manpage_test.rb +0 -660
  187. data/test/options_test.rb +0 -262
  188. data/test/paragraphs_test.rb +0 -562
  189. data/test/parser_test.rb +0 -742
  190. data/test/paths_test.rb +0 -395
  191. data/test/preamble_test.rb +0 -173
  192. data/test/reader_test.rb +0 -2161
  193. data/test/sections_test.rb +0 -3575
  194. data/test/substitutions_test.rb +0 -2066
  195. data/test/tables_test.rb +0 -2036
  196. data/test/test_helper.rb +0 -447
  197. data/test/text_test.rb +0 -309
data/test/paths_test.rb DELETED
@@ -1,395 +0,0 @@
1
- # encoding: UTF-8
2
- unless defined? ASCIIDOCTOR_PROJECT_DIR
3
- $: << File.dirname(__FILE__); $:.uniq!
4
- require 'test_helper'
5
- end
6
-
7
- context 'Path Resolver' do
8
- context 'Web Paths' do
9
- def setup
10
- @resolver = Asciidoctor::PathResolver.new
11
- end
12
-
13
- test 'target with absolute path' do
14
- assert_equal '/images', @resolver.web_path('/images')
15
- assert_equal '/images', @resolver.web_path('/images', '')
16
- assert_equal '/images', @resolver.web_path('/images', nil)
17
- end
18
-
19
- test 'target with relative path' do
20
- assert_equal 'images', @resolver.web_path('images')
21
- assert_equal 'images', @resolver.web_path('images', '')
22
- assert_equal 'images', @resolver.web_path('images', nil)
23
- end
24
-
25
- test 'target with hidden relative path' do
26
- assert_equal '.images', @resolver.web_path('.images')
27
- assert_equal '.images', @resolver.web_path('.images', '')
28
- assert_equal '.images', @resolver.web_path('.images', nil)
29
- end
30
-
31
- test 'target with path relative to current directory' do
32
- assert_equal './images', @resolver.web_path('./images')
33
- assert_equal './images', @resolver.web_path('./images', '')
34
- assert_equal './images', @resolver.web_path('./images', nil)
35
- end
36
-
37
- test 'target with absolute path ignores start path' do
38
- assert_equal '/images', @resolver.web_path('/images', 'foo')
39
- assert_equal '/images', @resolver.web_path('/images', '/foo')
40
- assert_equal '/images', @resolver.web_path('/images', './foo')
41
- end
42
-
43
- test 'target with relative path appended to start path' do
44
- assert_equal 'assets/images', @resolver.web_path('images', 'assets')
45
- assert_equal '/assets/images', @resolver.web_path('images', '/assets')
46
- #assert_equal '/assets/images/tiger.png', @resolver.web_path('tiger.png', '/assets//images')
47
- assert_equal './assets/images', @resolver.web_path('images', './assets')
48
- assert_equal '/theme.css', @resolver.web_path('theme.css', '/')
49
- assert_equal '/css/theme.css', @resolver.web_path('theme.css', '/css/')
50
- end
51
-
52
- test 'target with path relative to current directory appended to start path' do
53
- assert_equal 'assets/images', @resolver.web_path('./images', 'assets')
54
- assert_equal '/assets/images', @resolver.web_path('./images', '/assets')
55
- assert_equal './assets/images', @resolver.web_path('./images', './assets')
56
- end
57
-
58
- test 'target with relative path appended to url start path' do
59
- assert_equal 'http://www.example.com/assets/images', @resolver.web_path('images', 'http://www.example.com/assets')
60
- end
61
-
62
- # enable if we want to allow web_path to detect and preserve a target URI
63
- #test 'target with file url appended to relative path' do
64
- # assert_equal 'file:///home/username/styles/asciidoctor.css', @resolver.web_path('file:///home/username/styles/asciidoctor.css', '.')
65
- #end
66
-
67
- # enable if we want to allow web_path to detect and preserve a target URI
68
- #test 'target with http url appended to relative path' do
69
- # assert_equal 'http://example.com/asciidoctor.css', @resolver.web_path('http://example.com/asciidoctor.css', '.')
70
- #end
71
-
72
- test 'normalize target' do
73
- assert_equal '../images', @resolver.web_path('../images/../images')
74
- end
75
-
76
- test 'append target to start path and normalize' do
77
- assert_equal '../images', @resolver.web_path('../images/../images', '../images')
78
- assert_equal '../../images', @resolver.web_path('../images', '..')
79
- end
80
-
81
- test 'normalize parent directory that follows root' do
82
- assert_equal '/tiger.png', @resolver.web_path('/../tiger.png')
83
- assert_equal '/tiger.png', @resolver.web_path('/../../tiger.png')
84
- end
85
-
86
- test 'uses start when target is empty' do
87
- assert_equal 'assets/images', @resolver.web_path('', 'assets/images')
88
- assert_equal 'assets/images', @resolver.web_path(nil, 'assets/images')
89
- end
90
-
91
- test 'posixifies windows paths' do
92
- @resolver.file_separator = '\\'
93
- assert_equal '/images', @resolver.web_path('\\images')
94
- assert_equal '../images', @resolver.web_path('..\\images')
95
- assert_equal '/images', @resolver.web_path('\\..\\images')
96
- assert_equal 'assets/images', @resolver.web_path('assets\\images')
97
- assert_equal '../assets/images', @resolver.web_path('assets\\images', '..\\images\\..')
98
- end
99
-
100
- test 'URL encode spaces in path' do
101
- assert_equal 'assets%20and%20stuff/lots%20of%20images', @resolver.web_path('lots of images', 'assets and stuff')
102
- end
103
- end
104
-
105
- context 'System Paths' do
106
- JAIL = '/home/doctor/docs'
107
- default_logger = Asciidoctor::LoggerManager.logger
108
-
109
- def setup
110
- @resolver = Asciidoctor::PathResolver.new
111
- @logger = (Asciidoctor::LoggerManager.logger = Asciidoctor::MemoryLogger.new)
112
- end
113
-
114
- teardown do
115
- Asciidoctor::LoggerManager.logger = default_logger
116
- end
117
-
118
- test 'raises security error if jail is not an absolute path' do
119
- begin
120
- @resolver.system_path('images/tiger.png', '/etc', 'foo')
121
- flunk 'Expecting SecurityError to be raised'
122
- rescue SecurityError
123
- end
124
- end
125
-
126
- #test 'raises security error if jail is not a canoncial path' do
127
- # begin
128
- # @resolver.system_path('images/tiger.png', '/etc', %(#{JAIL}/../foo))
129
- # flunk 'Expecting SecurityError to be raised'
130
- # rescue SecurityError
131
- # end
132
- #end
133
-
134
- test 'prevents access to paths outside of jail' do
135
- result = @resolver.system_path '../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL
136
- assert_equal %(#{JAIL}/css), result
137
- assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
138
-
139
- @logger.clear
140
- result = @resolver.system_path '/../../../../../css', %(#{JAIL}/assets/stylesheets), JAIL
141
- assert_equal %(#{JAIL}/css), result
142
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
143
-
144
- @logger.clear
145
- result = @resolver.system_path '../../../css', '../../..', JAIL
146
- assert_equal %(#{JAIL}/css), result
147
- assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
148
- end
149
-
150
- test 'throws exception for illegal path access if recover is false' do
151
- begin
152
- @resolver.system_path('../../../../../css', "#{JAIL}/assets/stylesheets", JAIL, :recover => false)
153
- flunk 'Expecting SecurityError to be raised'
154
- rescue SecurityError
155
- end
156
- end
157
-
158
- test 'resolves start path if target is empty' do
159
- assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('', "#{JAIL}/assets/stylesheets", JAIL)
160
- assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path(nil, "#{JAIL}/assets/stylesheets", JAIL)
161
- end
162
-
163
- test 'expands parent references in start path if target is empty' do
164
- assert_equal "#{JAIL}/stylesheets", @resolver.system_path('', "#{JAIL}/assets/../stylesheets", JAIL)
165
- end
166
-
167
- test 'expands parent references in start path if target is not empty' do
168
- assert_equal "#{JAIL}/stylesheets/site.css", @resolver.system_path('site.css', "#{JAIL}/assets/../stylesheets", JAIL)
169
- end
170
-
171
- test 'resolves start path if target is dot' do
172
- assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('.', "#{JAIL}/assets/stylesheets", JAIL)
173
- assert_equal "#{JAIL}/assets/stylesheets", @resolver.system_path('./', "#{JAIL}/assets/stylesheets", JAIL)
174
- end
175
-
176
- test 'treats absolute target outside of jail as relative when jail is specified' do
177
- result = @resolver.system_path '/', "#{JAIL}/assets/stylesheets", JAIL
178
- assert_equal JAIL, result
179
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
180
-
181
- @logger.clear
182
- result = @resolver.system_path '/foo', "#{JAIL}/assets/stylesheets", JAIL
183
- assert_equal "#{JAIL}/foo", result
184
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
185
-
186
- @logger.clear
187
- result = @resolver.system_path '/../foo', "#{JAIL}/assets/stylesheets", JAIL
188
- assert_equal "#{JAIL}/foo", result
189
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
190
-
191
- @logger.clear
192
- @resolver.file_separator = '\\'
193
- result = @resolver.system_path 'baz.adoc', 'C:/foo', 'C:/bar'
194
- assert_equal 'C:/bar/baz.adoc', result
195
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
196
- end
197
-
198
- test 'allows use of absolute target or start if resolved path is sub-path of jail' do
199
- assert_equal "#{JAIL}/my/path", @resolver.system_path("#{JAIL}/my/path", '', JAIL)
200
- assert_equal "#{JAIL}/my/path", @resolver.system_path("#{JAIL}/my/path", nil, JAIL)
201
- assert_equal "#{JAIL}/my/path", @resolver.system_path('', "#{JAIL}/my/path", JAIL)
202
- assert_equal "#{JAIL}/my/path", @resolver.system_path(nil, "#{JAIL}/my/path", JAIL)
203
- assert_equal "#{JAIL}/my/path", @resolver.system_path('path', "#{JAIL}/my", JAIL)
204
- assert_equal '/foo/bar/baz.adoc', @resolver.system_path('/foo/bar/baz.adoc', nil, '/')
205
- assert_equal '/foo/bar/baz.adoc', @resolver.system_path('baz.adoc', '/foo/bar', '/')
206
- assert_equal '/foo/bar/baz.adoc', @resolver.system_path('baz.adoc', 'foo/bar', '/')
207
- end
208
-
209
- test 'uses jail path if start path is empty' do
210
- assert_equal "#{JAIL}/images/tiger.png", @resolver.system_path('images/tiger.png', '', JAIL)
211
- assert_equal "#{JAIL}/images/tiger.png", @resolver.system_path('images/tiger.png', nil, JAIL)
212
- end
213
-
214
- test 'warns if start is not contained within jail' do
215
- result = @resolver.system_path 'images/tiger.png', '/etc', JAIL
216
- assert_equal %(#{JAIL}/images/tiger.png), result
217
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
218
-
219
- @logger.clear
220
- result = @resolver.system_path '.', '/etc', JAIL
221
- assert_equal JAIL, result
222
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
223
-
224
- @logger.clear
225
- @resolver.file_separator = '\\'
226
- result = @resolver.system_path '.', 'C:/foo', 'C:/bar'
227
- assert_equal 'C:/bar', result
228
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
229
- end
230
-
231
- test 'allows start path to be parent of jail if resolved target is inside jail' do
232
- assert_equal "#{JAIL}/foo/path", @resolver.system_path('foo/path', JAIL, "#{JAIL}/foo")
233
- @resolver.file_separator = '\\'
234
- assert_equal "C:/dev/project/README.adoc", @resolver.system_path('project/README.adoc', 'C:/dev', 'C:/dev/project')
235
- end
236
-
237
- test 'relocates target to jail if resolved value fails outside of jail' do
238
- result = @resolver.system_path 'bar/baz.adoc', JAIL, "#{JAIL}/foo"
239
- assert_equal %(#{JAIL}/foo/bar/baz.adoc), result
240
- assert_message @logger, :WARN, 'path is outside of jail; recovering automatically'
241
-
242
- @logger.clear
243
- @resolver.file_separator = '\\'
244
- result = @resolver.system_path 'bar/baz.adoc', 'D:/', 'C:/foo'
245
- assert_equal 'C:/foo/bar/baz.adoc', result
246
- assert_message @logger, :WARN, '~outside of jail root'
247
- end
248
-
249
- test 'raises security error if start is not contained within jail and recover is disabled' do
250
- begin
251
- @resolver.system_path('images/tiger.png', '/etc', JAIL, :recover => false)
252
- flunk 'Expecting SecurityError to be raised'
253
- rescue SecurityError
254
- end
255
-
256
- begin
257
- @resolver.system_path('.', '/etc', JAIL, :recover => false)
258
- flunk 'Expecting SecurityError to be raised'
259
- rescue SecurityError
260
- end
261
- end
262
-
263
- test 'expands parent references in absolute path if jail is not specified' do
264
- assert_equal '/etc/stylesheet.css', @resolver.system_path('/usr/share/../../etc/stylesheet.css')
265
- end
266
-
267
- test 'resolves absolute directory if jail is not specified' do
268
- assert_equal '/usr/share/stylesheet.css', @resolver.system_path('/usr/share/stylesheet.css', '/home/dallen/docs/assets/stylesheets')
269
- end
270
-
271
- test 'resolves ancestor directory of start if jail is not specified' do
272
- assert_equal '/usr/share/stylesheet.css', @resolver.system_path('../../../../../usr/share/stylesheet.css', '/home/dallen/docs/assets/stylesheets')
273
- end
274
-
275
- test 'resolves absolute path if start is absolute and target is relative' do
276
- assert_equal '/usr/share/assets/stylesheet.css', @resolver.system_path('assets/stylesheet.css', '/usr/share')
277
- end
278
-
279
- test 'File.dirname preserves UNC path root on Windows' do
280
- assert_equal File.dirname('\\\\server\\docs\\file.html'), '\\\\server\\docs'
281
- end if windows?
282
-
283
- test 'File.dirname preserves posix-style UNC path root on Windows' do
284
- assert_equal File.dirname('//server/docs/file.html'), '//server/docs'
285
- end if windows?
286
-
287
- test 'resolves UNC path if start is absolute and target is relative' do
288
- assert_equal '//QA/c$/users/asciidoctor/assets/stylesheet.css', @resolver.system_path('assets/stylesheet.css', '//QA/c$/users/asciidoctor')
289
- end
290
-
291
- test 'resolves UNC path if target is UNC path' do
292
- @resolver.file_separator = '\\'
293
- assert_equal '//server/docs/output.html', @resolver.system_path('\\\\server\\docs\\output.html')
294
- end
295
-
296
- test 'resolves UNC path if target is posix-style UNC path' do
297
- assert_equal '//server/docs/output.html', @resolver.system_path('//server/docs/output.html')
298
- end
299
-
300
- test 'resolves relative target relative to current directory if start is empty' do
301
- pwd = File.expand_path(Dir.pwd)
302
- assert_equal "#{pwd}/images/tiger.png", @resolver.system_path('images/tiger.png', '')
303
- assert_equal "#{pwd}/images/tiger.png", @resolver.system_path('images/tiger.png', nil)
304
- assert_equal "#{pwd}/images/tiger.png", @resolver.system_path('images/tiger.png')
305
- end
306
-
307
- test 'resolves relative hidden target relative to current directory if start is empty' do
308
- pwd = File.expand_path(Dir.pwd)
309
- assert_equal "#{pwd}/.images/tiger.png", @resolver.system_path('.images/tiger.png', '')
310
- assert_equal "#{pwd}/.images/tiger.png", @resolver.system_path('.images/tiger.png', nil)
311
- end
312
-
313
- test 'resolves and normalizes start when target is empty' do
314
- pwd = File.expand_path Dir.pwd
315
- assert_equal '/home/doctor/docs', (@resolver.system_path '', '/home/doctor/docs')
316
- assert_equal '/home/doctor/docs', (@resolver.system_path '', '/home/doctor/./docs')
317
- assert_equal '/home/doctor/docs', (@resolver.system_path nil, '/home/doctor/docs')
318
- assert_equal '/home/doctor/docs', (@resolver.system_path nil, '/home/doctor/./docs')
319
- assert_equal %(#{pwd}/assets/images), (@resolver.system_path nil, 'assets/images')
320
- @resolver.system_path '', '../assets/images', JAIL
321
- assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
322
- end
323
-
324
- test 'posixifies windows paths' do
325
- @resolver.file_separator = '\\'
326
- assert_equal "#{JAIL}/assets/css", @resolver.system_path('..\\css', 'assets\\stylesheets', JAIL)
327
- end
328
-
329
- test 'resolves windows paths when file separator is backlash' do
330
- @resolver.file_separator = '\\'
331
-
332
- assert_equal 'C:/data/docs', (@resolver.system_path '..', 'C:\\data\\docs\\assets', 'C:\\data\\docs')
333
-
334
- result = @resolver.system_path '..\\..', 'C:\\data\\docs\\assets', 'C:\\data\\docs'
335
- assert_equal 'C:/data/docs', result
336
- assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
337
-
338
- @logger.clear
339
- result = @resolver.system_path '..\\..\\css', 'C:\\data\\docs\\assets', 'C:\\data\\docs'
340
- assert_equal 'C:/data/docs/css', result
341
- assert_message @logger, :WARN, 'path has illegal reference to ancestor of jail; recovering automatically'
342
- end
343
-
344
- test 'should calculate relative path' do
345
- filename = @resolver.system_path('part1/chapter1/section1.adoc', nil, JAIL)
346
- assert_equal "#{JAIL}/part1/chapter1/section1.adoc", filename
347
- assert_equal 'part1/chapter1/section1.adoc', @resolver.relative_path(filename, JAIL)
348
- end
349
-
350
- test 'should resolve relative path to filename outside of base directory' do
351
- filename = '/home/shared/partials'
352
- base_dir = '/home/user/docs'
353
- result = @resolver.relative_path filename, base_dir
354
- assert_equal '../../shared/partials', result
355
- end
356
-
357
- test 'should resolve relative path relative to base dir in unsafe mode' do
358
- base_dir = fixture_path 'base'
359
- doc = empty_document :base_dir => base_dir, :safe => Asciidoctor::SafeMode::UNSAFE
360
- expected = ::File.join base_dir, 'images', 'tiger.png'
361
- actual = doc.normalize_system_path 'tiger.png', 'images'
362
- assert_equal expected, actual
363
- end
364
-
365
- test 'should resolve absolute path as absolute in unsafe mode' do
366
- base_dir = fixture_path 'base'
367
- doc = empty_document :base_dir => base_dir, :safe => Asciidoctor::SafeMode::UNSAFE
368
- actual = doc.normalize_system_path 'tiger.png', '/etc/images'
369
- assert_equal '/etc/images/tiger.png', actual
370
- end
371
- end
372
-
373
- context 'Helpers' do
374
- test 'rootname should return file name without extension' do
375
- assert_equal 'master', Asciidoctor::Helpers.rootname('master.adoc')
376
- assert_equal 'docs/master', Asciidoctor::Helpers.rootname('docs/master.adoc')
377
- end
378
-
379
- test 'rootname should file name if it has no extension' do
380
- assert_equal 'master', Asciidoctor::Helpers.rootname('master')
381
- assert_equal 'docs/master', Asciidoctor::Helpers.rootname('docs/master')
382
- end
383
-
384
- test 'UriSniffRx should detect URIs' do
385
- assert Asciidoctor::UriSniffRx =~ 'http://example.com'
386
- assert Asciidoctor::UriSniffRx =~ 'https://example.com'
387
- assert Asciidoctor::UriSniffRx =~ 'data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs='
388
- end
389
-
390
- test 'UriSniffRx should not detect an absolute Windows path as a URI' do
391
- assert Asciidoctor::UriSniffRx !~ 'c:/sample.adoc'
392
- assert Asciidoctor::UriSniffRx !~ 'c:\\sample.adoc'
393
- end
394
- end
395
- end
@@ -1,173 +0,0 @@
1
- # encoding: UTF-8
2
- unless defined? ASCIIDOCTOR_PROJECT_DIR
3
- $: << File.dirname(__FILE__); $:.uniq!
4
- require 'test_helper'
5
- end
6
-
7
- context 'Preamble' do
8
-
9
- test 'title and single paragraph preamble before section' do
10
- input = <<-EOS
11
- = Title
12
-
13
- Preamble paragraph 1.
14
-
15
- == First Section
16
-
17
- Section paragraph 1.
18
- EOS
19
- result = convert_string(input)
20
- assert_xpath '//p', result, 2
21
- assert_xpath '//*[@id="preamble"]', result, 1
22
- assert_xpath '//*[@id="preamble"]//p', result, 1
23
- assert_xpath '//*[@id="preamble"]/following-sibling::*//h2[@id="_first_section"]', result, 1
24
- assert_xpath '//*[@id="preamble"]/following-sibling::*//p', result, 1
25
- end
26
-
27
- test 'title of preface is blank by default in DocBook output' do
28
- input = <<-EOS
29
- = Document Title
30
- :doctype: book
31
-
32
- Preface content.
33
-
34
- == First Section
35
-
36
- Section content.
37
- EOS
38
- result = convert_string input, :backend => :docbook
39
- assert_xpath '//preface/title', result, 1
40
- title_node = xmlnodes_at_xpath '//preface/title', result, 1
41
- assert_equal '', title_node.text
42
- end
43
-
44
- test 'preface-title attribute is assigned as title of preface in DocBook output' do
45
- input = <<-EOS
46
- = Document Title
47
- :doctype: book
48
- :preface-title: Preface
49
-
50
- Preface content.
51
-
52
- == First Section
53
-
54
- Section content.
55
- EOS
56
- result = convert_string input, :backend => :docbook
57
- assert_xpath '//preface/title[text()="Preface"]', result, 1
58
- end
59
-
60
- test 'title and multi-paragraph preamble before section' do
61
- input = <<-EOS
62
- = Title
63
-
64
- Preamble paragraph 1.
65
-
66
- Preamble paragraph 2.
67
-
68
- == First Section
69
-
70
- Section paragraph 1.
71
- EOS
72
- result = convert_string(input)
73
- assert_xpath '//p', result, 3
74
- assert_xpath '//*[@id="preamble"]', result, 1
75
- assert_xpath '//*[@id="preamble"]//p', result, 2
76
- assert_xpath '//*[@id="preamble"]/following-sibling::*//h2[@id="_first_section"]', result, 1
77
- assert_xpath '//*[@id="preamble"]/following-sibling::*//p', result, 1
78
- end
79
-
80
- test 'should not wrap content in preamble if document has title but no sections' do
81
- input = <<-EOS
82
- = Title
83
-
84
- paragraph
85
- EOS
86
- result = convert_string(input)
87
- assert_xpath '//p', result, 1
88
- assert_xpath '//*[@id="content"]/*[@class="paragraph"]/p', result, 1
89
- assert_xpath '//*[@id="content"]/*[@class="paragraph"]/following-sibling::*', result, 0
90
- end
91
-
92
- test 'title and section without preamble' do
93
- input = <<-EOS
94
- = Title
95
-
96
- == First Section
97
-
98
- Section paragraph 1.
99
- EOS
100
- result = convert_string(input)
101
- assert_xpath '//p', result, 1
102
- assert_xpath '//*[@id="preamble"]', result, 0
103
- assert_xpath '//h2[@id="_first_section"]', result, 1
104
- end
105
-
106
- test 'no title with preamble and section' do
107
- input = <<-EOS
108
- Preamble paragraph 1.
109
-
110
- == First Section
111
-
112
- Section paragraph 1.
113
- EOS
114
- result = convert_string(input)
115
- assert_xpath '//p', result, 2
116
- assert_xpath '//*[@id="preamble"]', result, 0
117
- assert_xpath '//h2[@id="_first_section"]/preceding::p', result, 1
118
- end
119
-
120
- test 'preamble in book doctype' do
121
- input = <<-EOS
122
- = Book
123
- :doctype: book
124
-
125
- Back then...
126
-
127
- = Chapter One
128
-
129
- [partintro]
130
- It was a dark and stormy night...
131
-
132
- == Scene One
133
-
134
- Someone's gonna get axed.
135
-
136
- = Chapter Two
137
-
138
- [partintro]
139
- They couldn't believe their eyes when...
140
-
141
- == Scene One
142
-
143
- The axe came swinging.
144
- EOS
145
-
146
- d = document_from_string(input)
147
- assert_equal 'book', d.doctype
148
- output = d.convert
149
- assert_xpath '//h1', output, 3
150
- assert_xpath %{//*[@id="preamble"]//p[text() = "Back then#{decode_char 8230}#{decode_char 8203}"]}, output, 1
151
- end
152
-
153
- test 'should output table of contents in preamble if toc-placement attribute value is preamble' do
154
- input = <<-EOS
155
- = Article
156
- :toc:
157
- :toc-placement: preamble
158
-
159
- Once upon a time...
160
-
161
- == Section One
162
-
163
- It was a dark and stormy night...
164
-
165
- == Section Two
166
-
167
- They couldn't believe their eyes when...
168
- EOS
169
-
170
- output = convert_string input
171
- assert_xpath '//*[@id="preamble"]/*[@id="toc"]', output, 1
172
- end
173
- end