Tons of documentation work
parent
209b4240eb
commit
d34e4729ce
|
|
@ -0,0 +1,6 @@
|
||||||
|
--markup markdown
|
||||||
|
--api public
|
||||||
|
-
|
||||||
|
API.md
|
||||||
|
LICENSE.txt
|
||||||
|
samples/**/*.rb
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
# @markup markdown
|
||||||
|
# Squib API
|
||||||
|
|
||||||
|
# Squib::Deck and Squib::Card
|
||||||
|
|
||||||
|
Squib essentially has two main classes: `Deck` and `Card`. `Deck` is the front-end, and `Card` is the back-end. The contract of `Deck` is to do the various manipulations of options and then delegate the operation to `Card` to do the low-level graphical operations.
|
||||||
|
|
||||||
|
For most users, I recommending solely using `Deck` methods. If you want to roll up your sleeves and get your hands messy, you can access the Cairo or Pango contexts the directly via the `Card` class.
|
||||||
|
|
||||||
|
# Specifying Parameters
|
||||||
|
|
||||||
|
Squib makes extensive use of [Ruby 2.0's named parameters](http://www.ruby-doc.org/core-2.0.0/doc/syntax/calling_methods_rdoc.html#label-Keyword+Arguments). This means you can specify your parameters in any order you please. In fact, with named parameters you *must* specify which argument ties to which parameter. If you get an error like this:
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
C:/Ruby200/lib/ruby/gems/2.0.0/gems/squib-0.0.2/lib/squib/api/text.rb:17:in `text': wrong number of arguments (1 for 0)
|
||||||
|
(ArgumentError)
|
||||||
|
from hello-world.rb:5:in `block in <main>'
|
||||||
|
from C:/Ruby200/lib/ruby/gems/2.0.0/gems/squib-0.0.2/lib/squib/deck.rb:21:in `instance_eval'
|
||||||
|
from C:/Ruby200/lib/ruby/gems/2.0.0/gems/squib-0.0.2/lib/squib/deck.rb:21:in `initialize'
|
||||||
|
from hello-world.rb:4:in `new'
|
||||||
|
from hello-world.rb:4:in `<main>'
|
||||||
|
```
|
||||||
|
...then you're not specifying the parameters explicitly (e.g. the above example was with `text 'X'` instead of `text str: 'X'`)
|
||||||
|
|
||||||
|
All parameters are optional. For example `x` and `y` default to 0 (i.e. the upper-left corner of the card).
|
||||||
|
|
||||||
|
Any parameter that is specified in the command overrides any Squib defaults, `config.yml` settings, or layout rules.
|
||||||
|
|
||||||
|
# Specifying Ranges
|
||||||
|
|
||||||
|
All public `Deck` methods allow a range to be specified as a first parameter. This parameter is used to access an internal `Array` of `Squib::Cards`. This can be an actual Ruby range, or anything that implements `#each` (thus can be an `Enumerable`). Integers are also supported for changing one card only. Negatives work from the back of the deck. Here are some examples from `samples/ranges.rb` found [here](https://github.com/andymeneely/squib/tree/master/samples/ranges.rb)
|
||||||
|
|
||||||
|
{include:file:samples/ranges.rb}
|
||||||
|
|
||||||
|
Many more examples can be found in `ranges.rb` in the [samples]() folder . In particular, take a look at some idioms that uses hashes to denote things like card "types", or future-proofing against creating and deleting cards with an ID column.
|
||||||
|
|
||||||
|
# Pixels and Other Units
|
||||||
|
|
||||||
|
By default, Squib thinks in pixels. This decision was made so that we can have pixel-perfect layouts without automatically scaling everything, even though working in units is sometimes easier. To convert, we provide the `Deck#inch` method, as shown in
|
||||||
|
|
||||||
|
`samples/units.rb` found [here](https://github.com/andymeneely/squib/tree/master/samples/units.rb)
|
||||||
|
|
||||||
|
# Specifying Colors
|
||||||
|
|
||||||
|
Squib uses the `rcairo` [color parser](https://github.com/rcairo/rcairo/blob/master/lib/cairo/color.rb) to accepts a variety of color specifications, along with over [300 pre-defined constants](https://github.com/rcairo/rcairo/blob/master/lib/cairo/colors.rb). Here are some examples from `samples/colors.rb` found [here](https://github.com/andymeneely/squib/tree/master/samples/colors.rb)
|
||||||
|
|
||||||
|
{include:file:samples/colors.rb}
|
||||||
|
|
||||||
|
# Specifying Files
|
||||||
|
|
||||||
|
All files opened for reading (e.g. for `png` and `xlsx`) are opened relative to the current directory.
|
||||||
|
|
||||||
85
README.md
85
README.md
|
|
@ -1,8 +1,63 @@
|
||||||
# Squib [](https://rubygems.org/gems/squib) [](https://travis-ci.org/andymeneely/squib) [](https://gemnasium.com/andymeneely/squib)
|
# Squib [](https://rubygems.org/gems/squib) [](https://travis-ci.org/andymeneely/squib) [](https://gemnasium.com/andymeneely/squib)
|
||||||
|
|
||||||
Squib is a ruby DSL for prototyping card and board games. Think of it like [nanDeck](http://www.nand.it/nandeck/) done "the Ruby way". Start with some basic commands and generate print-ready PNGs and PDFs. Squib supports complex text rendering, reading PNGs and SVGs, reading from ExcelX files, and shape drawing. Plus, you have the full power of Ruby behind you.
|
Squib is a Ruby DSL for prototyping card and board games. Think of it like [nanDeck](http://www.nand.it/nandeck/) done "the Ruby way". Start with some basic commands and generate print-ready PNGs and PDFs. Squib supports:
|
||||||
|
|
||||||
Check it out!
|
* Complex text rendering using [Pango](http://www.pango.org/)
|
||||||
|
* Reading PNGs and SVGs using [Cairo](http://cairographics.org/)
|
||||||
|
* Reading `.xlsx` files
|
||||||
|
* Basic shape drawing
|
||||||
|
* Saving to PNGs and PDFs
|
||||||
|
* Plus the full power of Ruby!
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
require 'squib'
|
||||||
|
|
||||||
|
Squib::Deck.new do
|
||||||
|
text str: 'Hello, World!'
|
||||||
|
save_png
|
||||||
|
end
|
||||||
|
```
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add this line to your application's Gemfile:
|
||||||
|
|
||||||
|
gem 'squib'
|
||||||
|
|
||||||
|
And then execute:
|
||||||
|
|
||||||
|
$ bundle
|
||||||
|
|
||||||
|
Or install it yourself as:
|
||||||
|
|
||||||
|
$ gem install squib
|
||||||
|
|
||||||
|
Note: Squib has some native dependencies, such as [Cairo](https://github.com/rcairo/rcairo), [Pango](http://ruby-gnome2.sourceforge.jp/hiki.cgi?Pango%3A%3ALayout), and [Nokogiri](http://nokogiri.org/), which all require DevKit to compile C code. This is usually not painful, but on some setups can cause headaches. For Windows users, I *strongly* recommend using the *non-*64 bit RubyInstaller at http://rubyinstaller.org/
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
After installing Squib, you can create a project and run your first build like this:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
$ squib new my-cool-game
|
||||||
|
$ cd my-cool-game
|
||||||
|
$ ruby deck.rb
|
||||||
|
```
|
||||||
|
|
||||||
|
The `squib new` command will generate files and folders like this:
|
||||||
|
```
|
||||||
|
_output
|
||||||
|
gitkeep.txt
|
||||||
|
.gitignore
|
||||||
|
ABOUT.md
|
||||||
|
config.yml
|
||||||
|
deck.rb
|
||||||
|
Gemfile
|
||||||
|
layout.yml
|
||||||
|
PNP NOTES.md
|
||||||
|
```
|
||||||
|
|
||||||
|
The central file here is `deck.rb`. Here's a more complex example of a deck to work from:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
require 'squib'
|
require 'squib'
|
||||||
|
|
@ -22,32 +77,20 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
## Installation
|
## Learning Squib's API
|
||||||
|
|
||||||
Add this line to your application's Gemfile:
|
* The `samples` directory in the [source repository](https://github.com/andymeneely/squib) has lots of examples
|
||||||
|
* The [API.md]() walks through the various methods and options
|
||||||
gem 'squib'
|
* [API Documentation](http://rubydoc.info/gems/squib/) is also kept up-to-date.
|
||||||
|
|
||||||
And then execute:
|
|
||||||
|
|
||||||
$ bundle
|
|
||||||
|
|
||||||
Or install it yourself as:
|
|
||||||
|
|
||||||
$ gem install squib
|
|
||||||
|
|
||||||
Note: Squib has some native dependencies, such as [Cairo](https://github.com/rcairo/rcairo) and [Pango](http://ruby-gnome2.sourceforge.jp/hiki.cgi?Pango%3A%3ALayout), and [Nokogiri](http://nokogiri.org/), which all require DevKit to compile C code. This is usually not painful, but on some setups can cause headaches. For Windows users, I *highly* recommend using [http://rubyinstaller.org/].
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
Squib is currently in pre-release alpha, so the API is still maturing. If you are using Squib, however, I'd love to hear about it! Feel free to [file a bug](https://github.com/andymeneely/squib/issues) if you find any.
|
Squib is currently in pre-release alpha, so the API is still maturing. If you are using Squib, however, I'd love to hear about it! Feel free to [file a bug or feature request](https://github.com/andymeneely/squib/issues).
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
API docs to be written. The `samples` directory for in-depth examples.
|
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
|
Squib is an open source tool, and I would love participation. If you want your code integrated:
|
||||||
|
|
||||||
1. Fork it ( https://github.com/[my-github-username]/squib/fork )
|
1. Fork it ( https://github.com/[my-github-username]/squib/fork )
|
||||||
2. Create your feature branch (`git checkout -b my-new-feature`)
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
||||||
3. Commit your changes (`git commit -am 'Add some feature'`)
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
||||||
|
|
|
||||||
7
Rakefile
7
Rakefile
|
|
@ -1,6 +1,11 @@
|
||||||
require 'bundler/gem_tasks'
|
require 'bundler/gem_tasks'
|
||||||
require 'rspec/core/rake_task'
|
require 'rspec/core/rake_task'
|
||||||
|
require 'yard'
|
||||||
|
|
||||||
RSpec::Core::RakeTask.new(:spec)
|
RSpec::Core::RakeTask.new(:spec)
|
||||||
|
|
||||||
task :default => :spec
|
task :default => :spec
|
||||||
|
|
||||||
|
YARD::Rake::YardocTask.new(:doc) do |t|
|
||||||
|
t.files = ['lib/**/*.rb', 'samples/**/*.rb'] # optional
|
||||||
|
#t.options = ['--any', '--extra', '--opts'] # optional
|
||||||
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
#module API
|
|
||||||
|
|
||||||
def background(range: :all, color: :black)
|
def background(range: :all, color: :black)
|
||||||
range = rangeify(range)
|
range = rangeify(range)
|
||||||
|
|
@ -8,6 +7,5 @@ module Squib
|
||||||
range.each { |i| @cards[i].background(color) }
|
range.each { |i| @cards[i].background(color) }
|
||||||
end
|
end
|
||||||
|
|
||||||
#end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -3,10 +3,18 @@ require 'roo'
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
#@api private todo
|
||||||
def csv(file: 'deck.csv', header: true)
|
def csv(file: 'deck.csv', header: true)
|
||||||
raise 'Not implemented!'
|
raise 'Not implemented!'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Convenience method for pulling Excel data from `.xlsx` files
|
||||||
|
# Pulls the data into a Hash of arrays based on the columns. First row is assumed to be the header row.
|
||||||
|
# See the example at {file:samples/excel.rb samples/excel.rb}. The accompanying Excel file is in the [source repository](https://github.com/andymeneely/squib/tree/master/samples)
|
||||||
|
#
|
||||||
|
# @param file: [String] the file to open. Must end in `.xlsx`. Opens relative to the current directory.
|
||||||
|
# @param sheet: [Integer] The zero-based index of the sheet from which to read.
|
||||||
|
# @api public
|
||||||
def xlsx(file: 'deck.xlsx', sheet: 0)
|
def xlsx(file: 'deck.xlsx', sheet: 0)
|
||||||
s = Roo::Excelx.new(file)
|
s = Roo::Excelx.new(file)
|
||||||
s.default_sheet = s.sheets[sheet]
|
s.default_sheet = s.sheets[sheet]
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,29 @@
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
# Renders a png file at the given location.
|
||||||
|
# See {file:samples/image.rb samples/image.rb} and {file:samples/tgc-overlay.rb samples/tgc-overlay.rb} as examples.
|
||||||
|
# Note: scaling not currently supported.
|
||||||
|
#
|
||||||
|
# @param range: the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
|
||||||
|
# @param file: the . See {file:API.md#Specifying+Files Specifying Files}
|
||||||
|
# @param x: the x-coordinate to place
|
||||||
|
# @param y: the y-coordinate to place
|
||||||
|
# @param alpha: the alpha-transparency percentage used to blend this image
|
||||||
def png(range: :all, file: nil, x: 0, y: 0, alpha: 1.0)
|
def png(range: :all, file: nil, x: 0, y: 0, alpha: 1.0)
|
||||||
range = rangeify(range)
|
range = rangeify(range)
|
||||||
file = fileify(file)
|
file = fileify(file)
|
||||||
range.each{ |i| @cards[i].png(file, x, y, alpha) }
|
range.each{ |i| @cards[i].png(file, x, y, alpha) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Renders an entire svg file at the given location. Uses the SVG-specified units and DPI to determine the pixel width and height.
|
||||||
|
# See {file:samples/image.rb samples/image.rb} and {file:samples/tgc-overlay.rb samples/tgc-overlay.rb} as examples.
|
||||||
|
# Note: scaling not currently supported.
|
||||||
|
#
|
||||||
|
# @param range: the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
|
||||||
|
# @param file: the . See {file:API.md#Specifying+Files Specifying Files}
|
||||||
|
# @param x: the x-coordinate to place
|
||||||
|
# @param y: the y-coordinate to place
|
||||||
def svg(range: :all, file: nil, x: 0, y: 0)
|
def svg(range: :all, file: nil, x: 0, y: 0)
|
||||||
range = rangeify(range)
|
range = rangeify(range)
|
||||||
file = fileify(file)
|
file = fileify(file)
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,23 @@
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
# Saves the range of cards to either PNG or PDF
|
||||||
|
#
|
||||||
|
# @param range: the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
|
||||||
|
# @param dir: the directory for the output to be sent to. Will be created if it doesn't exist
|
||||||
|
# @param format: the format that this will be rendered too. Options `:pdf, :png`. Array of both is allowed: `[:pdf, :png]`
|
||||||
|
# @param prefix: the prefix of the file name to be printed
|
||||||
def save(range: :all, dir: "_output", format: :png, prefix: "card_")
|
def save(range: :all, dir: "_output", format: :png, prefix: "card_")
|
||||||
format = [format].flatten
|
format = [format].flatten
|
||||||
save_png(range: range, dir: dir, prefix: prefix) if format.include? :png
|
save_png(range: range, dir: dir, prefix: prefix) if format.include? :png
|
||||||
save_pdf if format.include? :pdf
|
save_pdf if format.include? :pdf
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Saves the range of cards to PNG
|
||||||
|
#
|
||||||
|
# @param range: the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
|
||||||
|
# @param dir: the directory for the output to be sent to. Will be created if it doesn't exist
|
||||||
|
# @param prefix: the prefix of the file name to be printed
|
||||||
def save_png(range: :all, dir: "_output", prefix: 'card_')
|
def save_png(range: :all, dir: "_output", prefix: 'card_')
|
||||||
range = rangeify(range); dir = dirify(dir, allow_create: true)
|
range = rangeify(range); dir = dirify(dir, allow_create: true)
|
||||||
range.each { |i| @cards[i].save_png(i, dir, prefix) }
|
range.each { |i| @cards[i].save_png(i, dir, prefix) }
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,15 @@
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
# Toggle hints globally.
|
||||||
|
# Text hints are rectangles around where the text will be laid out. They are intended to be temporary.
|
||||||
|
# Setting a hint to nil or to :off will disable hints. @see samples/text.rb
|
||||||
|
#
|
||||||
|
# @param [Color] text the color of the text hint. To turn off use nil or :off. @see API.md
|
||||||
|
# @return nil
|
||||||
|
# @api public
|
||||||
def hint(text: nil)
|
def hint(text: nil)
|
||||||
|
text = nil if text == :off
|
||||||
@text_hint = colorify(text, nillable: true)
|
@text_hint = colorify(text, nillable: true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,10 @@ module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
def rect(range: :all, x: 0, y: 0, width: 825, height: 1125, \
|
def rect(range: :all, x: 0, y: 0, width: 825, height: 1125, \
|
||||||
x_radius: 0, y_radius: 0, color: :black)
|
radius: 0, x_radius: 0, y_radius: 0, color: :black)
|
||||||
range = rangeify(range)
|
range = rangeify(range)
|
||||||
color = colorify(color)
|
color = colorify(color)
|
||||||
|
x_radius,y_radius = radiusify(radius, x_radius, y_radius)
|
||||||
range.each do |i|
|
range.each do |i|
|
||||||
@cards[i].draw_rectangle(x, y, width, height, x_radius, y_radius, color)
|
@cards[i].draw_rectangle(x, y, width, height, x_radius, y_radius, color)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,48 @@
|
||||||
module Squib
|
module Squib
|
||||||
class Deck
|
class Deck
|
||||||
|
|
||||||
|
# @api private todo
|
||||||
def font(type: 'Arial', size: 12, **options)
|
def font(type: 'Arial', size: 12, **options)
|
||||||
raise 'Not implemented!'
|
raise 'Not implemented!'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# @api private todo
|
||||||
def set_font(type: 'Arial', size: 12, **options)
|
def set_font(type: 'Arial', size: 12, **options)
|
||||||
raise 'Not implemented!'
|
raise 'Not implemented!'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Renders a string at a given location, width, alignment, font, etc.
|
||||||
|
# Unix-like newlines are interpreted even on Windows. See the {file:samples/text-options.rb samples/text.rb} for a lengthy example.
|
||||||
#
|
#
|
||||||
# font: description string, including family, styles, and size.
|
# @param range: the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
|
||||||
#
|
# @param str: the string to be rendered. Must support `#to_s`.
|
||||||
# => e.g. 'Arial bold italic 12'
|
# @param font: the Font description string, including family, styles, and size.
|
||||||
# For the official documentation the string, see the [Pango docs](http://ruby-gnome2.sourceforge.jp/hiki.cgi?Pango%3A%3AFontDescription#style).
|
# (e.g. `'Arial bold italic 12'`)
|
||||||
|
# For the official documentation, see the [Pango docs](http://ruby-gnome2.sourceforge.jp/hiki.cgi?Pango%3A%3AFontDescription#style).
|
||||||
# This [description](http://www.pygtk.org/pygtk2reference/class-pangofontdescription.html) is also quite good.
|
# This [description](http://www.pygtk.org/pygtk2reference/class-pangofontdescription.html) is also quite good.
|
||||||
|
# See the {file:samples/text-options.rb samples/text.rb} as well.
|
||||||
|
# @param x: the x-coordinate to place
|
||||||
|
# @param y: the y-coordinate to place
|
||||||
|
# @param color: (default: :black) the color the font will render to. See {file:API.md#label-Specifying+Colors Specifying Colors}
|
||||||
|
# @param markup: [Boolean] (default: false) Enable markup parsing of `str` using the HTML-like Pango Markup syntax, defined [here](http://ruby-gnome2.sourceforge.jp/hiki.cgi?pango-markup) and [here](https://developer.gnome.org/pango/stable/PangoMarkupFormat.html).
|
||||||
|
# @param width: the width of the box the string will be placed in. Stretches to the content by default.
|
||||||
|
# @param height: the height of the box the string will be placed in. Stretches to the content by default.
|
||||||
|
# @param 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`
|
||||||
|
# @param fitxy: sets the text `width` and `height` to be equal to `width - x` and `height - y` for easy centering
|
||||||
|
# @param align: options `:left, :right, and :center`. Default `:left`
|
||||||
|
# @param justify: [Boolean] toggles whether or not the text is justified or not. Default `false`
|
||||||
|
# @param 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`
|
||||||
|
# @param ellipsize: When width and height are set, determines the behavior of overflowing text. Options are `:none, :start, :middle, :end`. Also: `true` maps to `:end` and `false` maps to `:none`. Default `:end`
|
||||||
|
# @param hint: show a text hint with the given color. Overrides global hints (see {Deck#hint}).
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
def text(range: :all, str: '', font: :use_set, x: 0, y: 0, **options)
|
def text(range: :all, str: '', font: :use_set, x: 0, y: 0, **options)
|
||||||
range = rangeify(range)
|
range = rangeify(range)
|
||||||
str = [str] * @cards.size unless str.respond_to? :each
|
str = [str] * @cards.size unless str.respond_to? :each
|
||||||
font = fontify(font)
|
font = fontify(font)
|
||||||
color = colorify(options[:color], nillable: false)
|
color = colorify(options[:color], nillable: false)
|
||||||
options['hint'] = colorify(options['hint']) unless options['hint'].nil?
|
options[:hint] = colorify(options[:hint]) unless options[:hint].nil?
|
||||||
range.each do |i|
|
range.each do |i|
|
||||||
cards[i].text(str[i], font, x, y, color, options)
|
cards[i].text(str[i], font, x, y, color, options)
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
module Squib
|
||||||
|
class Deck
|
||||||
|
|
||||||
|
# Given inches, returns the number of pixels according to the deck's DPI.
|
||||||
|
#
|
||||||
|
# @param [Decimal] n, the number of inches
|
||||||
|
# @return [Decimal] the number of pixels, according to the deck's DPI
|
||||||
|
# @api public
|
||||||
|
def inches(n)
|
||||||
|
@dpi * n
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
module Squib
|
module Squib
|
||||||
module Constants
|
module Constants
|
||||||
|
|
||||||
DEFAULT_FONT = 'Arial 36'
|
#@api public
|
||||||
|
DEFAULT_FONT = 'Arial 36 B'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -3,7 +3,15 @@ require 'squib/card'
|
||||||
require 'squib/input_helpers'
|
require 'squib/input_helpers'
|
||||||
require 'squib/constants'
|
require 'squib/constants'
|
||||||
|
|
||||||
|
|
||||||
|
# The project module
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
module Squib
|
module Squib
|
||||||
|
|
||||||
|
# The main interface to Squib. Provides a front-end porcelain whereas the Card class interacts with the graphics plumbing.
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
class Deck
|
class Deck
|
||||||
include Enumerable
|
include Enumerable
|
||||||
include Squib::InputHelpers
|
include Squib::InputHelpers
|
||||||
|
|
@ -12,9 +20,12 @@ module Squib
|
||||||
attr_reader :cards
|
attr_reader :cards
|
||||||
attr_reader :text_hint
|
attr_reader :text_hint
|
||||||
|
|
||||||
def initialize(width: 825, height: 1125, cards: 1, config: 'config.yml', &block)
|
# Squib's constructor that sets the immutable properties.
|
||||||
|
#
|
||||||
|
# @api public
|
||||||
|
def initialize(width: 825, height: 1125, cards: 1, dpi: 300, config: 'config.yml', &block)
|
||||||
@width=width; @height=height
|
@width=width; @height=height
|
||||||
@dpi = 300
|
@dpi = dpi
|
||||||
@font = 'Sans 36'
|
@font = 'Sans 36'
|
||||||
@cards = []
|
@cards = []
|
||||||
cards.times{ @cards << Squib::Card.new(self, width, height) }
|
cards.times{ @cards << Squib::Card.new(self, width, height) }
|
||||||
|
|
@ -24,20 +35,21 @@ module Squib
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# API: Accesses the array of cards in the deck
|
# Directly accesses the array of cards in the deck
|
||||||
|
#
|
||||||
# @api public
|
# @api public
|
||||||
def [](key)
|
def [](key)
|
||||||
@cards[key]
|
@cards[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Public: Accesses each card of the array in the deck
|
# Iterates over each card in the deck
|
||||||
# @api
|
#
|
||||||
|
# @api public
|
||||||
def each(&block)
|
def each(&block)
|
||||||
@cards.each { |card| block.call(card) }
|
@cards.each { |card| block.call(card) }
|
||||||
end
|
end
|
||||||
|
|
||||||
# Internal: Load the configuration file, if exists,
|
# Load the configuration file, if exists, overriding hardcoded defaults
|
||||||
# overriding hardcoded defaults
|
|
||||||
# @api private
|
# @api private
|
||||||
def load_config(file)
|
def load_config(file)
|
||||||
if File.exists? file
|
if File.exists? file
|
||||||
|
|
@ -57,6 +69,7 @@ module Squib
|
||||||
require 'squib/api/settings'
|
require 'squib/api/settings'
|
||||||
require 'squib/api/shapes'
|
require 'squib/api/shapes'
|
||||||
require 'squib/api/text'
|
require 'squib/api/text'
|
||||||
|
require 'squib/api/units'
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -34,6 +34,8 @@ module Squib
|
||||||
:char => Pango::Layout::WRAP_CHAR,
|
:char => Pango::Layout::WRAP_CHAR,
|
||||||
:word_char => Pango::Layout::WRAP_WORD_CHAR,
|
:word_char => Pango::Layout::WRAP_WORD_CHAR,
|
||||||
true => Pango::Layout::WRAP_WORD_CHAR,
|
true => Pango::Layout::WRAP_WORD_CHAR,
|
||||||
|
false => nil,
|
||||||
|
:none => nil
|
||||||
}
|
}
|
||||||
layout.wrap = h[options[:wrap]]
|
layout.wrap = h[options[:wrap]]
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,16 @@ module Squib
|
||||||
end
|
end
|
||||||
module_function :fontify
|
module_function :fontify
|
||||||
|
|
||||||
|
def radiusify(radius, x_radius, y_radius)
|
||||||
|
unless radius.nil?
|
||||||
|
ret_x = radius
|
||||||
|
ret_y = radius
|
||||||
|
end
|
||||||
|
ret_x = x_radius unless x_radius.nil?
|
||||||
|
rex_y = y_radius unless y_radius.nil?
|
||||||
|
return ret_x,ret_y
|
||||||
|
end
|
||||||
|
|
||||||
def xyify
|
def xyify
|
||||||
#TODO: Allow negative numbers that subtract from the card width & height
|
#TODO: Allow negative numbers that subtract from the card width & height
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||||
png range: [0,2], file: 'shiny-purse.png', x: 620, y: 75
|
png range: [0,2], file: 'shiny-purse.png', x: 620, y: 75
|
||||||
svg range: 1..2, file: 'spanner.svg', x: 620, y: 218
|
svg range: 1..2, file: 'spanner.svg', x: 620, y: 218
|
||||||
|
|
||||||
save format: :png
|
save prefix: 'basic_', format: :png
|
||||||
end
|
end
|
||||||
|
|
||||||
puts "Done!"
|
puts "Done!"
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/usr/bin/env ruby
|
||||||
|
require 'squib'
|
||||||
|
|
||||||
|
Squib::Deck.new do
|
||||||
|
text str: 'Hello, World!'
|
||||||
|
save_png
|
||||||
|
end
|
||||||
|
|
@ -12,15 +12,24 @@ Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||||
text str: data['level'], x: 65, y: 40, font: 'Arial 72'
|
text str: data['level'], x: 65, y: 40, font: 'Arial 72'
|
||||||
|
|
||||||
# Could be explicit about using :all, too
|
# Could be explicit about using :all, too
|
||||||
text range: :all, str: data['type'], x: 50, y: 128, font: 'Arial 18'
|
text range: :all,
|
||||||
|
str: data['type'], x: 40, y: 128, font: 'Arial 18',
|
||||||
|
width: 100, align: :center
|
||||||
|
|
||||||
# Ranges are inclusive
|
# Ranges are inclusive, zero-based
|
||||||
text range: 0..1, str: "Thief and Grifter only!!", x: 25, y:200
|
text range: 0..1, str: "Thief and Grifter only!!", x: 25, y:200
|
||||||
|
|
||||||
|
# Integers are also allowed
|
||||||
|
text range: 0, str: "Thief only!", x: 25, y: 250
|
||||||
|
|
||||||
|
# Negatives go from the back of the deck
|
||||||
|
text range: -1, str: "Mastermind only!", x: 25, y: 250
|
||||||
|
text range: -2..-1, str: "Grifter and Mastermind only!", x: 25, y: 650
|
||||||
|
|
||||||
# We can use Arrays too!
|
# We can use Arrays too!
|
||||||
text range: [0,2], str: "Thief and Mastermind only!!", x: 25, y:300
|
text range: [0,2], str: "Thief and Mastermind only!!", x: 25, y:300
|
||||||
|
|
||||||
# Useful idiom: construct a hash from card names back to id,
|
# Useful idiom: construct a hash from card names back to its index (ID),
|
||||||
# then use a range. No need to memorize IDs, and you can add cards easily
|
# then use a range. No need to memorize IDs, and you can add cards easily
|
||||||
id = {} ; data['name'].each_with_index{ |name,i| id[name] = i}
|
id = {} ; data['name'].each_with_index{ |name,i| id[name] = i}
|
||||||
text range: id['Thief']..id['Grifter'],
|
text range: id['Thief']..id['Grifter'],
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
require 'squib'
|
||||||
|
|
||||||
|
Squib::Deck.new(width: 825, height: 1125, cards: 3) do
|
||||||
|
background color: :white
|
||||||
|
|
||||||
|
bleed = inches(0.125)
|
||||||
|
cut_width = inches(2.5)
|
||||||
|
cut_height = inches(3.5)
|
||||||
|
rect x: bleed, y: bleed, width: cut_width, height: cut_height, radius: 25
|
||||||
|
|
||||||
|
save prefix: 'units_', format: :png
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "Done!"
|
||||||
|
|
@ -36,4 +36,6 @@ Gem::Specification.new do |spec|
|
||||||
spec.add_development_dependency "bundler", "~> 1.6"
|
spec.add_development_dependency "bundler", "~> 1.6"
|
||||||
spec.add_development_dependency "rake"
|
spec.add_development_dependency "rake"
|
||||||
spec.add_development_dependency "rspec", "~> 3.0"
|
spec.add_development_dependency "rspec", "~> 3.0"
|
||||||
|
spec.add_development_dependency "yard"
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue