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
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
|
|
|