summaryrefslogtreecommitdiff
path: root/lib/banzai/filter/kroki_filter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/banzai/filter/kroki_filter.rb')
-rw-r--r--lib/banzai/filter/kroki_filter.rb42
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