An iterator returning QRData chunks optimized to the data content. :param minimum: The minimum number of bytes in a row to split as a chunk.
(data, minimum=4)
| 352 | |
| 353 | |
| 354 | def optimal_data_chunks(data, minimum=4): |
| 355 | """ |
| 356 | An iterator returning QRData chunks optimized to the data content. |
| 357 | |
| 358 | :param minimum: The minimum number of bytes in a row to split as a chunk. |
| 359 | """ |
| 360 | data = to_bytestring(data) |
| 361 | num_pattern = rb"\d" |
| 362 | alpha_pattern = b"[" + re.escape(ALPHA_NUM) + b"]" |
| 363 | if len(data) <= minimum: |
| 364 | num_pattern = re.compile(b"^" + num_pattern + b"+$") |
| 365 | alpha_pattern = re.compile(b"^" + alpha_pattern + b"+$") |
| 366 | else: |
| 367 | re_repeat = b"{" + str(minimum).encode("ascii") + b",}" |
| 368 | num_pattern = re.compile(num_pattern + re_repeat) |
| 369 | alpha_pattern = re.compile(alpha_pattern + re_repeat) |
| 370 | num_bits = _optimal_split(data, num_pattern) |
| 371 | for is_num, chunk in num_bits: |
| 372 | if is_num: |
| 373 | yield QRData(chunk, mode=MODE_NUMBER, check_data=False) |
| 374 | else: |
| 375 | for is_alpha, sub_chunk in _optimal_split(chunk, alpha_pattern): |
| 376 | mode = MODE_ALPHA_NUM if is_alpha else MODE_8BIT_BYTE |
| 377 | yield QRData(sub_chunk, mode=mode, check_data=False) |
| 378 | |
| 379 | |
| 380 | def _optimal_split(data, pattern): |
nothing calls this directly
no test coverage detected