barby 0.6.2 → 0.6.3
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.
- checksums.yaml +4 -4
- data/README.md +107 -0
- data/lib/barby/barcode/bookland.rb +0 -1
- data/lib/barby/barcode/code_128.rb +11 -2
- data/lib/barby/barcode/code_25.rb +6 -3
- data/lib/barby/barcode/code_25_interleaved.rb +2 -2
- data/lib/barby/barcode/code_39.rb +2 -1
- data/lib/barby/barcode/data_matrix.rb +1 -1
- data/lib/barby/barcode/ean_13.rb +1 -1
- data/lib/barby/barcode/gs1_128.rb +5 -1
- data/lib/barby/barcode/qr_code.rb +1 -0
- data/lib/barby/outputter/cairo_outputter.rb +5 -0
- data/lib/barby/outputter/png_outputter.rb +5 -1
- data/lib/barby/outputter/prawn_outputter.rb +6 -1
- data/lib/barby/outputter/rmagick_outputter.rb +11 -6
- data/lib/barby/outputter/svg_outputter.rb +5 -0
- data/lib/barby/version.rb +1 -1
- metadata +6 -15
- data/README +0 -93
- data/lib/barby/outputter/point_matrix.rb +0 -211
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8062a4f8a077022c7b52a7fc23d73886bbdf9e96
|
4
|
+
data.tar.gz: 80ab18bc484c11d6044b5c7aa683dc65f316b359
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e99ce1411282a91273107da8b5ef1963baaa7b04c107132c33dedb463669d77172968dfc6d357c480ce633b7db79c24f62f49ff91de8bf9a9192d428c099c5b2
|
7
|
+
data.tar.gz: 0ff28cc5b9eac5a16bfe2eacde4b3dcd275d57840e28d3aeecdc3cf8d4a9189e97ed53efb5d2aa00676af355560016fdc9e211fab06db963a5f0af3868654c49
|
data/README.md
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# Barby
|
2
|
+
Barby is a Ruby library that generates barcodes in a variety of symbologies.
|
3
|
+
|
4
|
+
Its functionality is split into _barcode_ and "_outputter_" objects:
|
5
|
+
* [`Barby::Barcode` objects] [symbologies] turn data into a binary representation for a given symbology.
|
6
|
+
* [`Barby::Outputter`] [outputters] then takes this representation and turns it into images, PDF, etc.
|
7
|
+
|
8
|
+
You can easily add a symbology without having to worry about graphical
|
9
|
+
representation. If it can be represented as the usual 1D or 2D matrix of
|
10
|
+
lines or squares, outputters will do that for you.
|
11
|
+
|
12
|
+
Likewise, you can easily add an outputter for a format that doesn't have one
|
13
|
+
yet, and it will work with all existing symbologies.
|
14
|
+
|
15
|
+
For more information, check out [the Barby wiki] [wiki].
|
16
|
+
|
17
|
+
### New require policy
|
18
|
+
|
19
|
+
Barcode symbologies are no longer required automatically, so you'll have to
|
20
|
+
require the ones you need.
|
21
|
+
|
22
|
+
If you need EAN-13, `require 'barby/barcode/ean_13'`. Full list of symbologies and filenames below.
|
23
|
+
|
24
|
+
## Example
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'barby'
|
28
|
+
require 'barby/barcode/code_128'
|
29
|
+
require 'barby/outputter/ascii_outputter'
|
30
|
+
|
31
|
+
barcode = Barby::Code128B.new('BARBY')
|
32
|
+
|
33
|
+
puts barcode.to_ascii #Implicitly uses the AsciiOutputter
|
34
|
+
|
35
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
36
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
37
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
38
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
39
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
40
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
41
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
42
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
43
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
44
|
+
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
45
|
+
B A R B Y
|
46
|
+
```
|
47
|
+
|
48
|
+
## Supported symbologies
|
49
|
+
|
50
|
+
```ruby
|
51
|
+
require 'barby/barcode/<filename>'
|
52
|
+
```
|
53
|
+
|
54
|
+
| Name | Filename | Dependencies |
|
55
|
+
| ----------------------------------- | --------------------- | ------------- |
|
56
|
+
| Code 25 | `code_25` | ─ |
|
57
|
+
| ├─ Interleaved | `code_25_interleaved` | ─ |
|
58
|
+
| └─ IATA | `code_25_iata` | ─ |
|
59
|
+
| Code 39 | `code_39` | ─ |
|
60
|
+
| └─ Extended | `code_39` | ─ |
|
61
|
+
| Code 93 | `code_93` | ─ |
|
62
|
+
| Code 128 (A, B, and C) | `code_128` | ─ |
|
63
|
+
| └─ GS1 128 | `gs1_128` | ─ |
|
64
|
+
| EAN-13 | `ean_13` | ─ |
|
65
|
+
| ├─ Bookland | `bookland` | ─ |
|
66
|
+
| └─ UPC-A | `ean_13` | ─ |
|
67
|
+
| EAN-8 | `ean_8` | ─ |
|
68
|
+
| UPC/EAN supplemental, 2 & 5 digits | `upc_supplemental` | ─ |
|
69
|
+
| QR Code | `qr_code` | `rqrcode` |
|
70
|
+
| DataMatrix (Semacode) | `data_matrix` | `semacode` |
|
71
|
+
| PDF417 | `pdf_417` | JRuby |
|
72
|
+
|
73
|
+
|
74
|
+
## Outputters
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
require 'barby/outputter/<filename>_outputter'
|
78
|
+
```
|
79
|
+
|
80
|
+
| filename | dependencies |
|
81
|
+
| ----------- | ------------- |
|
82
|
+
| `ascii` | ─ |
|
83
|
+
| `cairo` | cairo |
|
84
|
+
| `html` | ─ |
|
85
|
+
| `pdfwriter` | ─ |
|
86
|
+
| `png` | chunky_png |
|
87
|
+
| `prawn` | prawn |
|
88
|
+
| `rmagick` | rmagick |
|
89
|
+
| `svg` | ─ |
|
90
|
+
|
91
|
+
### Formats supported by outputters
|
92
|
+
|
93
|
+
* Text (mostly for testing)
|
94
|
+
* PNG, JPEG, GIF
|
95
|
+
* PS, EPS
|
96
|
+
* SVG
|
97
|
+
* PDF
|
98
|
+
* HTML
|
99
|
+
|
100
|
+
---
|
101
|
+
|
102
|
+
For more information, check out [the Barby wiki] [wiki].
|
103
|
+
|
104
|
+
|
105
|
+
[wiki]: https://github.com/toretore/barby/wiki
|
106
|
+
[symbologies]: https://github.com/toretore/barby/wiki/Symbologies
|
107
|
+
[outputters]: https://github.com/toretore/barby/wiki/Outputters
|
@@ -18,6 +18,14 @@ module Barby
|
|
18
18
|
#As an example, here's one that starts out as type A and then switches to B and then C:
|
19
19
|
#
|
20
20
|
# Code128A.new("ABC123\306def\3074567")
|
21
|
+
#
|
22
|
+
#
|
23
|
+
#GS1-128/EAN-128/UCC-128
|
24
|
+
#
|
25
|
+
#To make a GS1-128 code, prefix the data with FNC1 and the Application Identifier:
|
26
|
+
#
|
27
|
+
# #AI=00, data=12345
|
28
|
+
# Code128.new("#{Code128::FNC1}0012345")
|
21
29
|
class Code128 < Barcode1D
|
22
30
|
|
23
31
|
FNC1 = "\xc1"
|
@@ -175,7 +183,7 @@ module Barby
|
|
175
183
|
|
176
184
|
|
177
185
|
def type=(type)
|
178
|
-
type.upcase
|
186
|
+
type = type.upcase
|
179
187
|
raise ArgumentError, 'type must be A, B or C' unless type =~ /^[ABC]$/
|
180
188
|
@type = type
|
181
189
|
end
|
@@ -230,7 +238,8 @@ module Barby
|
|
230
238
|
#there are no more extras, the barcode ends with that object.
|
231
239
|
#Most barcodes probably don't change charsets and don't have extras.
|
232
240
|
def extra
|
233
|
-
@extra
|
241
|
+
return @extra if defined?(@extra)
|
242
|
+
@extra = nil
|
234
243
|
end
|
235
244
|
|
236
245
|
#Set the extra for this barcode. The argument is a string starting with the
|
@@ -28,11 +28,14 @@ module Barby
|
|
28
28
|
9 => [N,W,N,W,N]
|
29
29
|
}
|
30
30
|
|
31
|
-
attr_accessor :
|
31
|
+
attr_accessor :include_checksum
|
32
|
+
attr_writer :narrow_width, :wide_width, :space_width
|
33
|
+
attr_reader :data
|
34
|
+
|
32
35
|
|
33
|
-
|
34
36
|
def initialize(data)
|
35
37
|
self.data = data
|
38
|
+
@narrow_width, @wide_width, @space_width = nil
|
36
39
|
end
|
37
40
|
|
38
41
|
|
@@ -105,7 +108,7 @@ module Barby
|
|
105
108
|
#Mod10
|
106
109
|
def checksum
|
107
110
|
evens, odds = even_and_odd_digits
|
108
|
-
sum = odds.inject(0){|
|
111
|
+
sum = odds.inject(0){|s,d| s + d } + evens.inject(0){|s,d| s + (d*3) }
|
109
112
|
sum %= 10
|
110
113
|
sum.zero? ? 0 : 10-sum
|
111
114
|
end
|
@@ -87,7 +87,8 @@ module Barby
|
|
87
87
|
START_ENCODING = [N,W,N,N,W,N,W,N,N] # *
|
88
88
|
STOP_ENCODING = [N,W,N,N,W,N,W,N,N] # *
|
89
89
|
|
90
|
-
attr_accessor :data, :
|
90
|
+
attr_accessor :data, :extended, :include_checksum
|
91
|
+
attr_writer :spacing, :narrow_width, :wide_width
|
91
92
|
|
92
93
|
# Do not surround "data" with the mandatory "*" as is this is done automically for you.
|
93
94
|
# So instead of passing "*123456*" as "data", just pass "123456".
|
data/lib/barby/barcode/ean_13.rb
CHANGED
@@ -3,18 +3,22 @@ require 'barby/barcode/code_128'
|
|
3
3
|
module Barby
|
4
4
|
|
5
5
|
|
6
|
+
#DEPRECATED - Use the Code128 class directly instead:
|
7
|
+
#
|
8
|
+
# Code128.new("#{Code128::FNC1}#{application_identifier}#{data}")
|
9
|
+
#
|
6
10
|
#AKA EAN-128, UCC-128
|
7
11
|
class GS1128 < Code128
|
8
12
|
|
9
13
|
attr_accessor :application_identifier
|
10
14
|
|
11
15
|
def initialize(data, type, ai)
|
16
|
+
warn "DEPRECATED: The GS1128 class has been deprecated, use Code128 directly instead (called from #{caller[0]})"
|
12
17
|
self.application_identifier = ai
|
13
18
|
super(data, type)
|
14
19
|
end
|
15
20
|
|
16
21
|
|
17
|
-
#TODO: Not sure this is entirely right
|
18
22
|
def data
|
19
23
|
FNC1+application_identifier+super
|
20
24
|
end
|
@@ -23,6 +23,11 @@ module Barby
|
|
23
23
|
attr_writer :x, :y, :xdim, :height, :margin
|
24
24
|
|
25
25
|
|
26
|
+
def initialize(*)
|
27
|
+
super
|
28
|
+
@x, @y, @xdim, @height, @margin = nil
|
29
|
+
end
|
30
|
+
|
26
31
|
#Render the barcode onto a Cairo context
|
27
32
|
def render_to_cairo_context(context, options={})
|
28
33
|
if context.respond_to?(:have_current_point?) and
|
@@ -10,8 +10,12 @@ module Barby
|
|
10
10
|
|
11
11
|
register :to_png, :to_image, :to_datastream
|
12
12
|
|
13
|
-
|
13
|
+
attr_writer :xdim, :ydim, :width, :height, :margin
|
14
14
|
|
15
|
+
def initialize(*)
|
16
|
+
super
|
17
|
+
@xdim, @height, @margin = nil
|
18
|
+
end
|
15
19
|
|
16
20
|
#Creates a PNG::Canvas object and renders the barcode on it
|
17
21
|
def to_image(opts={})
|
@@ -7,9 +7,14 @@ module Barby
|
|
7
7
|
|
8
8
|
register :to_pdf, :annotate_pdf
|
9
9
|
|
10
|
-
|
10
|
+
attr_writer :xdim, :ydim, :x, :y, :height, :margin, :unbleed
|
11
11
|
|
12
12
|
|
13
|
+
def initialize(*)
|
14
|
+
super
|
15
|
+
@xdim, @ydim, @x, @y, @height, @margin, @unbleed = nil
|
16
|
+
end
|
17
|
+
|
13
18
|
def to_pdf(opts={})
|
14
19
|
doc_opts = opts.delete(:document) || {}
|
15
20
|
doc_opts[:page_size] ||= 'A4'
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'barby/outputter'
|
2
|
-
require '
|
2
|
+
require 'rmagick'
|
3
3
|
|
4
4
|
module Barby
|
5
5
|
|
@@ -8,11 +8,16 @@ module Barby
|
|
8
8
|
#
|
9
9
|
#Registers the to_png, to_gif, to_jpg and to_image methods
|
10
10
|
class RmagickOutputter < Outputter
|
11
|
-
|
11
|
+
|
12
12
|
register :to_png, :to_gif, :to_jpg, :to_image
|
13
13
|
|
14
|
-
|
14
|
+
attr_writer :height, :xdim, :ydim, :margin
|
15
|
+
|
15
16
|
|
17
|
+
def initialize(*)
|
18
|
+
super
|
19
|
+
@height, @xdim, @ydim, @margin = nil
|
20
|
+
end
|
16
21
|
|
17
22
|
#Returns a string containing a PNG image
|
18
23
|
def to_png(*a)
|
@@ -28,15 +33,15 @@ module Barby
|
|
28
33
|
def to_jpg(*a)
|
29
34
|
to_blob('jpg', *a)
|
30
35
|
end
|
31
|
-
|
36
|
+
|
32
37
|
def to_blob(format, *a)
|
33
38
|
img = to_image(*a)
|
34
39
|
blob = img.to_blob{|i| i.format = format }
|
35
|
-
|
40
|
+
|
36
41
|
#Release the memory used by RMagick explicitly. Ruby's GC
|
37
42
|
#isn't aware of it and can't clean it up automatically
|
38
43
|
img.destroy! if img.respond_to?(:destroy!)
|
39
|
-
|
44
|
+
|
40
45
|
blob
|
41
46
|
end
|
42
47
|
|
@@ -22,6 +22,11 @@ module Barby
|
|
22
22
|
attr_writer :title, :xdim, :ydim, :height, :rmargin, :lmargin, :tmargin, :bmargin, :xmargin, :ymargin, :margin
|
23
23
|
|
24
24
|
|
25
|
+
def initialize(*)
|
26
|
+
super
|
27
|
+
@title, @xdim, @ydim, @height, @rmargin, @lmargin, @tmargin, @bmargin, @xmargin, @ymargin, @margin = nil
|
28
|
+
end
|
29
|
+
|
25
30
|
def to_svg(opts={})
|
26
31
|
with_options opts do
|
27
32
|
case opts[:use]
|
data/lib/barby/version.rb
CHANGED
metadata
CHANGED
@@ -1,25 +1,25 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: barby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tore Darell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Barby creates barcodes.
|
14
14
|
email: toredarell@gmail.com
|
15
15
|
executables: []
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files:
|
18
|
-
- README
|
18
|
+
- README.md
|
19
19
|
files:
|
20
20
|
- CHANGELOG
|
21
21
|
- LICENSE
|
22
|
-
- README
|
22
|
+
- README.md
|
23
23
|
- bin/barby
|
24
24
|
- lib/barby.rb
|
25
25
|
- lib/barby/barcode.rb
|
@@ -43,7 +43,6 @@ files:
|
|
43
43
|
- lib/barby/outputter/html_outputter.rb
|
44
44
|
- lib/barby/outputter/pdfwriter_outputter.rb
|
45
45
|
- lib/barby/outputter/png_outputter.rb
|
46
|
-
- lib/barby/outputter/point_matrix.rb
|
47
46
|
- lib/barby/outputter/prawn_outputter.rb
|
48
47
|
- lib/barby/outputter/rmagick_outputter.rb
|
49
48
|
- lib/barby/outputter/svg_outputter.rb
|
@@ -54,15 +53,7 @@ files:
|
|
54
53
|
homepage: http://toretore.github.com/barby
|
55
54
|
licenses: []
|
56
55
|
metadata: {}
|
57
|
-
post_install_message:
|
58
|
-
|
59
|
-
*** NEW REQUIRE POLICY ***"
|
60
|
-
Barby no longer require all barcode symbologies by default. You'll have
|
61
|
-
to require the ones you need. For example, if you need EAN-13,
|
62
|
-
require 'barby/barcode/ean_13'; For a full list of symbologies and their
|
63
|
-
filenames, see README.
|
64
|
-
***
|
65
|
-
|
56
|
+
post_install_message:
|
66
57
|
rdoc_options: []
|
67
58
|
require_paths:
|
68
59
|
- lib
|
@@ -78,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
69
|
version: '0'
|
79
70
|
requirements: []
|
80
71
|
rubyforge_project: barby
|
81
|
-
rubygems_version: 2.
|
72
|
+
rubygems_version: 2.5.1
|
82
73
|
signing_key:
|
83
74
|
specification_version: 4
|
84
75
|
summary: The Ruby barcode generator
|
data/README
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
*** NEW REQUIRE POLICY ***
|
2
|
-
|
3
|
-
Barcode symbologies are no longer requires automatically, so you'll have to
|
4
|
-
require the ones you need. If you need EAN-13, require 'barby/barcode/ean_13'.
|
5
|
-
Full list of symbologies and filenames below.
|
6
|
-
|
7
|
-
***
|
8
|
-
|
9
|
-
For more information, check out the Barby wiki at https://github.com/toretore/barby/wiki
|
10
|
-
|
11
|
-
Barby is a Ruby library that generates barcodes in a variety of symbologies.
|
12
|
-
Its functionality is split into barcode and "outputter" objects. Barcode
|
13
|
-
objects turn data into a binary representation for a given symbology.
|
14
|
-
Outputters then take this representation and turns it into images, PDF, etc.
|
15
|
-
|
16
|
-
You can easily add a symbology without having to worry about graphical
|
17
|
-
representation. If it can be represented as the usual 1D or 2D matrix of
|
18
|
-
lines or squares, outputters will do that for you.
|
19
|
-
|
20
|
-
Likewise, you can easily add an outputter for a format that doesn't have one
|
21
|
-
yet, and it will work with all existing symbologies.
|
22
|
-
|
23
|
-
See Barby::Barcode and Barby::Outputter for more information.
|
24
|
-
|
25
|
-
require 'barby'
|
26
|
-
require 'barby/barcode/code_128'
|
27
|
-
require 'barby/outputter/ascii_outputter'
|
28
|
-
|
29
|
-
barcode = Barby::Code128B.new('BARBY')
|
30
|
-
|
31
|
-
puts barcode.to_ascii #Implicitly uses the AsciiOutputter
|
32
|
-
|
33
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
34
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
35
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
36
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
37
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
38
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
39
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
40
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
41
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
42
|
-
## # # # # ## # # ## ## # ### # # ## ### ## # ## ### ### ## ### # ##
|
43
|
-
B A R B Y
|
44
|
-
|
45
|
-
|
46
|
-
Supported symbologies:
|
47
|
-
|
48
|
-
Name - filename - dependencies
|
49
|
-
|
50
|
-
require 'barby/barcode/<filename>'
|
51
|
-
|
52
|
-
* Code 25 - code_25
|
53
|
-
* Interleaved - code_25_interleaved
|
54
|
-
* IATA - code_25_iata
|
55
|
-
* Code 39 - code_39
|
56
|
-
* Code 93 - code_93
|
57
|
-
* Code 128 - code_128
|
58
|
-
* GS1 128 - gs1_128
|
59
|
-
* EAN-13 - ean_13
|
60
|
-
* Bookland - bookland
|
61
|
-
* UPC-A - ean_13
|
62
|
-
* EAN-8 - ean_8
|
63
|
-
* UPC/EAN supplemental, 2 & 5 digits - upc_supplemental
|
64
|
-
|
65
|
-
* QR Code - qr_code - rqrcode
|
66
|
-
* DataMatrix (Semacode) - data_matrix - semacode
|
67
|
-
* PDF417 - pdf_417 - java (JRuby)
|
68
|
-
|
69
|
-
|
70
|
-
Formats supported by outputters:
|
71
|
-
|
72
|
-
* Text (mostly for testing)
|
73
|
-
* PNG, JPEG, GIF
|
74
|
-
* PS, EPS
|
75
|
-
* SVG
|
76
|
-
* PDF
|
77
|
-
* HTML
|
78
|
-
|
79
|
-
|
80
|
-
Outputters:
|
81
|
-
|
82
|
-
filename (dependencies)
|
83
|
-
|
84
|
-
require 'barby/outputter/<filename>_outputter'
|
85
|
-
|
86
|
-
* ascii
|
87
|
-
* cairo (cairo)
|
88
|
-
* html
|
89
|
-
* pdfwriter
|
90
|
-
* png (chunky_png)
|
91
|
-
* prawn (prawn)
|
92
|
-
* rmagick (RMagick)
|
93
|
-
* svg
|
@@ -1,211 +0,0 @@
|
|
1
|
-
require 'barby/outputter'
|
2
|
-
|
3
|
-
module Barby
|
4
|
-
|
5
|
-
class Outputter
|
6
|
-
|
7
|
-
|
8
|
-
#A collection of rows - an array of arrays
|
9
|
-
class PointMatrix < Array
|
10
|
-
|
11
|
-
DEFAULT_XDIM = 1.0
|
12
|
-
DEFAULT_YDIM = 1.0
|
13
|
-
|
14
|
-
attr_writer :xdim, :ydim
|
15
|
-
|
16
|
-
|
17
|
-
def initialize(*a, &b)
|
18
|
-
# new([[t,f,t,f], [f,t,f,t], ...])
|
19
|
-
if a[0].is_a?(Array) && a[0][0].is_a?(Array) && [true,false].include?(a[0][0][0])
|
20
|
-
a[0] = a[0].map{|r| PointRow.new(self, r) }
|
21
|
-
# new(['1010', '0101', ...])
|
22
|
-
elsif a[0].is_a?(Array) && a[0][0].is_a?(String)
|
23
|
-
a[0] = a[0].map{|s| PointRow.new(self, s) }
|
24
|
-
end
|
25
|
-
|
26
|
-
super(*a, &b)
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
def xdim
|
31
|
-
@xdim || DEFAULT_XDIM
|
32
|
-
end
|
33
|
-
|
34
|
-
def ydim
|
35
|
-
@ydim || DEFAULT_YDIM
|
36
|
-
end
|
37
|
-
|
38
|
-
|
39
|
-
def width
|
40
|
-
inject(0){|m,r| r.width > m ? r.width : m }
|
41
|
-
end
|
42
|
-
|
43
|
-
def height
|
44
|
-
inject(0){|s,r| s + r.height }
|
45
|
-
end
|
46
|
-
|
47
|
-
|
48
|
-
def to_s
|
49
|
-
map{|r| r.to_s }
|
50
|
-
end
|
51
|
-
|
52
|
-
def inspect
|
53
|
-
to_s
|
54
|
-
end
|
55
|
-
|
56
|
-
|
57
|
-
def dup
|
58
|
-
self.class.new(map{|r| r.dup })
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
|
65
|
-
class PointRow < Array
|
66
|
-
|
67
|
-
attr_reader :matrix
|
68
|
-
attr_accessor :xdim, :ydim
|
69
|
-
|
70
|
-
|
71
|
-
def initialize(*a, &b)
|
72
|
-
raise ArgumentError, 'PointRow must belong to a PointMatrix' unless a[0].is_a?(PointMatrix)
|
73
|
-
@matrix = a.shift
|
74
|
-
|
75
|
-
#Assume called with [t,f,t,f,..]
|
76
|
-
if a[0].is_a?(Array) && [true, false].include?(a[0][0])
|
77
|
-
a[0] = a[0].map{|b| Point.new(self, b) }
|
78
|
-
#Assume called with '1010..'
|
79
|
-
elsif a[0].is_a?(String)
|
80
|
-
a[0] = a[0].split(//).map{|s| Point.new(self, s == '1') }
|
81
|
-
end
|
82
|
-
|
83
|
-
super(*a, &b)
|
84
|
-
end
|
85
|
-
|
86
|
-
|
87
|
-
def booleans
|
88
|
-
map{|p| p.active? }
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
|
-
def xdim
|
93
|
-
@xdim || matrix.xdim
|
94
|
-
end
|
95
|
-
|
96
|
-
def ydim
|
97
|
-
@ydim || matrix.ydim
|
98
|
-
end
|
99
|
-
|
100
|
-
|
101
|
-
def width
|
102
|
-
inject(0){|s,p| s + p.width }
|
103
|
-
end
|
104
|
-
|
105
|
-
def height
|
106
|
-
inject(0){|m,p| p.height > m ? p.height : m }
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
|
-
def to_s
|
111
|
-
inject(''){|s,p| s << (p.active ? '1' : '0') }
|
112
|
-
end
|
113
|
-
|
114
|
-
def inspect
|
115
|
-
to_s
|
116
|
-
end
|
117
|
-
|
118
|
-
def ==(other)
|
119
|
-
super #Just to say explicitly that equality should behave like in an array
|
120
|
-
end
|
121
|
-
|
122
|
-
|
123
|
-
def dup
|
124
|
-
self.class.new(matrix, map{|p| p.dup })
|
125
|
-
end
|
126
|
-
|
127
|
-
end
|
128
|
-
|
129
|
-
|
130
|
-
class Point
|
131
|
-
|
132
|
-
attr_reader :row, :active
|
133
|
-
attr_writer :width, :height, :color, :active
|
134
|
-
alias active? active
|
135
|
-
|
136
|
-
|
137
|
-
def initialize(row, active, opts={})
|
138
|
-
@row = row
|
139
|
-
self.active = active
|
140
|
-
end
|
141
|
-
|
142
|
-
|
143
|
-
def color
|
144
|
-
@color || (active ? Color.new(0,0,0) : nil)
|
145
|
-
end
|
146
|
-
|
147
|
-
def width
|
148
|
-
@width || row.xdim
|
149
|
-
end
|
150
|
-
|
151
|
-
def height
|
152
|
-
@height || row.ydim
|
153
|
-
end
|
154
|
-
|
155
|
-
|
156
|
-
def ==(other)
|
157
|
-
active == other.active &&
|
158
|
-
width == other.width &&
|
159
|
-
height == other.height &&
|
160
|
-
color == other.color
|
161
|
-
end
|
162
|
-
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
|
167
|
-
#TODO Add alpha
|
168
|
-
class Color
|
169
|
-
|
170
|
-
MIN_VALUE = 0
|
171
|
-
MAX_VALUE = 255
|
172
|
-
|
173
|
-
attr_reader :red, :blue, :green
|
174
|
-
|
175
|
-
def initialize(r, b, g)
|
176
|
-
self.red, self.blue, self.green = r, b, g
|
177
|
-
end
|
178
|
-
|
179
|
-
|
180
|
-
def red=(r)
|
181
|
-
set_color(:red, r)
|
182
|
-
end
|
183
|
-
|
184
|
-
def blue=(b)
|
185
|
-
set_color(:blue, b)
|
186
|
-
end
|
187
|
-
|
188
|
-
def green=(g)
|
189
|
-
set_color(:green, g)
|
190
|
-
end
|
191
|
-
|
192
|
-
|
193
|
-
def ==(other)
|
194
|
-
other.red == red && other.blue == blue && other.green == green
|
195
|
-
end
|
196
|
-
|
197
|
-
|
198
|
-
private
|
199
|
-
|
200
|
-
def set_color(name, value)
|
201
|
-
raise ArgumentError, "Value must be between 0-255" if value < MIN_VALUE || value > MAX_VALUE
|
202
|
-
instance_variable_set("@#{name}", value)
|
203
|
-
end
|
204
|
-
|
205
|
-
|
206
|
-
end
|
207
|
-
|
208
|
-
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|