squib 0.0.1 → 0.0.2

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.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +29 -26
  3. data/.travis.yml +6 -4
  4. data/.yardopts +6 -0
  5. data/API.md +59 -0
  6. data/Gemfile +2 -2
  7. data/LICENSE.txt +22 -22
  8. data/README.md +92 -55
  9. data/Rakefile +11 -6
  10. data/bin/squib +19 -2
  11. data/lib/squib/api/background.rb +16 -11
  12. data/lib/squib/api/data.rb +52 -29
  13. data/lib/squib/api/image.rb +48 -10
  14. data/lib/squib/api/save.rb +36 -15
  15. data/lib/squib/api/settings.rb +35 -0
  16. data/lib/squib/api/shapes.rb +106 -12
  17. data/lib/squib/api/text.rb +45 -25
  18. data/lib/squib/api/units.rb +17 -0
  19. data/lib/squib/card.rb +36 -27
  20. data/lib/squib/commands/new.rb +40 -0
  21. data/lib/squib/constants.rb +40 -0
  22. data/lib/squib/deck.rb +113 -48
  23. data/lib/squib/graphics/background.rb +12 -10
  24. data/lib/squib/graphics/image.rb +28 -12
  25. data/lib/squib/graphics/save_doc.rb +50 -21
  26. data/lib/squib/graphics/save_images.rb +10 -8
  27. data/lib/squib/graphics/shapes.rb +55 -11
  28. data/lib/squib/graphics/text.rb +107 -27
  29. data/lib/squib/input_helpers.rb +140 -0
  30. data/lib/squib/project_template/.gitignore +3 -0
  31. data/lib/squib/project_template/ABOUT.md +19 -0
  32. data/lib/squib/project_template/Gemfile +3 -0
  33. data/lib/squib/project_template/PNP NOTES.md +4 -0
  34. data/lib/squib/project_template/_output/gitkeep.txt +1 -0
  35. data/lib/squib/project_template/config.yml +2 -0
  36. data/lib/squib/project_template/deck.rb +6 -0
  37. data/lib/squib/project_template/layout.yml +0 -0
  38. data/lib/squib/version.rb +6 -3
  39. data/lib/squib.rb +19 -2
  40. data/samples/_output/gitkeep.txt +0 -0
  41. data/samples/basic.rb +20 -22
  42. data/samples/colors.rb +17 -0
  43. data/samples/custom-config.yml +1 -0
  44. data/samples/custom-layout.yml +34 -0
  45. data/samples/custom_config.rb +6 -0
  46. data/samples/draw_shapes.rb +19 -0
  47. data/samples/excel.rb +19 -16
  48. data/samples/hello_world.rb +7 -0
  49. data/samples/load_images.rb +19 -0
  50. data/samples/pokercard.png +0 -0
  51. data/samples/ranges.rb +47 -0
  52. data/samples/sample.xlsx +0 -0
  53. data/samples/save_pdf.rb +14 -0
  54. data/samples/spanner.svg +91 -0
  55. data/samples/text_options.rb +58 -0
  56. data/samples/tgc_proofs.rb +20 -0
  57. data/samples/units.rb +12 -0
  58. data/samples/use_layout.rb +29 -0
  59. data/spec/api/api_text_spec.rb +37 -0
  60. data/spec/commands/new_spec.rb +48 -0
  61. data/spec/deck_spec.rb +49 -48
  62. data/spec/samples_run_spec.rb +15 -0
  63. data/spec/spec_helper.rb +9 -0
  64. data/squib.gemspec +42 -27
  65. metadata +109 -11
  66. data/samples/_output/watch.html +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3977769e38bdf72d2dd035c62648b2ffaae2085c
4
- data.tar.gz: e9d8ad1586160caee1be3d2b497ab9c71daa56b2
3
+ metadata.gz: 1bdd8eafb413745ef16bdd12e11696a748ef60ec
4
+ data.tar.gz: 9fada45fed185c9b847f40b301d2e7283ad9b3ea
5
5
  SHA512:
6
- metadata.gz: e8238d6b6e236a22a2bd164712771b9366f20e3d4d04101b0992d2517d666bd0e6cd8996c8ba24aeb56133b2d30b405ba37fd26a44f8d5b3017b1146bde63ad1
7
- data.tar.gz: 4593d6fae7feac75dab22efa560042c7fc932f1b056d029ef53464bac21a1a2bda6a711336ef358c831de33930344251380975e66f16c73a1f1f8c1447191c0b
6
+ metadata.gz: e9b3665709f6d61c13eea918bfd63ec55877baa21d8e4ae056773e12ac6da08729cf0c123af7fc17b32aca28ff81d4d4b99afac45c58f32ec949546ae8840496
7
+ data.tar.gz: ddde2eead6b96ce895d5c39af1072e1cc36f6590fc17565a4ff6b1e4a6c93001f737b5bc657e5f004360c938b48a00c0b2f6551981a200f25346afab86a38e39
data/.gitignore CHANGED
@@ -1,26 +1,29 @@
1
- .DS_Store
2
- *.gem
3
- *.rbc
4
- .bundle
5
- .config
6
- .yardoc
7
- Gemfile.lock
8
- InstalledFiles
9
- _yardoc
10
- coverage
11
- doc/
12
- lib/bundler/man
13
- pkg
14
- rdoc
15
- spec/reports
16
- test/tmp
17
- test/version_tmp
18
- tmp
19
- *.bundle
20
- *.so
21
- *.o
22
- *.a
23
- mkmf.log
24
- _img
25
- samples/_img
26
- samples/_output/*.png
1
+ .DS_Store
2
+ *.gem
3
+ *.rbc
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ .inch
8
+ Gemfile.lock
9
+ InstalledFiles
10
+ _yardoc
11
+ coverage
12
+ doc/
13
+ lib/bundler/man
14
+ pkg
15
+ rdoc
16
+ spec/reports
17
+ test/tmp
18
+ test/version_tmp
19
+ tmp
20
+ *.bundle
21
+ *.so
22
+ *.o
23
+ *.a
24
+ mkmf.log
25
+ _img
26
+ samples/_img
27
+ samples/_output/*.png
28
+ samples/_output/*.pdf
29
+ samples/_output/foo
data/.travis.yml CHANGED
@@ -1,4 +1,6 @@
1
- language: ruby
2
- rvm:
3
- - 2.0.0
4
- - 2.1.0
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 2.1.2
5
+ before_install: gem install bundler --version '~> 1.6'
6
+
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --readme README.md
2
+ --markup markdown
3
+ --api public
4
+ -
5
+ API.md
6
+ LICENSE.txt
data/API.md ADDED
@@ -0,0 +1,59 @@
1
+ # Squib API
2
+
3
+ The Squib DSL is based on a collection of methods provided to the `Squib::Deck` class. The general philosophy of Squib is to specify as little as possible with layers of defaults, highly flexible input, and good ol' Ruby duck-typing. Ruby does a lot to make Squib useful.
4
+
5
+ # Squib::Deck and Squib::Card
6
+
7
+ 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.
8
+
9
+ 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. The API documentation doesn't really cover these, however, so you're on your own there.
10
+
11
+ # Specifying Parameters
12
+
13
+ Squib is all about sane defaults and shorthand specification. Arguments are almost always using hashes, which look a lot like [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. 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.
14
+
15
+ # Specifying Ranges
16
+
17
+ Most 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)
18
+
19
+ {include:file:samples/ranges.rb}
20
+
21
+ Many more examples can be found in `ranges.rb` in the [samples](https://github.com/andymeneely/squib/tree/master/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.
22
+
23
+ # Pixels and Other Units
24
+
25
+ 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)
26
+
27
+ {include:file:samples/units.rb}
28
+
29
+ # Specifying Colors
30
+
31
+ Colors can be specified in a wide variety of ways, mostly in a hex-string. Take a look at the examples from `samples/colors.rb`, found [here](https://github.com/andymeneely/squib/tree/master/samples/colors.rb)
32
+
33
+ {include:file:samples/colors.rb}
34
+
35
+ Under the hood, Squib uses the `rcairo` [color parser](https://github.com/rcairo/rcairo/blob/master/lib/cairo/color.rb) to accept a variety of color specifications, along with over [300 pre-defined constants](https://github.com/rcairo/rcairo/blob/master/lib/cairo/colors.rb).
36
+
37
+ # Specifying Files
38
+
39
+ All files opened for reading or writing (e.g. for `png` and `xlsx`) are opened relative to the current directory. Files opened for writing (e.g. for `save_png`) will be overwritten without warning.
40
+
41
+ # Custom Layouts
42
+
43
+ Working with x-y coordinates all the time can be tiresome, and ideally everything in a game prototype should be data-driven and easily changed. For this, many Squib methods allow for a `layout` to be set. In essence, layouts are a way of setting default values for any argument given to the command.
44
+
45
+ To use a layout, set the `layout:` option on a `Deck.new` command to point to a YAML file. Any command that allows a `layout` option can be set with a Ruby symbol or String, and the command will then load the specified `x`, `y`, `width`, and `height`. The individual command can also override these options.
46
+
47
+ Note: YAML is very finnicky about having tabs in the file. Use two spaces for indentation instead.
48
+
49
+ Layouts will override Squib's defaults, but are overriden by anything specified in the command itself. Thus, the order of precedence looks like this:
50
+
51
+ * Use what the command specified
52
+ * If anything was not yet specified, use what was given in a layout (if a layout was specified in the command and the file was given to the Deck)
53
+ * If still anything was not yet specified, use what was given in Squib's defaults.
54
+
55
+ Layouts also allow for a special `extends` field that will copy all of the settings from another entry. Only a single level of extends are supported currently (contact the developer if you want multiple levels).
56
+
57
+ See the `use_layout` sample found [here](https://github.com/andymeneely/squib/tree/master/samples/)
58
+
59
+ {include:file:samples/use_layout.rb}
data/Gemfile CHANGED
@@ -1,2 +1,2 @@
1
- source 'https://rubygems.org'
2
- gemspec
1
+ source 'https://rubygems.org'
2
+ gemspec
data/LICENSE.txt CHANGED
@@ -1,22 +1,22 @@
1
- Copyright (c) 2014 Andy Meneely
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ Copyright (c) 2014 Andy Meneely
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -1,55 +1,92 @@
1
- [![Gem Version](https://badge.fury.io/rb/squib.svg)](https://rubygems.org/gems/squib)
2
- [![Build Status](https://secure.travis-ci.org/andymeneely/squib.svg?branch=master)](https://travis-ci.org/andymeneely/squib)
3
- [![Dependency Status](https://gemnasium.com/andymeneely/squib.svg)](https://gemnasium.com/andymeneely/squib)
4
-
5
- # Squib
6
-
7
- Squib is a ruby DSL for prototyping card and board games. Think of it like [nanDeck](http://nandeck.it) done "the Ruby way". Start with some basic commands and generate print-ready PNGs and PDFs.
8
-
9
- Squib is currently pre-release alpha.
10
-
11
- ```ruby
12
- require 'squib'
13
-
14
- Squib::Deck.new(width: 825, height: 1125, cards: 3) do
15
- background color: [1.0,1.0,1.0]
16
- data = xlsx file: 'sample.xlsx'
17
-
18
- rect x: 15, y: 15, width: 795, height: 1095, x_radius: 50, y_radius: 50
19
-
20
- text str: data['name'], x: 250, y: 55, font: 'Arial 54'
21
- text str: data['level'], x: 65, y: 40, font: 'Arial 72'
22
-
23
- png file: 'icon.png', x: 665, y: 30
24
-
25
- save format: :png
26
- end
27
- ```
28
-
29
- ## Installation
30
-
31
- Add this line to your application's Gemfile:
32
-
33
- gem 'squib'
34
-
35
- And then execute:
36
-
37
- $ bundle
38
-
39
- Or install it yourself as:
40
-
41
- $ gem install squib
42
-
43
- Note: Squib is based on the `cairo` and `pango` extensions, which require at least Ruby 2.0
44
-
45
- ## API
46
-
47
- API docs to be written. See the `samples` directory.
48
-
49
- ## Contributing
50
-
51
- 1. Fork it ( https://github.com/[my-github-username]/squib/fork )
52
- 2. Create your feature branch (`git checkout -b my-new-feature`)
53
- 3. Commit your changes (`git commit -am 'Add some feature'`)
54
- 4. Push to the branch (`git push origin my-new-feature`)
55
- 5. Create a new Pull Request
1
+ # Squib [![Gem Version](https://badge.fury.io/rb/squib.svg)](https://rubygems.org/gems/squib) [![Build Status](https://secure.travis-ci.org/andymeneely/squib.svg?branch=master)](https://travis-ci.org/andymeneely/squib) [![Dependency Status](https://gemnasium.com/andymeneely/squib.svg)](https://gemnasium.com/andymeneely/squib) [![Coverage Status](https://img.shields.io/coveralls/andymeneely/squib.svg)](https://coveralls.io/r/andymeneely/squib) [![Inline docs](http://inch-ci.org/github/andymeneely/squib.png?branch=master)](http://inch-ci.org/github/andymeneely/squib)
2
+ Squib is a Ruby [DSL](http://en.wikipedia.org/wiki/Domain-specific_language) for prototyping card and board games. With Squib, you just write a little bit of Ruby and you can compile your game's data and images into a series of images raedy for print-and-play or even print-on-demand. Squib is very data-driven - think of it like [nanDeck](http://www.nand.it/nandeck/) done "the Ruby way". Squib currently supports:
3
+
4
+ * Reading PNGs and SVGs using [Cairo](http://cairographics.org/)
5
+ * Complex text rendering using [Pango](http://www.pango.org/)
6
+ * Reading `.xlsx` files
7
+ * Basic shape drawing
8
+ * Rendering to PNGs and PDFs
9
+ * Unit conversion
10
+ * Specfiying your layouts in a YML file
11
+ * Plus the full power of Ruby!
12
+
13
+ Check this out.
14
+
15
+ ```ruby
16
+ require 'squib'
17
+
18
+ Squib::Deck.new do
19
+ text str: 'Hello, World!'
20
+ save_png
21
+ end
22
+ ```
23
+
24
+ That script just created a deck of with 1 image at 825x1125 with the string "Hello, World" in the upper-left corner.
25
+
26
+ ## Installation
27
+
28
+ Install it yourself with:
29
+
30
+ $ gem install squib
31
+
32
+ If you're using Bundler, add this line to your application's Gemfile:
33
+
34
+ gem 'squib'
35
+
36
+ And then execute:
37
+
38
+ $ bundle
39
+
40
+ 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 can cause headaches on some setups. For Windows users, I *strongly* recommend using the *non-64 bit* RubyInstaller at http://rubyinstaller.org. For Mac, I recommend using [rvm](https://rvm.io).
41
+
42
+ Note: Squib requires Ruby 2.0 or later.
43
+
44
+ ## Getting Started
45
+
46
+ After installing Squib, you can create a project and run your first build like this:
47
+
48
+ ```sh
49
+ $ squib new my-cool-game
50
+ $ cd my-cool-game
51
+ $ ruby deck.rb
52
+ ```
53
+
54
+ The `squib new` command will generate files and folders like this:
55
+
56
+ ```
57
+ _output
58
+ gitkeep.txt
59
+ .gitignore
60
+ ABOUT.md
61
+ config.yml
62
+ deck.rb
63
+ Gemfile
64
+ layout.yml
65
+ PNP NOTES.md
66
+ ```
67
+
68
+ The central file here is `deck.rb`. Here's a basic example of a deck to work from:
69
+
70
+ {include:file:samples/basic.rb basic.rb}
71
+
72
+ ## Learning Squib
73
+
74
+ After going over this README, here are some other places to go learn Squib:
75
+
76
+ * The YARD-generated API documentation [for the latest Squib gem](http://rubydoc.info/gems/squib/) is a method-by-method reference. I recommend starting with the `API` file, and looking at the `Deck` class. If you are following Squib master, see [the latest version](http://rubydoc.info/github/andymeneely/squib/frames)
77
+ * The `samples` directory in the [source repository](https://github.com/andymeneely/squib) has lots of examples
78
+ * Junk Land (link TBD) is my own creation that's uses Squib for both black-and-white print-and-play and full color.
79
+
80
+ ## Development
81
+
82
+ 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).
83
+
84
+ ## Contributing
85
+
86
+ Squib is an open source tool, and I would love participation. If you want your code integrated:
87
+
88
+ 1. Fork it ( https://github.com/[my-github-username]/squib/fork )
89
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
90
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
91
+ 4. Push to the branch (`git push origin my-new-feature`)
92
+ 5. Create a new Pull Request
data/Rakefile CHANGED
@@ -1,6 +1,11 @@
1
- require 'bundler/gem_tasks'
2
- require 'rspec/core/rake_task'
3
-
4
- RSpec::Core::RakeTask.new(:spec)
5
-
6
- task :default => :spec
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+ require 'yard'
4
+
5
+ RSpec::Core::RakeTask.new(:spec)
6
+ task :default => [:install, :spec]
7
+
8
+ YARD::Rake::YardocTask.new(:doc) do |t|
9
+ t.files = ['lib/**/*.rb', 'samples/**/*.rb'] # optional
10
+ #t.options = ['--any', '--extra', '--opts'] # optional
11
+ end
data/bin/squib CHANGED
@@ -1,2 +1,19 @@
1
- #!/usr/bin/env ruby
2
- require 'squib'
1
+ #!/usr/bin/env ruby
2
+ require 'squib'
3
+ require 'mercenary'
4
+
5
+ Mercenary.program(:squib) do |p|
6
+ p.version Squib::VERSION
7
+ p.description "A Ruby DSL for prototyping card games"
8
+ p.syntax "squib <subcommand> [options]"
9
+
10
+ p.command(:new) do |c|
11
+ c.syntax "new PATH"
12
+ c.description "Creates a new Squib project scaffolding in PATH. Must be a new directory or already empty."
13
+
14
+ c.action do |args, options|
15
+ Squib::Commands::New.new.process(args)
16
+ end
17
+ end
18
+
19
+ end
@@ -1,12 +1,17 @@
1
- module Squib
2
- class Deck
3
- #module API
4
-
5
- def background(range: :all, color: '#000000')
6
- range = rangeify(range)
7
- range.each { |i| @cards[i].background(color) }
8
- end
9
-
10
- #end
11
- end
1
+ module Squib
2
+ class Deck
3
+ # Fills the background with the given color
4
+ # @example
5
+ # background color: :white
6
+ #
7
+ # @option range [Enumerable] (:all) the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
8
+ # @option color [String] (:black) the color the font will render to. See {file:API.md#label-Specifying+Colors Specifying Colors}
9
+ # @return [nil] nothing
10
+ # @api public
11
+ def background(opts = {})
12
+ opts = needs(opts,[:range, :color])
13
+ opts[:range].each { |i| @cards[i].background(opts[:color]) }
14
+ end
15
+
16
+ end
12
17
  end
@@ -1,29 +1,52 @@
1
- require 'roo'
2
-
3
- module Squib
4
- class Deck
5
-
6
- def csv(file: 'deck.csv', header: true)
7
- raise 'Not implemented!'
8
- end
9
-
10
- def xlsx(file: 'deck.xlsx', sheet: 0)
11
- s = Roo::Excelx.new(file)
12
- s.default_sheet = s.sheets.first
13
- data = {}
14
- s.first_column.upto(s.last_column) do |col|
15
- header = s.cell(s.first_row,col).to_s
16
- data[header] = []
17
- (s.first_row+1).upto(s.last_row) do |row|
18
- cell = s.cell(row,col)
19
- # Roo hack for avoiding unnecessary .0's on whole integers
20
- cell = s.excelx_value(row,col) if s.excelx_type(row,col) == [:numeric_or_formula, "General"]
21
- data[header] << cell
22
- end#row
23
- end#col
24
- data
25
- end#xlsx
26
-
27
- end
28
- end
29
-
1
+ require 'roo'
2
+
3
+ module Squib
4
+
5
+ # Pulls Excel data from `.xlsx` files into a column-based hash
6
+ #
7
+ # Pulls the data into a Hash of arrays based on the columns. First row is assumed to be the header row.
8
+ # See the example `samples/excel.rb` in the [source repository](https://github.com/andymeneely/squib/tree/master/samples)
9
+ #
10
+ # @example
11
+ # # Excel file looks like this:
12
+ # # | h1 | h2 |
13
+ # # ------------
14
+ # # | 1 | 2 |
15
+ # # | 3 | 4 |
16
+ # data = xlsx file: 'data.xlsx', sheet: 0
17
+ # {'h1' => [1,3], 'h2' => [2,4]}
18
+ #
19
+ # @option opts file [String] the file to open. Must end in `.xlsx`. Opens relative to the current directory.
20
+ # @option opts sheet [Integer] (0) The zero-based index of the sheet from which to read.
21
+ # @return [Hash] a hash of arrays based on columns in the spreadsheet
22
+ # @api public
23
+ def xlsx(opts = {})
24
+ opts = Squib::SYSTEM_DEFAULTS.merge(opts)
25
+ opts = Squib::InputHelpers.fileify(opts)
26
+ s = Roo::Excelx.new(opts[:file])
27
+ s.default_sheet = s.sheets[opts[:sheet]]
28
+ data = {}
29
+ s.first_column.upto(s.last_column) do |col|
30
+ header = s.cell(s.first_row,col).to_s
31
+ data[header] = []
32
+ (s.first_row+1).upto(s.last_row) do |row|
33
+ cell = s.cell(row,col)
34
+ # Roo hack for avoiding unnecessary .0's on whole integers
35
+ cell = s.excelx_value(row,col) if s.excelx_type(row,col) == [:numeric_or_formula, "General"]
36
+ data[header] << cell
37
+ end#row
38
+ end#col
39
+ data
40
+ end#xlsx
41
+ module_function :xlsx
42
+
43
+ class Deck
44
+
45
+ # Convenience call for Squib.xlsx
46
+ def xlsx(opts = {})
47
+ Squib.xlsx(opts)
48
+ end
49
+
50
+ end
51
+ end
52
+
@@ -1,11 +1,49 @@
1
- module Squib
2
- class Deck
3
-
4
- def png(range=:all, file: nil, x: 0, y: 0)
5
- range = rangeify(range)
6
- file = fileify(file)
7
- range.each{ |i| @cards[i].png(file, x, y) }
8
- end
9
-
10
- end
1
+ module Squib
2
+ class Deck
3
+
4
+ # Renders a png file at the given location.
5
+ #
6
+ # See {file:samples/image.rb samples/image.rb} and {file:samples/tgc-overlay.rb samples/tgc-overlay.rb} as examples.
7
+ # Note: scaling not currently supported for PNGs.
8
+ # @example
9
+ # png file: 'img.png', x: 50, y: 50
10
+ #
11
+ # @option opts range [Enumerable, :all] (:all) the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
12
+ # @option opts file [String, Array] ('') file(s) to read in. If it's a single file, then it's use for every card in range. If the parameter is an Array of files, then each file is looked up for each card. See {file:API.md#Specifying+Files Specifying Files}
13
+ # @option opts x [Integer] (0) the x-coordinate to place
14
+ # @option opts y [Integer] (0) the y-coordinate to place
15
+ # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:API.md#label-Custom+Layouts Custom Layouts}
16
+ # @option opts alpha [Decimal] (1.0) the alpha-transparency percentage used to blend this image
17
+ # @return [nil] Returns nil
18
+ # @api public
19
+ def png(opts = {})
20
+ opts = needs(opts, [:range, :files, :x, :y, :alpha, :layout])
21
+ opts[:range].each do |i|
22
+ @cards[i].png(opts[:file][i], opts[:x], opts[:y], opts[:alpha])
23
+ end
24
+ end
25
+
26
+ # Renders an entire svg file at the given location. Uses the SVG-specified units and DPI to determine the pixel width and height.
27
+ #
28
+ # See {file:samples/load-images.rb samples/load-images.rb} and {file:samples/tgc-overlay.rb samples/tgc-overlay.rb} as examples.
29
+ # @example
30
+ # svg 1..2, 'icon.svg', '#stone', x: 50, y:50
31
+ #
32
+ # @option opts range [Enumerable, :all] (:all) the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
33
+ # @option opts file [String, Array] ('') file(s) to read in. If it's a single file, then it's use for every card in range. If the parameter is an Array of files, then each file is looked up for each card. See {file:API.md#Specifying+Files Specifying Files}
34
+ # @option opts x [Integer] (0) the x-coordinate to place
35
+ # @option opts y [Integer] (0) the y-coordinate to place
36
+ # @option opts width [Integer] (:native) the pixel width that the image should scale to. SVG scaling is done with vectors, so the scaling should be smooth. When set to `:native`, uses the DPI and units of the loaded SVG document.
37
+ # @option opts height [Integer] (:native) the pixel width that the image should scale to. SVG scaling is done with vectors, so the scaling should be smooth. When set to `:native`, uses the DPI and units of the loaded SVG document.
38
+ # @option opts layout [String, Symbol] (nil) entry in the layout to use as defaults for this command. See {file:API.md#label-Custom+Layouts Custom Layouts}
39
+ # @return [nil] Returns nil
40
+ # @api public
41
+ def svg(opts = {})
42
+ p = needs(opts,[:range, :files, :svgid, :x, :y, :width, :height, :layout])
43
+ p[:range].each do |i|
44
+ @cards[i].svg(p[:file][i], p[:id], p[:x], p[:y], p[:width], p[:height])
45
+ end
46
+ end
47
+
48
+ end
11
49
  end
@@ -1,16 +1,37 @@
1
- module Squib
2
- class Deck
3
-
4
- def save(range: :all, dir: "_output", format: :png, prefix: "card_")
5
- format = [format].flatten
6
- save_png(range: range, dir: dir, prefix: prefix) if format.include? :png
7
- save_pdf if format.include? :pdf
8
- end
9
-
10
- def save_png(range: :all, dir: "_output", prefix: 'card_')
11
- range = rangeify(range)
12
- range.each { |i| @cards[i].save_png(i, dir, prefix) }
13
- end
14
-
15
- end
1
+ module Squib
2
+ class Deck
3
+
4
+ # Saves the given range of cards to either PNG or PDF
5
+ #
6
+ # @option opts [Enumerable] range (:all) the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
7
+ # @option opts [String] dir (_output) the directory for the output to be sent to. Will be created if it doesn't exist.
8
+ # @option opts [Symbol] format (:png) the format that this will be rendered too. Options `:pdf, :png`. Array of both is allowed: `[:pdf, :png]`
9
+ # @option opts [String] prefix (card_) the prefix of the file name to be printed
10
+ # @return self
11
+ # @api public
12
+ def save(opts = {})
13
+ opts = needs(opts, [:range, :creatable_dir, :formats, :prefix])
14
+ save_png(opts) if opts[:format].include? :png
15
+ save_pdf(opts) if opts[:format].include? :pdf
16
+ self
17
+ end
18
+
19
+ # Saves the given range of cards to a PNG
20
+ #
21
+ # @example
22
+ # save range: 1..8, dir: '_pnp', prefix: 'bw_'
23
+ #
24
+ # @option opts [Enumerable] range (:all) the range of cards over which this will be rendered. See {file:API.md#label-Specifying+Ranges Specifying Ranges}
25
+ # @option opts [String] dir (_output) the directory for the output to be sent to. Will be created if it doesn't exist.
26
+ # @option opts [String] prefix (card_) the prefix of the file name to be printed.
27
+ # @return [nil] Returns nothing
28
+ # @api public
29
+ def save_png(opts = {})
30
+ opts = needs(opts,[:range, :creatable_dir, :prefix])
31
+ opts[:range].each do |i|
32
+ @cards[i].save_png(i, opts[:dir], opts[:prefix])
33
+ end
34
+ end
35
+
36
+ end
16
37
  end