lib/prawn/icon.rb in prawn-icon-1.2.0 vs lib/prawn/icon.rb in prawn-icon-1.3.0
- old
+ new
@@ -7,209 +7,8 @@
# This is free software. Please see the LICENSE and COPYING files for details.
require_relative 'icon/base'
require_relative 'icon/font_data'
require_relative 'icon/parser'
-
-module Prawn
- # Easy icon font usage within Prawn. Currently
- # supported icon fonts include: FontAwesome,
- # Zurb Foundicons, GitHub Octicons, as well as
- # PaymentFont.
- #
- # = Icon Keys
- #
- # Icon keys must be supplied to most +Prawn::Icon+
- # methods. Keys map directly to a unicode character
- # within the font that produces a given icon. As a
- # rule, included icon keys should match the keys from
- # the font provider. The icon key mapping is specified
- # in the font's +legend_file+, which is a +YAML+ file
- # located in Prawn::Icon::Base::FONTDIR/font/font.yml.
- #
- # Prawn::Icon::
- # Houses the methods and interfaces necessary for
- # rendering icons to the Prawn::Document.
- #
- # Prawn::Icon::FontData::
- # Used to store various information about an icon font,
- # including the key-to-unicode mapping information.
- # Also houses methods to cache and lazily load the
- # requested font data on a document basis.
- #
- # Prawn::Icon::Parser::
- # Used to initially parse icons that are used with the
- # inline_format: true option. The input string is parsed
- # once for <icon></icon> tags, then the output is provided
- # to Prawn's internal formatted text parser.
- #
- class Icon
- FONTDIR = Icon::Base::FONTDIR
-
- module Interface
- # Set up and draw an icon on this document. This
- # method operates much like +Prawn::Text::Box+.
- #
- # == Parameters:
- # key::
- # Contains the key to a particular icon within
- # a font family. If :inline_format is true,
- # then key may contain formatted text marked
- # with <icon></icon> tags and any tag supported
- # by Prawn's parser.
- #
- # opts::
- # A hash of options that may be supplied to
- # the underlying +text+ method call.
- #
- # == Examples:
- # pdf.icon 'fa-beer'
- # pdf.icon '<icon color="0099FF">fa-arrows</icon>',
- # inline_format: true
- #
- def icon(key, opts = {})
- make_icon(key, opts).tap(&:render)
- end
-
- # Initialize a new icon object, but do
- # not render it to the document.
- #
- # == Parameters:
- # key::
- # Contains the key to a particular icon within
- # a font family. If :inline_format is true,
- # then key may contain formatted text marked
- # with <icon></icon> tags and any tag supported
- # by Prawn's parser.
- #
- # opts::
- # A hash of options that may be supplied to
- # the underlying text method call.
- #
- def make_icon(key, opts = {})
- if opts[:inline_format]
- inline_icon(key, opts)
- else
- Icon.new(key, self, opts)
- end
- end
-
- # Initialize a new formatted text box containing
- # icon information, but don't render it to the
- # document.
- #
- # == Parameters:
- # text::
- # Input text to be parsed initially for <icon>
- # tags, then passed to Prawn's formatted text
- # parser.
- #
- # opts::
- # A hash of options that may be supplied to the
- # underlying text call.
- #
- def inline_icon(text, opts = {})
- parsed = Icon::Parser.format(self, text)
- content = Text::Formatted::Parser.format(parsed)
- box_options = opts.merge(
- inline_format: true,
- document: self,
- at: [bounds.left, cursor]
- )
- icon_box(content, box_options)
- end
-
- # Initialize a new Prawn::Icon, but don't render
- # the icon to a document. Intended to be used as
- # an entry of a data array when combined with
- # Prawn::Table.
- #
- # == Parameters:
- # key::
- # Contains the key to a particular icon within
- # a font family. The key may contain a string
- # with format tags if +inline_format: true+ in
- # the +opts+ hash.
- #
- # opts::
- # A hash of options that may be supplied to the
- # underlying text call.
- #
- # == Returns:
- # A Hash containing +font+ and +content+ keys
- # that match the data necessary for the
- # specified icon.
- #
- # eg. { font: 'fa', content: '\uf047' }
- #
- # Note that the +font+ key will not be set
- # if +inline_format: true+.
- #
- # == Examples:
- # require 'prawn/table'
- #
- # data = [
- # # Explicit brackets must be used here
- # [pdf.table_icon('fa-arrows'), 'Cell 1'],
- # ['Cell 2', 'Cell 3']
- # ]
- #
- # pdf.table(data) => (2 x 2 table)
- #
- def table_icon(key, opts = {})
- if opts[:inline_format]
- content = Icon::Parser.format(self, key)
- opts.merge(content: content)
- else
- make_icon(key, opts).format_hash
- end
- end
-
- private
-
- def icon_box(content, opts = {}) # :nodoc:
- Text::Formatted::Box.new(content, opts).tap do |box|
- box.render(dry_run: true)
- self.y -= box.height
- unless opts.fetch(:final_gap, true)
- self.y -= box.line_gap + box.leading
- end
- end
- end
- end
-
- attr_reader :set, :unicode
-
- def initialize(key, document, opts = {})
- @pdf = document
- @set = opts[:set] ||
- FontData.specifier_from_key(key)
- @data = FontData.load(document, @set)
- @key = strip_specifier_from_key(key)
- @unicode = @data.unicode(@key)
- @options = opts
- end
-
- def format_hash
- base = { font: @set.to_s, content: @unicode }
- opts = @options.dup
- # Prawn::Table renames :color to :text_color
- opts[:text_color] = opts.delete(:color)
- base.merge(opts)
- end
-
- def render
- @pdf.font(@data.path) do
- @pdf.text @unicode, @options
- end
- end
-
- private
-
- def strip_specifier_from_key(key) # :nodoc:
- reg = Regexp.new "#{@data.specifier}-"
- key.sub(reg, '') # Only one specifier
- end
- end
-end
+require_relative 'icon/interface'
Prawn::Document.extensions << Prawn::Icon::Interface