barby 0.5.0 → 0.5.1
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.
- data/CHANGELOG +9 -0
- data/README +2 -0
- data/lib/barby/barcode/bookland.rb +1 -0
- data/lib/barby/barcode/code_128.rb +3 -0
- data/lib/barby/barcode/code_39.rb +1 -0
- data/lib/barby/barcode/code_93.rb +1 -0
- data/lib/barby/barcode/data_matrix.rb +1 -1
- data/lib/barby/outputter.rb +2 -2
- data/lib/barby/outputter/html_outputter.rb +71 -66
- data/lib/barby/outputter/point_matrix.rb +211 -0
- data/lib/barby/version.rb +1 -1
- metadata +35 -33
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
* 0.5.1
|
2
|
+
|
3
|
+
* Fix some encoding issues (ruby 2.0 & 1.9)
|
4
|
+
* Rewrite HtmlOutputter. Not entirely backwards compatible with the previous version.
|
5
|
+
|
6
|
+
* 0.5.0
|
7
|
+
|
8
|
+
* Require requirement of barcode symbologies in the same way outputters must be required before being used
|
9
|
+
|
1
10
|
* 0.4.4
|
2
11
|
|
3
12
|
* Use Gemfile for dependency management [Ken Collins]
|
data/README
CHANGED
@@ -6,6 +6,8 @@ Full list of symbologies and filenames below.
|
|
6
6
|
|
7
7
|
***
|
8
8
|
|
9
|
+
For more information, check out the Barby wiki at https://github.com/toretore/barby/wiki
|
10
|
+
|
9
11
|
Barby is a Ruby library that generates barcodes in a variety of symbologies.
|
10
12
|
Its functionality is split into barcode and "outputter" objects. Barcode
|
11
13
|
objects turn data into a binary representation for a given symbology.
|
@@ -1,3 +1,4 @@
|
|
1
|
+
#encoding: ASCII
|
1
2
|
require 'barby/barcode'
|
2
3
|
|
3
4
|
module Barby
|
@@ -242,6 +243,8 @@ module Barby
|
|
242
243
|
count = 0
|
243
244
|
while count < chars.size
|
244
245
|
if chars[count] =~ /^\d$/
|
246
|
+
#If encountering a digit, next char/byte *must* be second digit in pair. I.e. if chars[count] is 5,
|
247
|
+
#chars[count+1] must be /[0-9]/, otherwise it's not valid
|
245
248
|
result << "#{chars[count]}#{chars[count+1]}"
|
246
249
|
count += 2
|
247
250
|
else
|
data/lib/barby/outputter.rb
CHANGED
@@ -58,8 +58,6 @@ module Barby
|
|
58
58
|
end
|
59
59
|
|
60
60
|
|
61
|
-
private
|
62
|
-
|
63
61
|
def two_dimensional?
|
64
62
|
barcode.respond_to?(:two_dimensional?) && barcode.two_dimensional?
|
65
63
|
end
|
@@ -107,6 +105,8 @@ module Barby
|
|
107
105
|
end
|
108
106
|
|
109
107
|
|
108
|
+
private
|
109
|
+
|
110
110
|
#Takes a hash and temporarily sets properties on self (the outputter object)
|
111
111
|
#corresponding with the keys to their values. When the block exits, the
|
112
112
|
#properties are reset to their original values. Returns whatever the block returns.
|
@@ -2,87 +2,92 @@ require 'barby/outputter'
|
|
2
2
|
|
3
3
|
module Barby
|
4
4
|
|
5
|
-
# Outputs an HTML
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
5
|
+
# Outputs an HTML <table> containing cells for each module in the barcode.
|
6
|
+
#
|
7
|
+
# This does NOT include any styling, you're expected to add the relevant
|
8
|
+
# CSS yourself. The markup is simple: One <table> with class 'barby-barcode',
|
9
|
+
# one or more <tr class="barby-row"> inside a <tbody> each containing
|
10
|
+
# <td class="barby-cell"> for each module with the additional class "on" or "off".
|
11
|
+
#
|
12
|
+
# Example, let's say the barcode.encoding == ['101', '010'] :
|
13
|
+
#
|
14
|
+
# <table class="barby-barcode">
|
15
|
+
# <tbody>
|
16
|
+
# <tr class="barby-row">
|
17
|
+
# <td class="barby-cell on"></td>
|
18
|
+
# <td class="barby-cell off"></td>
|
19
|
+
# <td class="barby-cell on"></td>
|
20
|
+
# </tr>
|
21
|
+
# <tr class="barby-row">
|
22
|
+
# <td class="barby-cell off"></td>
|
23
|
+
# <td class="barby-cell on"></td>
|
24
|
+
# <td class="barby-cell off"></td>
|
25
|
+
# </tr>
|
26
|
+
# </tbody>
|
27
|
+
# </table>
|
28
|
+
#
|
29
|
+
# You could then style this with:
|
30
|
+
#
|
31
|
+
# table.barby-barcode { border-spacing: 0; }
|
32
|
+
# tr.barby-row {}
|
33
|
+
# td.barby-cell { width: 3px; height: 3px; }
|
34
|
+
# td.barby-cell.on { background: #000; }
|
35
|
+
#
|
36
|
+
# Options:
|
37
|
+
#
|
38
|
+
# :class_name - A class name that will be added to the <table> in addition to barby-barcode
|
17
39
|
class HtmlOutputter < Outputter
|
18
40
|
|
19
41
|
register :to_html
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
border: 0 none transparent !important;
|
29
|
-
border-collapse: collapse !important;
|
30
|
-
margin: 0 !important;
|
31
|
-
padding: 0 !important;
|
32
|
-
}
|
33
|
-
table.barby_code tr.barby_row td { border: 0 none transparent !important; }
|
34
|
-
table.barby_code tr.barby_row td.barby_black { background-color: black !important; }
|
35
|
-
table.barby_code tr.barby_row td.barby_white { background-color: white !important; }
|
36
|
-
CSS
|
42
|
+
|
43
|
+
attr_accessor :class_name
|
44
|
+
|
45
|
+
|
46
|
+
def to_html(options = {})
|
47
|
+
with_options options do
|
48
|
+
start + rows.join + stop
|
49
|
+
end
|
37
50
|
end
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
else
|
47
|
-
line_to_elements_row(booleans, options)
|
48
|
-
end
|
49
|
-
html = %|<#{parent_element} class="barby_code" #{parent_style_attribute(options)}>\n#{elements}\n</#{parent_element}>|
|
50
|
-
options[:css] ? "<style>#{self.class.css}</style>\n#{html}" : html
|
51
|
+
|
52
|
+
|
53
|
+
def rows
|
54
|
+
if barcode.two_dimensional?
|
55
|
+
rows_for(booleans)
|
56
|
+
else
|
57
|
+
rows_for([booleans])
|
58
|
+
end
|
51
59
|
end
|
52
60
|
|
53
61
|
|
54
|
-
|
62
|
+
def rows_for(boolean_groups)
|
63
|
+
boolean_groups.map{|g| row_for(cells_for(g)) }
|
64
|
+
end
|
55
65
|
|
56
|
-
def
|
57
|
-
|
58
|
-
Array(%|<#{row_element} class="barby_row">#{elements}</#{row_element}>|)
|
66
|
+
def cells_for(booleans)
|
67
|
+
booleans.map{|b| b ? on_cell : off_cell }
|
59
68
|
end
|
60
|
-
|
61
|
-
def
|
62
|
-
|
69
|
+
|
70
|
+
def row_for(cells)
|
71
|
+
"<tr class=\"barby-row\">#{cells.join}</tr>"
|
63
72
|
end
|
64
|
-
|
65
|
-
def
|
66
|
-
'<td class="
|
73
|
+
|
74
|
+
def on_cell
|
75
|
+
'<td class="barby-cell on"></td>'
|
67
76
|
end
|
68
|
-
|
69
|
-
def
|
70
|
-
'
|
77
|
+
|
78
|
+
def off_cell
|
79
|
+
'<td class="barby-cell off"></td>'
|
71
80
|
end
|
72
|
-
|
73
|
-
def
|
74
|
-
'table'
|
81
|
+
|
82
|
+
def start
|
83
|
+
'<table class="barby-barcode'+(class_name ? " #{class_name}" : '')+'"><tbody>'
|
75
84
|
end
|
76
|
-
|
77
|
-
def
|
78
|
-
|
79
|
-
s = ''
|
80
|
-
s << "width: #{options[:width]}px; " if options[:width]
|
81
|
-
s << "height: #{options[:height]}px; " if options[:height]
|
82
|
-
s.strip!
|
83
|
-
s.empty? ? nil : %|style="#{s}"|
|
85
|
+
|
86
|
+
def stop
|
87
|
+
'</tbody></table>'
|
84
88
|
end
|
85
89
|
|
90
|
+
|
86
91
|
end
|
87
92
|
|
88
93
|
end
|
@@ -0,0 +1,211 @@
|
|
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
|
data/lib/barby/version.rb
CHANGED
metadata
CHANGED
@@ -1,27 +1,23 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: barby
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.5.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Tore Darell
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
date: 2011-08-18 00:00:00 Z
|
12
|
+
date: 2013-03-12 00:00:00.000000000 Z
|
14
13
|
dependencies: []
|
15
|
-
|
16
14
|
description: Barby creates barcodes.
|
17
15
|
email: toredarell@gmail.com
|
18
16
|
executables: []
|
19
|
-
|
20
17
|
extensions: []
|
21
|
-
|
22
|
-
extra_rdoc_files:
|
18
|
+
extra_rdoc_files:
|
23
19
|
- README
|
24
|
-
files:
|
20
|
+
files:
|
25
21
|
- CHANGELOG
|
26
22
|
- README
|
27
23
|
- LICENSE
|
@@ -45,6 +41,7 @@ files:
|
|
45
41
|
- lib/barby/outputter/html_outputter.rb
|
46
42
|
- lib/barby/outputter/pdfwriter_outputter.rb
|
47
43
|
- lib/barby/outputter/png_outputter.rb
|
44
|
+
- lib/barby/outputter/point_matrix.rb
|
48
45
|
- lib/barby/outputter/prawn_outputter.rb
|
49
46
|
- lib/barby/outputter/rmagick_outputter.rb
|
50
47
|
- lib/barby/outputter/svg_outputter.rb
|
@@ -57,36 +54,41 @@ files:
|
|
57
54
|
- bin/barby
|
58
55
|
homepage: http://toretore.github.com/barby
|
59
56
|
licenses: []
|
57
|
+
post_install_message: ! '
|
60
58
|
|
61
|
-
|
62
|
-
|
63
|
-
Barby no longer require all barcode symbologies by default. You'll have
|
64
|
-
|
65
|
-
require
|
66
|
-
filenames, see README.\n\
|
67
|
-
***\n\n"
|
68
|
-
rdoc_options: []
|
59
|
+
*** NEW REQUIRE POLICY ***"
|
60
|
+
|
61
|
+
Barby no longer require all barcode symbologies by default. You''ll have
|
62
|
+
|
63
|
+
to require the ones you need. For example, if you need EAN-13,
|
69
64
|
|
70
|
-
|
65
|
+
require ''barby/barcode/ean_13''; For a full list of symbologies and their
|
66
|
+
|
67
|
+
filenames, see README.
|
68
|
+
|
69
|
+
***
|
70
|
+
|
71
|
+
|
72
|
+
'
|
73
|
+
rdoc_options: []
|
74
|
+
require_paths:
|
71
75
|
- lib
|
72
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
73
77
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version:
|
78
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
83
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
version:
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
84
88
|
requirements: []
|
85
|
-
|
86
89
|
rubyforge_project: barby
|
87
|
-
rubygems_version: 1.8.
|
90
|
+
rubygems_version: 1.8.23
|
88
91
|
signing_key:
|
89
92
|
specification_version: 3
|
90
93
|
summary: The Ruby barcode generator
|
91
94
|
test_files: []
|
92
|
-
|