barcode1dtools 1.0.1.0 → 1.0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/barcode1dtools.rb +174 -61
- data/lib/barcode1dtools/codabar.rb +40 -28
- data/lib/barcode1dtools/code11.rb +34 -23
- data/lib/barcode1dtools/code128.rb +56 -27
- data/lib/barcode1dtools/code3of9.rb +42 -28
- data/lib/barcode1dtools/code93.rb +41 -26
- data/lib/barcode1dtools/coop2of5.rb +36 -25
- data/lib/barcode1dtools/ean13.rb +97 -89
- data/lib/barcode1dtools/ean8.rb +39 -27
- data/lib/barcode1dtools/iata2of5.rb +32 -23
- data/lib/barcode1dtools/industrial2of5.rb +33 -24
- data/lib/barcode1dtools/interleaved2of5.rb +30 -26
- data/lib/barcode1dtools/matrix2of5.rb +33 -24
- data/lib/barcode1dtools/msi.rb +35 -23
- data/lib/barcode1dtools/plessey.rb +33 -23
- data/lib/barcode1dtools/postnet.rb +29 -21
- data/lib/barcode1dtools/upc_a.rb +47 -23
- data/lib/barcode1dtools/upc_e.rb +67 -31
- data/lib/barcode1dtools/upc_supplemental_2.rb +50 -20
- data/lib/barcode1dtools/upc_supplemental_5.rb +49 -18
- metadata +13 -13
@@ -19,11 +19,12 @@ module Barcode1DTools
|
|
19
19
|
# Matrix 2 of 5 is low-density and limited. It should not be
|
20
20
|
# used in any new applications.
|
21
21
|
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
22
|
+
# == Example
|
23
|
+
# val = "3423"
|
24
|
+
# bc = Barcode1DTools::Matrix2of5.new(val)
|
25
|
+
# pattern = bc.bars
|
26
|
+
# rle_pattern = bc.rle
|
27
|
+
# width = bc.width
|
27
28
|
#
|
28
29
|
# The object created is immutable.
|
29
30
|
#
|
@@ -34,27 +35,28 @@ module Barcode1DTools
|
|
34
35
|
# Matrix2of5 characters consist of 3 bars and 2 spaces, with a narrow
|
35
36
|
# space between them. 2 of the bars/spaces in each symbol are wide.
|
36
37
|
#
|
38
|
+
# == Formats
|
37
39
|
# There are three formats for the returned pattern:
|
38
40
|
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
41
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
42
|
+
# characters can be changed from "1" and 0" with options
|
43
|
+
# :line_character and :space_character.
|
42
44
|
#
|
43
|
-
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
45
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
46
|
+
# number is always a black line, with subsequent digits
|
47
|
+
# alternating between spaces and lines. The digits specify
|
48
|
+
# the width of each line or space.
|
47
49
|
#
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
50
|
+
# *wn* - The native format for this barcode type. The string
|
51
|
+
# consists of a series of "w" and "n" characters. The first
|
52
|
+
# item is always a black line, with subsequent characters
|
53
|
+
# alternating between spaces and lines. A "wide" item
|
54
|
+
# is twice the width of a "narrow" item.
|
53
55
|
#
|
54
56
|
# The "width" method will tell you the total end-to-end width, in
|
55
57
|
# units, of the entire barcode.
|
56
58
|
#
|
57
|
-
|
59
|
+
# == Rendering
|
58
60
|
#
|
59
61
|
# The standard w/n ratio seems to be 2:1. There seem to be no real
|
60
62
|
# standards for display.
|
@@ -82,7 +84,9 @@ module Barcode1DTools
|
|
82
84
|
'9'=> {'val'=>9 ,'wn'=>'nwnwn'}
|
83
85
|
}
|
84
86
|
|
87
|
+
# Left guard pattern
|
85
88
|
GUARD_PATTERN_LEFT_WN = 'wnnnn'
|
89
|
+
# Right guard pattern
|
86
90
|
GUARD_PATTERN_RIGHT_WN = 'wnnnn'
|
87
91
|
|
88
92
|
DEFAULT_OPTIONS = {
|
@@ -94,11 +98,13 @@ module Barcode1DTools
|
|
94
98
|
}
|
95
99
|
|
96
100
|
class << self
|
97
|
-
#
|
101
|
+
# Returns true if the value is encodable in this symbology.
|
102
|
+
# Matrix2of5 can encode digits.
|
98
103
|
def can_encode?(value)
|
99
104
|
value.to_s =~ /\A[0-9]+\z/
|
100
105
|
end
|
101
106
|
|
107
|
+
# Generates a check digit for a given value using the Luhn algorithm.
|
102
108
|
def generate_check_digit_for(value)
|
103
109
|
raise UnencodableCharactersError unless self.can_encode?(value)
|
104
110
|
mult = 3
|
@@ -106,13 +112,15 @@ module Barcode1DTools
|
|
106
112
|
(10 - (value % 10)) % 10
|
107
113
|
end
|
108
114
|
|
115
|
+
# Returns true if the final digit if the given string is a valid
|
116
|
+
# check digit for the rest of the string.
|
109
117
|
def validate_check_digit_for(value)
|
110
118
|
raise UnencodableCharactersError unless self.can_encode?(value)
|
111
119
|
md = value.match(/^(\d+?)(\d)$/)
|
112
120
|
self.generate_check_digit_for(md[1]) == md[2].to_i
|
113
121
|
end
|
114
122
|
|
115
|
-
# Decode a string in rle format. This will return a Matrix2of5
|
123
|
+
# Decode a string in rle or w/n format. This will return a Matrix2of5
|
116
124
|
# object.
|
117
125
|
def decode(str, options = {})
|
118
126
|
if str =~ /[^1-3]/ && str =~ /[^wn]/
|
@@ -163,6 +171,7 @@ module Barcode1DTools
|
|
163
171
|
|
164
172
|
end
|
165
173
|
|
174
|
+
# Create a new Matrix2of5 object with a given value.
|
166
175
|
# Options are :line_character, :space_character, :w_character,
|
167
176
|
# :n_character, :checksum_included, and :skip_checksum.
|
168
177
|
def initialize(value, options = {})
|
@@ -190,22 +199,22 @@ module Barcode1DTools
|
|
190
199
|
end
|
191
200
|
end
|
192
201
|
|
193
|
-
# Returns a string of "w" or "n" ("wide" and "narrow")
|
202
|
+
# Returns a string of "w" or "n" ("wide" and "narrow").
|
194
203
|
def wn
|
195
204
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
196
205
|
end
|
197
206
|
|
198
|
-
#
|
207
|
+
# Returns a run-length-encoded string representation.
|
199
208
|
def rle
|
200
209
|
@rle ||= self.class.wn_to_rle(self.wn, @options)
|
201
210
|
end
|
202
211
|
|
203
|
-
#
|
212
|
+
# Returns 1s and 0s (for "black" and "white").
|
204
213
|
def bars
|
205
214
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
206
215
|
end
|
207
216
|
|
208
|
-
#
|
217
|
+
# Returns the total unit width of the bar code.
|
209
218
|
def width
|
210
219
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
211
220
|
end
|
data/lib/barcode1dtools/msi.rb
CHANGED
@@ -21,11 +21,12 @@ module Barcode1DTools
|
|
21
21
|
# MSI is a terrible symbology in modern terms and should
|
22
22
|
# not be used in any new applications.
|
23
23
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
24
|
+
# == Example
|
25
|
+
# val = "2898289238"
|
26
|
+
# bc = Barcode1DTools::MSI.new(val)
|
27
|
+
# pattern = bc.bars
|
28
|
+
# rle_pattern = bc.rle
|
29
|
+
# width = bc.width
|
29
30
|
#
|
30
31
|
# The object created is immutable.
|
31
32
|
#
|
@@ -40,27 +41,28 @@ module Barcode1DTools
|
|
40
41
|
# The bits are ordered descending, so 9 is 1001 binary,
|
41
42
|
# "wn nw nw wn" in w/n format.
|
42
43
|
#
|
44
|
+
# == Formats
|
43
45
|
# There are three formats for the returned pattern:
|
44
46
|
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
47
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
48
|
+
# characters can be changed from "1" and 0" with options
|
49
|
+
# :line_character and :space_character.
|
48
50
|
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
51
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
52
|
+
# number is always a black line, with subsequent digits
|
53
|
+
# alternating between spaces and lines. The digits specify
|
54
|
+
# the width of each line or space.
|
53
55
|
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
56
|
+
# *wn* - The native format for this barcode type. The string
|
57
|
+
# consists of a series of "w" and "n" characters. The first
|
58
|
+
# item is always a black line, with subsequent characters
|
59
|
+
# alternating between spaces and lines. A "wide" item
|
60
|
+
# is twice the width of a "narrow" item.
|
59
61
|
#
|
60
62
|
# The "width" method will tell you the total end-to-end width, in
|
61
63
|
# units, of the entire barcode.
|
62
64
|
#
|
63
|
-
|
65
|
+
# == Rendering
|
64
66
|
#
|
65
67
|
# The author is aware of no standards for display.
|
66
68
|
|
@@ -84,7 +86,9 @@ module Barcode1DTools
|
|
84
86
|
'9'=> {'val'=>9 ,'wn'=>'wnnwnwwn'}
|
85
87
|
}
|
86
88
|
|
89
|
+
# Left guard pattern
|
87
90
|
GUARD_PATTERN_LEFT_WN = 'wn'
|
91
|
+
# Right guard pattern
|
88
92
|
GUARD_PATTERN_RIGHT_WN = 'nwn'
|
89
93
|
|
90
94
|
DEFAULT_OPTIONS = {
|
@@ -98,11 +102,13 @@ module Barcode1DTools
|
|
98
102
|
}
|
99
103
|
|
100
104
|
class << self
|
101
|
-
# MSI can encode digits
|
105
|
+
# MSI can encode digits - returns true if given a string of digits.
|
102
106
|
def can_encode?(value)
|
103
107
|
value.to_s =~ /\A\d+\z/
|
104
108
|
end
|
105
109
|
|
110
|
+
# Generates a check digit using one of four algorithms. The algorithm
|
111
|
+
# must be specified in the second parameter (the options hash).
|
106
112
|
def generate_check_digit_for(value, options = {})
|
107
113
|
if options[:check_digit] == 'mod 10'
|
108
114
|
generate_mod10_check_digit_for(value).to_s
|
@@ -119,11 +125,13 @@ module Barcode1DTools
|
|
119
125
|
end
|
120
126
|
end
|
121
127
|
|
128
|
+
# Validates the check digit(s) for a given string.
|
122
129
|
def validate_check_digit_for(value, options = {})
|
123
130
|
payload, check_digits = split_payload_and_check_digits(value, options)
|
124
131
|
self.generate_check_digit_for(payload, options) == check_digits
|
125
132
|
end
|
126
133
|
|
134
|
+
# Splits payload and check digit(s) given a check_digit option.
|
127
135
|
def split_payload_and_check_digits(value, options = {})
|
128
136
|
if options[:check_digit] == 'mod 1010' || options[:check_digit] == 'mod 1110'
|
129
137
|
md = value.to_s.match(/\A(.*?)(..)\z/)
|
@@ -133,6 +141,7 @@ module Barcode1DTools
|
|
133
141
|
[md[1], md[2]]
|
134
142
|
end
|
135
143
|
|
144
|
+
# Generates a mod 10 check digit.
|
136
145
|
def generate_mod10_check_digit_for(value)
|
137
146
|
value = value.to_s
|
138
147
|
valarr = value.scan(/\d\d?/)
|
@@ -148,6 +157,7 @@ module Barcode1DTools
|
|
148
157
|
(10 - ((odd + even) % 10)) % 10
|
149
158
|
end
|
150
159
|
|
160
|
+
# Generates a mod 11 check digit.
|
151
161
|
def generate_mod11_check_digit_for(value, style)
|
152
162
|
max = (style == 'ncr' ? 9 : 7)
|
153
163
|
value = value.to_s
|
@@ -206,8 +216,10 @@ module Barcode1DTools
|
|
206
216
|
|
207
217
|
end
|
208
218
|
|
219
|
+
# Create a new MSI object with a given value.
|
209
220
|
# Options are :line_character, :space_character, :w_character,
|
210
|
-
# :n_character, :checksum_included, and
|
221
|
+
# :n_character, :check_digit, :checksum_included, and
|
222
|
+
# :skip_checksum.
|
211
223
|
def initialize(value, options = {})
|
212
224
|
|
213
225
|
@options = DEFAULT_OPTIONS.merge(options)
|
@@ -235,17 +247,17 @@ module Barcode1DTools
|
|
235
247
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
236
248
|
end
|
237
249
|
|
238
|
-
#
|
250
|
+
# Returns a run-length-encoded string representation
|
239
251
|
def rle
|
240
252
|
@rle ||= self.class.wn_to_rle(self.wn, @options)
|
241
253
|
end
|
242
254
|
|
243
|
-
#
|
255
|
+
# Returns 1s and 0s (for "black" and "white")
|
244
256
|
def bars
|
245
257
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
246
258
|
end
|
247
259
|
|
248
|
-
#
|
260
|
+
# Returns the total unit width of the bar code
|
249
261
|
def width
|
250
262
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
251
263
|
end
|
@@ -18,11 +18,12 @@ module Barcode1DTools
|
|
18
18
|
# Plessey is a terrible symbology in modern terms and should
|
19
19
|
# not be used in any new applications.
|
20
20
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
21
|
+
# == Example
|
22
|
+
# val = "2898289238AF"
|
23
|
+
# bc = Barcode1DTools::Plessey.new(val)
|
24
|
+
# pattern = bc.bars
|
25
|
+
# rle_pattern = bc.rle
|
26
|
+
# width = bc.width
|
26
27
|
#
|
27
28
|
# The object created is immutable.
|
28
29
|
#
|
@@ -37,27 +38,28 @@ module Barcode1DTools
|
|
37
38
|
# The bits are ordered ascending, so 9 is 1001 binary,
|
38
39
|
# "wn nw nw wn" in w/n format.
|
39
40
|
#
|
41
|
+
# == Formats
|
40
42
|
# There are three formats for the returned pattern:
|
41
43
|
#
|
42
|
-
#
|
43
|
-
#
|
44
|
-
#
|
44
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
45
|
+
# characters can be changed from "1" and 0" with options
|
46
|
+
# :line_character and :space_character.
|
45
47
|
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
48
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
49
|
+
# number is always a black line, with subsequent digits
|
50
|
+
# alternating between spaces and lines. The digits specify
|
51
|
+
# the width of each line or space.
|
50
52
|
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
53
|
+
# *wn* - The native format for this barcode type. The string
|
54
|
+
# consists of a series of "w" and "n" characters. The first
|
55
|
+
# item is always a black line, with subsequent characters
|
56
|
+
# alternating between spaces and lines. A "wide" item
|
57
|
+
# is twice the width of a "narrow" item.
|
56
58
|
#
|
57
59
|
# The "width" method will tell you the total end-to-end width, in
|
58
60
|
# units, of the entire barcode.
|
59
61
|
#
|
60
|
-
|
62
|
+
# == Rendering
|
61
63
|
#
|
62
64
|
# The author is aware of no standards for display.
|
63
65
|
|
@@ -87,7 +89,9 @@ module Barcode1DTools
|
|
87
89
|
'F'=> {'val'=>15 ,'wn'=>'wnwnwnwn'}
|
88
90
|
}
|
89
91
|
|
92
|
+
# Left guard pattern
|
90
93
|
GUARD_PATTERN_LEFT_WN = 'wnwnnwwn'
|
94
|
+
# Right guard pattern
|
91
95
|
GUARD_PATTERN_RIGHT_WN = 'wnwnnwnw'
|
92
96
|
|
93
97
|
DEFAULT_OPTIONS = {
|
@@ -99,15 +103,20 @@ module Barcode1DTools
|
|
99
103
|
}
|
100
104
|
|
101
105
|
class << self
|
102
|
-
# Plessey can encode digits and A-F.
|
106
|
+
# Plessey can encode digits and A-F. Returns "true" if the
|
107
|
+
# given value is encodable.
|
103
108
|
def can_encode?(value)
|
104
109
|
value.to_s =~ /\A[0-9A-F]+\z/
|
105
110
|
end
|
106
111
|
|
112
|
+
# We don't generate check digits for Plessey, so this will raise
|
113
|
+
# an error.
|
107
114
|
def generate_check_digit_for(value)
|
108
115
|
raise NotImplementedError
|
109
116
|
end
|
110
117
|
|
118
|
+
# We don't generate check digits for Plessey, so this will raise
|
119
|
+
# an error.
|
111
120
|
def validate_check_digit_for(value)
|
112
121
|
raise NotImplementedError
|
113
122
|
end
|
@@ -162,8 +171,9 @@ module Barcode1DTools
|
|
162
171
|
|
163
172
|
end
|
164
173
|
|
174
|
+
# Create a new Plessey barcode object with the given value.
|
165
175
|
# Options are :line_character, :space_character, :w_character,
|
166
|
-
#
|
176
|
+
# and :n_character.
|
167
177
|
def initialize(value, options = {})
|
168
178
|
|
169
179
|
@options = DEFAULT_OPTIONS.merge(options)
|
@@ -181,17 +191,17 @@ module Barcode1DTools
|
|
181
191
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
182
192
|
end
|
183
193
|
|
184
|
-
#
|
194
|
+
# Returns a run-length-encoded string representation
|
185
195
|
def rle
|
186
196
|
@rle ||= self.class.wn_to_rle(self.wn, @options)
|
187
197
|
end
|
188
198
|
|
189
|
-
#
|
199
|
+
# Returns 1s and 0s (for "black" and "white")
|
190
200
|
def bars
|
191
201
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
192
202
|
end
|
193
203
|
|
194
|
-
#
|
204
|
+
# Returns the total unit width of the bar code
|
195
205
|
def width
|
196
206
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
197
207
|
end
|
@@ -18,11 +18,12 @@ module Barcode1DTools
|
|
18
18
|
# PostNet is used by the USPS for mail sorting, although it
|
19
19
|
# is technically deprecated.
|
20
20
|
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
21
|
+
# == Example
|
22
|
+
# val = "37211"
|
23
|
+
# bc = Barcode1DTools::PostNet.new(val)
|
24
|
+
# pattern = bc.bars
|
25
|
+
# rle_pattern = bc.rle
|
26
|
+
# width = bc.width
|
26
27
|
#
|
27
28
|
# The object created is immutable.
|
28
29
|
#
|
@@ -31,27 +32,28 @@ module Barcode1DTools
|
|
31
32
|
# string. In this symbology, "wide" means "tall" and "narrow"
|
32
33
|
# means "short".
|
33
34
|
#
|
35
|
+
# == Formats
|
34
36
|
# There are three formats for the returned pattern:
|
35
37
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
38
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
39
|
+
# characters can be changed from "1" and 0" with options
|
40
|
+
# :line_character and :space_character.
|
39
41
|
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
42
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
43
|
+
# number is always a black line, with subsequent digits
|
44
|
+
# alternating between spaces and lines. The digits specify
|
45
|
+
# the width of each line or space.
|
44
46
|
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
48
|
-
#
|
49
|
-
#
|
47
|
+
# *wn* - The native format for this barcode type. The string
|
48
|
+
# consists of a series of "w" and "n" characters. The first
|
49
|
+
# item is always a black line, with subsequent characters
|
50
|
+
# alternating between spaces and lines. A "wide" item
|
51
|
+
# is twice the width of a "narrow" item.
|
50
52
|
#
|
51
53
|
# The "width" method will tell you the total end-to-end width, in
|
52
54
|
# units, of the entire barcode.
|
53
55
|
#
|
54
|
-
|
56
|
+
# == Rendering
|
55
57
|
#
|
56
58
|
# See USPS documentation for exact specifications for display.
|
57
59
|
|
@@ -78,7 +80,9 @@ module Barcode1DTools
|
|
78
80
|
'9'=> {'val'=>9 ,'wn'=>'wnwnn'}
|
79
81
|
}
|
80
82
|
|
83
|
+
# Left guard pattern
|
81
84
|
GUARD_PATTERN_LEFT_WN = 'w'
|
85
|
+
# Right guard pattern
|
82
86
|
GUARD_PATTERN_RIGHT_WN = 'w'
|
83
87
|
|
84
88
|
DEFAULT_OPTIONS = {
|
@@ -90,16 +94,19 @@ module Barcode1DTools
|
|
90
94
|
|
91
95
|
class << self
|
92
96
|
# PostNet can encode 5, 9, or 11 digits, plus a check digit.
|
97
|
+
# This returns true if the value is encodable.
|
93
98
|
def can_encode?(value)
|
94
99
|
value.to_s =~ /\A\d{5}(\d{4})?(\d{2})?\d?\z/
|
95
100
|
end
|
96
101
|
|
102
|
+
# Generate the check digit for a given value.
|
97
103
|
def generate_check_digit_for(value)
|
98
104
|
raise UnencodableCharactersError unless self.can_encode?(value)
|
99
105
|
value = value.split('').collect { |c| c.to_i }.inject(0) { |a,c| a + c }
|
100
106
|
(10 - (value % 10)) % 10
|
101
107
|
end
|
102
108
|
|
109
|
+
# Validate the check digit for a given value.
|
103
110
|
def validate_check_digit_for(value)
|
104
111
|
raise UnencodableCharactersError unless self.can_encode?(value)
|
105
112
|
md = value.match(/^(\d+?)(\d)$/)
|
@@ -152,6 +159,7 @@ module Barcode1DTools
|
|
152
159
|
|
153
160
|
end
|
154
161
|
|
162
|
+
# Create a new PostNet object with the given value.
|
155
163
|
# Options are :line_character, :space_character, :w_character,
|
156
164
|
# :n_character, :checksum_included, and :skip_checksum.
|
157
165
|
def initialize(value, options = {})
|
@@ -196,17 +204,17 @@ module Barcode1DTools
|
|
196
204
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
197
205
|
end
|
198
206
|
|
199
|
-
#
|
207
|
+
# Returns a run-length-encoded string representation
|
200
208
|
def rle
|
201
209
|
@rle ||= self.class.wn_to_rle(self.wn, @options)
|
202
210
|
end
|
203
211
|
|
204
|
-
#
|
212
|
+
# Returns 1s and 0s (for "black" and "white")
|
205
213
|
def bars
|
206
214
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
207
215
|
end
|
208
216
|
|
209
|
-
#
|
217
|
+
# Returns the total unit width of the bar code
|
210
218
|
def width
|
211
219
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
212
220
|
end
|