chgksuite 0.25.1__tar.gz → 0.26.0__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.
Files changed (69) hide show
  1. {chgksuite-0.25.1/chgksuite.egg-info → chgksuite-0.26.0}/PKG-INFO +4 -2
  2. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/cli.py +292 -31
  3. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/composer_common.py +2 -0
  4. chgksuite-0.26.0/chgksuite/composer/docx.py +703 -0
  5. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/pptx.py +16 -4
  6. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/telegram.py +68 -46
  7. chgksuite-0.26.0/chgksuite/handouter/__init__.py +0 -0
  8. chgksuite-0.26.0/chgksuite/handouter/gen.py +143 -0
  9. chgksuite-0.26.0/chgksuite/handouter/installer.py +245 -0
  10. chgksuite-0.26.0/chgksuite/handouter/pack.py +79 -0
  11. chgksuite-0.26.0/chgksuite/handouter/runner.py +237 -0
  12. chgksuite-0.26.0/chgksuite/handouter/tex_internals.py +47 -0
  13. chgksuite-0.26.0/chgksuite/handouter/utils.py +88 -0
  14. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/parser.py +210 -17
  15. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_by.json +1 -1
  16. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_en.json +1 -1
  17. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_kz_cyr.json +1 -1
  18. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_ru.json +2 -2
  19. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_sr.json +1 -1
  20. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_ua.json +1 -1
  21. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/regexes_uz_cyr.json +1 -1
  22. chgksuite-0.26.0/chgksuite/version.py +1 -0
  23. {chgksuite-0.25.1 → chgksuite-0.26.0/chgksuite.egg-info}/PKG-INFO +4 -2
  24. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite.egg-info/SOURCES.txt +7 -1
  25. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite.egg-info/requires.txt +3 -1
  26. {chgksuite-0.25.1 → chgksuite-0.26.0}/history.md +13 -0
  27. {chgksuite-0.25.1 → chgksuite-0.26.0}/setup.py +4 -2
  28. chgksuite-0.25.1/chgksuite/composer/docx.py +0 -475
  29. chgksuite-0.25.1/chgksuite/resources/template_shorin.pptx +0 -0
  30. chgksuite-0.25.1/chgksuite/version.py +0 -1
  31. {chgksuite-0.25.1 → chgksuite-0.26.0}/LICENSE +0 -0
  32. {chgksuite-0.25.1 → chgksuite-0.26.0}/MANIFEST.in +0 -0
  33. {chgksuite-0.25.1 → chgksuite-0.26.0}/README.md +0 -0
  34. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/__init__.py +0 -0
  35. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/__main__.py +0 -0
  36. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/common.py +0 -0
  37. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/__init__.py +0 -0
  38. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/chgksuite_parser.py +0 -0
  39. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/db.py +0 -0
  40. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/latex.py +0 -0
  41. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/lj.py +0 -0
  42. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/openquiz.py +0 -0
  43. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/reddit.py +0 -0
  44. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/stats.py +0 -0
  45. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/telegram_bot.py +0 -0
  46. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/composer/telegram_parser.py +0 -0
  47. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/parser_db.py +0 -0
  48. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/cheader.tex +0 -0
  49. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/fix-unnumbered-sections.sty +0 -0
  50. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_by.toml +0 -0
  51. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_by_tar.toml +0 -0
  52. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_en.toml +0 -0
  53. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_kz_cyr.toml +0 -0
  54. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_ru.toml +0 -0
  55. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_sr.toml +0 -0
  56. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_ua.toml +0 -0
  57. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_uz.toml +0 -0
  58. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/labels_uz_cyr.toml +0 -0
  59. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/pptx_config.toml +0 -0
  60. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/template.docx +0 -0
  61. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/template.pptx +0 -0
  62. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/resources/trello.json +0 -0
  63. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/trello.py +0 -0
  64. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/typotools.py +0 -0
  65. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite/vulture_whitelist.py +0 -0
  66. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite.egg-info/dependency_links.txt +0 -0
  67. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite.egg-info/entry_points.txt +0 -0
  68. {chgksuite-0.25.1 → chgksuite-0.26.0}/chgksuite.egg-info/top_level.txt +0 -0
  69. {chgksuite-0.25.1 → chgksuite-0.26.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chgksuite
3
- Version: 0.25.1
3
+ Version: 0.26.0
4
4
  Summary: A package for chgk automation
5
5
  Home-page: https://gitlab.com/peczony/chgksuite
6
6
  Author: Alexander Pecheny
@@ -20,12 +20,14 @@ Requires-Dist: parse
20
20
  Requires-Dist: Pillow
21
21
  Requires-Dist: ply
22
22
  Requires-Dist: pypandoc
23
+ Requires-Dist: pypdf
23
24
  Requires-Dist: pyperclip
24
25
  Requires-Dist: python-docx
25
26
  Requires-Dist: python-pptx
26
- Requires-Dist: requests
27
27
  Requires-Dist: python-telegram-bot
28
+ Requires-Dist: requests
28
29
  Requires-Dist: toml
30
+ Requires-Dist: watchdog
29
31
  Dynamic: author
30
32
  Dynamic: author-email
31
33
  Dynamic: classifier
@@ -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():
@@ -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"