asciidoctor 2.0.17 → 2.0.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.adoc +77 -10
- data/README-de.adoc +0 -1
- data/README-fr.adoc +0 -1
- data/README-jp.adoc +0 -1
- data/README-zh_CN.adoc +0 -1
- data/README.adoc +10 -8
- data/asciidoctor.gemspec +3 -3
- data/data/locale/attributes-sw.adoc +23 -0
- data/data/stylesheets/asciidoctor-default.css +5 -8
- data/lib/asciidoctor/abstract_block.rb +1 -0
- data/lib/asciidoctor/block.rb +2 -2
- data/lib/asciidoctor/cli/invoker.rb +1 -1
- data/lib/asciidoctor/cli/options.rb +5 -1
- data/lib/asciidoctor/converter/docbook5.rb +19 -17
- data/lib/asciidoctor/converter/html5.rb +1 -1
- data/lib/asciidoctor/converter/manpage.rb +3 -3
- data/lib/asciidoctor/converter/template.rb +2 -1
- data/lib/asciidoctor/document.rb +1 -0
- data/lib/asciidoctor/extensions.rb +38 -5
- data/lib/asciidoctor/helpers.rb +8 -2
- data/lib/asciidoctor/parser.rb +43 -27
- data/lib/asciidoctor/path_resolver.rb +11 -2
- data/lib/asciidoctor/reader.rb +35 -34
- data/lib/asciidoctor/rx.rb +14 -16
- data/lib/asciidoctor/substitutors.rb +28 -42
- data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +1 -1
- data/lib/asciidoctor/version.rb +1 -1
- data/man/asciidoctor.1 +5 -5
- data/man/asciidoctor.adoc +5 -4
- metadata +9 -8
data/lib/asciidoctor/helpers.rb
CHANGED
@@ -120,8 +120,14 @@ module Helpers
|
|
120
120
|
# str - the String to check
|
121
121
|
#
|
122
122
|
# returns true if the String is a URI, false if it is not
|
123
|
-
|
124
|
-
|
123
|
+
if ::RUBY_ENGINE == 'jruby'
|
124
|
+
def uriish? str
|
125
|
+
(str.include? ':') && !(str.start_with? 'uri:classloader:') && (UriSniffRx.match? str)
|
126
|
+
end
|
127
|
+
else
|
128
|
+
def uriish? str
|
129
|
+
(str.include? ':') && (UriSniffRx.match? str)
|
130
|
+
end
|
125
131
|
end
|
126
132
|
|
127
133
|
# Internal: Encode a URI component String for safe inclusion in a URI.
|
data/lib/asciidoctor/parser.rb
CHANGED
@@ -398,18 +398,22 @@ class Parser
|
|
398
398
|
# REVIEW this may be doing too much
|
399
399
|
if part
|
400
400
|
if !section.blocks?
|
401
|
-
# if this
|
401
|
+
# if this not a [partintro] open block, enclose it in a [partintro] open block
|
402
402
|
if new_block.style != 'partintro'
|
403
|
-
#
|
404
|
-
if new_block.context == :
|
405
|
-
new_block.context = :open
|
403
|
+
# if this is already a normal open block, simply add the partintro style
|
404
|
+
if new_block.style == 'open' && new_block.context == :open
|
406
405
|
new_block.style = 'partintro'
|
407
|
-
# emulate [partintro] open block
|
408
406
|
else
|
409
407
|
new_block.parent = (intro = Block.new section, :open, content_model: :compound)
|
410
408
|
intro.style = 'partintro'
|
411
409
|
section.blocks << intro
|
412
410
|
end
|
411
|
+
# if this is a [partintro] paragraph, convert it to a [partintro] open block w/ single paragraph
|
412
|
+
elsif new_block.content_model == :simple
|
413
|
+
new_block.content_model = :compound
|
414
|
+
new_block << (Block.new new_block, :paragraph, source: new_block.lines, subs: new_block.subs)
|
415
|
+
new_block.lines.clear
|
416
|
+
new_block.subs.clear
|
413
417
|
end
|
414
418
|
elsif section.blocks.size == 1
|
415
419
|
first_block = section.blocks[0]
|
@@ -419,12 +423,11 @@ class Parser
|
|
419
423
|
# rebuild [partintro] paragraph as an open block
|
420
424
|
elsif first_block.content_model != :compound
|
421
425
|
new_block.parent = (intro = Block.new section, :open, content_model: :compound)
|
422
|
-
intro.style = 'partintro'
|
423
|
-
section.blocks.shift
|
424
|
-
if first_block.style == 'partintro'
|
426
|
+
if first_block.style == (intro.style = 'partintro')
|
425
427
|
first_block.context = :paragraph
|
426
428
|
first_block.style = nil
|
427
429
|
end
|
430
|
+
section.blocks.shift
|
428
431
|
intro << first_block
|
429
432
|
section.blocks << intro
|
430
433
|
end
|
@@ -1052,9 +1055,9 @@ class Parser
|
|
1052
1055
|
attributes.delete('style')
|
1053
1056
|
if (block = extension.process_method[parent, block_reader || (Reader.new lines), attributes.merge]) && block != parent
|
1054
1057
|
attributes.replace block.attributes
|
1055
|
-
#
|
1056
|
-
#
|
1057
|
-
#
|
1058
|
+
# NOTE an extension can change the content model from :simple to :compound. It's up to the extension
|
1059
|
+
# to decide which one to use. The extension can consult the cloaked-context attribute to determine
|
1060
|
+
# if the input is a paragraph or delimited block.
|
1058
1061
|
if block.content_model == :compound && Block === block && !(lines = block.lines).empty?
|
1059
1062
|
content_model = :compound
|
1060
1063
|
block_reader = Reader.new lines
|
@@ -1168,8 +1171,8 @@ class Parser
|
|
1168
1171
|
if reftext.include? ']'
|
1169
1172
|
reftext = reftext.gsub '\]', ']'
|
1170
1173
|
reftext = document.sub_attributes reftext if reftext.include? ATTR_REF_HEAD
|
1171
|
-
elsif
|
1172
|
-
|
1174
|
+
elsif reftext.include? ATTR_REF_HEAD
|
1175
|
+
reftext = nil if (reftext = document.sub_attributes reftext).empty?
|
1173
1176
|
end
|
1174
1177
|
end
|
1175
1178
|
end
|
@@ -1439,21 +1442,33 @@ class Parser
|
|
1439
1442
|
|
1440
1443
|
# a delimited block immediately breaks the list unless preceded
|
1441
1444
|
# by a list continuation (they are harsh like that ;0)
|
1442
|
-
if (match = is_delimited_block?
|
1443
|
-
|
1444
|
-
|
1445
|
-
|
1446
|
-
|
1447
|
-
|
1448
|
-
|
1449
|
-
|
1445
|
+
if (match = is_delimited_block? this_line, true)
|
1446
|
+
break unless continuation == :active
|
1447
|
+
buffer << this_line
|
1448
|
+
# grab all the lines in the block, leaving the delimiters in place
|
1449
|
+
# we're being more strict here about the terminator, but I think that's a good thing
|
1450
|
+
buffer.concat reader.read_lines_until terminator: match.terminator, read_last_line: true, context: nil
|
1451
|
+
continuation = :inactive
|
1452
|
+
# BlockAttributeLineRx only breaks dlist if ensuing line is not a list item
|
1453
|
+
elsif dlist && continuation != :active && (this_line.start_with? '[') && (BlockAttributeLineRx.match? this_line)
|
1454
|
+
block_attribute_lines = [this_line]
|
1455
|
+
while (next_line = reader.peek_line)
|
1456
|
+
if is_delimited_block? next_line
|
1457
|
+
interrupt = true
|
1458
|
+
elsif next_line.empty? || ((next_line.start_with? '[') && (BlockAttributeLineRx.match? next_line))
|
1459
|
+
block_attribute_lines << reader.read_line
|
1460
|
+
next
|
1461
|
+
elsif (AnyListRx.match? next_line) && !(is_sibling_list_item? next_line, list_type, sibling_trait)
|
1462
|
+
buffer.concat block_attribute_lines
|
1463
|
+
else # rubocop:disable Lint/DuplicateBranch
|
1464
|
+
interrupt = true
|
1465
|
+
end
|
1466
|
+
break
|
1467
|
+
end
|
1468
|
+
if interrupt
|
1469
|
+
reader.unshift_lines block_attribute_lines
|
1450
1470
|
break
|
1451
1471
|
end
|
1452
|
-
# technically BlockAttributeLineRx only breaks if ensuing line is not a list item
|
1453
|
-
# which really means BlockAttributeLineRx only breaks if it's acting as a block delimiter
|
1454
|
-
# FIXME to be AsciiDoc compliant, we shouldn't break if style in attribute line is "literal" (i.e., [literal])
|
1455
|
-
elsif dlist && continuation != :active && (BlockAttributeLineRx.match? this_line)
|
1456
|
-
break
|
1457
1472
|
elsif continuation == :active && !this_line.empty?
|
1458
1473
|
# literal paragraphs have special considerations (and this is one of
|
1459
1474
|
# two entry points into one)
|
@@ -1470,7 +1485,8 @@ class Parser
|
|
1470
1485
|
end
|
1471
1486
|
continuation = :inactive
|
1472
1487
|
# let block metadata play out until we find the block
|
1473
|
-
elsif (
|
1488
|
+
elsif ((ch0 = this_line.chr) == '.' && (BlockTitleRx.match? this_line)) ||
|
1489
|
+
(ch0 == '[' && (BlockAttributeLineRx.match? this_line)) || (ch0 == ':' && (AttributeEntryRx.match? this_line))
|
1474
1490
|
buffer << this_line
|
1475
1491
|
else
|
1476
1492
|
if (nested_list_type = (within_nested_list ? [:dlist] : NESTABLE_LIST_CONTEXTS).find {|ctx| ListRxMap[ctx].match? this_line })
|
@@ -109,6 +109,7 @@ class PathResolver
|
|
109
109
|
SLASH = '/'
|
110
110
|
BACKSLASH = '\\'
|
111
111
|
DOUBLE_SLASH = '//'
|
112
|
+
URI_CLASSLOADER = 'uri:classloader:'
|
112
113
|
WindowsRootRx = %r(^(?:[a-zA-Z]:)?[\\/])
|
113
114
|
|
114
115
|
attr_accessor :file_separator
|
@@ -148,8 +149,9 @@ class PathResolver
|
|
148
149
|
# Public: Check if the specified path is an absolute root path (or, in the
|
149
150
|
# browser environment, an absolute URI as well)
|
150
151
|
#
|
151
|
-
# This operation considers both
|
152
|
-
#
|
152
|
+
# This operation considers both POSIX and Windows paths. If the JavaScript IO module
|
153
|
+
# is xmlhttprequest, this operation also considers absolute URIs. If running on JRuby,
|
154
|
+
# this operation also considers classloader URIs (starts with uri:classloader:).
|
153
155
|
#
|
154
156
|
# Unix absolute paths and UNC paths start with slash. Windows roots can
|
155
157
|
# start with a drive letter. When the IO module is xmlhttprequest (Opal
|
@@ -164,6 +166,10 @@ class PathResolver
|
|
164
166
|
def root? path
|
165
167
|
(absolute_path? path) || (path.start_with? 'file://', 'http://', 'https://')
|
166
168
|
end
|
169
|
+
elsif ::RUBY_ENGINE == 'jruby'
|
170
|
+
def root? path
|
171
|
+
(absolute_path? path) || (path.start_with? URI_CLASSLOADER)
|
172
|
+
end
|
167
173
|
else
|
168
174
|
alias root? absolute_path?
|
169
175
|
end
|
@@ -299,6 +305,9 @@ class PathResolver
|
|
299
305
|
# ex. /sample/path
|
300
306
|
elsif posix_path.start_with? SLASH
|
301
307
|
root = SLASH
|
308
|
+
# ex. uri:classloader:sample/path (or uri:classloader:/sample/path)
|
309
|
+
elsif posix_path.start_with? URI_CLASSLOADER
|
310
|
+
root = posix_path.slice 0, URI_CLASSLOADER.length
|
302
311
|
# ex. C:/sample/path (or file:///sample/path in browser environment)
|
303
312
|
else
|
304
313
|
root = posix_path.slice 0, (posix_path.index SLASH) + 1
|
data/lib/asciidoctor/reader.rb
CHANGED
@@ -125,16 +125,21 @@ class Reader
|
|
125
125
|
# Returns the next line of the source data as a String if there are lines remaining.
|
126
126
|
# Returns nothing if there is no more data.
|
127
127
|
def peek_line direct = false
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
128
|
+
while true
|
129
|
+
next_line = @lines[-1]
|
130
|
+
if direct || @look_ahead > 0
|
131
|
+
return @unescape_next_line ? (next_line.slice 1, next_line.length) : next_line
|
132
|
+
elsif next_line
|
133
|
+
# FIXME the problem with this approach is that we aren't
|
134
|
+
# retaining the modified line (hence the @unescape_next_line tweak)
|
135
|
+
# perhaps we need a stack of proxied lines
|
136
|
+
if (line = process_line next_line)
|
137
|
+
return line
|
138
|
+
end
|
139
|
+
else
|
140
|
+
@look_ahead = 0
|
141
|
+
return
|
142
|
+
end
|
138
143
|
end
|
139
144
|
end
|
140
145
|
|
@@ -690,7 +695,7 @@ class PreprocessorReader < Reader
|
|
690
695
|
# only process lines in AsciiDoc files
|
691
696
|
if (@process_lines = file.end_with?(*ASCIIDOC_EXTENSIONS.keys))
|
692
697
|
# NOTE registering the include with a nil value tracks it while not making it visible to interdocument xrefs
|
693
|
-
@includes[path.slice 0, (path.rindex '.')]
|
698
|
+
@includes[path.slice 0, (path.rindex '.')] ||= attributes['partial-option'] ? nil : true
|
694
699
|
end
|
695
700
|
else
|
696
701
|
@dir = '.'
|
@@ -698,7 +703,7 @@ class PreprocessorReader < Reader
|
|
698
703
|
@process_lines = true
|
699
704
|
if (@path = path)
|
700
705
|
# NOTE registering the include with a nil value tracks it while not making it visible to interdocument xrefs
|
701
|
-
@includes[Helpers.rootname path]
|
706
|
+
@includes[Helpers.rootname path] ||= attributes['partial-option'] ? nil : true
|
702
707
|
else
|
703
708
|
@path = '<stdin>'
|
704
709
|
end
|
@@ -1035,7 +1040,7 @@ class PreprocessorReader < Reader
|
|
1035
1040
|
# however, be friendly and at least make it a link to the source document
|
1036
1041
|
elsif doc.safe >= SafeMode::SECURE
|
1037
1042
|
# FIXME we don't want to use a link macro if we are in a verbatim context
|
1038
|
-
replace_next_line %(link:#{expanded_target}[])
|
1043
|
+
replace_next_line %(link:#{expanded_target}[role=include])
|
1039
1044
|
elsif @maxdepth
|
1040
1045
|
if @include_stack.size >= @maxdepth[:curr]
|
1041
1046
|
logger.error message_with_context %(maximum include depth of #{@maxdepth[:rel]} exceeded), source_location: cursor
|
@@ -1197,15 +1202,16 @@ class PreprocessorReader < Reader
|
|
1197
1202
|
push_include inc_lines, inc_path, relpath, inc_offset, parsed_attrs
|
1198
1203
|
end
|
1199
1204
|
else
|
1205
|
+
inc_content = nil
|
1200
1206
|
begin
|
1201
1207
|
# NOTE read content before shift so cursor is only advanced if IO operation succeeds
|
1202
1208
|
inc_content = reader.call(inc_path, read_mode) {|f| f.read }
|
1203
1209
|
shift
|
1204
|
-
push_include inc_content, inc_path, relpath, 1, parsed_attrs
|
1205
1210
|
rescue
|
1206
1211
|
logger.error message_with_context %(include #{target_type} not readable: #{inc_path}), source_location: cursor
|
1207
1212
|
return replace_next_line %(Unresolved directive in #{@path} - include::#{expanded_target}[#{attrlist}])
|
1208
1213
|
end
|
1214
|
+
push_include inc_content, inc_path, relpath, 1, parsed_attrs
|
1209
1215
|
end
|
1210
1216
|
true
|
1211
1217
|
end
|
@@ -1232,7 +1238,7 @@ class PreprocessorReader < Reader
|
|
1232
1238
|
def resolve_include_path target, attrlist, attributes
|
1233
1239
|
doc = @document
|
1234
1240
|
if (Helpers.uriish? target) || (::String === @dir ? nil : (target = %(#{@dir}/#{target})))
|
1235
|
-
return replace_next_line %(link:#{target}[
|
1241
|
+
return replace_next_line %(link:#{target}[role=include]) unless doc.attr? 'allow-uri-read'
|
1236
1242
|
if doc.attr? 'cache-uri'
|
1237
1243
|
# caching requires the open-uri-cached gem to be installed
|
1238
1244
|
# processing will be automatically aborted if these libraries can't be opened
|
@@ -1280,27 +1286,22 @@ class PreprocessorReader < Reader
|
|
1280
1286
|
|
1281
1287
|
# Private: Ignore front-matter, commonly used in static site generators
|
1282
1288
|
def skip_front_matter! data, increment_linenos = true
|
1283
|
-
|
1284
|
-
|
1285
|
-
|
1286
|
-
|
1287
|
-
|
1289
|
+
return unless (delim = data[0]) == '---'
|
1290
|
+
original_data = data.drop 0
|
1291
|
+
data.shift
|
1292
|
+
front_matter = []
|
1293
|
+
@lineno += 1 if increment_linenos
|
1294
|
+
until (eof = data.empty?) || data[0] == delim
|
1295
|
+
front_matter << data.shift
|
1288
1296
|
@lineno += 1 if increment_linenos
|
1289
|
-
while !data.empty? && data[0] != '---'
|
1290
|
-
front_matter << data.shift
|
1291
|
-
@lineno += 1 if increment_linenos
|
1292
|
-
end
|
1293
|
-
|
1294
|
-
if data.empty?
|
1295
|
-
data.unshift(*original_data)
|
1296
|
-
@lineno = 0 if increment_linenos
|
1297
|
-
front_matter = nil
|
1298
|
-
else
|
1299
|
-
data.shift
|
1300
|
-
@lineno += 1 if increment_linenos
|
1301
|
-
end
|
1302
1297
|
end
|
1303
|
-
|
1298
|
+
if eof
|
1299
|
+
data.unshift(*original_data)
|
1300
|
+
@lineno -= original_data.size if increment_linenos
|
1301
|
+
return
|
1302
|
+
end
|
1303
|
+
data.shift
|
1304
|
+
@lineno += 1 if increment_linenos
|
1304
1305
|
front_matter
|
1305
1306
|
end
|
1306
1307
|
|
data/lib/asciidoctor/rx.rb
CHANGED
@@ -89,7 +89,7 @@ module Asciidoctor
|
|
89
89
|
# include::chapter1.ad[]
|
90
90
|
# include::example.txt[lines=1;2;5..10]
|
91
91
|
#
|
92
|
-
IncludeDirectiveRx = /^(\\)?include::([^\[][^\[]*)\[(#{CC_ANY}+)?\]$/
|
92
|
+
IncludeDirectiveRx = /^(\\)?include::([^\s\[](?:[^\[]*[^\s\[])?)\[(#{CC_ANY}+)?\]$/
|
93
93
|
|
94
94
|
# Matches a trailing tag directive in an include file.
|
95
95
|
#
|
@@ -516,9 +516,9 @@ module Asciidoctor
|
|
516
516
|
# <https://github.com>
|
517
517
|
# link:https://github.com[]
|
518
518
|
# "https://github.com[]"
|
519
|
+
# (https://github.com) <= parenthesis not included in autolink
|
519
520
|
#
|
520
|
-
|
521
|
-
InlineLinkRx = %r((^|link:|#{CG_BLANK}|<|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://[^\s\[\]<]*([^\s.,\[\]<]))(?:\[(|#{CC_ALL}*?[^\\])\])?)m
|
521
|
+
InlineLinkRx = %r((^|link:|#{CG_BLANK}|<|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)\[(|#{CC_ALL}*?[^\\])\]|([^\s\[\]<]*([^\s,.?!\[\]<\)]))))m
|
522
522
|
|
523
523
|
# Match a link or e-mail inline macro.
|
524
524
|
#
|
@@ -568,23 +568,17 @@ module Asciidoctor
|
|
568
568
|
# Examples
|
569
569
|
#
|
570
570
|
# +text+
|
571
|
-
#
|
571
|
+
# [x-]+text+
|
572
|
+
# [x-]`text`
|
573
|
+
# `text` (compat only)
|
574
|
+
# [role]`text` (compat only)
|
572
575
|
#
|
573
576
|
# NOTE we always capture the attributes so we know when to use compatible (i.e., legacy) behavior
|
574
577
|
InlinePassRx = {
|
575
|
-
false => ['+', '
|
576
|
-
true
|
578
|
+
false => ['+', '-]', /((?:^|[^#{CC_WORD};:\\])(?=(\[)|\+)|\\(?=\[)|(?=\\\+))(?:\2(x-|[^\]]+ x-)\]|(?:\[([^\]]+)\])?(?=(\\)?\+))(\5?(\+|`)(\S|\S#{CC_ALL}*?\S)\7)(?!#{CG_WORD})/m],
|
579
|
+
true => ['`', nil, /(^|[^`#{CC_WORD}])(?:(\Z)()|\[([^\]]+)\](?=(\\))?)?(\5?(`)([^`\s]|[^`\s]#{CC_ALL}*?\S)\7)(?![`#{CC_WORD}])/m],
|
577
580
|
}
|
578
581
|
|
579
|
-
# Matches an inline plus passthrough spanning multiple lines, but only when it occurs directly
|
580
|
-
# inside constrained monospaced formatting in non-compat mode.
|
581
|
-
#
|
582
|
-
# Examples
|
583
|
-
#
|
584
|
-
# +text+
|
585
|
-
#
|
586
|
-
SinglePlusInlinePassRx = /^(\\)?\+(\S|\S#{CC_ALL}*?\S)\+$/m
|
587
|
-
|
588
582
|
# Matches several variants of the passthrough inline macro, which may span multiple lines.
|
589
583
|
#
|
590
584
|
# Examples
|
@@ -716,7 +710,11 @@ module Asciidoctor
|
|
716
710
|
#
|
717
711
|
# not c:/sample.adoc or c:\sample.adoc
|
718
712
|
#
|
719
|
-
|
713
|
+
if RUBY_ENGINE == 'opal'
|
714
|
+
UriSniffRx = %r(^#{CG_ALPHA}[#{CC_ALNUM}.+-]+:/{0,2})
|
715
|
+
else
|
716
|
+
UriSniffRx = %r(\A#{CG_ALPHA}[#{CC_ALNUM}.+-]+:/{0,2})
|
717
|
+
end
|
720
718
|
|
721
719
|
# Detects XML tags
|
722
720
|
XmlSanitizeRx = /<[^>]+>/
|
@@ -526,9 +526,9 @@ module Substitutors
|
|
526
526
|
if found_colon && (text.include? '://')
|
527
527
|
# inline urls, target[text] (optionally prefixed with link: and optionally surrounded by <>)
|
528
528
|
text = text.gsub InlineLinkRx do
|
529
|
-
if (target = $2).start_with? RS
|
529
|
+
if (target = $2 + ($3 || $5)).start_with? RS
|
530
530
|
# honor the escape
|
531
|
-
next
|
531
|
+
next ($&.slice 0, (rs_idx = $1.length)) + ($&.slice rs_idx + 1, $&.length)
|
532
532
|
end
|
533
533
|
|
534
534
|
prefix, suffix = $1, ''
|
@@ -543,15 +543,7 @@ module Substitutors
|
|
543
543
|
when 'link:', ?", ?'
|
544
544
|
next $&
|
545
545
|
end
|
546
|
-
case $
|
547
|
-
when ')', '?', '!'
|
548
|
-
target = target.chop
|
549
|
-
if (suffix = $3) == ')' && (target.end_with? '.', '?', '!')
|
550
|
-
suffix = target[-1] + suffix
|
551
|
-
target = target.chop
|
552
|
-
end
|
553
|
-
# NOTE handle case when modified target is a URI scheme (e.g., http://)
|
554
|
-
next $& if target.end_with? '://'
|
546
|
+
case $6
|
555
547
|
when ';'
|
556
548
|
if (prefix.start_with? '<') && (target.end_with? '>')
|
557
549
|
# move surrounding <> out of URL
|
@@ -755,7 +747,7 @@ module Substitutors
|
|
755
747
|
|
756
748
|
if doc.compat_mode
|
757
749
|
fragment = refid
|
758
|
-
elsif (hash_idx = refid.index '#')
|
750
|
+
elsif (hash_idx = refid.index '#') && refid[hash_idx - 1] != '&'
|
759
751
|
if hash_idx > 0
|
760
752
|
if (fragment_len = refid.length - 1 - hash_idx) > 0
|
761
753
|
path, fragment = (refid.slice 0, hash_idx), (refid.slice hash_idx + 1, fragment_len)
|
@@ -1027,11 +1019,17 @@ module Substitutors
|
|
1027
1019
|
next %(#{$1}[#{attrlist}]#{RS * (escape_count - 1)}#{boundary}#{$5}#{boundary})
|
1028
1020
|
elsif $1 == RS
|
1029
1021
|
preceding = %([#{attrlist}])
|
1030
|
-
|
1031
|
-
if
|
1022
|
+
elsif boundary == '++'
|
1023
|
+
if attrlist == 'x-'
|
1024
|
+
old_behavior = true
|
1025
|
+
attributes = {}
|
1026
|
+
elsif attrlist.end_with? ' x-'
|
1032
1027
|
old_behavior = true
|
1033
|
-
|
1028
|
+
attributes = parse_quoted_text_attributes attrlist.slice 0, attrlist.length - 3
|
1029
|
+
else
|
1030
|
+
attributes = parse_quoted_text_attributes attrlist
|
1034
1031
|
end
|
1032
|
+
else
|
1035
1033
|
attributes = parse_quoted_text_attributes attrlist
|
1036
1034
|
end
|
1037
1035
|
elsif (escape_count = $3.length) > 0
|
@@ -1066,41 +1064,43 @@ module Substitutors
|
|
1066
1064
|
pass_inline_char1, pass_inline_char2, pass_inline_rx = InlinePassRx[compat_mode]
|
1067
1065
|
text = text.gsub pass_inline_rx do
|
1068
1066
|
preceding = $1
|
1069
|
-
attrlist = $
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1067
|
+
attrlist = $4 || $3
|
1068
|
+
escaped = true if $5
|
1069
|
+
quoted_text = $6
|
1070
|
+
format_mark = $7
|
1071
|
+
content = $8
|
1073
1072
|
|
1074
1073
|
if compat_mode
|
1075
1074
|
old_behavior = true
|
1076
|
-
elsif
|
1077
|
-
|
1075
|
+
elsif attrlist && (attrlist == 'x-' || (attrlist.end_with? ' x-'))
|
1076
|
+
old_behavior = old_behavior_forced = true
|
1078
1077
|
end
|
1079
1078
|
|
1080
1079
|
if attrlist
|
1081
|
-
if
|
1082
|
-
next extract_inner_passthrough content, %(#{preceding}[#{attrlist}]#{escape_mark})
|
1083
|
-
elsif escape_mark
|
1080
|
+
if escaped
|
1084
1081
|
# honor the escape of the formatting mark
|
1085
1082
|
next %(#{preceding}[#{attrlist}]#{quoted_text.slice 1, quoted_text.length})
|
1086
1083
|
elsif preceding == RS
|
1087
1084
|
# honor the escape of the attributes
|
1085
|
+
next %(#{preceding}[#{attrlist}]#{quoted_text}) if old_behavior_forced && format_mark == '`'
|
1088
1086
|
preceding = %([#{attrlist}])
|
1087
|
+
elsif old_behavior_forced
|
1088
|
+
attributes = attrlist == 'x-' ? {} : (parse_quoted_text_attributes attrlist.slice 0, attrlist.length - 3)
|
1089
1089
|
else
|
1090
1090
|
attributes = parse_quoted_text_attributes attrlist
|
1091
1091
|
end
|
1092
|
-
elsif
|
1093
|
-
next extract_inner_passthrough content, %(#{preceding}#{escape_mark})
|
1094
|
-
elsif escape_mark
|
1092
|
+
elsif escaped
|
1095
1093
|
# honor the escape of the formatting mark
|
1096
1094
|
next %(#{preceding}#{quoted_text.slice 1, quoted_text.length})
|
1095
|
+
elsif compat_mode && preceding == RS
|
1096
|
+
next quoted_text
|
1097
1097
|
end
|
1098
1098
|
|
1099
1099
|
if compat_mode
|
1100
1100
|
passthrus[passthru_key = passthrus.size] = { text: content, subs: BASIC_SUBS, attributes: attributes, type: :monospaced }
|
1101
1101
|
elsif attributes
|
1102
1102
|
if old_behavior
|
1103
|
-
subs =
|
1103
|
+
subs = format_mark == '`' ? BASIC_SUBS : NORMAL_SUBS
|
1104
1104
|
passthrus[passthru_key = passthrus.size] = { text: content, subs: subs, attributes: attributes, type: :monospaced }
|
1105
1105
|
else
|
1106
1106
|
passthrus[passthru_key = passthrus.size] = { text: content, subs: BASIC_SUBS, attributes: attributes, type: :unquoted }
|
@@ -1399,20 +1399,6 @@ module Substitutors
|
|
1399
1399
|
end.join LF)
|
1400
1400
|
end
|
1401
1401
|
|
1402
|
-
# Internal: Extract nested single-plus passthrough; otherwise return unprocessed
|
1403
|
-
def extract_inner_passthrough text, pre
|
1404
|
-
if (text.end_with? '+') && (text.start_with? '+', '\+') && SinglePlusInlinePassRx =~ text
|
1405
|
-
if $1
|
1406
|
-
%(#{pre}`+#{$2}+`)
|
1407
|
-
else
|
1408
|
-
@passthroughs[passthru_key = @passthroughs.size] = { text: $2, subs: BASIC_SUBS }
|
1409
|
-
%(#{pre}`#{PASS_START}#{passthru_key}#{PASS_END}`)
|
1410
|
-
end
|
1411
|
-
else
|
1412
|
-
%(#{pre}`#{text}`)
|
1413
|
-
end
|
1414
|
-
end
|
1415
|
-
|
1416
1402
|
# Internal: Convert a quoted text region
|
1417
1403
|
#
|
1418
1404
|
# match - The MatchData for the quoted text region
|
@@ -25,7 +25,7 @@ class SyntaxHighlighter::HighlightJsAdapter < SyntaxHighlighter::Base
|
|
25
25
|
#{(doc.attr? 'highlightjs-languages') ? ((doc.attr 'highlightjs-languages').split ',').map {|lang| %[<script src="#{base_url}/languages/#{lang.lstrip}.min.js"></script>\n] }.join : ''}<script>
|
26
26
|
if (!hljs.initHighlighting.called) {
|
27
27
|
hljs.initHighlighting.called = true
|
28
|
-
;[].slice.call(document.querySelectorAll('pre.highlight > code')).forEach(function (el) { hljs.highlightBlock(el) })
|
28
|
+
;[].slice.call(document.querySelectorAll('pre.highlight > code[data-lang]')).forEach(function (el) { hljs.highlightBlock(el) })
|
29
29
|
}
|
30
30
|
</script>)
|
31
31
|
end
|
data/lib/asciidoctor/version.rb
CHANGED
data/man/asciidoctor.1
CHANGED
@@ -252,15 +252,15 @@ Jason Porter wrote the first implementation of the CLI interface provided by thi
|
|
252
252
|
\fBProject documentation:\fP \c
|
253
253
|
.URL "https://docs.asciidoctor.org" "" ""
|
254
254
|
.sp
|
255
|
+
\fBCommunity chat:\fP \c
|
256
|
+
.URL "https://chat.asciidoctor.org" "" ""
|
257
|
+
.sp
|
255
258
|
\fBSource repository:\fP \c
|
256
259
|
.URL "https://github.com/asciidoctor/asciidoctor" "" ""
|
257
260
|
.sp
|
258
|
-
\
|
259
|
-
.URL "https://asciidoctor.zulipchat.com" "" ""
|
260
|
-
.sp
|
261
|
-
\fBDiscussion list:\fP \c
|
261
|
+
\fBMailing list archive:\fP \c
|
262
262
|
.URL "https://discuss.asciidoctor.org" "" ""
|
263
263
|
.SH "COPYING"
|
264
264
|
.sp
|
265
265
|
Copyright (C) 2012\-present Dan Allen, Sarah White, Ryan Waldron, and the individual contributors to Asciidoctor.
|
266
|
-
Use of this software is granted under the terms of the MIT License.
|
266
|
+
Use of this software is granted under the terms of the MIT License.
|
data/man/asciidoctor.adoc
CHANGED
@@ -46,10 +46,11 @@ If _FILE_ is _-_ then the AsciiDoc source is read from standard input.
|
|
46
46
|
*-a, --attribute*=_ATTRIBUTE_::
|
47
47
|
Define, override, or unset a document attribute.
|
48
48
|
Command-line attributes take precedence over attributes defined in the source file unless either the name or value ends in _@_.
|
49
|
+
No substitutions are applied to the value.
|
49
50
|
+
|
50
51
|
_ATTRIBUTE_ is normally formatted as a key-value pair, in the form _NAME=VALUE_.
|
51
52
|
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).
|
52
|
-
|
53
|
+
A value containing spaces must be enclosed in quotes, in the form _NAME="VALUE WITH SPACES"_.
|
53
54
|
+
|
54
55
|
This option may be specified more than once.
|
55
56
|
|
@@ -190,11 +191,11 @@ Jason Porter wrote the first implementation of the CLI interface provided by thi
|
|
190
191
|
|
191
192
|
*Project documentation:* https://docs.asciidoctor.org
|
192
193
|
|
193
|
-
*
|
194
|
+
*Community chat:* https://chat.asciidoctor.org
|
194
195
|
|
195
|
-
*
|
196
|
+
*Source repository:* https://github.com/asciidoctor/asciidoctor
|
196
197
|
|
197
|
-
*
|
198
|
+
*Mailing list archive:* https://discuss.asciidoctor.org
|
198
199
|
|
199
200
|
== Copying
|
200
201
|
|
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.19
|
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:
|
16
|
+
date: 2018-03-20 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: concurrent-ruby
|
@@ -63,14 +63,14 @@ dependencies:
|
|
63
63
|
requirements:
|
64
64
|
- - "~>"
|
65
65
|
- !ruby/object:Gem::Version
|
66
|
-
version:
|
66
|
+
version: 6.1.0
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
69
|
version_requirements: !ruby/object:Gem::Requirement
|
70
70
|
requirements:
|
71
71
|
- - "~>"
|
72
72
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
73
|
+
version: 6.1.0
|
74
74
|
- !ruby/object:Gem::Dependency
|
75
75
|
name: minitest
|
76
76
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,14 +91,14 @@ dependencies:
|
|
91
91
|
requirements:
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version: 1.
|
94
|
+
version: 1.13.0
|
95
95
|
type: :development
|
96
96
|
prerelease: false
|
97
97
|
version_requirements: !ruby/object:Gem::Requirement
|
98
98
|
requirements:
|
99
99
|
- - "~>"
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: 1.
|
101
|
+
version: 1.13.0
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
103
|
name: rake
|
104
104
|
requirement: !ruby/object:Gem::Requirement
|
@@ -188,6 +188,7 @@ files:
|
|
188
188
|
- data/locale/attributes-sr.adoc
|
189
189
|
- data/locale/attributes-sr_Latn.adoc
|
190
190
|
- data/locale/attributes-sv.adoc
|
191
|
+
- data/locale/attributes-sw.adoc
|
191
192
|
- data/locale/attributes-th.adoc
|
192
193
|
- data/locale/attributes-tr.adoc
|
193
194
|
- data/locale/attributes-uk.adoc
|
@@ -254,7 +255,7 @@ licenses:
|
|
254
255
|
metadata:
|
255
256
|
bug_tracker_uri: https://github.com/asciidoctor/asciidoctor/issues
|
256
257
|
changelog_uri: https://github.com/asciidoctor/asciidoctor/blob/HEAD/CHANGELOG.adoc
|
257
|
-
mailing_list_uri:
|
258
|
+
mailing_list_uri: https://chat.asciidoctor.org
|
258
259
|
source_code_uri: https://github.com/asciidoctor/asciidoctor
|
259
260
|
post_install_message:
|
260
261
|
rdoc_options: []
|
@@ -271,7 +272,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
272
|
- !ruby/object:Gem::Version
|
272
273
|
version: '0'
|
273
274
|
requirements: []
|
274
|
-
rubygems_version: 3.
|
275
|
+
rubygems_version: 3.4.10
|
275
276
|
signing_key:
|
276
277
|
specification_version: 4
|
277
278
|
summary: An implementation of the AsciiDoc text processor and publishing toolchain
|