summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Allen <dan.j.allen@gmail.com>2019-03-20 03:21:45 -0600
committerDan Allen <dan.j.allen@gmail.com>2019-03-20 23:19:46 -0600
commit1f0fed25302cac450828abd8a250028e57486b4c (patch)
tree318cb8cb6757c900cc567446d8579b11abfd35e6
parentda873f1a38a5e137b0aeaf0c5750c6cbedadd10e (diff)
resolves #2855 honor attribute-missing setting when processing include directive
-rw-r--r--CHANGELOG.adoc1
-rw-r--r--lib/asciidoctor/reader.rb12
-rw-r--r--test/reader_test.rb29
3 files changed, 22 insertions, 20 deletions
diff --git a/CHANGELOG.adoc b/CHANGELOG.adoc
index e41ad988..4b9ba759 100644
--- a/CHANGELOG.adoc
+++ b/CHANGELOG.adoc
@@ -105,6 +105,7 @@ Improvements::
* always use docdate and doctime to compute docyear and docdatetime (#3064)
* rename PreprocessorReader#exceeded_max_depth? to PreprocessorReader#exceeds_max_depth? and return nil if includes are disabled
* log warning when include directive is not resolved due to missing attribute or blank target; always include warning in output (#2868)
+ * honor attribute-missing setting when processing include directive (#2855)
* stop populating :ids table in document catalog (#3084)
* always use :refs table in document catalog to look for registered IDs (#3084)
* don't compute and store reference text in document catalog (#3084)
diff --git a/lib/asciidoctor/reader.rb b/lib/asciidoctor/reader.rb
index e6c2ea02..260ac11e 100644
--- a/lib/asciidoctor/reader.rb
+++ b/lib/asciidoctor/reader.rb
@@ -1014,13 +1014,17 @@ class PreprocessorReader < Reader
def preprocess_include_directive target, attrlist
doc = @document
if ((expanded_target = target).include? ATTR_REF_HEAD) &&
- (intermediary_target = doc.sub_attributes target + ' ', attribute_missing: 'drop-line', drop_line_severity: :warn) &&
- (expanded_target = intermediary_target.chop).empty?
- if (doc.parse_attributes attrlist, [], sub_input: true)['optional-option']
+ (precursor_target = doc.sub_attributes target + ' ', attribute_missing: ((attr_missing = doc.attributes['attribute-missing'] || Compliance.attribute_missing) == 'warn' ? 'drop-line' : attr_missing)) &&
+ (expanded_target = precursor_target.chop).empty?
+ if attr_missing == 'drop-line' && precursor_target.empty?
+ logger.info message_with_context %(include dropped due to missing attribute: include::#{target}[#{attrlist}]), source_location: cursor if logger.info?
+ shift
+ true
+ elsif (doc.parse_attributes attrlist, [], sub_input: true)['optional-option']
shift
true
else
- logger.warn message_with_context %(#{intermediary_target.empty? ? 'include not found because of missing attribute' : 'include not found because target is blank'}: include::#{target}[#{attrlist}]), source_location: cursor
+ logger.warn message_with_context %(include skipped #{attr_missing == 'warn' && precursor_target.empty? ? 'due to missing attribute' : 'because resolved target is blank'}: include::#{target}[#{attrlist}]), source_location: cursor
replace_next_line %(Unresolved directive in #{@path} - include::#{target}[#{attrlist}])
end
elsif include_processors? && (ext = @include_processor_extensions.find {|candidate| candidate.instance.handles? expanded_target })
diff --git a/test/reader_test.rb b/test/reader_test.rb
index 2038912c..53b83a3a 100644
--- a/test/reader_test.rb
+++ b/test/reader_test.rb
@@ -730,7 +730,7 @@ class ReaderTest < Minitest::Test
doc = document_from_string input, safe: :safe, base_dir: DIRNAME
assert_equal 1, doc.blocks.size
assert_equal ['trailing content'], doc.blocks[0].lines
- assert_message logger, :WARN, 'dropping line containing reference to missing attribute: no-such-file'
+ assert_empty logger
end
rescue
flunk 'include directive should not raise exception on unresolved target'
@@ -1404,29 +1404,26 @@ class ReaderTest < Minitest::Test
end
test 'line is skipped by default if target of include directive resolves to empty' do
- input = 'include::{foodir}/include-file.adoc[]'
+ input = 'include::{blank}[]'
using_memory_logger do |logger|
doc = empty_safe_document base_dir: DIRNAME
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, normalize: true
line = reader.read_line
- assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.adoc[]', line
- assert_messages logger, [
- [:WARN, 'dropping line containing reference to missing attribute: foodir'],
- [:WARN, '<stdin>: line 1: include not found because of missing attribute: include::{foodir}/include-file.adoc[]', Hash],
- ]
+ assert_equal 'Unresolved directive in <stdin> - include::{blank}[]', line
+ assert_message logger, :WARN, '<stdin>: line 1: include skipped because resolved target is blank: include::{blank}[]', Hash
end
end
- test 'line is dropped if target of include directive resolves to empty and attribute-missing attribute is not skip' do
+ test 'include is dropped if target contains missing attribute and attribute-missing is drop-line' do
input = 'include::{foodir}/include-file.adoc[]'
- using_memory_logger do |logger|
- doc = empty_safe_document base_dir: DIRNAME, attributes: { 'attribute-missing' => 'drop' }
+ using_memory_logger Logger::INFO do |logger|
+ doc = empty_safe_document base_dir: DIRNAME, attributes: { 'attribute-missing' => 'drop-line' }
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, normalize: true
line = reader.read_line
- assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.adoc[]', line
+ assert_nil line
assert_messages logger, [
- [:WARN, 'dropping line containing reference to missing attribute: foodir'],
- [:WARN, '<stdin>: line 1: include not found because of missing attribute: include::{foodir}/include-file.adoc[]', Hash],
+ [:INFO, 'dropping line containing reference to missing attribute: foodir'],
+ [:INFO, '<stdin>: line 1: include dropped due to missing attribute: include::{foodir}/include-file.adoc[]', Hash],
]
end
end
@@ -1438,15 +1435,15 @@ class ReaderTest < Minitest::Test
EOS
using_memory_logger do |logger|
- doc = empty_safe_document base_dir: DIRNAME, attributes: { 'attribute-missing' => 'drop' }
+ doc = empty_safe_document base_dir: DIRNAME, attributes: { 'attribute-missing' => 'warn' }
reader = Asciidoctor::PreprocessorReader.new doc, input, nil, normalize: true
line = reader.read_line
assert_equal 'Unresolved directive in <stdin> - include::{foodir}/include-file.adoc[]', line
line = reader.read_line
assert_equal 'yo', line
assert_messages logger, [
- [:WARN, 'dropping line containing reference to missing attribute: foodir'],
- [:WARN, '<stdin>: line 1: include not found because of missing attribute: include::{foodir}/include-file.adoc[]', Hash],
+ [:INFO, 'dropping line containing reference to missing attribute: foodir'],
+ [:WARN, '<stdin>: line 1: include skipped due to missing attribute: include::{foodir}/include-file.adoc[]', Hash],
]
end
end