Stabilizing the code after the options switch. Getting there...
parent
e38b5dfdbe
commit
f6480445df
|
|
@ -16,9 +16,9 @@ module Squib
|
|||
# @param sheet: [Integer] The zero-based index of the sheet from which to read.
|
||||
# @api public
|
||||
def xlsx(opts = {})
|
||||
needs(opts, [:file, :sheet])
|
||||
s = Roo::Excelx.new(file)
|
||||
s.default_sheet = s.sheets[sheet]
|
||||
opts = needs(opts, [:file, :sheet])
|
||||
s = Roo::Excelx.new(opts[:file])
|
||||
s.default_sheet = s.sheets[opts[:sheet]]
|
||||
data = {}
|
||||
s.first_column.upto(s.last_column) do |col|
|
||||
header = s.cell(s.first_row,col).to_s
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ module Squib
|
|||
def png(opts = {})
|
||||
opts = needs(opts, [:range, :files, :x, :y, :alpha])
|
||||
opts[:range].each do |i|
|
||||
@cards[i].png(opts[:file][i], opts[:x], opts[:y], opts:[alpha])
|
||||
@cards[i].png(opts[:file][i], opts[:x], opts[:y], opts[:alpha])
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ module Squib
|
|||
def svg(opts = {})
|
||||
p = needs(opts,[:range, :files, :svgid, :x, :y, :width, :height])
|
||||
p[:range].each do |i|
|
||||
@cards[i].svg(p[:file], p[:id], p[:x], p[:y], p[:width], p[:height])
|
||||
@cards[i].svg(p[:file][i], p[:id], p[:x], p[:y], p[:width], p[:height])
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ module Squib
|
|||
# @option height: the height of the box the string will be placed in. Stretches to the content by default.
|
||||
# @option wrap: When height is set, determines the behavior of how the string wraps. The `:word_char` option will break at words, but then fall back to characters when the word cannot fit. #
|
||||
# Options are `:none, :word, :char, :word_char`. Also: `true` is the same as `:word_char`, `false` is the same as `:none`. Default `:word_char`
|
||||
# @option fitxy: sets the text `width` and `height` to be equal to `width - x` and `height - y` for easy centering
|
||||
# @option align: options `:left, :right, and :center`. Default `:left`
|
||||
# @option justify: [Boolean] toggles whether or not the text is justified or not. Default `false`
|
||||
# @option valign: When width and height are set, align text vertically according to the logical extents of the text. Options are `:top, :middle, :bottom`. Default `:top`
|
||||
|
|
@ -31,11 +30,11 @@ module Squib
|
|||
# @return [nil] Returns nothing
|
||||
# @api public
|
||||
def text(opts = {})
|
||||
opts = needs(opts, [:range, :str, :font, :x, :y, :width, :height, :color, :wrap,
|
||||
:fitxy, :align, :justify, :valign, :ellipsize, :hint])
|
||||
str = [opts[:str]] * @cards.size unless str.respond_to? :each
|
||||
opts = needs(opts, [:range, :str, :font, :x, :y, :width, :height, :text_color, :wrap,
|
||||
:align, :justify, :valign, :ellipsize, :hint])
|
||||
opts[:str] = [opts[:str]] * @cards.size unless opts[:str].respond_to? :each
|
||||
opts[:range].each do |i|
|
||||
@cards[i].text(str[i], opts[:font], opts[:x], opts[:y], opts[:color], opts) #TODO split this out
|
||||
@cards[i].text(opts[:str][i], opts[:font], opts[:x], opts[:y], opts[:color], opts)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ module Squib
|
|||
:stroke_color => :black,
|
||||
:stroke_width => 2.0,
|
||||
:font => :use_set,
|
||||
:default_font => 'Arial 36',
|
||||
:sheet => 0,
|
||||
:x => 0,
|
||||
:y => 0,
|
||||
:fitxy => false,
|
||||
:align => :left,
|
||||
:valign => :top,
|
||||
:justify => false,
|
||||
|
|
@ -22,7 +22,10 @@ module Squib
|
|||
:alpha => 1.0,
|
||||
:format => :png,
|
||||
:dir => "_output",
|
||||
:prefix => "card_"
|
||||
:prefix => "card_",
|
||||
:margin => 75,
|
||||
:gap => 0,
|
||||
:trim => 0
|
||||
}
|
||||
|
||||
end
|
||||
|
|
@ -24,7 +24,7 @@ module Squib
|
|||
def initialize(width: 825, height: 1125, cards: 1, dpi: 300, config: 'config.yml', &block)
|
||||
@width=width; @height=height
|
||||
@dpi = dpi
|
||||
@font = Squib::SYSTEM_DEFAULTS[:font]
|
||||
@font = Squib::SYSTEM_DEFAULTS[:default_font]
|
||||
@cards = []
|
||||
cards.times{ @cards << Squib::Card.new(self, width, height) }
|
||||
load_config(config)
|
||||
|
|
|
|||
|
|
@ -1,21 +1,21 @@
|
|||
module Squib
|
||||
class Deck
|
||||
|
||||
def save_pdf(file: 'deck.pdf', dir: '_output', margin: 75, gap: 0, trim: 0)
|
||||
dir = dirify(dir, allow_create: true)
|
||||
def save_pdf(opts = {})
|
||||
p = needs(opts, [:file_to_save, :prefix, :margin, :gap, :trim])
|
||||
width = 11 * @dpi ; height = 8.5 * @dpi #TODO: allow this to be specified too
|
||||
cc = Cairo::Context.new(Cairo::PDFSurface.new("#{dir}/#{file}", width, height))
|
||||
x = margin ; y = margin
|
||||
x = p[:margin] ; y = p[:margin]
|
||||
@cards.each_with_index do |card, i|
|
||||
surface = trim(card.cairo_surface, trim, @width, @height)
|
||||
surface = trim(card.cairo_surface, p[:trim], @width, @height)
|
||||
cc.set_source(surface, x, y)
|
||||
cc.paint
|
||||
x += surface.width + gap
|
||||
if x > (width - surface.width - margin)
|
||||
x = margin
|
||||
y += surface.height + gap
|
||||
x = p[:margin]
|
||||
y += surface.height + p[:gap]
|
||||
if y > (height - surface.height - margin)
|
||||
x = margin ; y = margin
|
||||
x = p[:margin] ; y = p[:margin]
|
||||
cc.show_page #next page
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ module Squib
|
|||
w = layout.extents[1].width / Pango::SCALE if w < 0
|
||||
h = layout.height / Pango::SCALE
|
||||
h = layout.extents[1].height / Pango::SCALE if h < 0
|
||||
draw_rectangle(x,y,w,h,0,0,'#0000',color, 2.0)
|
||||
rect(x,y,w,h,0,0,'#0000',color, 2.0)
|
||||
end
|
||||
|
||||
def ellipsize(layout, options)
|
||||
|
|
@ -65,16 +65,8 @@ module Squib
|
|||
end
|
||||
|
||||
def setwh(layout, options)
|
||||
layout.width = options[:width] * Pango::SCALE unless options[:width].nil?
|
||||
layout.height = options[:height] * Pango::SCALE unless options[:height].nil?
|
||||
layout
|
||||
end
|
||||
|
||||
def fitxy(layout, x,y, options)
|
||||
w = options[:width] ; h = options[:height]
|
||||
w ||= (@width - 2*x); h ||= (@height - 2*y) # default centers to x,y
|
||||
w *= Pango::SCALE ; h *= Pango::SCALE
|
||||
layout.width=w ; layout.height=h
|
||||
layout.width = options[:width] * Pango::SCALE unless options[:width].nil? || options[:width] == :native
|
||||
layout.height = options[:height] * Pango::SCALE unless options[:height].nil? || options[:height] == :native
|
||||
layout
|
||||
end
|
||||
|
||||
|
|
@ -86,8 +78,7 @@ module Squib
|
|||
layout.font_description = Pango::FontDescription.new(font)
|
||||
layout.text = str.to_s
|
||||
layout.markup = str.to_s if options[:markup]
|
||||
layout = setwh(layout, options) unless options[:width].nil? && options[:height].nil?
|
||||
layout = fitxy(layout, x, y , options) if options[:fitxy]
|
||||
layout = setwh(layout, options)
|
||||
layout = wrap(layout, options)
|
||||
layout = ellipsize(layout, options)
|
||||
layout = align(layout, options)
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ module Squib
|
|||
opts = Squib::SYSTEM_DEFAULTS.merge(opts)
|
||||
opts = rangeify(opts) if params.include? :range
|
||||
opts = fileify(opts) if params.include? :file
|
||||
opts = fileify(opts, false, true) if params.include? :file_to_save
|
||||
opts = fileify(opts, true) if params.include? :files
|
||||
opts = colorify(opts) if params.include? :color
|
||||
opts = colorify(opts, true) if params.include? :nillable_color
|
||||
|
|
@ -39,11 +40,11 @@ module Squib
|
|||
end
|
||||
module_function :rangeify
|
||||
|
||||
def fileify(opts, expand_singletons=false)
|
||||
def fileify(opts, expand_singletons=false, allow_non_exist=false)
|
||||
opts[:file] = [opts[:file]] * @cards.size if expand_singletons
|
||||
files = [opts[:file]].flatten
|
||||
files.each do |file|
|
||||
unless File.exists? file
|
||||
unless File.exists? file || allow_non_exist
|
||||
raise "File #{File.expand_path(file)} does not exist!"
|
||||
end
|
||||
end
|
||||
|
|
@ -52,7 +53,8 @@ module Squib
|
|||
module_function :fileify
|
||||
|
||||
def dirify(opts, allow_create=false)
|
||||
return opts if Dir.exists? opts[:dir]
|
||||
puts opts[:dir]
|
||||
return opts if Dir.exists?(opts[:dir])
|
||||
if allow_create
|
||||
Squib.logger.warn "Dir #{opts[:dir]} does not exist, creating it."
|
||||
Dir.mkdir opts[:dir]
|
||||
|
|
@ -76,7 +78,7 @@ module Squib
|
|||
|
||||
def fontify (opts)
|
||||
opts[:font] = @font if opts[:font]==:use_set
|
||||
opts[:font] = Squib::SYSTEM_DEFAULTS[:font] if opts[:font] ==:default
|
||||
opts[:font] = Squib::SYSTEM_DEFAULTS[:default_font] if opts[:font] == :default
|
||||
opts
|
||||
end
|
||||
module_function :fontify
|
||||
|
|
@ -92,7 +94,7 @@ module Squib
|
|||
|
||||
def svgidify(opts)
|
||||
unless opts[:id].nil?
|
||||
opts[:id] = '#' << opts[:id] unless svgid.start_with? '#'
|
||||
opts[:id] = '#' << opts[:id] unless opts[:id].start_with? '#'
|
||||
end
|
||||
opts
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ require 'squib'
|
|||
|
||||
data = {'name' => ['Thief', 'Grifter', 'Mastermind'],
|
||||
'level' => [1,2,3]}
|
||||
longtext = "This is left-justified text centered on the card based on x and y.\nWhat do you know about tweetle beetles? well... \nWhen tweetle beetles fight, it's called a tweetle beetle battle. And when they battle in a puddle, it's a tweetle beetle puddle battle. AND when tweetle beetles battle with paddles in a puddle, they call it a tweetle beetle puddle paddle battle. AND... When beetles battle beetles in a puddle paddle battle and the beetle battle puddle is a puddle in a bottle... ..they call this a tweetle beetle bottle puddle paddle battle muddle. AND... When beetles fight these battles in a bottle with their paddles and the bottle's on a poodle and the poodle's eating noodles... ...they call this a muddle puddle tweetle poodle beetle noodle bottle paddle battle."
|
||||
longtext = "This is left-justified text.\nWhat do you know about tweetle beetles? well... \nWhen tweetle beetles fight, it's called a tweetle beetle battle. And when they battle in a puddle, it's a tweetle beetle puddle battle. AND when tweetle beetles battle with paddles in a puddle, they call it a tweetle beetle puddle paddle battle. AND... When beetles battle beetles in a puddle paddle battle and the beetle battle puddle is a puddle in a bottle... ..they call this a tweetle beetle bottle puddle paddle battle muddle. AND... When beetles fight these battles in a bottle with their paddles and the bottle's on a poodle and the poodle's eating noodles... ...they call this a muddle puddle tweetle poodle beetle noodle bottle paddle battle."
|
||||
|
||||
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||
background color: :white
|
||||
|
|
@ -46,7 +46,8 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
|||
|
||||
text str: longtext, font: 'Arial 16',
|
||||
x: 65, y: 700,
|
||||
fitxy: true, justify: true
|
||||
width: inches(2.25), height: inches(1),
|
||||
justify: true
|
||||
|
||||
text str: "<b>Markup</b> is also <i>quite</i> <s>easy</s> awesome",
|
||||
markup: true,
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ describe Squib::Deck, '#text' do
|
|||
context "when working with fonts" do
|
||||
it"should use the default font when #text and #set_font don't specify" do
|
||||
card = instance_double(Squib::Card)
|
||||
expect(card).to receive(:text).with('a', Squib::SYSTEM_DEFAULTS[:font], anything, anything, anything, anything).once
|
||||
expect(card).to receive(:text).with('a', 'Arial 36', anything, anything, anything, anything).once
|
||||
Squib::Deck.new do
|
||||
@cards = [card]
|
||||
text str: 'a'
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@ require 'squib'
|
|||
|
||||
describe Squib do
|
||||
|
||||
# it "should execute all examples with no errors" do
|
||||
# samples = File.expand_path('../samples', File.dirname(__FILE__))
|
||||
# Dir["#{samples}/**/*.rb"].each do |sample|
|
||||
# Dir.chdir(samples) do #to save to _output
|
||||
# require_relative "../samples/#{File.basename(sample)}"
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
it "should execute all examples with no errors" do
|
||||
samples = File.expand_path('../samples', File.dirname(__FILE__))
|
||||
Dir["#{samples}/**/*.rb"].each do |sample|
|
||||
Dir.chdir(samples) do #to save to _output
|
||||
require_relative "../samples/#{File.basename(sample)}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
Loading…
Reference in New Issue