class Avatarly

Constants

BACKGROUND_COLORS

Public Class Methods

generate_avatar(text, opts={}) click to toggle source
# File lib/avatarly.rb, line 18
def generate_avatar(text, opts={})
  if opts[:lang]
    text = UnicodeUtils.upcase(initials(text.to_s.gsub(/[^[[:word:]] ]/,'').strip, opts), opts[:lang])
  else
    text = initials(text.to_s.gsub(/[^\w ]/,'').strip, opts).upcase
  end
  generate_image(text, parse_options(opts)).to_blob
end
lib() click to toggle source
# File lib/avatarly.rb, line 31
def lib
  File.join root, 'lib'
end
root() click to toggle source
# File lib/avatarly.rb, line 27
def root
  File.expand_path '../..', __FILE__
end

Private Class Methods

default_options() click to toggle source
# File lib/avatarly.rb, line 79
def default_options
  { background_color: BACKGROUND_COLORS.sample,
    font_color: '#FFFFFF',
    size: 32,
    vertical_offset: 0,
    font: "#{fonts}/Roboto.ttf",
    format: "png" }
end
draw_text(canvas, text, opts) click to toggle source
# File lib/avatarly.rb, line 50
def draw_text(canvas, text, opts)
  Magick::Draw.new do |md|
    md.pointsize = opts[:font_size]
    md.font = opts[:font]
    md.fill = opts[:font_color]
    md.gravity = Magick::CenterGravity
  end.annotate(canvas, 0, 0, 0, opts[:vertical_offset], text)
end
fonts() click to toggle source
# File lib/avatarly.rb, line 37
def fonts
  File.join root, 'assets/fonts'
end
generate_image(text, opts) click to toggle source
# File lib/avatarly.rb, line 41
def generate_image(text, opts)
  image = Magick::RVG.new(opts[:size], opts[:size]).viewbox(0, 0, opts[:size], opts[:size]) do |canvas|
    canvas.background_fill = opts[:background_color]
  end.draw
  image.format = opts[:format]
  draw_text(image, text, opts) if text.length > 0
  image
end
initials(text, opts) click to toggle source
# File lib/avatarly.rb, line 59
def initials(text, opts)
  if opts[:separator]
    initials_for_separator(text, opts[:separator])
  elsif text.is_email?
    initials_for_separator(text.split("@").first, ".")
  elsif text.include?(" ")
    initials_for_separator(text, " ")
  else
    initials_for_separator(text, ".")
  end
end
initials_for_separator(text, separator) click to toggle source
# File lib/avatarly.rb, line 71
def initials_for_separator(text, separator)
  if text.include?(separator)
    text.split(separator).compact.map{|part| part[0]}.join
  else
    text[0] || ''
  end
end
parse_options(opts) click to toggle source
# File lib/avatarly.rb, line 88
def parse_options(opts)
  opts = default_options.merge(opts)
  opts[:size] = opts[:size].to_i
  opts[:font] = default_options[:font] unless Pathname(opts[:font]).exist?
  opts[:font_size] ||= opts[:size] / 2
  opts[:font_size] = opts[:font_size].to_i
  opts[:vertical_offset] = opts[:vertical_offset].to_i
  opts
end