diff options
Diffstat (limited to 'lib/banzai/filter/kroki_filter.rb')
-rw-r--r-- | lib/banzai/filter/kroki_filter.rb | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/lib/banzai/filter/kroki_filter.rb b/lib/banzai/filter/kroki_filter.rb new file mode 100644 index 00000000000..dbd4de32a47 --- /dev/null +++ b/lib/banzai/filter/kroki_filter.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require "nokogiri" +require "asciidoctor/extensions/asciidoctor_kroki/extension" + +module Banzai + module Filter + # HTML that replaces all diagrams supported by Kroki with the corresponding img tags. + # + class KrokiFilter < HTML::Pipeline::Filter + def call + return doc unless settings.kroki_enabled + + diagram_selectors = ::Gitlab::Kroki.formats(settings) + .map { |diagram_type| %(pre[lang="#{diagram_type}"] > code) } + .join(', ') + + return doc unless doc.at(diagram_selectors) + + diagram_format = "svg" + doc.css(diagram_selectors).each do |node| + diagram_type = node.parent['lang'] + img_tag = Nokogiri::HTML::DocumentFragment.parse(%(<img src="#{create_image_src(diagram_type, diagram_format, node.content)}"/>)) + node.parent.replace(img_tag) + end + + doc + end + + private + + def create_image_src(type, format, text) + ::AsciidoctorExtensions::KrokiDiagram.new(type, format, text) + .get_diagram_uri(settings.kroki_url) + end + + def settings + Gitlab::CurrentSettings.current_application_settings + end + end + end +end |