From 272892d3584274440fc12e5b9fac28069ec1416d Mon Sep 17 00:00:00 2001 From: Andy Meneely Date: Sat, 16 May 2020 20:00:45 -0400 Subject: [PATCH] text method migrated! --- docs/dsl/text.rst | 11 ++-- lib/squib/api/text.rb | 25 --------- lib/squib/api/text_embed.rb | 75 -------------------------- lib/squib/args/paragraph.rb | 4 ++ lib/squib/deck.rb | 7 ++- lib/squib/{api => dsl}/groups.rb | 0 lib/squib/dsl/text.rb | 54 +++++++++++++++++++ lib/squib/dsl/text_embed.rb | 78 ++++++++++++++++++++++++++++ lib/squib/{api => dsl}/units.rb | 0 samples/text/_text_options.rb | 3 +- spec/docs/options_documented_spec.rb | 11 +++- 11 files changed, 159 insertions(+), 109 deletions(-) delete mode 100644 lib/squib/api/text.rb delete mode 100644 lib/squib/api/text_embed.rb rename lib/squib/{api => dsl}/groups.rb (100%) create mode 100644 lib/squib/dsl/text.rb create mode 100644 lib/squib/dsl/text_embed.rb rename lib/squib/{api => dsl}/units.rb (100%) diff --git a/docs/dsl/text.rst b/docs/dsl/text.rst index a01a42d..6f2f307 100644 --- a/docs/dsl/text.rst +++ b/docs/dsl/text.rst @@ -27,7 +27,7 @@ font_size .. include:: /args/xy.rst -markup: +markup default: ``false`` When set to true, various extra styles are allowed. See :ref:`Markup `. @@ -156,6 +156,11 @@ file file(s) to read in, relative to the root directory or ``img_dir`` if set in the config. +data + default: ``nil`` + + render from an SVG XML string. Overrides ``file`` if both are specified (a warning is shown). + id default: ``nil`` @@ -192,7 +197,7 @@ dy "delta y", or adjust the icon vertically by y pixels -flip_horiztonal +flip_horizontal default: ``false`` Flip this image about its center horizontally (i.e. left becomes right and vice versa). @@ -252,7 +257,7 @@ dy "delta y", or adjust the icon vertically by y pixels -flip_horiztonal +flip_horizontal default: ``false`` Flip this image about its center horizontally (i.e. left becomes right and vice versa). diff --git a/lib/squib/api/text.rb b/lib/squib/api/text.rb deleted file mode 100644 index 5837975..0000000 --- a/lib/squib/api/text.rb +++ /dev/null @@ -1,25 +0,0 @@ -require_relative 'text_embed' -require_relative '../args/box' -require_relative '../args/card_range' -require_relative '../args/draw' -require_relative '../args/paragraph' - -module Squib - class Deck - - # DSL method. See http://squib.readthedocs.io - def text(opts = {}) - range = Args::CardRange.new(opts[:range], deck_size: size) - para = Args::Paragraph.new(font).load!(opts, expand_by: size, layout: layout) - box = Args::Box.new(self, { width: :auto, height: :auto }).load!(opts, expand_by: size, layout: layout, dpi: dpi) - trans = Args::Transform.new.load!(opts, expand_by: size, layout: layout, dpi: dpi) - draw = Args::Draw.new(custom_colors, { stroke_width: 0.0 }).load!(opts, expand_by: size, layout: layout, dpi: dpi) - embed = TextEmbed.new(size, custom_colors, layout, dpi, img_dir) - yield(embed) if block_given? # store the opts for later use - extents = Array.new(@cards.size) - range.each { |i| extents[i] = @cards[i].text(embed, para[i], box[i], trans[i], draw[i], dpi) } - return extents - end - - end -end diff --git a/lib/squib/api/text_embed.rb b/lib/squib/api/text_embed.rb deleted file mode 100644 index 87e4811..0000000 --- a/lib/squib/api/text_embed.rb +++ /dev/null @@ -1,75 +0,0 @@ -require_relative '../args/box' -require_relative '../args/card_range' -require_relative '../args/embed_adjust' -require_relative '../args/embed_key' -require_relative '../args/input_file' -require_relative '../args/paint' -require_relative '../args/transform' - -module Squib - class TextEmbed - # :nodoc: - # @api private - attr_reader :rules - - # :nodoc: - # @api private - def initialize(deck_size, custom_colors, layout, dpi, img_dir) - @deck_size = deck_size - @custom_colors = custom_colors - @layout = layout - @dpi = dpi - @img_dir = img_dir - @rules = {} # store an array of options for later usage - end - - # DSL method. See http://squib.readthedocs.io - def svg(opts = {}) - key = Args::EmbedKey.new.validate_key(opts[:key]) - range = Args::CardRange.new(opts[:range], deck_size: @deck_size) - paint = Args::Paint.new(@custom_colors).load!(opts, expand_by: @deck_size, layout: @layout) - box = Args::Box.new(self, { width: :native, height: :native }).load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - adjust = Args::EmbedAdjust.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - trans = Args::Transform.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - ifile = Args::InputFile.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - svg_args = Args::SvgSpecial.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - rule = { type: :svg, file: ifile, box: box, paint: paint, trans: trans, - adjust: adjust, svg_args: svg_args } - rule[:draw] = Proc.new do |card, x, y, scale| - i = card.index - b = box[i] - b.x, b.y = x, y - b.width = b.width * scale if b.width.is_a? Numeric - b.height = b.height * scale if b.height.is_a? Numeric - Dir.chdir(@img_dir) do - card.svg(ifile[i].file, svg_args[i], b, paint[i], trans[i]) - end - end - @rules[key] = rule - end - - # DSL method. See http://squib.readthedocs.io - def png(opts = {}) - key = Args::EmbedKey.new.validate_key(opts[:key]) - range = Args::CardRange.new(opts[:range], deck_size: @deck_size) - paint = Args::Paint.new(@custom_colors).load!(opts, expand_by: @deck_size, layout: @layout) - box = Args::Box.new(self, { width: :native, height: :native }).load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - adjust = Args::EmbedAdjust.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - trans = Args::Transform.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - ifile = Args::InputFile.new.load!(opts, expand_by: @deck_size, layout: @layout, dpi: @dpi) - rule = { type: :png, file: ifile, box: box, paint: paint, trans: trans, adjust: adjust } - rule[:draw] = Proc.new do |card, x, y, scale| - i = card.index - b = box[i] - b.x, b.y = x, y - b.width = b.width * scale if b.width.is_a? Numeric - b.height = b.height * scale if b.height.is_a? Numeric - Dir.chdir(@img_dir) do - card.png(ifile[i].file, b, paint[i], trans[i]) - end - end - @rules[key] = rule - end - - end -end diff --git a/lib/squib/args/paragraph.rb b/lib/squib/args/paragraph.rb index 90ea6bd..8aeed8a 100644 --- a/lib/squib/args/paragraph.rb +++ b/lib/squib/args/paragraph.rb @@ -3,6 +3,10 @@ require_relative 'arg_loader' module Squib::Args + module_function def extract_para(opts, deck, dsl_method_defaults = {}) + Paragraph.new(deck.font).extract!(opts, deck) + end + class Paragraph include ArgLoader diff --git a/lib/squib/deck.rb b/lib/squib/deck.rb index 0ac8566..2387ef0 100644 --- a/lib/squib/deck.rb +++ b/lib/squib/deck.rb @@ -103,10 +103,7 @@ module Squib ### PUBLIC API ### ################## require_relative 'api/data' - require_relative 'api/groups' require_relative 'api/settings' - require_relative 'api/text' - require_relative 'api/units' ################### ### DSL METHODS ### @@ -117,6 +114,7 @@ module Squib require_relative 'dsl/cut_zone' require_relative 'dsl/ellipse' require_relative 'dsl/grid' + require_relative 'dsl/groups' require_relative 'dsl/hand' require_relative 'dsl/line' require_relative 'dsl/png' @@ -130,7 +128,8 @@ module Squib require_relative 'dsl/showcase' require_relative 'dsl/star' require_relative 'dsl/svg' + require_relative 'dsl/text' require_relative 'dsl/triangle' - + require_relative 'dsl/units' end end diff --git a/lib/squib/api/groups.rb b/lib/squib/dsl/groups.rb similarity index 100% rename from lib/squib/api/groups.rb rename to lib/squib/dsl/groups.rb diff --git a/lib/squib/dsl/text.rb b/lib/squib/dsl/text.rb new file mode 100644 index 0000000..aab820d --- /dev/null +++ b/lib/squib/dsl/text.rb @@ -0,0 +1,54 @@ +require_relative '../args/box' +require_relative '../args/card_range' +require_relative '../args/draw' +require_relative '../args/paragraph' +require_relative '../args/transform' +require_relative '../dsl/text_embed' +require_relative '../errors_warnings/warn_unexpected_params' + +module Squib + class Deck + def text(opts = {}) + embed = TextEmbed.new self, __callee__ + yield(embed) if block_given? # store the opts for later use + DSL::Text.new(self, __callee__, embed).run(opts) + end + end + + module DSL + class Text + include WarnUnexpectedParams + attr_reader :dsl_method, :deck, :embed + + def initialize(deck, dsl_method, embed) + @deck = deck + @dsl_method = dsl_method + @embed = embed + end + + def self.accepted_params + %i( + str font font_size x y markup width height + wrap spacing align justify valign ellipsize angle dash cap join + hint color fill_color + stroke_color stroke_width stroke_width stroke_color stroke_strategy + range layout + ) + end + + def run(opts) + warn_if_unexpected opts + range = Args.extract_range opts, deck + para = Args.extract_para opts, deck + box = Args.extract_box opts, deck, { width: :auto, height: :auto } + trans = Args.extract_transform opts, deck + draw = Args.extract_draw opts, deck, { stroke_width: 0.0 } + extents = Array.new(deck.size) + range.each do |i| + extents[i] = deck.cards[i].text(embed, para[i], box[i], trans[i], draw[i], deck.dpi) + end + return extents + end + end + end +end diff --git a/lib/squib/dsl/text_embed.rb b/lib/squib/dsl/text_embed.rb new file mode 100644 index 0000000..2cb877a --- /dev/null +++ b/lib/squib/dsl/text_embed.rb @@ -0,0 +1,78 @@ +require_relative '../args/box' +require_relative '../args/card_range' +require_relative '../args/embed_adjust' +require_relative '../args/embed_key' +require_relative '../args/input_file' +require_relative '../args/paint' +require_relative '../args/transform' +require_relative '../errors_warnings/warn_unexpected_params' + +module Squib + class TextEmbed + include WarnUnexpectedParams + attr_reader :rules, :deck, :dsl_method + + def initialize(deck, dsl_method) + @deck = deck + @rules = {} # store an array of options for later usage + end + + def self.accepted_params + %i( + key file id force_id layout width height dx dy + id force_id data + flip_horizontal flip_vertical + alpha angle blend mask + ) + end + + def svg(opts = {}) + warn_if_unexpected opts + key = Args::EmbedKey.new.validate_key(opts[:key]) + range = Args.extract_range opts, deck + paint = Args.extract_paint opts, deck + box = Args.extract_box opts, deck, { width: :native, height: :native } + adjust = Args::EmbedAdjust.new.load!(opts, expand_by: deck.size, layout: deck.layout, dpi: deck.dpi) + trans = Args.extract_transform opts, deck + ifile = Args.extract_input_file opts, deck + svg_args = Args.extract_svg_special opts, deck + rule = { type: :svg, file: ifile, box: box, paint: paint, trans: trans, + adjust: adjust, svg_args: svg_args } + rule[:draw] = Proc.new do |card, x, y, scale| + i = card.index + b = box[i] + b.x, b.y = x, y + b.width = b.width * scale if b.width.is_a? Numeric + b.height = b.height * scale if b.height.is_a? Numeric + Dir.chdir(deck.img_dir) do + card.svg(ifile[i].file, svg_args[i], b, paint[i], trans[i]) + end + end + @rules[key] = rule + end + + def png(opts = {}) + warn_if_unexpected opts + key = Args::EmbedKey.new.validate_key(opts[:key]) + range = Args.extract_range opts, deck + paint = Args.extract_paint opts, deck + box = Args.extract_box opts, deck, { width: :native, height: :native } + adjust = Args::EmbedAdjust.new.load!(opts, expand_by: deck.size, layout: deck.layout, dpi: deck.dpi) + trans = Args.extract_transform opts, deck + ifile = Args.extract_input_file opts, deck + rule = { type: :png, file: ifile, box: box, paint: paint, trans: trans, adjust: adjust } + rule[:draw] = Proc.new do |card, x, y, scale| + i = card.index + b = box[i] + b.x, b.y = x, y + b.width = b.width * scale if b.width.is_a? Numeric + b.height = b.height * scale if b.height.is_a? Numeric + Dir.chdir(deck.img_dir) do + card.png(ifile[i].file, b, paint[i], trans[i]) + end + end + @rules[key] = rule + end + + end +end diff --git a/lib/squib/api/units.rb b/lib/squib/dsl/units.rb similarity index 100% rename from lib/squib/api/units.rb rename to lib/squib/dsl/units.rb diff --git a/samples/text/_text_options.rb b/samples/text/_text_options.rb index 6f293fd..081718d 100644 --- a/samples/text/_text_options.rb +++ b/samples/text/_text_options.rb @@ -1,5 +1,6 @@ # encoding: UTF-8 -require 'squib' +# require 'squib' +require_relative '../../lib/squib' data = { 'name' => ['Thief', 'Grifter', 'Mastermind'], 'level' => [1, 2, 3] } diff --git a/spec/docs/options_documented_spec.rb b/spec/docs/options_documented_spec.rb index bd9d674..601ca3e 100644 --- a/spec/docs/options_documented_spec.rb +++ b/spec/docs/options_documented_spec.rb @@ -3,7 +3,7 @@ require_relative 'docs_helper' describe Squib::DSL do context 'methods' do - Squib::DSL.constants.each do |m| + (Squib::DSL.constants - [:Text]).each do |m| it "accepted params for #{m} are in the docs" do accepted_params = Squib::DSL.const_get(m).accepted_params.sort documented_opts = documented_options(m).sort @@ -11,6 +11,15 @@ describe Squib::DSL do end end + it "accepted params for text and embedding options are in the docs" do + accepted_params = Squib::DSL::Text.accepted_params + accepted_params += Squib::TextEmbed.accepted_params + accepted_params.sort! + accepted_params.uniq! + documented_opts = documented_options(:Text).sort.uniq + documented_opts -= %i( embed.png embed.svg ) + expect(accepted_params).to eq(documented_opts) + end end end