arena_barby 0.3.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 (49) hide show
  1. data/README +29 -0
  2. data/bin/barby +41 -0
  3. data/lib/barby.rb +17 -0
  4. data/lib/barby/barcode.rb +116 -0
  5. data/lib/barby/barcode/bookland.rb +37 -0
  6. data/lib/barby/barcode/code_128.rb +410 -0
  7. data/lib/barby/barcode/code_25.rb +193 -0
  8. data/lib/barby/barcode/code_25_iata.rb +23 -0
  9. data/lib/barby/barcode/code_25_interleaved.rb +73 -0
  10. data/lib/barby/barcode/code_39.rb +233 -0
  11. data/lib/barby/barcode/code_93.rb +230 -0
  12. data/lib/barby/barcode/ean_13.rb +178 -0
  13. data/lib/barby/barcode/ean_8.rb +32 -0
  14. data/lib/barby/barcode/gs1_128.rb +42 -0
  15. data/lib/barby/barcode/pdf_417.rb +76 -0
  16. data/lib/barby/barcode/qr_code.rb +101 -0
  17. data/lib/barby/outputter.rb +127 -0
  18. data/lib/barby/outputter/ascii_outputter.rb +41 -0
  19. data/lib/barby/outputter/cairo_outputter.rb +185 -0
  20. data/lib/barby/outputter/pdfwriter_outputter.rb +83 -0
  21. data/lib/barby/outputter/png_outputter.rb +97 -0
  22. data/lib/barby/outputter/prawn_outputter.rb +99 -0
  23. data/lib/barby/outputter/rmagick_outputter.rb +126 -0
  24. data/lib/barby/outputter/svg_outputter.rb +225 -0
  25. data/lib/barby/vendor.rb +3 -0
  26. data/lib/barby/version.rb +9 -0
  27. data/vendor/Pdf417lib-java-0.91/lib/Pdf417lib.jar +0 -0
  28. data/vendor/Pdf417lib-java-0.91/lib/Pdf417lib.java +1471 -0
  29. data/vendor/rqrcode/CHANGELOG +29 -0
  30. data/vendor/rqrcode/COPYING +19 -0
  31. data/vendor/rqrcode/README +98 -0
  32. data/vendor/rqrcode/Rakefile +65 -0
  33. data/vendor/rqrcode/lib/rqrcode.rb +13 -0
  34. data/vendor/rqrcode/lib/rqrcode/core_ext.rb +5 -0
  35. data/vendor/rqrcode/lib/rqrcode/core_ext/array.rb +5 -0
  36. data/vendor/rqrcode/lib/rqrcode/core_ext/array/behavior.rb +9 -0
  37. data/vendor/rqrcode/lib/rqrcode/core_ext/integer.rb +5 -0
  38. data/vendor/rqrcode/lib/rqrcode/core_ext/integer/bitwise.rb +11 -0
  39. data/vendor/rqrcode/lib/rqrcode/qrcode.rb +4 -0
  40. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_8bit_byte.rb +37 -0
  41. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_bit_buffer.rb +56 -0
  42. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_code.rb +421 -0
  43. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_math.rb +63 -0
  44. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_polynomial.rb +78 -0
  45. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_rs_block.rb +313 -0
  46. data/vendor/rqrcode/lib/rqrcode/qrcode/qr_util.rb +254 -0
  47. data/vendor/rqrcode/test/runtest.rb +78 -0
  48. data/vendor/rqrcode/test/test_data.rb +21 -0
  49. metadata +114 -0
@@ -0,0 +1,230 @@
1
+ require 'barby/barcode'
2
+
3
+ module Barby
4
+
5
+ class Code93 < Barcode1D
6
+
7
+ SHIFT_DOLLAR = "\301" # ($)
8
+ SHIFT_PERCENT = "\302" # (%)
9
+ SHIFT_SLASH = "\303" # (/)
10
+ SHIFT_PLUS = "\304" # (+)
11
+
12
+ SHIFT_CHARACTERS = [SHIFT_DOLLAR, SHIFT_PERCENT, SHIFT_SLASH, SHIFT_PLUS]
13
+
14
+ ENCODINGS = {
15
+ "0" => "100010100", "1" => "101001000",
16
+ "2" => "101000100", "3" => "101000010",
17
+ "4" => "100101000", "5" => "100100100",
18
+ "6" => "100100010", "7" => "101010000",
19
+ "8" => "100010010", "9" => "100001010",
20
+ "A" => "110101000", "B" => "110100100",
21
+ "C" => "110100010", "D" => "110010100",
22
+ "E" => "110010010", "F" => "110001010",
23
+ "G" => "101101000", "H" => "101100100",
24
+ "I" => "101100010", "J" => "100110100",
25
+ "K" => "100011010", "L" => "101011000",
26
+ "M" => "101001100", "N" => "101000110",
27
+ "O" => "100101100", "P" => "100010110",
28
+ "Q" => "110110100", "R" => "110110010",
29
+ "S" => "110101100", "T" => "110100110",
30
+ "U" => "110010110", "V" => "110011010",
31
+ "W" => "101101100", "X" => "101100110",
32
+ "Y" => "100110110", "Z" => "100111010",
33
+ "-" => "100101110", "." => "111010100",
34
+ " " => "111010010", "$" => "111001010",
35
+ "/" => "101101110", "+" => "101110110",
36
+ "%" => "110101110",
37
+ SHIFT_DOLLAR => "100100110",
38
+ SHIFT_PERCENT => "111011010",
39
+ SHIFT_SLASH => "111010110",
40
+ SHIFT_PLUS => "100110010"
41
+ }
42
+
43
+ EXTENDED_MAPPING = {
44
+ "\000" => "\302U", " " => " ", "@" => "\302V", "`" => "\302W",
45
+ "\001" => "\301A", "!" => "\303A", "A" => "A", "a" => "\304A",
46
+ "\002" => "\301B", '"' => "\303B", "B" => "B", "b" => "\304B",
47
+ "\003" => "\301C", "#" => "\303C", "C" => "C", "c" => "\304C",
48
+ "\004" => "\301D", "$" => "\303D", "D" => "D", "d" => "\304D",
49
+ "\005" => "\301E", "%" => "\303E", "E" => "E", "e" => "\304E",
50
+ "\006" => "\301F", "&" => "\303F", "F" => "F", "f" => "\304F",
51
+ "\007" => "\301G", "'" => "\303G", "G" => "G", "g" => "\304G",
52
+ "\010" => "\301H", "(" => "\303H", "H" => "H", "h" => "\304H",
53
+ "\011" => "\301I", ")" => "\303I", "I" => "I", "i" => "\304I",
54
+ "\012" => "\301J", "*" => "\303J", "J" => "J", "j" => "\304J",
55
+ "\013" => "\301K", "/" => "\303K", "K" => "K", "k" => "\304K",
56
+ "\014" => "\301L", "," => "\303L", "L" => "L", "l" => "\304L",
57
+ "\015" => "\301M", "-" => "-", "M" => "M", "m" => "\304M",
58
+ "\016" => "\301N", "." => ".", "N" => "N", "n" => "\304N",
59
+ "\017" => "\301O", "+" => "\303O", "O" => "O", "o" => "\304O",
60
+ "\020" => "\301P", "0" => "0", "P" => "P", "p" => "\304P",
61
+ "\021" => "\301Q", "1" => "1", "Q" => "Q", "q" => "\304Q",
62
+ "\022" => "\301R", "2" => "2", "R" => "R", "r" => "\304R",
63
+ "\023" => "\301S", "3" => "3", "S" => "S", "s" => "\304S",
64
+ "\024" => "\301T", "4" => "4", "T" => "T", "t" => "\304T",
65
+ "\025" => "\301U", "5" => "5", "U" => "U", "u" => "\304U",
66
+ "\026" => "\301V", "6" => "6", "V" => "V", "v" => "\304V",
67
+ "\027" => "\301W", "7" => "7", "W" => "W", "w" => "\304W",
68
+ "\030" => "\301X", "8" => "8", "X" => "X", "x" => "\304X",
69
+ "\031" => "\301Y", "9" => "9", "Y" => "Y", "y" => "\304Y",
70
+ "\032" => "\301Z", ":" => "\303Z", "Z" => "Z", "z" => "\304Z",
71
+ "\033" => "\302A", ";" => "\302F", "[" => "\302K", "{" => "\302P",
72
+ "\034" => "\302B", "<" => "\302G", "\\" => "\302L", "|" => "\302Q",
73
+ "\035" => "\302C", "=" => "\302H", "]" => "\302M", "}" => "\302R",
74
+ "\036" => "\302D", ">" => "\302I", "^" => "\302N", "~" => "\302S",
75
+ "\037" => "\302E", "?" => "\302J", "_" => "\302O", "\177" => "\302T"
76
+ }
77
+
78
+ EXTENDED_CHARACTERS = EXTENDED_MAPPING.keys - ENCODINGS.keys
79
+
80
+ CHARACTERS = {
81
+ 0 => "0", 1 => "1", 2 => "2", 3 => "3",
82
+ 4 => "4", 5 => "5", 6 => "6", 7 => "7",
83
+ 8 => "8", 9 => "9", 10 => "A", 11 => "B",
84
+ 12 => "C", 13 => "D", 14 => "E", 15 => "F",
85
+ 16 => "G", 17 => "H", 18 => "I", 19 => "J",
86
+ 20 => "K", 21 => "L", 22 => "M", 23 => "N",
87
+ 24 => "O", 25 => "P", 26 => "Q", 27 => "R",
88
+ 28 => "S", 29 => "T", 30 => "U", 31 => "V",
89
+ 32 => "W", 33 => "X", 34 => "Y", 35 => "Z",
90
+ 36 => "-", 37 => ".", 38 => " ", 39 => "$",
91
+ 40 => "/", 41 => "+", 42 => "%",
92
+ 43 => SHIFT_DOLLAR, 44 => SHIFT_PERCENT,
93
+ 45 => SHIFT_SLASH, 46 => SHIFT_PLUS
94
+ }
95
+
96
+ VALUES = CHARACTERS.invert
97
+
98
+ START_ENCODING = '101011110' # *
99
+ STOP_ENCODING = '101011110'
100
+ TERMINATE_ENCODING = '1'
101
+
102
+ attr_accessor :data
103
+
104
+
105
+ def initialize(data)
106
+ self.data = data
107
+ end
108
+
109
+
110
+ def extended?
111
+ raw_characters.any?{|c| EXTENDED_CHARACTERS.include?(c) }
112
+ end
113
+
114
+
115
+ def raw_characters
116
+ data.split(//)
117
+ end
118
+
119
+ def characters
120
+ raw_characters.map{|c| EXTENDED_MAPPING[c].split(//) }.flatten
121
+ end
122
+
123
+ def encoded_characters
124
+ characters.map{|c| ENCODINGS[c] }
125
+ end
126
+ alias character_encodings encoded_characters
127
+
128
+
129
+ def start_encoding
130
+ START_ENCODING
131
+ end
132
+
133
+ #The stop encoding includes the termination bar
134
+ def stop_encoding
135
+ STOP_ENCODING+TERMINATE_ENCODING
136
+ end
137
+
138
+
139
+ def encoding
140
+ start_encoding+data_encoding_with_checksums+stop_encoding
141
+ end
142
+
143
+ def data_encoding
144
+ character_encodings.join
145
+ end
146
+
147
+ def data_encoding_with_checksums
148
+ (character_encodings + checksum_encodings).join
149
+ end
150
+
151
+ def checksum_encodings
152
+ checksum_characters.map{|c| ENCODINGS[c] }
153
+ end
154
+
155
+ def checksum_encoding
156
+ checksum_encodings.join
157
+ end
158
+
159
+
160
+ def checksums
161
+ [c_checksum, k_checksum]
162
+ end
163
+
164
+ def checksum_characters
165
+ checksums.map{|s| CHARACTERS[s] }
166
+ end
167
+
168
+
169
+ #Returns the values used for computing the C checksum
170
+ #in the "right" order (i.e. reversed)
171
+ def checksum_values
172
+ characters.map{|c| VALUES[c] }.reverse
173
+ end
174
+
175
+ #Returns the normal checksum plus the c_checksum
176
+ #This is used for calculating the k_checksum
177
+ def checksum_values_with_c_checksum
178
+ [c_checksum] + checksum_values
179
+ end
180
+
181
+
182
+ #Calculates the C checksum based on checksum_values
183
+ def c_checksum
184
+ sum = 0
185
+ checksum_values.each_with_index do |value, index|
186
+ sum += ((index % 20) + 1) * value
187
+ end
188
+ sum % 47
189
+ end
190
+
191
+ def c_checksum_character
192
+ CHARACTERS[c_checksum]
193
+ end
194
+
195
+ def c_checksum_encoding
196
+ ENCODINGS[c_checksum_character]
197
+ end
198
+
199
+
200
+ #Calculates the K checksum based on checksum_values_with_c_checksum
201
+ def k_checksum
202
+ sum = 0
203
+ checksum_values_with_c_checksum.each_with_index do |value, index|
204
+ sum += ((index % 15) + 1) * value
205
+ end
206
+ sum % 47
207
+ end
208
+
209
+ def k_checksum_character
210
+ CHARACTERS[k_checksum]
211
+ end
212
+
213
+ def k_checksum_encoding
214
+ ENCODINGS[k_checksum_character]
215
+ end
216
+
217
+
218
+ def valid?
219
+ characters.all?{|c| ENCODINGS.include?(c) }
220
+ end
221
+
222
+
223
+ def to_s
224
+ data
225
+ end
226
+
227
+
228
+ end
229
+
230
+ end
@@ -0,0 +1,178 @@
1
+ require 'barby/barcode'
2
+
3
+ module Barby
4
+
5
+ #EAN-13, aka UPC-A, barcodes are the ones you can see at your local
6
+ #supermarket, in your house and, well, everywhere..
7
+ #
8
+ #To use this for a UPC barcode, just add a 0 to the front
9
+ class EAN13 < Barcode1D
10
+
11
+ LEFT_ENCODINGS_ODD = {
12
+ 0 => '0001101', 1 => '0011001', 2 => '0010011',
13
+ 3 => '0111101', 4 => '0100011', 5 => '0110001',
14
+ 6 => '0101111', 7 => '0111011', 8 => '0110111',
15
+ 9 => '0001011'
16
+ }
17
+
18
+ LEFT_ENCODINGS_EVEN = {
19
+ 0 => '0100111', 1 => '0110011', 2 => '0011011',
20
+ 3 => '0100001', 4 => '0011101', 5 => '0111001',
21
+ 6 => '0000101', 7 => '0010001', 8 => '0001001',
22
+ 9 => '0010111'
23
+ }
24
+
25
+ RIGHT_ENCODINGS = {
26
+ 0 => '1110010', 1 => '1100110', 2 => '1101100',
27
+ 3 => '1000010', 4 => '1011100', 5 => '1001110',
28
+ 6 => '1010000', 7 => '1000100', 8 => '1001000',
29
+ 9 => '1110100'
30
+ }
31
+
32
+ #Describes whether the left-hand encoding should use
33
+ #LEFT_ENCODINGS_ODD or LEFT_ENCODINGS_EVEN, based on the
34
+ #first digit in the number system (and the barcode as a whole)
35
+ LEFT_PARITY_MAPS = {
36
+ 0 => [:odd, :odd, :odd, :odd, :odd, :odd], #UPC-A
37
+ 1 => [:odd, :odd, :even, :odd, :even, :even],
38
+ 2 => [:odd, :odd, :even, :even, :odd, :even],
39
+ 3 => [:odd, :odd, :even, :even, :even, :odd],
40
+ 4 => [:odd, :even, :odd, :odd, :even, :even],
41
+ 5 => [:odd, :even, :even, :odd, :odd, :even],
42
+ 6 => [:odd, :even, :even, :even, :odd, :odd],
43
+ 7 => [:odd, :even, :odd, :even, :odd, :even],
44
+ 8 => [:odd, :even, :odd, :even, :even, :odd],
45
+ 9 => [:odd, :even, :even, :odd, :even, :odd]
46
+ }
47
+
48
+ #These are the lines that "stick down" in the graphical representation
49
+ START = '101'
50
+ CENTER = '01010'
51
+ STOP = '101'
52
+
53
+ #EAN-13 barcodes have 12 digits + check digit
54
+ FORMAT = /^\d{12}$/
55
+
56
+ attr_accessor :data
57
+
58
+
59
+ def initialize(data)
60
+ self.data = data
61
+ raise ArgumentError, 'data not valid' unless valid?
62
+ end
63
+
64
+
65
+ def characters
66
+ data.split(//)
67
+ end
68
+
69
+ def numbers
70
+ characters.map{|s| s.to_i }
71
+ end
72
+
73
+ def odd_and_even_numbers
74
+ alternater = false
75
+ numbers.reverse.partition{ alternater = !alternater }
76
+ end
77
+
78
+ #Numbers that are encoded to the left of the center
79
+ #The first digit is not included
80
+ def left_numbers
81
+ numbers[1,6]
82
+ end
83
+
84
+ #Numbers that are encoded to the right of the center
85
+ #The checksum is included here
86
+ def right_numbers
87
+ numbers_with_checksum[7,6]
88
+ end
89
+
90
+ def numbers_with_checksum
91
+ numbers + [checksum]
92
+ end
93
+
94
+
95
+ def data_with_checksum
96
+ data + checksum.to_s
97
+ end
98
+
99
+
100
+ def left_encodings
101
+ left_parity_map.zip(left_numbers).map do |parity,number|
102
+ parity == :odd ? LEFT_ENCODINGS_ODD[number] : LEFT_ENCODINGS_EVEN[number]
103
+ end
104
+ end
105
+
106
+ def right_encodings
107
+ right_numbers.map{|n| RIGHT_ENCODINGS[n] }
108
+ end
109
+
110
+ def left_encoding
111
+ left_encodings.join
112
+ end
113
+
114
+ def right_encoding
115
+ right_encodings.join
116
+ end
117
+
118
+ def encoding
119
+ start_encoding+left_encoding+center_encoding+right_encoding+stop_encoding
120
+ end
121
+
122
+
123
+ #The parities to use for encoding left-hand numbers
124
+ def left_parity_map
125
+ LEFT_PARITY_MAPS[numbers.first]
126
+ end
127
+
128
+
129
+ def weighted_sum
130
+ odds, evens = odd_and_even_numbers
131
+ odds.map!{|n| n * 3 }
132
+ sum = (odds+evens).inject(0){|s,n| s+n }
133
+ end
134
+
135
+ #Mod10
136
+ def checksum
137
+ mod = weighted_sum % 10
138
+ mod.zero? ? 0 : 10-mod
139
+ end
140
+
141
+ def checksum_encoding
142
+ RIGHT_ENCODINGS[checksum]
143
+ end
144
+
145
+
146
+ def valid?
147
+ data =~ FORMAT
148
+ end
149
+
150
+
151
+ def to_s
152
+ data_with_checksum
153
+ end
154
+
155
+
156
+ #Is this a UPC-A barcode?
157
+ #UPC barcodes are EAN codes that start with 0
158
+ def upc?
159
+ numbers.first.zero?
160
+ end
161
+
162
+
163
+ def start_encoding
164
+ START
165
+ end
166
+
167
+ def center_encoding
168
+ CENTER
169
+ end
170
+
171
+ def stop_encoding
172
+ STOP
173
+ end
174
+
175
+
176
+ end
177
+
178
+ end
@@ -0,0 +1,32 @@
1
+ require 'barby/barcode/ean_13'
2
+
3
+ module Barby
4
+
5
+ #EAN-8 is a sub-set of EAN-13, with only 7 (8) digits
6
+ class EAN8 < EAN13
7
+
8
+ FORMAT = /^\d{7}$/
9
+
10
+
11
+ def left_numbers
12
+ numbers[0,4]
13
+ end
14
+
15
+ def right_numbers
16
+ numbers_with_checksum[4,4]
17
+ end
18
+
19
+
20
+ #Left-hand digits are all encoded using odd parity
21
+ def left_parity_map
22
+ [:odd, :odd, :odd, :odd]
23
+ end
24
+
25
+
26
+ def valid?
27
+ data =~ FORMAT
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,42 @@
1
+ require 'barby/barcode/code_128'
2
+
3
+ module Barby
4
+
5
+
6
+ #AKA EAN-128, UCC-128
7
+ class GS1128 < Code128
8
+
9
+ attr_accessor :application_identifier
10
+
11
+ def initialize(data, type, ai)
12
+ self.application_identifier = ai
13
+ super(data, type)
14
+ end
15
+
16
+
17
+ #TODO: Not sure this is entirely right
18
+ def data
19
+ FNC1+application_identifier+super
20
+ end
21
+
22
+ def partial_data
23
+ @data
24
+ end
25
+
26
+ def application_identifier_number
27
+ values[application_identifier]
28
+ end
29
+
30
+ def application_identifier_encoding
31
+ encodings[application_identifier_number]
32
+ end
33
+
34
+ def to_s
35
+ "(#{application_identifier}) #{partial_data}"
36
+ end
37
+
38
+
39
+ end
40
+
41
+
42
+ end