arena_barby 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
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