| # |
| # QR Code generator test worker (Python 2, 3) |
| # |
| # This program reads data and encoding parameters from standard input and writes |
| # QR Code bitmaps to standard output. The I/O format is one integer per line. |
| # Run with no command line arguments. The program is intended for automated |
| # batch testing of end-to-end functionality of this QR Code generator library. |
| # |
| # Copyright (c) Project Nayuki. (MIT License) |
| # https://www.nayuki.io/page/qr-code-generator-library |
| # |
| # Permission is hereby granted, free of charge, to any person obtaining a copy of |
| # this software and associated documentation files (the "Software"), to deal in |
| # the Software without restriction, including without limitation the rights to |
| # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of |
| # the Software, and to permit persons to whom the Software is furnished to do so, |
| # subject to the following conditions: |
| # - The above copyright notice and this permission notice shall be included in |
| # all copies or substantial portions of the Software. |
| # - The Software is provided "as is", without warranty of any kind, express or |
| # implied, including but not limited to the warranties of merchantability, |
| # fitness for a particular purpose and noninfringement. In no event shall the |
| # authors or copyright holders be liable for any claim, damages or other |
| # liability, whether in an action of contract, tort or otherwise, arising from, |
| # out of or in connection with the Software or the use or other dealings in the |
| # Software. |
| # |
| |
| from __future__ import print_function |
| import sys |
| import qrcodegen |
| py3 = sys.version_info.major >= 3 |
| |
| |
| def read_int(): |
| return int((input if py3 else raw_input)()) |
| |
| |
| def main(): |
| while True: |
| |
| # Read data or exit |
| length = read_int() |
| if length == -1: |
| break |
| data = [read_int() for _ in range(length)] |
| |
| # Read encoding parameters |
| errcorlvl = read_int() |
| minversion = read_int() |
| maxversion = read_int() |
| mask = read_int() |
| boostecl = read_int() |
| |
| # Make segments for encoding |
| if all((b < 128) for b in data): # Is ASCII |
| segs = qrcodegen.QrSegment.make_segments("".join(chr(b) for b in data)) |
| elif py3: |
| segs = [qrcodegen.QrSegment.make_bytes(bytes(data))] |
| else: |
| segs = [qrcodegen.QrSegment.make_bytes("".join(chr(b) for b in data))] |
| |
| try: # Try to make QR Code symbol |
| qr = qrcodegen.QrCode.encode_segments(segs, ECC_LEVELS[errcorlvl], minversion, maxversion, mask, boostecl != 0) |
| # Print grid of modules |
| print(qr.get_version()) |
| for y in range(qr.get_size()): |
| for x in range(qr.get_size()): |
| print(1 if qr.get_module(x, y) else 0) |
| |
| except ValueError as e: |
| if e.args[0] != "Data too long": |
| raise |
| print(-1) |
| sys.stdout.flush() |
| |
| |
| ECC_LEVELS = ( |
| qrcodegen.QrCode.Ecc.LOW, |
| qrcodegen.QrCode.Ecc.MEDIUM, |
| qrcodegen.QrCode.Ecc.QUARTILE, |
| qrcodegen.QrCode.Ecc.HIGH, |
| ) |
| |
| |
| if __name__ == "__main__": |
| main() |