diff options
| author | Dan Allen <dan.j.allen@gmail.com> | 2019-03-20 03:21:45 -0600 |
|---|---|---|
| committer | Dan Allen <dan.j.allen@gmail.com> | 2019-03-20 23:19:46 -0600 |
| commit | 1f0fed25302cac450828abd8a250028e57486b4c (patch) | |
| tree | 318cb8cb6757c900cc567446d8579b11abfd35e6 | |
| parent | da873f1a38a5e137b0aeaf0c5750c6cbedadd10e (diff) | |
resolves #2855 honor attribute-missing setting when processing include directive
| -rw-r--r-- | CHANGELOG.adoc | 1 | ||||
| -rw-r--r-- | lib/asciidoctor/reader.rb | 12 | ||||
| -rw-r--r-- | test/reader_test.rb | 29 |
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 |
