👮 leading space in comments
parent
0f5b7d0f8e
commit
65a0fdfd47
2
Rakefile
2
Rakefile
|
|
@ -29,7 +29,7 @@ end
|
||||||
desc 'Run some performance benchmarks'
|
desc 'Run some performance benchmarks'
|
||||||
task benchmark: [:install] do
|
task benchmark: [:install] do
|
||||||
require 'squib'
|
require 'squib'
|
||||||
Squib::logger.level = Logger::ERROR #silence warnings
|
Squib::logger.level = Logger::ERROR # silence warnings
|
||||||
Dir.chdir('benchmarks') do
|
Dir.chdir('benchmarks') do
|
||||||
Benchmark.bm(15) do |bm|
|
Benchmark.bm(15) do |bm|
|
||||||
Dir['*.rb'].each do | script |
|
Dir['*.rb'].each do | script |
|
||||||
|
|
|
||||||
|
|
@ -23,10 +23,10 @@ module Squib
|
||||||
cell.strip! if cell.respond_to?(:strip) && import.strip?
|
cell.strip! if cell.respond_to?(:strip) && import.strip?
|
||||||
cell = yield(header, cell) if block_given?
|
cell = yield(header, cell) if block_given?
|
||||||
data[header] << cell
|
data[header] << cell
|
||||||
end#row
|
end# row
|
||||||
end#col
|
end# col
|
||||||
explode_quantities(data, import.explode)
|
explode_quantities(data, import.explode)
|
||||||
end#xlsx
|
end# xlsx
|
||||||
module_function :xlsx
|
module_function :xlsx
|
||||||
|
|
||||||
# DSL method. See http://squib.readthedocs.org
|
# DSL method. See http://squib.readthedocs.org
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ module Squib
|
||||||
trans = Args::Transform.new.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)
|
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)
|
embed = TextEmbed.new(size, custom_colors, layout, dpi, img_dir)
|
||||||
yield(embed) if block_given? #store the opts for later use
|
yield(embed) if block_given? # store the opts for later use
|
||||||
extents = Array.new(@cards.size)
|
extents = Array.new(@cards.size)
|
||||||
range.each { |i| extents[i] = @cards[i].text(embed, para[i], box[i], trans[i], draw[i]) }
|
range.each { |i| extents[i] = @cards[i].text(embed, para[i], box[i], trans[i], draw[i]) }
|
||||||
return extents
|
return extents
|
||||||
|
|
|
||||||
|
|
@ -122,9 +122,9 @@ module Squib
|
||||||
|
|
||||||
def convert_unit(arg, dpi)
|
def convert_unit(arg, dpi)
|
||||||
case arg.to_s.rstrip
|
case arg.to_s.rstrip
|
||||||
when /in$/ #ends with "in"
|
when /in$/ # ends with "in"
|
||||||
arg.rstrip[0..-2].to_f * dpi
|
arg.rstrip[0..-2].to_f * dpi
|
||||||
when /cm$/ #ends with "cm"
|
when /cm$/ # ends with "cm"
|
||||||
arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM
|
arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM
|
||||||
else
|
else
|
||||||
arg
|
arg
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
module Squib
|
module Squib
|
||||||
#@api private
|
# @api private
|
||||||
module Args
|
module Args
|
||||||
module ColorValidator
|
module ColorValidator
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
module Squib
|
module Squib
|
||||||
#@api private
|
# @api private
|
||||||
module Args
|
module Args
|
||||||
module DirValidator
|
module DirValidator
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
require_relative '../constants'
|
require_relative '../constants'
|
||||||
|
|
||||||
module Squib
|
module Squib
|
||||||
#@api private
|
# @api private
|
||||||
module Args
|
module Args
|
||||||
# Internal class for handling arguments
|
# Internal class for handling arguments
|
||||||
#@api private
|
# @api private
|
||||||
class Typographer
|
class Typographer
|
||||||
|
|
||||||
def initialize(config = Conf::DEFAULTS)
|
def initialize(config = Conf::DEFAULTS)
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,9 @@ module Squib
|
||||||
module_function
|
module_function
|
||||||
def parse(arg, dpi=300)
|
def parse(arg, dpi=300)
|
||||||
case arg.to_s.rstrip
|
case arg.to_s.rstrip
|
||||||
when /in$/ #ends with "in"
|
when /in$/ # ends with "in"
|
||||||
arg.rstrip[0..-2].to_f * dpi
|
arg.rstrip[0..-2].to_f * dpi
|
||||||
when /cm$/ #ends with "cm"
|
when /cm$/ # ends with "cm"
|
||||||
arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM
|
arg.rstrip[0..-2].to_f * dpi * INCHES_IN_CM
|
||||||
else
|
else
|
||||||
arg
|
arg
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ module Squib
|
||||||
'warn_png_scale' => true,
|
'warn_png_scale' => true,
|
||||||
}
|
}
|
||||||
|
|
||||||
#Translate the hints to the methods.
|
# Translate the hints to the methods.
|
||||||
ANTIALIAS_OPTS = {
|
ANTIALIAS_OPTS = {
|
||||||
nil => 'subpixel',
|
nil => 'subpixel',
|
||||||
'best' => 'subpixel',
|
'best' => 'subpixel',
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@ module Squib
|
||||||
inner_radius, outer_radius = poly.inner_radius, poly.outer_radius
|
inner_radius, outer_radius = poly.inner_radius, poly.outer_radius
|
||||||
use_cairo do |cc|
|
use_cairo do |cc|
|
||||||
cc.rotate_about(x, y, trans.angle)
|
cc.rotate_about(x, y, trans.angle)
|
||||||
cc.move_to(x + outer_radius, y) #i = 0, so cos(0)=1 and sin(0)=0
|
cc.move_to(x + outer_radius, y) # i = 0, so cos(0)=1 and sin(0)=0
|
||||||
theta = Math::PI / n.to_f # i.e. (2*pi) / (2*n)
|
theta = Math::PI / n.to_f # i.e. (2*pi) / (2*n)
|
||||||
0.upto(2 * n) do |i|
|
0.upto(2 * n) do |i|
|
||||||
radius = i.even? ? outer_radius : inner_radius
|
radius = i.even? ? outer_radius : inner_radius
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ module Squib
|
||||||
(0..src.width).step(in_thickness) do |i|
|
(0..src.width).step(in_thickness) do |i|
|
||||||
percentage = i / src.width.to_f
|
percentage = i / src.width.to_f
|
||||||
i = src.width - i if face_right
|
i = src.width - i if face_right
|
||||||
factor = scale + (percentage * (1.0 - scale)) #linear interpolation
|
factor = scale + (percentage * (1.0 - scale)) # linear interpolation
|
||||||
dest_cxt.save
|
dest_cxt.save
|
||||||
dest_cxt.translate 0, src.height / 2.0 * (1.0 - factor)
|
dest_cxt.translate 0, src.height / 2.0 * (1.0 - factor)
|
||||||
dest_cxt.scale factor * scale, factor
|
dest_cxt.scale factor * scale, factor
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ module Squib
|
||||||
def compute_valign(layout, valign, embed_h)
|
def compute_valign(layout, valign, embed_h)
|
||||||
return 0 unless layout.height > 0
|
return 0 unless layout.height > 0
|
||||||
ink_extents = layout.extents[1]
|
ink_extents = layout.extents[1]
|
||||||
ink_extents.height = embed_h * Pango::SCALE if ink_extents.height == 0 #JUST embed, bug #134
|
ink_extents.height = embed_h * Pango::SCALE if ink_extents.height == 0 # JUST embed, bug #134
|
||||||
case valign.to_s.downcase
|
case valign.to_s.downcase
|
||||||
when 'middle'
|
when 'middle'
|
||||||
Pango.pixels((layout.height - ink_extents.height) / 2)
|
Pango.pixels((layout.height - ink_extents.height) / 2)
|
||||||
|
|
@ -94,7 +94,7 @@ module Squib
|
||||||
rule = embed.rules[key]
|
rule = embed.rules[key]
|
||||||
spacing = rule[:box].width[@index] * Pango::SCALE
|
spacing = rule[:box].width[@index] * Pango::SCALE
|
||||||
kindex = clean_str.index(key)
|
kindex = clean_str.index(key)
|
||||||
kindex = clean_str[0..kindex].bytesize #convert to byte index (bug #57)
|
kindex = clean_str[0..kindex].bytesize # convert to byte index (bug #57)
|
||||||
str = str.sub(key, "<span size=\"#{ZERO_WIDTH_CHAR_SIZE}\">a<span letter_spacing=\"#{spacing.to_i}\">a</span>a</span>")
|
str = str.sub(key, "<span size=\"#{ZERO_WIDTH_CHAR_SIZE}\">a<span letter_spacing=\"#{spacing.to_i}\">a</span>a</span>")
|
||||||
layout.markup = str
|
layout.markup = str
|
||||||
clean_str = layout.text
|
clean_str = layout.text
|
||||||
|
|
@ -158,7 +158,7 @@ module Squib
|
||||||
embed_draws = process_embeds(embed, para.str, layout)
|
embed_draws = process_embeds(embed, para.str, layout)
|
||||||
|
|
||||||
vertical_start = compute_valign(layout, para.valign, max_embed_height(embed_draws))
|
vertical_start = compute_valign(layout, para.valign, max_embed_height(embed_draws))
|
||||||
cc.move_to(0, vertical_start) #TODO clean this up a bit
|
cc.move_to(0, vertical_start) # TODO clean this up a bit
|
||||||
|
|
||||||
stroke_outline!(cc, layout, draw) if draw.stroke_strategy == :stroke_first
|
stroke_outline!(cc, layout, draw) if draw.stroke_strategy == :stroke_first
|
||||||
cc.move_to(0, vertical_start)
|
cc.move_to(0, vertical_start)
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ require 'yaml'
|
||||||
|
|
||||||
module Squib
|
module Squib
|
||||||
# Internal class for handling layouts
|
# Internal class for handling layouts
|
||||||
#@api private
|
# @api private
|
||||||
class LayoutParser
|
class LayoutParser
|
||||||
|
|
||||||
# Load the layout file(s), if exists
|
# Load the layout file(s), if exists
|
||||||
|
|
@ -14,7 +14,7 @@ module Squib
|
||||||
thefile = file
|
thefile = file
|
||||||
thefile = builtin(file) unless File.exists?(file)
|
thefile = builtin(file) unless File.exists?(file)
|
||||||
if File.exists? thefile
|
if File.exists? thefile
|
||||||
yml = layout.merge(YAML.load_file(thefile) || {}) #load_file returns false on empty file
|
yml = layout.merge(YAML.load_file(thefile) || {}) # load_file returns false on empty file
|
||||||
yml.each do |key, value|
|
yml.each do |key, value|
|
||||||
layout[key] = recurse_extends(yml, key, {})
|
layout[key] = recurse_extends(yml, key, {})
|
||||||
end
|
end
|
||||||
|
|
@ -47,11 +47,11 @@ module Squib
|
||||||
elsif child_val.to_s.strip.start_with?('-=')
|
elsif child_val.to_s.strip.start_with?('-=')
|
||||||
parent_val - child_val.sub('-=', '').strip.to_f
|
parent_val - child_val.sub('-=', '').strip.to_f
|
||||||
else
|
else
|
||||||
child_val #child overrides parent when merging, no +=
|
child_val # child overrides parent when merging, no +=
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
h = h.merge(from_extends) do |key, older_sibling, younger_sibling|
|
h = h.merge(from_extends) do |key, older_sibling, younger_sibling|
|
||||||
younger_sibling #when two siblings have the same entry, the "younger" (lower one) overrides
|
younger_sibling # when two siblings have the same entry, the "younger" (lower one) overrides
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return h
|
return h
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
module Squib
|
module Squib
|
||||||
|
|
||||||
# Some helper methods specifically for samples
|
# Some helper methods specifically for samples
|
||||||
#@api private
|
# @api private
|
||||||
#:nodoc:
|
#:nodoc:
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ Squib::Deck.new do
|
||||||
star x: 300, y: 1000, n: 5, inner_radius: 15, outer_radius: 40,
|
star x: 300, y: 1000, n: 5, inner_radius: 15, outer_radius: 40,
|
||||||
fill_color: :cyan, stroke_color: :burgundy, stroke_width: 5
|
fill_color: :cyan, stroke_color: :burgundy, stroke_width: 5
|
||||||
|
|
||||||
#default draw is fill-then-stroke. Can be changed to stroke-then-fill
|
# default draw is fill-then-stroke. Can be changed to stroke-then-fill
|
||||||
star x: 375, y: 1000, n: 5, inner_radius: 15, outer_radius: 40,
|
star x: 375, y: 1000, n: 5, inner_radius: 15, outer_radius: 40,
|
||||||
fill_color: :cyan, stroke_color: :burgundy,
|
fill_color: :cyan, stroke_color: :burgundy,
|
||||||
stroke_width: 5, stroke_strategy: :stroke_first
|
stroke_width: 5, stroke_strategy: :stroke_first
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ Squib::Deck.new(cards: 3) do
|
||||||
text str: data['Level'], x: 65, y: 65, font: 'Arial 72'
|
text str: data['Level'], x: 65, y: 65, font: 'Arial 72'
|
||||||
text str: data['Description'], x: 65, y: 600, font: 'Arial 36'
|
text str: data['Description'], x: 65, y: 600, font: 'Arial 36'
|
||||||
|
|
||||||
save format: :png, prefix: 'sample_excel_' #save to individual pngs
|
save format: :png, prefix: 'sample_excel_' # save to individual pngs
|
||||||
end
|
end
|
||||||
|
|
||||||
# xlsx is also a Squib-module-level function, so this also works:
|
# xlsx is also a Squib-module-level function, so this also works:
|
||||||
|
|
@ -51,5 +51,5 @@ Squib::Deck.new(cards: resource_data['Name'].size) do
|
||||||
rect width: :deck, height: :deck
|
rect width: :deck, height: :deck
|
||||||
text str: resource_data['Name'], align: :center, width: :deck, hint: 'red'
|
text str: resource_data['Name'], align: :center, width: :deck, hint: 'red'
|
||||||
text str: resource_data['Cost'], align: :right, width: :deck, hint: 'red'
|
text str: resource_data['Cost'], align: :right, width: :deck, hint: 'red'
|
||||||
save_sheet prefix: 'sample_excel_resources_' #save to a whole sheet
|
save_sheet prefix: 'sample_excel_resources_' # save to a whole sheet
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ Squib::Deck.new(cards: 8, layout: 'playing-card.yml') do
|
||||||
text str: ('A'..'Z').to_a, layout: :bonus_ul, font: 'Sans bold 100'
|
text str: ('A'..'Z').to_a, layout: :bonus_ul, font: 'Sans bold 100'
|
||||||
|
|
||||||
# Defaults are sensible
|
# Defaults are sensible
|
||||||
hand #saves to _output/hand.png
|
hand # saves to _output/hand.png
|
||||||
|
|
||||||
# Here's a prettier version:
|
# Here's a prettier version:
|
||||||
# - Each card is trimmed with rounded corners
|
# - Each card is trimmed with rounded corners
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ Squib::Deck.new(width: 825, height: 1125, cards: 1, config: 'load_images_config.
|
||||||
# Can be scaled if width and height are set
|
# Can be scaled if width and height are set
|
||||||
svg file: 'spanner.svg', x: 50, y: 50, width: 250, height: 250
|
svg file: 'spanner.svg', x: 50, y: 50, width: 250, height: 250
|
||||||
png file: 'shiny-purse.png', x: 305, y: 50, width: 250, height: 250
|
png file: 'shiny-purse.png', x: 305, y: 50, width: 250, height: 250
|
||||||
#...but PNGs will warn if it's an upscale, unless you disable them in config.yml
|
# ...but PNGs will warn if it's an upscale, unless you disable them in config.yml
|
||||||
|
|
||||||
# Can be scaled using just width or height, if one of them is set to :scale
|
# Can be scaled using just width or height, if one of them is set to :scale
|
||||||
svg file: 'spanner.svg', x: 200, y: 350, width: 35, height: :scale
|
svg file: 'spanner.svg', x: 200, y: 350, width: 35, height: :scale
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||||
x:25, y: 500
|
x:25, y: 500
|
||||||
|
|
||||||
# Useful idiom: draw a different number of images for different cards
|
# Useful idiom: draw a different number of images for different cards
|
||||||
hearts = [nil, 1, 2] #i.e. card 0 has no hearts, card 2 has 2 hearts drawn
|
hearts = [nil, 1, 2] # i.e. card 0 has no hearts, card 2 has 2 hearts drawn
|
||||||
1.upto(2).each do |n|
|
1.upto(2).each do |n|
|
||||||
range = hearts.each_index.select { |i| hearts[i] == n}
|
range = hearts.each_index.select { |i| hearts[i] == n}
|
||||||
n.times do |i|
|
n.times do |i|
|
||||||
|
|
|
||||||
|
|
@ -64,8 +64,8 @@ describe Squib::Deck do
|
||||||
it 'loads basic xlsx data' do
|
it 'loads basic xlsx data' do
|
||||||
expect(Squib.xlsx(file: xlsx_file('basic.xlsx'))).to eq({
|
expect(Squib.xlsx(file: xlsx_file('basic.xlsx'))).to eq({
|
||||||
'Name' => %w(Larry Curly Mo),
|
'Name' => %w(Larry Curly Mo),
|
||||||
'General Number' => %w(1 2 3), #general types always get loaded as strings with no conversion
|
'General Number' => %w(1 2 3), # general types always get loaded as strings with no conversion
|
||||||
'Actual Number' => [4.0, 5.0, 6.0], #numbers get auto-converted to integers
|
'Actual Number' => [4.0, 5.0, 6.0], # numbers get auto-converted to integers
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ describe Squib::Args::Draw do
|
||||||
|
|
||||||
it 'works when specified' do
|
it 'works when specified' do
|
||||||
draw.load!({}) # go right to defaults
|
draw.load!({}) # go right to defaults
|
||||||
expect(draw.stroke_width).to eq([0.0]) #ordinarily a non-zero according
|
expect(draw.stroke_width).to eq([0.0]) # ordinarily a non-zero according
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,7 @@ it "single quotes inside double quotes" do
|
||||||
|
|
||||||
|
|
||||||
context 'configured' do
|
context 'configured' do
|
||||||
#TODO
|
# TODO
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ describe Squib::Deck, '#save_pdf' do
|
||||||
end
|
end
|
||||||
|
|
||||||
before(:each) do
|
before(:each) do
|
||||||
allow(Cairo::PDFSurface).to receive(:new).and_return(nil) #don't create the file
|
allow(Cairo::PDFSurface).to receive(:new).and_return(nil) # don't create the file
|
||||||
allow(Cairo::Context).to receive(:new).and_return(cxt)
|
allow(Cairo::Context).to receive(:new).and_return(cxt)
|
||||||
allow(cxt).to receive(:antialias=)
|
allow(cxt).to receive(:antialias=)
|
||||||
end
|
end
|
||||||
|
|
@ -27,7 +27,7 @@ describe Squib::Deck, '#save_pdf' do
|
||||||
num_cards = 9
|
num_cards = 9
|
||||||
deck = Squib::Deck.new(cards: 9, width: 825, height: 1125)
|
deck = Squib::Deck.new(cards: 9, width: 825, height: 1125)
|
||||||
expect(Squib.logger).to receive(:debug).at_least(:once)
|
expect(Squib.logger).to receive(:debug).at_least(:once)
|
||||||
expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
|
expect(Squib.logger).to receive(:warn).exactly(:once) # warn about making the dir
|
||||||
expect(Dir).to receive(:mkdir) {} # don't actually make the dir
|
expect(Dir).to receive(:mkdir) {} # don't actually make the dir
|
||||||
expect(cxt).to receive(:scale).with(0.24, 0.24)
|
expect(cxt).to receive(:scale).with(0.24, 0.24)
|
||||||
|
|
||||||
|
|
@ -51,7 +51,7 @@ describe Squib::Deck, '#save_pdf' do
|
||||||
args = { range: 2..4, file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
|
args = { range: 2..4, file: 'foo.pdf', dir: '_out', margin: 75, gap: 5, trim: 37 }
|
||||||
deck = Squib::Deck.new(cards: num_cards, width: 825, height: 1125)
|
deck = Squib::Deck.new(cards: num_cards, width: 825, height: 1125)
|
||||||
expect(Squib.logger).to receive(:debug).at_least(:once)
|
expect(Squib.logger).to receive(:debug).at_least(:once)
|
||||||
expect(Squib.logger).to receive(:warn).exactly(:once) #warn about making the dir
|
expect(Squib.logger).to receive(:warn).exactly(:once) # warn about making the dir
|
||||||
expect(Dir).to receive(:mkdir) {} # don't actually make the dir
|
expect(Dir).to receive(:mkdir) {} # don't actually make the dir
|
||||||
expect(cxt).to receive(:scale).with(0.24, 0.24)
|
expect(cxt).to receive(:scale).with(0.24, 0.24)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ class Sanity
|
||||||
row = []
|
row = []
|
||||||
actual_png = @@OUTPUT_DIR + File.basename(exp_png)
|
actual_png = @@OUTPUT_DIR + File.basename(exp_png)
|
||||||
row << "file:///" + exp_png
|
row << "file:///" + exp_png
|
||||||
row << "file:///" + actual_png #actual
|
row << "file:///" + actual_png # actual
|
||||||
row << "file:///" + diff_image(exp_png, actual_png)
|
row << "file:///" + diff_image(exp_png, actual_png)
|
||||||
images << row
|
images << row
|
||||||
bar.increment
|
bar.increment
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue