This commit is contained in:
Mauricio Baeza 2019-09-16 10:53:30 -05:00
parent 2621f934e2
commit c974c52bad
1 changed files with 27 additions and 24 deletions

View File

@ -1,8 +1,8 @@
import re import re
import math import math
import six # ~ import six
from six.moves import xrange # ~ from six.moves import xrange
from qrcode import base, exceptions, LUT from qrcode import base, exceptions, LUT
@ -32,8 +32,10 @@ MODE_SIZE_LARGE = {
MODE_KANJI: 12, MODE_KANJI: 12,
} }
ALPHA_NUM = six.b('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:')
RE_ALPHA_NUM = re.compile(six.b('^[') + re.escape(ALPHA_NUM) + six.b(r']*\Z')) ALPHA_NUM = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'.encode("latin-1")
RE_ALPHA_NUM = re.compile('^['.encode("latin-1") + re.escape(ALPHA_NUM) + r']*\Z'.encode("latin-1"))
# The number of bits for numeric delimited data lengths. # The number of bits for numeric delimited data lengths.
NUMBER_LENGTH = {3: 10, 2: 7, 1: 4} NUMBER_LENGTH = {3: 10, 2: 7, 1: 4}
@ -96,8 +98,8 @@ PAD1 = 0x11
_data_count = lambda block: block.data_count _data_count = lambda block: block.data_count
BIT_LIMIT_TABLE = [ BIT_LIMIT_TABLE = [
[0] + [8*sum(map(_data_count, base.rs_blocks(version, error_correction))) [0] + [8*sum(map(_data_count, base.rs_blocks(version, error_correction)))
for version in xrange(1, 41)] for version in range(1, 41)]
for error_correction in xrange(4) for error_correction in range(4)
] ]
@ -192,7 +194,7 @@ def lost_point(modules):
def _lost_point_level1(modules, modules_count): def _lost_point_level1(modules, modules_count):
lost_point = 0 lost_point = 0
modules_range = xrange(modules_count) modules_range = range(modules_count)
container = [0] * (modules_count + 1) container = [0] * (modules_count + 1)
for row in modules_range: for row in modules_range:
@ -225,7 +227,7 @@ def _lost_point_level1(modules, modules_count):
container[length] += 1 container[length] += 1
lost_point += sum(container[each_length] * (each_length - 2) lost_point += sum(container[each_length] * (each_length - 2)
for each_length in xrange(5, modules_count + 1)) for each_length in range(5, modules_count + 1))
return lost_point return lost_point
@ -233,7 +235,7 @@ def _lost_point_level1(modules, modules_count):
def _lost_point_level2(modules, modules_count): def _lost_point_level2(modules, modules_count):
lost_point = 0 lost_point = 0
modules_range = xrange(modules_count - 1) modules_range = range(modules_count - 1)
for row in modules_range: for row in modules_range:
this_row = modules[row] this_row = modules[row]
next_row = modules[row + 1] next_row = modules[row + 1]
@ -262,8 +264,8 @@ def _lost_point_level3(modules, modules_count):
# row/column, preceded or followed by light area 4 modules wide. From ISOIEC. # row/column, preceded or followed by light area 4 modules wide. From ISOIEC.
# pattern1: 10111010000 # pattern1: 10111010000
# pattern2: 00001011101 # pattern2: 00001011101
modules_range = xrange(modules_count) modules_range = range(modules_count)
modules_range_short = xrange(modules_count-10) modules_range_short = range(modules_count-10)
lost_point = 0 lost_point = 0
for row in modules_range: for row in modules_range:
@ -348,14 +350,14 @@ def optimal_data_chunks(data, minimum=4):
:param minimum: The minimum number of bytes in a row to split as a chunk. :param minimum: The minimum number of bytes in a row to split as a chunk.
""" """
data = to_bytestring(data) data = to_bytestring(data)
num_pattern = six.b(r'\d') num_pattern = r'\d'.encode("latin-1")
alpha_pattern = six.b('[') + re.escape(ALPHA_NUM) + six.b(']') alpha_pattern = '[').encode("latin-1") + re.escape(ALPHA_NUM) + ']'.encode("latin-1")
if len(data) <= minimum: if len(data) <= minimum:
num_pattern = re.compile(six.b('^') + num_pattern + six.b('+$')) num_pattern = re.compile('^'.encode("latin-1") + num_pattern + '+$'.encode("latin-1"))
alpha_pattern = re.compile(six.b('^') + alpha_pattern + six.b('+$')) alpha_pattern = re.compile('^'.encode("latin-1") + alpha_pattern + '+$'.encode("latin-1"))
else: else:
re_repeat = ( re_repeat = (
six.b('{') + six.text_type(minimum).encode('ascii') + six.b(',}')) '{'.encode("latin-1") + str(minimum).encode('ascii') + ',}'.encode("latin-1"))
num_pattern = re.compile(num_pattern + re_repeat) num_pattern = re.compile(num_pattern + re_repeat)
alpha_pattern = re.compile(alpha_pattern + re_repeat) alpha_pattern = re.compile(alpha_pattern + re_repeat)
num_bits = _optimal_split(data, num_pattern) num_bits = _optimal_split(data, num_pattern)
@ -390,8 +392,8 @@ def to_bytestring(data):
Convert data to a (utf-8 encoded) byte-string if it isn't a byte-string Convert data to a (utf-8 encoded) byte-string if it isn't a byte-string
already. already.
""" """
if not isinstance(data, six.binary_type): if not isinstance(data, bytes):
data = six.text_type(data).encode('utf-8') data = str(data).encode('utf-8')
return data return data
@ -439,12 +441,12 @@ class QRData(object):
def write(self, buffer): def write(self, buffer):
if self.mode == MODE_NUMBER: if self.mode == MODE_NUMBER:
for i in xrange(0, len(self.data), 3): for i in range(0, len(self.data), 3):
chars = self.data[i:i + 3] chars = self.data[i:i + 3]
bit_length = NUMBER_LENGTH[len(chars)] bit_length = NUMBER_LENGTH[len(chars)]
buffer.put(int(chars), bit_length) buffer.put(int(chars), bit_length)
elif self.mode == MODE_ALPHA_NUM: elif self.mode == MODE_ALPHA_NUM:
for i in xrange(0, len(self.data), 2): for i in range(0, len(self.data), 2):
chars = self.data[i:i + 2] chars = self.data[i:i + 2]
if len(chars) > 1: if len(chars) > 1:
buffer.put( buffer.put(
@ -453,12 +455,13 @@ class QRData(object):
else: else:
buffer.put(ALPHA_NUM.find(chars), 6) buffer.put(ALPHA_NUM.find(chars), 6)
else: else:
if six.PY3: # ~ if six.PY3:
# Iterating a bytestring in Python 3 returns an integer, # Iterating a bytestring in Python 3 returns an integer,
# no need to ord(). # no need to ord().
data = self.data # ~ data = self.data
else: # ~ else:
data = [ord(c) for c in self.data] # ~ data = [ord(c) for c in self.data]
data = self.data
for c in data: for c in data:
buffer.put(c, 8) buffer.put(c, 8)