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
data/lib/barcode1dtools.rb
CHANGED
@@ -1,65 +1,170 @@
|
|
1
|
-
|
2
|
-
#
|
1
|
+
# Barcode1DTools is a library for generating and decoding
|
2
|
+
# 1-dimensional barcode patterns for various code types. The
|
3
|
+
# library currently includes EAN-13, EAN-8, UPC-A, UPC-E, UPC
|
4
|
+
# Supplemental 2, UPC Supplemental 5, Interleaved 2 of 5 (I 2/5),
|
5
|
+
# COOP 2 of 5, Matrix 2 of 5, Industrial 2 of 5, IATA 2 of 5,
|
6
|
+
# PostNet, Plessey, MSI (Modified Plessey), Code 3 of 9, Code 93,
|
7
|
+
# Code 11, Code 128, and Codabar.
|
3
8
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
|
7
|
-
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
# Contact Michael Chaney Consulting Corporation for commercial
|
10
|
+
# support for this code: sales@michaelchaney.com
|
11
|
+
#
|
12
|
+
# Author:: Michael Chaney (mdchaney@michaelchaney.com)
|
13
|
+
# Copyright:: Copyright (c) 2012 Michael Chaney Consulting Corporation
|
14
|
+
# License:: Diestributed under the terms of the MIT License of the GNU General Public License v. 2
|
15
|
+
#
|
16
|
+
# == Example
|
17
|
+
# ean13 = Barcode1DTools::EAN13.new('0012676510226', :line_character => 'x', :space_character => ' ')
|
18
|
+
# => #<Barcode1DTools::EAN13:0x10030d670 @check_digit=10, @manufacturers_code="12676", @encoded_string="001267651022610", @number_system="00", @value="0012676510226", @product_code="51022", @options={:line_character=>"1", :space_character=>"0"}>
|
19
|
+
# ean13.bars
|
20
|
+
# "x x xx x xx x x xx x xxxx xxx xx x xxxx x x x xxx xx xx xxx x xx xx xx xx x x x x"
|
21
|
+
# ean13.rle
|
22
|
+
# "11132112221212211141312111411111123122213211212221221114111"
|
23
|
+
# another_ean = EAN.decode(ean13.rle)
|
24
|
+
#
|
25
|
+
# Note that the Barcode1D objects are immutable.
|
26
|
+
#
|
27
|
+
# == Barcode Symbology Overview
|
28
|
+
#
|
29
|
+
# There are two broad families of barcodes: 1-dimensional (also
|
30
|
+
# "1D" or "linear") and 2-dimensional ("2D"). Nowadays, 2D
|
31
|
+
# barcodes are desired for a variety of reasons:
|
32
|
+
#
|
33
|
+
# * They have the ability to store vastly more information
|
34
|
+
# in the same space as most 1D barcodes
|
35
|
+
# * They use error correction - typically Reed-Solomon
|
36
|
+
# interleaving - to allow even a damaged code to be read.
|
37
|
+
# * Modern technology (cheap CCD cameras particularly) has made
|
38
|
+
# it easy to read them.
|
39
|
+
#
|
40
|
+
# Despite the advantages of 2D symbologies, 1D barcodes are
|
41
|
+
# still in wide use and likely will never go out of use.
|
42
|
+
#
|
43
|
+
# * There is still a huge installed base of dedicated scanners
|
44
|
+
# and hardware for dealing with 1D barcodes.
|
45
|
+
# * They are easier to read at a really long distance.
|
46
|
+
# * There's also a huge installed base of software that can
|
47
|
+
# generate such codes.
|
48
|
+
# * They encode enough information to be very useful.
|
49
|
+
#
|
50
|
+
# Within the 1D symbologies, there are some different
|
51
|
+
# classifications:
|
52
|
+
#
|
53
|
+
# 1. Continuous and Discrete - Any modern symbology is
|
54
|
+
# "continuous", which simply means that every bar and space -
|
55
|
+
# including inter-character spaces - are used to encode
|
56
|
+
# information. Discrete symbologies typically have characters
|
57
|
+
# that begin and end with a bar and have a narrow space between
|
58
|
+
# the characters.
|
59
|
+
#
|
60
|
+
# 2. Wide/Narrow (or "Two-width") and Many-width - Most modern
|
61
|
+
# symbologies are "many-width", meaning that the width of
|
62
|
+
# the bars and spaces has more than two varieties. The best
|
63
|
+
# symbologies - EAN/UPC and Code 128, use 4 widths for the
|
64
|
+
# bars and spaces to encode information. Many older
|
65
|
+
# symbologies use simply 2 widths (the "2 of 5" family, for
|
66
|
+
# instance, has 2 wide elements and 5 narrow elements for
|
67
|
+
# each character).
|
68
|
+
#
|
69
|
+
# 3. Self-checking - Self-checking symbologies will cause a
|
70
|
+
# mis-read if any single bar is misinterpreted. In other
|
71
|
+
# words, a single bar that is "wrong" can not cause the
|
72
|
+
# character to be interpreted as another.
|
73
|
+
#
|
74
|
+
# 4. Interleaved - Interleaved 2 of 5 is probably the best
|
75
|
+
# example - two characters are interleaved together with
|
76
|
+
# one coded as bars and the other as spaces.
|
77
|
+
#
|
78
|
+
# 5. Check digit - Most symbologies include a check digit that
|
79
|
+
# is generated based on the payload, although some, such as
|
80
|
+
# Code 128, actually generate the check digit based on the
|
81
|
+
# encoded information. Additionally, some symbologies have
|
82
|
+
# two check digits and some have multiple algorithms for
|
83
|
+
# generating the digit or digits.
|
84
|
+
#
|
85
|
+
# Additionally, different symbologies encode a different
|
86
|
+
# subset of characters. Some encode only digits, others encode
|
87
|
+
# digits plus a few symbols, some uppercase letters as well as
|
88
|
+
# digits and a few symbols, and some the full range of
|
89
|
+
# characters. The symbology that you choose for a given
|
90
|
+
# application should take into account what information you
|
91
|
+
# need to store and how to best store it.
|
92
|
+
#
|
93
|
+
# There are some excellent 2D barcode gems for Ruby that cover
|
94
|
+
# some of the more popular symbologies (QR Code is currently
|
95
|
+
# the most popular). This gem covers almost all 1D symbologies
|
96
|
+
# ever developed, and definitely all the most popular.
|
97
|
+
#
|
98
|
+
# == Standard Options
|
99
|
+
#
|
100
|
+
# When creating a barcode, there are a number of options available:
|
101
|
+
#
|
102
|
+
# 1. checksum_included - The checksum is included in the value
|
103
|
+
# and does not need to be generated. This checksum will be
|
104
|
+
# validated and an error raised if it is not proper.
|
105
|
+
#
|
106
|
+
# 2. skip_checksum - Do not include a checksum if it is optional.
|
107
|
+
# This option is not applicable to most barcode types and
|
108
|
+
# will be ignored unless it is applicable.
|
109
|
+
#
|
110
|
+
# 3. line_character, space_character - when generating a bar
|
111
|
+
# pattern, determines the characters which will represent bars
|
112
|
+
# and spaces in the pattern. These default to "1" for lines and
|
113
|
+
# "0" for spaces.
|
114
|
+
#
|
115
|
+
# 4. w_character, n_character - When generating a w/n pattern,
|
116
|
+
# determines the characters to be used for wide and narrow
|
117
|
+
# bars and spaces. Defaults to "w" and "n". Not applicable to
|
118
|
+
# all barcode types.
|
119
|
+
#
|
120
|
+
# == Standard Object Accessors
|
121
|
+
#
|
122
|
+
# 1. Barcode1D#value - The actual value of the payload. If there
|
123
|
+
# is a checksum, it is not part of the value. This may be a
|
124
|
+
# string or an integer depending on the type of barcode.
|
125
|
+
#
|
126
|
+
# 2. Barcode1D#check_digit - The checksum digit (or digits).
|
127
|
+
# This is usually an integer.
|
128
|
+
#
|
129
|
+
# 3. Barcode1D#encoded_string - The entire literal value that is
|
130
|
+
# encoded, including check digit(s) and start/stop characters
|
131
|
+
# for some symbologies.
|
132
|
+
#
|
133
|
+
# 4. Barcode1D#options - The options passed to the initializer.
|
134
|
+
#
|
135
|
+
# == Standard Object Methods
|
136
|
+
#
|
137
|
+
# 1. Barcode1D#width - The unit width of the entire barcode.
|
138
|
+
# This is a summation of all of the digits in the rle string
|
139
|
+
# (see below) and is the basis for determining an absolute
|
140
|
+
# width for each particular element.
|
141
|
+
#
|
142
|
+
# 2. Barcode1D#rle - RLE (run-length encoded) is the base format
|
143
|
+
# for many barcode symbologies. This string is a series of
|
144
|
+
# digits from 1 through 4 (depending on the symbology) that
|
145
|
+
# encodes the relative width of each bar and space. The first
|
146
|
+
# and last digits are always bars and there must always be an
|
147
|
+
# odd number of digits.
|
148
|
+
#
|
149
|
+
# 3. Barcode1D#wn - A wide/narrow representation is the base
|
150
|
+
# format for most symbologies that don't have an rle string
|
151
|
+
# as their base format. This is also known as a "two-width"
|
152
|
+
# code. The "2 of 5" family of codes and Code 39 are
|
153
|
+
# examples of wide/narrow codes. In this code the bars and
|
154
|
+
# spaces are either "wide" or "narrow", with "wide"
|
155
|
+
# typically being 2 or 3 times the width of "narrow". In
|
156
|
+
# practice, then, this is similar to an rle string of 1s and
|
157
|
+
# 2s or 1s and 3s. These objects all have an option of
|
158
|
+
# "wn_ratio" that lets you set the ratio yourself, with a
|
159
|
+
# default of "2".
|
160
|
+
#
|
161
|
+
# 4. Barcode1D#bars - A simple string of 1s and 0s (or whatever
|
162
|
+
# characters were set by options) that represents the bars
|
163
|
+
# (1s) and spaces (0s) of the barcode. The length of this
|
164
|
+
# string represents the unit width of the code. Generally
|
165
|
+
# speaking this is good for debugging but more difficult to
|
166
|
+
# render than the rle representation.
|
12
167
|
module Barcode1DTools
|
13
|
-
#= barcode1dtools.rb
|
14
|
-
#
|
15
|
-
# Barcode1DTools is a library for generating and decoding
|
16
|
-
# 1-dimensional barcode patterns for various code types. The
|
17
|
-
# library currently includes EAN-13, EAN-8, UPC-A, UPC-E, UPC
|
18
|
-
# Supplemental 2, UPC Supplemental 5, Interleaved 2 of 5 (I 2/5),
|
19
|
-
# COOP 2 of 5, Matrix 2 of 5, Industrial 2 of 5, IATA 2 of 5,
|
20
|
-
# PostNet, Plessey, MSI (Modified Plessey), Code 3 of 9, Code 93,
|
21
|
-
# Code 11, Code 128, and Codabar.
|
22
|
-
#
|
23
|
-
# Contact Michael Chaney Consulting Corporation for commercial
|
24
|
-
# support for this code: sales@michaelchaney.com
|
25
|
-
#
|
26
|
-
#== Example
|
27
|
-
# ean13 = Barcode1DTools::EAN13.new('0012676510226', :line_character => 'x', :space_character => ' ')
|
28
|
-
# => #<Barcode1DTools::EAN13:0x10030d670 @check_digit=10, @manufacturers_code="12676", @encoded_string="001267651022610", @number_system="00", @value="0012676510226", @product_code="51022", @options={:line_character=>"1", :space_character=>"0"}>
|
29
|
-
# ean13.bars
|
30
|
-
# "x x xx x xx x x xx x xxxx xxx xx x xxxx x x x xxx xx xx xxx x xx xx xx xx x x x x"
|
31
|
-
# ean13.rle
|
32
|
-
# "11132112221212211141312111411111123122213211212221221114111"
|
33
|
-
# another_ean = EAN.decode(ean13.rle)
|
34
|
-
#
|
35
|
-
#== Standard Options
|
36
|
-
# When creating a barcode, there are a number of options available:
|
37
|
-
#
|
38
|
-
# 1. checksum_included - The checksum is included in the value
|
39
|
-
# and does not need to be generated. This checksum will be
|
40
|
-
# validated and an error raised if it is not proper.
|
41
|
-
# 2. skip_checksum - Do not include a checksum if it is optional.
|
42
|
-
# This option is not applicable to most barcode types and
|
43
|
-
# will be ignored unless it is applicable.
|
44
|
-
# 3. line_character, space_character - when generating a bar
|
45
|
-
# pattern, determines the characters which will represent bars
|
46
|
-
# and spaces in the pattern. These default to "1" for lines and
|
47
|
-
# "0" for spaces.
|
48
|
-
# 4. w_character, n_character - When generating a w/n pattern,
|
49
|
-
# determines the characters to be used for wide and narrow
|
50
|
-
# bars and spaces. Defaults to "w" and "n". Not applicable to
|
51
|
-
# all barcode types.
|
52
|
-
#
|
53
|
-
#== Standard Object Accessors
|
54
|
-
# 1. Barcode1D#value - The actual value of the payload. If there
|
55
|
-
# is a checksum, it is not part of the value. This may be a
|
56
|
-
# string or an integer depending on the type of barcode.
|
57
|
-
# 2. Barcode1D#check_digit - The checksum digit (or digits).
|
58
|
-
# This is an integer.
|
59
|
-
# 3. Barcode1D#encoded_string - The entire literal value that is
|
60
|
-
# encoded, including check digit(s).
|
61
|
-
# 4. Barcode1D#options - The options passed to the initializer.
|
62
|
-
|
63
168
|
|
64
169
|
# Errors for barcodes
|
65
170
|
class Barcode1DError < StandardError; end
|
@@ -71,11 +176,16 @@ module Barcode1DTools
|
|
71
176
|
class NotImplementedError < Barcode1DError; end
|
72
177
|
class UndecodableCharactersError < Barcode1DError; end
|
73
178
|
|
179
|
+
# Base class for all barcode classes.
|
74
180
|
class Barcode1D
|
75
181
|
|
76
|
-
|
182
|
+
# The value that is encoded
|
77
183
|
attr_reader :value
|
184
|
+
# The check digit(s), if any - may be nil
|
185
|
+
attr_reader :check_digit
|
186
|
+
# The actual string that is encoded, including check digits
|
78
187
|
attr_reader :encoded_string
|
188
|
+
# Options, including defaults and those explicitly set
|
79
189
|
attr_reader :options
|
80
190
|
|
81
191
|
class << self
|
@@ -101,6 +211,8 @@ module Barcode1DTools
|
|
101
211
|
rle_str.tr('123456789', 'nwwwwwwww').tr('wn', wn_pair(options))
|
102
212
|
end
|
103
213
|
|
214
|
+
private
|
215
|
+
|
104
216
|
# Get an "wn" pair from the options
|
105
217
|
def wn_pair(options = {})
|
106
218
|
(options[:w_character] || 'w') + (options[:n_character] || 'n')
|
@@ -114,6 +226,7 @@ module Barcode1DTools
|
|
114
226
|
end
|
115
227
|
end
|
116
228
|
|
229
|
+
$:.unshift(File.dirname(__FILE__))
|
117
230
|
require 'barcode1dtools/interleaved2of5'
|
118
231
|
require 'barcode1dtools/ean13'
|
119
232
|
require 'barcode1dtools/ean8'
|
@@ -24,11 +24,12 @@ module Barcode1DTools
|
|
24
24
|
# characters as part of the value. When decoding, the start/stop
|
25
25
|
# characters will be presented as A, B, C, or D.
|
26
26
|
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
27
|
+
# == Example
|
28
|
+
# val = "A29322930C"
|
29
|
+
# bc = Barcode1DTools::Codabar.new(val)
|
30
|
+
# pattern = bc.bars
|
31
|
+
# rle_pattern = bc.rle
|
32
|
+
# width = bc.width
|
32
33
|
#
|
33
34
|
# The object created is immutable.
|
34
35
|
#
|
@@ -44,27 +45,28 @@ module Barcode1DTools
|
|
44
45
|
# (dot, forward slash, colon, and plus sign) each have three wide
|
45
46
|
# bars and all narrow spaces.
|
46
47
|
#
|
48
|
+
# == Formats
|
47
49
|
# There are three formats for the returned pattern:
|
48
50
|
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
51
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
52
|
+
# characters can be changed from "1" and 0" with options
|
53
|
+
# :line_character and :space_character.
|
52
54
|
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
55
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
56
|
+
# number is always a black line, with subsequent digits
|
57
|
+
# alternating between spaces and lines. The digits specify
|
58
|
+
# the width of each line or space.
|
57
59
|
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
60
|
+
# *wn* - The native format for this barcode type. The string
|
61
|
+
# consists of a series of "w" and "n" characters. The first
|
62
|
+
# item is always a black line, with subsequent characters
|
63
|
+
# alternating between spaces and lines. A "wide" item
|
64
|
+
# is twice the width of a "narrow" item.
|
63
65
|
#
|
64
66
|
# The "width" method will tell you the total end-to-end width, in
|
65
67
|
# units, of the entire barcode.
|
66
68
|
#
|
67
|
-
|
69
|
+
# == Rendering
|
68
70
|
#
|
69
71
|
# The original Codabar specification actually included a varied
|
70
72
|
# w/n ratio depending on whether there were two or three wide
|
@@ -122,21 +124,31 @@ module Barcode1DTools
|
|
122
124
|
:varied_wn_ratio => false
|
123
125
|
}
|
124
126
|
|
125
|
-
|
127
|
+
# Holds the start character
|
128
|
+
attr_reader :start_character
|
129
|
+
# Holds the stop character
|
130
|
+
attr_reader :stop_character
|
131
|
+
# The actual payload (between start/stop characters)
|
132
|
+
attr_reader :payload
|
126
133
|
|
127
134
|
class << self
|
128
|
-
|
129
|
-
#
|
130
|
-
#
|
135
|
+
|
136
|
+
# Returns true if the value presented can be encoded in a
|
137
|
+
# Codabar barcode. Codabar can encode digits, dash,
|
138
|
+
# dollar, colon, forward slash, dot, and plus. The string
|
139
|
+
# must start and stop with start/stop characters.
|
131
140
|
def can_encode?(value)
|
132
141
|
value.to_s =~ /\A[ABCD][0-9\$:\/\.\+\-]*[ABCD]\z/ || value.to_s =~ /\A[TN\*E][0-9\$:\/\.\+\-]*[TN\*E]\z/
|
133
142
|
end
|
134
143
|
|
135
|
-
#
|
144
|
+
# Generate a check digit. For Codabar, this
|
145
|
+
# will raise a NotImplementedError.
|
136
146
|
def generate_check_digit_for(value)
|
137
147
|
raise NotImplementedError
|
138
148
|
end
|
139
149
|
|
150
|
+
# Validate the check digit. For Codabar, this
|
151
|
+
# will raise a NotImplementedError.
|
140
152
|
def validate_check_digit_for(value)
|
141
153
|
raise NotImplementedError
|
142
154
|
end
|
@@ -195,8 +207,8 @@ module Barcode1DTools
|
|
195
207
|
|
196
208
|
end
|
197
209
|
|
198
|
-
# Options are :line_character,
|
199
|
-
# :n_character, and :varied_wn_ratio.
|
210
|
+
# Create a new Codabar object. Options are :line_character,
|
211
|
+
# :space_character, :w_character, :n_character, and :varied_wn_ratio.
|
200
212
|
def initialize(value, options = {})
|
201
213
|
|
202
214
|
@options = DEFAULT_OPTIONS.merge(options)
|
@@ -217,7 +229,7 @@ module Barcode1DTools
|
|
217
229
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
218
230
|
end
|
219
231
|
|
220
|
-
#
|
232
|
+
# Returns a run-length-encoded string representation
|
221
233
|
def rle
|
222
234
|
if @options[:varied_wn_ratio]
|
223
235
|
@rle ||= @encoded_string.split('').collect { |c| PATTERNS[c]['wn'] }.collect { |p| p.tr('wn',(p=~/.*w.*w.*w/ ? '21' : '31')) }.join('1')
|
@@ -226,12 +238,12 @@ module Barcode1DTools
|
|
226
238
|
end
|
227
239
|
end
|
228
240
|
|
229
|
-
#
|
241
|
+
# Returns the bar pattern
|
230
242
|
def bars
|
231
243
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
232
244
|
end
|
233
245
|
|
234
|
-
#
|
246
|
+
# Returns the total unit width of the bar code
|
235
247
|
def width
|
236
248
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
237
249
|
end
|
@@ -19,11 +19,12 @@ module Barcode1DTools
|
|
19
19
|
# Code 11 is used in the telecom industry for equipment
|
20
20
|
# labeling. It should not be used in any new applications.
|
21
21
|
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
22
|
+
# ==Example
|
23
|
+
# val = "29382-38"
|
24
|
+
# bc = Barcode1DTools::Code11.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
|
#
|
@@ -35,27 +36,28 @@ module Barcode1DTools
|
|
35
36
|
# space between them. Three of the characters- 0, 9, and "-" -
|
36
37
|
# are 6 units wide. The rest are 7 units wide.
|
37
38
|
#
|
39
|
+
# == Formats
|
38
40
|
# There are three formats for the returned pattern:
|
39
41
|
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
42
|
+
# *bars* - 1s and 0s specifying black lines and white spaces. Actual
|
43
|
+
# characters can be changed from "1" and 0" with options
|
44
|
+
# :line_character and :space_character.
|
43
45
|
#
|
44
|
-
#
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
46
|
+
# *rle* - Run-length-encoded version of the pattern. The first
|
47
|
+
# number is always a black line, with subsequent digits
|
48
|
+
# alternating between spaces and lines. The digits specify
|
49
|
+
# the width of each line or space.
|
48
50
|
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
51
|
+
# *wn* - The native format for this barcode type. The string
|
52
|
+
# consists of a series of "w" and "n" characters. The first
|
53
|
+
# item is always a black line, with subsequent characters
|
54
|
+
# alternating between spaces and lines. A "wide" item
|
55
|
+
# is twice the width of a "narrow" item.
|
54
56
|
#
|
55
57
|
# The "width" method will tell you the total end-to-end width, in
|
56
58
|
# units, of the entire barcode.
|
57
59
|
#
|
58
|
-
|
60
|
+
# == Rendering
|
59
61
|
#
|
60
62
|
# The standard w/n ratio seems to be 2:1. There seem to be no real
|
61
63
|
# standards for display.
|
@@ -81,6 +83,7 @@ module Barcode1DTools
|
|
81
83
|
'-'=> {'val'=>10 ,'wn'=>'nnwnn'}
|
82
84
|
}
|
83
85
|
|
86
|
+
# Guard pattern for Code 11
|
84
87
|
GUARD_PATTERN_WN = 'nnwwn'
|
85
88
|
|
86
89
|
DEFAULT_OPTIONS = {
|
@@ -91,14 +94,16 @@ module Barcode1DTools
|
|
91
94
|
:wn_ratio => '2'
|
92
95
|
}
|
93
96
|
|
94
|
-
attr_reader :start_character, :stop_character, :payload
|
95
|
-
|
96
97
|
class << self
|
98
|
+
# Returns true if the value presented can be encoded in Code 11.
|
97
99
|
# Code11 can encode digits and dashes.
|
98
100
|
def can_encode?(value)
|
99
101
|
value.to_s =~ /\A[0-9\-]+\z/
|
100
102
|
end
|
101
103
|
|
104
|
+
# Generates a check digit for the given value. Note that Code 11
|
105
|
+
# barcodes may have two check digits if the size of the value is
|
106
|
+
# 10 or more characters.
|
102
107
|
def generate_check_digit_for(value)
|
103
108
|
mult = 0
|
104
109
|
sum_c = value.to_s.reverse.split('').inject(0) { |a,c| mult = (mult == 11 ? 1 : mult + 1); a + mult * PATTERNS[c]['val'] }
|
@@ -113,11 +118,16 @@ module Barcode1DTools
|
|
113
118
|
"#{check_c}#{check_k}"
|
114
119
|
end
|
115
120
|
|
121
|
+
# Returns true if the given check digit(s) is correct.
|
122
|
+
# The check digit is the last one or two characters of
|
123
|
+
# the value that is passed.
|
116
124
|
def validate_check_digit_for(value)
|
117
125
|
payload, check_digits = split_payload_and_check_digits(value)
|
118
126
|
self.generate_check_digit_for(payload) == check_digits
|
119
127
|
end
|
120
128
|
|
129
|
+
# Split the given value into a payload and check digit or
|
130
|
+
# digits.
|
121
131
|
def split_payload_and_check_digits(value)
|
122
132
|
if value.to_s.size > 11
|
123
133
|
# two check digits
|
@@ -180,6 +190,7 @@ module Barcode1DTools
|
|
180
190
|
|
181
191
|
end
|
182
192
|
|
193
|
+
# Create a new Code 11 object with a value.
|
183
194
|
# Options are :line_character, :space_character, :w_character,
|
184
195
|
# :n_character, :checksum_included, and :skip_checksum.
|
185
196
|
def initialize(value, options = {})
|
@@ -211,17 +222,17 @@ module Barcode1DTools
|
|
211
222
|
@wn ||= wn_str.tr('wn', @options[:w_character].to_s + @options[:n_character].to_s)
|
212
223
|
end
|
213
224
|
|
214
|
-
#
|
225
|
+
# Returns a run-length-encoded string representation
|
215
226
|
def rle
|
216
227
|
@rle ||= self.class.wn_to_rle(self.wn, @options)
|
217
228
|
end
|
218
229
|
|
219
|
-
#
|
230
|
+
# Returns the bar/space pattern as 1s and 0s.
|
220
231
|
def bars
|
221
232
|
@bars ||= self.class.rle_to_bars(self.rle, @options)
|
222
233
|
end
|
223
234
|
|
224
|
-
#
|
235
|
+
# Returns the total unit width of the bar code
|
225
236
|
def width
|
226
237
|
@width ||= rle.split('').inject(0) { |a,c| a + c.to_i }
|
227
238
|
end
|