summaryrefslogtreecommitdiff
path: root/lib/gitlab/asciidoc/mermaid_block_processor.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/asciidoc/mermaid_block_processor.rb')
-rw-r--r--lib/gitlab/asciidoc/mermaid_block_processor.rb35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/gitlab/asciidoc/mermaid_block_processor.rb b/lib/gitlab/asciidoc/mermaid_block_processor.rb
new file mode 100644
index 00000000000..03d1c7f1961
--- /dev/null
+++ b/lib/gitlab/asciidoc/mermaid_block_processor.rb
@@ -0,0 +1,35 @@
+# frozen_string_literal: true
+
+require 'asciidoctor'
+
+module Gitlab
+ module Asciidoc
+ # Mermaid BlockProcessor
+ class MermaidBlockProcessor < ::Asciidoctor::Extensions::BlockProcessor
+ use_dsl
+
+ named :mermaid
+ on_context :literal, :listing
+ parse_content_as :simple
+
+ def process(parent, reader, attrs)
+ create_mermaid_source_block(parent, reader.read, attrs)
+ end
+
+ private
+
+ def create_mermaid_source_block(parent, content, attrs)
+ # If "subs" attribute is specified, substitute accordingly.
+ # Be careful not to specify "specialcharacters" or your diagram code won't be valid anymore!
+ subs = attrs['subs']
+ content = parent.apply_subs(content, parent.resolve_subs(subs)) if subs
+ html = %(<div><pre data-mermaid-style="display">#{CGI.escape_html(content)}</pre></div>)
+ ::Asciidoctor::Block.new(parent, :pass, {
+ content_model: :raw,
+ source: html,
+ subs: :default
+ }.merge(attrs))
+ end
+ end
+ end
+end