chgksuite 0.26.0b9__py3-none-any.whl → 0.26.0b10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
chgksuite/cli.py CHANGED
@@ -72,37 +72,6 @@ class ArgparseBuilder:
72
72
  advanced=True,
73
73
  argtype="filename",
74
74
  )
75
- self.add_argument(
76
- parser,
77
- "--add_ts",
78
- "-ts",
79
- choices=["on", "off"],
80
- default=default_overrides.get("add_ts") or "off",
81
- help="append timestamp to filenames",
82
- caption="Добавить временную отметку в имя файла",
83
- advanced=True,
84
- argtype="radiobutton",
85
- )
86
- self.add_argument(
87
- parser,
88
- "--replace_no_break_spaces",
89
- choices=["on", "off"],
90
- default=default_overrides.get("replace_no_break_spaces") or "on",
91
- help="add non-breaking spaces where applicable",
92
- caption="Добавить неразрывные пробелы",
93
- advanced=True,
94
- argtype="radiobutton",
95
- )
96
- self.add_argument(
97
- parser,
98
- "--replace_no_break_hyphens",
99
- choices=["on", "off"],
100
- default=default_overrides.get("replace_no_break_hyphens") or "on",
101
- help="add non-breaking hyphens where applicable",
102
- caption="Добавить неразрывные дефисы",
103
- advanced=True,
104
- argtype="radiobutton",
105
- )
106
75
  self.add_argument(
107
76
  parser,
108
77
  "-v",
@@ -298,6 +267,47 @@ class ArgparseBuilder:
298
267
  caption="Обработка строчек, состоящих из одного числа",
299
268
  argtype="radiobutton",
300
269
  )
270
+ self.add_argument(
271
+ cmdparse,
272
+ "--tour_numbers_as_words",
273
+ choices=["on", "off"],
274
+ default=default_overrides.get("tour_numbers_as_words") or "off",
275
+ help="force tour numbers as words",
276
+ caption="Номера туров словами",
277
+ advanced=True,
278
+ argtype="radiobutton",
279
+ )
280
+ self.add_argument(
281
+ cmdparse,
282
+ "--add_ts",
283
+ "-ts",
284
+ choices=["on", "off"],
285
+ default=default_overrides.get("add_ts") or "off",
286
+ help="append timestamp to filenames",
287
+ caption="Добавить временную отметку в имя файла",
288
+ advanced=True,
289
+ argtype="radiobutton",
290
+ )
291
+ self.add_argument(
292
+ cmdparse,
293
+ "--replace_no_break_spaces",
294
+ choices=["on", "off"],
295
+ default=default_overrides.get("replace_no_break_spaces") or "on",
296
+ help="add non-breaking spaces where applicable",
297
+ caption="Добавить неразрывные пробелы",
298
+ advanced=True,
299
+ argtype="radiobutton",
300
+ )
301
+ self.add_argument(
302
+ cmdparse,
303
+ "--replace_no_break_hyphens",
304
+ choices=["on", "off"],
305
+ default=default_overrides.get("replace_no_break_hyphens") or "on",
306
+ help="add non-breaking hyphens where applicable",
307
+ caption="Добавить неразрывные дефисы",
308
+ advanced=True,
309
+ argtype="radiobutton",
310
+ )
301
311
 
302
312
  cmdcompose = subparsers.add_parser("compose")
303
313
  self.add_argument(
@@ -334,6 +344,37 @@ class ArgparseBuilder:
334
344
  caption="Client ID для API Imgur",
335
345
  advanced=True,
336
346
  )
347
+ self.add_argument(
348
+ cmdcompose,
349
+ "--add_ts",
350
+ "-ts",
351
+ choices=["on", "off"],
352
+ default=default_overrides.get("add_ts") or "off",
353
+ help="append timestamp to filenames",
354
+ caption="Добавить временную отметку в имя файла",
355
+ advanced=True,
356
+ argtype="radiobutton",
357
+ )
358
+ self.add_argument(
359
+ cmdcompose,
360
+ "--replace_no_break_spaces",
361
+ choices=["on", "off"],
362
+ default=default_overrides.get("replace_no_break_spaces") or "on",
363
+ help="add non-breaking spaces where applicable",
364
+ caption="Добавить неразрывные пробелы",
365
+ advanced=True,
366
+ argtype="radiobutton",
367
+ )
368
+ self.add_argument(
369
+ cmdcompose,
370
+ "--replace_no_break_hyphens",
371
+ choices=["on", "off"],
372
+ default=default_overrides.get("replace_no_break_hyphens") or "on",
373
+ help="add non-breaking hyphens where applicable",
374
+ caption="Добавить неразрывные дефисы",
375
+ advanced=True,
376
+ argtype="radiobutton",
377
+ )
337
378
  cmdcompose_filetype = cmdcompose.add_subparsers(dest="filetype")
338
379
  cmdcompose_docx = cmdcompose_filetype.add_parser("docx")
339
380
  self.add_argument(
@@ -182,9 +182,8 @@ class PptxExporter(BaseExporter):
182
182
  r = self.add_run(
183
183
  p,
184
184
  self._replace_no_break(
185
- ("\n" if add_line_break else "")
185
+ ("\n\n" if add_line_break else "")
186
186
  + self.pptx_process_text(editor[0][1])
187
- + "\n"
188
187
  ),
189
188
  )
190
189
  add_line_break = True
@@ -193,9 +192,8 @@ class PptxExporter(BaseExporter):
193
192
  r = self.add_run(
194
193
  p,
195
194
  self._replace_no_break(
196
- ("\n" if add_line_break else "")
195
+ ("\n\n" if add_line_break else "")
197
196
  + self.pptx_process_text(element[1])
198
- + "\n"
199
197
  ),
200
198
  )
201
199
  add_line_break = True
chgksuite/parser.py CHANGED
@@ -91,6 +91,19 @@ class ChgkParser:
91
91
  BADNEXTFIELDS = set(["question", "answer"])
92
92
  RE_NUM = re.compile("^([0-9]+)\\.?$")
93
93
  RE_NUM_START = re.compile("^([0-9]+)\\.")
94
+ ZERO_PREFIXES = ("Нулевой вопрос", "Разминочный вопрос")
95
+ TOUR_NUMBERS_AS_WORDS = (
96
+ "Первый",
97
+ "Второй",
98
+ "Третий",
99
+ "Четвертый",
100
+ "Пятый",
101
+ "Шестой",
102
+ "Седьмой",
103
+ "Восьмой",
104
+ "Девятый",
105
+ "Десятый",
106
+ )
94
107
 
95
108
  def __init__(self, defaultauthor=None, args=None, logger=None):
96
109
  self.defaultauthor = defaultauthor
@@ -200,7 +213,7 @@ class ChgkParser:
200
213
  @classmethod
201
214
  def _replace(cls, obj, val, new_val):
202
215
  if isinstance(obj, str):
203
- return obj.replace(val, new_val)
216
+ return obj.replace(val, new_val).strip()
204
217
  elif isinstance(obj, list):
205
218
  for i, el in enumerate(obj):
206
219
  obj[i] = cls._replace(el, val, new_val)
@@ -214,6 +227,11 @@ class ChgkParser:
214
227
  for el in val:
215
228
  self._get_strings(el, list_)
216
229
 
230
+ def _get_strings_joined(self, val):
231
+ strings = []
232
+ self._get_strings(val, strings)
233
+ return "\n".join(strings)
234
+
217
235
  def _try_extract_field(self, question, k):
218
236
  regex = self.regexes[k]
219
237
  keys = sorted(question.keys())
@@ -255,14 +273,18 @@ class ChgkParser:
255
273
  and not question["number"].strip()
256
274
  ):
257
275
  question.pop("number")
276
+ question_str = self._get_strings_joined(question["question"])
277
+ for prefix in self.ZERO_PREFIXES:
278
+ if question_str.startswith(prefix):
279
+ question["question"] = self._replace(question["question"], prefix, "")
280
+ question["number"] = 0
281
+ question_str = self._get_strings_joined(question["question"])
258
282
  for k in ("zachet", "nezachet", "source", "comment", "author"):
259
283
  if k not in question:
260
284
  self._try_extract_field(question, k)
261
- strings = []
262
- self._get_strings(question["question"], strings)
263
- strings = "\n".join(strings)
285
+ question_str = self._get_strings_joined(question["question"])
264
286
  handout = self.labels["question_labels"]["handout"]
265
- srch = re.search(f"{handout}:([ \n]+)\\[", strings, flags=re.DOTALL)
287
+ srch = re.search(f"{handout}:([ \n]+)\\[", question_str, flags=re.DOTALL)
266
288
  if srch:
267
289
  question["question"] = self._replace(
268
290
  question["question"],
@@ -608,7 +630,8 @@ class ChgkParser:
608
630
 
609
631
  for element in self.structure:
610
632
  if (
611
- element[0] in set(["number", "tour", "tourrev", "question", "meta", "editor"])
633
+ element[0]
634
+ in set(["number", "tour", "tourrev", "question", "meta", "editor"])
612
635
  and "question" in current_question
613
636
  ):
614
637
  if self.defaultauthor and "author" not in current_question:
@@ -682,9 +705,13 @@ class ChgkParser:
682
705
  except ValueError:
683
706
  pass
684
707
 
708
+ tour_cnt = 0
685
709
  for i, element in enumerate(final_structure):
686
710
  if element[0] == "Question":
687
711
  self.postprocess_question(element[1])
712
+ elif element[0] == "tour" and self.args.tour_numbers_as_words == "on":
713
+ element[1] = f"{self.TOUR_NUMBERS_AS_WORDS[tour_cnt]} тур"
714
+ tour_cnt += 1
688
715
 
689
716
  if debug:
690
717
  with codecs.open("debug_final.json", "w", "utf8") as f:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "tour": "^(#\\s+)?Т[Уу][Рр]\\s?№?\\s?([0-9IVXLCDM]*)([\\.:])?$",
3
- "tourrev": "^([0-9IVXLCDM]+)\\s[Тт][Уу][Рр]([\\.:])?$",
3
+ "tourrev": "^([0-9IVXLCDM]+|[Пп][Ее][Рр][Вв][Ыы][Йй]|[Вв][Тт][Оо][Рр][Оо][Йй]|[Тт][Рр][Ее][Тт][Ии][Йй]|[Чч][Ее][Тт][Вв][Ее][Рр][Тт][Ыы][Йй]|[Пп][Яя][Тт][Ыы][Йй]|[Шш][Ее][Сс][Тт][Оо][Йй]|[Сс][Ее][Дд][Ьь][Мм][Оо][Йй]|[Вв][Оо][Сс][Ьь][Мм][Оо][Йй]|[Дд][Ее][Вв][Яя][Тт][Ыы][Йй]|[Дд][Ее][Сс][Яя][Тт][Ыы][Йй])\\s[Тт][Уу][Рр]([\\.:])?$",
4
4
  "question": "В[Оо][Пп][Рр][Оо][Сс]\\s?[№N]?([0-9\\s]*)\\s?([\\.:]|\n|\r\n|$)",
5
5
  "handout": "^Р[Аа][Зз][Дд][Аа][Тт][Оо][Чч][Нн][Ыы][Йй]\\s+[Мм][Аа][Тт][Ее][Рр][Ии][Аа][Лл][\\.:]",
6
6
  "answer": "О[Тт][Вв][Ее][Тт][Ыы]?\\s?[№N]?([0-9]+)?\\s?[\\.:]",
chgksuite/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "0.26.0b9"
1
+ __version__ = "0.26.0b10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chgksuite
3
- Version: 0.26.0b9
3
+ Version: 0.26.0b10
4
4
  Summary: A package for chgk automation
5
5
  Home-page: https://gitlab.com/peczony/chgksuite
6
6
  Author: Alexander Pecheny
@@ -1,12 +1,12 @@
1
1
  chgksuite/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  chgksuite/__main__.py,sha256=0-_jfloveTW3SZYW5XEagbyaHKGCiDhGNgcLxsT_dMs,140
3
- chgksuite/cli.py,sha256=cEmcqNq8g7WnGH6gDZbI6UdYlvO_09pdwJYQ3CPqTuw,38647
3
+ chgksuite/cli.py,sha256=6mmd_TcGaBykW9tye9km6hp6STNF0LZzlleDRfOh4-o,40276
4
4
  chgksuite/common.py,sha256=VkOhoBA_P3qY5VgtvfrBjOsm5uVNL2s2Th2AhGB2pg8,11207
5
- chgksuite/parser.py,sha256=AVNeTUgv0aGHsxWunV_7bM4Ul2hbDslkzqg0dU49lic,37285
5
+ chgksuite/parser.py,sha256=CXx7p-MZ75BpmgtaO53sq3U9OVR6wAeo0_GntI8pK5M,38360
6
6
  chgksuite/parser_db.py,sha256=W1--OcDnx18mehH1T2ISHu3Saeq-9mqHo-xJopNySXI,11135
7
7
  chgksuite/trello.py,sha256=BG1Qb_W7Uu4o3Mfc_tK71ElU8ysdSplGlj_sAKfvUn4,14730
8
8
  chgksuite/typotools.py,sha256=Jdk65Wn_bXqpQtOT7PkBZyD2ZG1MBeeZFPMzcHEPkf4,12771
9
- chgksuite/version.py,sha256=C-6xTs14tq3HDMe2ISMfTqXFsEkhzVS7RjkCk1PO7Lw,25
9
+ chgksuite/version.py,sha256=a3axD55VIZso4_2Zx6fsyG63nRbiCKIcpl2QMABpnnQ,26
10
10
  chgksuite/vulture_whitelist.py,sha256=P__p_X0zt10ivddIf81uyxsobV14vFg8uS2lt4foYpc,3582
11
11
  chgksuite/composer/__init__.py,sha256=MAOVZIYXmZmD6nNQSo9DueV6b5RgxF7_HGeLvsAhMJs,6490
12
12
  chgksuite/composer/chgksuite_parser.py,sha256=MFcLUWbccMqo3OYEuaAIA0loEvWM_PNS9vR7c1z_c60,8843
@@ -16,7 +16,7 @@ chgksuite/composer/docx.py,sha256=5MASXACM-ztWrr3VdO8HZ-W-hWWQ5TY1jXMsCQIufGc,18
16
16
  chgksuite/composer/latex.py,sha256=WtLdUICxeX4_5vHEJRF0YhFLpTsOUwBkQFunQS488FA,9248
17
17
  chgksuite/composer/lj.py,sha256=nty3Zs3N1H0gNK378U04aAHo71_5cABhCM1Mm9jiUEA,15213
18
18
  chgksuite/composer/openquiz.py,sha256=4adZewvRXpZhKrh9H4epKoMMDhmki9US55-Q0LcpZW0,7019
19
- chgksuite/composer/pptx.py,sha256=-H66x8D1fSiMWpWdankiJ0RDOaxopcrxnztCZFqJjLY,23829
19
+ chgksuite/composer/pptx.py,sha256=KszvRAbSbKmbPS257YcYhE6wB1gSf7gIXRH8VwiSqyg,23775
20
20
  chgksuite/composer/reddit.py,sha256=-Eg4CqMHhyGGfCteVwdQdtE1pfUXQ42XcP5OYUrBXmo,3878
21
21
  chgksuite/composer/stats.py,sha256=GbraSrjaZ8Mc2URs5aGAsI4ekboAKzlJJOqsbe96ELA,3995
22
22
  chgksuite/composer/telegram.py,sha256=ZiCBFXxKJJ5vD5ttkfvmURd4Q9Gif6eT8R93nz-LAq0,47146
@@ -44,16 +44,16 @@ chgksuite/resources/pptx_config.toml,sha256=pbdQpZTBZajfXxf9Ej6jFQv8luA9_h2Lsihx
44
44
  chgksuite/resources/regexes_by.json,sha256=43K_jjNocNrx75OcSlVxg2zHNJKoHwzceFbtfZgM0Vo,1296
45
45
  chgksuite/resources/regexes_en.json,sha256=v1RPW8Oj0UiS_86ieYjpFOGm3qN5-OlM-qgAqa6oCy4,1003
46
46
  chgksuite/resources/regexes_kz_cyr.json,sha256=QW6MxkPjSRNU-KPAAqh4jwFZ--ckJo9EOn_p30gihiQ,1679
47
- chgksuite/resources/regexes_ru.json,sha256=_ZgSG31eV348eIYgmcEWvygKL3cWZeaauXsBWyrCWaM,1652
47
+ chgksuite/resources/regexes_ru.json,sha256=Oxp2Y74YdJcwgL1Dr9ZBYTvaxlzoCO7E_CpNy0NDm1A,2058
48
48
  chgksuite/resources/regexes_sr.json,sha256=SiDDtxWND41XOBvHM4MgSXcogh7bRTqsY3JbJPT2wF4,925
49
49
  chgksuite/resources/regexes_ua.json,sha256=IXtJtoUY15OoBu5Y5yW6adhJUhsDRkwfxWsPYIrbgPA,1330
50
50
  chgksuite/resources/regexes_uz_cyr.json,sha256=mIvWjyZZXQ3lr_ntuC7-ybknnYJxSSQEKxqnGluTvow,1106
51
51
  chgksuite/resources/template.docx,sha256=Do29TAsg3YbH0rRSaXhVzKEoh4pwXkklW_idWA34HVE,11189
52
52
  chgksuite/resources/template.pptx,sha256=hEFWqE-yYpwZ8ejrMCJIPEyoMT3eDqaqtiEeQ7I4fyk,29777
53
53
  chgksuite/resources/trello.json,sha256=M5Q9JR-AAJF1u16YtNAxDX-7c7VoVTXuq4POTqYvq8o,555
54
- chgksuite-0.26.0b9.dist-info/licenses/LICENSE,sha256=_a1yfntuPmctLsuiE_08xMSORuCfGS8X5hQph2U_PUw,1081
55
- chgksuite-0.26.0b9.dist-info/METADATA,sha256=8bNk7VLIYa5_eEx44yJ1aq_bx5-n0Xyam_NWvhzLvzg,1341
56
- chgksuite-0.26.0b9.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
57
- chgksuite-0.26.0b9.dist-info/entry_points.txt,sha256=lqjX6ULQZGDt0rgouTXBuwEPiwKkDQkSiNsT877A_Jg,54
58
- chgksuite-0.26.0b9.dist-info/top_level.txt,sha256=cSWiRBOGZW9nIO6Rv1IrEfwPgV2ZWs87QV9wPXeBGqM,10
59
- chgksuite-0.26.0b9.dist-info/RECORD,,
54
+ chgksuite-0.26.0b10.dist-info/licenses/LICENSE,sha256=_a1yfntuPmctLsuiE_08xMSORuCfGS8X5hQph2U_PUw,1081
55
+ chgksuite-0.26.0b10.dist-info/METADATA,sha256=3Dle9cm_nzKRc5ZwetXoqa390v1emHoV1cBoF1m3Rk4,1342
56
+ chgksuite-0.26.0b10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
57
+ chgksuite-0.26.0b10.dist-info/entry_points.txt,sha256=lqjX6ULQZGDt0rgouTXBuwEPiwKkDQkSiNsT877A_Jg,54
58
+ chgksuite-0.26.0b10.dist-info/top_level.txt,sha256=cSWiRBOGZW9nIO6Rv1IrEfwPgV2ZWs87QV9wPXeBGqM,10
59
+ chgksuite-0.26.0b10.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5