module Prawn::Markup::Processor::Images

Constants

ALLOWED_IMAGE_TYPES

Public Class Methods

prepended(base) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 10
def self.prepended(base)
  base.known_elements.push('img', 'iframe')
end

Public Instance Methods

start_iframe() click to toggle source
# File lib/prawn/markup/processor/images.rb, line 19
def start_iframe
  placeholder = iframe_placeholder
  append_text("\n#{placeholder}\n") if placeholder
end
start_img() click to toggle source
# File lib/prawn/markup/processor/images.rb, line 14
def start_img
  add_current_text
  add_image_or_placeholder(current_attrs['src'])
end

Private Instance Methods

add_image(img) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 35
def add_image(img)
  # parse width in the current context
  img[:width] = SizeConverter.new(pdf.bounds.width).parse(style_properties['width'])
  pdf.image(img.delete(:image), img)
  put_bottom_margin(text_margin_bottom)
rescue Prawn::Errors::UnsupportedImageType
  append_text("\n#{invalid_image_placeholder}\n")
end
add_image_or_placeholder(src) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 26
def add_image_or_placeholder(src)
  img = image_properties(src)
  if img
    add_image(img)
  else
    append_text("\n#{invalid_image_placeholder}\n")
  end
end
convert_float_to_position(float) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 77
def convert_float_to_position(float)
  { nil => nil,
    'none' => nil,
    'left' => :left,
    'right' => :right }[float]
end
decode_base64_image(src) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 64
def decode_base64_image(src)
  match = src.match(/^data:(.*?);(.*?),(.*)$/)
  if match && ALLOWED_IMAGE_TYPES.include?(match[1])
    StringIO.new(Base64.decode64(match[3]))
  end
end
iframe_placeholder() click to toggle source
# File lib/prawn/markup/processor/images.rb, line 88
def iframe_placeholder
  placeholder_value(%i[iframe placeholder], current_attrs['src'])
end
image_properties(src) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 44
def image_properties(src)
  img = load_image(src)
  if img
    props = style_properties
    {
      image: img,
      width: props['width'],
      position: convert_float_to_position(props['float'])
    }
  end
end
invalid_image_placeholder() click to toggle source
# File lib/prawn/markup/processor/images.rb, line 84
def invalid_image_placeholder
  placeholder_value(%i[image placeholder]) || '[unsupported image]'
end
load_image(src) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 56
def load_image(src)
  if options[:image] && options[:image][:loader]
    options[:image][:loader].call(src)
  else
    decode_base64_image(src) || load_remote_image(src)
  end
end
load_remote_image(src) click to toggle source
# File lib/prawn/markup/processor/images.rb, line 71
def load_remote_image(src)
  if src =~ %r{^https?:/}
    URI.parse(src).open
  end
end