You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

238 lines
7.1 KiB

require 'squib/constants'
module Squib
# :nodoc:
# @api private
module InputHelpers
# :nodoc:
# @api private
def needs(opts, params)
Squib.logger.debug {"Method #{caller(1,1)} was given the following opts: #{opts}"}
opts = layoutify(opts) if params.include? :layout
opts = Squib::SYSTEM_DEFAULTS.merge(opts)
opts = expand_singletons(opts, params)
opts = rangeify(opts) if params.include? :range
opts = fileify(opts) if params.include? :file
opts = fileify(opts, false) if params.include? :file_to_save
opts = colorify(opts, true) if params.include? :nillable_color
opts = dirify(opts, :dir, true) if params.include? :creatable_dir
opts = dirify(opts, :img_dir, false) if params.include? :img_dir
opts = fileify(opts, false) if params.include? :files
opts = colorify(opts) if params.include? :color
opts = colorify(opts, false, :fill_color) if params.include? :fill_color
opts = colorify(opts, false, :stroke_color) if params.include? :stroke_color
opts = fontify(opts) if params.include? :font
opts = radiusify(opts) if params.include? :rect_radius
opts = svgidify(opts) if params.include? :svgid
opts = formatify(opts) if params.include? :formats
opts = rotateify(opts) if params.include? :rotate
opts = rowify(opts) if params.include? :rows
opts = faceify(opts) if params.include? :face
opts = convert_units(opts, params)
opts
end
module_function :needs
# :nodoc:
# @api private
def expand_singletons(opts, needed_params)
Squib::EXPANDING_PARAMS.each_pair do |param_name, api_param|
if needed_params.include? param_name
unless opts[api_param].respond_to?(:each)
opts[api_param] = [opts[api_param]] * @cards.size
end
end
end
Squib.logger.debug {"After expand_singletons: #{opts}"}
opts
end
module_function :expand_singletons
# Layouts have to come before, so we repeat expand_singletons here
# :nodoc:
# @api private
def layoutify(opts)
unless opts[:layout].respond_to?(:each)
opts[:layout] = [opts[:layout]] * @cards.size
end
opts[:layout].each_with_index do |layout, i|
unless layout.nil?
entry = @layout[layout.to_s]
unless entry.nil?
entry.each do |key, value|
opts[key.to_sym] = [] if opts[key.to_sym].nil?
opts[key.to_sym][i] ||= entry[key] #don't override if it's already there
end
else
Squib.logger.warn ("Layout entry '#{layout}' does not exist." )
end
end
end
Squib.logger.debug {"After layoutify: #{opts}"}
opts
end
module_function :layoutify
# :nodoc:
# @api private
def formatify(opts)
opts[:format] = [opts[:format]].flatten
opts
end
module_function :formatify
# :nodoc:
# @api private
def rangeify (opts)
range = opts[:range]
raise 'Range cannot be nil' if range.nil?
range = 0..(@cards.size-1) if range == :all
range = range..range if range.is_a? Integer
if range.max > (@cards.size-1)
raise ArgumentError.new("#{range} is outside of deck range of 0..#{@cards.size-1}")
end
opts[:range] = range
Squib.logger.debug {"After rangeify: #{opts}"}
opts
end
module_function :rangeify
# :nodoc:
# @api private
def fileify(opts, file_must_exist=true)
[opts[:file]].flatten.each do |file|
if file_must_exist and !File.exists?(file)
raise "File #{File.expand_path(file)} does not exist!"
end
end
opts
end
module_function :fileify
# :nodoc:
# @api private
def dirify(opts, key, allow_create=false)
return opts if Dir.exists?(opts[key])
if allow_create
Squib.logger.warn("Dir '#{opts[key]}' does not exist, creating it.")
Dir.mkdir opts[key]
return opts
else
raise "'#{opts[key]}' does not exist!"
end
end
module_function :dirify
# :nodoc:
# @api private
def colorify(opts, nillable=false, key=:color)
opts[key].each_with_index do |color, i|
unless nillable && color.nil?
if @custom_colors.key? color.to_s
color = @custom_colors[color.to_s]
end
opts[key][i] = color
end
end
Squib.logger.debug {"After colorify: #{opts}"}
opts
end
module_function :colorify
# :nodoc:
# @api private
def fontify (opts)
opts[:font].each_with_index do |font, i|
opts[:font][i] = @font if font==:use_set
opts[:font][i] = Squib::SYSTEM_DEFAULTS[:default_font] if font == :default
end
Squib.logger.debug {"After fontify: #{opts}"}
opts
end
module_function :fontify
# :nodoc:
# @api private
def radiusify(opts)
opts[:radius].each_with_index do |radius, i|
unless radius.nil?
opts[:x_radius][i] = radius
opts[:y_radius][i] = radius
end
end
Squib.logger.debug {"After radiusify: #{opts}"}
opts
end
module_function :radiusify
# :nodoc:
# @api private
def svgidify(opts)
opts[:id].each_with_index do |id, i|
unless id.nil?
opts[:id][i] = '#' << id unless id.start_with? '#'
end
end
Squib.logger.debug {"After svgidify: #{opts}"}
opts
end
module_function :svgidify
# :nodoc:
# @api private
def rotateify(opts)
case opts[:rotate]
when true, :clockwise
opts[:angle] = 0.5 * Math::PI
when :counterclockwise
opts[:angle] = 1.5 * Math::PI
end
Squib.logger.debug {"After rotateify: #{opts}"}
opts
end
module_function :rotateify
# Convert units
# :nodoc:
# @api private
def convert_units(opts, needed_params)
Squib::UNIT_CONVERSION_PARAMS.each_pair do |param_name, api_param|
if needed_params.include? param_name
opts[api_param].each_with_index do |arg, i|
case arg.to_s.rstrip
when /in$/ #ends with "in"
opts[api_param][i] = arg.rstrip[0..-2].to_f * @dpi
when /cm$/ #ends with "cm"
opts[api_param][i] = arg.rstrip[0..-2].to_f * @dpi * Squib::INCHES_IN_CM
end
end
end
end
Squib.logger.debug {"After convert_units: #{opts}"}
return opts
end
module_function :convert_units
# Handles expanding rows. If the "rows" does not respond to to_i (e.g. :infinite),
# then compute what we need based on number of cards and number of columns.
# :nodoc:
# @api private
def rowify(opts)
unless opts[:rows].respond_to? :to_i
raise "Columns must be an integer" unless opts[:columns].respond_to? :to_i
opts[:rows] = (@cards.size / opts[:columns].to_i).ceil
end
opts
end
# Used for showcase - face right if it's :right
# :nodoc:
# @api private
def faceify(opts)
opts[:face] = (opts[:face].to_s.downcase == 'right')
opts
end
end
end