lib/squib/deck.rb in squib-0.1.0 vs lib/squib/deck.rb in squib-0.2.0

- old
+ new

@@ -3,10 +3,11 @@ require 'squib' require 'squib/card' require 'squib/progress' require 'squib/input_helpers' require 'squib/constants' +require 'squib/layout_parser' # The project module # # @api public module Squib @@ -63,11 +64,11 @@ @progress_bar = Squib::Progress.new(false) @text_hint = :off cards.times{ @cards << Squib::Card.new(self, width, height) } show_info(config, layout) load_config(config) - load_layout(layout) + @layout = LayoutParser.load_layout(layout) if block_given? instance_eval(&block) end end @@ -83,17 +84,10 @@ # @api private def each(&block) @cards.each { |card| block.call(card) } end - # Shows a descriptive place of the location - # - # @api private - def location(opts) - opts[:layout] || (" @ #{opts[:x]},#{opts[:y]}") - end - # Load the configuration file, if exists, overriding hardcoded defaults # @api private def load_config(file) if File.exists?(file) && config = YAML.load_file(file) Squib::logger.info { " using config: #{file}" } @@ -101,72 +95,9 @@ @dpi = config['dpi'].to_i @text_hint = config['text_hint'] @progress_bar.enabled = config['progress_bars'] @custom_colors = config['custom_colors'] @img_dir = config['img_dir'] - end - end - - # Load the layout configuration file, if exists - # @api private - def load_layout(files) - @layout = {} - Squib::logger.info { " using layout(s): #{files}" } - Array(files).each do |file| - thefile = file - thefile = "#{File.dirname(__FILE__)}/layouts/#{file}" unless File.exists?(file) - if File.exists? thefile - yml = @layout.merge(YAML.load_file(thefile) || {}) #load_file returns false on empty file - yml.each do |key, value| - @layout[key] = recurse_extends(yml, key, {}) - end - else - puts "the file: #{thefile}" - Squib::logger.error { "Layout file not found: #{file}" } - end - end - end - - # Process the extends recursively - # :nodoc: - # @api private - def recurse_extends(yml, key, visited ) - assert_not_visited(key, visited) - return yml[key] unless has_extends?(yml, key) - visited[key] = key - parent_keys = [yml[key]['extends']].flatten - h = {} - parent_keys.each do |parent_key| - from_extends = yml[key].merge(recurse_extends(yml, parent_key, visited)) do |key, child_val, parent_val| - if child_val.to_s.strip.start_with?('+=') - parent_val + child_val.sub('+=','').strip.to_f - elsif child_val.to_s.strip.start_with?('-=') - parent_val - child_val.sub('-=','').strip.to_f - else - child_val #child overrides parent when merging, no += - end - end - h = h.merge(from_extends) do |key, older_sibling, younger_sibling| - younger_sibling #when two siblings have the same entry, the "younger" (lower one) overrides - end - end - return h - end - - # Does this layout entry have an extends field? - # i.e. is it a base-case or will it need recursion? - # :nodoc: - # @api private - def has_extends?(yml, key) - !!yml[key] && yml[key].key?('extends') - end - - # Safeguard against malformed circular extends - # :nodoc: - # @api private - def assert_not_visited(key, visited) - if visited.key? key - raise "Invalid layout: circular extends with '#{key}'" end end # Use Logger to show more detail on the run # :nodoc: