squib 0.15.0 → 0.16.0.pre.preview2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/.github/workflows/tests.yml +22 -0
 - data/CHANGELOG.md +41 -1
 - data/Dockerfile +18 -16
 - data/Guardfile +8 -0
 - data/README.md +24 -6
 - data/RELEASE TODO.md +1 -0
 - data/Rakefile +3 -0
 - data/lib/squib.rb +3 -1
 - data/lib/squib/args/arg_loader.rb +109 -106
 - data/lib/squib/args/box.rb +52 -48
 - data/lib/squib/args/card_range.rb +26 -24
 - data/lib/squib/args/color_validator.rb +4 -9
 - data/lib/squib/args/coords.rb +39 -25
 - data/lib/squib/args/csv_opts.rb +13 -16
 - data/lib/squib/args/dir_validator.rb +7 -12
 - data/lib/squib/args/draw.rb +69 -68
 - data/lib/squib/args/embed_adjust.rb +12 -15
 - data/lib/squib/args/embed_key.rb +6 -11
 - data/lib/squib/args/hand_special.rb +25 -25
 - data/lib/squib/args/import.rb +54 -27
 - data/lib/squib/args/input_file.rb +22 -26
 - data/lib/squib/args/paint.rb +30 -31
 - data/lib/squib/args/paragraph.rb +95 -93
 - data/lib/squib/args/save_batch.rb +50 -48
 - data/lib/squib/args/scale_box.rb +43 -39
 - data/lib/squib/args/sheet.rb +147 -149
 - data/lib/squib/args/showcase_special.rb +32 -32
 - data/lib/squib/args/sprue_file.rb +30 -30
 - data/lib/squib/args/svg_special.rb +26 -26
 - data/lib/squib/args/transform.rb +48 -54
 - data/lib/squib/args/typographer.rb +88 -92
 - data/lib/squib/args/unit_conversion.rb +6 -8
 - data/lib/squib/args/xywh_shorthands.rb +51 -0
 - data/lib/squib/builtin/projects/advanced/config.yml +4 -3
 - data/lib/squib/builtin/projects/basic/config.yml +4 -3
 - data/lib/squib/conf.rb +5 -0
 - data/lib/squib/deck.rb +34 -12
 - data/lib/squib/dsl/background.rb +35 -0
 - data/lib/squib/dsl/circle.rb +39 -0
 - data/lib/squib/dsl/csv.rb +42 -0
 - data/lib/squib/dsl/curve.rb +35 -0
 - data/lib/squib/dsl/cut_zone.rb +47 -0
 - data/lib/squib/dsl/ellipse.rb +37 -0
 - data/lib/squib/dsl/grid.rb +35 -0
 - data/lib/squib/{api → dsl}/groups.rb +0 -0
 - data/lib/squib/dsl/hand.rb +42 -0
 - data/lib/squib/dsl/line.rb +35 -0
 - data/lib/squib/dsl/png.rb +56 -0
 - data/lib/squib/dsl/polygon.rb +36 -0
 - data/lib/squib/dsl/rect.rb +37 -0
 - data/lib/squib/dsl/safe_zone.rb +48 -0
 - data/lib/squib/dsl/save.rb +21 -0
 - data/lib/squib/dsl/save_pdf.rb +50 -0
 - data/lib/squib/dsl/save_png.rb +44 -0
 - data/lib/squib/dsl/save_sheet.rb +53 -0
 - data/lib/squib/dsl/showcase.rb +43 -0
 - data/lib/squib/dsl/star.rb +37 -0
 - data/lib/squib/dsl/svg.rb +62 -0
 - data/lib/squib/dsl/text.rb +54 -0
 - data/lib/squib/dsl/text_embed.rb +78 -0
 - data/lib/squib/dsl/triangle.rb +35 -0
 - data/lib/squib/{api → dsl}/units.rb +10 -0
 - data/lib/squib/dsl/xlsx.rb +40 -0
 - data/lib/squib/dsl/yaml.rb +40 -0
 - data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -0
 - data/lib/squib/graphics/save_images.rb +3 -3
 - data/lib/squib/graphics/save_sprue.rb +14 -2
 - data/lib/squib/graphics/text.rb +37 -9
 - data/lib/squib/import/csv_importer.rb +45 -0
 - data/lib/squib/import/quantity_exploder.rb +18 -0
 - data/lib/squib/import/xlsx_importer.rb +28 -0
 - data/lib/squib/import/yaml_importer.rb +30 -0
 - data/lib/squib/layout_parser.rb +24 -7
 - data/lib/squib/sprues/crop_line.rb +6 -6
 - data/lib/squib/sprues/crop_line_dash.rb +6 -6
 - data/lib/squib/sprues/sprue.rb +16 -14
 - data/lib/squib/version.rb +2 -1
 - data/samples/autoscale_font/_autoscale_font.rb +77 -8
 - data/samples/colors/_switch_color.rb +2 -2
 - data/samples/data/_excel.rb +1 -1
 - data/samples/ranges/_ranges.rb +1 -1
 - data/samples/saves/_save_filenames.rb +4 -0
 - data/samples/saves/_save_pdf.rb +1 -1
 - data/samples/saves/_saves.rb +2 -1
 - data/samples/shapes/_draw_shapes.rb +2 -2
 - data/samples/sprues/_builtin_sprues.rb +1 -0
 - data/samples/sprues/_fold_sheet.rb +4 -1
 - data/samples/text/_text.rb +6 -1
 - data/samples/text/_text_options.rb +2 -1
 - data/samples/units/_cells.rb +51 -0
 - data/samples/units/_shorthands.rb +48 -0
 - data/samples/units/_units.rb +7 -0
 - data/squib.gemspec +18 -12
 - metadata +144 -58
 - data/.travis.yml +0 -17
 - data/appveyor.yml +0 -25
 - data/lib/squib/api/background.rb +0 -15
 - data/lib/squib/api/data.rb +0 -137
 - data/lib/squib/api/image.rb +0 -49
 - data/lib/squib/api/save.rb +0 -83
 - data/lib/squib/api/shapes.rb +0 -124
 - data/lib/squib/api/text.rb +0 -25
 - data/lib/squib/api/text_embed.rb +0 -71
 
    
        data/.travis.yml
    DELETED
    
    | 
         @@ -1,17 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            language: ruby
         
     | 
| 
       2 
     | 
    
         
            -
            sudo: true # need this for libgirepository1.0-dev
         
     | 
| 
       3 
     | 
    
         
            -
            addons:
         
     | 
| 
       4 
     | 
    
         
            -
              apt:
         
     | 
| 
       5 
     | 
    
         
            -
                packages:
         
     | 
| 
       6 
     | 
    
         
            -
                  - libgirepository1.0-dev # for gobject-introspection
         
     | 
| 
       7 
     | 
    
         
            -
            rvm:
         
     | 
| 
       8 
     | 
    
         
            -
              - 2.4.2
         
     | 
| 
       9 
     | 
    
         
            -
              - 2.5.3
         
     | 
| 
       10 
     | 
    
         
            -
              - 2.6.3
         
     | 
| 
       11 
     | 
    
         
            -
              - ruby-head
         
     | 
| 
       12 
     | 
    
         
            -
            before_install:
         
     | 
| 
       13 
     | 
    
         
            -
              - gem update --system
         
     | 
| 
       14 
     | 
    
         
            -
              - gem install bundler
         
     | 
| 
       15 
     | 
    
         
            -
            matrix:
         
     | 
| 
       16 
     | 
    
         
            -
              allow_failures:
         
     | 
| 
       17 
     | 
    
         
            -
                - rvm: ruby-head
         
     | 
    
        data/appveyor.yml
    DELETED
    
    | 
         @@ -1,25 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            version: '{build}'
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            skip_tags: true
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            environment:
         
     | 
| 
       6 
     | 
    
         
            -
              matrix:
         
     | 
| 
       7 
     | 
    
         
            -
                - ruby_version: "24"
         
     | 
| 
       8 
     | 
    
         
            -
                - ruby_version: "24-x64"
         
     | 
| 
       9 
     | 
    
         
            -
                - ruby_version: "25"
         
     | 
| 
       10 
     | 
    
         
            -
                - ruby_version: "25-x64"
         
     | 
| 
       11 
     | 
    
         
            -
                - ruby_version: "26"
         
     | 
| 
       12 
     | 
    
         
            -
                - ruby_version: "26-x64"
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
            install:
         
     | 
| 
       15 
     | 
    
         
            -
              - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
         
     | 
| 
       16 
     | 
    
         
            -
              - ruby --version
         
     | 
| 
       17 
     | 
    
         
            -
              - gem --version
         
     | 
| 
       18 
     | 
    
         
            -
              - gem install bundler
         
     | 
| 
       19 
     | 
    
         
            -
              - bundler --version
         
     | 
| 
       20 
     | 
    
         
            -
              - bundle install
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
            test_script:
         
     | 
| 
       23 
     | 
    
         
            -
              - rake
         
     | 
| 
       24 
     | 
    
         
            -
             
     | 
| 
       25 
     | 
    
         
            -
            build: off
         
     | 
    
        data/lib/squib/api/background.rb
    DELETED
    
    | 
         @@ -1,15 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative '../args/card_range'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative '../args/draw'
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            module Squib
         
     | 
| 
       5 
     | 
    
         
            -
              class Deck
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       8 
     | 
    
         
            -
                def background(opts = {})
         
     | 
| 
       9 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       10 
     | 
    
         
            -
                  draw  = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       11 
     | 
    
         
            -
                  range.each { |i| @cards[i].background(draw.color[i]) }
         
     | 
| 
       12 
     | 
    
         
            -
                end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
              end
         
     | 
| 
       15 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/squib/api/data.rb
    DELETED
    
    | 
         @@ -1,137 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'roo'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'csv'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'yaml'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative '../args/input_file'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative '../args/import'
         
     | 
| 
       6 
     | 
    
         
            -
            require_relative '../args/csv_opts'
         
     | 
| 
       7 
     | 
    
         
            -
            require_relative '../import/data_frame'
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
            module Squib
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
              # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       12 
     | 
    
         
            -
              def xlsx(opts = {})
         
     | 
| 
       13 
     | 
    
         
            -
                input = Args::InputFile.new(file: 'deck.xlsx').load!(opts)
         
     | 
| 
       14 
     | 
    
         
            -
                import = Args::Import.new.load!(opts)
         
     | 
| 
       15 
     | 
    
         
            -
                s = Roo::Excelx.new(input.file[0])
         
     | 
| 
       16 
     | 
    
         
            -
                s.default_sheet = s.sheets[input.sheet[0]]
         
     | 
| 
       17 
     | 
    
         
            -
                data = Squib::DataFrame.new
         
     | 
| 
       18 
     | 
    
         
            -
                s.first_column.upto(s.last_column) do |col|
         
     | 
| 
       19 
     | 
    
         
            -
                  header = s.cell(s.first_row, col).to_s
         
     | 
| 
       20 
     | 
    
         
            -
                  header.strip! if import.strip?
         
     | 
| 
       21 
     | 
    
         
            -
                  data[header] = []
         
     | 
| 
       22 
     | 
    
         
            -
                  (s.first_row + 1).upto(s.last_row) do |row|
         
     | 
| 
       23 
     | 
    
         
            -
                    cell = s.cell(row, col)
         
     | 
| 
       24 
     | 
    
         
            -
                    # Roo hack for avoiding unnecessary .0's on whole integers (https://github.com/roo-rb/roo/issues/139)
         
     | 
| 
       25 
     | 
    
         
            -
                    cell = s.excelx_value(row, col) if s.excelx_type(row, col) == [:numeric_or_formula, 'General']
         
     | 
| 
       26 
     | 
    
         
            -
                    cell.strip! if cell.respond_to?(:strip) && import.strip?
         
     | 
| 
       27 
     | 
    
         
            -
                    cell = yield(header, cell) if block_given?
         
     | 
| 
       28 
     | 
    
         
            -
                    data[header] << cell
         
     | 
| 
       29 
     | 
    
         
            -
                  end# row
         
     | 
| 
       30 
     | 
    
         
            -
                end# col
         
     | 
| 
       31 
     | 
    
         
            -
                explode_quantities(data, import.explode)
         
     | 
| 
       32 
     | 
    
         
            -
              end# xlsx
         
     | 
| 
       33 
     | 
    
         
            -
              module_function :xlsx
         
     | 
| 
       34 
     | 
    
         
            -
             
     | 
| 
       35 
     | 
    
         
            -
              # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       36 
     | 
    
         
            -
              def csv(opts = {})
         
     | 
| 
       37 
     | 
    
         
            -
                # TODO refactor all this out to separate methods, and its own class
         
     | 
| 
       38 
     | 
    
         
            -
                import = Args::Import.new.load!(opts)
         
     | 
| 
       39 
     | 
    
         
            -
                file = Args::InputFile.new(file: 'deck.csv').load!(opts).file[0]
         
     | 
| 
       40 
     | 
    
         
            -
                data = opts.key?(:data) ? opts[:data] : File.read(file)
         
     | 
| 
       41 
     | 
    
         
            -
                csv_opts = Args::CSV_Opts.new(opts)
         
     | 
| 
       42 
     | 
    
         
            -
                table = CSV.parse(data, csv_opts.to_hash)
         
     | 
| 
       43 
     | 
    
         
            -
                check_duplicate_csv_headers(table)
         
     | 
| 
       44 
     | 
    
         
            -
                hash = Squib::DataFrame.new
         
     | 
| 
       45 
     | 
    
         
            -
                table.headers.each do |header|
         
     | 
| 
       46 
     | 
    
         
            -
                  new_header = header.to_s
         
     | 
| 
       47 
     | 
    
         
            -
                  new_header = new_header.strip if import.strip?
         
     | 
| 
       48 
     | 
    
         
            -
                  hash[new_header] ||= table[header]
         
     | 
| 
       49 
     | 
    
         
            -
                end
         
     | 
| 
       50 
     | 
    
         
            -
                if import.strip?
         
     | 
| 
       51 
     | 
    
         
            -
                  new_hash = Squib::DataFrame.new
         
     | 
| 
       52 
     | 
    
         
            -
                  hash.each do |header, col|
         
     | 
| 
       53 
     | 
    
         
            -
                    new_hash[header] = col.map do |str|
         
     | 
| 
       54 
     | 
    
         
            -
                      str = str.strip if str.respond_to?(:strip)
         
     | 
| 
       55 
     | 
    
         
            -
                      str
         
     | 
| 
       56 
     | 
    
         
            -
                    end
         
     | 
| 
       57 
     | 
    
         
            -
                  end
         
     | 
| 
       58 
     | 
    
         
            -
                  hash = new_hash
         
     | 
| 
       59 
     | 
    
         
            -
                end
         
     | 
| 
       60 
     | 
    
         
            -
                if block_given?
         
     | 
| 
       61 
     | 
    
         
            -
                  hash.each do |header, col|
         
     | 
| 
       62 
     | 
    
         
            -
                    col.map! do |val|
         
     | 
| 
       63 
     | 
    
         
            -
                      yield(header, val)
         
     | 
| 
       64 
     | 
    
         
            -
                    end
         
     | 
| 
       65 
     | 
    
         
            -
                  end
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
                return explode_quantities(hash, import.explode)
         
     | 
| 
       68 
     | 
    
         
            -
              end
         
     | 
| 
       69 
     | 
    
         
            -
              module_function :csv
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
              # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       72 
     | 
    
         
            -
              def yaml(opts = {})
         
     | 
| 
       73 
     | 
    
         
            -
                input = Args::InputFile.new(file: 'deck.yml').load!(opts)
         
     | 
| 
       74 
     | 
    
         
            -
                import = Args::Import.new.load!(opts)
         
     | 
| 
       75 
     | 
    
         
            -
                yml = YAML.load_file(input.file[0])
         
     | 
| 
       76 
     | 
    
         
            -
                data = Squib::DataFrame.new
         
     | 
| 
       77 
     | 
    
         
            -
                # Get a universal list of keys to ensure everything is covered.
         
     | 
| 
       78 
     | 
    
         
            -
                keys = yml.map { |c| c.keys}.flatten.uniq
         
     | 
| 
       79 
     | 
    
         
            -
                keys.each { |k| data[k] = [] } #init arrays
         
     | 
| 
       80 
     | 
    
         
            -
                yml.each do |card|
         
     | 
| 
       81 
     | 
    
         
            -
                  # nil value if key isn't set.
         
     | 
| 
       82 
     | 
    
         
            -
                  keys.each { |k| data[k] << card[k] }
         
     | 
| 
       83 
     | 
    
         
            -
                end
         
     | 
| 
       84 
     | 
    
         
            -
                if block_given?
         
     | 
| 
       85 
     | 
    
         
            -
                  data.each do |header, col|
         
     | 
| 
       86 
     | 
    
         
            -
                    col.map! do |val|
         
     | 
| 
       87 
     | 
    
         
            -
                      yield(header, val)
         
     | 
| 
       88 
     | 
    
         
            -
                    end
         
     | 
| 
       89 
     | 
    
         
            -
                  end
         
     | 
| 
       90 
     | 
    
         
            -
                end
         
     | 
| 
       91 
     | 
    
         
            -
                explode_quantities(data, import.explode)
         
     | 
| 
       92 
     | 
    
         
            -
              end
         
     | 
| 
       93 
     | 
    
         
            -
              module_function :yaml
         
     | 
| 
       94 
     | 
    
         
            -
             
     | 
| 
       95 
     | 
    
         
            -
              # Check if the given CSV table has duplicate columns, and throw a warning
         
     | 
| 
       96 
     | 
    
         
            -
              # @api private
         
     | 
| 
       97 
     | 
    
         
            -
              def check_duplicate_csv_headers(table)
         
     | 
| 
       98 
     | 
    
         
            -
                if table.headers.size != table.headers.uniq.size
         
     | 
| 
       99 
     | 
    
         
            -
                  dups = table.headers.select{|e| table.headers.count(e) > 1 }
         
     | 
| 
       100 
     | 
    
         
            -
                  Squib.logger.warn "CSV duplicated the following column keys: #{dups.join(',')}"
         
     | 
| 
       101 
     | 
    
         
            -
                end
         
     | 
| 
       102 
     | 
    
         
            -
              end
         
     | 
| 
       103 
     | 
    
         
            -
              module_function :check_duplicate_csv_headers
         
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
              # @api private
         
     | 
| 
       106 
     | 
    
         
            -
              def explode_quantities(data, qty)
         
     | 
| 
       107 
     | 
    
         
            -
                return data unless data.col? qty.to_s.strip
         
     | 
| 
       108 
     | 
    
         
            -
                qtys = data[qty]
         
     | 
| 
       109 
     | 
    
         
            -
                new_data = Squib::DataFrame.new
         
     | 
| 
       110 
     | 
    
         
            -
                data.each do |col, arr|
         
     | 
| 
       111 
     | 
    
         
            -
                  new_data[col] = []
         
     | 
| 
       112 
     | 
    
         
            -
                  qtys.each_with_index do |qty, index|
         
     | 
| 
       113 
     | 
    
         
            -
                    qty.to_i.times { new_data[col] << arr[index] }
         
     | 
| 
       114 
     | 
    
         
            -
                  end
         
     | 
| 
       115 
     | 
    
         
            -
                end
         
     | 
| 
       116 
     | 
    
         
            -
                return new_data
         
     | 
| 
       117 
     | 
    
         
            -
              end
         
     | 
| 
       118 
     | 
    
         
            -
              module_function :explode_quantities
         
     | 
| 
       119 
     | 
    
         
            -
             
     | 
| 
       120 
     | 
    
         
            -
              class Deck
         
     | 
| 
       121 
     | 
    
         
            -
             
     | 
| 
       122 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       123 
     | 
    
         
            -
                def xlsx(opts = {})
         
     | 
| 
       124 
     | 
    
         
            -
                  Squib.xlsx(opts)
         
     | 
| 
       125 
     | 
    
         
            -
                end
         
     | 
| 
       126 
     | 
    
         
            -
             
     | 
| 
       127 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       128 
     | 
    
         
            -
                def csv(opts = {})
         
     | 
| 
       129 
     | 
    
         
            -
                  Squib.csv(opts)
         
     | 
| 
       130 
     | 
    
         
            -
                end
         
     | 
| 
       131 
     | 
    
         
            -
             
     | 
| 
       132 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       133 
     | 
    
         
            -
                def yaml(opts = {})
         
     | 
| 
       134 
     | 
    
         
            -
                  Squib.yaml(opts)
         
     | 
| 
       135 
     | 
    
         
            -
                end
         
     | 
| 
       136 
     | 
    
         
            -
              end
         
     | 
| 
       137 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/squib/api/image.rb
    DELETED
    
    | 
         @@ -1,49 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative '../args/card_range'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative '../args/paint'
         
     | 
| 
       3 
     | 
    
         
            -
            require_relative '../args/scale_box'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative '../args/transform'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative '../args/input_file'
         
     | 
| 
       6 
     | 
    
         
            -
            require_relative '../args/svg_special'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
     | 
    
         
            -
            module Squib
         
     | 
| 
       9 
     | 
    
         
            -
              class Deck
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       12 
     | 
    
         
            -
                def png(opts = {})
         
     | 
| 
       13 
     | 
    
         
            -
                  Dir.chdir(img_dir) do
         
     | 
| 
       14 
     | 
    
         
            -
                    range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       15 
     | 
    
         
            -
                    paint = Args::Paint.new(custom_colors).load!(opts, expand_by: size, layout: layout)
         
     | 
| 
       16 
     | 
    
         
            -
                    box   = Args::ScaleBox.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       17 
     | 
    
         
            -
                    trans = Args::Transform.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       18 
     | 
    
         
            -
                    ifile = Args::InputFile.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       19 
     | 
    
         
            -
                    @progress_bar.start('Loading PNG(s)', range.size) do |bar|
         
     | 
| 
       20 
     | 
    
         
            -
                      range.each do |i|
         
     | 
| 
       21 
     | 
    
         
            -
                        @cards[i].png(ifile[i].file, box[i], paint[i], trans[i])
         
     | 
| 
       22 
     | 
    
         
            -
                        bar.increment
         
     | 
| 
       23 
     | 
    
         
            -
                      end
         
     | 
| 
       24 
     | 
    
         
            -
                    end
         
     | 
| 
       25 
     | 
    
         
            -
                  end
         
     | 
| 
       26 
     | 
    
         
            -
                end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       29 
     | 
    
         
            -
                def svg(opts = {})
         
     | 
| 
       30 
     | 
    
         
            -
                  Dir.chdir(img_dir) do
         
     | 
| 
       31 
     | 
    
         
            -
                    range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       32 
     | 
    
         
            -
                    paint = Args::Paint.new(custom_colors).load!(opts, expand_by: size, layout: layout)
         
     | 
| 
       33 
     | 
    
         
            -
                    box   = Args::ScaleBox.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       34 
     | 
    
         
            -
                    trans = Args::Transform.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       35 
     | 
    
         
            -
                    ifile = Args::InputFile.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       36 
     | 
    
         
            -
                    svg_args = Args::SvgSpecial.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       37 
     | 
    
         
            -
                    @progress_bar.start('Loading SVG(s)', range.size) do |bar|
         
     | 
| 
       38 
     | 
    
         
            -
                      range.each do |i|
         
     | 
| 
       39 
     | 
    
         
            -
                        if svg_args.render?(i)
         
     | 
| 
       40 
     | 
    
         
            -
                          @cards[i].svg(ifile[i].file, svg_args[i], box[i], paint[i], trans[i])
         
     | 
| 
       41 
     | 
    
         
            -
                        end
         
     | 
| 
       42 
     | 
    
         
            -
                        bar.increment
         
     | 
| 
       43 
     | 
    
         
            -
                      end
         
     | 
| 
       44 
     | 
    
         
            -
                    end
         
     | 
| 
       45 
     | 
    
         
            -
                  end
         
     | 
| 
       46 
     | 
    
         
            -
                end
         
     | 
| 
       47 
     | 
    
         
            -
             
     | 
| 
       48 
     | 
    
         
            -
              end
         
     | 
| 
       49 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/squib/api/save.rb
    DELETED
    
    | 
         @@ -1,83 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative '../args/card_range'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative '../args/hand_special'
         
     | 
| 
       3 
     | 
    
         
            -
            require_relative '../args/save_batch'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative '../args/sheet'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative '../args/showcase_special'
         
     | 
| 
       6 
     | 
    
         
            -
            require_relative '../args/sprue_file'
         
     | 
| 
       7 
     | 
    
         
            -
            require_relative '../graphics/save_pdf'
         
     | 
| 
       8 
     | 
    
         
            -
            require_relative '../graphics/save_sprue'
         
     | 
| 
       9 
     | 
    
         
            -
            require_relative '../sprues/sprue'
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
            module Squib
         
     | 
| 
       12 
     | 
    
         
            -
              class Deck
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       15 
     | 
    
         
            -
                def save(opts = {})
         
     | 
| 
       16 
     | 
    
         
            -
                  save_png(opts) if Array(opts[:format]).include? :png
         
     | 
| 
       17 
     | 
    
         
            -
                  save_pdf(opts) if Array(opts[:format]).include? :pdf
         
     | 
| 
       18 
     | 
    
         
            -
                  self
         
     | 
| 
       19 
     | 
    
         
            -
                end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       22 
     | 
    
         
            -
                def save_pdf(opts = {})
         
     | 
| 
       23 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       24 
     | 
    
         
            -
                  sheet = Args::Sheet.new(custom_colors, { file: 'output.pdf' }).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       25 
     | 
    
         
            -
                  sprue_file = Args::SprueFile.new.load!(opts, expand_by: size)
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                  if sprue_file.sprue.nil?
         
     | 
| 
       28 
     | 
    
         
            -
                    Graphics::SavePDF.new(self).render_pdf(range, sheet)
         
     | 
| 
       29 
     | 
    
         
            -
                  else
         
     | 
| 
       30 
     | 
    
         
            -
                    tmpl = Sprue.load sprue_file.sprue, dpi
         
     | 
| 
       31 
     | 
    
         
            -
                    Graphics::SaveSpruePDF.
         
     | 
| 
       32 
     | 
    
         
            -
                      new(self, tmpl, sheet).
         
     | 
| 
       33 
     | 
    
         
            -
                      render_sheet(range)
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
       35 
     | 
    
         
            -
                end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       38 
     | 
    
         
            -
                def save_png(opts = {})
         
     | 
| 
       39 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       40 
     | 
    
         
            -
                  batch = Args::SaveBatch.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       41 
     | 
    
         
            -
                  @progress_bar.start("Saving PNGs to #{batch.summary}", size) do |bar|
         
     | 
| 
       42 
     | 
    
         
            -
                    range.each do |i|
         
     | 
| 
       43 
     | 
    
         
            -
                      @cards[i].save_png(batch[i])
         
     | 
| 
       44 
     | 
    
         
            -
                      bar.increment
         
     | 
| 
       45 
     | 
    
         
            -
                    end
         
     | 
| 
       46 
     | 
    
         
            -
                  end
         
     | 
| 
       47 
     | 
    
         
            -
                end
         
     | 
| 
       48 
     | 
    
         
            -
             
     | 
| 
       49 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       50 
     | 
    
         
            -
                def save_sheet(opts = {})
         
     | 
| 
       51 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       52 
     | 
    
         
            -
                  batch = Args::SaveBatch.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       53 
     | 
    
         
            -
                  sheet = Args::Sheet.new(custom_colors, { margin: 0 }, size).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       54 
     | 
    
         
            -
                  sprue_file = Args::SprueFile.new.load!(opts, expand_by: size)
         
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                  if sprue_file.sprue.nil?
         
     | 
| 
       57 
     | 
    
         
            -
                    render_sheet(range, batch, sheet)
         
     | 
| 
       58 
     | 
    
         
            -
                  else
         
     | 
| 
       59 
     | 
    
         
            -
                    tmpl = Sprue.load sprue_file.sprue, dpi
         
     | 
| 
       60 
     | 
    
         
            -
                    Graphics::SaveSpruePNG.
         
     | 
| 
       61 
     | 
    
         
            -
                      new(self, tmpl, sheet).
         
     | 
| 
       62 
     | 
    
         
            -
                      render_sheet(range)
         
     | 
| 
       63 
     | 
    
         
            -
                  end
         
     | 
| 
       64 
     | 
    
         
            -
                end
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       67 
     | 
    
         
            -
                def showcase(opts = {})
         
     | 
| 
       68 
     | 
    
         
            -
                  range    = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       69 
     | 
    
         
            -
                  showcase = Args::ShowcaseSpecial.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       70 
     | 
    
         
            -
                  sheet    = Args::Sheet.new(custom_colors, { file: 'showcase.png' }).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       71 
     | 
    
         
            -
                  render_showcase(range, sheet, showcase)
         
     | 
| 
       72 
     | 
    
         
            -
                end
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       75 
     | 
    
         
            -
                def hand(opts = {})
         
     | 
| 
       76 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       77 
     | 
    
         
            -
                  hand  = Args::HandSpecial.new(height).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       78 
     | 
    
         
            -
                  sheet = Args::Sheet.new(custom_colors, { file: 'hand.png', trim_radius: 0 }).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       79 
     | 
    
         
            -
                  render_hand(range, sheet, hand)
         
     | 
| 
       80 
     | 
    
         
            -
                end
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
              end
         
     | 
| 
       83 
     | 
    
         
            -
            end
         
     | 
    
        data/lib/squib/api/shapes.rb
    DELETED
    
    | 
         @@ -1,124 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require_relative '../args/box'
         
     | 
| 
       2 
     | 
    
         
            -
            require_relative '../args/draw'
         
     | 
| 
       3 
     | 
    
         
            -
            require_relative '../args/card_range'
         
     | 
| 
       4 
     | 
    
         
            -
            require_relative '../args/transform'
         
     | 
| 
       5 
     | 
    
         
            -
            require_relative '../args/coords'
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
            module Squib
         
     | 
| 
       8 
     | 
    
         
            -
              class Deck
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       11 
     | 
    
         
            -
                def rect(opts = {})
         
     | 
| 
       12 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       13 
     | 
    
         
            -
                  box   = Args::Box.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       14 
     | 
    
         
            -
                  draw  = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       15 
     | 
    
         
            -
                  trans  = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       16 
     | 
    
         
            -
                  range.each { |i| @cards[i].rect(box[i], draw[i], trans[i]) }
         
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
             
     | 
| 
       19 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       20 
     | 
    
         
            -
                def circle(opts = {})
         
     | 
| 
       21 
     | 
    
         
            -
                  range  = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       22 
     | 
    
         
            -
                  coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       23 
     | 
    
         
            -
                  draw   = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       24 
     | 
    
         
            -
                  range.each { |i| @cards[i].circle(coords[i], draw[i]) }
         
     | 
| 
       25 
     | 
    
         
            -
                end
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       28 
     | 
    
         
            -
                def ellipse(opts = {})
         
     | 
| 
       29 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       30 
     | 
    
         
            -
                  draw  = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       31 
     | 
    
         
            -
                  box   = Args::Box.new(self, { width: '0.25in', height: '0.25in' }).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       32 
     | 
    
         
            -
                  trans  = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       33 
     | 
    
         
            -
                  range.each { |i| @cards[i].ellipse(box[i], draw[i], trans[i]) }
         
     | 
| 
       34 
     | 
    
         
            -
                end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       37 
     | 
    
         
            -
                def grid(opts = {})
         
     | 
| 
       38 
     | 
    
         
            -
                  range = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       39 
     | 
    
         
            -
                  draw  = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       40 
     | 
    
         
            -
                  box   = Args::Box.new(self).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       41 
     | 
    
         
            -
                  range.each { |i| @cards[i].grid(box[i], draw[i]) }
         
     | 
| 
       42 
     | 
    
         
            -
                end
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       45 
     | 
    
         
            -
                def triangle(opts = {})
         
     | 
| 
       46 
     | 
    
         
            -
                  range  = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       47 
     | 
    
         
            -
                  draw   = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       48 
     | 
    
         
            -
                  coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       49 
     | 
    
         
            -
                  range.each { |i| @cards[i].triangle(coords[i], draw[i]) }
         
     | 
| 
       50 
     | 
    
         
            -
                end
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       53 
     | 
    
         
            -
                def line(opts = {})
         
     | 
| 
       54 
     | 
    
         
            -
                  range   = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       55 
     | 
    
         
            -
                  draw    = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       56 
     | 
    
         
            -
                  coords  = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       57 
     | 
    
         
            -
                  range.each { |i| @cards[i].line(coords[i], draw[i]) }
         
     | 
| 
       58 
     | 
    
         
            -
                end
         
     | 
| 
       59 
     | 
    
         
            -
             
     | 
| 
       60 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       61 
     | 
    
         
            -
                def curve(opts = {})
         
     | 
| 
       62 
     | 
    
         
            -
                  range  = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       63 
     | 
    
         
            -
                  draw   = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       64 
     | 
    
         
            -
                  coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       65 
     | 
    
         
            -
                  range.each { |i| @cards[i].curve(coords[i], draw[i]) }
         
     | 
| 
       66 
     | 
    
         
            -
                end
         
     | 
| 
       67 
     | 
    
         
            -
             
     | 
| 
       68 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       69 
     | 
    
         
            -
                def star(opts = {})
         
     | 
| 
       70 
     | 
    
         
            -
                  range  = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       71 
     | 
    
         
            -
                  draw   = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       72 
     | 
    
         
            -
                  coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       73 
     | 
    
         
            -
                  trans  = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       74 
     | 
    
         
            -
                  range.each { |i| @cards[i].star(coords[i], trans[i], draw[i]) }
         
     | 
| 
       75 
     | 
    
         
            -
                end
         
     | 
| 
       76 
     | 
    
         
            -
             
     | 
| 
       77 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       78 
     | 
    
         
            -
                def polygon(opts = {})
         
     | 
| 
       79 
     | 
    
         
            -
                  range  = Args::CardRange.new(opts[:range], deck_size: size)
         
     | 
| 
       80 
     | 
    
         
            -
                  draw   = Args::Draw.new(custom_colors).load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       81 
     | 
    
         
            -
                  coords = Args::Coords.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       82 
     | 
    
         
            -
                  trans  = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi)
         
     | 
| 
       83 
     | 
    
         
            -
                  range.each { |i| @cards[i].polygon(coords[i], trans[i], draw[i]) }
         
     | 
| 
       84 
     | 
    
         
            -
                end
         
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       87 
     | 
    
         
            -
                def safe_zone(opts = {})
         
     | 
| 
       88 
     | 
    
         
            -
                  safe_defaults = {
         
     | 
| 
       89 
     | 
    
         
            -
                    margin: '0.25in',
         
     | 
| 
       90 
     | 
    
         
            -
                    radius: '0.125in',
         
     | 
| 
       91 
     | 
    
         
            -
                    stroke_color: :blue,
         
     | 
| 
       92 
     | 
    
         
            -
                    fill_color: '#0000',
         
     | 
| 
       93 
     | 
    
         
            -
                    stroke_width: 1.0,
         
     | 
| 
       94 
     | 
    
         
            -
                    dash: '3 3',
         
     | 
| 
       95 
     | 
    
         
            -
                  }
         
     | 
| 
       96 
     | 
    
         
            -
                  new_opts = safe_defaults.merge(opts)
         
     | 
| 
       97 
     | 
    
         
            -
                  margin = Args::UnitConversion.parse new_opts[:margin]
         
     | 
| 
       98 
     | 
    
         
            -
                  new_opts[:x] = margin
         
     | 
| 
       99 
     | 
    
         
            -
                  new_opts[:y] = margin
         
     | 
| 
       100 
     | 
    
         
            -
                  new_opts[:width] = width - (2 * margin)
         
     | 
| 
       101 
     | 
    
         
            -
                  new_opts[:height] = height - (2 * margin)
         
     | 
| 
       102 
     | 
    
         
            -
                  rect new_opts
         
     | 
| 
       103 
     | 
    
         
            -
                end
         
     | 
| 
       104 
     | 
    
         
            -
             
     | 
| 
       105 
     | 
    
         
            -
                # DSL method. See http://squib.readthedocs.io
         
     | 
| 
       106 
     | 
    
         
            -
                def cut_zone(opts = {})
         
     | 
| 
       107 
     | 
    
         
            -
                  safe_defaults = {
         
     | 
| 
       108 
     | 
    
         
            -
                    margin: '0.125in',
         
     | 
| 
       109 
     | 
    
         
            -
                    radius: '0.125in',
         
     | 
| 
       110 
     | 
    
         
            -
                    stroke_color: :red,
         
     | 
| 
       111 
     | 
    
         
            -
                    fill_color: '#0000',
         
     | 
| 
       112 
     | 
    
         
            -
                    stroke_width: 2.0,
         
     | 
| 
       113 
     | 
    
         
            -
                  }
         
     | 
| 
       114 
     | 
    
         
            -
                  new_opts = safe_defaults.merge(opts)
         
     | 
| 
       115 
     | 
    
         
            -
                  margin = Args::UnitConversion.parse new_opts[:margin]
         
     | 
| 
       116 
     | 
    
         
            -
                  new_opts[:x] = margin
         
     | 
| 
       117 
     | 
    
         
            -
                  new_opts[:y] = margin
         
     | 
| 
       118 
     | 
    
         
            -
                  new_opts[:width] = width - (2 * margin)
         
     | 
| 
       119 
     | 
    
         
            -
                  new_opts[:height] = height - (2 * margin)
         
     | 
| 
       120 
     | 
    
         
            -
                  rect new_opts
         
     | 
| 
       121 
     | 
    
         
            -
                end
         
     | 
| 
       122 
     | 
    
         
            -
             
     | 
| 
       123 
     | 
    
         
            -
              end
         
     | 
| 
       124 
     | 
    
         
            -
            end
         
     |