barcodes 0.0.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.
Files changed (68) hide show
  1. data/.gitignore +5 -0
  2. data/.rspec +2 -0
  3. data/.rvmrc +1 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +22 -0
  6. data/README.md +107 -0
  7. data/Rakefile +11 -0
  8. data/barcodes.gemspec +24 -0
  9. data/bin/barcodes +6 -0
  10. data/lib/barcodes.rb +63 -0
  11. data/lib/barcodes/exec.rb +74 -0
  12. data/lib/barcodes/renderer.rb +9 -0
  13. data/lib/barcodes/renderer/ascii.rb +199 -0
  14. data/lib/barcodes/renderer/pdf.rb +257 -0
  15. data/lib/barcodes/symbology.rb +47 -0
  16. data/lib/barcodes/symbology/base.rb +103 -0
  17. data/lib/barcodes/symbology/codabar.rb +36 -0
  18. data/lib/barcodes/symbology/code11.rb +74 -0
  19. data/lib/barcodes/symbology/code128.rb +317 -0
  20. data/lib/barcodes/symbology/code39.rb +48 -0
  21. data/lib/barcodes/symbology/code39extended.rb +93 -0
  22. data/lib/barcodes/symbology/code39extendedmod43.rb +73 -0
  23. data/lib/barcodes/symbology/code39mod43.rb +73 -0
  24. data/lib/barcodes/symbology/code93.rb +142 -0
  25. data/lib/barcodes/symbology/code93extended.rb +116 -0
  26. data/lib/barcodes/symbology/ean.rb +149 -0
  27. data/lib/barcodes/symbology/ean13.rb +27 -0
  28. data/lib/barcodes/symbology/ean8.rb +50 -0
  29. data/lib/barcodes/symbology/interleaved2of5.rb +30 -0
  30. data/lib/barcodes/symbology/interleaved2of5mod10.rb +40 -0
  31. data/lib/barcodes/symbology/msi.rb +30 -0
  32. data/lib/barcodes/symbology/msimod10.rb +50 -0
  33. data/lib/barcodes/symbology/msimod11.rb +37 -0
  34. data/lib/barcodes/symbology/planet.rb +83 -0
  35. data/lib/barcodes/symbology/postnet.rb +83 -0
  36. data/lib/barcodes/symbology/standard2of5.rb +30 -0
  37. data/lib/barcodes/symbology/standard2of5mod10.rb +40 -0
  38. data/lib/barcodes/symbology/upca.rb +27 -0
  39. data/lib/barcodes/version.rb +3 -0
  40. data/spec/barcodes/exec_spec.rb +14 -0
  41. data/spec/barcodes/renderer/ascii_spec.rb +12 -0
  42. data/spec/barcodes/renderer/pdf_spec.rb +12 -0
  43. data/spec/barcodes/symbology/base_spec.rb +8 -0
  44. data/spec/barcodes/symbology/codabar_spec.rb +8 -0
  45. data/spec/barcodes/symbology/code11_spec.rb +8 -0
  46. data/spec/barcodes/symbology/code128_spec.rb +8 -0
  47. data/spec/barcodes/symbology/code39_spec.rb +8 -0
  48. data/spec/barcodes/symbology/code39extended_spec.rb +8 -0
  49. data/spec/barcodes/symbology/code39extendedmod43_spec.rb +8 -0
  50. data/spec/barcodes/symbology/code39mod43_spec.rb +8 -0
  51. data/spec/barcodes/symbology/code93_spec.rb +8 -0
  52. data/spec/barcodes/symbology/code93extended_spec.rb +8 -0
  53. data/spec/barcodes/symbology/ean13_spec.rb +8 -0
  54. data/spec/barcodes/symbology/ean8_spec.rb +8 -0
  55. data/spec/barcodes/symbology/ean_spec.rb +8 -0
  56. data/spec/barcodes/symbology/interleaved2of5_spec.rb +8 -0
  57. data/spec/barcodes/symbology/interleaved2of5mod10_spec.rb +8 -0
  58. data/spec/barcodes/symbology/msi_spec.rb +8 -0
  59. data/spec/barcodes/symbology/msimod10_spec.rb +8 -0
  60. data/spec/barcodes/symbology/msimod11_spec.rb +8 -0
  61. data/spec/barcodes/symbology/planet_spec.rb +8 -0
  62. data/spec/barcodes/symbology/postnet_spec.rb +8 -0
  63. data/spec/barcodes/symbology/standard2of5_spec.rb +8 -0
  64. data/spec/barcodes/symbology/standard2of5mod10_spec.rb +8 -0
  65. data/spec/barcodes/symbology/upca_spec.rb +8 -0
  66. data/spec/barcodes_spec.rb +27 -0
  67. data/spec/spec_helper.rb +17 -0
  68. metadata +174 -0
@@ -0,0 +1,73 @@
1
+ require 'barcodes/symbology/code39extended'
2
+
3
+ module Barcodes
4
+ module Symbology
5
+ class Code39ExtendedMod43 < Code39Extended
6
+ def caption_data
7
+ @start_character + @data + @stop_character
8
+ end
9
+
10
+ def formatted_data
11
+ checksum = self.checksum
12
+ unless checksum.nil?
13
+ @start_character + @data + checksum + @stop_character
14
+ end
15
+ end
16
+
17
+ def checksum
18
+ if valid?
19
+ sum = 0
20
+ self.data.each_char do |char|
21
+ if ('0'..'9').include? char
22
+ sum += char.to_i
23
+ elsif ('A'..'Z').include? char
24
+ sum += ('A'..'Z').to_a.index(char) + 10
25
+ else
26
+ case char
27
+ when '-'
28
+ sum += 36
29
+ when '.'
30
+ sum += 37
31
+ when ' '
32
+ sum += 38
33
+ when '$'
34
+ sum += 39
35
+ when '/'
36
+ sum += 40
37
+ when '+'
38
+ sum += 41
39
+ when '%'
40
+ sum += 42
41
+ end
42
+ end
43
+ end
44
+
45
+ value = sum % 43
46
+
47
+ if (0..9).include? value
48
+ return value.to_s
49
+ elsif value >= 10 && value < 36
50
+ return ('A'..'Z').to_a.fetch(value - 10)
51
+ else
52
+ case value
53
+ when 36
54
+ return '-'
55
+ when 37
56
+ return '.'
57
+ when 38
58
+ return ' '
59
+ when 39
60
+ return '$'
61
+ when 40
62
+ return '/'
63
+ when 41
64
+ return '+'
65
+ when 42
66
+ return '%'
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,73 @@
1
+ require 'barcodes/symbology/code39'
2
+
3
+ module Barcodes
4
+ module Symbology
5
+ class Code39Mod43 < Code39
6
+ def caption_data
7
+ @start_character + @data + @stop_character
8
+ end
9
+
10
+ def formatted_data
11
+ checksum = self.checksum
12
+ unless checksum.nil?
13
+ @start_character + @data + checksum + @stop_character
14
+ end
15
+ end
16
+
17
+ def checksum
18
+ if self.valid?
19
+ sum = 0
20
+ self.data.each_char do |char|
21
+ if ('0'..'9').include? char
22
+ sum += char.to_i
23
+ elsif ('A'..'Z').include? char
24
+ sum += ('A'..'Z').to_a.index(char) + 10
25
+ else
26
+ case char
27
+ when '-'
28
+ sum += 36
29
+ when '.'
30
+ sum += 37
31
+ when ' '
32
+ sum += 38
33
+ when '$'
34
+ sum += 39
35
+ when '/'
36
+ sum += 40
37
+ when '+'
38
+ sum += 41
39
+ when '%'
40
+ sum += 42
41
+ end
42
+ end
43
+ end
44
+
45
+ value = sum % 43
46
+
47
+ if (0..9).include? value
48
+ return value.to_s
49
+ elsif value >= 10 && value < 36
50
+ return ('A'..'Z').to_a.fetch(value - 10)
51
+ else
52
+ case value
53
+ when 36
54
+ return '-'
55
+ when 37
56
+ return '.'
57
+ when 38
58
+ return ' '
59
+ when 39
60
+ return '$'
61
+ when 40
62
+ return '/'
63
+ when 41
64
+ return '+'
65
+ when 42
66
+ return '%'
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,142 @@
1
+ require 'barcodes/symbology/base'
2
+
3
+ module Barcodes
4
+ module Symbology
5
+ class Code93 < Base
6
+ def self.charset
7
+ [
8
+ "0","1","2","3","4","5","6","7","8","9",
9
+ "A","B","C","D","E","F","G","H","I","J",
10
+ "K","L","M","N","O","P","Q","R","S","T",
11
+ "U","V","W","X","Y","Z","-","."," ","$",
12
+ "/","+","%","*","\xFC","\xFD","\xFE","\xFF"
13
+ ].collect {|c| c.bytes.to_a[0] }
14
+ end
15
+
16
+ def self.valueset
17
+ [
18
+ "100010100","101001000","101000100","101000010",
19
+ "100101000","100100100","100100010","101010000",
20
+ "100010010","100001010","110101000","110100100",
21
+ "110100010","110010100","110010010","110001010",
22
+ "101101000","101100100","101100010","100110100",
23
+ "100011010","101011000","101001100","101000110",
24
+ "100101100","100010110","110110100","110110010",
25
+ "110101100","110100110","110010110","110011010",
26
+ "101101100","101100110","100110110","100111010",
27
+ "100101110","111010100","111010010","111001010",
28
+ "101101110","101110110","110101110","101011110",
29
+ "100100110","111011010","111010110","100110010"
30
+ ]
31
+ end
32
+
33
+ def initialize(args={})
34
+ super(args)
35
+
36
+ @start_character = '*'
37
+ @stop_character = '*'
38
+ end
39
+
40
+ def caption_data
41
+ @start_character + @data + @stop_character
42
+ end
43
+
44
+ def formatted_data
45
+ checksum = self.checksum
46
+ unless checksum.nil?
47
+ @start_character + @data + checksum + @stop_character
48
+ end
49
+ end
50
+
51
+ def checksum
52
+ if self.valid?
53
+ c_value = self._checksum(@data, 20)
54
+ k_value = self._checksum(@data + c_value, 15)
55
+ return c_value + k_value
56
+ end
57
+ end
58
+
59
+ protected
60
+
61
+ def _checksum(data, weight_max)
62
+ sum = 0
63
+ weight = 1
64
+ data.reverse.each_byte do |char|
65
+ if char == 255 || char == 254 || char == 253 || char == 252
66
+ case char
67
+ when 252
68
+ sum += 43
69
+ when 253
70
+ sum += 44
71
+ when 254
72
+ sum += 45
73
+ when 255
74
+ sum += 46
75
+ end
76
+ else
77
+ if ('0'..'9').include? char.chr
78
+ sum += weight * char.chr.to_i
79
+ elsif ('A'..'Z').include? char.chr
80
+ sum += ('A'..'Z').to_a.index(char.chr) + 10
81
+ else
82
+ case char.chr
83
+ when '-'
84
+ sum += 36
85
+ when '.'
86
+ sum += 37
87
+ when ' '
88
+ sum += 38
89
+ when '$'
90
+ sum += 39
91
+ when '/'
92
+ sum += 40
93
+ when '+'
94
+ sum += 41
95
+ when '%'
96
+ sum += 42
97
+ end
98
+ end
99
+ end
100
+ if weight <= weight_max
101
+ weight += 1
102
+ else
103
+ weight = 1
104
+ end
105
+ end
106
+
107
+ value = sum % 47
108
+
109
+ if (0..9).include? value
110
+ return value.to_s
111
+ elsif value >= 10 && value < 36
112
+ return ('A'..'Z').to_a.fetch(value - 10)
113
+ else
114
+ case value
115
+ when 36
116
+ return '-'
117
+ when 37
118
+ return '.'
119
+ when 38
120
+ return ' '
121
+ when 39
122
+ return '$'
123
+ when 40
124
+ return '/'
125
+ when 41
126
+ return '+'
127
+ when 42
128
+ return '%'
129
+ when 43
130
+ return "\xFC"
131
+ when 44
132
+ return "\xFD"
133
+ when 45
134
+ return "\xFE"
135
+ when 46
136
+ return "\xFF"
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,116 @@
1
+ require 'barcodes/symbology/code93'
2
+
3
+ module Barcodes
4
+ module Symbology
5
+ class Code93Extended < Code93
6
+
7
+ def formatted_data
8
+ checksum = self.checksum
9
+ unless checksum.nil?
10
+ @start_character + self._data + checksum + @stop_character
11
+ end
12
+ end
13
+
14
+ def checksum
15
+ if self.valid?
16
+ data = self._data
17
+ c_value = self._checksum(data, 20)
18
+ k_value = self._checksum(data + c_value, 15)
19
+ return c_value + k_value
20
+ end
21
+ end
22
+
23
+ def valid?
24
+ return !self._data.nil?
25
+ end
26
+
27
+ protected
28
+
29
+ def _data
30
+ _data = ''
31
+ self.data.each_byte do |char|
32
+ unless self._encode_character(char).nil?
33
+ _data += char.chr
34
+ else
35
+ case char
36
+ when 0
37
+ _data += "\xFD" + "U"
38
+ when 1..26
39
+ _data += "\xFC" + (char + 64).chr
40
+ when 27..31
41
+ _data += "\xFD" + (char + 38).chr
42
+ when 127
43
+ _data += "\xFD" + "T"
44
+ when '!'.bytes.to_a[0]
45
+ _data += "\xFE" + "A"
46
+ when '"'.bytes.to_a[0]
47
+ _data += "\xFE" + "B"
48
+ when '#'.bytes.to_a[0]
49
+ _data += "\xFE" + "C"
50
+ when '$'.bytes.to_a[0]
51
+ _data += "\xFE" + "D"
52
+ when '%'.bytes.to_a[0]
53
+ _data += "\xFE" + "E"
54
+ when '&'.bytes.to_a[0]
55
+ _data += "\xFE" + "F"
56
+ when '\''.bytes.to_a[0]
57
+ _data += "\xFE" + "G"
58
+ when '('.bytes.to_a[0]
59
+ _data += "\xFE" + "H"
60
+ when ')'.bytes.to_a[0]
61
+ _data += "\xFE" + "I"
62
+ when '*'.bytes.to_a[0]
63
+ _data += "\xFE" + "J"
64
+ when '+'.bytes.to_a[0]
65
+ _data += "\xFE" + "K"
66
+ when ','.bytes.to_a[0]
67
+ _data += "\xFE" + "L"
68
+ when '/'.bytes.to_a[0]
69
+ _data += "\xFE" + "O"
70
+ when ':'.bytes.to_a[0]
71
+ _data += "\xFE" + "Z"
72
+ when ';'.bytes.to_a[0]
73
+ _data += "\xFD" + "F"
74
+ when '<'.bytes.to_a[0]
75
+ _data += "\xFD" + "G"
76
+ when '='.bytes.to_a[0]
77
+ _data += "\xFD" + "H"
78
+ when '>'.bytes.to_a[0]
79
+ _data += "\xFD" + "I"
80
+ when '?'.bytes.to_a[0]
81
+ _data += "\xFD" + "J"
82
+ when '@'.bytes.to_a[0]
83
+ _data += "\xFD" + "V"
84
+ when '['.bytes.to_a[0]
85
+ _data += "\xFD" + "K"
86
+ when '\\'.bytes.to_a[0]
87
+ _data += "\xFD" + "L"
88
+ when ']'.bytes.to_a[0]
89
+ _data += "\xFD" + "M"
90
+ when '^'.bytes.to_a[0]
91
+ _data += "\xFD" + "N"
92
+ when '_'.bytes.to_a[0]
93
+ _data += "\xFD" + "0"
94
+ when '`'.bytes.to_a[0]
95
+ _data += "\xFD" + "W"
96
+ when 97..122
97
+ _data += "\xFF" + char.chr.upcase
98
+ when '{'.bytes.to_a[0]
99
+ _data += "\xFD" + "P"
100
+ when '|'.bytes.to_a[0]
101
+ _data += "\xFD" + "Q"
102
+ when '}'.bytes.to_a[0]
103
+ _data += "\xFD" + "R"
104
+ when '~'.bytes.to_a[0]
105
+ _data += "\xFD" + "S"
106
+ else
107
+ return nil
108
+ end
109
+ end
110
+ end
111
+
112
+ return _data
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,149 @@
1
+ require 'barcodes/symbology/base'
2
+
3
+ module Barcodes
4
+ module Symbology
5
+ class Ean < Base
6
+ def self.charset
7
+ ['0','1','2','3','4','5','6','7','8','9','S','C'].collect {|c| c.bytes.to_a[0] }
8
+ end
9
+
10
+ def self.parity
11
+ [
12
+ "000000", "001011", "001101", "001110",
13
+ "010011", "011001", "011100", "010101",
14
+ "010110", "011010"
15
+ ]
16
+ end
17
+
18
+ def self.left_hand_even
19
+ [
20
+ "0001101", "0011001", "0010011", "0111101",
21
+ "0100011", "0110001", "0101111", "0111011",
22
+ "0110111", "0001011"
23
+ ]
24
+ end
25
+
26
+ def self.left_hand_odd
27
+ [
28
+ "0100111", "0110011", "0011011", "0100001",
29
+ "0011101", "0111001", "0000101", "0010001",
30
+ "0001001", "0010111"
31
+ ]
32
+ end
33
+
34
+ def self.right_hand
35
+ [
36
+ "1110010", "1100110", "1101100", "1000010",
37
+ "1011100", "1001110", "1010000", "1000100",
38
+ "1001000", "1110100"
39
+ ]
40
+ end
41
+
42
+ def self.valueset
43
+ []
44
+ end
45
+
46
+ def initialize(args={})
47
+ super(args)
48
+
49
+ @start_character = 'S'
50
+ @stop_character = 'S'
51
+ @center_character = 'C'
52
+ end
53
+
54
+ def caption_data
55
+ @data + self.checksum
56
+ end
57
+
58
+ def encoded_data
59
+ if self.valid?
60
+ formatted_data = self.formatted_data
61
+ encoded_data = ""
62
+ parity = nil
63
+ index = 0
64
+ formatted_data.each_byte do |char|
65
+ if char.chr == 'S'
66
+ encoded_data += "101"
67
+ elsif char.chr == 'C'
68
+ encoded_data += "01010"
69
+ else
70
+ if index < 9
71
+ unless parity.nil?
72
+ encoded_data += self._encode_character_with_parity(char, parity[index - 2])
73
+ else
74
+ parity = self.class.parity.at(self.class.charset.index(char))
75
+ end
76
+ else
77
+ encoded_data += self._encode_character_with_right_hand(char)
78
+ end
79
+ end
80
+ index += 1
81
+ end
82
+ encoded_data
83
+ end
84
+ end
85
+
86
+ def quiet_zone_width
87
+ self.bar_width * 9
88
+ end
89
+
90
+ def checksum
91
+ if self.valid?
92
+ sum = 0
93
+ index = 1
94
+ @data.reverse.each_char do |char|
95
+ if ('0'..'9').include? char
96
+ if index.even?
97
+ sum += char.to_i
98
+ else
99
+ sum += char.to_i * 3
100
+ end
101
+ end
102
+ index += 1
103
+ end
104
+
105
+ value = 10 - (sum % 10)
106
+
107
+ return value.to_s
108
+ end
109
+ end
110
+
111
+ def valid?
112
+ self.data.each_byte do |char|
113
+ if char.chr == 'S' || char.chr == 'C'
114
+ return false
115
+ end
116
+ unless self.class.charset.include? char
117
+ return false
118
+ end
119
+ end
120
+ end
121
+
122
+ protected
123
+
124
+ def _encode_character_with_parity(character, parity)
125
+ if self.class.charset.include? character
126
+ if parity.to_i.even?
127
+ self.class.left_hand_even.at(self.class.charset.index(character))
128
+ else
129
+ self.class.left_hand_odd.at(self.class.charset.index(character))
130
+ end
131
+ else
132
+ return nil
133
+ end
134
+ end
135
+
136
+ def _encode_character_with_right_hand(character)
137
+ if self.class.charset.include? character
138
+ self.class.right_hand.at(self.class.charset.index(character))
139
+ else
140
+ return nil
141
+ end
142
+ end
143
+
144
+ def _encode_character(character)
145
+ nil
146
+ end
147
+ end
148
+ end
149
+ end