class AvatarMagick::Generators::InitialAvatar

Generates an initials avatar by extracting the first letter of the first 3 words in string. Can be customized with background color, text color, font, and size.

Public Instance Methods

call(content, string, opts={}) click to toggle source
# File lib/avatar_magick/generators/initial_avatar.rb, line 10
def call(content, string, opts={})
  opts = ::Dragonfly::HashWithCssStyleKeys[opts]
  args = []

  # defaults
  format      = opts[:format] || 'png'
  background  = opts[:background_color] ? "##{opts[:background_color]}" : content.env[:avatar_magick][:background_color]
  color       = opts[:color] ? "##{opts[:color]}" : content.env[:avatar_magick][:color]
  size        = opts[:size] || content.env[:avatar_magick][:size]
  font        = opts[:font] || content.env[:avatar_magick][:font]

  # extract the first letter of the first 3 words and capitalize
  text = (string.split(/\s/)- ["", nil]).map { |t| t[0].upcase }.slice(0, 3).join('')

  w, h = size.split('x').map { |d| d.to_i }
  h ||= w

  font_size = ( w / [text.length, 2].max ).to_i

  # Settings
  args.push("-gravity none")
  args.push("-antialias")
  args.push("-pointsize #{font_size}")
  args.push("-font \"#{font}\"")
  args.push("-family '#{opts[:font_family]}'") if opts[:font_family]
  args.push("-fill #{color}")
  args.push("-background #{background}")
  args.push("label:#{text}")

  content.generate!(:convert, args.join(' '), format)

  args.clear
  args.push("-gravity center")
  args.push("-extent #{w}x#{h}")

  content.process!(:convert, args.join(' '))

  content.add_meta('format' => format, 'name' => "avatar.#{format}")
end