Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package rubygem-asciidoctor for 
openSUSE:Factory checked in at 2024-06-24 20:50:57
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rubygem-asciidoctor (Old)
 and      /work/SRC/openSUSE:Factory/.rubygem-asciidoctor.new.18349 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "rubygem-asciidoctor"

Mon Jun 24 20:50:57 2024 rev:12 rq:1182762 version:2.0.23

Changes:
--------
--- /work/SRC/openSUSE:Factory/rubygem-asciidoctor/rubygem-asciidoctor.changes  
2023-06-27 23:15:41.175045431 +0200
+++ 
/work/SRC/openSUSE:Factory/.rubygem-asciidoctor.new.18349/rubygem-asciidoctor.changes
       2024-06-24 20:51:55.061291974 +0200
@@ -1,0 +2,152 @@
+Fri Jun 21 09:18:33 UTC 2024 - Dan Čermák <dan.cer...@posteo.net>
+
+- 2.0.23:
+
+This is a patch release in the 2.0.x release line to fix bugs and deal with 
compliance issues.
+
+The primary bug fix in this release is to not duplicate the block attribute 
line above a detached block that breaks a dlist, which fixes the duplicate role 
warning on that detached block.
+The main compliance improvement is to encode spaces in mailto links using %20, 
in accordance with RFC 3986, instead of +.
+
+This release introduces several fixes and improvements related to parsing a 
table that has jagged rows.
+If the colspan of the last cell in a row, including the last row, exceeds the 
specified number of columns, only that row is dropped.
+On the other hand, if the last row is missing cells, an error message is 
logged to notify the author.
+
+If a URL is used as the target of an xref shorthand, the processor now treats 
the URL as a fragment identifier instead of crashing.
+
+Finally, repeating spaces in verbatim content in the manpage output are 
preserved.
+
+## Distribution
+
+- [RubyGem (asciidoctor)](https://rubygems.org/gems/asciidoctor)
+
+Asciidoctor is also packaged for 
[Fedora](https://apps.fedoraproject.org/packages/rubygem-asciidoctor), 
[Debian](https://packages.debian.org/sid/asciidoctor), 
[Ubuntu](https://packages.ubuntu.com/search?keywords=asciidoctor), [Alpine 
Linux](https://pkgs.alpinelinux.org/packages?name=asciidoctor), 
[OpenSUSE](https://software.opensuse.org/package/rubygem-asciidoctor), and 
[Homebrew](https://formulae.brew.sh/formula/asciidoctor). You can use the 
system's package manager to install the package named **asciidoctor**.
+
+## Changelog
+
+### Compliance
+
+* Encode spaces in mailto links as %20, in accordance with RFC 3986, instead 
of + (#4576)
+
+### Improvements
+
+* Log error when an incomplete row is detected at the end of a table (#4573)
+
+### Bug Fixes
+
+* Don't leave behind empty line inside skipped preprocessor conditional (#4580)
+* Don't duplicate block attribute line above detached block that breaks a 
dlist; fixes duplicate role on detached block (#4565)
+* Don't crash when parsing xref shorthand if target starts with URL protocol 
and text is offset by space (#4570)
+* Only drop current row if colspan of last cell exceeds specified number of 
columns (#4587)
+* Drop last row if colspan of last cell in table exceeds specified number of 
columns (#4587)
+* Preserve repeating spaces in verbatim content in manpage output (#3583)
+
+## Release meta
+
+Released on: 2024-05-17
+Released by: @mojavelinux
+Release beer: Marmot Passage by Two 22 Brew
+
+Logs: [resolved 
issues](https://github.com/asciidoctor/asciidoctor/issues?q=is%3Aissue+label%3Av2.0.23+is%3Aclosed)
 | [source 
diff](https://github.com/asciidoctor/asciidoctor/compare/v2.0.22...v2.0.23) | 
[gem diff](https://my.diffend.io/gems/asciidoctor/v2.0.22/v2.0.23)
+
+## Credits
+
+A very special thanks to all the **awesome** [supporters of the Asciidoctor 
OpenCollective campaign](https://opencollective.com/asciidoctor), who provide 
critical funding for the ongoing development of this project.
+
+2.0.22:
+
+This is a patch release in the 2.0.x release line to further compatibility 
with Ruby 3.3.
+
+The most critical fix in this release is to remove use of the base64 library 
since it will no longer being provided as part of the Ruby language starting 
with Ruby 3.4. When using Ruby 3.3, users would see a warning if this library 
is used, which happens when the data-uri attribute is set. The functionality 
has been replaced with a lower-level method on the String object (String#pack), 
which the base64 library delegates to anyway.
+
+This release also sets the cloaked-context attribute on a source block that is 
defined using either a styled paragraph or a literal or fenced code structural 
container. This matches the functionality used for custom block extensions 
(when the source context does not match the final parsed context).
+
+## Distribution
+
+- [RubyGem (asciidoctor)](https://rubygems.org/gems/asciidoctor)
+
+Asciidoctor is also packaged for 
[Fedora](https://apps.fedoraproject.org/packages/rubygem-asciidoctor), 
[Debian](https://packages.debian.org/sid/asciidoctor), 
[Ubuntu](https://packages.ubuntu.com/search?keywords=asciidoctor), [Alpine 
Linux](https://pkgs.alpinelinux.org/packages?name=asciidoctor), 
[OpenSUSE](https://software.opensuse.org/package/rubygem-asciidoctor), and 
[Homebrew](https://formulae.brew.sh/formula/asciidoctor). You can use the 
system's package manager to install the package named **asciidoctor**.
+
+## Changelog
+
+### Improvements
+
+* Set `cloaked-context` attribute on source block when context is not 
`:listing` (#4556)
+
+### Compliance
+
+* Remove use of base64 library to prevent warning in Ruby >= 3.3 (#4561)
+
+## Release meta
+
+Released on: 2024-03-08
+Released by: @mojavelinux
+Release beer: Turbo Laser by Resolute Brewing Company
+
+Logs: [resolved 
issues](https://github.com/asciidoctor/asciidoctor/issues?q=is%3Aissue+label%3Av2.0.22+is%3Aclosed)
 | [source 
diff](https://github.com/asciidoctor/asciidoctor/compare/v2.0.21...v2.0.22) | 
[gem diff](https://my.diffend.io/gems/asciidoctor/v2.0.21/v2.0.22)
+
+## Credits
+
+A very special thanks to all the **awesome** [supporters of the Asciidoctor 
OpenCollective campaign](https://opencollective.com/asciidoctor), who provide 
critical funding for the ongoing development of this project.
+
+2.0.21:
+
+This is a patch release in the 2.0.x release line, primarily to address 
compatibility with Ruby 3.3. While development of Asciidoctor 2.1 is beginning 
to pick up again, we extracted several other important improvements and bug 
fixes from main to include in this patch release.
+
+The most critical fix in this release is to make Asciidoctor's logger 
compatible with the logger API in Ruby 3.3. The code is now tested against Ruby 
3.3 on each change. Nearly as important, this release also turns off Ruby's 
system-dependent newline conversion when writing files so that Asciidoctor's 
output is consistent between *nix and Windows.
+
+Numerous changes were made to correct AsciiDoc parsing. A nested dlist 
attached using a list continuation no longer consumes a detached paragraph. And 
an attached block is correctly attached to a nested dlist when that dlist is 
offset from its parent by an empty line. The secondary and tertiary terms on 
the `indexterm` macro are preserved when the primary term is quoted and 
contains an equals sign. And a bare URL enclosed in angle brackets acts as 
unconstrained syntax that stops at the first occurrence of a closing angle 
bracket. When includes are not enabled, any spaces in the include target are 
preserved when generating the fallback link.
+
+Several changes were made to the DocBook output to address compliance. The 
abstract is moved inside the `<info>` tag (applies to both the abstract in the 
preamble as well an an abstract for a book part). The `scaledwidth` and `scale` 
attributes are now supported on an inline macro, like with a block image macro. 
+
+A few changes to the manpage output were made. Cells in the head row are 
styled as bold. Paragraph breaks in a normal table cell are preserved.
+
+Finally, a few refinements to the default stylesheet were applied. The extra 
border below the doctitle when the sidebar toc is collapsed into main content 
area was removed. And a text decoration was added to the active footnote number 
link in the footnotes list.
+
+## Distribution
+
+- [RubyGem (asciidoctor)](https://rubygems.org/gems/asciidoctor)
+
+Asciidoctor is also packaged for 
[Fedora](https://apps.fedoraproject.org/packages/rubygem-asciidoctor), 
[Debian](https://packages.debian.org/sid/asciidoctor), 
[Ubuntu](https://packages.ubuntu.com/search?keywords=asciidoctor), [Alpine 
Linux](https://pkgs.alpinelinux.org/packages?name=asciidoctor), 
[OpenSUSE](https://software.opensuse.org/package/rubygem-asciidoctor), and 
[Homebrew](https://formulae.brew.sh/formula/asciidoctor). You can use the 
system's package manager to install the package named **asciidoctor**.
+
+## Changelog
+
+### Compliance
+
+* Turn off system-dependent newline conversion when writing files; don't 
convert line feeds to system-dependent newline (#4550)
+* Support logger in Ruby 3.3 by instantiating super class (#4493) (*@mtasaka*)
+* Add support for `scaledwidth` and `scale` attributes on inline image macro 
in DocBook output (#4552)
+* Update latest Ruby to 3.3 in CI workflows
+
+### Improvements
+
+* Change title to doctitle in warning message about use of abstract to make 
subject more clear
+* Modify default stylesheet to add text decoration to active footnote number 
link in footnotes list (#4530) (@Larhzu)
+
+### Bug Fixes
+
+* Nested dlist attached using list continuation should not consume detached 
paragraph (#3535)
+* Don't break nested dlist with attached block if offset from parent list by 
empty line (#3693)
+* Preserve paragraph breaks in normal table cell in manpage output (#4481)
+* Style cells in head row as bold in manpage output (#4490)
+* Escape spaces in include target (using inline passthrough) when generating 
link from include directive (#4461)
+* Move abstract inside info tag in DocBook output (#3602)
+* Honor secondary and tertiary terms on `indexterm` macro when primary term is 
quoted and contains an equals sign (#3652)
+* Remove extra border below doctitle when sidebar toc is collapsed into main 
content area (#4523)
+* Treat bare URL enclosed in angle brackets as unconstrained syntax; only 
match until closing angled bracket (#4468)
+* Allow URL enclosed in angled brackets syntax to be escaped using backslash 
(#4468)
+
+## Release meta
+
+Released on: 2024-02-20
+Released by: @mojavelinux
+Release beer: Lunch by Maine Beer Company
+
+Logs: [resolved 
issues](https://github.com/asciidoctor/asciidoctor/issues?q=is%3Aissue+label%3Av2.0.21+is%3Aclosed)
 | [source 
diff](https://github.com/asciidoctor/asciidoctor/compare/v2.0.20...v2.0.21) | 
[gem diff](https://my.diffend.io/gems/asciidoctor/v2.0.20/v2.0.21)
+
+## Credits
+
+A very special thanks to all the **awesome** [supporters of the Asciidoctor 
OpenCollective campaign](https://opencollective.com/asciidoctor), who provide 
critical funding for the ongoing development of this project.
+
+
+
+-------------------------------------------------------------------

Old:
----
  asciidoctor-2.0.20.gem

New:
----
  asciidoctor-2.0.23.gem

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ rubygem-asciidoctor.spec ++++++
--- /var/tmp/diff_new_pack.8mzTM8/_old  2024-06-24 20:51:55.729316392 +0200
+++ /var/tmp/diff_new_pack.8mzTM8/_new  2024-06-24 20:51:55.729316392 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package rubygem-asciidoctor
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -24,11 +24,10 @@
 #
 
 Name:           rubygem-asciidoctor
-Version:        2.0.20
+Version:        2.0.23
 Release:        0
 %define mod_name asciidoctor
 %define mod_full_name %{mod_name}-%{version}
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 BuildRequires:  %{rubygem gem2rpm}
 BuildRequires:  %{ruby}
 BuildRequires:  ruby-macros >= 5
@@ -38,7 +37,6 @@
 Source1:        gem2rpm.yml
 Summary:        An implementation of the AsciiDoc text processor and publishing
 License:        MIT
-Group:          Development/Languages/Ruby
 PreReq:         update-alternatives
 
 %description

++++++ asciidoctor-2.0.20.gem -> asciidoctor-2.0.23.gem ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CHANGELOG.adoc new/CHANGELOG.adoc
--- old/CHANGELOG.adoc  2018-03-20 01:00:00.000000000 +0100
+++ new/CHANGELOG.adoc  2018-03-20 01:00:00.000000000 +0100
@@ -16,6 +16,75 @@
 This project utilizes semantic versioning.
 
 // tag::compact[]
+== 2.0.23 (2024-05-17) - @mojavelinux
+
+Compliance::
+
+  * Encode spaces in mailto links as %20, in accordance with RFC 3986, instead 
of + (#4576)
+
+Improvements::
+
+  * Log error when an incomplete row is detected at the end of a table (#4573)
+
+Bug Fixes::
+
+  * Don't leave behind empty line inside skipped preprocessor conditional 
(#4580)
+  * Don't duplicate block attribute line above detached block that breaks a 
dlist; fixes duplicate role on detached block (#4565)
+  * Don't crash when parsing xref shorthand if target starts with URL protocol 
and text is offset by space (#4570)
+  * Only drop current row if colspan of last cell exceeds specified number of 
columns (#4587)
+  * Drop last row if colspan of last cell in table exceeds specified number of 
columns (#4587)
+  * Preserve repeating spaces in verbatim content in manpage output (#3583)
+
+=== Details
+
+{url-repo}/releases/tag/v2.0.23[git tag] | 
{url-repo}/compare/v2.0.22\...v2.0.23[full diff]
+// end::compact[]
+
+== 2.0.22 (2024-03-08) - @mojavelinux
+
+Improvements::
+
+  * Set `cloaked-context` attribute on source block when context is not 
`:listing` (#4556)
+
+Compliance::
+
+  * Remove use of base64 library to prevent warning in Ruby >= 3.3 (#4561)
+
+=== Details
+
+{url-repo}/releases/tag/v2.0.22[git tag] | 
{url-repo}/compare/v2.0.21\...v2.0.22[full diff]
+
+== 2.0.21 (2024-02-20) - @mojavelinux
+
+Compliance::
+
+  * Turn off system-dependent newline conversion when writing files; don't 
convert line feeds to system-dependent newline (#4550)
+  * Support logger in Ruby 3.3 by instantiating super class (#4493) 
(*@mtasaka*)
+  * Add support for `scaledwidth` and `scale` attributes on inline image macro 
in DocBook output (#4552)
+  * Update latest Ruby to 3.3 in CI workflows
+
+Improvements::
+
+  * Change title to doctitle in warning message about use of abstract to make 
subject more clear
+  * Modify default stylesheet to add text decoration to active footnote number 
link in footnotes list (#4530) (@Larhzu)
+
+Bug Fixes::
+
+  * Nested dlist attached using list continuation should not consume detached 
paragraph (#3535)
+  * Don't break nested dlist with attached block if offset from parent list by 
empty line (#3693)
+  * Preserve paragraph breaks in normal table cell in manpage output (#4481)
+  * Style cells in head row as bold in manpage output (#4490)
+  * Escape spaces in include target (using inline passthrough) when generating 
link from include directive (#4461)
+  * Move abstract inside info tag in DocBook output (#3602)
+  * Honor secondary and tertiary terms on `indexterm` macro when primary term 
is quoted and contains an equals sign (#3652)
+  * Remove extra border below doctitle when sidebar toc is collapsed into main 
content area (#4523)
+  * Treat bare URL enclosed in angle brackets as unconstrained syntax; only 
match until closing angled bracket (#4468)
+  * Allow URL enclosed in angled brackets syntax to be escaped using backslash 
(#4468)
+
+=== Details
+
+{url-repo}/releases/tag/v2.0.21[git tag] | 
{url-repo}/compare/v2.0.20\...v2.0.21[full diff]
+
 == 2.0.20 (2023-05-18) - @mojavelinux
 
 Bug Fixes::
@@ -26,7 +95,6 @@
 === Details
 
 {url-repo}/releases/tag/v2.0.20[git tag] | 
{url-repo}/compare/v2.0.19\...v2.0.20[full diff]
-// end::compact[]
 
 == 2.0.19 (2023-05-17) - @mojavelinux
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README-de.adoc new/README-de.adoc
--- old/README-de.adoc  2018-03-20 01:00:00.000000000 +0100
+++ new/README-de.adoc  2018-03-20 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 = Asciidoctor
 Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White 
<https://github.com/graphitefriction[@graphitefriction]>
-v2.0.20, 2023-05-18
+v2.0.23, 2024-05-17
 // settings:
 :idprefix:
 :idseparator: -
@@ -16,7 +16,7 @@
 :warning-caption: :warning:
 endif::[]
 // Variables:
-:release-version: 2.0.20
+:release-version: 2.0.23
 // URIs:
 :uri-org: https://github.com/asciidoctor
 :uri-repo: {uri-org}/asciidoctor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README-fr.adoc new/README-fr.adoc
--- old/README-fr.adoc  2018-03-20 01:00:00.000000000 +0100
+++ new/README-fr.adoc  2018-03-20 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 = Asciidoctor
 Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White 
<https://github.com/graphitefriction[@graphitefriction]>
-v2.0.20, 2023-05-18
+v2.0.23, 2024-05-17
 // settings:
 :idprefix:
 :idseparator: -
@@ -16,7 +16,7 @@
 :warning-caption: :warning:
 endif::[]
 // Variables:
-:release-version: 2.0.20
+:release-version: 2.0.23
 // URIs:
 :uri-org: https://github.com/asciidoctor
 :uri-repo: {uri-org}/asciidoctor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README-jp.adoc new/README-jp.adoc
--- old/README-jp.adoc  2018-03-20 01:00:00.000000000 +0100
+++ new/README-jp.adoc  2018-03-20 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 = Asciidoctor
 Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White 
<https://github.com/graphitefriction[@graphitefriction]>
-v2.0.20, 2023-05-18
+v2.0.23, 2024-05-17
 // settings:
 :idprefix:
 :idseparator: -
@@ -16,7 +16,7 @@
 :warning-caption: :warning:
 endif::[]
 // Variables:
-:release-version: 2.0.20
+:release-version: 2.0.23
 // URIs:
 :uri-org: https://github.com/asciidoctor
 :uri-repo: {uri-org}/asciidoctor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README-zh_CN.adoc new/README-zh_CN.adoc
--- old/README-zh_CN.adoc       2018-03-20 01:00:00.000000000 +0100
+++ new/README-zh_CN.adoc       2018-03-20 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 = Asciidoctor
 Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White 
<https://github.com/graphitefriction[@graphitefriction]>
-v2.0.20, 2023-05-18
+v2.0.23, 2024-05-17
 // settings:
 :page-layout: base
 :idprefix:
@@ -17,7 +17,7 @@
 :warning-caption: :warning:
 endif::[]
 // Variables:
-:release-version: 2.0.20
+:release-version: 2.0.23
 // URIs:
 :uri-org: https://github.com/asciidoctor
 :uri-repo: {uri-org}/asciidoctor
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/README.adoc new/README.adoc
--- old/README.adoc     2018-03-20 01:00:00.000000000 +0100
+++ new/README.adoc     2018-03-20 01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
 = Asciidoctor
 Dan Allen <https://github.com/mojavelinux[@mojavelinux]>; Sarah White 
<https://github.com/graphitefriction[@graphitefriction]>
-v2.0.20, 2023-05-18
+v2.0.23, 2024-05-17
 // settings:
 :idprefix:
 :idseparator: -
@@ -16,7 +16,7 @@
 :warning-caption: :warning:
 endif::[]
 // Variables:
-:release-version: 2.0.20
+:release-version: 2.0.23
 // URLs:
 :url-org: https://github.com/asciidoctor
 :url-repo: {url-org}/asciidoctor
@@ -130,7 +130,7 @@
 
 Asciidoctor works on Linux, macOS and Windows and requires one of the 
following implementations of {url-ruby}[Ruby]:
 
-* CRuby (aka MRI) 2.3 - 3.2
+* CRuby (aka MRI) 2.3 - 3.3
 * JRuby 9.1 - 9.4
 * TruffleRuby (GraalVM)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/asciidoctor.gemspec new/asciidoctor.gemspec
--- old/asciidoctor.gemspec     2018-03-20 01:00:00.000000000 +0100
+++ new/asciidoctor.gemspec     2018-03-20 01:00:00.000000000 +0100
@@ -39,7 +39,7 @@
   # erubi is needed for testing alternate eRuby impls
   s.add_development_dependency 'erubi', '~> 1.10.0'
   s.add_development_dependency 'haml', '~> 6.1.0'
-  s.add_development_dependency 'minitest', '~> 5.14.0'
+  s.add_development_dependency 'minitest', '~> 5.22.0'
   s.add_development_dependency 'nokogiri', '~> 1.13.0'
   s.add_development_dependency 'rake', '~> 12.3.0'
   s.add_development_dependency 'slim', '~> 4.1.0'
Binary files old/checksums.yaml.gz and new/checksums.yaml.gz differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/data/reference/syntax.adoc 
new/data/reference/syntax.adoc
--- old/data/reference/syntax.adoc      2018-03-20 01:00:00.000000000 +0100
+++ new/data/reference/syntax.adoc      2018-03-20 01:00:00.000000000 +0100
@@ -112,7 +112,7 @@
 
 .Some Authors
 [circle]
-- Edgar Allen Poe
+- Edgar Allan Poe
 - Sheri S. Tepper
 - Bill Bryson
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/data/stylesheets/asciidoctor-default.css 
new/data/stylesheets/asciidoctor-default.css
--- old/data/stylesheets/asciidoctor-default.css        2018-03-20 
01:00:00.000000000 +0100
+++ new/data/stylesheets/asciidoctor-default.css        2018-03-20 
01:00:00.000000000 +0100
@@ -130,7 +130,7 @@
 #content::before{content:none}
 
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
 #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
-#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px 
solid #dddddf;padding-bottom:8px}
+#header>h1:only-child{border-bottom:1px solid #dddddf;padding-bottom:8px}
 #header .details{border-bottom:1px solid 
#dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:flex;flex-flow:row
 wrap}
 #header .details span:first-child{margin-left:-.125em}
 #header .details span.email a{color:rgba(0,0,0,.85)}
@@ -152,6 +152,7 @@
 #toctitle{color:#7a2518;font-size:1.2em}
 @media screen and (min-width:768px){#toctitle{font-size:1.375em}
 body.toc2{padding-left:15em;padding-right:0}
+body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid 
#dddddf;padding-bottom:8px}
 
#toc.toc2{margin-top:0!important;background:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px
 solid 
#e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em
 1em;height:100%;overflow:auto}
 #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
 #toc.toc2>ul{font-size:.9em;margin-bottom:0}
@@ -317,7 +318,7 @@
 a.image object{pointer-events:none}
 
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
 sup.footnote a,sup.footnoteref a{text-decoration:none}
-sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
+sup.footnote a:active,sup.footnoteref a:active,#footnotes .footnote 
a:first-of-type:active{text-decoration:underline}
 #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
 #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 
.75em;border-width:1px 0 0}
 #footnotes .footnote{padding:0 .375em 0 
.225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/abstract_node.rb 
new/lib/asciidoctor/abstract_node.rb
--- old/lib/asciidoctor/abstract_node.rb        2018-03-20 01:00:00.000000000 
+0100
+++ new/lib/asciidoctor/abstract_node.rb        2018-03-20 01:00:00.000000000 
+0100
@@ -354,8 +354,8 @@
   #
   # First, and foremost, the target image path is cleaned if the document safe 
mode level
   # is set to at least SafeMode::SAFE (a condition which is true by default) 
to prevent access
-  # to ancestor paths in the filesystem. The image data is then read and 
converted to
-  # Base64. Finally, a data URI is built which can be used in an image tag.
+  # to ancestor paths in the filesystem. The image data is then read and 
converted to base64.
+  # Finally, a data URI is built which can be used in an image tag.
   #
   # target_image - A String path to the target image
   # asset_dir_key - The String attribute key used to lookup the directory where
@@ -376,8 +376,8 @@
     end
 
     if ::File.readable? image_path
-      # NOTE base64 is autoloaded by reference to ::Base64
-      %(data:#{mimetype};base64,#{::Base64.strict_encode64 ::File.binread 
image_path})
+      # NOTE pack 'm0' is equivalent to Base64.strict_encode64
+      %(data:#{mimetype};base64,#{[(::File.binread image_path)].pack 'm0'})
     else
       logger.warn %(image to embed not found or not readable: #{image_path})
       %(data:#{mimetype};base64,)
@@ -410,8 +410,8 @@
 
     begin
       mimetype, bindata = ::OpenURI.open_uri(image_uri, URI_READ_MODE) {|f| 
[f.content_type, f.read] }
-      # NOTE base64 is autoloaded by reference to ::Base64
-      %(data:#{mimetype};base64,#{::Base64.strict_encode64 bindata})
+      # NOTE pack 'm0' is equivalent to Base64.strict_encode64
+      %(data:#{mimetype};base64,#{[bindata].pack 'm0'})
     rescue
       logger.warn %(could not retrieve image data from URI: #{image_uri})
       image_uri
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/converter/docbook5.rb 
new/lib/asciidoctor/converter/docbook5.rb
--- old/lib/asciidoctor/converter/docbook5.rb   2018-03-20 01:00:00.000000000 
+0100
+++ new/lib/asciidoctor/converter/docbook5.rb   2018-03-20 01:00:00.000000000 
+0100
@@ -44,7 +44,8 @@
     end
     root_tag_idx = result.size
     id = node.id
-    result << (document_info_tag node) unless node.noheader
+    abstract = find_root_abstract node
+    result << (document_info_tag node, abstract) unless node.noheader
     if manpage
       result << '<refentry>'
       result << '<refmeta>'
@@ -61,7 +62,9 @@
     unless (docinfo_content = node.docinfo :header).empty?
       result << docinfo_content
     end
-    result << node.content if node.blocks?
+    abstract = extract_abstract node, abstract if abstract
+    result << (node.blocks.map {|block| block.convert }.compact.join LF) if 
node.blocks?
+    restore_abstract abstract if abstract
     unless (docinfo_content = node.docinfo :footer).empty?
       result << docinfo_content
     end
@@ -73,7 +76,15 @@
     result.join LF
   end
 
-  alias convert_embedded content_only
+  def convert_embedded node
+    # NOTE in DocBook 5, the root abstract must be in the info tag and is thus 
not part of the body
+    if @backend == 'docbook5' && (abstract = find_root_abstract node)
+      abstract = extract_abstract node, abstract
+    end
+    result = node.blocks.map {|block| block.convert }.compact.join LF
+    restore_abstract abstract if abstract
+    result
+  end
 
   def convert_section node
     if node.document.doctype == 'manpage'
@@ -183,27 +194,11 @@
   end
 
   def convert_image node
-    # NOTE according to the DocBook spec, content area, scaling, and scaling 
to fit are mutually exclusive
-    # See http://tdg.docbook.org/tdg/4.5/imagedata-x.html#d0e79635
-    if node.attr? 'scaledwidth'
-      width_attribute = %( width="#{node.attr 'scaledwidth'}")
-      depth_attribute = ''
-      scale_attribute = ''
-    elsif node.attr? 'scale'
-      # QUESTION should we set the viewport using width and depth? (the scaled 
image would be contained within this box)
-      #width_attribute = (node.attr? 'width') ? %( width="#{node.attr 
'width'}") : ''
-      #depth_attribute = (node.attr? 'height') ? %( depth="#{node.attr 
'height'}") : ''
-      scale_attribute = %( scale="#{node.attr 'scale'}")
-    else
-      width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 
'width'}") : ''
-      depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 
'height'}") : ''
-      scale_attribute = ''
-    end
     align_attribute = (node.attr? 'align') ? %( align="#{node.attr 'align'}") 
: ''
 
     mediaobject = %(<mediaobject>
 <imageobject>
-<imagedata fileref="#{node.image_uri(node.attr 
'target')}"#{width_attribute}#{depth_attribute}#{scale_attribute}#{align_attribute}/>
+<imagedata fileref="#{node.image_uri node.attr 
'target'}"#{image_size_attributes node.attributes}#{align_attribute}/>
 </imageobject>
 <textobject><phrase>#{node.alt}</phrase></textobject>
 </mediaobject>)
@@ -308,13 +303,17 @@
   def convert_open node
     case node.style
     when 'abstract'
-      if node.parent == node.document && node.document.doctype == 'book'
-        logger.warn 'abstract block cannot be used in a document without a 
title when doctype is book. Excluding block content.'
+      if (parent = node.parent) == node.document && node.document.doctype == 
'book'
+        logger.warn 'abstract block cannot be used in a document without a 
doctitle when doctype is book. Excluding block content.'
         ''
       else
-        %(<abstract>
+        result = %(<abstract>
 #{title_tag node}#{enclose_content node}
 </abstract>)
+        if @backend == 'docbook5' && !(node.option? 'root') && (parent.context 
== :open ? parent.style == 'partintro' : parent.context == :section && 
parent.sectname == 'partintro') && node == parent.blocks[0]
+          result = %(<info>\n#{result}\n</info>)
+        end
+        result
       end
     when 'partintro'
       if node.level == 0 && node.parent.context == :section && 
node.document.doctype == 'book'
@@ -536,11 +535,9 @@
   end
 
   def convert_inline_image node
-    width_attribute = (node.attr? 'width') ? %( contentwidth="#{node.attr 
'width'}") : ''
-    depth_attribute = (node.attr? 'height') ? %( contentdepth="#{node.attr 
'height'}") : ''
     %(<inlinemediaobject#{common_attributes nil, node.role}>
 <imageobject>
-<imagedata fileref="#{node.type == 'icon' ? (node.icon_uri node.target) : 
(node.image_uri node.target)}"#{width_attribute}#{depth_attribute}/>
+<imagedata fileref="#{node.type == 'icon' ? (node.icon_uri node.target) : 
(node.image_uri node.target)}"#{image_size_attributes node.attributes}/>
 </imageobject>
 <textobject><phrase>#{node.alt}</phrase></textobject>
 </inlinemediaobject>)
@@ -648,6 +645,23 @@
     end
   end
 
+  def image_size_attributes attributes
+    # NOTE according to the DocBook spec, content area, scaling, and scaling 
to fit are mutually exclusive
+    # See http://tdg.docbook.org/tdg/4.5/imagedata-x.html#d0e79635
+    if attributes.key? 'scaledwidth'
+      %( width="#{attributes['scaledwidth']}")
+    elsif attributes.key? 'scale'
+      # QUESTION should we set the viewport using width and depth? (the scaled 
image would be contained within this box)
+      #width_attribute = (attributes.key? 'width') ? %( 
width="#{attributes['width']}") : ''
+      #depth_attribute = (attributes.key? 'height') ? %( 
depth="#{attributes['height']}") : ''
+      %( scale="#{attributes['scale']}")
+    else
+      width_attribute = (attributes.key? 'width') ? %( 
contentwidth="#{attributes['width']}") : ''
+      depth_attribute = (attributes.key? 'height') ? %( 
contentdepth="#{attributes['height']}") : ''
+      %(#{width_attribute}#{depth_attribute})
+    end
+  end
+
   def author_tag doc, author
     result = []
     result << '<author>'
@@ -661,7 +675,7 @@
     result.join LF
   end
 
-  def document_info_tag doc
+  def document_info_tag doc, abstract
     result = ['<info>']
     unless doc.notitle
       if (title = doc.doctitle partition: true, use_fallback: true).subtitle?
@@ -715,11 +729,37 @@
         result << docinfo_content
       end
     end
+    if abstract
+      abstract.set_option 'root'
+      result << (convert abstract, abstract.node_name)
+      abstract.remove_attr 'root-option'
+    end
     result << '</info>'
 
     result.join LF
   end
 
+  def find_root_abstract doc
+    return unless doc.blocks?
+    if (first_block = doc.blocks[0]).context == :preamble
+      return unless (first_block = first_block.blocks[0])
+    elsif first_block.context == :section
+      return first_block if first_block.sectname == 'abstract'
+      return unless first_block.sectname == 'preface' && (first_block = 
first_block.blocks[0])
+    end
+    return first_block if first_block.style == 'abstract' && 
first_block.context == :open
+  end
+
+  def extract_abstract document, abstract
+    parent = abstract.parent
+    parent = parent.parent while parent != document && parent.blocks.length == 
1
+    parent.blocks.delete_at 0
+  end
+
+  def restore_abstract abstract
+    abstract.parent.blocks.insert 0, abstract
+  end
+
   def get_root_document node
     while (node = node.document).nested?
       node = node.parent_document
@@ -742,26 +782,18 @@
 
   def cover_tag doc, face, use_placeholder = false
     if (cover_image = doc.attr %(#{face}-cover-image))
-      width_attr = ''
-      depth_attr = ''
       if (cover_image.include? ':') && ImageMacroRx =~ cover_image
-        attrlist = $2
-        cover_image = doc.image_uri $1
-        if attrlist
-          attrs = (AttributeList.new attrlist).parse ['alt', 'width', 'height']
-          if attrs.key? 'scaledwidth'
-            # NOTE scalefit="1" is the default in this case
-            width_attr = %( width="#{attrs['scaledwidth']}")
-          else
-            width_attr = %( contentwidth="#{attrs['width']}") if attrs.key? 
'width'
-            depth_attr = %( contentdepth="#{attrs['height']}") if attrs.key? 
'height'
-          end
-        end
+        target, attrlist = $1, $2
+        cover_image = doc.image_uri target
+        # NOTE scalefit="1" is the default for a cover image
+        size_attrs = image_size_attributes (AttributeList.new attrlist).parse 
%w(alt width height) if attrlist
+      else
+        size_attrs = ''
       end
       %(<cover role="#{face}">
 <mediaobject>
 <imageobject>
-<imagedata fileref="#{cover_image}"#{width_attr}#{depth_attr}/>
+<imagedata fileref="#{cover_image}"#{size_attrs}/>
 </imageobject>
 </mediaobject>
 </cover>)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/converter/html5.rb 
new/lib/asciidoctor/converter/html5.rb
--- old/lib/asciidoctor/converter/html5.rb      2018-03-20 01:00:00.000000000 
+0100
+++ new/lib/asciidoctor/converter/html5.rb      2018-03-20 01:00:00.000000000 
+0100
@@ -748,7 +748,7 @@
   def convert_open node
     if (style = node.style) == 'abstract'
       if node.parent == node.document && node.document.doctype == 'book'
-        logger.warn 'abstract block cannot be used in a document without a 
title when doctype is book. Excluding block content.'
+        logger.warn 'abstract block cannot be used in a document without a 
doctitle when doctype is book. Excluding block content.'
         ''
       else
         id_attr = node.id ? %( id="#{node.id}") : ''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/converter/manpage.rb 
new/lib/asciidoctor/converter/manpage.rb
--- old/lib/asciidoctor/converter/manpage.rb    2018-03-20 01:00:00.000000000 
+0100
+++ new/lib/asciidoctor/converter/manpage.rb    2018-03-20 01:00:00.000000000 
+0100
@@ -1,6 +1,6 @@
 # frozen_string_literal: true
 module Asciidoctor
-# A built-in {Converter} implementation that generates the man page (troff) 
format.
+# A built-in {Converter} implementation that generates the man page (groff) 
format.
 #
 # The output of this converter adheres to the man definition as defined by
 # groff and uses the manpage output of the DocBook toolchain as a foundation.
@@ -432,7 +432,7 @@
             when :literal
               cell_content = %(.nf#{LF}#{manify cell.text, whitespace: 
:preserve}#{LF}.fi)
             else
-              cell_content = manify cell.content.join, whitespace: :normalize
+              cell_content = cell.content.map {|p| manify p, whitespace: 
:normalize }.join %(#{LF}.sp#{LF})
             end
             row_text[row_index] << %(#{cell_content}#{LF})
           else # tsec == :head || tsec == :foot
@@ -476,21 +476,14 @@
       end unless rows.empty?
     end
 
-    #row_header.each do |row|
-    #  result << LF
-    #  row.each_with_index do |cell, i|
-    #    result << (cell.join ' ')
-    #    result << ' ' if row.size > i + 1
-    #  end
-    #end
-    # FIXME temporary fix to get basic table to display
-    result << LF
-    result << ('lt ' * row_header[0].size).chop
-
-    result << %(.#{LF})
-    row_text.each do |row|
-      result << row.join
+    if node.has_header_option && (header_row_text = row_text[0])
+      result << %(#{LF}#{row_header[0].join ' '}.)
+      result << %(#{LF}#{header_row_text.join})
+      result << '.T&'
+      row_text = row_text.slice 1, row_text.length
     end
+    result << %(#{LF}#{row_header[0].map { 'lt' }.join ' '}.#{LF})
+    row_text.each {|row| result << row.join }
     result << %(.TE#{LF}.sp)
     result.join
   end
@@ -706,46 +699,44 @@
   def manify str, opts = {}
     case opts.fetch :whitespace, :collapse
     when :preserve
-      str = str.gsub TAB, ET
+      str = (str.gsub TAB, ET).gsub(/(^)?  +/) { $1 ? $& : %(#{ESC_BS}&#{$&}) }
     when :normalize
       str = str.gsub WrappedIndentRx, LF
     else
       str = str.tr_s WHITESPACE, ' '
     end
-    str = str
-      .gsub(LiteralBackslashRx) { $1 ? $& : '\\(rs' } # literal backslash (not 
a troff escape sequence)
-      .gsub(EllipsisCharRefRx, '...') # horizontal ellipsis
-      .gsub(LeadingPeriodRx, '\\\&.') # leading . is used in troff for macro 
call or other formatting; replace with \&.
-      .gsub(EscapedMacroRx) do # drop orphaned \c escape lines, unescape troff 
macro, quote adjacent character, isolate macro line
-        (rest = $3.lstrip).empty? ? %(.#{$1}"#{$2}") : 
%(.#{$1}"#{$2.rstrip}"#{LF}#{rest})
-      end
-      .gsub('-', '\-')
-      .gsub('&lt;', '<')
-      .gsub('&gt;', '>')
-      .gsub('&#43;', '+')       # plus sign; alternately could use \c(pl
-      .gsub('&#160;', '\~')     # non-breaking space
-      .gsub('&#169;', '\(co')   # copyright sign
-      .gsub('&#174;', '\(rg')   # registered sign
-      .gsub('&#8482;', '\(tm')  # trademark sign
-      .gsub('&#176;', '\(de')   # degree sign
-      .gsub('&#8201;', ' ')     # thin space
-      .gsub('&#8211;', '\(en')  # en dash
-      .gsub(EmDashCharRefRx, '\(em') # em dash
-      .gsub('&#8216;', '\(oq')  # left single quotation mark
-      .gsub('&#8217;', '\(cq')  # right single quotation mark
-      .gsub('&#8220;', '\(lq')  # left double quotation mark
-      .gsub('&#8221;', '\(rq')  # right double quotation mark
-      .gsub('&#8592;', '\(<-')  # leftwards arrow
-      .gsub('&#8594;', '\(->')  # rightwards arrow
-      .gsub('&#8656;', '\(lA')  # leftwards double arrow
-      .gsub('&#8658;', '\(rA')  # rightwards double arrow
-      .gsub('&#8203;', '\:')    # zero width space
-      .gsub('&amp;', '&')       # literal ampersand (NOTE must take place 
after any other replacement that includes &)
-      .gsub('\'', '\*(Aq')      # apostrophe / neutral single quote
-      .gsub(MockMacroRx, '\1')  # mock boundary
-      .gsub(ESC_BS, '\\')       # unescape troff backslash (NOTE update if 
more escapes are added)
-      .gsub(ESC_FS, '.')        # unescape full stop in troff commands (NOTE 
must take place after gsub(LeadingPeriodRx))
-      .rstrip                   # strip trailing space
+    str = str.
+      gsub(LiteralBackslashRx) { $1 ? $& : '\\(rs' }. # literal backslash (not 
a troff escape sequence)
+      gsub(EllipsisCharRefRx, '...'). # horizontal ellipsis
+      gsub(LeadingPeriodRx, '\\\&.'). # leading . is used in troff for macro 
call or other formatting; replace with \&.
+      gsub(EscapedMacroRx) { (rest = $3.lstrip).empty? ? %(.#{$1}"#{$2}") : 
%(.#{$1}"#{$2.rstrip}"#{LF}#{rest}) }. # drop orphaned \c escape lines, 
unescape troff macro, quote adjacent character, isolate macro line
+      gsub('-', '\-').
+      gsub('&lt;', '<').
+      gsub('&gt;', '>').
+      gsub('&#43;', '+').      # plus sign; alternately could use \c(pl
+      gsub('&#160;', '\~').    # non-breaking space
+      gsub('&#169;', '\(co').  # copyright sign
+      gsub('&#174;', '\(rg').  # registered sign
+      gsub('&#8482;', '\(tm'). # trademark sign
+      gsub('&#176;', '\(de').  # degree sign
+      gsub('&#8201;', ' ').    # thin space
+      gsub('&#8211;', '\(en'). # en dash
+      gsub(EmDashCharRefRx, '\(em'). # em dash
+      gsub('&#8216;', '\(oq'). # left single quotation mark
+      gsub('&#8217;', '\(cq'). # right single quotation mark
+      gsub('&#8220;', '\(lq'). # left double quotation mark
+      gsub('&#8221;', '\(rq'). # right double quotation mark
+      gsub('&#8592;', '\(<-'). # leftwards arrow
+      gsub('&#8594;', '\(->'). # rightwards arrow
+      gsub('&#8656;', '\(lA'). # leftwards double arrow
+      gsub('&#8658;', '\(rA'). # rightwards double arrow
+      gsub('&#8203;', '\:').   # zero width space
+      gsub('&amp;', '&').      # literal ampersand (NOTE must take place after 
any other replacement that includes &)
+      gsub('\'', '\*(Aq').     # apostrophe / neutral single quote
+      gsub(MockMacroRx, '\1'). # mock boundary
+      gsub(ESC_BS, '\\').      # unescape troff backslash (NOTE update if more 
escapes are added)
+      gsub(ESC_FS, '.').       # unescape full stop in troff commands (NOTE 
must take place after gsub(LeadingPeriodRx))
+      rstrip                   # strip trailing space
     opts[:append_newline] ? %(#{str}#{LF}) : str
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/helpers.rb 
new/lib/asciidoctor/helpers.rb
--- old/lib/asciidoctor/helpers.rb      2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/helpers.rb      2018-03-20 01:00:00.000000000 +0100
@@ -145,10 +145,13 @@
         })
       )
     end
+  elsif (CGI = ::CGI).respond_to? :escapeURIComponent
+    def encode_uri_component str
+      CGI.escapeURIComponent str
+    end
   else
-    CGI = ::CGI
     def encode_uri_component str
-      CGI.escape str
+      (CGI.escape str).gsub '+', '%20'
     end
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/logging.rb 
new/lib/asciidoctor/logging.rb
--- old/lib/asciidoctor/logging.rb      2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/logging.rb      2018-03-20 01:00:00.000000000 +0100
@@ -40,6 +40,7 @@
   attr_reader :messages
 
   def initialize
+    super nil
     self.level = WARN
     @messages = []
   end
@@ -67,6 +68,7 @@
   attr_reader :max_severity
 
   def initialize
+    super nil
     self.level = WARN
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/parser.rb 
new/lib/asciidoctor/parser.rb
--- old/lib/asciidoctor/parser.rb       2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/parser.rb       2018-03-20 01:00:00.000000000 +0100
@@ -43,6 +43,12 @@
 
   AuthorKeys = ['author', 'authorinitials', 'firstname', 'middlename', 
'lastname', 'email']
 
+  ListContinuationMarker = ::Module.new
+
+  ListContinuationPlaceholder = ::String.new.extend ListContinuationMarker
+
+  ListContinuationString = (::String.new LIST_CONTINUATION).extend 
ListContinuationMarker
+
   # Internal: A Hash mapping horizontal alignment abbreviations to alignments
   # that can be applied to a table cell (or to all cells in a column)
   TableCellHorzAlignments = {
@@ -555,6 +561,7 @@
       # process lines verbatim
       if style && Compliance.strict_verbatim_paragraphs && 
(VERBATIM_STYLES.include? style)
         block_context = style.to_sym
+        cloaked_context = :paragraph
         reader.unshift_line this_line
         # advance to block parsing =>
         break
@@ -812,16 +819,17 @@
     unless block
       case block_context
       when :listing, :source
-        if block_context == :source || (!attributes[1] && (language = 
attributes[2] || doc_attrs['source-language']))
-          if language
+        if block_context == :source || (language = attributes[1] ? nil : 
attributes[2] || doc_attrs['source-language'])
+          if language # :listing
             attributes['style'] = 'source'
             attributes['language'] = language
             AttributeList.rekey attributes, [nil, nil, 'linenums']
-          else
+          else # :source
             AttributeList.rekey attributes, [nil, 'language', 'linenums']
             if doc_attrs.key? 'source-language'
               attributes['language'] = doc_attrs['source-language']
             end unless attributes.key? 'language'
+            attributes['cloaked-context'] = cloaked_context unless 
cloaked_context == :listing
           end
           if attributes['linenums-option'] || 
doc_attrs['source-linenums-option']
             attributes['linenums'] = ''
@@ -850,6 +858,7 @@
         else
           attributes['language'] = language
         end
+        attributes['cloaked-context'] = cloaked_context
         if attributes['linenums-option'] || doc_attrs['source-linenums-option']
           attributes['linenums'] = ''
         end unless attributes.key? 'linenums'
@@ -1420,17 +1429,18 @@
       # the termination of the list
       break if is_sibling_list_item?(this_line, list_type, sibling_trait)
 
+      this_line = ListContinuationString if this_line == LIST_CONTINUATION
       prev_line = buffer.empty? ? nil : buffer[-1]
 
-      if prev_line == LIST_CONTINUATION
+      if ListContinuationMarker === prev_line
         if continuation == :inactive
           continuation = :active
           has_text = true
-          buffer[-1] = '' unless within_nested_list
+          buffer[-1] = ListContinuationPlaceholder unless within_nested_list
         end
 
         # dealing with adjacent list continuations (which is really a syntax 
error)
-        if this_line == LIST_CONTINUATION
+        if ListContinuationMarker === this_line
           if continuation != :frozen
             continuation = :frozen
             buffer << this_line
@@ -1466,6 +1476,7 @@
           break
         end
         if interrupt
+          this_line = nil
           reader.unshift_lines block_attribute_lines
           break
         end
@@ -1489,7 +1500,7 @@
             (ch0 == '[' && (BlockAttributeLineRx.match? this_line)) || (ch0 == 
':' && (AttributeEntryRx.match? this_line))
           buffer << this_line
         else
-          if (nested_list_type = (within_nested_list ? [:dlist] : 
NESTABLE_LIST_CONTEXTS).find {|ctx| ListRxMap[ctx].match? this_line })
+          if (nested_list_type = (within_nested_list ? [:dlist] : 
NESTABLE_LIST_CONTEXTS).find {|ctx| ListRxMap[ctx] =~ this_line })
             within_nested_list = true
             if nested_list_type == :dlist && $3.nil_or_empty?
               # get greedy again
@@ -1510,7 +1521,7 @@
 
         if this_line == LIST_CONTINUATION
           detached_continuation = buffer.size
-          buffer << this_line
+          buffer << ListContinuationString
         elsif has_text # has_text only relevant for dlist, which is more 
greedy until it has text for an item; has_text is always true for all other 
lists
           # in this block, we have to see whether we stay in the list
           # TODO any way to combine this with the check after skipping blank 
lines?
@@ -1543,6 +1554,9 @@
           buffer << this_line
           has_text = true
         end
+      elsif ListContinuationMarker === this_line
+        has_text = true
+        buffer << this_line
       else
         has_text = true unless this_line.empty?
         if (nested_list_type = (within_nested_list ? [:dlist] : 
NESTABLE_LIST_CONTEXTS).find {|ctx| ListRxMap[ctx] =~ this_line })
@@ -1559,16 +1573,17 @@
 
     reader.unshift_line this_line if this_line
 
-    buffer[detached_continuation] = '' if detached_continuation
+    buffer[detached_continuation] = ListContinuationPlaceholder if 
detached_continuation
 
     until buffer.empty?
+      # drop optional trailing continuation
+      if ListContinuationMarker === (last_line = buffer[-1])
+        buffer.pop
+        break
       # strip trailing blank lines to prevent empty blocks
-      if (last_line = buffer[-1]).empty?
+      elsif last_line.empty?
         buffer.pop
       else
-        # drop optional trailing continuation
-        # (a blank line would have served the same purpose in the document)
-        buffer.pop if last_line == LIST_CONTINUATION
         break
       end
     end
@@ -2399,6 +2414,7 @@
       end
     end
 
+    parser_ctx.close_table
     table.assign_column_widths unless (table.attributes['colcount'] ||= 
table.columns.size) == 0 || explicit_colspecs
     table.has_header_option = true if implicit_header
     table.partition_header_footer attributes
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/reader.rb 
new/lib/asciidoctor/reader.rb
--- old/lib/asciidoctor/reader.rb       2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/reader.rb       2018-03-20 01:00:00.000000000 +0100
@@ -820,6 +820,10 @@
     return line unless @process_lines
 
     if line.empty?
+      if @skipping
+        shift
+        return
+      end
       @look_ahead += 1
       return line
     end
@@ -1039,6 +1043,7 @@
     # if running in SafeMode::SECURE or greater, don't process this directive
     # however, be friendly and at least make it a link to the source document
     elsif doc.safe >= SafeMode::SECURE
+      expanded_target = %(pass:c[#{expanded_target}]) if 
expanded_target.include? ' '
       # FIXME we don't want to use a link macro if we are in a verbatim context
       replace_next_line %(link:#{expanded_target}[role=include])
     elsif @maxdepth
@@ -1238,7 +1243,10 @@
   def resolve_include_path target, attrlist, attributes
     doc = @document
     if (Helpers.uriish? target) || (::String === @dir ? nil : (target = 
%(#{@dir}/#{target})))
-      return replace_next_line %(link:#{target}[role=include]) unless 
doc.attr? 'allow-uri-read'
+      unless doc.attr? 'allow-uri-read'
+        target = %(pass:c[#{target}]) if target.include? ' '
+        return replace_next_line %(link:#{target}[role=include])
+      end
       if doc.attr? 'cache-uri'
         # caching requires the open-uri-cached gem to be installed
         # processing will be automatically aborted if these libraries can't be 
opened
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/rx.rb new/lib/asciidoctor/rx.rb
--- old/lib/asciidoctor/rx.rb   2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/rx.rb   2018-03-20 01:00:00.000000000 +0100
@@ -103,6 +103,7 @@
   #   }
   #   // end::try-catch[]
   # NOTE m flag is required for Asciidoctor.js
+  # NOTE the regex checks for \r to account of include files that use Windows 
newlines
   TagDirectiveRx = /\b(?:tag|(e)nd)::(\S+?)\[\](?=$|[ \r])/m
 
   ## Attribute entries and references
@@ -513,12 +514,17 @@
   #
   #   https://github.com
   #   https://github.com[GitHub]
-  #   <https://github.com>
+  #   <https://github.com> <= angle brackets not included in autolink
   #   link:https://github.com[]
   #   "https://github.com[]";
   #   (https://github.com) <= parenthesis not included in autolink
   #
-  InlineLinkRx = 
%r((^|link:|#{CG_BLANK}|&lt;|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)\[(|#{CC_ALL}*?[^\\])\]|([^\s\[\]<]*([^\s,.?!\[\]<\)]))))m
+  if RUBY_ENGINE == 'opal'
+    # NOTE In JavaScript, a back reference succeeds if not set; invert the 
logic to give it a match to refute
+    InlineLinkRx = 
%r((^|link:|#{CG_BLANK}|\\?&lt;(?=\\?(?:https?|file|ftp|irc)(:))|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)\[(|#{CC_ALL}*?[^\\])\]|(?!\2)([^\s]+?)&gt;|([^\s\[\]<]*([^\s,.?!\[\]<\)]))))
+  else
+    InlineLinkRx = 
%r((^|link:|#{CG_BLANK}|\\?&lt;()|[>\(\)\[\];"'])(\\?(?:https?|file|ftp|irc)://)(?:([^\s\[\]]+)\[(|#{CC_ALL}*?[^\\])\]|\2([^\s]+?)&gt;|([^\s\[\]<]*([^\s,.?!\[\]<\)]))))m
+  end
 
   # Match a link or e-mail inline macro.
   #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/substitutors.rb 
new/lib/asciidoctor/substitutors.rb
--- old/lib/asciidoctor/substitutors.rb 2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/substitutors.rb 2018-03-20 01:00:00.000000000 +0100
@@ -445,7 +445,14 @@
           # indexterm:[Tigers,Big cats]
           if (attrlist = normalize_text $2, true, true).include? '='
             if (primary = (attrs = (AttributeList.new attrlist, 
self).parse)[1])
-              attrs['terms'] = [primary]
+              terms = [primary]
+              if (secondary = attrs[2])
+                terms << secondary
+                if (tertiary = attrs[3])
+                  terms << tertiary
+                end
+              end
+              attrs['terms'] = terms
               if (see_also = attrs['see-also'])
                 attrs['see-also'] = (see_also.include? ',') ? (see_also.split 
',').map {|it| it.lstrip } : [see_also]
               end
@@ -524,97 +531,100 @@
     end
 
     if found_colon && (text.include? '://')
-      # inline urls, target[text] (optionally prefixed with link: and 
optionally surrounded by <>)
+      # inline urls, target[text] (optionally prefixed with link: or enclosed 
in <>)
       text = text.gsub InlineLinkRx do
-        if (target = $2 + ($3 || $5)).start_with? RS
-          # honor the escape
-          next ($&.slice 0, (rs_idx = $1.length)) + ($&.slice rs_idx + 1, 
$&.length)
-        end
-
-        prefix, suffix = $1, ''
-        # NOTE if $4 is set, we're looking at a formal macro (e.g., 
https://example.org[])
-        if $4
-          prefix = '' if prefix == 'link:'
-          link_text = nil if (link_text = $4).empty?
+        if $2 && !$5
+          # honor the escapes
+          next $&.slice 1, $&.length if $1.start_with? RS
+          next %(#{$1}#{$&.slice $1.length + 1, $&.length}) if $3.start_with? 
RS
+          next $& unless $6
+          doc.register :links, (target = $3 + $6)
+          link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub 
UriSniffRx, '') : target
+          (Inline.new self, :anchor, link_text, type: :link, target: target, 
attributes: { 'role' => 'bare' }).convert
         else
-          # invalid macro syntax (link: prefix w/o trailing square brackets or 
enclosed in double quotes)
-          # FIXME we probably shouldn't even get here when the link: prefix is 
present; the regex is doing too much
-          case prefix
-          when 'link:', ?", ?'
-            next $&
-          end
-          case $6
-          when ';'
-            if (prefix.start_with? '&lt;') && (target.end_with? '&gt;')
-              # move surrounding <> out of URL
-              prefix = prefix.slice 4, prefix.length
-              target = target.slice 0, target.length - 4
-            elsif (target = target.chop).end_with? ')'
-              # move trailing ); out of URL
-              target = target.chop
-              suffix = ');'
-            else
-              # move trailing ; out of URL
-              suffix = ';'
-            end
-            # NOTE handle case when modified target is a URI scheme (e.g., 
http://)
-            next $& if target.end_with? '://'
-          when ':'
-            if (target = target.chop).end_with? ')'
-              # move trailing ): out of URL
-              target = target.chop
-              suffix = '):'
-            else
-              # move trailing : out of URL
-              suffix = ':'
+          # honor the escape
+          next %(#{$1}#{$&.slice $1.length + 1, $&.length}) if $3.start_with? 
RS
+          prefix, target, suffix = $1, $3 + ($4 || $7), ''
+          # NOTE if $5 is set (the attrlist), we're looking at a formal macro 
(e.g., https://example.org[])
+          if $5
+            prefix = '' if prefix == 'link:'
+            link_text = nil if (link_text = $5).empty?
+          else
+            case prefix
+            # invalid macro syntax (link: prefix w/o trailing square brackets 
or URL enclosed in quotes)
+            # FIXME we probably shouldn't even get here when the link: prefix 
is present; the regex is doing too much
+            when 'link:', ?", ?'
+              next $&
+            end
+            case $8
+            when ';'
+              if (target = target.chop).end_with? ')'
+                # move trailing ); out of URL
+                target = target.chop
+                suffix = ');'
+              else
+                # move trailing ; out of URL
+                suffix = ';'
+              end
+              # NOTE handle case when modified target is a bare URI scheme 
(e.g., http://)
+              next $& if target == $3
+            when ':'
+              if (target = target.chop).end_with? ')'
+                # move trailing ): out of URL
+                target = target.chop
+                suffix = '):'
+              else
+                # move trailing : out of URL
+                suffix = ':'
+              end
+              # NOTE handle case when modified target is a bare URI scheme 
(e.g., http://)
+              next $& if target == $3
             end
-            # NOTE handle case when modified target is a URI scheme (e.g., 
http://)
-            next $& if target.end_with? '://'
           end
-        end
 
-        attrs, link_opts = nil, { type: :link }
+          link_opts = { type: :link }
 
-        if link_text
-          new_link_text = link_text = link_text.gsub ESC_R_SB, R_SB if 
link_text.include? R_SB
-          if !doc.compat_mode && (link_text.include? '=')
-            # NOTE if an equals sign (=) is present, extract attributes from 
link text
-            link_text, attrs = extract_attributes_from_text link_text, ''
-            new_link_text = link_text
-            link_opts[:id] = attrs['id']
-          end
+          if link_text
+            new_link_text = link_text = link_text.gsub ESC_R_SB, R_SB if 
link_text.include? R_SB
+            if !doc.compat_mode && (link_text.include? '=')
+              # NOTE if an equals sign (=) is present, extract attributes from 
link text
+              link_text, attrs = extract_attributes_from_text link_text, ''
+              new_link_text = link_text
+              link_opts[:id] = attrs['id']
+            end
 
-          if link_text.end_with? '^'
-            new_link_text = link_text = link_text.chop
-            if attrs
-              attrs['window'] ||= '_blank'
-            else
-              attrs = { 'window' => '_blank' }
+            if link_text.end_with? '^'
+              new_link_text = link_text = link_text.chop
+              if attrs
+                attrs['window'] ||= '_blank'
+              else
+                attrs = { 'window' => '_blank' }
+              end
             end
-          end
 
-          if new_link_text && new_link_text.empty?
-            # NOTE it's not possible for the URI scheme to be bare in this case
+            if new_link_text && new_link_text.empty?
+              # NOTE the modified target will not be a bare URI scheme (e.g., 
http://) in this case
+              link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub 
UriSniffRx, '') : target
+              bare = true
+            end
+          else
+            # NOTE the modified target will not be a bare URI scheme (e.g., 
http://) in this case
             link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub 
UriSniffRx, '') : target
             bare = true
           end
-        else
-          # NOTE it's not possible for the URI scheme to be bare in this case
-          link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub 
UriSniffRx, '') : target
-          bare = true
-        end
 
-        if bare
-          if attrs
-            attrs['role'] = (attrs.key? 'role') ? %(bare #{attrs['role']}) : 
'bare'
-          else
-            attrs = { 'role' => 'bare' }
+          if bare
+            if attrs
+              attrs['role'] = (attrs.key? 'role') ? %(bare #{attrs['role']}) : 
'bare'
+            else
+              attrs = { 'role' => 'bare' }
+            end
           end
-        end
 
-        doc.register :links, (link_opts[:target] = target)
-        link_opts[:attributes] = attrs if attrs
-        %(#{prefix}#{(Inline.new self, :anchor, link_text, 
link_opts).convert}#{suffix})
+          doc.register :links, (link_opts[:target] = target)
+          link_opts[:attributes] = attrs if attrs
+          %(#{prefix}#{(Inline.new self, :anchor, link_text, 
link_opts).convert}#{suffix})
+        end
       end
     end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/table.rb new/lib/asciidoctor/table.rb
--- old/lib/asciidoctor/table.rb        2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/table.rb        2018-03-20 01:00:00.000000000 +0100
@@ -300,7 +300,7 @@
       # QUESTION is is faster to check for :: before splitting?
       inner_document_lines = cell_text.split LF, -1
       if (unprocessed_line1 = inner_document_lines[0]).include? '::'
-        preprocessed_lines = (PreprocessorReader.new @document, 
[unprocessed_line1]).readlines
+        preprocessed_lines = (PreprocessorReader.new @document, 
[unprocessed_line1], inner_document_cursor).readlines
         unless unprocessed_line1 == preprocessed_lines[0] && 
preprocessed_lines.size < 2
           inner_document_lines.shift
           inner_document_lines.unshift(*preprocessed_lines) unless 
preprocessed_lines.empty?
@@ -659,36 +659,43 @@
           end
         end
       else
-        # QUESTION is this right for cells that span columns?
-        unless (column = @table.columns[@current_row.size])
-          logger.error message_with_context 'dropping cell because it exceeds 
specified number of columns', source_location: @reader.cursor_before_mark
-          return nil
-        end
+        column = @table.columns[@current_row.size]
       end
 
-      cell = Table::Cell.new(column, cell_text, cellspec, cursor: 
@reader.cursor_before_mark)
+      cell = Table::Cell.new column, cell_text, cellspec, cursor: 
(cursor_before_mark = @reader.cursor_before_mark)
       @reader.mark
       unless !cell.rowspan || cell.rowspan == 1
         activate_rowspan(cell.rowspan, (cell.colspan || 1))
       end
       @column_visits += (cell.colspan || 1)
       @current_row << cell
-      # don't close the row if we're on the first line and the column count 
has not been set explicitly
-      # TODO perhaps the colcount/linenum logic should be in end_of_row? (or a 
should_end_row? method)
-      close_row if end_of_row? && (@colcount != -1 || @linenum > 0 || (eol && 
i == repeat))
+      if (row_status = end_of_row?) > -1 && (@colcount != -1 || @linenum > 0 
|| (eol && i == repeat))
+        if row_status > 0
+          logger.error message_with_context 'dropping cell because it exceeds 
specified number of columns', source_location: cursor_before_mark
+          close_row true
+        else
+          close_row
+        end
+      end
     end
     @cell_open = false
     nil
   end
 
+  def close_table
+    return if @column_visits == 0
+    logger.error message_with_context 'dropping cells from incomplete row 
detected end of table', source_location: @reader.cursor_before_mark
+    nil
+  end
+
   private
 
   # Internal: Close the row by adding it to the Table and resetting the row
   # Array and counter variables.
   #
   # returns nothing
-  def close_row
-    @table.rows.body << @current_row
+  def close_row drop = false
+    @table.rows.body << @current_row unless drop
     # don't have to account for active rowspans here
     # since we know this is first row
     @colcount = @column_visits if @colcount == -1
@@ -709,8 +716,10 @@
   end
 
   # Internal: Check whether we've met the number of effective columns for the 
current row.
+  #
+  # returns -1 if not at end of row, 0 if exactly at end of row, and 1 if 
overruns end of row
   def end_of_row?
-    @colcount == -1 || effective_column_visits == @colcount
+    @colcount == -1 ? 0 : effective_column_visits <=> @colcount
   end
 
   # Internal: Calculate the effective column visits, which consists of the 
number of
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor/version.rb 
new/lib/asciidoctor/version.rb
--- old/lib/asciidoctor/version.rb      2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor/version.rb      2018-03-20 01:00:00.000000000 +0100
@@ -1,4 +1,4 @@
 # frozen_string_literal: true
 module Asciidoctor
-  VERSION = '2.0.20'
+  VERSION = '2.0.23'
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/lib/asciidoctor.rb new/lib/asciidoctor.rb
--- old/lib/asciidoctor.rb      2018-03-20 01:00:00.000000000 +0100
+++ new/lib/asciidoctor.rb      2018-03-20 01:00:00.000000000 +0100
@@ -6,7 +6,6 @@
   # this require is satisfied by the Asciidoctor.js build; it augments the 
Ruby environment for Asciidoctor.js
   require 'asciidoctor/js'
 else
-  autoload :Base64, 'base64'
   require 'cgi/util'
   autoload :OpenURI, 'open-uri'
   autoload :Pathname, 'pathname'
@@ -209,13 +208,13 @@
   BOM_BYTES_UTF_16BE = [0xfe, 0xff]
 
   # The mode to use when opening a file for reading
-  FILE_READ_MODE = RUBY_ENGINE_OPAL ? 'r' : 'rb:utf-8:utf-8'
+  FILE_READ_MODE = RUBY_ENGINE_OPAL ? 'r' : 'rb:UTF-8:UTF-8'
 
   # The mode to use when opening a URI for reading
   URI_READ_MODE = FILE_READ_MODE
 
   # The mode to use when opening a file for writing
-  FILE_WRITE_MODE = RUBY_ENGINE_OPAL ? 'w' : 'w:utf-8'
+  FILE_WRITE_MODE = RUBY_ENGINE_OPAL ? 'w' : 'wb:UTF-8'
 
   # The default document type
   # Can influence markup generated by the converters
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/man/asciidoctor.1 new/man/asciidoctor.1
--- old/man/asciidoctor.1       2018-03-20 01:00:00.000000000 +0100
+++ new/man/asciidoctor.1       2018-03-20 01:00:00.000000000 +0100
@@ -1,13 +1,13 @@
 '\" t
 .\"     Title: asciidoctor
 .\"    Author: Dan Allen, Sarah White
-.\" Generator: Asciidoctor 2.0.19
+.\" Generator: Asciidoctor 2.0.22
 .\"      Date: 2018-03-20
 .\"    Manual: Asciidoctor Manual
-.\"    Source: Asciidoctor 2.0.20
+.\"    Source: Asciidoctor 2.0.23
 .\"  Language: English
 .\"
-.TH "ASCIIDOCTOR" "1" "2018-03-20" "Asciidoctor 2.0.20" "Asciidoctor Manual"
+.TH "ASCIIDOCTOR" "1" "2018-03-20" "Asciidoctor 2.0.23" "Asciidoctor Manual"
 .ie \n(.g .ds Aq \(aq
 .el       .ds Aq '
 .ss \n[.ss] 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/man/asciidoctor.adoc new/man/asciidoctor.adoc
--- old/man/asciidoctor.adoc    2018-03-20 01:00:00.000000000 +0100
+++ new/man/asciidoctor.adoc    2018-03-20 01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 = asciidoctor(1)
 Dan Allen; Sarah White
 :doctype: manpage
-:release-version: 2.0.20
+:release-version: 2.0.23
 :man manual: Asciidoctor Manual
 :man source: Asciidoctor {release-version}
 ifdef::backend-manpage[:!author:]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/metadata new/metadata
--- old/metadata        2018-03-20 01:00:00.000000000 +0100
+++ new/metadata        2018-03-20 01:00:00.000000000 +0100
@@ -1,7 +1,7 @@
 --- !ruby/object:Gem::Specification
 name: asciidoctor
 version: !ruby/object:Gem::Version
-  version: 2.0.20
+  version: 2.0.23
 platform: ruby
 authors:
 - Dan Allen
@@ -77,14 +77,14 @@
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: 5.14.0
+        version: 5.22.0
   type: :development
   prerelease: false
   version_requirements: !ruby/object:Gem::Requirement
     requirements:
     - - "~>"
       - !ruby/object:Gem::Version
-        version: 5.14.0
+        version: 5.22.0
 - !ruby/object:Gem::Dependency
   name: nokogiri
   requirement: !ruby/object:Gem::Requirement
@@ -272,7 +272,7 @@
     - !ruby/object:Gem::Version
       version: '0'
 requirements: []
-rubygems_version: 3.4.10
+rubygems_version: 3.5.9
 signing_key: 
 specification_version: 4
 summary: An implementation of the AsciiDoc text processor and publishing 
toolchain

Reply via email to