squib 0.15.3 → 0.16.0.pre.preview1
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 +22 -0
- data/Dockerfile +18 -16
- data/Guardfile +8 -0
- data/README.md +3 -9
- 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 +56 -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 +47 -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 +1 -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 +49 -0
- data/samples/units/_units.rb +7 -0
- data/squib.gemspec +11 -5
- metadata +120 -33
- 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
@@ -1,44 +1,44 @@
|
|
1
1
|
require_relative 'arg_loader'
|
2
2
|
|
3
|
-
module Squib
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Squib::Args
|
4
|
+
module_function def extract_sprue_file(opts, deck, dsl_method_default = {})
|
5
|
+
SprueFile.new.extract! opts, deck
|
6
|
+
end
|
7
|
+
class SprueFile
|
8
|
+
include ArgLoader
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
def initialize(dsl_method_default = {})
|
11
|
+
@dsl_method_default = dsl_method_default
|
12
|
+
end
|
12
13
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
14
|
+
def self.parameters
|
15
|
+
{
|
16
|
+
sprue: nil
|
17
|
+
}
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
def self.expanding_parameters
|
21
|
+
[]
|
22
|
+
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
def self.params_with_units
|
25
|
+
[] # none of them
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
def validate_template_file(arg)
|
29
|
+
return nil if arg.nil?
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
thefile = File.exist?(arg) ? arg : builtin(arg)
|
32
|
+
raise "File #{File.expand_path(arg)} does not exist!" unless
|
33
|
+
File.exist? thefile
|
33
34
|
|
34
|
-
|
35
|
-
|
35
|
+
File.expand_path(thefile)
|
36
|
+
end
|
36
37
|
|
37
|
-
|
38
|
+
private
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
end
|
40
|
+
def builtin(file)
|
41
|
+
"#{File.dirname(__FILE__)}/../builtin/sprues/#{file}"
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
@@ -1,37 +1,37 @@
|
|
1
1
|
require_relative 'arg_loader'
|
2
2
|
|
3
|
-
module Squib
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
def self.parameters
|
11
|
-
{ data: nil, id: nil, force_id: false }
|
12
|
-
end
|
3
|
+
module Squib::Args
|
4
|
+
module_function def extract_svg_special(opts, deck)
|
5
|
+
SvgSpecial.new.extract! opts, deck
|
6
|
+
end
|
7
|
+
|
8
|
+
class SvgSpecial
|
9
|
+
include ArgLoader
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
11
|
+
def self.parameters
|
12
|
+
{ data: nil, id: nil, force_id: false }
|
13
|
+
end
|
17
14
|
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
def self.expanding_parameters
|
16
|
+
parameters.keys # all of them
|
17
|
+
end
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
arg
|
26
|
-
end
|
19
|
+
def self.params_with_units
|
20
|
+
[]
|
21
|
+
end
|
27
22
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
23
|
+
def validate_id(arg, _i)
|
24
|
+
return nil if arg.to_s.empty?
|
25
|
+
arg = '#' << arg unless arg.start_with? '#'
|
26
|
+
arg
|
27
|
+
end
|
33
28
|
|
29
|
+
# Only render if we have an ID specified, or we are forcing an ID
|
30
|
+
def render?(i)
|
31
|
+
return false if force_id[i] && id[i].to_s.empty?
|
32
|
+
return true
|
34
33
|
end
|
35
34
|
|
36
35
|
end
|
36
|
+
|
37
37
|
end
|
data/lib/squib/args/transform.rb
CHANGED
@@ -1,61 +1,55 @@
|
|
1
1
|
require_relative 'arg_loader'
|
2
2
|
|
3
|
-
module Squib
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
return @deck.width if arg == :deck
|
39
|
-
arg
|
40
|
-
end
|
41
|
-
|
42
|
-
def validate_crop_height(arg, _i)
|
43
|
-
return arg if @deck.nil?
|
44
|
-
return @deck.height if arg == :deck
|
45
|
-
arg
|
46
|
-
end
|
47
|
-
|
48
|
-
def validate_crop_corner_x_radius(arg, i)
|
49
|
-
return crop_corner_radius[i] unless crop_corner_radius[i].nil?
|
50
|
-
arg
|
51
|
-
end
|
52
|
-
|
53
|
-
def validate_crop_corner_y_radius(arg, i)
|
54
|
-
return crop_corner_radius[i] unless crop_corner_radius[i].nil?
|
55
|
-
arg
|
56
|
-
end
|
3
|
+
module Squib::Args
|
4
|
+
module_function def extract_transform(opts, deck)
|
5
|
+
Transform.new.extract!(opts, deck)
|
6
|
+
end
|
7
|
+
|
8
|
+
class Transform
|
9
|
+
include ArgLoader
|
10
|
+
|
11
|
+
def self.parameters
|
12
|
+
{ angle: 0,
|
13
|
+
crop_x: 0,
|
14
|
+
crop_y: 0,
|
15
|
+
crop_width: :native,
|
16
|
+
crop_height: :native,
|
17
|
+
crop_corner_radius: nil,
|
18
|
+
crop_corner_x_radius: 0,
|
19
|
+
crop_corner_y_radius: 0,
|
20
|
+
flip_vertical: false,
|
21
|
+
flip_horizontal: false,
|
22
|
+
}
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.expanding_parameters
|
26
|
+
parameters.keys # all of them
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.params_with_units
|
30
|
+
parameters.keys - [:flip_vertical, :flip_horizontal]
|
31
|
+
end
|
32
|
+
|
33
|
+
def validate_crop_width(arg, _i)
|
34
|
+
return arg if @deck.nil?
|
35
|
+
return @deck.width if arg == :deck
|
36
|
+
arg
|
37
|
+
end
|
57
38
|
|
39
|
+
def validate_crop_height(arg, _i)
|
40
|
+
return arg if @deck.nil?
|
41
|
+
return @deck.height if arg == :deck
|
42
|
+
arg
|
58
43
|
end
|
59
44
|
|
45
|
+
def validate_crop_corner_x_radius(arg, i)
|
46
|
+
return crop_corner_radius[i] unless crop_corner_radius[i].nil?
|
47
|
+
arg
|
48
|
+
end
|
49
|
+
|
50
|
+
def validate_crop_corner_y_radius(arg, i)
|
51
|
+
return crop_corner_radius[i] unless crop_corner_radius[i].nil?
|
52
|
+
arg
|
53
|
+
end
|
60
54
|
end
|
61
55
|
end
|
@@ -1,119 +1,115 @@
|
|
1
1
|
require_relative '../constants'
|
2
2
|
|
3
|
-
module Squib
|
4
|
-
#
|
5
|
-
|
6
|
-
# Internal class for handling arguments
|
7
|
-
# @api private
|
8
|
-
class Typographer
|
9
|
-
|
10
|
-
def initialize(config = Conf::DEFAULTS)
|
11
|
-
%w(lsquote ldquote rsquote rdquote smart_quotes
|
12
|
-
em_dash en_dash ellipsis).each do |var|
|
13
|
-
instance_variable_set("@#{var}", config[var])
|
14
|
-
end
|
15
|
-
end
|
3
|
+
module Squib::Args
|
4
|
+
# Internal class for handling arguments
|
5
|
+
class Typographer
|
16
6
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
7
|
+
def initialize(config = Squib::Conf::DEFAULTS)
|
8
|
+
%w(lsquote ldquote rsquote rdquote smart_quotes
|
9
|
+
em_dash en_dash ellipsis).each do |var|
|
10
|
+
instance_variable_set("@#{var}", config[var])
|
21
11
|
end
|
12
|
+
end
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
30
|
-
str
|
31
|
-
end
|
14
|
+
def process(str)
|
15
|
+
str = explicit_replacements(str.to_s)
|
16
|
+
str = smart_quotes(str) if @smart_quotes
|
17
|
+
str
|
18
|
+
end
|
32
19
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
:left_single_quote].each do |sym|
|
39
|
-
str = each_non_tag(str) do |token|
|
40
|
-
self.method(sym).call(token)
|
41
|
-
end
|
20
|
+
def explicit_replacements(str)
|
21
|
+
[ :left_curly, :right_curly, :apostraphize,
|
22
|
+
:ellipsificate, :em_dash, :en_dash ].each do |sym|
|
23
|
+
str = each_non_tag(str) do |token|
|
24
|
+
self.method(sym).call(token)
|
42
25
|
end
|
43
|
-
str
|
44
26
|
end
|
27
|
+
str
|
28
|
+
end
|
45
29
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
else
|
55
|
-
full_str << yield(token)
|
56
|
-
end
|
30
|
+
def smart_quotes(str)
|
31
|
+
[ :single_inside_double_quote,
|
32
|
+
:right_double_quote,
|
33
|
+
:left_double_quote,
|
34
|
+
:right_single_quote,
|
35
|
+
:left_single_quote].each do |sym|
|
36
|
+
str = each_non_tag(str) do |token|
|
37
|
+
self.method(sym).call(token)
|
57
38
|
end
|
58
|
-
return full_str
|
59
39
|
end
|
40
|
+
str
|
41
|
+
end
|
60
42
|
|
61
|
-
|
62
|
-
|
63
|
-
|
43
|
+
# Iterate over each non-tag for processing
|
44
|
+
# Allows us to ignore anything inside < and >
|
45
|
+
def each_non_tag(str)
|
46
|
+
full_str = ''
|
47
|
+
tag_delimit = /(<(?:(?!<).)*>)/ # use non-capturing group w/ negative lookahead
|
48
|
+
str.split(tag_delimit).each do |token|
|
49
|
+
if token.start_with? '<'
|
50
|
+
full_str << token # don't process tags
|
51
|
+
else
|
52
|
+
full_str << yield(token)
|
53
|
+
end
|
64
54
|
end
|
55
|
+
return full_str
|
56
|
+
end
|
65
57
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
58
|
+
# Straightforward replace
|
59
|
+
def left_curly(str)
|
60
|
+
str.gsub('``', @ldquote)
|
61
|
+
end
|
70
62
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
63
|
+
# Straightforward replace
|
64
|
+
def right_curly(str)
|
65
|
+
str.gsub(%{''}, @rdquote)
|
66
|
+
end
|
75
67
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
68
|
+
# A quote between two letters is an apostraphe
|
69
|
+
def apostraphize(str)
|
70
|
+
str.gsub(/(\w)(\')(\w)/, '\1' + @rsquote + '\3')
|
71
|
+
end
|
80
72
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
73
|
+
# Straightforward replace
|
74
|
+
def ellipsificate(str)
|
75
|
+
str.gsub('...', @ellipsis)
|
76
|
+
end
|
85
77
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
78
|
+
# Straightforward replace
|
79
|
+
def en_dash(str)
|
80
|
+
str.gsub('--', @en_dash)
|
81
|
+
end
|
90
82
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
83
|
+
# Straightforward replace
|
84
|
+
def em_dash(str)
|
85
|
+
str.gsub('---', @em_dash)
|
86
|
+
end
|
95
87
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
88
|
+
# Quote next to non-whitespace curls
|
89
|
+
def right_double_quote(str)
|
90
|
+
str.gsub(/(\S)(\")/, '\1' + @rdquote)
|
91
|
+
end
|
100
92
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
end
|
93
|
+
# Quote next to non-whitespace curls
|
94
|
+
def left_double_quote(str)
|
95
|
+
str.gsub(/(\")(\S)/, @ldquote + '\2')
|
96
|
+
end
|
106
97
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
98
|
+
# Handle the cases where a double quote is next to a single quote
|
99
|
+
def single_inside_double_quote(str)
|
100
|
+
str.gsub(/(\")(\')(\S)/, @ldquote + @lsquote + '\3')
|
101
|
+
.gsub(/(\")(\')(\S)/, '\1' + @rsquote + @rdquote)
|
102
|
+
end
|
111
103
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
104
|
+
# Quote next to non-whitespace curls
|
105
|
+
def right_single_quote(str)
|
106
|
+
str.gsub(/(\S)(\')/, '\1' + @rsquote)
|
107
|
+
end
|
116
108
|
|
109
|
+
# Quote next to non-whitespace curls
|
110
|
+
def left_single_quote(str)
|
111
|
+
str.gsub(/(\')(\S)/, @lsquote + '\2')
|
117
112
|
end
|
113
|
+
|
118
114
|
end
|
119
115
|
end
|