summaryrefslogtreecommitdiffstats
path: root/share/extensions/Barcode/BaseEan.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/Barcode/BaseEan.py')
-rw-r--r--share/extensions/Barcode/BaseEan.py107
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]