Sha256: ffcaad2504c8cbf77a902a410a984a756eaac5b100ecf7af303ef1f41d58f8a3

Contents?: true

Size: 1.49 KB

Versions: 6

Compression:

Stored size: 1.49 KB

Contents

#
# Font helper
#

require 'mini_magick'
require 'pp'

module VCSRuby
  IMFont = Struct.new(:name, :family, :style, :stretch, :weight, :glyphs)

  class Font
    attr_reader :name, :path, :size

    @@fonts = {}

    def initialize name, size
      @name = name
      @path = find_path
      @size = size
    end

    def exists?
      load_font_cache if @@fonts.length == 0

      !!font_by_name(@name)
    end

    def find_path
      load_font_cache if @@fonts.length == 0

      if exists?
        font_by_name(@name).glyphs
      else
        nil
      end
    end

    def font_by_name name
      if name =~ /\./
        _, font = @@fonts.select{ |k, f| f.glyphs =~ /#{name}\z/ }.first
        return font
      else
        @@fonts[name]
      end
    end

    def load_font_cache

      fonts = MiniMagick::Tool::Identify.new(whiny: false) do |identify|
        identify.list 'font'
      end

      parse_fonts(fonts)
    end

    def parse_fonts(fonts)
      font = nil
      fonts.lines.each do |line|
        key, value = line.strip.split(':', 2).map(&:strip)

        next if [nil, 'Path'].include? key

        if key == 'Font'
          @@fonts[value] = font = IMFont.new(value)
        else
          font.send("#{key}=", value)
        end
      end
    end

    def line_height
      MiniMagick::Tool::Convert.new do |convert|
        convert.font path if exists?
        convert.pointsize size
        convert << 'label:F'
        convert.format '%h'
        convert << 'info:'
      end.to_i
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
vcs_ruby-1.1.16 lib/font.rb
vcs_ruby-1.1.15 lib/font.rb
vcs_ruby-1.1.14 lib/font.rb
vcs_ruby-1.1.13 lib/font.rb
vcs_ruby-1.1.12 lib/font.rb
vcs_ruby-1.1.11 lib/font.rb