squib 0.18.0 → 0.19.0a
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/ISSUE_TEMPLATE/bug_report.md +39 -39
- data/.github/ISSUE_TEMPLATE/feature_request.md +22 -22
- data/.github/ISSUE_TEMPLATE/help-wanted.md +13 -13
- data/.github/ISSUE_TEMPLATE/release-todo.md +45 -33
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -13
- data/.github/workflows/tests.yml +22 -22
- data/.gitignore +41 -41
- data/.vscode/settings.json +4 -3
- data/CHANGELOG.md +460 -460
- data/CONTRIBUTING.md +40 -40
- data/Dockerfile +27 -27
- data/Gemfile +2 -2
- data/Guardfile +8 -8
- data/LICENSE.txt +22 -22
- data/README.md +139 -139
- data/Rakefile +51 -51
- data/bin/squib +5 -5
- data/lib/squib/api/settings.rb +21 -21
- data/lib/squib/args/arg_loader.rb +138 -138
- data/lib/squib/args/box.rb +59 -59
- data/lib/squib/args/card_range.rb +34 -34
- data/lib/squib/args/color_validator.rb +7 -7
- data/lib/squib/args/coords.rb +49 -49
- data/lib/squib/args/csv_opts.rb +22 -22
- data/lib/squib/args/dir_validator.rb +11 -11
- data/lib/squib/args/draw.rb +93 -93
- data/lib/squib/args/drop_shadow.rb +39 -39
- data/lib/squib/args/embed_adjust.rb +22 -22
- data/lib/squib/args/embed_key.rb +12 -12
- data/lib/squib/args/hand_special.rb +37 -37
- data/lib/squib/args/import.rb +67 -67
- data/lib/squib/args/input_file.rb +55 -55
- data/lib/squib/args/paint.rb +43 -43
- data/lib/squib/args/paragraph.rb +118 -118
- data/lib/squib/args/save_batch.rb +65 -65
- data/lib/squib/args/scale_box.rb +57 -57
- data/lib/squib/args/sheet.rb +165 -165
- data/lib/squib/args/showcase_special.rb +41 -41
- data/lib/squib/args/sprue_file.rb +44 -44
- data/lib/squib/args/svg_special.rb +37 -37
- data/lib/squib/args/transform.rb +55 -55
- data/lib/squib/args/typographer.rb +115 -115
- data/lib/squib/args/unit_conversion.rb +27 -27
- data/lib/squib/args/xywh_shorthands.rb +50 -50
- data/lib/squib/builtin/layouts/economy.yml +85 -85
- data/lib/squib/builtin/layouts/fantasy.yml +101 -101
- data/lib/squib/builtin/layouts/hand.yml +62 -62
- data/lib/squib/builtin/layouts/party.yml +94 -94
- data/lib/squib/builtin/layouts/playing-card.yml +35 -35
- data/lib/squib/builtin/layouts/tuck_box.yml +46 -46
- data/lib/squib/builtin/projects/advanced/.gitignore +4 -4
- data/lib/squib/builtin/projects/advanced/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/advanced/Gemfile +11 -11
- data/lib/squib/builtin/projects/advanced/Guardfile +21 -21
- data/lib/squib/builtin/projects/advanced/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/advanced/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/advanced/Rakefile +27 -27
- data/lib/squib/builtin/projects/advanced/config.yml +49 -49
- data/lib/squib/builtin/projects/advanced/docs/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/advanced/docs/RULES.md +21 -21
- data/lib/squib/builtin/projects/advanced/img/example.svg +60 -60
- data/lib/squib/builtin/projects/advanced/layouts/deck.yml +27 -27
- data/lib/squib/builtin/projects/advanced/src/deck.rb +34 -34
- data/lib/squib/builtin/projects/advanced/src/version.rb +3 -3
- data/lib/squib/builtin/projects/basic/.gitignore +4 -4
- data/lib/squib/builtin/projects/basic/ABOUT.md +19 -19
- data/lib/squib/builtin/projects/basic/Gemfile +3 -3
- data/lib/squib/builtin/projects/basic/IDEAS.md +22 -22
- data/lib/squib/builtin/projects/basic/PLAYTESTING.md +26 -26
- data/lib/squib/builtin/projects/basic/PNP NOTES.md +3 -3
- data/lib/squib/builtin/projects/basic/RULES.md +21 -21
- data/lib/squib/builtin/projects/basic/Rakefile +7 -7
- data/lib/squib/builtin/projects/basic/config.yml +50 -50
- data/lib/squib/builtin/projects/basic/deck.rb +6 -6
- data/lib/squib/builtin/sprues/a4_euro_card.yml +42 -42
- data/lib/squib/builtin/sprues/a4_poker_card_8up.yml +40 -40
- data/lib/squib/builtin/sprues/a4_poker_card_9up.yml +42 -42
- data/lib/squib/builtin/sprues/a4_usa_card.yml +42 -42
- data/lib/squib/builtin/sprues/drivethrucards_1up.yml +10 -10
- data/lib/squib/builtin/sprues/letter_poker_card_9up.yml +25 -25
- data/lib/squib/builtin/sprues/letter_poker_foldable_8up.yml +52 -52
- data/lib/squib/builtin/sprues/printplaygames_18up.yml +68 -68
- data/lib/squib/card.rb +75 -75
- data/lib/squib/commands/cli.rb +39 -39
- data/lib/squib/commands/data/template_option.rb +109 -109
- data/lib/squib/commands/make_sprue.rb +277 -277
- data/lib/squib/commands/new.rb +77 -77
- data/lib/squib/conf.rb +149 -149
- data/lib/squib/constants.rb +17 -17
- data/lib/squib/deck.rb +138 -138
- data/lib/squib/dsl/background.rb +35 -35
- data/lib/squib/dsl/circle.rb +39 -39
- data/lib/squib/dsl/csv.rb +42 -42
- data/lib/squib/dsl/curve.rb +35 -35
- data/lib/squib/dsl/cut_zone.rb +47 -47
- data/lib/squib/dsl/ellipse.rb +37 -37
- data/lib/squib/dsl/grid.rb +35 -35
- data/lib/squib/dsl/groups.rb +54 -54
- data/lib/squib/dsl/hand.rb +42 -42
- data/lib/squib/dsl/line.rb +35 -35
- data/lib/squib/dsl/png.rb +57 -57
- data/lib/squib/dsl/polygon.rb +36 -36
- data/lib/squib/dsl/rect.rb +37 -37
- data/lib/squib/dsl/safe_zone.rb +48 -48
- data/lib/squib/dsl/save.rb +21 -21
- data/lib/squib/dsl/save_pdf.rb +50 -50
- data/lib/squib/dsl/save_png.rb +48 -48
- data/lib/squib/dsl/save_sheet.rb +53 -53
- data/lib/squib/dsl/showcase.rb +43 -43
- data/lib/squib/dsl/star.rb +37 -37
- data/lib/squib/dsl/svg.rb +63 -63
- data/lib/squib/dsl/text.rb +54 -54
- data/lib/squib/dsl/text_embed.rb +79 -79
- data/lib/squib/dsl/triangle.rb +35 -35
- data/lib/squib/dsl/units.rb +37 -37
- data/lib/squib/dsl/xlsx.rb +40 -40
- data/lib/squib/dsl/yaml.rb +40 -40
- data/lib/squib/errors_warnings/warn_unexpected_params.rb +14 -14
- data/lib/squib/graphics/background.rb +14 -14
- data/lib/squib/graphics/cairo_context_wrapper.rb +115 -115
- data/lib/squib/graphics/embedding_utils.rb +28 -28
- data/lib/squib/graphics/gradient_regex.rb +47 -47
- data/lib/squib/graphics/hand.rb +42 -42
- data/lib/squib/graphics/image.rb +123 -123
- data/lib/squib/graphics/save_doc.rb +77 -77
- data/lib/squib/graphics/save_images.rb +91 -91
- data/lib/squib/graphics/save_pdf.rb +90 -90
- data/lib/squib/graphics/save_sprue.rb +231 -231
- data/lib/squib/graphics/shapes.rb +143 -143
- data/lib/squib/graphics/showcase.rb +85 -85
- data/lib/squib/graphics/text.rb +202 -202
- data/lib/squib/import/csv_importer.rb +45 -45
- data/lib/squib/import/data_frame.rb +108 -108
- data/lib/squib/import/quantity_exploder.rb +17 -17
- data/lib/squib/import/xlsx_importer.rb +28 -28
- data/lib/squib/import/yaml_importer.rb +30 -30
- data/lib/squib/layout_parser.rb +155 -155
- data/lib/squib/progress.rb +38 -38
- data/lib/squib/sample_helpers.rb +34 -34
- data/lib/squib/sprues/crop_line.rb +28 -28
- data/lib/squib/sprues/crop_line_dash.rb +35 -35
- data/lib/squib/sprues/invalid_sprue_definition.rb +9 -9
- data/lib/squib/sprues/sprue.rb +208 -208
- data/lib/squib/sprues/sprue_schema.rb +51 -51
- data/lib/squib/system_fonts.rb +16 -16
- data/lib/squib/version.rb +11 -11
- data/lib/squib.rb +35 -35
- data/samples/autoscale_font/_autoscale_font.rb +98 -98
- data/samples/backend/_backend.rb +26 -26
- data/samples/basic.rb +19 -19
- data/samples/build_groups/build_groups.rb +36 -36
- data/samples/colors/_colors.rb +44 -44
- data/samples/colors/_gradients.rb +34 -34
- data/samples/colors/_switch_color.rb +33 -33
- data/samples/config/config_text_markup.rb +20 -20
- data/samples/config/custom_config.rb +18 -18
- data/samples/data/_csv.rb +33 -33
- data/samples/data/_excel.rb +55 -55
- data/samples/data/_yaml.rb +12 -12
- data/samples/hello_world.rb +6 -6
- data/samples/images/_cairo_access.rb +39 -39
- data/samples/images/_images.rb +104 -104
- data/samples/images/_more_load_images.rb +102 -102
- data/samples/images/_placeholders.rb +48 -48
- data/samples/intro/01_hello.rb +8 -8
- data/samples/intro/02_options.rb +14 -14
- data/samples/intro/03_layout.rb +11 -11
- data/samples/intro/04_arrays.rb +15 -15
- data/samples/intro/05_excel.rb +14 -14
- data/samples/layouts/builtin_layouts.rb +97 -97
- data/samples/layouts/layouts.rb +71 -71
- data/samples/project/src/characters.rb +8 -8
- data/samples/project/src/skills.rb +7 -7
- data/samples/proofs/_tgc_proofs.rb +16 -16
- data/samples/ranges/_ranges.rb +64 -64
- data/samples/saves/_hand.rb +23 -23
- data/samples/saves/_portrait_landscape.rb +23 -23
- data/samples/saves/_save_filenames.rb +28 -28
- data/samples/saves/_save_pdf.rb +29 -29
- data/samples/saves/_saves.rb +75 -75
- data/samples/saves/_showcase.rb +25 -25
- data/samples/shadows/_shadow.rb +71 -71
- data/samples/shapes/_draw_shapes.rb +60 -60
- data/samples/shapes/_proofs.rb +22 -22
- data/samples/sprues/_advanced_sprues.rb +25 -25
- data/samples/sprues/_builtin_sprues.rb +22 -22
- data/samples/sprues/_fold_sheet.rb +30 -30
- data/samples/sprues/_hex_tiles.rb +15 -15
- data/samples/sprues/_mints.rb +11 -11
- data/samples/sprues/_negative_coords.rb +6 -6
- data/samples/sprues/_sprue_example.rb +11 -11
- data/samples/system_font_debug/_list_fonts.rb +14 -14
- data/samples/text/_embed_text.rb +128 -128
- data/samples/text/_text.rb +52 -52
- data/samples/text/_text_options.rb +103 -103
- data/samples/text/bug134.rb +14 -14
- data/samples/units/_cells.rb +50 -50
- data/samples/units/_shorthands.rb +48 -48
- data/samples/units/_units.rb +39 -39
- data/squib.gemspec +58 -58
- metadata +21 -21
data/lib/squib/dsl/xlsx.rb
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
require_relative '../args/import'
|
|
2
|
-
require_relative '../import/xlsx_importer'
|
|
3
|
-
require_relative '../errors_warnings/warn_unexpected_params'
|
|
4
|
-
|
|
5
|
-
module Squib
|
|
6
|
-
# DSL method. See http://squib.readthedocs.io
|
|
7
|
-
def xlsx(opts = {}, &block)
|
|
8
|
-
DSL::Xlsx.new(__callee__).run(opts, &block)
|
|
9
|
-
end
|
|
10
|
-
module_function :xlsx
|
|
11
|
-
|
|
12
|
-
class Deck
|
|
13
|
-
# DSL method. See http://squib.readthedocs.io
|
|
14
|
-
def xlsx(opts = {}, &block)
|
|
15
|
-
DSL::Xlsx.new(__callee__).run(opts, &block)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
module DSL
|
|
20
|
-
class Xlsx
|
|
21
|
-
include WarnUnexpectedParams
|
|
22
|
-
attr_reader :dsl_method, :block
|
|
23
|
-
|
|
24
|
-
def initialize(dsl_method)
|
|
25
|
-
@dsl_method = dsl_method
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def self.accepted_params
|
|
29
|
-
%i( file sheet strip explode )
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def run(opts,&block)
|
|
33
|
-
warn_if_unexpected opts
|
|
34
|
-
import_args = Args.extract_import opts
|
|
35
|
-
importer = Squib::Import::XlsxImporter.new
|
|
36
|
-
importer.import_to_dataframe(import_args, &block)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
1
|
+
require_relative '../args/import'
|
|
2
|
+
require_relative '../import/xlsx_importer'
|
|
3
|
+
require_relative '../errors_warnings/warn_unexpected_params'
|
|
4
|
+
|
|
5
|
+
module Squib
|
|
6
|
+
# DSL method. See http://squib.readthedocs.io
|
|
7
|
+
def xlsx(opts = {}, &block)
|
|
8
|
+
DSL::Xlsx.new(__callee__).run(opts, &block)
|
|
9
|
+
end
|
|
10
|
+
module_function :xlsx
|
|
11
|
+
|
|
12
|
+
class Deck
|
|
13
|
+
# DSL method. See http://squib.readthedocs.io
|
|
14
|
+
def xlsx(opts = {}, &block)
|
|
15
|
+
DSL::Xlsx.new(__callee__).run(opts, &block)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module DSL
|
|
20
|
+
class Xlsx
|
|
21
|
+
include WarnUnexpectedParams
|
|
22
|
+
attr_reader :dsl_method, :block
|
|
23
|
+
|
|
24
|
+
def initialize(dsl_method)
|
|
25
|
+
@dsl_method = dsl_method
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.accepted_params
|
|
29
|
+
%i( file sheet strip explode )
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def run(opts,&block)
|
|
33
|
+
warn_if_unexpected opts
|
|
34
|
+
import_args = Args.extract_import opts
|
|
35
|
+
importer = Squib::Import::XlsxImporter.new
|
|
36
|
+
importer.import_to_dataframe(import_args, &block)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/squib/dsl/yaml.rb
CHANGED
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
require_relative '../args/import'
|
|
2
|
-
require_relative '../import/yaml_importer'
|
|
3
|
-
require_relative '../errors_warnings/warn_unexpected_params'
|
|
4
|
-
|
|
5
|
-
module Squib
|
|
6
|
-
# DSL method. See http://squib.readthedocs.io
|
|
7
|
-
def yaml(opts = {}, &block)
|
|
8
|
-
DSL::Yaml.new(__callee__).run(opts, &block)
|
|
9
|
-
end
|
|
10
|
-
module_function :yaml
|
|
11
|
-
|
|
12
|
-
class Deck
|
|
13
|
-
# DSL method. See http://squib.readthedocs.io
|
|
14
|
-
def yaml(opts = {}, &block)
|
|
15
|
-
DSL::Yaml.new(__callee__).run(opts, &block)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
module DSL
|
|
20
|
-
class Yaml
|
|
21
|
-
include WarnUnexpectedParams
|
|
22
|
-
attr_reader :dsl_method, :block
|
|
23
|
-
|
|
24
|
-
def initialize(dsl_method)
|
|
25
|
-
@dsl_method = dsl_method
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
def self.accepted_params
|
|
29
|
-
%i( file data explode )
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def run(opts,&block)
|
|
33
|
-
warn_if_unexpected opts
|
|
34
|
-
import_args = Args.extract_import opts
|
|
35
|
-
importer = Squib::Import::YamlImporter.new
|
|
36
|
-
importer.import_to_dataframe(import_args, &block)
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
1
|
+
require_relative '../args/import'
|
|
2
|
+
require_relative '../import/yaml_importer'
|
|
3
|
+
require_relative '../errors_warnings/warn_unexpected_params'
|
|
4
|
+
|
|
5
|
+
module Squib
|
|
6
|
+
# DSL method. See http://squib.readthedocs.io
|
|
7
|
+
def yaml(opts = {}, &block)
|
|
8
|
+
DSL::Yaml.new(__callee__).run(opts, &block)
|
|
9
|
+
end
|
|
10
|
+
module_function :yaml
|
|
11
|
+
|
|
12
|
+
class Deck
|
|
13
|
+
# DSL method. See http://squib.readthedocs.io
|
|
14
|
+
def yaml(opts = {}, &block)
|
|
15
|
+
DSL::Yaml.new(__callee__).run(opts, &block)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
module DSL
|
|
20
|
+
class Yaml
|
|
21
|
+
include WarnUnexpectedParams
|
|
22
|
+
attr_reader :dsl_method, :block
|
|
23
|
+
|
|
24
|
+
def initialize(dsl_method)
|
|
25
|
+
@dsl_method = dsl_method
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.accepted_params
|
|
29
|
+
%i( file data explode )
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def run(opts,&block)
|
|
33
|
+
warn_if_unexpected opts
|
|
34
|
+
import_args = Args.extract_import opts
|
|
35
|
+
importer = Squib::Import::YamlImporter.new
|
|
36
|
+
importer.import_to_dataframe(import_args, &block)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
require 'rainbow/refinement'
|
|
2
|
-
|
|
3
|
-
module Squib::WarnUnexpectedParams
|
|
4
|
-
using Rainbow # we can colorize strings now!
|
|
5
|
-
|
|
6
|
-
def warn_if_unexpected(opts, uplevel: 5)
|
|
7
|
-
accepted_params = self.class.accepted_params
|
|
8
|
-
unexpected = opts.keys - accepted_params
|
|
9
|
-
unexpected.each do |key|
|
|
10
|
-
warn "Unexpected parameter '#{key.to_s.yellow}:' to #{dsl_method.to_s.cyan}(). Accepted parameters: #{accepted_params}",
|
|
11
|
-
uplevel: uplevel
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
1
|
+
require 'rainbow/refinement'
|
|
2
|
+
|
|
3
|
+
module Squib::WarnUnexpectedParams
|
|
4
|
+
using Rainbow # we can colorize strings now!
|
|
5
|
+
|
|
6
|
+
def warn_if_unexpected(opts, uplevel: 5)
|
|
7
|
+
accepted_params = self.class.accepted_params
|
|
8
|
+
unexpected = opts.keys - accepted_params
|
|
9
|
+
unexpected.each do |key|
|
|
10
|
+
warn "Unexpected parameter '#{key.to_s.yellow}:' to #{dsl_method.to_s.cyan}(). Accepted parameters: #{accepted_params}",
|
|
11
|
+
uplevel: uplevel
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
module Squib
|
|
2
|
-
class Card
|
|
3
|
-
|
|
4
|
-
# :nodoc:
|
|
5
|
-
# @api private
|
|
6
|
-
def background(color)
|
|
7
|
-
use_cairo do |cc|
|
|
8
|
-
cc.set_source_squibcolor(color)
|
|
9
|
-
cc.paint
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
end
|
|
14
|
-
end
|
|
1
|
+
module Squib
|
|
2
|
+
class Card
|
|
3
|
+
|
|
4
|
+
# :nodoc:
|
|
5
|
+
# @api private
|
|
6
|
+
def background(color)
|
|
7
|
+
use_cairo do |cc|
|
|
8
|
+
cc.set_source_squibcolor(color)
|
|
9
|
+
cc.paint
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
require 'forwardable'
|
|
2
|
-
require_relative 'gradient_regex'
|
|
3
|
-
|
|
4
|
-
module Squib
|
|
5
|
-
module Graphics
|
|
6
|
-
# Wrapper class for the Cairo context. Private.
|
|
7
|
-
# @api private
|
|
8
|
-
class CairoContextWrapper
|
|
9
|
-
extend Forwardable
|
|
10
|
-
|
|
11
|
-
# :nodoc:
|
|
12
|
-
# @api private
|
|
13
|
-
attr_accessor :cairo_cxt
|
|
14
|
-
|
|
15
|
-
# :nodoc:
|
|
16
|
-
# @api private
|
|
17
|
-
def initialize(cairo_cxt)
|
|
18
|
-
@cairo_cxt = cairo_cxt
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
|
|
22
|
-
:translate, :rotate, :move_to, :update_pango_layout, :width, :height,
|
|
23
|
-
:show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width,
|
|
24
|
-
:stroke, :fill, :set_source, :scale, :render_rsvg_handle, :circle,
|
|
25
|
-
:triangle, :line_to, :operator=, :show_page, :clip, :transform, :mask,
|
|
26
|
-
:create_pango_layout, :antialias=, :curve_to, :matrix, :matrix=,
|
|
27
|
-
:identity_matrix, :pango_layout_path, :stroke_preserve, :target,
|
|
28
|
-
:new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
|
|
29
|
-
:set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative,
|
|
30
|
-
:pseudo_blur
|
|
31
|
-
|
|
32
|
-
# :nodoc:
|
|
33
|
-
# @api private
|
|
34
|
-
def set_source_squibcolor(arg)
|
|
35
|
-
raise 'nil is not a valid color' if arg.nil?
|
|
36
|
-
if match = arg.match(LINEAR_GRADIENT)
|
|
37
|
-
x1, y1, x2, y2 = match.captures
|
|
38
|
-
linear = Cairo::LinearPattern.new(x1.to_f, y1.to_f, x2.to_f, y2.to_f)
|
|
39
|
-
arg.scan(STOPS).each do |color, offset|
|
|
40
|
-
linear.add_color_stop(offset.to_f, color)
|
|
41
|
-
end
|
|
42
|
-
linear.matrix = matrix # match the coordinate systems - see bug 127
|
|
43
|
-
@cairo_cxt.set_source(linear)
|
|
44
|
-
elsif match = arg.match(RADIAL_GRADIENT)
|
|
45
|
-
x1, y1, r1, x2, y2, r2 = match.captures
|
|
46
|
-
radial = Cairo::RadialPattern.new(x1.to_f, y1.to_f, r1.to_f,
|
|
47
|
-
x2.to_f, y2.to_f, r2.to_f)
|
|
48
|
-
radial.matrix = matrix # match the coordinate systems - see bug 127
|
|
49
|
-
arg.scan(STOPS).each do |color, offset|
|
|
50
|
-
radial.add_color_stop(offset.to_f, color)
|
|
51
|
-
end
|
|
52
|
-
@cairo_cxt.set_source(radial)
|
|
53
|
-
else
|
|
54
|
-
@cairo_cxt.set_source_color(arg)
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Convenience method for a common task
|
|
59
|
-
# @api private
|
|
60
|
-
def fill_n_stroke(draw)
|
|
61
|
-
return stroke_n_fill(draw) if draw.stroke_strategy == :stroke_first
|
|
62
|
-
set_source_squibcolor draw.fill_color
|
|
63
|
-
fill_preserve
|
|
64
|
-
set_source_squibcolor draw.stroke_color
|
|
65
|
-
set_line_width draw.stroke_width
|
|
66
|
-
set_line_join draw.join
|
|
67
|
-
set_line_cap draw.cap
|
|
68
|
-
set_dash draw.dash
|
|
69
|
-
stroke
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def stroke_n_fill(draw)
|
|
73
|
-
return fill_n_stroke(draw) if draw.stroke_strategy == :fill_first
|
|
74
|
-
set_source_squibcolor draw.stroke_color
|
|
75
|
-
set_line_width draw.stroke_width
|
|
76
|
-
set_line_join draw.join
|
|
77
|
-
set_line_cap draw.cap
|
|
78
|
-
set_dash draw.dash
|
|
79
|
-
stroke_preserve
|
|
80
|
-
set_source_squibcolor draw.fill_color
|
|
81
|
-
fill
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
# Convenience method for a common task
|
|
85
|
-
# @api private
|
|
86
|
-
def fancy_stroke(draw)
|
|
87
|
-
set_source_squibcolor draw.stroke_color
|
|
88
|
-
set_line_width draw.stroke_width
|
|
89
|
-
set_line_join draw.join
|
|
90
|
-
set_line_cap draw.cap
|
|
91
|
-
set_dash draw.dash
|
|
92
|
-
stroke
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def rotate_about(x, y, angle)
|
|
96
|
-
translate(x, y)
|
|
97
|
-
rotate(angle)
|
|
98
|
-
translate(-x, -y)
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# Flip either vertical or horizontal depending
|
|
102
|
-
# From the cairo website: http://cairographics.org/matrix_transform/
|
|
103
|
-
# cairo.Matrix(fx, 0, 0,
|
|
104
|
-
# fy, cx*(1-fx), cy*(fy-1))
|
|
105
|
-
# fx/fy = 1 means 'no flip', fx/fy = -1 are used for horizontal/vertical flip
|
|
106
|
-
def flip(vertical, horizontal, x, y)
|
|
107
|
-
v = vertical ? -1.0 : 1.0
|
|
108
|
-
h = horizontal ? -1.0 : 1.0
|
|
109
|
-
transform Cairo::Matrix.new(v, 0.0, 0.0,
|
|
110
|
-
h, x * (1 - v), y * (1 - h))
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
end
|
|
114
|
-
end
|
|
115
|
-
end
|
|
1
|
+
require 'forwardable'
|
|
2
|
+
require_relative 'gradient_regex'
|
|
3
|
+
|
|
4
|
+
module Squib
|
|
5
|
+
module Graphics
|
|
6
|
+
# Wrapper class for the Cairo context. Private.
|
|
7
|
+
# @api private
|
|
8
|
+
class CairoContextWrapper
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
# :nodoc:
|
|
12
|
+
# @api private
|
|
13
|
+
attr_accessor :cairo_cxt
|
|
14
|
+
|
|
15
|
+
# :nodoc:
|
|
16
|
+
# @api private
|
|
17
|
+
def initialize(cairo_cxt)
|
|
18
|
+
@cairo_cxt = cairo_cxt
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def_delegators :cairo_cxt, :save, :set_source_color, :paint, :restore,
|
|
22
|
+
:translate, :rotate, :move_to, :update_pango_layout, :width, :height,
|
|
23
|
+
:show_pango_layout, :rectangle, :rounded_rectangle, :set_line_width,
|
|
24
|
+
:stroke, :fill, :set_source, :scale, :render_rsvg_handle, :circle,
|
|
25
|
+
:triangle, :line_to, :operator=, :show_page, :clip, :transform, :mask,
|
|
26
|
+
:create_pango_layout, :antialias=, :curve_to, :matrix, :matrix=,
|
|
27
|
+
:identity_matrix, :pango_layout_path, :stroke_preserve, :target,
|
|
28
|
+
:new_path, :new_sub_path, :reset_clip, :fill_preserve, :close_path,
|
|
29
|
+
:set_line_join, :set_line_cap, :set_dash, :arc, :arc_negative,
|
|
30
|
+
:pseudo_blur
|
|
31
|
+
|
|
32
|
+
# :nodoc:
|
|
33
|
+
# @api private
|
|
34
|
+
def set_source_squibcolor(arg)
|
|
35
|
+
raise 'nil is not a valid color' if arg.nil?
|
|
36
|
+
if match = arg.match(LINEAR_GRADIENT)
|
|
37
|
+
x1, y1, x2, y2 = match.captures
|
|
38
|
+
linear = Cairo::LinearPattern.new(x1.to_f, y1.to_f, x2.to_f, y2.to_f)
|
|
39
|
+
arg.scan(STOPS).each do |color, offset|
|
|
40
|
+
linear.add_color_stop(offset.to_f, color)
|
|
41
|
+
end
|
|
42
|
+
linear.matrix = matrix # match the coordinate systems - see bug 127
|
|
43
|
+
@cairo_cxt.set_source(linear)
|
|
44
|
+
elsif match = arg.match(RADIAL_GRADIENT)
|
|
45
|
+
x1, y1, r1, x2, y2, r2 = match.captures
|
|
46
|
+
radial = Cairo::RadialPattern.new(x1.to_f, y1.to_f, r1.to_f,
|
|
47
|
+
x2.to_f, y2.to_f, r2.to_f)
|
|
48
|
+
radial.matrix = matrix # match the coordinate systems - see bug 127
|
|
49
|
+
arg.scan(STOPS).each do |color, offset|
|
|
50
|
+
radial.add_color_stop(offset.to_f, color)
|
|
51
|
+
end
|
|
52
|
+
@cairo_cxt.set_source(radial)
|
|
53
|
+
else
|
|
54
|
+
@cairo_cxt.set_source_color(arg)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Convenience method for a common task
|
|
59
|
+
# @api private
|
|
60
|
+
def fill_n_stroke(draw)
|
|
61
|
+
return stroke_n_fill(draw) if draw.stroke_strategy == :stroke_first
|
|
62
|
+
set_source_squibcolor draw.fill_color
|
|
63
|
+
fill_preserve
|
|
64
|
+
set_source_squibcolor draw.stroke_color
|
|
65
|
+
set_line_width draw.stroke_width
|
|
66
|
+
set_line_join draw.join
|
|
67
|
+
set_line_cap draw.cap
|
|
68
|
+
set_dash draw.dash
|
|
69
|
+
stroke
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def stroke_n_fill(draw)
|
|
73
|
+
return fill_n_stroke(draw) if draw.stroke_strategy == :fill_first
|
|
74
|
+
set_source_squibcolor draw.stroke_color
|
|
75
|
+
set_line_width draw.stroke_width
|
|
76
|
+
set_line_join draw.join
|
|
77
|
+
set_line_cap draw.cap
|
|
78
|
+
set_dash draw.dash
|
|
79
|
+
stroke_preserve
|
|
80
|
+
set_source_squibcolor draw.fill_color
|
|
81
|
+
fill
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Convenience method for a common task
|
|
85
|
+
# @api private
|
|
86
|
+
def fancy_stroke(draw)
|
|
87
|
+
set_source_squibcolor draw.stroke_color
|
|
88
|
+
set_line_width draw.stroke_width
|
|
89
|
+
set_line_join draw.join
|
|
90
|
+
set_line_cap draw.cap
|
|
91
|
+
set_dash draw.dash
|
|
92
|
+
stroke
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def rotate_about(x, y, angle)
|
|
96
|
+
translate(x, y)
|
|
97
|
+
rotate(angle)
|
|
98
|
+
translate(-x, -y)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Flip either vertical or horizontal depending
|
|
102
|
+
# From the cairo website: http://cairographics.org/matrix_transform/
|
|
103
|
+
# cairo.Matrix(fx, 0, 0,
|
|
104
|
+
# fy, cx*(1-fx), cy*(fy-1))
|
|
105
|
+
# fx/fy = 1 means 'no flip', fx/fy = -1 are used for horizontal/vertical flip
|
|
106
|
+
def flip(vertical, horizontal, x, y)
|
|
107
|
+
v = vertical ? -1.0 : 1.0
|
|
108
|
+
h = horizontal ? -1.0 : 1.0
|
|
109
|
+
transform Cairo::Matrix.new(v, 0.0, 0.0,
|
|
110
|
+
h, x * (1 - v), y * (1 - h))
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
module Squib
|
|
2
|
-
class EmbeddingUtils
|
|
3
|
-
|
|
4
|
-
# Given a string and a bunch of keys, give us back a mapping of those keys
|
|
5
|
-
# to where those keys start, and where they end (in ranges)
|
|
6
|
-
#
|
|
7
|
-
# See the spec for expected outputs
|
|
8
|
-
def self.indices(str, keys)
|
|
9
|
-
map = {}
|
|
10
|
-
keys.each do |key|
|
|
11
|
-
map[key] ||= []
|
|
12
|
-
start = 0
|
|
13
|
-
while true
|
|
14
|
-
idx = str.index(key, start)
|
|
15
|
-
if idx.nil?
|
|
16
|
-
break; # done searching
|
|
17
|
-
else
|
|
18
|
-
idx_bytes = str[0..idx].bytesize - 1
|
|
19
|
-
map[key] << (idx_bytes..(idx_bytes + key.size))
|
|
20
|
-
start = idx + 1
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
return map
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
end
|
|
28
|
-
end
|
|
1
|
+
module Squib
|
|
2
|
+
class EmbeddingUtils
|
|
3
|
+
|
|
4
|
+
# Given a string and a bunch of keys, give us back a mapping of those keys
|
|
5
|
+
# to where those keys start, and where they end (in ranges)
|
|
6
|
+
#
|
|
7
|
+
# See the spec for expected outputs
|
|
8
|
+
def self.indices(str, keys)
|
|
9
|
+
map = {}
|
|
10
|
+
keys.each do |key|
|
|
11
|
+
map[key] ||= []
|
|
12
|
+
start = 0
|
|
13
|
+
while true
|
|
14
|
+
idx = str.index(key, start)
|
|
15
|
+
if idx.nil?
|
|
16
|
+
break; # done searching
|
|
17
|
+
else
|
|
18
|
+
idx_bytes = str[0..idx].bytesize - 1
|
|
19
|
+
map[key] << (idx_bytes..(idx_bytes + key.size))
|
|
20
|
+
start = idx + 1
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
return map
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
module Squib
|
|
2
|
-
# @api private
|
|
3
|
-
module Graphics
|
|
4
|
-
STOPS = / # used to capture the stops
|
|
5
|
-
\s* # leading whitespace is ok
|
|
6
|
-
(\#?[\w]+) # color
|
|
7
|
-
@ # no spaces here
|
|
8
|
-
(\d+\.?\d*) # offset number
|
|
9
|
-
/x
|
|
10
|
-
|
|
11
|
-
LINEAR_GRADIENT = /
|
|
12
|
-
\( \s* # coordinate 1
|
|
13
|
-
(\d+\.?\d*) \s* # x1 number
|
|
14
|
-
,\s* # whitespace after comma is ok
|
|
15
|
-
(\d+\.?\d*) \s* # y1 number
|
|
16
|
-
\)
|
|
17
|
-
\s* # space between coordinates is ok
|
|
18
|
-
\( \s* # coordinate 2
|
|
19
|
-
(\d+\.?\d*) \s* # x2 number
|
|
20
|
-
,\s* # whitespace after comma is ok
|
|
21
|
-
(\d+\.?\d*) \s* # y2 number
|
|
22
|
-
\)
|
|
23
|
-
(#{STOPS})+ # stops
|
|
24
|
-
\s* # trailing whitespace is ok
|
|
25
|
-
/x
|
|
26
|
-
|
|
27
|
-
RADIAL_GRADIENT = /
|
|
28
|
-
\( \s* # coordinate 1
|
|
29
|
-
(\d+\.?\d*) \s* # x1 number
|
|
30
|
-
,\s* # whitespace after comma is ok
|
|
31
|
-
(\d+\.?\d*) \s* # y1 number
|
|
32
|
-
,\s* # whitespace after comma is ok
|
|
33
|
-
(\d+\.?\d*) \s* # r1 number
|
|
34
|
-
\)
|
|
35
|
-
\s* # space between coordinates is ok
|
|
36
|
-
\( \s* # coordinate 2
|
|
37
|
-
(\d+\.?\d*) \s* # x2 number
|
|
38
|
-
,\s* # whitespace after comma is ok
|
|
39
|
-
(\d+\.?\d*) \s* # y2 number
|
|
40
|
-
,\s* # whitespace after comma is ok
|
|
41
|
-
(\d+\.?\d*) \s* # r2 number
|
|
42
|
-
\)
|
|
43
|
-
(#{STOPS})+ # stops
|
|
44
|
-
\s* # trailing whitespace is ok
|
|
45
|
-
/x
|
|
46
|
-
end
|
|
47
|
-
end
|
|
1
|
+
module Squib
|
|
2
|
+
# @api private
|
|
3
|
+
module Graphics
|
|
4
|
+
STOPS = / # used to capture the stops
|
|
5
|
+
\s* # leading whitespace is ok
|
|
6
|
+
(\#?[\w]+) # color
|
|
7
|
+
@ # no spaces here
|
|
8
|
+
(\d+\.?\d*) # offset number
|
|
9
|
+
/x
|
|
10
|
+
|
|
11
|
+
LINEAR_GRADIENT = /
|
|
12
|
+
\( \s* # coordinate 1
|
|
13
|
+
(\d+\.?\d*) \s* # x1 number
|
|
14
|
+
,\s* # whitespace after comma is ok
|
|
15
|
+
(\d+\.?\d*) \s* # y1 number
|
|
16
|
+
\)
|
|
17
|
+
\s* # space between coordinates is ok
|
|
18
|
+
\( \s* # coordinate 2
|
|
19
|
+
(\d+\.?\d*) \s* # x2 number
|
|
20
|
+
,\s* # whitespace after comma is ok
|
|
21
|
+
(\d+\.?\d*) \s* # y2 number
|
|
22
|
+
\)
|
|
23
|
+
(#{STOPS})+ # stops
|
|
24
|
+
\s* # trailing whitespace is ok
|
|
25
|
+
/x
|
|
26
|
+
|
|
27
|
+
RADIAL_GRADIENT = /
|
|
28
|
+
\( \s* # coordinate 1
|
|
29
|
+
(\d+\.?\d*) \s* # x1 number
|
|
30
|
+
,\s* # whitespace after comma is ok
|
|
31
|
+
(\d+\.?\d*) \s* # y1 number
|
|
32
|
+
,\s* # whitespace after comma is ok
|
|
33
|
+
(\d+\.?\d*) \s* # r1 number
|
|
34
|
+
\)
|
|
35
|
+
\s* # space between coordinates is ok
|
|
36
|
+
\( \s* # coordinate 2
|
|
37
|
+
(\d+\.?\d*) \s* # x2 number
|
|
38
|
+
,\s* # whitespace after comma is ok
|
|
39
|
+
(\d+\.?\d*) \s* # y2 number
|
|
40
|
+
,\s* # whitespace after comma is ok
|
|
41
|
+
(\d+\.?\d*) \s* # r2 number
|
|
42
|
+
\)
|
|
43
|
+
(#{STOPS})+ # stops
|
|
44
|
+
\s* # trailing whitespace is ok
|
|
45
|
+
/x
|
|
46
|
+
end
|
|
47
|
+
end
|