From d274f93780cdb764dd0eab3030206bc8c85d576a Mon Sep 17 00:00:00 2001 From: Dmitry Pavlov Date: Sun, 24 Mar 2024 15:37:36 +0300 Subject: [PATCH 1/4] Properly resolving target file location for block macros Fixes #446 --- ruby/Gemfile.lock | 2 +- .../extensions/asciidoctor_kroki/extension.rb | 14 +++++++++--- .../extensions/asciidoctor_kroki/version.rb | 2 +- .../asciidoctor_kroki_block_macro_spec.rb | 22 ++++++++++++++++--- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 26c7c31c..85aa447b 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - asciidoctor-kroki (0.10.0) + asciidoctor-kroki (0.10.1) asciidoctor (~> 2.0) GEM diff --git a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb index 4e41bba6..fa4553e2 100644 --- a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb +++ b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb @@ -53,6 +53,12 @@ def initialize(name = nil, config = {}) super(name, config) end + # Processes the diagram block or block macro by converting it into an image or literal block. + # + # @param parent [Asciidoctor::AbstractBlock] the parent asciidoc block of the block or block macro being processed + # @param target [String] the target value of a block macro + # @param attrs [Hash] the attributes of the block or block macro + # @return [Asciidoctor::AbstractBlock] a new block that replaces the original block or block macro def process(parent, target, attrs) diagram_type = @name target = parent.apply_subs(target, [:attributes]) @@ -62,7 +68,7 @@ def process(parent, target, attrs) return create_block(parent, :paragraph, link.convert, {}, content_model: :raw) end - unless (path = resolve_target_path(target)) + unless (path = resolve_target_path(parent, target)) logger.error message_with_context "#{diagram_type} block macro not found: #{target}.", source_location: parent.document.reader.cursor_at_mark return create_block(parent, 'paragraph', unresolved_block_macro_message(diagram_type, target), {}) end @@ -80,8 +86,10 @@ def process(parent, target, attrs) attr_reader :logger - def resolve_target_path(target) - target + # @param parent [Asciidoctor::AbstractBlock] the parent asciidoc block of the block or block macro being processed + # @param target [Asciidoctor::Reader, String] the target value of a block macro + def resolve_target_path(parent, target) + parent.normalize_system_path(target) end def read_allowed?(_target) diff --git a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb index d8685f10..bb03ebf1 100644 --- a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb +++ b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb @@ -2,6 +2,6 @@ module Asciidoctor module AsciidoctorKroki - VERSION = '0.10.0' + VERSION = '0.10.1' end end diff --git a/ruby/spec/asciidoctor_kroki_block_macro_spec.rb b/ruby/spec/asciidoctor_kroki_block_macro_spec.rb index f70d8fde..13100fe7 100644 --- a/ruby/spec/asciidoctor_kroki_block_macro_spec.rb +++ b/ruby/spec/asciidoctor_kroki_block_macro_spec.rb @@ -9,10 +9,18 @@ describe ::AsciidoctorExtensions::KrokiBlockMacroProcessor do context 'convert to html5' do it 'should catch exception if target is not readable' do + class PlainResolutionKrokiMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor + def resolve_target_path(_parent, target) + target + end + end + registry = Asciidoctor::Extensions.create do + block_macro PlainResolutionKrokiMacroProcessor, 'plantuml' + end input = <<~'ADOC' plantuml::spec/fixtures/missing.puml[svg,role=sequence] ADOC - output = Asciidoctor.convert(input, standalone: false) + output = Asciidoctor.convert(input, standalone: false, extension_registry: registry) (expect output).to eql %(

Unresolved block macro - plantuml::spec/fixtures/missing.puml[]

) @@ -22,6 +30,10 @@ it 'should disallow read' do # noinspection RubyClassModuleNamingConvention class DisallowReadKrokiBlockMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor + def resolve_target_path(_parent, target) + target + end + def read_allowed?(_target) false end @@ -72,7 +84,7 @@ def read_allowed?(target) it 'should override the resolve target method' do # noinspection RubyClassModuleNamingConvention class FixtureResolveTargetKrokiBlockMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor - def resolve_target_path(target) + def resolve_target_path(_parent, target) "spec/fixtures/#{target}" end end @@ -92,7 +104,7 @@ def resolve_target_path(target) it 'should display unresolved block macro message when the target cannot be resolved' do # noinspection RubyClassModuleNamingConvention class UnresolvedTargetKrokiBlockMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor - def resolve_target_path(_target) + def resolve_target_path(_target, _parent) nil end end @@ -110,6 +122,10 @@ def resolve_target_path(_target) it 'should override the unresolved block macro message' do # noinspection RubyClassModuleNamingConvention class CustomUnresolvedTargetMessageKrokiBlockMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor + def resolve_target_path(_parent, target) + target + end + def unresolved_block_macro_message(name, target) "*[ERROR: #{name}::#{target}[] - unresolved block macro]*" end From 977e3b3f428b4e799933acfc634319a7bbff3fd9 Mon Sep 17 00:00:00 2001 From: Dmitry Pavlov Date: Sun, 24 Mar 2024 15:39:26 +0300 Subject: [PATCH 2/4] fixed typing --- ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb index fa4553e2..eac6bcce 100644 --- a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb +++ b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb @@ -87,7 +87,7 @@ def process(parent, target, attrs) attr_reader :logger # @param parent [Asciidoctor::AbstractBlock] the parent asciidoc block of the block or block macro being processed - # @param target [Asciidoctor::Reader, String] the target value of a block macro + # @param target [String] the target value of a block macro def resolve_target_path(parent, target) parent.normalize_system_path(target) end From 9270dfc870505cce458847a5f3a9aaeefce0cabf Mon Sep 17 00:00:00 2001 From: Dmitry Pavlov Date: Fri, 29 Mar 2024 09:40:15 +0300 Subject: [PATCH 3/4] Reverted version bump --- ruby/Gemfile.lock | 2 +- ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ruby/Gemfile.lock b/ruby/Gemfile.lock index 85aa447b..26c7c31c 100644 --- a/ruby/Gemfile.lock +++ b/ruby/Gemfile.lock @@ -1,7 +1,7 @@ PATH remote: . specs: - asciidoctor-kroki (0.10.1) + asciidoctor-kroki (0.10.0) asciidoctor (~> 2.0) GEM diff --git a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb index bb03ebf1..d8685f10 100644 --- a/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb +++ b/ruby/lib/asciidoctor/extensions/asciidoctor_kroki/version.rb @@ -2,6 +2,6 @@ module Asciidoctor module AsciidoctorKroki - VERSION = '0.10.1' + VERSION = '0.10.0' end end From 2010d9a75523330b62d2acc5aceb849b96a8449c Mon Sep 17 00:00:00 2001 From: Dmitry Pavlov Date: Fri, 29 Mar 2024 10:08:02 +0300 Subject: [PATCH 4/4] Special test to verify proper resolution of relative paths in block macro --- .../asciidoctor_kroki_block_macro_spec.rb | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/ruby/spec/asciidoctor_kroki_block_macro_spec.rb b/ruby/spec/asciidoctor_kroki_block_macro_spec.rb index 13100fe7..c0470c7f 100644 --- a/ruby/spec/asciidoctor_kroki_block_macro_spec.rb +++ b/ruby/spec/asciidoctor_kroki_block_macro_spec.rb @@ -1,6 +1,7 @@ # rubocop:disable Lint/ConstantDefinitionInBlock # frozen_string_literal: true +require 'tmpdir' require 'rspec_helper' require 'asciidoctor' require_relative '../lib/asciidoctor/extensions/asciidoctor_kroki' @@ -104,7 +105,7 @@ def resolve_target_path(_parent, target) it 'should display unresolved block macro message when the target cannot be resolved' do # noinspection RubyClassModuleNamingConvention class UnresolvedTargetKrokiBlockMacroProcessor < ::AsciidoctorExtensions::KrokiBlockMacroProcessor - def resolve_target_path(_target, _parent) + def resolve_target_path(_, _) nil end end @@ -141,6 +142,28 @@ def unresolved_block_macro_message(name, target)

[ERROR: plantuml::spec/fixtures/missing.puml[] - unresolved block macro]

) end + + it 'should properly resolve relative path to files' do + Dir.mktmpdir('rspec-') do |temp_dir| + temp_file = "#{temp_dir}/test.adoc" + assets_dir = "#{temp_dir}/_assets" + + File.open(temp_file, 'w') do |f| + content = <<~'ADOC' + plantuml::_assets/alice.puml[svg,role=sequence] + ADOC + f.write(content) + end + Dir.mkdir(assets_dir) + FileUtils.cp('spec/fixtures/alice.puml', "#{assets_dir}/alice.puml") + Asciidoctor.convert_file(temp_file, standalone: false) + (expect File.read("#{temp_dir}/test.html")).to eql %(
+
+Diagram +
+
) + end + end end end # rubocop:enable Lint/ConstantDefinitionInBlock