1111from .enums .color import Color
1212from .enums .fit_strategy import FitStrategy
1313
14+ import logging
1415
1516class rMQR :
17+ @staticmethod
18+ def _init_logger ():
19+ logger = logging .getLogger (__name__ )
20+ logger .addHandler (logging .NullHandler ())
21+ logger .setLevel (logging .DEBUG )
22+ logger .propagate = True
23+ return logger
24+
25+
1626 @staticmethod
1727 def fit (data ,ecc = ErrorCorrectionLevel .M , fit_strategy = FitStrategy .BALANCED ):
28+ logger = rMQR ._init_logger ()
29+
1830 data_length = ByteEncoder .length (data )
1931 ok_versions = []
2032 determined_width = set ()
2133 determined_height = set ()
2234
35+ logger .debug ("Select rMQR Code version" )
2336 for version_name , qr_version in data_capacities .items ():
2437 if data_length <= qr_version ['capacity' ]['Byte' ][ecc ]:
2538 width , height = qr_version ['width' ], qr_version ['height' ]
@@ -31,7 +44,7 @@ def fit(data,ecc=ErrorCorrectionLevel.M, fit_strategy=FitStrategy.BALANCED):
3144 'width' : width ,
3245 'height' : height ,
3346 })
34- print (f"ok: { version_name } " )
47+ logger . debug (f"ok: { version_name } " )
3548
3649 if len (ok_versions ) == 0 :
3750 raise DataTooLongError ("The data is too long." )
@@ -43,14 +56,16 @@ def fit(data,ecc=ErrorCorrectionLevel.M, fit_strategy=FitStrategy.BALANCED):
4356 elif fit_strategy == FitStrategy .BALANCED :
4457 sort_key = lambda x : x ['height' ] * 9 + x ['width' ]
4558 selected = sorted (ok_versions , key = sort_key )[0 ]
46- print (f"selected: { selected } " )
59+ logger . debug (f"selected: { selected } " )
4760
4861 qr = rMQR (selected ['version' ], ecc )
4962 qr .make (data )
5063 return qr
5164
5265
53- def __init__ (self , version , ecc ):
66+ def __init__ (self , version , ecc , logger = None ):
67+ self ._logger = logger or rMQR ._init_logger ()
68+
5469 if not rMQR .validate_version (version ):
5570 raise IllegalVersionError ("The rMQR version is illegal." )
5671
@@ -96,21 +111,25 @@ def to_list(self):
96111 return [list (map (lambda x : 1 if x == Color .BLACK else 0 , column )) for column in self ._qr ]
97112
98113
99- def dump (self ):
114+ def __str__ (self ):
115+ res = ""
116+
100117 show = {}
101118 show [Color .WHITE ] = "_"
102119 show [Color .BLACK ] = "X"
103120 show [Color .UNDEFINED ] = "?"
104121 show [True ] = "X"
105122 show [False ] = "_"
106- print (f"rMQR Version R{ self ._height } x{ self ._width } :" )
123+
124+ res += f"rMQR Version R{ self ._height } x{ self ._width } :\n "
107125 for i in range (self ._height ):
108126 for j in range (self ._width ):
109127 if self ._qr [i ][j ] in show :
110- print ( show [self ._qr [i ][j ]], end = "" )
128+ res += show [self ._qr [i ][j ]]
111129 else :
112- print (self ._qr [i ][j ], end = "" )
113- print ("" )
130+ res += self ._qr [i ][j ]
131+ res += "\n "
132+ return res
114133
115134
116135 def _put_finder_pattern (self ):
@@ -259,9 +278,6 @@ def _put_data(self, data):
259278 codewords ,
260279 qr_version ['blocks' ][self ._error_correction_level ]
261280 )
262- # print("==============")
263- # print(f"data_codewords_per_block = {data_codewords_per_block}")
264- # print(f"rs_codewords_per_block = {rs_codewords_per_block}")
265281
266282 # データの並び替え
267283 # Data codewords
@@ -271,15 +287,15 @@ def _put_data(self, data):
271287 if i >= len (data_codewords ):
272288 continue
273289 final_codewords .append (data_codewords [i ])
274- print (f"Put QR data codeword { i } : { data_codewords [i ]} " )
290+ self . _logger . debug (f"Put QR data codeword { i } : { data_codewords [i ]} " )
275291
276292 # RS Codewords
277293 for i in range (len (rs_codewords_per_block [- 1 ])):
278294 for rs_codewords in rs_codewords_per_block :
279295 if i >= len (rs_codewords ):
280296 continue
281297 final_codewords .append (rs_codewords [i ])
282- print (f"Put RS data codewords { i } : { rs_codewords [i ]} " )
298+ self . _logger . debug (f"Put RS data codewords { i } : { rs_codewords [i ]} " )
283299
284300 # 配置
285301 dy = - 1 # 最初は上方向
@@ -292,7 +308,6 @@ def _put_data(self, data):
292308 while True :
293309 for x in [cx , cx - 1 ]:
294310 if self ._qr [cy ][x ] == Color .UNDEFINED :
295- # print(f"(x, y) = ({x}, {cy}), dir = {dy}, codewords[{current_codeword_idx}][{current_bit_idx}] = {final_codewords[current_codeword_idx][current_bit_idx]}")
296311 # 空白のセルのみ処理する
297312 if current_codeword_idx == len (final_codewords ):
298313 # codewordsを配置しきった場合はremainder_bitsがあれば配置する
@@ -303,7 +318,6 @@ def _put_data(self, data):
303318 # codewordsを配置する
304319 self ._qr [cy ][x ] = Color .BLACK if final_codewords [current_codeword_idx ][current_bit_idx ] == '1' else Color .WHITE
305320 mask_area [cy ][x ] = True
306- # qr[cy][x] = chr(ord('A') + current_codeword_idx)
307321 current_bit_idx += 1
308322 if current_bit_idx == 8 :
309323 current_bit_idx = 0
@@ -340,10 +354,6 @@ def _split_into_blocks(self, codewords, blocks_definition):
340354 rs_codewords_num = block_definition ['c' ] - block_definition ['k' ]
341355 g = GeneratorPolynomials [rs_codewords_num ]
342356
343- # print('----------')
344- # print(f"D{data_idx} to D{data_idx + data_codewords_num - 1}")
345- # print(f"E{error_idx} to D{error_idx + rs_codewords_num - 1}")
346-
347357 codewords_in_block = codewords [data_idx : data_idx + data_codewords_num ]
348358 rs_codewords_in_block = compute_reed_solomon (codewords_in_block , g , rs_codewords_num )
349359
@@ -353,8 +363,6 @@ def _split_into_blocks(self, codewords, blocks_definition):
353363 data_idx += data_codewords_num
354364 error_idx += rs_codewords_num
355365
356- # print(f"codewords in block = {codewords_in_block}, len = {len(codewords_in_block)}")
357- # print(f"rs_codewords in block = {rs_codewords_in_block}, len = {len(rs_codewords_in_block)}")
358366 return data_codewords_per_block , rs_codewords_per_block
359367
360368
@@ -378,7 +386,6 @@ def _apply_mask(self, mask_area):
378386 self ._qr [y ][x ] = Color .WHITE
379387 elif self ._qr [y ][x ] == Color .WHITE :
380388 self ._qr [y ][x ] = Color .BLACK
381- # qr[y][x] = 'B' if mask(x, y) else 'W'
382389
383390
384391 @staticmethod
0 commit comments