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