class AsciidoctorExtensions::KrokiProcessor

Internal processor

Constants

TEXT_FORMATS

Public Class Methods

process(processor, parent, attrs, diagram_type, diagram_text, logger) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 138
def process(processor, parent, attrs, diagram_type, diagram_text, logger)
  doc = parent.document
  diagram_text = prepend_plantuml_config(diagram_text, diagram_type, doc, logger)
  # If "subs" attribute is specified, substitute accordingly.
  # Be careful not to specify "specialcharacters" or your diagram code won't be valid anymore!
  if (subs = attrs['subs'])
    diagram_text = parent.apply_subs(diagram_text, parent.resolve_subs(subs))
  end
  title = attrs.delete('title')
  caption = attrs.delete('caption')
  attrs.delete('opts')
  role = attrs['role']
  format = get_format(doc, attrs, diagram_type)
  attrs['role'] = get_role(format, role)
  attrs['format'] = format
  kroki_diagram = KrokiDiagram.new(diagram_type, format, diagram_text)
  kroki_client = KrokiClient.new(server_url(doc), http_method(doc), KrokiHttpClient, logger, max_uri_length(doc))
  if TEXT_FORMATS.include?(format)
    text_content = kroki_client.text_content(kroki_diagram)
    block = processor.create_block(parent, 'literal', text_content, attrs)
  else
    attrs['alt'] = get_alt(attrs)
    attrs['target'] = create_image_src(doc, kroki_diagram, kroki_client)
    block = processor.create_image_block(parent, attrs)
  end
  block.title = title if title
  block.assign_caption(caption, 'figure')
  block
end

Private Class Methods

create_image_src(doc, kroki_diagram, kroki_client) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 219
def create_image_src(doc, kroki_diagram, kroki_client)
  if doc.attr('kroki-fetch-diagram') && doc.safe < ::Asciidoctor::SafeMode::SECURE
    kroki_diagram.save(output_dir_path(doc), kroki_client)
  else
    kroki_diagram.get_diagram_uri(server_url(doc))
  end
end
get_alt(attrs) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 185
def get_alt(attrs)
  if (title = attrs['title'])
    title
  elsif (target = attrs['target'])
    target
  else
    'Diagram'
  end
end
get_format(doc, attrs, diagram_type) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 207
def get_format(doc, attrs, diagram_type)
  format = attrs['format'] || 'svg'
  # The JavaFX preview doesn't support SVG well, therefore we'll use PNG format...
  if doc.attr?('env-idea') && format == 'svg'
    # ... unless the diagram library does not support PNG as output format!
    # Currently, mermaid, nomnoml, svgbob, wavedrom only support SVG as output format.
    svg_only_diagram_types = %w[:mermaid :nomnoml :svgbob :wavedrom]
    format = 'png' unless svg_only_diagram_types.include?(diagram_type)
  end
  format
end
get_role(format, role) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 195
def get_role(format, role)
  if role
    if format
      "#{role} kroki-format-#{format} kroki"
    else
      "#{role} kroki"
    end
  else
    'kroki'
  end
end
http_method(doc) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 231
def http_method(doc)
  doc.attr('kroki-http-method', 'adaptive').downcase
end
max_uri_length(doc) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 235
def max_uri_length(doc)
  doc.attr('kroki-max-uri-length', '4000').to_i
end
output_dir_path(doc) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 239
def output_dir_path(doc)
  images_dir = doc.attr('imagesdir', '')
  if (images_output_dir = doc.attr('imagesoutdir'))
    images_output_dir
  elsif (out_dir = doc.attr('outdir'))
    File.join(out_dir, images_dir)
  elsif (to_dir = doc.attr('to_dir'))
    File.join(to_dir, images_dir)
  else
    File.join(doc.base_dir, images_dir)
  end
end
prepend_plantuml_config(diagram_text, diagram_type, doc, logger) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 170
def prepend_plantuml_config(diagram_text, diagram_type, doc, logger)
  if diagram_type == :plantuml && doc.safe < ::Asciidoctor::SafeMode::SECURE && doc.attr?('kroki-plantuml-include')
    # REMIND: this behaves different than the JS version
    # Once we have a preprocessor for Ruby, the value should be added in the diagram source as "!include #{plantuml_include}"
    plantuml_include_path = doc.normalize_system_path(doc.attr('kroki-plantuml-include'))
    if ::File.readable? plantuml_include_path
      config = File.read(plantuml_include_path)
      diagram_text = config + "\n" + diagram_text
    else
      logger.warn "Unable to read plantuml-include. File not found or not readable: #{plantuml_include_path}."
    end
  end
  diagram_text
end
server_url(doc) click to toggle source
# File lib/asciidoctor/extensions/asciidoctor_kroki/extension.rb, line 227
def server_url(doc)
  doc.attr('kroki-server-url', 'https://kroki.io')
end