diff options
Diffstat (limited to 'share/extensions/Barcode/BaseEan.py')
| -rw-r--r-- | share/extensions/Barcode/BaseEan.py | 107 |
1 files changed, 59 insertions, 48 deletions
diff --git a/share/extensions/Barcode/BaseEan.py b/share/extensions/Barcode/BaseEan.py index 05c9b1c39..2c3ab0c09 100644 --- a/share/extensions/Barcode/BaseEan.py +++ b/share/extensions/Barcode/BaseEan.py @@ -13,40 +13,39 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA. # """ Some basic common code shared between EAN and UCP generators. """ -from Base import Barcode -import sys +from .Base import Barcode, TEXT_POS_TOP MAPPING = [ # Left side of barcode Family '0' - [ "0001101", "0011001", "0010011", "0111101", "0100011", - "0110001", "0101111", "0111011", "0110111", "0001011" ], + ["0001101", "0011001", "0010011", "0111101", "0100011", + "0110001", "0101111", "0111011", "0110111", "0001011"], # Left side of barcode Family '1' and flipped to right side. - [ "0100111", "0110011", "0011011", "0100001", "0011101", - "0111001", "0000101", "0010001", "0001001", "0010111" ], + ["0100111", "0110011", "0011011", "0100001", "0011101", + "0111001", "0000101", "0010001", "0001001", "0010111"], ] # This chooses which of the two encodings above to use. -FAMILIES = [ '000000', '001011', '001101', '001110', '010011', - '011001', '011100', '010101', '010110', '011010' ] - -GUARD_BAR = '202' -CENTER_BAR = '02020' +FAMILIES = ('000000', '001011', '001101', '001110', '010011', + '011001', '011100', '010101', '010110', '011010') class EanBarcode(Barcode): """Simple base class for all EAN type barcodes""" - length = None lengths = None - checks = [] + length = None + checks = [] + extras = {} + magic = 10 + guard_bar = '202' + center_bar = '02020' def intarray(self, number): """Convert a string of digits into an array of ints""" - return [ int(i) for i in number ] - + return [int(i) for i in number] def encode_interleaved(self, family, number, fams=FAMILIES): """Encode any side of the barcode, interleaved""" @@ -54,27 +53,24 @@ class EanBarcode(Barcode): encset = self.intarray(fams[family]) for i in range(len(number)): thismap = MAPPING[encset[i]] - result.append( thismap[number[i]] ) + result.append(thismap[number[i]]) return result - def encode_right(self, number): """Encode the right side of the barcode, non-interleaved""" result = [] - for n in number: + for num in number: # The right side is always the reverse of the left's family '1' - result.append( MAPPING[1][n][::-1] ) + result.append(MAPPING[1][num][::-1]) return result - def encode_left(self, number): """Encode the left side of the barcode, non-interleaved""" result = [] - for n in number: - result.append( MAPPING[0][n] ) + for num in number: + result.append(MAPPING[0][num]) return result - def space(self, *spacing): """Space out an array of numbers""" result = '' @@ -86,60 +82,75 @@ class EanBarcode(Barcode): result += ' ' * space return result - - def getLengths(self): + def get_lengths(self): """Return a list of acceptable lengths""" if self.length: - return [ self.length ] + return [self.length] return self.lengths[:] - def encode(self, code): """Encode any EAN barcode""" + code = code.replace(' ', '').strip() + if not code.isdigit(): return self.error(code, 'Not a Number, must be digits 0-9 only') - lengths = self.getLengths() + self.checks + lengths = self.get_lengths() + self.checks + # Allow extra barcodes after the first one if len(code) not in lengths: - return self.error(code, 'Wrong size, must be %s digits' % - (', '.join(self.space(lengths)))) + for extra in self.extras: + sep = len(code) - extra + if sep in lengths: + # Generate a barcode along side this one. + self.add_extra_barcode(self.extras[extra], text=code[sep:], + x=self.pos_x + 400 * self.scale, text_pos=TEXT_POS_TOP) + code = code[:sep] + + if len(code) not in lengths: + return self.error(code, 'Wrong size %d, must be %s digits' % + (len(code), ', '.join([str(length) for length in lengths]))) if self.checks: if len(code) not in self.checks: - code = self.appendChecksum(code) - elif not self.verifyChecksum(code): + code = self.append_checksum(code) + elif not self.verify_checksum(code): return self.error(code, 'Checksum failed, omit for new sum') return self._encode(self.intarray(code)) - - def _encode(self, n): + def _encode(self, num): + """ + Write your EAN encoding function, it's passed in an array of int and + it should return a string on 1 and 0 for black and white parts + """ raise NotImplementedError("_encode should be provided by parent EAN") - def enclose(self, left, right=[], guard=GUARD_BAR, center=CENTER_BAR): + def enclose(self, left, right=()): """Standard Enclosure""" - parts = [ guard ] + left + [ center ] + right + [ guard ] - return ''.join( parts ) + parts = [self.guard_bar] + left + parts.append(self.center_bar) + parts += list(right) + [self.guard_bar] + return ''.join(parts) - def getChecksum(self, number, magic=10): + def get_checksum(self, number): """Generate a UPCA/EAN13/EAN8 Checksum""" - weight = [3,1] * len(number) + weight = [3, 1] * len(number) result = 0 # We need to work from left to right so reverse number = number[::-1] # checksum based on first digits. for i in range(len(number)): - result += int(number[i]) * weight[i] + result += int(number[i]) * weight[i] # Modulous result to a single digit checksum - checksum = magic - (result % magic) - if checksum < 0 or checksum >= magic: - return '0' + checksum = self.magic - (result % self.magic) + if checksum < 0 or checksum >= self.magic: + return '0' return str(checksum) - def appendChecksum(self, number): + def append_checksum(self, number): """Apply the checksum to a short number""" - return number + self.getChecksum(number) + return number + self.get_checksum(number) - def verifyChecksum(self, number): + def verify_checksum(self, number): """Verify any checksum""" - return self.getChecksum(number[:-1]) == number[-1] + return self.get_checksum(number[:-1]) == number[-1] |
