class Asciidoctor::Diagram::MemeConverter

@private

Public Instance Methods

collect_options(source) click to toggle source
# File lib/asciidoctor-diagram/meme/converter.rb, line 18
def collect_options(source)
  bg_img = source.attr('background')
  raise "background attribute is required" unless bg_img

  margin = source.attr('margin', '')
  margin_parts = margin.split(' ')
  case margin_parts.length
    when 0
      ml = mr = mt = mb = nil
    when 1
      ml = mr = mt = mb = margin_parts[0]
    when 2
      mt = mb = margin_parts[0]
      ml = mr = margin_parts[1]
    when 3
      mt = margin_parts[0]
      ml = mr = margin_parts[1]
      mb = margin_parts[2]
    else
      mt = margin_parts[0]
      mr = margin_parts[1]
      mb = margin_parts[2]
      ml = margin_parts[3]
  end

  {
      :bg_img => bg_img,
      :top_label => source.attr('top'),
      :bottom_label => source.attr('bottom'),
      :fill_color => source.attr(['fillcolor', 'fill-color']),
      :stroke_color => source.attr(['strokecolor', 'stroke-color']),
      :stroke_width => source.attr(['strokewidth', 'stroke-width']),
      :font => source.attr('font', 'Impact'),
      :font_size => source.attr('font_size', nil),
      :alignment => source.attr('alignment', nil),
      :margin_left => ml,
      :margin_right => mr,
      :margin_top => mt,
      :margin_bottom => mb,
      :noupcase => source.opt('noupcase'),
      :imagesdir => source.attr('imagesdir')
  }
end
convert(source, format, options) click to toggle source
# File lib/asciidoctor-diagram/meme/converter.rb, line 62
def convert(source, format, options)
  magick = source.find_command('magick', :raise_on_error => false)
  if magick
    convert = ->(*args) { Cli.run(magick, 'convert', *args) }
    identify = ->(*args) { Cli.run(magick, 'identify', *args) }
  else
    convert_cmd = source.find_command('convert')
    convert = ->(*args) { Cli.run(convert_cmd, *args) }
    identify_cmd = source.find_command('identify')
    identify = ->(*args) { Cli.run(identify_cmd, *args) }
  end

  bg_img = options[:bg_img]
  raise "background attribute is required" unless bg_img

  bg_img = source.resolve_path(bg_img, options[:imagesdir])

  top_label = options[:top_label]
  bottom_label = options[:bottom_label]
  fill_color = options[:fill_color] || 'white'
  stroke_color = options[:stroke_color] || 'black'
  stroke_width = options[:stroke_width] || '2'
  font = options[:font] || 'Impact'
  noupcase = options[:noupcase]

  dimensions = identify.call('-format', '%w %h', bg_img)[:out].match(/(?<w>\d+) (?<h>\d+)/)
  bg_width = dimensions['w'].to_i
  bg_height = dimensions['h'].to_i
  label_width = bg_width
  label_height = bg_height / 5

  if top_label
    top_img = Tempfile.new(['meme', '.png'])
    convert.call(
        '-background', 'none',
        '-fill', fill_color,
        '-stroke', stroke_color,
        '-strokewidth', stroke_width,
        '-font', font,
        '-size', "#{label_width}x#{label_height}",
        '-gravity', 'north',
        "label:#{prepare_label(top_label, noupcase)}",
        top_img.path
    )
  else
    top_img = nil
  end

  if bottom_label
    bottom_img = Tempfile.new(['meme', '.png'])
    convert.call(
        '-background', 'none',
        '-fill', fill_color,
        '-stroke', stroke_color,
        '-strokewidth', stroke_width,
        '-font', font,
        '-size', "#{label_width}x#{label_height}",
        '-gravity', 'south',
        "label:#{prepare_label(bottom_label, noupcase)}",
        bottom_img.path
    )
  else
    bottom_img = nil
  end

  final_img = Tempfile.new(['meme', ".#{format.to_s}"])

  args = [bg_img]
  if top_img
    args << top_img.path << '-geometry' << '+0+0' << '-composite'
  end

  if bottom_img
    args << bottom_img.path << '-geometry' << "+0+#{bg_height - label_height}" << '-composite'
  end

  args << final_img.path

  convert.call(*args)

  File.binread(final_img)
end
supported_formats() click to toggle source
# File lib/asciidoctor-diagram/meme/converter.rb, line 13
def supported_formats
  [:png, :gif]
end

Private Instance Methods

prepare_label(label, noupcase) click to toggle source
# File lib/asciidoctor-diagram/meme/converter.rb, line 147
def prepare_label(label, noupcase)
  label = label.upcase unless noupcase
  label = label.gsub(' // ', '\n')
  label
end