diff --git a/resources/asciidoctor/lib/cramped_include/extension.rb b/resources/asciidoctor/lib/cramped_include/extension.rb
new file mode 100644
index 0000000000000..32b7fc2404c4c
--- /dev/null
+++ b/resources/asciidoctor/lib/cramped_include/extension.rb
@@ -0,0 +1,23 @@
+require 'asciidoctor/extensions'
+
+include Asciidoctor
+
+# Preprocessor to support more "cramped" include statements. Usually something
+# like
+# include::resources/1.adoc[]
+# include::resources/2.adoc[]
+# will result in syntax errors if 1.adoc ends in only a single new line. Things
+# like callout lists require that they be followed by an empty line or else
+# the thing below them will get sucked into the callout list. This isn't a
+# problem with asciidoc, and to be better compatible with it try and work around
+# this problem by adding an extra new line after every sequence of lines we
+# include. In theory this *shouldn't* bother us because we don't include things
+# that are sensitive to the extra line.
+class CrampedInclude < Extensions::Preprocessor
+ def process document, reader
+ def reader.prepare_lines data, opts = {}
+ super << ''
+ end
+ reader
+ end
+end
diff --git a/resources/asciidoctor/lib/extensions.rb b/resources/asciidoctor/lib/extensions.rb
index 6d536169f43df..b58b665be1ab7 100644
--- a/resources/asciidoctor/lib/extensions.rb
+++ b/resources/asciidoctor/lib/extensions.rb
@@ -1,4 +1,5 @@
require_relative 'added/extension'
+require_relative 'cramped_include/extension'
require_relative 'edit_me/extension'
require_relative 'elastic_compat_tree_processor/extension'
require_relative 'elastic_compat_preprocessor/extension'
@@ -8,6 +9,7 @@
# Enable storing the source locations so we can look at them. This is required
# for EditMe to get a nice location.
document.sourcemap = true
+ preprocessor CrampedInclude
preprocessor ElasticCompatPreprocessor
treeprocessor EditMe
treeprocessor ElasticCompatTreeProcessor
diff --git a/resources/asciidoctor/spec/cramped_include_spec.rb b/resources/asciidoctor/spec/cramped_include_spec.rb
new file mode 100644
index 0000000000000..373499d319130
--- /dev/null
+++ b/resources/asciidoctor/spec/cramped_include_spec.rb
@@ -0,0 +1,72 @@
+require 'cramped_include/extension'
+require 'shared_examples/does_not_break_line_numbers'
+
+RSpec.describe CrampedInclude do
+ before(:each) do
+ Extensions.register do
+ preprocessor CrampedInclude
+ end
+ end
+
+ after(:each) do
+ Extensions.unregister_all
+ end
+
+ include_examples "doesn't break line numbers"
+
+ it "allows cramped includes of callout lists" do
+ actual = convert <<~ASCIIDOC
+ = Test
+
+ == Test
+
+ include::resources/cramped_include/colist1.adoc[]
+ include::resources/cramped_include/colist2.adoc[]
+ ASCIIDOC
+ expected = <<~DOCBOOK
+
+ Test
+
+ P1
+
+ P1.1
+ words <1> <2>
+
+
+ foo
+
+
+
+
+
+ P2
+
+ P2.1
+ words <1> <2>
+
+
+ foo
+
+
+
+
+
+ DOCBOOK
+ expect(actual).to eq(expected.strip)
+ end
+
+ it "doesn't break includes of non-asciidoc files" do
+ actual = convert <<~ASCIIDOC
+ ----
+ include::resources/cramped_include/Example.java[]
+ ----
+ ASCIIDOC
+ expected = <<~DOCBOOK
+
+
+ public class Example {}
+
+ DOCBOOK
+ expect(actual).to eq(expected.strip)
+ end
+end
diff --git a/resources/asciidoctor/spec/elastic_compat_preprocessor_spec.rb b/resources/asciidoctor/spec/elastic_compat_preprocessor_spec.rb
index 6c576da878e62..f6eedf805f1c1 100644
--- a/resources/asciidoctor/spec/elastic_compat_preprocessor_spec.rb
+++ b/resources/asciidoctor/spec/elastic_compat_preprocessor_spec.rb
@@ -1,6 +1,7 @@
require 'added/extension'
require 'elastic_compat_preprocessor/extension'
require 'elastic_include_tagged/extension'
+require 'shared_examples/does_not_break_line_numbers'
RSpec.describe ElasticCompatPreprocessor do
before(:each) do
@@ -15,6 +16,8 @@
Extensions.unregister_all
end
+ include_examples "doesn't break line numbers"
+
it "invokes added[version]" do
actual = convert <<~ASCIIDOC
== Example
@@ -51,24 +54,6 @@
expect(actual).to eq(expected.strip)
end
- it "doesn't break line numbers" do
- input = <<~ASCIIDOC
- ---
- ---
- <1> callout
- ASCIIDOC
- expect { convert(input) }.to raise_error(
- ConvertError, /: line 3: no callout found for <1>/)
- end
-
- it "doesn't break line numbers in included files" do
- input = <<~ASCIIDOC
- include::resources/elastic_compat_preprocessor/missing_callout.adoc[]
- ASCIIDOC
- expect { convert(input) }.to raise_error(
- ConvertError, /missing_callout.adoc: line 3: no callout found for <1>/)
- end
-
it "un-blocks blocks containing only attributes" do
actual = convert <<~ASCIIDOC
:inheader: foo
diff --git a/resources/asciidoctor/spec/resources/cramped_include/Example.java b/resources/asciidoctor/spec/resources/cramped_include/Example.java
new file mode 100644
index 0000000000000..0f5fefd304ffd
--- /dev/null
+++ b/resources/asciidoctor/spec/resources/cramped_include/Example.java
@@ -0,0 +1 @@
+public class Example {}
diff --git a/resources/asciidoctor/spec/resources/cramped_include/colist1.adoc b/resources/asciidoctor/spec/resources/cramped_include/colist1.adoc
new file mode 100644
index 0000000000000..c7bf2ef4328b4
--- /dev/null
+++ b/resources/asciidoctor/spec/resources/cramped_include/colist1.adoc
@@ -0,0 +1,11 @@
+[[P1]]
+=== P1
+
+[[P1_1]]
+==== P1.1
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+words <1> <2>
+--------------------------------------------------
+<1> foo
diff --git a/resources/asciidoctor/spec/resources/cramped_include/colist2.adoc b/resources/asciidoctor/spec/resources/cramped_include/colist2.adoc
new file mode 100644
index 0000000000000..dfac4e1a4015e
--- /dev/null
+++ b/resources/asciidoctor/spec/resources/cramped_include/colist2.adoc
@@ -0,0 +1,11 @@
+[[P2]]
+=== P2
+
+[[P2_1]]
+==== P2.1
+
+["source","java",subs="attributes,callouts,macros"]
+--------------------------------------------------
+words <1> <2>
+--------------------------------------------------
+<1> foo
\ No newline at end of file
diff --git a/resources/asciidoctor/spec/resources/elastic_compat_preprocessor/missing_callout.adoc b/resources/asciidoctor/spec/resources/does_not_break_line_numbers/missing_callout.adoc
similarity index 100%
rename from resources/asciidoctor/spec/resources/elastic_compat_preprocessor/missing_callout.adoc
rename to resources/asciidoctor/spec/resources/does_not_break_line_numbers/missing_callout.adoc
diff --git a/resources/asciidoctor/spec/shared_examples/does_not_break_line_numbers.rb b/resources/asciidoctor/spec/shared_examples/does_not_break_line_numbers.rb
new file mode 100644
index 0000000000000..ac9798c196855
--- /dev/null
+++ b/resources/asciidoctor/spec/shared_examples/does_not_break_line_numbers.rb
@@ -0,0 +1,19 @@
+RSpec.shared_examples "doesn't break line numbers" do
+ it "doesn't break line numbers" do
+ input = <<~ASCIIDOC
+ ---
+ ---
+ <1> callout
+ ASCIIDOC
+ expect { convert(input) }.to raise_error(
+ ConvertError, /: line 3: no callout found for <1>/)
+ end
+
+ it "doesn't break line numbers in included files" do
+ input = <<~ASCIIDOC
+ include::resources/does_not_break_line_numbers/missing_callout.adoc[]
+ ASCIIDOC
+ expect { convert(input) }.to raise_error(
+ ConvertError, /missing_callout.adoc: line 3: no callout found for <1>/)
+ end
+end