chgksuite 0.25.0b4__py3-none-any.whl → 0.26.0__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 +292 -31
- chgksuite/common.py +4 -0
- chgksuite/composer/composer_common.py +2 -0
- chgksuite/composer/docx.py +520 -292
- chgksuite/composer/pptx.py +80 -47
- chgksuite/composer/telegram.py +76 -51
- chgksuite/handouter/__init__.py +0 -0
- chgksuite/handouter/gen.py +143 -0
- chgksuite/handouter/installer.py +245 -0
- chgksuite/handouter/pack.py +79 -0
- chgksuite/handouter/runner.py +237 -0
- chgksuite/handouter/tex_internals.py +47 -0
- chgksuite/handouter/utils.py +88 -0
- chgksuite/parser.py +210 -17
- chgksuite/resources/regexes_by.json +1 -1
- chgksuite/resources/regexes_en.json +1 -1
- chgksuite/resources/regexes_kz_cyr.json +1 -1
- chgksuite/resources/regexes_ru.json +2 -2
- chgksuite/resources/regexes_sr.json +1 -1
- chgksuite/resources/regexes_ua.json +1 -1
- chgksuite/resources/regexes_uz_cyr.json +1 -1
- chgksuite/version.py +1 -1
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/METADATA +4 -2
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/RECORD +28 -22
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/WHEEL +1 -1
- chgksuite/resources/template_shorin.pptx +0 -0
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/entry_points.txt +0 -0
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/licenses/LICENSE +0 -0
- {chgksuite-0.25.0b4.dist-info → chgksuite-0.26.0.dist-info}/top_level.txt +0 -0
chgksuite/cli.py
CHANGED
|
@@ -12,6 +12,8 @@ from chgksuite.common import (
|
|
|
12
12
|
load_settings,
|
|
13
13
|
)
|
|
14
14
|
from chgksuite.composer import gui_compose
|
|
15
|
+
from chgksuite.handouter.runner import gui_handouter
|
|
16
|
+
from chgksuite.handouter.tex_internals import GREYTEXT_LANGS
|
|
15
17
|
from chgksuite.parser import gui_parse
|
|
16
18
|
from chgksuite.trello import gui_trello
|
|
17
19
|
from chgksuite.version import __version__
|
|
@@ -70,37 +72,6 @@ class ArgparseBuilder:
|
|
|
70
72
|
advanced=True,
|
|
71
73
|
argtype="filename",
|
|
72
74
|
)
|
|
73
|
-
self.add_argument(
|
|
74
|
-
parser,
|
|
75
|
-
"--add_ts",
|
|
76
|
-
"-ts",
|
|
77
|
-
choices=["on", "off"],
|
|
78
|
-
default=default_overrides.get("add_ts") or "off",
|
|
79
|
-
help="append timestamp to filenames",
|
|
80
|
-
caption="Добавить временную отметку в имя файла",
|
|
81
|
-
advanced=True,
|
|
82
|
-
argtype="radiobutton",
|
|
83
|
-
)
|
|
84
|
-
self.add_argument(
|
|
85
|
-
parser,
|
|
86
|
-
"--replace_no_break_spaces",
|
|
87
|
-
choices=["on", "off"],
|
|
88
|
-
default=default_overrides.get("replace_no_break_spaces") or "on",
|
|
89
|
-
help="add non-breaking spaces where applicable",
|
|
90
|
-
caption="Добавить неразрывные пробелы",
|
|
91
|
-
advanced=True,
|
|
92
|
-
argtype="radiobutton",
|
|
93
|
-
)
|
|
94
|
-
self.add_argument(
|
|
95
|
-
parser,
|
|
96
|
-
"--replace_no_break_hyphens",
|
|
97
|
-
choices=["on", "off"],
|
|
98
|
-
default=default_overrides.get("replace_no_break_hyphens") or "on",
|
|
99
|
-
help="add non-breaking hyphens where applicable",
|
|
100
|
-
caption="Добавить неразрывные дефисы",
|
|
101
|
-
advanced=True,
|
|
102
|
-
argtype="radiobutton",
|
|
103
|
-
)
|
|
104
75
|
self.add_argument(
|
|
105
76
|
parser,
|
|
106
77
|
"-v",
|
|
@@ -296,6 +267,55 @@ class ArgparseBuilder:
|
|
|
296
267
|
caption="Обработка строчек, состоящих из одного числа",
|
|
297
268
|
argtype="radiobutton",
|
|
298
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
|
+
"--download_images",
|
|
283
|
+
action="store_true",
|
|
284
|
+
help="download images from direct URLs and replace with local references",
|
|
285
|
+
caption="Скачивать изображения по прямым ссылкам",
|
|
286
|
+
advanced=True,
|
|
287
|
+
)
|
|
288
|
+
self.add_argument(
|
|
289
|
+
cmdparse,
|
|
290
|
+
"--add_ts",
|
|
291
|
+
"-ts",
|
|
292
|
+
choices=["on", "off"],
|
|
293
|
+
default=default_overrides.get("add_ts") or "off",
|
|
294
|
+
help="append timestamp to filenames",
|
|
295
|
+
caption="Добавить временную отметку в имя файла",
|
|
296
|
+
advanced=True,
|
|
297
|
+
argtype="radiobutton",
|
|
298
|
+
)
|
|
299
|
+
self.add_argument(
|
|
300
|
+
cmdparse,
|
|
301
|
+
"--replace_no_break_spaces",
|
|
302
|
+
choices=["on", "off"],
|
|
303
|
+
default=default_overrides.get("replace_no_break_spaces") or "on",
|
|
304
|
+
help="add non-breaking spaces where applicable",
|
|
305
|
+
caption="Добавить неразрывные пробелы",
|
|
306
|
+
advanced=True,
|
|
307
|
+
argtype="radiobutton",
|
|
308
|
+
)
|
|
309
|
+
self.add_argument(
|
|
310
|
+
cmdparse,
|
|
311
|
+
"--replace_no_break_hyphens",
|
|
312
|
+
choices=["on", "off"],
|
|
313
|
+
default=default_overrides.get("replace_no_break_hyphens") or "on",
|
|
314
|
+
help="add non-breaking hyphens where applicable",
|
|
315
|
+
caption="Добавить неразрывные дефисы",
|
|
316
|
+
advanced=True,
|
|
317
|
+
argtype="radiobutton",
|
|
318
|
+
)
|
|
299
319
|
|
|
300
320
|
cmdcompose = subparsers.add_parser("compose")
|
|
301
321
|
self.add_argument(
|
|
@@ -332,6 +352,37 @@ class ArgparseBuilder:
|
|
|
332
352
|
caption="Client ID для API Imgur",
|
|
333
353
|
advanced=True,
|
|
334
354
|
)
|
|
355
|
+
self.add_argument(
|
|
356
|
+
cmdcompose,
|
|
357
|
+
"--add_ts",
|
|
358
|
+
"-ts",
|
|
359
|
+
choices=["on", "off"],
|
|
360
|
+
default=default_overrides.get("add_ts") or "off",
|
|
361
|
+
help="append timestamp to filenames",
|
|
362
|
+
caption="Добавить временную отметку в имя файла",
|
|
363
|
+
advanced=True,
|
|
364
|
+
argtype="radiobutton",
|
|
365
|
+
)
|
|
366
|
+
self.add_argument(
|
|
367
|
+
cmdcompose,
|
|
368
|
+
"--replace_no_break_spaces",
|
|
369
|
+
choices=["on", "off"],
|
|
370
|
+
default=default_overrides.get("replace_no_break_spaces") or "on",
|
|
371
|
+
help="add non-breaking spaces where applicable",
|
|
372
|
+
caption="Добавить неразрывные пробелы",
|
|
373
|
+
advanced=True,
|
|
374
|
+
argtype="radiobutton",
|
|
375
|
+
)
|
|
376
|
+
self.add_argument(
|
|
377
|
+
cmdcompose,
|
|
378
|
+
"--replace_no_break_hyphens",
|
|
379
|
+
choices=["on", "off"],
|
|
380
|
+
default=default_overrides.get("replace_no_break_hyphens") or "on",
|
|
381
|
+
help="add non-breaking hyphens where applicable",
|
|
382
|
+
caption="Добавить неразрывные дефисы",
|
|
383
|
+
advanced=True,
|
|
384
|
+
argtype="radiobutton",
|
|
385
|
+
)
|
|
335
386
|
cmdcompose_filetype = cmdcompose.add_subparsers(dest="filetype")
|
|
336
387
|
cmdcompose_docx = cmdcompose_filetype.add_parser("docx")
|
|
337
388
|
self.add_argument(
|
|
@@ -393,6 +444,15 @@ class ArgparseBuilder:
|
|
|
393
444
|
advanced=True,
|
|
394
445
|
caption='Без переноса строки после "Вопрос N."',
|
|
395
446
|
)
|
|
447
|
+
|
|
448
|
+
self.add_argument(
|
|
449
|
+
cmdcompose_docx,
|
|
450
|
+
"--only_question_number",
|
|
451
|
+
action="store_true",
|
|
452
|
+
help="only show question number",
|
|
453
|
+
advanced=True,
|
|
454
|
+
caption='Без слова "Вопрос" в "Вопрос N."',
|
|
455
|
+
)
|
|
396
456
|
self.add_argument(
|
|
397
457
|
cmdcompose_docx,
|
|
398
458
|
"--randomize",
|
|
@@ -817,6 +877,205 @@ class ArgparseBuilder:
|
|
|
817
877
|
caption="Не открывать браузер",
|
|
818
878
|
)
|
|
819
879
|
|
|
880
|
+
cmdhandouts = subparsers.add_parser("handouts")
|
|
881
|
+
cmdhandouts_subcommands = cmdhandouts.add_subparsers(dest="handoutssubcommand")
|
|
882
|
+
cmdhandouts_run = self.add_parser(cmdhandouts_subcommands, "run")
|
|
883
|
+
self.add_argument(
|
|
884
|
+
cmdhandouts_run,
|
|
885
|
+
"filename",
|
|
886
|
+
help="file with handouts",
|
|
887
|
+
caption="Имя файла с раздатками",
|
|
888
|
+
filetypes=[("handouts files", "*.hndts"), ("text files", "*.txt")],
|
|
889
|
+
)
|
|
890
|
+
self.add_argument(
|
|
891
|
+
cmdhandouts_run,
|
|
892
|
+
"--lang",
|
|
893
|
+
default="ru",
|
|
894
|
+
argtype="radiobutton",
|
|
895
|
+
choices=sorted(GREYTEXT_LANGS.keys()),
|
|
896
|
+
help="language",
|
|
897
|
+
caption="Язык",
|
|
898
|
+
advanced=True,
|
|
899
|
+
)
|
|
900
|
+
self.add_argument(
|
|
901
|
+
cmdhandouts_run,
|
|
902
|
+
"--compress",
|
|
903
|
+
action="store_true",
|
|
904
|
+
help="compress",
|
|
905
|
+
caption="Сжать файл после вёрстки (требует установленного ghostscript)",
|
|
906
|
+
advanced=True,
|
|
907
|
+
)
|
|
908
|
+
self.add_argument(cmdhandouts_run, "--font", "-f", help="font", caption="Шрифт")
|
|
909
|
+
self.add_argument(
|
|
910
|
+
cmdhandouts_run,
|
|
911
|
+
"--font_size",
|
|
912
|
+
type=int,
|
|
913
|
+
default=14,
|
|
914
|
+
help="font size",
|
|
915
|
+
caption="Размер шрифта",
|
|
916
|
+
)
|
|
917
|
+
self.add_argument(
|
|
918
|
+
cmdhandouts_run,
|
|
919
|
+
"--pdfsettings",
|
|
920
|
+
choices=["screen", "ebook", "printer", "prepress", "default"],
|
|
921
|
+
default="default",
|
|
922
|
+
advanced=True,
|
|
923
|
+
caption="Настройки pdfsettings для ghostscript",
|
|
924
|
+
)
|
|
925
|
+
self.add_argument(
|
|
926
|
+
cmdhandouts_run,
|
|
927
|
+
"--paperwidth",
|
|
928
|
+
type=float,
|
|
929
|
+
default=210,
|
|
930
|
+
help="paper width",
|
|
931
|
+
caption="Ширина бумаги",
|
|
932
|
+
advanced=True,
|
|
933
|
+
)
|
|
934
|
+
self.add_argument(
|
|
935
|
+
cmdhandouts_run,
|
|
936
|
+
"--paperheight",
|
|
937
|
+
type=float,
|
|
938
|
+
default=297,
|
|
939
|
+
help="paper height",
|
|
940
|
+
caption="Высота бумаги",
|
|
941
|
+
advanced=True,
|
|
942
|
+
)
|
|
943
|
+
self.add_argument(
|
|
944
|
+
cmdhandouts_run,
|
|
945
|
+
"--margin_top",
|
|
946
|
+
type=float,
|
|
947
|
+
default=5,
|
|
948
|
+
help="top margin",
|
|
949
|
+
caption="Верхний отступ",
|
|
950
|
+
advanced=True,
|
|
951
|
+
)
|
|
952
|
+
self.add_argument(
|
|
953
|
+
cmdhandouts_run,
|
|
954
|
+
"--margin_bottom",
|
|
955
|
+
type=float,
|
|
956
|
+
default=5,
|
|
957
|
+
help="bottom margin",
|
|
958
|
+
caption="Нижний отступ",
|
|
959
|
+
advanced=True,
|
|
960
|
+
)
|
|
961
|
+
self.add_argument(
|
|
962
|
+
cmdhandouts_run,
|
|
963
|
+
"--margin_left",
|
|
964
|
+
type=float,
|
|
965
|
+
default=5,
|
|
966
|
+
help="left margin",
|
|
967
|
+
caption="Левый отступ",
|
|
968
|
+
advanced=True,
|
|
969
|
+
)
|
|
970
|
+
self.add_argument(
|
|
971
|
+
cmdhandouts_run,
|
|
972
|
+
"--margin_right",
|
|
973
|
+
type=float,
|
|
974
|
+
default=5,
|
|
975
|
+
help="right margin",
|
|
976
|
+
caption="Правый отступ",
|
|
977
|
+
advanced=True,
|
|
978
|
+
)
|
|
979
|
+
self.add_argument(
|
|
980
|
+
cmdhandouts_run,
|
|
981
|
+
"--boxwidth",
|
|
982
|
+
type=float,
|
|
983
|
+
help="box width",
|
|
984
|
+
caption="Ширина блока",
|
|
985
|
+
advanced=True,
|
|
986
|
+
)
|
|
987
|
+
self.add_argument(
|
|
988
|
+
cmdhandouts_run,
|
|
989
|
+
"--boxwidthinner",
|
|
990
|
+
type=float,
|
|
991
|
+
help="box width inner",
|
|
992
|
+
caption="Внутренняя ширина блока",
|
|
993
|
+
advanced=True,
|
|
994
|
+
)
|
|
995
|
+
self.add_argument(
|
|
996
|
+
cmdhandouts_run,
|
|
997
|
+
"--tikz_mm",
|
|
998
|
+
type=float,
|
|
999
|
+
default=2,
|
|
1000
|
+
help="tikz_mm width",
|
|
1001
|
+
caption="Ширина tikz_mm",
|
|
1002
|
+
advanced=True,
|
|
1003
|
+
)
|
|
1004
|
+
|
|
1005
|
+
cmdhandouts_generate = self.add_parser(cmdhandouts_subcommands, "generate")
|
|
1006
|
+
self.add_argument(
|
|
1007
|
+
cmdhandouts_generate,
|
|
1008
|
+
"filename",
|
|
1009
|
+
help="file with questions packet",
|
|
1010
|
+
caption="Имя файла с пакетом",
|
|
1011
|
+
filetypes=[("chgksuite files", "*.4s")],
|
|
1012
|
+
)
|
|
1013
|
+
self.add_argument(
|
|
1014
|
+
cmdhandouts_generate,
|
|
1015
|
+
"--lang",
|
|
1016
|
+
default="ru",
|
|
1017
|
+
help="language",
|
|
1018
|
+
caption="Язык",
|
|
1019
|
+
argtype="radiobutton",
|
|
1020
|
+
choices=sorted(GREYTEXT_LANGS.keys()),
|
|
1021
|
+
advanced=True,
|
|
1022
|
+
)
|
|
1023
|
+
self.add_argument(
|
|
1024
|
+
cmdhandouts_generate,
|
|
1025
|
+
"--separate",
|
|
1026
|
+
action="store_true",
|
|
1027
|
+
help="Generate separate handouts for each question",
|
|
1028
|
+
caption="Сгенерировать отдельный файл с раздатками для каждого вопроса",
|
|
1029
|
+
)
|
|
1030
|
+
self.add_argument(
|
|
1031
|
+
cmdhandouts_generate,
|
|
1032
|
+
"--list-handouts",
|
|
1033
|
+
"-l",
|
|
1034
|
+
action="store_true",
|
|
1035
|
+
help="Generate a file with a list of handouts",
|
|
1036
|
+
caption="Сгенерировать файл со списком раздаток",
|
|
1037
|
+
)
|
|
1038
|
+
|
|
1039
|
+
cmdhandouts_pack = self.add_parser(cmdhandouts_subcommands, "pack")
|
|
1040
|
+
self.add_argument(
|
|
1041
|
+
cmdhandouts_pack,
|
|
1042
|
+
"folder",
|
|
1043
|
+
help="input directory",
|
|
1044
|
+
caption="Папка с раздатками",
|
|
1045
|
+
)
|
|
1046
|
+
self.add_argument(
|
|
1047
|
+
cmdhandouts_pack,
|
|
1048
|
+
"--output_filename_prefix",
|
|
1049
|
+
"-o",
|
|
1050
|
+
default="packed_handouts",
|
|
1051
|
+
help="output filename prefix",
|
|
1052
|
+
caption="Префикс имени выходного файла",
|
|
1053
|
+
)
|
|
1054
|
+
self.add_argument(
|
|
1055
|
+
cmdhandouts_pack,
|
|
1056
|
+
"--n_teams",
|
|
1057
|
+
"-n",
|
|
1058
|
+
type=int,
|
|
1059
|
+
required=True,
|
|
1060
|
+
help="number of teams",
|
|
1061
|
+
caption="Количество команд",
|
|
1062
|
+
)
|
|
1063
|
+
self.add_argument(
|
|
1064
|
+
cmdhandouts_pack,
|
|
1065
|
+
"--font",
|
|
1066
|
+
"-f",
|
|
1067
|
+
help="font",
|
|
1068
|
+
caption="Шрифт",
|
|
1069
|
+
)
|
|
1070
|
+
|
|
1071
|
+
cmdhandouts_install = self.add_parser(cmdhandouts_subcommands, "install")
|
|
1072
|
+
self.add_argument(
|
|
1073
|
+
cmdhandouts_install,
|
|
1074
|
+
"--tectonic_package_regex",
|
|
1075
|
+
advanced=True,
|
|
1076
|
+
caption="Переопределить имя файла с релизом tectonic",
|
|
1077
|
+
)
|
|
1078
|
+
|
|
820
1079
|
|
|
821
1080
|
def single_action(args, use_wrapper, resourcedir):
|
|
822
1081
|
if use_wrapper:
|
|
@@ -860,6 +1119,8 @@ def single_action(args, use_wrapper, resourcedir):
|
|
|
860
1119
|
gui_compose(args)
|
|
861
1120
|
if args.action == "trello":
|
|
862
1121
|
gui_trello(args)
|
|
1122
|
+
if args.action == "handouts":
|
|
1123
|
+
gui_handouter(args)
|
|
863
1124
|
|
|
864
1125
|
|
|
865
1126
|
def app():
|
chgksuite/common.py
CHANGED
|
@@ -224,6 +224,8 @@ def xlsx_to_results(xlsx_file_path):
|
|
|
224
224
|
res_by_tour = defaultdict(lambda: defaultdict(list))
|
|
225
225
|
tour_len = defaultdict(lambda: 0)
|
|
226
226
|
for row in sheet.iter_rows(values_only=True):
|
|
227
|
+
if not any(x for x in row):
|
|
228
|
+
continue
|
|
227
229
|
if first:
|
|
228
230
|
assert row[1] == "Название"
|
|
229
231
|
if row[3] == "Тур":
|
|
@@ -233,6 +235,8 @@ def xlsx_to_results(xlsx_file_path):
|
|
|
233
235
|
first = False
|
|
234
236
|
continue
|
|
235
237
|
team_id = row[0]
|
|
238
|
+
if not tryint(team_id):
|
|
239
|
+
continue
|
|
236
240
|
team_name = row[1]
|
|
237
241
|
if table_type == "tour":
|
|
238
242
|
tour = row[3]
|
|
@@ -415,6 +415,8 @@ class BaseExporter:
|
|
|
415
415
|
return _parse_4s_elem(*args, **kwargs)
|
|
416
416
|
|
|
417
417
|
def get_label(self, question, field, number=None):
|
|
418
|
+
if field == "question" and self.args.only_question_number:
|
|
419
|
+
return str(question.get("number") or number)
|
|
418
420
|
if field in ("question", "tour"):
|
|
419
421
|
lbl = (question.get("overrides") or {}).get(field) or self.labels[
|
|
420
422
|
"question_labels"
|