1
2
3
4
5
6
7
8
9
10
11 import re
12
13 from barcodegenerator import BarcodeGenerator
14
16
18 '''
19 Code 128 için gerekli ön tanımlamaları yapar.
20 '''
21 BarcodeGenerator.__init__(self)
22
23 self._encodeMap = ['11011001100', '11001101100', '11001100110', '10010011000', '10010001100', '10001001100',
24 '10011001000', '10011000100', '10001100100', '11001001000', '11001000100', '11000100100',
25 '10110011100', '10011011100', '10011001110', '10111001100', '10011101100', '10011100110',
26 '11001110010', '11001011100', '11001001110', '11011100100', '11001110100', '11101101110',
27 '11101001100', '11100101100', '11100100110', '11101100100', '11100110100', '11100110010',
28 '11011011000', '11011000110', '11000110110', '10100011000', '10001011000', '10001000110',
29 '10110001000', '10001101000', '10001100010', '11010001000', '11000101000', '11000100010',
30 '10110111000', '10110001110', '10001101110', '10111011000', '10111000110', '10001110110',
31 '11101110110', '11010001110', '11000101110', '11011101000', '11011100010', '11011101110',
32 '11101011000', '11101000110', '11100010110', '11101101000', '11101100010', '11100011010',
33 '11101111010', '11001000010', '11110001010', '10100110000', '10100001100', '10010110000',
34 '10010000110', '10000101100', '10000100110', '10110010000', '10110000100', '10011010000',
35 '10011000010', '10000110100', '10000110010', '11000010010', '11001010000', '11110111010',
36 '11000010100', '10001111010', '10100111100', '10010111100', '10010011110', '10111100100',
37 '10011110100', '10011110010', '11110100100', '11110010100', '11110010010', '11011011110',
38 '11011110110', '11110110110', '10101111000', '10100011110', '10001011110', '10111101000',
39 '10111100010', '11110101000', '11110100010', '10111011110', '10111101110', '11101011110',
40 '11110101110', '11010000100', '11010010000', '11010011100', '11000111010',
41 ]
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 endList = ['FNC3', 'FNC2', 'Shift', 'Code C', 'Code B', 'Code A', 'FNC1', 'Start A', 'Start B', 'Start C', 'Stop', ]
60 commonAB = list(' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_')
61
62 self._setA = commonAB + map(lambda x: chr(x), range(0, 32)) + endList
63 self._setB = commonAB + map(lambda x: chr(x), range(96, 128)) + endList
64 self._setC = map(lambda x: '%02d' % x, range(0, 100)) + endList[4:]
65
66
67 for c in code:
68 if c not in self._setA and c not in self._setB:
69 raise Exception('Hatali barkod kodu')
70
71 self._code = code
72 self._bits = None
73
75 '''
76 Checksum karakterini bulur.
77 '''
78 sum = 0
79
80 for i, position in enumerate(positions):
81
82
83 weight = i if i != 0 else 1
84
85
86 sum += position * weight
87
88 checksum = sum % 103
89
90 return checksum
91
93 '''
94 Barkodun ikili kodlamasını yapar.
95 '''
96 if self._bits is not None:
97 return self._bits
98
99 blocks = []
100
101 charsAndNumbers = re.findall(r'(?:(?:\d\d){2,})|.', self._code, re.DOTALL)
102
103
104 for block in charsAndNumbers:
105
106
107 if re.match(r'^(\d\d)+$', block):
108 blocks.append(('Code C', block))
109
110
111 elif block in self._setB:
112 blocks.append(('Code B', block))
113
114 else:
115 blocks.append(('Code A', block))
116
117
118 positions = [104]
119 lastSetCode = 'Code B'
120 lastSet = self._setB
121 sets = {
122 'Code A': self._setA,
123 'Code B': self._setB,
124 'Code C': self._setC,
125 }
126
127 for setCode, value in blocks:
128
129 if setCode == lastSetCode:
130 positions.append(lastSet.index(value))
131
132 else:
133 positions.append(lastSet.index(setCode))
134
135 lastSetCode = setCode
136 lastSet = sets[setCode]
137
138
139 if setCode == 'Code C':
140 for char in re.findall(r'(\d\d)', value):
141 positions.append(lastSet.index(char))
142
143 else:
144 positions.append(lastSet.index(value))
145
146
147 checksum = self.computeChecksum(positions)
148 positions.append(checksum)
149
150
151 positions.append(106)
152
153
154 bits = []
155
156 for position in positions:
157 bits.append(self._encodeMap[position])
158
159
160 bits.append('11')
161
162 self._bits = "".join(bits)
163
164 return self._bits
165
167 '''
168 Yazılacak rakamların bit olarak yerlerini gösterir.
169 '''
170 start = (len(self._bits) - (7 * len(self._code))) / 2
171
172 locations = range(start, start + (7 * len(self._code)), 7)
173
174 return locations
175
178
181