asciidoctor 2.0.6 → 2.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +12 -0
- data/README-de.adoc +2 -2
- data/README-fr.adoc +2 -2
- data/README-jp.adoc +2 -2
- data/README-zh_CN.adoc +2 -2
- data/README.adoc +2 -2
- data/asciidoctor.gemspec +4 -4
- data/lib/asciidoctor.rb +5 -307
- data/lib/asciidoctor/cli/options.rb +5 -5
- data/lib/asciidoctor/convert.rb +193 -0
- data/lib/asciidoctor/document.rb +15 -7
- data/lib/asciidoctor/load.rb +117 -0
- data/lib/asciidoctor/substitutors.rb +1 -1
- data/lib/asciidoctor/syntax_highlighter/rouge.rb +3 -4
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +17 -17
- data/man/asciidoctor.adoc +14 -14
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 363386e5f0af985125302b3f74565b9d55758b7ed2c6861fbd26e1554ce68cf6
|
4
|
+
data.tar.gz: 50204a323636922a05b26c460ed659bdef48bc7de2a2342ac1f1c40997897d80
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8136e7b02f0cc18e4b2e3e2f906a460e895fa1f3524b5302861354f9cfba49554592ef53bbff71a92f9f08068a685462f4c5f631016065f427e8947a267548c
|
7
|
+
data.tar.gz: 778f9c5f7817a54fc4eeb863da1ee5e829e162f998ca2da2f34fd44a146973ee230201069bf65dedcfda4fd00ee4d75b429094fa612b994bfdb4b475f94940c7
|
data/CHANGELOG.adoc
CHANGED
@@ -13,6 +13,18 @@ endif::[]
|
|
13
13
|
This document provides a high-level view of the changes introduced in Asciidoctor by release.
|
14
14
|
For a detailed view of what has changed, refer to the {uri-repo}/commits/master[commit history] on GitHub.
|
15
15
|
|
16
|
+
== 2.0.7 (2019-04-13) - @mojavelinux
|
17
|
+
|
18
|
+
Bug Fixes::
|
19
|
+
|
20
|
+
* fix crash when resolving ID from text and at least one candidate contains an unresolved xref (#3254)
|
21
|
+
* fix compatibility with Rouge 2.0
|
22
|
+
|
23
|
+
Improvements::
|
24
|
+
|
25
|
+
* improve documentation for the `-a` CLI option; explain that `@` modifier can be placed at end of name as alternative to end of value
|
26
|
+
* move source for main API entry points (load, load_file, convert, convert_file) to separate files
|
27
|
+
|
16
28
|
== 2.0.6 (2019-04-04) - @mojavelinux
|
17
29
|
|
18
30
|
Bug Fixes::
|
data/README-de.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Asciidoctor
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>; Ryan Waldron <https://github.com/erebor[@erebor]>
|
3
|
-
v2.0.
|
3
|
+
v2.0.7, 2019-04-13
|
4
4
|
// settings:
|
5
5
|
:idprefix:
|
6
6
|
:idseparator: -
|
@@ -17,7 +17,7 @@ ifdef::env-github[]
|
|
17
17
|
:warning-caption: :warning:
|
18
18
|
endif::[]
|
19
19
|
// Variables:
|
20
|
-
:release-version: 2.0.
|
20
|
+
:release-version: 2.0.7
|
21
21
|
// URIs:
|
22
22
|
:uri-org: https://github.com/asciidoctor
|
23
23
|
:uri-repo: {uri-org}/asciidoctor
|
data/README-fr.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Asciidoctor
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>; Ryan Waldron <https://github.com/erebor[@erebor]>
|
3
|
-
v2.0.
|
3
|
+
v2.0.7, 2019-04-13
|
4
4
|
// settings:
|
5
5
|
:idprefix:
|
6
6
|
:idseparator: -
|
@@ -17,7 +17,7 @@ ifdef::env-github[]
|
|
17
17
|
:warning-caption: :warning:
|
18
18
|
endif::[]
|
19
19
|
// Variables:
|
20
|
-
:release-version: 2.0.
|
20
|
+
:release-version: 2.0.7
|
21
21
|
// URIs:
|
22
22
|
:uri-org: https://github.com/asciidoctor
|
23
23
|
:uri-repo: {uri-org}/asciidoctor
|
data/README-jp.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Asciidoctor
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>; Ryan Waldron <https://github.com/erebor[@erebor]>
|
3
|
-
v2.0.
|
3
|
+
v2.0.7, 2019-04-13
|
4
4
|
// settings:
|
5
5
|
:page-layout: base
|
6
6
|
:idprefix:
|
@@ -18,7 +18,7 @@ ifdef::env-github[]
|
|
18
18
|
:warning-caption: :warning:
|
19
19
|
endif::[]
|
20
20
|
// Variables:
|
21
|
-
:release-version: 2.0.
|
21
|
+
:release-version: 2.0.7
|
22
22
|
// URIs:
|
23
23
|
:uri-org: https://github.com/asciidoctor
|
24
24
|
:uri-repo: {uri-org}/asciidoctor
|
data/README-zh_CN.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Asciidoctor
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>; Ryan Waldron <https://github.com/erebor[@erebor]>
|
3
|
-
v2.0.
|
3
|
+
v2.0.7, 2019-04-13
|
4
4
|
// settings:
|
5
5
|
:page-layout: base
|
6
6
|
:idprefix:
|
@@ -18,7 +18,7 @@ ifdef::env-github[]
|
|
18
18
|
:warning-caption: :warning:
|
19
19
|
endif::[]
|
20
20
|
// Variables:
|
21
|
-
:release-version: 2.0.
|
21
|
+
:release-version: 2.0.7
|
22
22
|
// URIs:
|
23
23
|
:uri-org: https://github.com/asciidoctor
|
24
24
|
:uri-repo: {uri-org}/asciidoctor
|
data/README.adoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Asciidoctor
|
2
2
|
Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White <https://github.com/graphitefriction[@graphitefriction]>; Ryan Waldron <https://github.com/erebor[@erebor]>
|
3
|
-
v2.0.
|
3
|
+
v2.0.7, 2019-04-13
|
4
4
|
// settings:
|
5
5
|
:idprefix:
|
6
6
|
:idseparator: -
|
@@ -17,7 +17,7 @@ ifdef::env-github[]
|
|
17
17
|
:warning-caption: :warning:
|
18
18
|
endif::[]
|
19
19
|
// Variables:
|
20
|
-
:release-version: 2.0.
|
20
|
+
:release-version: 2.0.7
|
21
21
|
// URIs:
|
22
22
|
:uri-org: https://github.com/asciidoctor
|
23
23
|
:uri-repo: {uri-org}/asciidoctor
|
data/asciidoctor.gemspec
CHANGED
@@ -23,15 +23,15 @@ Gem::Specification.new do |s|
|
|
23
23
|
}
|
24
24
|
|
25
25
|
# NOTE the logic to build the list of files is designed to produce a usable package even when the git command is not available
|
26
|
-
|
27
|
-
(result = `git ls-files -z`.split ?\0).empty? ? Dir['**/*'] : result
|
26
|
+
begin
|
27
|
+
files = (result = `git ls-files -z`.split ?\0).empty? ? Dir['**/*'] : result
|
28
28
|
rescue
|
29
|
-
Dir['**/*']
|
29
|
+
files = Dir['**/*']
|
30
30
|
end
|
31
31
|
s.files = files.grep %r/^(?:(?:data|lib|man)\/.+|LICENSE|(?:CHANGELOG|README(?:-\w+)?)\.adoc|\.yardopts|#{s.name}\.gemspec)$/
|
32
32
|
s.executables = (files.grep %r/^bin\//).map {|f| File.basename f }
|
33
33
|
s.require_paths = ['lib']
|
34
|
-
#s.test_files = files.grep %r/^(?:
|
34
|
+
#s.test_files = files.grep %r/^(?:features|test)\/.+$/
|
35
35
|
|
36
36
|
# asciimath is needed for testing AsciiMath in DocBook backend
|
37
37
|
s.add_development_dependency 'asciimath', '~> 1.0.0'
|
data/lib/asciidoctor.rb
CHANGED
@@ -1220,310 +1220,6 @@ module Asciidoctor
|
|
1220
1220
|
[/\\?(&)amp;((?:[a-zA-Z][a-zA-Z]+\d{0,2}|#\d\d\d{0,4}|#x[\da-fA-F][\da-fA-F][\da-fA-F]{0,3});)/, '', :bounding]
|
1221
1221
|
]
|
1222
1222
|
|
1223
|
-
class << self
|
1224
|
-
|
1225
|
-
# Public: Parse the AsciiDoc source input into a {Document}
|
1226
|
-
#
|
1227
|
-
# Accepts input as an IO (or StringIO), String or String Array object. If the
|
1228
|
-
# input is a File, the object is expected to be opened for reading and is not
|
1229
|
-
# closed afterwards by this method. Information about the file (filename,
|
1230
|
-
# directory name, etc) gets assigned to attributes on the Document object.
|
1231
|
-
#
|
1232
|
-
# input - the AsciiDoc source as a IO, String or Array.
|
1233
|
-
# options - a String, Array or Hash of options to control processing (default: {})
|
1234
|
-
# String and Array values are converted into a Hash.
|
1235
|
-
# See {Document#initialize} for details about these options.
|
1236
|
-
#
|
1237
|
-
# Returns the Document
|
1238
|
-
def load input, options = {}
|
1239
|
-
options = options.merge
|
1240
|
-
|
1241
|
-
if (timings = options[:timings])
|
1242
|
-
timings.start :read
|
1243
|
-
end
|
1244
|
-
|
1245
|
-
if (logger = options[:logger]) && logger != LoggerManager.logger
|
1246
|
-
LoggerManager.logger = logger
|
1247
|
-
end
|
1248
|
-
|
1249
|
-
if !(attrs = options[:attributes])
|
1250
|
-
attrs = {}
|
1251
|
-
elsif ::Hash === attrs
|
1252
|
-
attrs = attrs.merge
|
1253
|
-
elsif (defined? ::Java::JavaUtil::Map) && ::Java::JavaUtil::Map === attrs
|
1254
|
-
attrs = attrs.dup
|
1255
|
-
elsif ::Array === attrs
|
1256
|
-
attrs = {}.tap do |accum|
|
1257
|
-
attrs.each do |entry|
|
1258
|
-
k, _, v = entry.partition '='
|
1259
|
-
accum[k] = v
|
1260
|
-
end
|
1261
|
-
end
|
1262
|
-
elsif ::String === attrs
|
1263
|
-
# condense and convert non-escaped spaces to null, unescape escaped spaces, then split on null
|
1264
|
-
attrs = {}.tap do |accum|
|
1265
|
-
attrs.gsub(SpaceDelimiterRx, '\1' + NULL).gsub(EscapedSpaceRx, '\1').split(NULL).each do |entry|
|
1266
|
-
k, _, v = entry.partition '='
|
1267
|
-
accum[k] = v
|
1268
|
-
end
|
1269
|
-
end
|
1270
|
-
elsif (attrs.respond_to? :keys) && (attrs.respond_to? :[])
|
1271
|
-
# coerce attrs to a real Hash
|
1272
|
-
attrs = {}.tap {|accum| attrs.keys.each {|k| accum[k] = attrs[k] } }
|
1273
|
-
else
|
1274
|
-
raise ::ArgumentError, %(illegal type for attributes option: #{attrs.class.ancestors.join ' < '})
|
1275
|
-
end
|
1276
|
-
|
1277
|
-
if ::File === input
|
1278
|
-
options[:input_mtime] = input.mtime
|
1279
|
-
# NOTE defer setting infile and indir until we get a better sense of their purpose
|
1280
|
-
# TODO cli checks if input path can be read and is file, but might want to add check to API too
|
1281
|
-
attrs['docfile'] = input_path = ::File.absolute_path input.path
|
1282
|
-
attrs['docdir'] = ::File.dirname input_path
|
1283
|
-
attrs['docname'] = Helpers.basename input_path, (attrs['docfilesuffix'] = Helpers.extname input_path)
|
1284
|
-
source = input.read
|
1285
|
-
elsif input.respond_to? :read
|
1286
|
-
# NOTE tty, pipes & sockets can't be rewound, but can't be sniffed easily either
|
1287
|
-
# just fail the rewind operation silently to handle all cases
|
1288
|
-
input.rewind rescue nil
|
1289
|
-
source = input.read
|
1290
|
-
elsif ::String === input
|
1291
|
-
source = input
|
1292
|
-
elsif ::Array === input
|
1293
|
-
source = input.drop 0
|
1294
|
-
elsif input
|
1295
|
-
raise ::ArgumentError, %(unsupported input type: #{input.class})
|
1296
|
-
end
|
1297
|
-
|
1298
|
-
if timings
|
1299
|
-
timings.record :read
|
1300
|
-
timings.start :parse
|
1301
|
-
end
|
1302
|
-
|
1303
|
-
options[:attributes] = attrs
|
1304
|
-
doc = options[:parse] == false ? (Document.new source, options) : (Document.new source, options).parse
|
1305
|
-
|
1306
|
-
timings.record :parse if timings
|
1307
|
-
doc
|
1308
|
-
rescue => ex
|
1309
|
-
begin
|
1310
|
-
context = %(asciidoctor: FAILED: #{attrs['docfile'] || '<stdin>'}: Failed to load AsciiDoc document)
|
1311
|
-
if ex.respond_to? :exception
|
1312
|
-
# The original message must be explicitly preserved when wrapping a Ruby exception
|
1313
|
-
wrapped_ex = ex.exception %(#{context} - #{ex.message})
|
1314
|
-
# JRuby automatically sets backtrace; MRI did not until 2.6
|
1315
|
-
wrapped_ex.set_backtrace ex.backtrace
|
1316
|
-
else
|
1317
|
-
# Likely a Java exception class
|
1318
|
-
wrapped_ex = ex.class.new context, ex
|
1319
|
-
wrapped_ex.stack_trace = ex.stack_trace
|
1320
|
-
end
|
1321
|
-
rescue
|
1322
|
-
wrapped_ex = ex
|
1323
|
-
end
|
1324
|
-
raise wrapped_ex
|
1325
|
-
end
|
1326
|
-
|
1327
|
-
# Public: Parse the contents of the AsciiDoc source file into an Asciidoctor::Document
|
1328
|
-
#
|
1329
|
-
# input - the String AsciiDoc source filename
|
1330
|
-
# options - a String, Array or Hash of options to control processing (default: {})
|
1331
|
-
# String and Array values are converted into a Hash.
|
1332
|
-
# See Asciidoctor::Document#initialize for details about options.
|
1333
|
-
#
|
1334
|
-
# Returns the Asciidoctor::Document
|
1335
|
-
def load_file filename, options = {}
|
1336
|
-
::File.open(filename, FILE_READ_MODE) {|file| self.load file, options }
|
1337
|
-
end
|
1338
|
-
|
1339
|
-
# Public: Parse the AsciiDoc source input into an Asciidoctor::Document and
|
1340
|
-
# convert it to the specified backend format.
|
1341
|
-
#
|
1342
|
-
# Accepts input as an IO (or StringIO), String or String Array object. If the
|
1343
|
-
# input is a File, the object is expected to be opened for reading and is not
|
1344
|
-
# closed afterwards by this method. Information about the file (filename,
|
1345
|
-
# directory name, etc) gets assigned to attributes on the Document object.
|
1346
|
-
#
|
1347
|
-
# If the :to_file option is true, and the input is a File, the output is
|
1348
|
-
# written to a file adjacent to the input file, having an extension that
|
1349
|
-
# corresponds to the backend format. Otherwise, if the :to_file option is
|
1350
|
-
# specified, the file is written to that file. If :to_file is not an absolute
|
1351
|
-
# path, it is resolved relative to :to_dir, if given, otherwise the
|
1352
|
-
# Document#base_dir. If the target directory does not exist, it will not be
|
1353
|
-
# created unless the :mkdirs option is set to true. If the file cannot be
|
1354
|
-
# written because the target directory does not exist, or because it falls
|
1355
|
-
# outside of the Document#base_dir in safe mode, an IOError is raised.
|
1356
|
-
#
|
1357
|
-
# If the output is going to be written to a file, the header and footer are
|
1358
|
-
# included unless specified otherwise (writing to a file implies creating a
|
1359
|
-
# standalone document). Otherwise, the header and footer are not included by
|
1360
|
-
# default and the converted result is returned.
|
1361
|
-
#
|
1362
|
-
# input - the String AsciiDoc source filename
|
1363
|
-
# options - a String, Array or Hash of options to control processing (default: {})
|
1364
|
-
# String and Array values are converted into a Hash.
|
1365
|
-
# See Asciidoctor::Document#initialize for details about options.
|
1366
|
-
#
|
1367
|
-
# Returns the Document object if the converted String is written to a
|
1368
|
-
# file, otherwise the converted String
|
1369
|
-
def convert input, options = {}
|
1370
|
-
(options = options.merge).delete :parse
|
1371
|
-
to_dir = options.delete :to_dir
|
1372
|
-
mkdirs = options.delete :mkdirs
|
1373
|
-
|
1374
|
-
case (to_file = options.delete :to_file)
|
1375
|
-
when true, nil
|
1376
|
-
unless (write_to_target = to_dir)
|
1377
|
-
sibling_path = ::File.absolute_path input.path if ::File === input
|
1378
|
-
end
|
1379
|
-
to_file = nil
|
1380
|
-
when false
|
1381
|
-
to_file = nil
|
1382
|
-
when '/dev/null'
|
1383
|
-
return self.load input, options
|
1384
|
-
else
|
1385
|
-
options[:to_file] = write_to_target = to_file unless (stream_output = to_file.respond_to? :write)
|
1386
|
-
end
|
1387
|
-
|
1388
|
-
unless options.key? :standalone
|
1389
|
-
if sibling_path || write_to_target
|
1390
|
-
options[:standalone] = true
|
1391
|
-
elsif options.key? :header_footer
|
1392
|
-
options[:standalone] = options[:header_footer]
|
1393
|
-
end
|
1394
|
-
end
|
1395
|
-
|
1396
|
-
# NOTE outfile may be controlled by document attributes, so resolve outfile after loading
|
1397
|
-
if sibling_path
|
1398
|
-
options[:to_dir] = outdir = ::File.dirname sibling_path
|
1399
|
-
elsif write_to_target
|
1400
|
-
if to_dir
|
1401
|
-
if to_file
|
1402
|
-
options[:to_dir] = ::File.dirname ::File.expand_path ::File.join to_dir, to_file
|
1403
|
-
else
|
1404
|
-
options[:to_dir] = ::File.expand_path to_dir
|
1405
|
-
end
|
1406
|
-
elsif to_file
|
1407
|
-
options[:to_dir] = ::File.dirname ::File.expand_path to_file
|
1408
|
-
end
|
1409
|
-
end
|
1410
|
-
|
1411
|
-
# NOTE :to_dir is always set when outputting to a file
|
1412
|
-
# NOTE :to_file option only passed if assigned an explicit path
|
1413
|
-
doc = self.load input, options
|
1414
|
-
|
1415
|
-
if sibling_path # write to file in same directory
|
1416
|
-
outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
|
1417
|
-
raise ::IOError, %(input file and output file cannot be the same: #{outfile}) if outfile == sibling_path
|
1418
|
-
elsif write_to_target # write to explicit file or directory
|
1419
|
-
working_dir = (options.key? :base_dir) ? (::File.expand_path options[:base_dir]) : ::Dir.pwd
|
1420
|
-
# QUESTION should the jail be the working_dir or doc.base_dir???
|
1421
|
-
jail = doc.safe >= SafeMode::SAFE ? working_dir : nil
|
1422
|
-
if to_dir
|
1423
|
-
outdir = doc.normalize_system_path(to_dir, working_dir, jail, target_name: 'to_dir', recover: false)
|
1424
|
-
if to_file
|
1425
|
-
outfile = doc.normalize_system_path(to_file, outdir, nil, target_name: 'to_dir', recover: false)
|
1426
|
-
# reestablish outdir as the final target directory (in the case to_file had directory segments)
|
1427
|
-
outdir = ::File.dirname outfile
|
1428
|
-
else
|
1429
|
-
outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
|
1430
|
-
end
|
1431
|
-
elsif to_file
|
1432
|
-
outfile = doc.normalize_system_path(to_file, working_dir, jail, target_name: 'to_dir', recover: false)
|
1433
|
-
# establish outdir as the final target directory (in the case to_file had directory segments)
|
1434
|
-
outdir = ::File.dirname outfile
|
1435
|
-
end
|
1436
|
-
|
1437
|
-
if ::File === input && outfile == (::File.absolute_path input.path)
|
1438
|
-
raise ::IOError, %(input file and output file cannot be the same: #{outfile})
|
1439
|
-
end
|
1440
|
-
|
1441
|
-
if mkdirs
|
1442
|
-
Helpers.mkdir_p outdir
|
1443
|
-
else
|
1444
|
-
# NOTE we intentionally refer to the directory as it was passed to the API
|
1445
|
-
raise ::IOError, %(target directory does not exist: #{to_dir} (hint: set :mkdirs option)) unless ::File.directory? outdir
|
1446
|
-
end
|
1447
|
-
else # write to stream
|
1448
|
-
outfile = to_file
|
1449
|
-
outdir = nil
|
1450
|
-
end
|
1451
|
-
|
1452
|
-
if outfile && !stream_output
|
1453
|
-
output = doc.convert 'outfile' => outfile, 'outdir' => outdir
|
1454
|
-
else
|
1455
|
-
output = doc.convert
|
1456
|
-
end
|
1457
|
-
|
1458
|
-
if outfile
|
1459
|
-
doc.write output, outfile
|
1460
|
-
|
1461
|
-
# NOTE document cannot control this behavior if safe >= SafeMode::SERVER
|
1462
|
-
# NOTE skip if stylesdir is a URI
|
1463
|
-
if !stream_output && doc.safe < SafeMode::SECURE && (doc.attr? 'linkcss') && (doc.attr? 'copycss') &&
|
1464
|
-
(doc.basebackend? 'html') && !((stylesdir = (doc.attr 'stylesdir')) && (Helpers.uriish? stylesdir))
|
1465
|
-
if (stylesheet = doc.attr 'stylesheet')
|
1466
|
-
if DEFAULT_STYLESHEET_KEYS.include? stylesheet
|
1467
|
-
copy_asciidoctor_stylesheet = true
|
1468
|
-
elsif !(Helpers.uriish? stylesheet)
|
1469
|
-
copy_user_stylesheet = true
|
1470
|
-
end
|
1471
|
-
end
|
1472
|
-
copy_syntax_hl_stylesheet = (syntax_hl = doc.syntax_highlighter) && (syntax_hl.write_stylesheet? doc)
|
1473
|
-
if copy_asciidoctor_stylesheet || copy_user_stylesheet || copy_syntax_hl_stylesheet
|
1474
|
-
stylesoutdir = doc.normalize_system_path(stylesdir, outdir, doc.safe >= SafeMode::SAFE ? outdir : nil)
|
1475
|
-
if mkdirs
|
1476
|
-
Helpers.mkdir_p stylesoutdir
|
1477
|
-
else
|
1478
|
-
raise ::IOError, %(target stylesheet directory does not exist: #{stylesoutdir} (hint: set :mkdirs option)) unless ::File.directory? stylesoutdir
|
1479
|
-
end
|
1480
|
-
|
1481
|
-
if copy_asciidoctor_stylesheet
|
1482
|
-
Stylesheets.instance.write_primary_stylesheet stylesoutdir
|
1483
|
-
# FIXME should Stylesheets also handle the user stylesheet?
|
1484
|
-
elsif copy_user_stylesheet
|
1485
|
-
if (stylesheet_src = doc.attr 'copycss').empty?
|
1486
|
-
stylesheet_src = doc.normalize_system_path stylesheet
|
1487
|
-
else
|
1488
|
-
# NOTE in this case, copycss is a source location (but cannot be a URI)
|
1489
|
-
stylesheet_src = doc.normalize_system_path stylesheet_src
|
1490
|
-
end
|
1491
|
-
stylesheet_dest = doc.normalize_system_path stylesheet, stylesoutdir, (doc.safe >= SafeMode::SAFE ? outdir : nil)
|
1492
|
-
# NOTE don't warn if src can't be read and dest already exists (see #2323)
|
1493
|
-
if stylesheet_src != stylesheet_dest && (stylesheet_data = doc.read_asset stylesheet_src,
|
1494
|
-
warn_on_failure: !(::File.file? stylesheet_dest), label: 'stylesheet')
|
1495
|
-
::File.write stylesheet_dest, stylesheet_data, mode: FILE_WRITE_MODE
|
1496
|
-
end
|
1497
|
-
end
|
1498
|
-
syntax_hl.write_stylesheet doc, stylesoutdir if copy_syntax_hl_stylesheet
|
1499
|
-
end
|
1500
|
-
end
|
1501
|
-
doc
|
1502
|
-
else
|
1503
|
-
output
|
1504
|
-
end
|
1505
|
-
end
|
1506
|
-
|
1507
|
-
# Deprecated: Use {Asciidoctor.convert} instead.
|
1508
|
-
alias render convert
|
1509
|
-
|
1510
|
-
# Public: Parse the contents of the AsciiDoc source file into an
|
1511
|
-
# Asciidoctor::Document and convert it to the specified backend format.
|
1512
|
-
#
|
1513
|
-
# input - the String AsciiDoc source filename
|
1514
|
-
# options - a String, Array or Hash of options to control processing (default: {})
|
1515
|
-
# String and Array values are converted into a Hash.
|
1516
|
-
# See Asciidoctor::Document#initialize for details about options.
|
1517
|
-
#
|
1518
|
-
# Returns the Document object if the converted String is written to a
|
1519
|
-
# file, otherwise the converted String
|
1520
|
-
def convert_file filename, options = {}
|
1521
|
-
::File.open(filename, FILE_READ_MODE) {|file| self.convert file, options }
|
1522
|
-
end
|
1523
|
-
|
1524
|
-
# Deprecated: Use {Asciidoctor.convert_file} instead.
|
1525
|
-
alias render_file convert_file
|
1526
|
-
|
1527
1223
|
# Internal: Automatically load the Asciidoctor::Extensions module.
|
1528
1224
|
#
|
1529
1225
|
# Requires the Asciidoctor::Extensions module if the name is :Extensions.
|
@@ -1534,7 +1230,7 @@ module Asciidoctor
|
|
1534
1230
|
# defined prior to it being loaded.
|
1535
1231
|
#
|
1536
1232
|
# Returns the resolved constant, if resolved, otherwise nothing.
|
1537
|
-
def const_missing name
|
1233
|
+
def self.const_missing name
|
1538
1234
|
if name == :Extensions
|
1539
1235
|
require_relative 'asciidoctor/extensions'
|
1540
1236
|
Extensions
|
@@ -1543,8 +1239,6 @@ module Asciidoctor
|
|
1543
1239
|
end
|
1544
1240
|
end unless RUBY_ENGINE == 'opal'
|
1545
1241
|
|
1546
|
-
end
|
1547
|
-
|
1548
1242
|
unless RUBY_ENGINE == 'opal'
|
1549
1243
|
autoload :SyntaxHighlighter, %(#{LIB_DIR}/asciidoctor/syntax_highlighter)
|
1550
1244
|
autoload :Timings, %(#{LIB_DIR}/asciidoctor/timings)
|
@@ -1580,6 +1274,10 @@ require_relative 'asciidoctor/stylesheets'
|
|
1580
1274
|
require_relative 'asciidoctor/table'
|
1581
1275
|
require_relative 'asciidoctor/writer'
|
1582
1276
|
|
1277
|
+
# main API entry points
|
1278
|
+
require_relative 'asciidoctor/load'
|
1279
|
+
require_relative 'asciidoctor/convert'
|
1280
|
+
|
1583
1281
|
if RUBY_ENGINE == 'opal'
|
1584
1282
|
require_relative 'asciidoctor/syntax_highlighter'
|
1585
1283
|
require_relative 'asciidoctor/timings'
|
@@ -80,13 +80,13 @@ module Asciidoctor
|
|
80
80
|
'specify eRuby implementation to use when rendering custom ERB templates: [erb, erubis] (default: erb)') do |eruby|
|
81
81
|
self[:eruby] = eruby
|
82
82
|
end
|
83
|
-
opts.on('-a', '--attribute
|
84
|
-
'
|
85
|
-
'
|
83
|
+
opts.on('-a', '--attribute name[=value]', 'a document attribute to set in the form of name, name!, or name=value pair',
|
84
|
+
'this attribute takes precedence over the same attribute defined in the source document',
|
85
|
+
'unless either the name or value ends in @ (i.e., name@=value or name=value@)') do |attr|
|
86
86
|
next if (attr = attr.rstrip).empty? || attr == '='
|
87
87
|
attr = attr.encode UTF_8 unless attr.encoding == UTF_8
|
88
|
-
|
89
|
-
self[:attributes][
|
88
|
+
name, _, val = attr.partition '='
|
89
|
+
self[:attributes][name] = val
|
90
90
|
end
|
91
91
|
opts.on('-T', '--template-dir DIR', 'a directory containing custom converter templates that override the built-in converter (requires tilt gem)',
|
92
92
|
'may be specified multiple times') do |template_dir|
|
@@ -0,0 +1,193 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module_function
|
3
|
+
|
4
|
+
# Public: Parse the AsciiDoc source input into an Asciidoctor::Document and
|
5
|
+
# convert it to the specified backend format.
|
6
|
+
#
|
7
|
+
# Accepts input as an IO (or StringIO), String or String Array object. If the
|
8
|
+
# input is a File, the object is expected to be opened for reading and is not
|
9
|
+
# closed afterwards by this method. Information about the file (filename,
|
10
|
+
# directory name, etc) gets assigned to attributes on the Document object.
|
11
|
+
#
|
12
|
+
# If the :to_file option is true, and the input is a File, the output is
|
13
|
+
# written to a file adjacent to the input file, having an extension that
|
14
|
+
# corresponds to the backend format. Otherwise, if the :to_file option is
|
15
|
+
# specified, the file is written to that file. If :to_file is not an absolute
|
16
|
+
# path, it is resolved relative to :to_dir, if given, otherwise the
|
17
|
+
# Document#base_dir. If the target directory does not exist, it will not be
|
18
|
+
# created unless the :mkdirs option is set to true. If the file cannot be
|
19
|
+
# written because the target directory does not exist, or because it falls
|
20
|
+
# outside of the Document#base_dir in safe mode, an IOError is raised.
|
21
|
+
#
|
22
|
+
# If the output is going to be written to a file, the header and footer are
|
23
|
+
# included unless specified otherwise (writing to a file implies creating a
|
24
|
+
# standalone document). Otherwise, the header and footer are not included by
|
25
|
+
# default and the converted result is returned.
|
26
|
+
#
|
27
|
+
# input - the String AsciiDoc source filename
|
28
|
+
# options - a String, Array or Hash of options to control processing (default: {})
|
29
|
+
# String and Array values are converted into a Hash.
|
30
|
+
# See Asciidoctor::Document#initialize for details about options.
|
31
|
+
#
|
32
|
+
# Returns the Document object if the converted String is written to a
|
33
|
+
# file, otherwise the converted String
|
34
|
+
def convert input, options = {}
|
35
|
+
(options = options.merge).delete :parse
|
36
|
+
to_dir = options.delete :to_dir
|
37
|
+
mkdirs = options.delete :mkdirs
|
38
|
+
|
39
|
+
case (to_file = options.delete :to_file)
|
40
|
+
when true, nil
|
41
|
+
unless (write_to_target = to_dir)
|
42
|
+
sibling_path = ::File.absolute_path input.path if ::File === input
|
43
|
+
end
|
44
|
+
to_file = nil
|
45
|
+
when false
|
46
|
+
to_file = nil
|
47
|
+
when '/dev/null'
|
48
|
+
return load input, options
|
49
|
+
else
|
50
|
+
options[:to_file] = write_to_target = to_file unless (stream_output = to_file.respond_to? :write)
|
51
|
+
end
|
52
|
+
|
53
|
+
unless options.key? :standalone
|
54
|
+
if sibling_path || write_to_target
|
55
|
+
options[:standalone] = true
|
56
|
+
elsif options.key? :header_footer
|
57
|
+
options[:standalone] = options[:header_footer]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# NOTE outfile may be controlled by document attributes, so resolve outfile after loading
|
62
|
+
if sibling_path
|
63
|
+
options[:to_dir] = outdir = ::File.dirname sibling_path
|
64
|
+
elsif write_to_target
|
65
|
+
if to_dir
|
66
|
+
if to_file
|
67
|
+
options[:to_dir] = ::File.dirname ::File.expand_path ::File.join to_dir, to_file
|
68
|
+
else
|
69
|
+
options[:to_dir] = ::File.expand_path to_dir
|
70
|
+
end
|
71
|
+
elsif to_file
|
72
|
+
options[:to_dir] = ::File.dirname ::File.expand_path to_file
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# NOTE :to_dir is always set when outputting to a file
|
77
|
+
# NOTE :to_file option only passed if assigned an explicit path
|
78
|
+
doc = load input, options
|
79
|
+
|
80
|
+
if sibling_path # write to file in same directory
|
81
|
+
outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
|
82
|
+
raise ::IOError, %(input file and output file cannot be the same: #{outfile}) if outfile == sibling_path
|
83
|
+
elsif write_to_target # write to explicit file or directory
|
84
|
+
working_dir = (options.key? :base_dir) ? (::File.expand_path options[:base_dir]) : ::Dir.pwd
|
85
|
+
# QUESTION should the jail be the working_dir or doc.base_dir???
|
86
|
+
jail = doc.safe >= SafeMode::SAFE ? working_dir : nil
|
87
|
+
if to_dir
|
88
|
+
outdir = doc.normalize_system_path(to_dir, working_dir, jail, target_name: 'to_dir', recover: false)
|
89
|
+
if to_file
|
90
|
+
outfile = doc.normalize_system_path(to_file, outdir, nil, target_name: 'to_dir', recover: false)
|
91
|
+
# reestablish outdir as the final target directory (in the case to_file had directory segments)
|
92
|
+
outdir = ::File.dirname outfile
|
93
|
+
else
|
94
|
+
outfile = ::File.join outdir, %(#{doc.attributes['docname']}#{doc.outfilesuffix})
|
95
|
+
end
|
96
|
+
elsif to_file
|
97
|
+
outfile = doc.normalize_system_path(to_file, working_dir, jail, target_name: 'to_dir', recover: false)
|
98
|
+
# establish outdir as the final target directory (in the case to_file had directory segments)
|
99
|
+
outdir = ::File.dirname outfile
|
100
|
+
end
|
101
|
+
|
102
|
+
if ::File === input && outfile == (::File.absolute_path input.path)
|
103
|
+
raise ::IOError, %(input file and output file cannot be the same: #{outfile})
|
104
|
+
end
|
105
|
+
|
106
|
+
if mkdirs
|
107
|
+
Helpers.mkdir_p outdir
|
108
|
+
else
|
109
|
+
# NOTE we intentionally refer to the directory as it was passed to the API
|
110
|
+
raise ::IOError, %(target directory does not exist: #{to_dir} (hint: set :mkdirs option)) unless ::File.directory? outdir
|
111
|
+
end
|
112
|
+
else # write to stream
|
113
|
+
outfile = to_file
|
114
|
+
outdir = nil
|
115
|
+
end
|
116
|
+
|
117
|
+
if outfile && !stream_output
|
118
|
+
output = doc.convert 'outfile' => outfile, 'outdir' => outdir
|
119
|
+
else
|
120
|
+
output = doc.convert
|
121
|
+
end
|
122
|
+
|
123
|
+
if outfile
|
124
|
+
doc.write output, outfile
|
125
|
+
|
126
|
+
# NOTE document cannot control this behavior if safe >= SafeMode::SERVER
|
127
|
+
# NOTE skip if stylesdir is a URI
|
128
|
+
if !stream_output && doc.safe < SafeMode::SECURE && (doc.attr? 'linkcss') && (doc.attr? 'copycss') &&
|
129
|
+
(doc.basebackend? 'html') && !((stylesdir = (doc.attr 'stylesdir')) && (Helpers.uriish? stylesdir))
|
130
|
+
if (stylesheet = doc.attr 'stylesheet')
|
131
|
+
if DEFAULT_STYLESHEET_KEYS.include? stylesheet
|
132
|
+
copy_asciidoctor_stylesheet = true
|
133
|
+
elsif !(Helpers.uriish? stylesheet)
|
134
|
+
copy_user_stylesheet = true
|
135
|
+
end
|
136
|
+
end
|
137
|
+
copy_syntax_hl_stylesheet = (syntax_hl = doc.syntax_highlighter) && (syntax_hl.write_stylesheet? doc)
|
138
|
+
if copy_asciidoctor_stylesheet || copy_user_stylesheet || copy_syntax_hl_stylesheet
|
139
|
+
stylesoutdir = doc.normalize_system_path(stylesdir, outdir, doc.safe >= SafeMode::SAFE ? outdir : nil)
|
140
|
+
if mkdirs
|
141
|
+
Helpers.mkdir_p stylesoutdir
|
142
|
+
else
|
143
|
+
raise ::IOError, %(target stylesheet directory does not exist: #{stylesoutdir} (hint: set :mkdirs option)) unless ::File.directory? stylesoutdir
|
144
|
+
end
|
145
|
+
|
146
|
+
if copy_asciidoctor_stylesheet
|
147
|
+
Stylesheets.instance.write_primary_stylesheet stylesoutdir
|
148
|
+
# FIXME should Stylesheets also handle the user stylesheet?
|
149
|
+
elsif copy_user_stylesheet
|
150
|
+
if (stylesheet_src = doc.attr 'copycss').empty?
|
151
|
+
stylesheet_src = doc.normalize_system_path stylesheet
|
152
|
+
else
|
153
|
+
# NOTE in this case, copycss is a source location (but cannot be a URI)
|
154
|
+
stylesheet_src = doc.normalize_system_path stylesheet_src
|
155
|
+
end
|
156
|
+
stylesheet_dest = doc.normalize_system_path stylesheet, stylesoutdir, (doc.safe >= SafeMode::SAFE ? outdir : nil)
|
157
|
+
# NOTE don't warn if src can't be read and dest already exists (see #2323)
|
158
|
+
if stylesheet_src != stylesheet_dest && (stylesheet_data = doc.read_asset stylesheet_src,
|
159
|
+
warn_on_failure: !(::File.file? stylesheet_dest), label: 'stylesheet')
|
160
|
+
::File.write stylesheet_dest, stylesheet_data, mode: FILE_WRITE_MODE
|
161
|
+
end
|
162
|
+
end
|
163
|
+
syntax_hl.write_stylesheet doc, stylesoutdir if copy_syntax_hl_stylesheet
|
164
|
+
end
|
165
|
+
end
|
166
|
+
doc
|
167
|
+
else
|
168
|
+
output
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
# Public: Parse the contents of the AsciiDoc source file into an
|
173
|
+
# Asciidoctor::Document and convert it to the specified backend format.
|
174
|
+
#
|
175
|
+
# input - the String AsciiDoc source filename
|
176
|
+
# options - a String, Array or Hash of options to control processing (default: {})
|
177
|
+
# String and Array values are converted into a Hash.
|
178
|
+
# See Asciidoctor::Document#initialize for details about options.
|
179
|
+
#
|
180
|
+
# Returns the Document object if the converted String is written to a
|
181
|
+
# file, otherwise the converted String
|
182
|
+
def convert_file filename, options = {}
|
183
|
+
::File.open(filename, FILE_READ_MODE) {|file| convert file, options }
|
184
|
+
end
|
185
|
+
|
186
|
+
# Deprecated: Use {Asciidoctor.convert} instead.
|
187
|
+
alias render convert
|
188
|
+
module_function :render
|
189
|
+
|
190
|
+
# Deprecated: Use {Asciidoctor.convert_file} instead.
|
191
|
+
alias render_file convert_file
|
192
|
+
module_function :render_file
|
193
|
+
end
|
data/lib/asciidoctor/document.rb
CHANGED
@@ -331,8 +331,7 @@ class Document < AbstractBlock
|
|
331
331
|
options[:standalone] = options[:header_footer] if (options.key? :header_footer) && !(options.key? :standalone)
|
332
332
|
end
|
333
333
|
|
334
|
-
@parsed =
|
335
|
-
@header = @header_attributes = nil
|
334
|
+
@parsed = @reftexts = @header = @header_attributes = nil
|
336
335
|
@counters = {}
|
337
336
|
@attributes_modified = ::Set.new
|
338
337
|
@docinfo_processor_extensions = {}
|
@@ -615,16 +614,25 @@ class Document < AbstractBlock
|
|
615
614
|
end
|
616
615
|
end
|
617
616
|
|
618
|
-
# Public: Scan
|
619
|
-
#
|
620
|
-
# If multiple references in the document have the same reference text, the first match in document order is used.
|
617
|
+
# Public: Scan registered references and return the ID of the first reference that matches the specified reference text.
|
621
618
|
#
|
622
619
|
# text - The String reference text to compare to the converted reference text of each registered reference.
|
623
620
|
#
|
624
621
|
# Returns the String ID of the first reference with matching reference text or nothing if no reference is found.
|
625
622
|
def resolve_id text
|
626
|
-
|
627
|
-
|
623
|
+
if @reftexts
|
624
|
+
@reftexts[text]
|
625
|
+
elsif @parsed
|
626
|
+
# @reftexts is set eagerly to prevent nested lazy init
|
627
|
+
(@reftexts = {}).tap {|accum| @catalog[:refs].each {|id, ref| accum[ref.xreftext] ||= id } }[text]
|
628
|
+
else
|
629
|
+
# @reftexts is set eagerly to prevent nested lazy init
|
630
|
+
resolved_id = nil
|
631
|
+
# NOTE short-circuit early since we're throwing away this table
|
632
|
+
(@reftexts = {}).tap {|accum| @catalog[:refs].each {|id, ref| (xreftext = ref.xreftext) == text ? (break (resolved_id = id)) : (accum[xreftext] ||= id) } }
|
633
|
+
@reftexts = nil
|
634
|
+
resolved_id
|
635
|
+
end
|
628
636
|
end
|
629
637
|
|
630
638
|
def footnotes?
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module Asciidoctor
|
2
|
+
module_function
|
3
|
+
|
4
|
+
# Public: Parse the AsciiDoc source input into a {Document}
|
5
|
+
#
|
6
|
+
# Accepts input as an IO (or StringIO), String or String Array object. If the
|
7
|
+
# input is a File, the object is expected to be opened for reading and is not
|
8
|
+
# closed afterwards by this method. Information about the file (filename,
|
9
|
+
# directory name, etc) gets assigned to attributes on the Document object.
|
10
|
+
#
|
11
|
+
# input - the AsciiDoc source as a IO, String or Array.
|
12
|
+
# options - a String, Array or Hash of options to control processing (default: {})
|
13
|
+
# String and Array values are converted into a Hash.
|
14
|
+
# See {Document#initialize} for details about these options.
|
15
|
+
#
|
16
|
+
# Returns the Document
|
17
|
+
def load input, options = {}
|
18
|
+
options = options.merge
|
19
|
+
|
20
|
+
if (timings = options[:timings])
|
21
|
+
timings.start :read
|
22
|
+
end
|
23
|
+
|
24
|
+
if (logger = options[:logger]) && logger != LoggerManager.logger
|
25
|
+
LoggerManager.logger = logger
|
26
|
+
end
|
27
|
+
|
28
|
+
if !(attrs = options[:attributes])
|
29
|
+
attrs = {}
|
30
|
+
elsif ::Hash === attrs
|
31
|
+
attrs = attrs.merge
|
32
|
+
elsif (defined? ::Java::JavaUtil::Map) && ::Java::JavaUtil::Map === attrs
|
33
|
+
attrs = attrs.dup
|
34
|
+
elsif ::Array === attrs
|
35
|
+
attrs = {}.tap do |accum|
|
36
|
+
attrs.each do |entry|
|
37
|
+
k, _, v = entry.partition '='
|
38
|
+
accum[k] = v
|
39
|
+
end
|
40
|
+
end
|
41
|
+
elsif ::String === attrs
|
42
|
+
# condense and convert non-escaped spaces to null, unescape escaped spaces, then split on null
|
43
|
+
attrs = {}.tap do |accum|
|
44
|
+
attrs.gsub(SpaceDelimiterRx, '\1' + NULL).gsub(EscapedSpaceRx, '\1').split(NULL).each do |entry|
|
45
|
+
k, _, v = entry.partition '='
|
46
|
+
accum[k] = v
|
47
|
+
end
|
48
|
+
end
|
49
|
+
elsif (attrs.respond_to? :keys) && (attrs.respond_to? :[])
|
50
|
+
# coerce attrs to a real Hash
|
51
|
+
attrs = {}.tap {|accum| attrs.keys.each {|k| accum[k] = attrs[k] } }
|
52
|
+
else
|
53
|
+
raise ::ArgumentError, %(illegal type for attributes option: #{attrs.class.ancestors.join ' < '})
|
54
|
+
end
|
55
|
+
|
56
|
+
if ::File === input
|
57
|
+
options[:input_mtime] = input.mtime
|
58
|
+
# NOTE defer setting infile and indir until we get a better sense of their purpose
|
59
|
+
# TODO cli checks if input path can be read and is file, but might want to add check to API too
|
60
|
+
attrs['docfile'] = input_path = ::File.absolute_path input.path
|
61
|
+
attrs['docdir'] = ::File.dirname input_path
|
62
|
+
attrs['docname'] = Helpers.basename input_path, (attrs['docfilesuffix'] = Helpers.extname input_path)
|
63
|
+
source = input.read
|
64
|
+
elsif input.respond_to? :read
|
65
|
+
# NOTE tty, pipes & sockets can't be rewound, but can't be sniffed easily either
|
66
|
+
# just fail the rewind operation silently to handle all cases
|
67
|
+
input.rewind rescue nil
|
68
|
+
source = input.read
|
69
|
+
elsif ::String === input
|
70
|
+
source = input
|
71
|
+
elsif ::Array === input
|
72
|
+
source = input.drop 0
|
73
|
+
elsif input
|
74
|
+
raise ::ArgumentError, %(unsupported input type: #{input.class})
|
75
|
+
end
|
76
|
+
|
77
|
+
if timings
|
78
|
+
timings.record :read
|
79
|
+
timings.start :parse
|
80
|
+
end
|
81
|
+
|
82
|
+
options[:attributes] = attrs
|
83
|
+
doc = options[:parse] == false ? (Document.new source, options) : (Document.new source, options).parse
|
84
|
+
|
85
|
+
timings.record :parse if timings
|
86
|
+
doc
|
87
|
+
rescue => ex
|
88
|
+
begin
|
89
|
+
context = %(asciidoctor: FAILED: #{attrs['docfile'] || '<stdin>'}: Failed to load AsciiDoc document)
|
90
|
+
if ex.respond_to? :exception
|
91
|
+
# The original message must be explicitly preserved when wrapping a Ruby exception
|
92
|
+
wrapped_ex = ex.exception %(#{context} - #{ex.message})
|
93
|
+
# JRuby automatically sets backtrace; MRI did not until 2.6
|
94
|
+
wrapped_ex.set_backtrace ex.backtrace
|
95
|
+
else
|
96
|
+
# Likely a Java exception class
|
97
|
+
wrapped_ex = ex.class.new context, ex
|
98
|
+
wrapped_ex.stack_trace = ex.stack_trace
|
99
|
+
end
|
100
|
+
rescue
|
101
|
+
wrapped_ex = ex
|
102
|
+
end
|
103
|
+
raise wrapped_ex
|
104
|
+
end
|
105
|
+
|
106
|
+
# Public: Parse the contents of the AsciiDoc source file into an Asciidoctor::Document
|
107
|
+
#
|
108
|
+
# input - the String AsciiDoc source filename
|
109
|
+
# options - a String, Array or Hash of options to control processing (default: {})
|
110
|
+
# String and Array values are converted into a Hash.
|
111
|
+
# See Asciidoctor::Document#initialize for details about options.
|
112
|
+
#
|
113
|
+
# Returns the Asciidoctor::Document
|
114
|
+
def load_file filename, options = {}
|
115
|
+
::File.open(filename, FILE_READ_MODE) {|file| load file, options }
|
116
|
+
end
|
117
|
+
end
|
@@ -807,7 +807,7 @@ module Substitutors
|
|
807
807
|
refid, target = fragment, %(##{fragment})
|
808
808
|
# handles: Node Title or Reference Text
|
809
809
|
# do reverse lookup on fragment if not a known ID and resembles reftext (contains a space or uppercase char)
|
810
|
-
elsif (
|
810
|
+
elsif ((fragment.include? ' ') || fragment.downcase != fragment) && (refid = doc.resolve_id fragment)
|
811
811
|
fragment, target = refid, %(##{refid})
|
812
812
|
else
|
813
813
|
refid, target = fragment, %(##{fragment})
|
@@ -5,8 +5,7 @@ class SyntaxHighlighter::RougeAdapter < SyntaxHighlighter::Base
|
|
5
5
|
|
6
6
|
def initialize *args
|
7
7
|
super
|
8
|
-
@requires_stylesheet = nil
|
9
|
-
@style = nil
|
8
|
+
@requires_stylesheet = @style = nil
|
10
9
|
end
|
11
10
|
|
12
11
|
def highlight?
|
@@ -19,9 +18,9 @@ class SyntaxHighlighter::RougeAdapter < SyntaxHighlighter::Base
|
|
19
18
|
@style ||= (style = opts[:style]) && (style_available? style) || DEFAULT_STYLE
|
20
19
|
if opts[:css_mode] == :class
|
21
20
|
@requires_stylesheet = true
|
22
|
-
formatter = ::Rouge::Formatters::HTML.new @style
|
21
|
+
formatter = ::Rouge::Formatters::HTML.new inline_theme: @style
|
23
22
|
else
|
24
|
-
formatter = ::Rouge::Formatters::HTMLInline.new @style
|
23
|
+
formatter = ::Rouge::Formatters::HTMLInline.new (::Rouge::Theme.find @style).new
|
25
24
|
end
|
26
25
|
if (highlight_lines = opts[:highlight_lines])
|
27
26
|
formatter = RougeExt::Formatters::HTMLLineHighlighter.new formatter, lines: highlight_lines
|
data/lib/asciidoctor/version.rb
CHANGED
data/man/asciidoctor.1
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
'\" t
|
2
2
|
.\" Title: asciidoctor
|
3
3
|
.\" Author: Dan Allen, Sarah White, Ryan Waldron
|
4
|
-
.\" Generator: Asciidoctor 2.0.
|
5
|
-
.\" Date: 2019-04-
|
4
|
+
.\" Generator: Asciidoctor 2.0.7
|
5
|
+
.\" Date: 2019-04-13
|
6
6
|
.\" Manual: Asciidoctor Manual
|
7
|
-
.\" Source: Asciidoctor 2.0.
|
7
|
+
.\" Source: Asciidoctor 2.0.7
|
8
8
|
.\" Language: English
|
9
9
|
.\"
|
10
|
-
.TH "ASCIIDOCTOR" "1" "2019-04-
|
10
|
+
.TH "ASCIIDOCTOR" "1" "2019-04-13" "Asciidoctor 2.0.7" "Asciidoctor Manual"
|
11
11
|
.ie \n(.g .ds Aq \(aq
|
12
12
|
.el .ds Aq '
|
13
13
|
.ss \n[.ss] 0
|
@@ -28,13 +28,13 @@
|
|
28
28
|
. LINKSTYLE blue R < >
|
29
29
|
.\}
|
30
30
|
.SH "NAME"
|
31
|
-
asciidoctor \- converts AsciiDoc source files to HTML, DocBook and other formats
|
31
|
+
asciidoctor \- converts AsciiDoc source files to HTML, DocBook, and other formats
|
32
32
|
.SH "SYNOPSIS"
|
33
33
|
.sp
|
34
34
|
\fBasciidoctor\fP [\fIOPTION\fP]... \fIFILE\fP...
|
35
35
|
.SH "DESCRIPTION"
|
36
36
|
.sp
|
37
|
-
The asciidoctor(1) command converts the AsciiDoc source file(s) \fIFILE\fP to HTML5, DocBook 5, man(ual) page and other custom output formats.
|
37
|
+
The asciidoctor(1) command converts the AsciiDoc source file(s) \fIFILE\fP to HTML5, DocBook 5, man(ual) page, and other custom output formats.
|
38
38
|
.sp
|
39
39
|
If \fIFILE\fP is \fI\-\fP then the AsciiDoc source is read from standard input.
|
40
40
|
.SH "OPTIONS"
|
@@ -43,13 +43,13 @@ If \fIFILE\fP is \fI\-\fP then the AsciiDoc source is read from standard input.
|
|
43
43
|
\fB\-B, \-\-base\-dir\fP=\fIDIR\fP
|
44
44
|
.RS 4
|
45
45
|
Base directory containing the document and resources.
|
46
|
-
Defaults to the directory containing the source file
|
46
|
+
Defaults to the directory containing the source file or, if the source is read from a stream, the working directory.
|
47
47
|
When combined with the safe mode setting, can be used to chroot the execution of the program.
|
48
48
|
.RE
|
49
49
|
.sp
|
50
50
|
\fB\-S, \-\-safe\-mode\fP=\fISAFE_MODE\fP
|
51
51
|
.RS 4
|
52
|
-
Set safe mode level: \fIunsafe\fP, \fIsafe\fP, \fIserver\fP or \fIsecure\fP.
|
52
|
+
Set safe mode level: \fIunsafe\fP, \fIsafe\fP, \fIserver\fP, or \fIsecure\fP.
|
53
53
|
Disables potentially dangerous macros in source files, such as \f(CRinclude::[]\fP.
|
54
54
|
If not set, the safe mode level defaults to \fIunsafe\fP when Asciidoctor is invoked using this script.
|
55
55
|
.RE
|
@@ -65,11 +65,11 @@ If not set, the safe mode level defaults to \fIunsafe\fP when Asciidoctor is inv
|
|
65
65
|
.sp
|
66
66
|
\fB\-a, \-\-attribute\fP=\fIATTRIBUTE\fP
|
67
67
|
.RS 4
|
68
|
-
Define, override or
|
69
|
-
Command\-line attributes take precedence over attributes defined in the source file unless the value ends
|
68
|
+
Define, override, or unset a document attribute.
|
69
|
+
Command\-line attributes take precedence over attributes defined in the source file unless either the name or value ends in \fI@\fP.
|
70
70
|
.sp
|
71
71
|
\fIATTRIBUTE\fP is normally formatted as a key\-value pair, in the form \fINAME=VALUE\fP.
|
72
|
-
Alternate
|
72
|
+
Alternate forms are \fINAME\fP (where the \fIVALUE\fP defaults to an empty string), \fINAME!\fP (unsets the \fINAME\fP attribute), and \fINAME=VALUE@\fP (or \fINAME@=VALUE\fP) (where \fIVALUE\fP does not override the \fINAME\fP attribute if it\(cqs already defined in the source document).
|
73
73
|
Values containing spaces should be enclosed in quotes.
|
74
74
|
.sp
|
75
75
|
This option may be specified more than once.
|
@@ -77,7 +77,7 @@ This option may be specified more than once.
|
|
77
77
|
.sp
|
78
78
|
\fB\-b, \-\-backend\fP=\fIBACKEND\fP
|
79
79
|
.RS 4
|
80
|
-
Backend output file format: \fIhtml5\fP, \fIdocbook5\fP, \fIdocbook45\fP and \fImanpage\fP are supported out of the box.
|
80
|
+
Backend output file format: \fIhtml5\fP, \fIdocbook5\fP, \fIdocbook45\fP, and \fImanpage\fP are supported out of the box.
|
81
81
|
You can also use the backend alias names \fIhtml\fP (aliased to \fIhtml5\fP) or \fIdocbook\fP (aliased to \fIdocbook5\fP).
|
82
82
|
Other values can be passed, but if Asciidoctor cannot resolve the backend to a converter, it will fail.
|
83
83
|
Defaults to \fIhtml5\fP.
|
@@ -85,7 +85,7 @@ Defaults to \fIhtml5\fP.
|
|
85
85
|
.sp
|
86
86
|
\fB\-d, \-\-doctype\fP=\fIDOCTYPE\fP
|
87
87
|
.RS 4
|
88
|
-
Document type: \fIarticle\fP, \fIbook\fP, \fImanpage\fP or \fIinline\fP.
|
88
|
+
Document type: \fIarticle\fP, \fIbook\fP, \fImanpage\fP, or \fIinline\fP.
|
89
89
|
Sets the root element when using the \fIdocbook\fP backend and the style class on the HTML body element when using the \fIhtml\fP backend.
|
90
90
|
The \fIbook\fP document type allows multiple level\-0 section titles in a single document.
|
91
91
|
The \fImanpage\fP document type enables parsing of metadata necessary to produce a man page.
|
@@ -97,7 +97,7 @@ Defaults to \fIarticle\fP.
|
|
97
97
|
\fB\-D, \-\-destination\-dir\fP=\fIDIR\fP
|
98
98
|
.RS 4
|
99
99
|
Destination output directory.
|
100
|
-
Defaults to the directory containing the source file
|
100
|
+
Defaults to the directory containing the source file or, if the source is read from a stream, the working directory.
|
101
101
|
If specified, the directory is resolved relative to the working directory.
|
102
102
|
.RE
|
103
103
|
.sp
|
@@ -198,7 +198,7 @@ Turn on script warnings (applies to executed code).
|
|
198
198
|
.sp
|
199
199
|
\fB\-t, \-\-timings\fP
|
200
200
|
.RS 4
|
201
|
-
Print timings report to stderr (time to read, parse and convert).
|
201
|
+
Print timings report to stderr (time to read, parse, and convert).
|
202
202
|
.RE
|
203
203
|
.SS "Program Information"
|
204
204
|
.sp
|
@@ -239,7 +239,7 @@ Refer to the \fBAsciidoctor\fP issue tracker at \c
|
|
239
239
|
.URL "https://github.com/asciidoctor/asciidoctor/issues?q=is%3Aopen" "" "."
|
240
240
|
.SH "AUTHORS"
|
241
241
|
.sp
|
242
|
-
\fBAsciidoctor\fP was written by Dan Allen, Ryan Waldron, Jason Porter, Nick Hengeveld and other contributors.
|
242
|
+
\fBAsciidoctor\fP was written by Dan Allen, Ryan Waldron, Jason Porter, Nick Hengeveld, and other contributors.
|
243
243
|
.sp
|
244
244
|
\fBAsciiDoc\fP was written by Stuart Rackham and has received contributions from many other individuals.
|
245
245
|
.SH "RESOURCES"
|
@@ -257,7 +257,7 @@ Refer to the \fBAsciidoctor\fP issue tracker at \c
|
|
257
257
|
.URL "http://discuss.asciidoctor.org" "" ""
|
258
258
|
.SH "COPYING"
|
259
259
|
.sp
|
260
|
-
Copyright (C) 2012\-2019 Dan Allen, Ryan Waldron and the Asciidoctor Project.
|
260
|
+
Copyright (C) 2012\-2019 Dan Allen, Ryan Waldron, and the Asciidoctor Project.
|
261
261
|
Free use of this software is granted under the terms of the MIT License.
|
262
262
|
.SH "AUTHORS"
|
263
263
|
.sp
|
data/man/asciidoctor.adoc
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
Dan Allen; Sarah White; Ryan Waldron
|
3
3
|
:doctype: manpage
|
4
4
|
:man manual: Asciidoctor Manual
|
5
|
-
:man source: Asciidoctor 2.0.
|
5
|
+
:man source: Asciidoctor 2.0.7
|
6
6
|
:page-layout: base
|
7
7
|
|
8
8
|
== NAME
|
9
9
|
|
10
|
-
asciidoctor - converts AsciiDoc source files to HTML, DocBook and other formats
|
10
|
+
asciidoctor - converts AsciiDoc source files to HTML, DocBook, and other formats
|
11
11
|
|
12
12
|
== SYNOPSIS
|
13
13
|
|
@@ -15,7 +15,7 @@ asciidoctor - converts AsciiDoc source files to HTML, DocBook and other formats
|
|
15
15
|
|
16
16
|
== DESCRIPTION
|
17
17
|
|
18
|
-
The asciidoctor(1) command converts the AsciiDoc source file(s) _FILE_ to HTML5, DocBook 5, man(ual) page and other custom output formats.
|
18
|
+
The asciidoctor(1) command converts the AsciiDoc source file(s) _FILE_ to HTML5, DocBook 5, man(ual) page, and other custom output formats.
|
19
19
|
|
20
20
|
If _FILE_ is _-_ then the AsciiDoc source is read from standard input.
|
21
21
|
|
@@ -25,11 +25,11 @@ If _FILE_ is _-_ then the AsciiDoc source is read from standard input.
|
|
25
25
|
|
26
26
|
*-B, --base-dir*=_DIR_::
|
27
27
|
Base directory containing the document and resources.
|
28
|
-
Defaults to the directory containing the source file
|
28
|
+
Defaults to the directory containing the source file or, if the source is read from a stream, the working directory.
|
29
29
|
When combined with the safe mode setting, can be used to chroot the execution of the program.
|
30
30
|
|
31
31
|
*-S, --safe-mode*=_SAFE_MODE_::
|
32
|
-
Set safe mode level: _unsafe_, _safe_, _server_ or _secure_.
|
32
|
+
Set safe mode level: _unsafe_, _safe_, _server_, or _secure_.
|
33
33
|
Disables potentially dangerous macros in source files, such as `include::[]`.
|
34
34
|
If not set, the safe mode level defaults to _unsafe_ when Asciidoctor is invoked using this script.
|
35
35
|
|
@@ -42,23 +42,23 @@ If _FILE_ is _-_ then the AsciiDoc source is read from standard input.
|
|
42
42
|
=== Document Settings
|
43
43
|
|
44
44
|
*-a, --attribute*=_ATTRIBUTE_::
|
45
|
-
Define, override or
|
46
|
-
Command-line attributes take precedence over attributes defined in the source file unless the value ends
|
45
|
+
Define, override, or unset a document attribute.
|
46
|
+
Command-line attributes take precedence over attributes defined in the source file unless either the name or value ends in _@_.
|
47
47
|
+
|
48
48
|
_ATTRIBUTE_ is normally formatted as a key-value pair, in the form _NAME=VALUE_.
|
49
|
-
Alternate
|
49
|
+
Alternate forms are _NAME_ (where the _VALUE_ defaults to an empty string), _NAME!_ (unsets the _NAME_ attribute), and _NAME=VALUE@_ (or _NAME@=VALUE_) (where _VALUE_ does not override the _NAME_ attribute if it's already defined in the source document).
|
50
50
|
Values containing spaces should be enclosed in quotes.
|
51
51
|
+
|
52
52
|
This option may be specified more than once.
|
53
53
|
|
54
54
|
*-b, --backend*=_BACKEND_::
|
55
|
-
Backend output file format: _html5_, _docbook5_, _docbook45_ and _manpage_ are supported out of the box.
|
55
|
+
Backend output file format: _html5_, _docbook5_, _docbook45_, and _manpage_ are supported out of the box.
|
56
56
|
You can also use the backend alias names _html_ (aliased to _html5_) or _docbook_ (aliased to _docbook5_).
|
57
57
|
Other values can be passed, but if Asciidoctor cannot resolve the backend to a converter, it will fail.
|
58
58
|
Defaults to _html5_.
|
59
59
|
|
60
60
|
*-d, --doctype*=_DOCTYPE_::
|
61
|
-
Document type: _article_, _book_, _manpage_ or _inline_.
|
61
|
+
Document type: _article_, _book_, _manpage_, or _inline_.
|
62
62
|
Sets the root element when using the _docbook_ backend and the style class on the HTML body element when using the _html_ backend.
|
63
63
|
The _book_ document type allows multiple level-0 section titles in a single document.
|
64
64
|
The _manpage_ document type enables parsing of metadata necessary to produce a man page.
|
@@ -69,7 +69,7 @@ This option may be specified more than once.
|
|
69
69
|
|
70
70
|
*-D, --destination-dir*=_DIR_::
|
71
71
|
Destination output directory.
|
72
|
-
Defaults to the directory containing the source file
|
72
|
+
Defaults to the directory containing the source file or, if the source is read from a stream, the working directory.
|
73
73
|
If specified, the directory is resolved relative to the working directory.
|
74
74
|
|
75
75
|
*-E, --template-engine*=_NAME_::
|
@@ -141,7 +141,7 @@ Matching templates found in subsequent directories override ones previously disc
|
|
141
141
|
Turn on script warnings (applies to executed code).
|
142
142
|
|
143
143
|
*-t, --timings*::
|
144
|
-
Print timings report to stderr (time to read, parse and convert).
|
144
|
+
Print timings report to stderr (time to read, parse, and convert).
|
145
145
|
|
146
146
|
=== Program Information
|
147
147
|
|
@@ -175,7 +175,7 @@ Refer to the *Asciidoctor* issue tracker at https://github.com/asciidoctor/ascii
|
|
175
175
|
|
176
176
|
== AUTHORS
|
177
177
|
|
178
|
-
*Asciidoctor* was written by Dan Allen, Ryan Waldron, Jason Porter, Nick Hengeveld and other contributors.
|
178
|
+
*Asciidoctor* was written by Dan Allen, Ryan Waldron, Jason Porter, Nick Hengeveld, and other contributors.
|
179
179
|
|
180
180
|
*AsciiDoc* was written by Stuart Rackham and has received contributions from many other individuals.
|
181
181
|
|
@@ -191,5 +191,5 @@ Refer to the *Asciidoctor* issue tracker at https://github.com/asciidoctor/ascii
|
|
191
191
|
|
192
192
|
== COPYING
|
193
193
|
|
194
|
-
Copyright \(C) 2012-2019 Dan Allen, Ryan Waldron and the Asciidoctor Project.
|
194
|
+
Copyright \(C) 2012-2019 Dan Allen, Ryan Waldron, and the Asciidoctor Project.
|
195
195
|
Free use of this software is granted under the terms of the MIT License.
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asciidoctor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dan Allen
|
@@ -13,7 +13,7 @@ authors:
|
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
|
-
date: 2019-04-
|
16
|
+
date: 2019-04-13 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: asciimath
|
@@ -260,6 +260,7 @@ files:
|
|
260
260
|
- lib/asciidoctor/cli.rb
|
261
261
|
- lib/asciidoctor/cli/invoker.rb
|
262
262
|
- lib/asciidoctor/cli/options.rb
|
263
|
+
- lib/asciidoctor/convert.rb
|
263
264
|
- lib/asciidoctor/converter.rb
|
264
265
|
- lib/asciidoctor/converter/composite.rb
|
265
266
|
- lib/asciidoctor/converter/docbook5.rb
|
@@ -277,6 +278,7 @@ files:
|
|
277
278
|
- lib/asciidoctor/helpers.rb
|
278
279
|
- lib/asciidoctor/inline.rb
|
279
280
|
- lib/asciidoctor/list.rb
|
281
|
+
- lib/asciidoctor/load.rb
|
280
282
|
- lib/asciidoctor/logging.rb
|
281
283
|
- lib/asciidoctor/parser.rb
|
282
284
|
- lib/asciidoctor/path_resolver.rb
|