squib 0.14.1 → 0.14.2

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.
Files changed (162) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +41 -41
  3. data/.travis.yml +19 -19
  4. data/CHANGELOG.md +357 -340
  5. data/CONTRIBUTING.md +40 -40
  6. data/Gemfile +2 -2
  7. data/LICENSE.txt +22 -22
  8. data/README.md +121 -121
  9. data/RELEASE TODO.md +21 -21
  10. data/Rakefile +48 -48
  11. data/appveyor.yml +24 -24
  12. data/bin/squib +4 -4
  13. data/lib/squib.rb +32 -32
  14. data/lib/squib/api/background.rb +15 -15
  15. data/lib/squib/api/data.rb +137 -137
  16. data/lib/squib/api/groups.rb +54 -54
  17. data/lib/squib/api/image.rb +49 -49
  18. data/lib/squib/api/save.rb +83 -83
  19. data/lib/squib/api/settings.rb +21 -21
  20. data/lib/squib/api/shapes.rb +124 -124
  21. data/lib/squib/api/text.rb +25 -25
  22. data/lib/squib/api/text_embed.rb +71 -71
  23. data/lib/squib/api/units.rb +27 -27
  24. data/lib/squib/args/arg_loader.rb +126 -126
  25. data/lib/squib/args/box.rb +55 -55
  26. data/lib/squib/args/card_range.rb +32 -32
  27. data/lib/squib/args/color_validator.rb +12 -12
  28. data/lib/squib/args/coords.rb +35 -35
  29. data/lib/squib/args/csv_opts.rb +25 -25
  30. data/lib/squib/args/dir_validator.rb +16 -16
  31. data/lib/squib/args/draw.rb +92 -92
  32. data/lib/squib/args/embed_adjust.rb +25 -25
  33. data/lib/squib/args/embed_key.rb +17 -17
  34. data/lib/squib/args/hand_special.rb +37 -37
  35. data/lib/squib/args/import.rb +40 -40
  36. data/lib/squib/args/input_file.rb +37 -37
  37. data/lib/squib/args/paint.rb +44 -44
  38. data/lib/squib/args/paragraph.rb +116 -116
  39. data/lib/squib/args/save_batch.rb +63 -63
  40. data/lib/squib/args/scale_box.rb +53 -53
  41. data/lib/squib/args/sheet.rb +172 -172
  42. data/lib/squib/args/showcase_special.rb +38 -38
  43. data/lib/squib/args/sprue_file.rb +44 -44
  44. data/lib/squib/args/svg_special.rb +37 -37
  45. data/lib/squib/args/transform.rb +61 -61
  46. data/lib/squib/args/typographer.rb +119 -119
  47. data/lib/squib/args/unit_conversion.rb +29 -29
  48. data/lib/squib/builtin/layouts/economy.yml +85 -85
  49. data/lib/squib/builtin/layouts/fantasy.yml +101 -101
  50. data/lib/squib/builtin/layouts/hand.yml +62 -62
  51. data/lib/squib/builtin/layouts/party.yml +94 -94
  52. data/lib/squib/builtin/layouts/playing-card.yml +35 -35
  53. data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
  54. data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
  55. data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
  56. data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
  57. data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
  58. data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
  59. data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
  60. data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
  61. data/lib/squib/builtin/projects/advanced/config.yml +49 -49
  62. data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
  63. data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
  64. data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
  65. data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
  66. data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
  67. data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
  68. data/lib/squib/builtin/projects/basic/.gitignore +4 -4
  69. data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
  70. data/lib/squib/builtin/projects/basic/Gemfile +3 -3
  71. data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
  72. data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
  73. data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
  74. data/lib/squib/builtin/projects/basic/RULES.md +21 -21
  75. data/lib/squib/builtin/projects/basic/Rakefile +7 -7
  76. data/lib/squib/builtin/projects/basic/config.yml +49 -49
  77. data/lib/squib/builtin/projects/basic/deck.rb +6 -6
  78. data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
  79. data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
  80. data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
  81. data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
  82. data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -0
  83. data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
  84. data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
  85. data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -0
  86. data/lib/squib/card.rb +75 -74
  87. data/lib/squib/commands/cli.rb +39 -39
  88. data/lib/squib/commands/data/template_option.rb +109 -109
  89. data/lib/squib/commands/make_sprue.rb +275 -275
  90. data/lib/squib/commands/new.rb +77 -77
  91. data/lib/squib/conf.rb +139 -139
  92. data/lib/squib/constants.rb +17 -17
  93. data/lib/squib/deck.rb +116 -116
  94. data/lib/squib/graphics/background.rb +14 -14
  95. data/lib/squib/graphics/cairo_context_wrapper.rb +113 -113
  96. data/lib/squib/graphics/embedding_utils.rb +28 -28
  97. data/lib/squib/graphics/gradient_regex.rb +47 -47
  98. data/lib/squib/graphics/hand.rb +42 -42
  99. data/lib/squib/graphics/image.rb +108 -108
  100. data/lib/squib/graphics/save_doc.rb +61 -61
  101. data/lib/squib/graphics/save_images.rb +52 -52
  102. data/lib/squib/graphics/save_pdf.rb +90 -90
  103. data/lib/squib/graphics/save_sprue.rb +204 -205
  104. data/lib/squib/graphics/shapes.rb +143 -143
  105. data/lib/squib/graphics/showcase.rb +85 -85
  106. data/lib/squib/graphics/text.rb +174 -174
  107. data/lib/squib/import/data_frame.rb +108 -108
  108. data/lib/squib/layout_parser.rb +138 -126
  109. data/lib/squib/progress.rb +38 -38
  110. data/lib/squib/sample_helpers.rb +34 -34
  111. data/lib/squib/sprues/crop_line.rb +28 -28
  112. data/lib/squib/sprues/crop_line_dash.rb +35 -35
  113. data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
  114. data/lib/squib/sprues/sprue.rb +203 -203
  115. data/lib/squib/sprues/sprue_schema.rb +48 -48
  116. data/lib/squib/version.rb +10 -10
  117. data/samples/autoscale_font/_autoscale_font.rb +29 -29
  118. data/samples/backend/_backend.rb +26 -26
  119. data/samples/basic.rb +19 -19
  120. data/samples/build_groups/build_groups.rb +36 -36
  121. data/samples/colors/_colors.rb +38 -38
  122. data/samples/colors/_gradients.rb +34 -34
  123. data/samples/config/config_text_markup.rb +20 -20
  124. data/samples/config/custom_config.rb +18 -18
  125. data/samples/data/_csv.rb +33 -33
  126. data/samples/data/_excel.rb +55 -55
  127. data/samples/data/_yaml.rb +12 -12
  128. data/samples/hello_world.rb +6 -6
  129. data/samples/images/_cairo_access.rb +39 -39
  130. data/samples/images/_images.rb +104 -104
  131. data/samples/images/_more_load_images.rb +102 -102
  132. data/samples/intro/01_hello.rb +8 -8
  133. data/samples/intro/02_options.rb +14 -14
  134. data/samples/intro/03_layout.rb +11 -11
  135. data/samples/intro/04_arrays.rb +15 -15
  136. data/samples/intro/05_excel.rb +14 -14
  137. data/samples/layouts/builtin_layouts.rb +97 -97
  138. data/samples/layouts/layouts.rb +71 -71
  139. data/samples/project/src/characters.rb +8 -8
  140. data/samples/project/src/skills.rb +7 -7
  141. data/samples/proofs/_tgc_proofs.rb +16 -16
  142. data/samples/ranges/_ranges.rb +64 -64
  143. data/samples/saves/_hand.rb +23 -23
  144. data/samples/saves/_portrait_landscape.rb +23 -23
  145. data/samples/saves/_save_pdf.rb +29 -29
  146. data/samples/saves/_saves.rb +51 -51
  147. data/samples/saves/_showcase.rb +25 -25
  148. data/samples/shapes/_draw_shapes.rb +60 -58
  149. data/samples/shapes/_proofs.rb +22 -22
  150. data/samples/sprues/_advanced_sprues.rb +24 -24
  151. data/samples/sprues/_builtin_sprues.rb +21 -19
  152. data/samples/sprues/_fold_sheet.rb +27 -27
  153. data/samples/sprues/_hex_tiles.rb +15 -15
  154. data/samples/sprues/_mints.rb +11 -11
  155. data/samples/sprues/_sprue_example.rb +11 -11
  156. data/samples/text/_embed_text.rb +128 -128
  157. data/samples/text/_text.rb +47 -47
  158. data/samples/text/_text_options.rb +102 -102
  159. data/samples/text/bug134.rb +14 -14
  160. data/samples/units/_units.rb +32 -32
  161. data/squib.gemspec +52 -51
  162. metadata +66 -50
@@ -1,55 +1,55 @@
1
- require_relative 'arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Box
8
- include ArgLoader
9
-
10
- def initialize(deck = nil, dsl_method_defaults = {})
11
- @deck = deck
12
- @dsl_method_defaults = dsl_method_defaults
13
- end
14
-
15
- def self.parameters
16
- { x: 0, y: 0,
17
- width: :deck, height: :deck,
18
- radius: nil, x_radius: 0, y_radius: 0
19
- }
20
- end
21
-
22
- def self.expanding_parameters
23
- parameters.keys # all of them
24
- end
25
-
26
- def self.params_with_units
27
- parameters.keys # all of them
28
- end
29
-
30
- def validate_width(arg, _i)
31
- return arg if @deck.nil?
32
- return @deck.width if arg == :deck
33
- arg
34
- end
35
-
36
- def validate_height(arg, _i)
37
- return arg if @deck.nil?
38
- return @deck.height if arg == :deck
39
- arg
40
- end
41
-
42
- def validate_x_radius(arg, i)
43
- return radius[i] unless radius[i].nil?
44
- arg
45
- end
46
-
47
- def validate_y_radius(arg, i)
48
- return radius[i] unless radius[i].nil?
49
- arg
50
- end
51
-
52
- end
53
-
54
- end
55
- end
1
+ require_relative 'arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Box
8
+ include ArgLoader
9
+
10
+ def initialize(deck = nil, dsl_method_defaults = {})
11
+ @deck = deck
12
+ @dsl_method_defaults = dsl_method_defaults
13
+ end
14
+
15
+ def self.parameters
16
+ { x: 0, y: 0,
17
+ width: :deck, height: :deck,
18
+ radius: nil, x_radius: 0, y_radius: 0
19
+ }
20
+ end
21
+
22
+ def self.expanding_parameters
23
+ parameters.keys # all of them
24
+ end
25
+
26
+ def self.params_with_units
27
+ parameters.keys # all of them
28
+ end
29
+
30
+ def validate_width(arg, _i)
31
+ return arg if @deck.nil?
32
+ return @deck.width if arg == :deck
33
+ arg
34
+ end
35
+
36
+ def validate_height(arg, _i)
37
+ return arg if @deck.nil?
38
+ return @deck.height if arg == :deck
39
+ arg
40
+ end
41
+
42
+ def validate_x_radius(arg, i)
43
+ return radius[i] unless radius[i].nil?
44
+ arg
45
+ end
46
+
47
+ def validate_y_radius(arg, i)
48
+ return radius[i] unless radius[i].nil?
49
+ arg
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end
@@ -1,32 +1,32 @@
1
- module Squib
2
- # @api private
3
- module Args
4
- class CardRange
5
- include Enumerable
6
-
7
- def initialize(input, deck_size: 1)
8
- @range = validate(input, deck_size)
9
- end
10
-
11
- # Hook into enumerable by delegating to @range
12
- def each(&block)
13
- @range.each { |i| block.call(i) }
14
- end
15
-
16
- def size
17
- @range.size
18
- end
19
-
20
- private
21
- def validate(input, deck_size)
22
- input ||= :all # default
23
- input = 0..(deck_size - 1) if input == :all
24
- input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
25
- raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
26
- raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size - 1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
27
- input
28
- end
29
-
30
- end
31
- end
32
- end
1
+ module Squib
2
+ # @api private
3
+ module Args
4
+ class CardRange
5
+ include Enumerable
6
+
7
+ def initialize(input, deck_size: 1)
8
+ @range = validate(input, deck_size)
9
+ end
10
+
11
+ # Hook into enumerable by delegating to @range
12
+ def each(&block)
13
+ @range.each { |i| block.call(i) }
14
+ end
15
+
16
+ def size
17
+ @range.size
18
+ end
19
+
20
+ private
21
+ def validate(input, deck_size)
22
+ input ||= :all # default
23
+ input = 0..(deck_size - 1) if input == :all
24
+ input = (input.to_i)..(input.to_i) if input.respond_to? :to_i
25
+ raise ArgumentError.new("#{input} must be Enumerable (i.e. respond_to :each).") unless input.respond_to? :each
26
+ raise ArgumentError.new("#{input} is outside of deck range of 0..#{deck_size - 1}") if (!input.max.nil?) && (input.max > (deck_size - 1))
27
+ input
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -1,12 +1,12 @@
1
- module Squib
2
- # @api private
3
- module Args
4
- module ColorValidator
5
-
6
- def colorify(color, custom_colors = {})
7
- custom_colors[color.to_s] || color.to_s
8
- end
9
-
10
- end
11
- end
12
- end
1
+ module Squib
2
+ # @api private
3
+ module Args
4
+ module ColorValidator
5
+
6
+ def colorify(color, custom_colors = {})
7
+ custom_colors[color.to_s] || color.to_s
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -1,35 +1,35 @@
1
- require_relative 'arg_loader'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
-
7
- class Coords
8
- include ArgLoader
9
-
10
- def self.parameters
11
- { x: 0, y: 0,
12
- x1: 100, y1: 100,
13
- x2: 150, y2: 150,
14
- x3: 100, y3: 150,
15
- cx1: 0 , cy1: 0,
16
- cx2: 0 , cy2: 0,
17
- inner_radius: 50, outer_radius: 100,
18
- radius: 100,
19
- n: 5,
20
- arc_start: 0, arc_end: 2 * Math::PI, arc_direction: :clockwise, arc_close: false,
21
- }
22
- end
23
-
24
- def self.expanding_parameters
25
- parameters.keys # all of them
26
- end
27
-
28
- def self.params_with_units
29
- parameters.keys # all of them
30
- end
31
-
32
- end
33
-
34
- end
35
- end
1
+ require_relative 'arg_loader'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+
7
+ class Coords
8
+ include ArgLoader
9
+
10
+ def self.parameters
11
+ { x: 0, y: 0,
12
+ x1: 100, y1: 100,
13
+ x2: 150, y2: 150,
14
+ x3: 100, y3: 150,
15
+ cx1: 0 , cy1: 0,
16
+ cx2: 0 , cy2: 0,
17
+ inner_radius: 50, outer_radius: 100,
18
+ radius: 100,
19
+ n: 5,
20
+ arc_start: 0, arc_end: 2 * Math::PI, arc_direction: :clockwise, arc_close: false,
21
+ }
22
+ end
23
+
24
+ def self.expanding_parameters
25
+ parameters.keys # all of them
26
+ end
27
+
28
+ def self.params_with_units
29
+ parameters.keys # all of them
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -1,25 +1,25 @@
1
- require 'csv'
2
-
3
- module Squib
4
- # @api private
5
- module Args
6
- class CSV_Opts
7
-
8
- def initialize(opts)
9
- opts = opts.keep_if { |k, _v| CSV::DEFAULT_OPTIONS.key? k}
10
- @hash = CSV::DEFAULT_OPTIONS.merge(opts).merge(required)
11
- end
12
-
13
- def to_hash
14
- @hash
15
- end
16
-
17
- private
18
-
19
- def required
20
- { headers: true, converters: :numeric }
21
- end
22
-
23
- end
24
- end
25
- end
1
+ require 'csv'
2
+
3
+ module Squib
4
+ # @api private
5
+ module Args
6
+ class CSV_Opts
7
+
8
+ def initialize(opts)
9
+ opts = opts.keep_if { |k, _v| CSV::DEFAULT_OPTIONS.key? k}
10
+ @hash = CSV::DEFAULT_OPTIONS.merge(opts).merge(required)
11
+ end
12
+
13
+ def to_hash
14
+ @hash
15
+ end
16
+
17
+ private
18
+
19
+ def required
20
+ { headers: true, converters: :numeric }
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -1,16 +1,16 @@
1
- module Squib
2
- # @api private
3
- module Args
4
- module DirValidator
5
-
6
- def ensure_dir_created(dir)
7
- unless Dir.exists?(dir)
8
- Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
9
- FileUtils.mkdir_p dir
10
- end
11
- return dir
12
- end
13
-
14
- end
15
- end
16
- end
1
+ module Squib
2
+ # @api private
3
+ module Args
4
+ module DirValidator
5
+
6
+ def ensure_dir_created(dir)
7
+ unless Dir.exists?(dir)
8
+ Squib.logger.warn "Dir '#{dir}' does not exist, creating it."
9
+ FileUtils.mkdir_p dir
10
+ end
11
+ return dir
12
+ end
13
+
14
+ end
15
+ end
16
+ end
@@ -1,92 +1,92 @@
1
- require 'cairo'
2
- require_relative 'arg_loader'
3
- require_relative 'color_validator'
4
-
5
- module Squib
6
- # @api private
7
- module Args
8
-
9
- class Draw
10
- include ArgLoader
11
- include ColorValidator
12
-
13
- def initialize(custom_colors, dsl_method_defaults = {})
14
- @custom_colors = custom_colors
15
- @dsl_method_defaults = dsl_method_defaults
16
- end
17
-
18
- def self.parameters
19
- { color: :black,
20
- fill_color: '#0000',
21
- stroke_color: :black,
22
- stroke_width: 2.0,
23
- stroke_strategy: :fill_first,
24
- join: :miter,
25
- cap: 'butt',
26
- dash: ''
27
- }
28
- end
29
-
30
- def self.expanding_parameters
31
- parameters.keys # all of them are expandable
32
- end
33
-
34
- def self.params_with_units
35
- [:stroke_width]
36
- end
37
-
38
- def validate_join(arg, _i)
39
- case arg.to_s.strip.downcase
40
- when 'miter'
41
- Cairo::LINE_JOIN_MITER
42
- when 'round'
43
- Cairo::LINE_JOIN_ROUND
44
- when 'bevel'
45
- Cairo::LINE_JOIN_BEVEL
46
- end
47
- end
48
-
49
- def validate_cap(arg, _i)
50
- case arg.to_s.strip.downcase
51
- when 'butt'
52
- Cairo::LINE_CAP_BUTT
53
- when 'round'
54
- Cairo::LINE_CAP_ROUND
55
- when 'square'
56
- Cairo::LINE_CAP_SQUARE
57
- end
58
- end
59
-
60
- def validate_dash(arg, _i)
61
- arg.to_s.split.collect do |x|
62
- UnitConversion.parse(x, @dpi).to_f
63
- end
64
- end
65
-
66
- def validate_fill_color(arg, _i)
67
- colorify(arg, @custom_colors)
68
- end
69
-
70
- def validate_stroke_color(arg, _i)
71
- colorify(arg, @custom_colors)
72
- end
73
-
74
- def validate_color(arg, _i)
75
- colorify(arg, @custom_colors)
76
- end
77
-
78
- def validate_stroke_strategy(arg, _i)
79
- case arg.to_s.downcase.strip
80
- when 'fill_first'
81
- :fill_first
82
- when 'stroke_first'
83
- :stroke_first
84
- else
85
- raise "Only 'stroke_first' or 'fill_first' allowed"
86
- end
87
- end
88
-
89
- end
90
-
91
- end
92
- end
1
+ require 'cairo'
2
+ require_relative 'arg_loader'
3
+ require_relative 'color_validator'
4
+
5
+ module Squib
6
+ # @api private
7
+ module Args
8
+
9
+ class Draw
10
+ include ArgLoader
11
+ include ColorValidator
12
+
13
+ def initialize(custom_colors, dsl_method_defaults = {})
14
+ @custom_colors = custom_colors
15
+ @dsl_method_defaults = dsl_method_defaults
16
+ end
17
+
18
+ def self.parameters
19
+ { color: :black,
20
+ fill_color: '#0000',
21
+ stroke_color: :black,
22
+ stroke_width: 2.0,
23
+ stroke_strategy: :fill_first,
24
+ join: :miter,
25
+ cap: 'butt',
26
+ dash: ''
27
+ }
28
+ end
29
+
30
+ def self.expanding_parameters
31
+ parameters.keys # all of them are expandable
32
+ end
33
+
34
+ def self.params_with_units
35
+ [:stroke_width]
36
+ end
37
+
38
+ def validate_join(arg, _i)
39
+ case arg.to_s.strip.downcase
40
+ when 'miter'
41
+ Cairo::LINE_JOIN_MITER
42
+ when 'round'
43
+ Cairo::LINE_JOIN_ROUND
44
+ when 'bevel'
45
+ Cairo::LINE_JOIN_BEVEL
46
+ end
47
+ end
48
+
49
+ def validate_cap(arg, _i)
50
+ case arg.to_s.strip.downcase
51
+ when 'butt'
52
+ Cairo::LINE_CAP_BUTT
53
+ when 'round'
54
+ Cairo::LINE_CAP_ROUND
55
+ when 'square'
56
+ Cairo::LINE_CAP_SQUARE
57
+ end
58
+ end
59
+
60
+ def validate_dash(arg, _i)
61
+ arg.to_s.split.collect do |x|
62
+ UnitConversion.parse(x, @dpi).to_f
63
+ end
64
+ end
65
+
66
+ def validate_fill_color(arg, _i)
67
+ colorify(arg, @custom_colors)
68
+ end
69
+
70
+ def validate_stroke_color(arg, _i)
71
+ colorify(arg, @custom_colors)
72
+ end
73
+
74
+ def validate_color(arg, _i)
75
+ colorify(arg, @custom_colors)
76
+ end
77
+
78
+ def validate_stroke_strategy(arg, _i)
79
+ case arg.to_s.downcase.strip
80
+ when 'fill_first'
81
+ :fill_first
82
+ when 'stroke_first'
83
+ :stroke_first
84
+ else
85
+ raise "Only 'stroke_first' or 'fill_first' allowed"
86
+ end
87
+ end
88
+
89
+ end
90
+
91
+ end
92
+ end