chgksuite 0.26.0b9__tar.gz → 0.26.0b10__tar.gz
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-0.26.0b9/chgksuite.egg-info → chgksuite-0.26.0b10}/PKG-INFO +1 -1
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/cli.py +72 -31
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/pptx.py +2 -4
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/parser.py +33 -6
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_ru.json +1 -1
- chgksuite-0.26.0b10/chgksuite/version.py +1 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10/chgksuite.egg-info}/PKG-INFO +1 -1
- chgksuite-0.26.0b9/chgksuite/version.py +0 -1
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/LICENSE +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/MANIFEST.in +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/README.md +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/__init__.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/__main__.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/common.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/__init__.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/chgksuite_parser.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/composer_common.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/db.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/docx.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/latex.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/lj.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/openquiz.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/reddit.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/stats.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/telegram.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/telegram_bot.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/composer/telegram_parser.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/__init__.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/gen.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/installer.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/pack.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/runner.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/tex_internals.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/handouter/utils.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/parser_db.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/cheader.tex +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/fix-unnumbered-sections.sty +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_by.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_by_tar.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_en.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_kz_cyr.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_ru.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_sr.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_ua.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_uz.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/labels_uz_cyr.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/pptx_config.toml +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_by.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_en.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_kz_cyr.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_sr.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_ua.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/regexes_uz_cyr.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/template.docx +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/template.pptx +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/resources/trello.json +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/trello.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/typotools.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite/vulture_whitelist.py +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite.egg-info/SOURCES.txt +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite.egg-info/dependency_links.txt +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite.egg-info/entry_points.txt +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite.egg-info/requires.txt +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/chgksuite.egg-info/top_level.txt +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/history.md +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/setup.cfg +0 -0
- {chgksuite-0.26.0b9 → chgksuite-0.26.0b10}/setup.py +0 -0
|
@@ -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
|
|
@@ -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
|
-
|
|
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]+)\\[",
|
|
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]
|
|
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]
|
|
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?[\\.:]",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.26.0b10"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.26.0b9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|