class Asciidoctor::Diagram::MermaidConverter

@private

Public Instance Methods

collect_options(source) click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 22
def collect_options(source)
  options = {}

  options[:css] = source.attr('css')
  options[:gantt_config] = source.attr(['ganttconfig', 'gantt-config'])
  options[:seq_config] = source.attr(['sequenceconfig', 'sequence-config'])
  options[:width] = source.attr('width')
  options[:height] = source.attr('height')
  options[:scale] = source.attr('scale')
  if options[:scale]
    raise "Mermaid only supports integer scale factors: #{options[:scale]}" unless options[:scale] =~ /^[0-9]+$/
  end
  options[:theme] = source.attr('theme')
  options[:background] = source.attr('background')
  options[:config] = source.attr('config')
  options[:puppeteer_config] = source.attr(['puppeteerconfig', 'puppeteer-config'])

  options
end
convert(source, format, options) click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 42
def convert(source, format, options)
  opts = {}

  css = options[:css]
  if css
    opts[:css] = source.resolve_path(css)
  end

  gantt_config = options[:gantt_config]
  if gantt_config
    opts[:gantt] = source.resolve_path(gantt_config)
  end

  seq_config = options[:seq_config]
  if seq_config
    opts[:sequence] = source.resolve_path(seq_config)
  end

  puppeteer_config = options[:puppeteer_config]
  if puppeteer_config
    opts[:puppeteer] = source.resolve_path(puppeteer_config)
  end

  opts[:width] = options[:width]

  mmdc = source.find_command('mmdc', :raise_on_error => false)
  node = source.find_command('node', :raise_on_error => false)
  if mmdc && node
    opts[:height] = options[:height]
    opts[:scale] = options[:scale]
    opts[:theme] = options[:theme]
    opts[:background] = options[:background]
    config = options[:config]
    if config
      opts[:config] = source.resolve_path(config)
    end
    run_mmdc(node, mmdc, source, format, opts)
  else
    mermaid = source.find_command('mermaid')
    run_mermaid(mermaid, source, format, opts)
  end
end
native_scaling?() click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 18
def native_scaling?
  true
end
supported_formats() click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 14
def supported_formats
  [:png, :svg]
end

Private Instance Methods

run_mermaid(mermaid, source, format, options = {}) click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 155
def run_mermaid(mermaid, source, format, options = {})
  source.config['mermaid>=6'] ||= ::Asciidoctor::Diagram::Cli.run(mermaid, '--version')[:out].split('.')[0].to_i >= 6
  # Mermaid >= 6.0.0 requires PhantomJS 2.1; older version required 1.9
  phantomjs = source.find_command('phantomjs', :alt_attrs => [source.config['mermaid>=6'] ? 'phantomjs_2' : 'phantomjs_19'])

  generate_file(mermaid, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
    output_dir = File.dirname(output_path)
    output_file = File.expand_path(File.basename(input_path) + ".#{format.to_s}", output_dir)

    args = [tool_path, '--phantomPath', Platform.native_path(phantomjs), "--#{format.to_s}", '-o', Platform.native_path(output_dir)]

    if options[:css]
      args << '--css' << Platform.native_path(options[:css])
    end

    if options[:gantt]
      args << '--gantt_config' << Platform.native_path(options[:gantt])
    end

    if options[:sequence]
      args << '--sequenceConfig' << Platform.native_path(options[:sequence])
    end

    if options[:width]
      args << '--width' << options[:width]
    end

    args << Platform.native_path(input_path)

    {
        :args => args,
        :out_file => output_file
    }
  end
end
run_mmdc(node, mmdc, source, format, options = {}) click to toggle source
# File lib/asciidoctor-diagram/mermaid/converter.rb, line 86
def run_mmdc(node, mmdc, source, format, options = {})
  generate_file(node, 'mmd', format.to_s, source.to_s) do |tool_path, input_path, output_path|
    args = [tool_path, '--unhandled-rejections=strict', mmdc, '-i', Platform.native_path(input_path), '-o', Platform.native_path(output_path)]

    if options[:css]
      args << '--cssFile' << Platform.native_path(options[:css])
    end

    if options[:theme]
      args << '--theme' << options[:theme]
    end

    if options[:width]
      args << '--width' << options[:width]
    end

    if options[:height]
      args << '--height' << options[:height]
    end

    if options[:scale]
      args << '--scale' << options[:scale]
    end

    if options[:background]
      bg = options[:background]
      bg = "##{bg}" unless bg[0] == '#'
      args << '--backgroundColor' << bg
    end

    if options[:config]
      args << '--configFile' << Platform.native_path(options[:config])
    elsif options[:gantt] || options[:sequence]
      mermaidConfig = []

      if options[:gantt]
        mermaidConfig << "\"gantt\": #{File.read(options[:gantt])}"
      end

      if options[:sequence]
        configKey = source.config['mmdcSequenceConfigKey'] ||= begin
          version_parts = ::Asciidoctor::Diagram::Cli.run(mmdc, '--version')[:out].split('.').map { |p| p.to_i }
          major = version_parts[0] || 0
          minor = version_parts[1] || 0
          patch = version_parts[2] || 0
          if major > 0 || (major == 0 && minor > 4) || (major == 0 && minor == 4 && patch > 1)
            'sequence'
          else
            'sequenceDiagram'
          end
        end
        mermaidConfig << "\"#{configKey}\": #{File.read(options[:sequence])}"
      end

      config_file = "#{input_path}.json"

      File.write(config_file, "{#{mermaidConfig.join ','}}")

      args << '--configFile' << Platform.native_path(config_file)
    end

    if options[:puppeteer]
      args << '--puppeteerConfigFile' << Platform.native_path(options[:puppeteer])
    end

    args
  end
end