gitlab-ce/app/models/blob_viewer/graph.rb

61 lines
1.6 KiB
Ruby

# frozen_string_literal: true
require "asciidoctor_plantuml/plantuml"
module BlobViewer
class Graph < Base
include Rich
include ServerSide
INTERNAL_EXTENSIONS = %w[mermaid].freeze
PLANTUML_EXTENSIONS = %w[plantuml pu puml iuml].freeze
KROKI_EXTENSIONS = %w[d2 dot gv noml plantuml pu puml iuml vg vl].freeze
self.partial_name = 'graph'
self.extensions = INTERNAL_EXTENSIONS + PLANTUML_EXTENSIONS + KROKI_EXTENSIONS
self.binary = false
self.switcher_icon = 'doc-image'
self.switcher_title = 'image'
def self.can_render?(blob, verify_binary: true)
# most blob views will not be graph files and the local can_render checks are a bit expensive
return false unless super
settings = Gitlab::CurrentSettings.current_application_settings
return true if INTERNAL_EXTENSIONS&.include?(blob.extension)
return true if settings.plantuml_enabled? && PLANTUML_EXTENSIONS&.include?(blob.extension)
return true if settings.kroki_enabled? && ::Gitlab::Kroki.formats(settings).include?(graph_format(blob))
false
end
def self.graph_format(blob)
case blob.extension
# included formats
when *%w[mermaid]
'mermaid'
# kroki formats
when *%w[d2]
'd2'
when *%w[dot gv]
'graphviz'
when *%w[noml]
'nomnoml'
when *%w[vg]
'vega'
when *%w[vl]
'vegalite'
# kroki/plantuml formats
when *%w[plantuml pu puml iuml]
'plantuml'
end
end
def banzai_render_context
{}.tap do |h|
h[:cache_key] = ['blob', blob.id, 'commit', blob.commit_id]
end
end
end
end