chgksuite 0.26.1__tar.gz → 0.27.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.
- chgksuite-0.27.0/.github/workflows/build.yml +291 -0
- chgksuite-0.27.0/.gitignore +10 -0
- chgksuite-0.27.0/.gitlab-ci.yml +17 -0
- chgksuite-0.27.0/.hgignore +2 -0
- chgksuite-0.27.0/.~lock.results.xlsx# +1 -0
- {chgksuite-0.26.1/chgksuite.egg-info → chgksuite-0.27.0}/PKG-INFO +10 -19
- chgksuite-0.27.0/adhoc/regexes_fixer.py +66 -0
- chgksuite-0.27.0/author_counter.py +24 -0
- chgksuite-0.27.0/chgksuite/_html2md.py +90 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/cli.py +21 -8
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/common.py +16 -12
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/__init__.py +9 -7
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/chgksuite_parser.py +16 -7
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/composer_common.py +14 -5
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/db.py +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/docx.py +29 -8
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/latex.py +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/lj.py +1 -2
- chgksuite-0.26.1/chgksuite/composer/reddit.py → chgksuite-0.27.0/chgksuite/composer/markdown.py +35 -25
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/openquiz.py +2 -3
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/pptx.py +2 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/telegram.py +2 -1
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/gen.py +11 -7
- chgksuite-0.27.0/chgksuite/handouter/runner.py +461 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/tex_internals.py +12 -13
- chgksuite-0.27.0/chgksuite/lastdir +1 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/parser.py +32 -33
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/parser_db.py +4 -6
- chgksuite-0.27.0/chgksuite/resources/labels_az.toml +22 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_by.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_by_tar.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_en.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_kz_cyr.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_ru.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_sr.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_ua.toml +1 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_uz.toml +0 -3
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/labels_uz_cyr.toml +1 -2
- chgksuite-0.27.0/chgksuite/resources/regexes_az.json +17 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_by.json +3 -2
- chgksuite-0.27.0/chgksuite/resources/regexes_by_tar.json +17 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_en.json +3 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_kz_cyr.json +3 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_ru.json +3 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_sr.json +3 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_ua.json +3 -2
- chgksuite-0.27.0/chgksuite/resources/regexes_uz.json +16 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/regexes_uz_cyr.json +3 -2
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/trello.py +8 -9
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/typotools.py +9 -8
- chgksuite-0.27.0/chgksuite/version.py +1 -0
- chgksuite-0.27.0/debug_0.txt +3 -0
- chgksuite-0.27.0/debug_1.json +10 -0
- chgksuite-0.27.0/debug_1a.json +10 -0
- chgksuite-0.27.0/debug_2.json +10 -0
- chgksuite-0.27.0/debug_3.json +10 -0
- chgksuite-0.27.0/debug_4.json +14 -0
- chgksuite-0.27.0/debug_5.json +14 -0
- chgksuite-0.27.0/debug_6.json +10 -0
- chgksuite-0.27.0/debug_final.json +10 -0
- chgksuite-0.27.0/dev_readme.md +25 -0
- chgksuite-0.27.0/docs/.cache/.gitignore +1 -0
- chgksuite-0.27.0/docs/.cache/12897346880794287463 +43 -0
- chgksuite-0.27.0/docs/.cache/13071136909783630831 +27 -0
- chgksuite-0.27.0/docs/.cache/13307108790744403429 +58 -0
- chgksuite-0.27.0/docs/.cache/13333983167045209281 +27 -0
- chgksuite-0.27.0/docs/.cache/14085495286103177657 +4 -0
- chgksuite-0.27.0/docs/.cache/15213489598760314030 +149 -0
- chgksuite-0.27.0/docs/.cache/15319492834190874243 +4 -0
- chgksuite-0.27.0/docs/.cache/17387058097034297385 +4 -0
- chgksuite-0.27.0/docs/.cache/17722115158263369208 +4 -0
- chgksuite-0.27.0/docs/.cache/18247088324849079572 +4 -0
- chgksuite-0.27.0/docs/.cache/1840587404175770520 +43 -0
- chgksuite-0.27.0/docs/.cache/2517734129797249711 +4 -0
- chgksuite-0.27.0/docs/.cache/273431981325847810 +164 -0
- chgksuite-0.27.0/docs/.cache/2872065536916780406 +27 -0
- chgksuite-0.27.0/docs/.cache/3476900567878811119 +4 -0
- chgksuite-0.27.0/docs/.cache/4757258273854424423 +58 -0
- chgksuite-0.27.0/docs/.cache/5728722062471071239 +58 -0
- chgksuite-0.27.0/docs/.cache/6061198691539556612 +4 -0
- chgksuite-0.27.0/docs/.cache/6079179394456200124 +4 -0
- chgksuite-0.27.0/docs/.cache/735877668610100612 +73 -0
- chgksuite-0.27.0/docs/.cache/9345880734637750342 +4 -0
- chgksuite-0.27.0/docs/.cache/9490951945832949972 +4 -0
- chgksuite-0.27.0/docs/docs/4s.md +229 -0
- chgksuite-0.27.0/docs/docs/add_stats.md +9 -0
- chgksuite-0.27.0/docs/docs/base.md +43 -0
- chgksuite-0.27.0/docs/docs/i14n.md +31 -0
- chgksuite-0.27.0/docs/docs/images/base.png +0 -0
- chgksuite-0.27.0/docs/docs/images/douplet_problem.png +0 -0
- chgksuite-0.27.0/docs/docs/images/i14n.png +0 -0
- chgksuite-0.27.0/docs/docs/images/i14n_parse.png +0 -0
- chgksuite-0.27.0/docs/docs/images/lj.png +0 -0
- chgksuite-0.27.0/docs/docs/images/main.png +0 -0
- chgksuite-0.27.0/docs/docs/images/openquiz.png +0 -0
- chgksuite-0.27.0/docs/docs/images/openquiz2.png +0 -0
- chgksuite-0.27.0/docs/docs/images/parse.png +0 -0
- chgksuite-0.27.0/docs/docs/images/pptx.png +0 -0
- chgksuite-0.27.0/docs/docs/images/pptx_additional_conf.png +0 -0
- chgksuite-0.27.0/docs/docs/images/pptx_slide_a.png +0 -0
- chgksuite-0.27.0/docs/docs/images/pptx_slide_q.png +0 -0
- chgksuite-0.27.0/docs/docs/images/roenko.png +0 -0
- chgksuite-0.27.0/docs/docs/images/rozhdsushkov.png +0 -0
- chgksuite-0.27.0/docs/docs/images/stats.png +0 -0
- chgksuite-0.27.0/docs/docs/images/telegram.png +0 -0
- chgksuite-0.27.0/docs/docs/images/trello_download.png +0 -0
- chgksuite-0.27.0/docs/docs/images/trello_token.png +0 -0
- chgksuite-0.27.0/docs/docs/images/trello_upload.png +0 -0
- chgksuite-0.27.0/docs/docs/images/word.png +0 -0
- chgksuite-0.27.0/docs/docs/index.md +59 -0
- chgksuite-0.27.0/docs/docs/lj.md +9 -0
- chgksuite-0.27.0/docs/docs/openquiz.md +7 -0
- chgksuite-0.27.0/docs/docs/pptx.md +66 -0
- chgksuite-0.27.0/docs/docs/stylesheets/extra.css +29 -0
- chgksuite-0.27.0/docs/docs/telegram.md +46 -0
- chgksuite-0.27.0/docs/docs/trello.md +31 -0
- chgksuite-0.27.0/docs/docs/word.md +24 -0
- chgksuite-0.27.0/docs/mkdocs.yml +35 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/history.md +8 -1
- chgksuite-0.27.0/hook-dateparser.py +12 -0
- chgksuite-0.27.0/packer.py +172 -0
- chgksuite-0.27.0/pyproject.toml +64 -0
- chgksuite-0.27.0/pytest.ini +5 -0
- chgksuite-0.27.0/pytest.sh +7 -0
- chgksuite-0.27.0/re_helper.py +24 -0
- chgksuite-0.27.0/requirements_dev.txt +2 -0
- chgksuite-0.27.0/results.xlsx +0 -0
- chgksuite-0.27.0/ruff.toml +2 -0
- chgksuite-0.27.0/test_multiple_images.txt +3 -0
- chgksuite-0.27.0/test_oschr/404.jpg +0 -0
- chgksuite-0.27.0/test_oschr/Arhipova_Shtirlic-shel-po-koridoru-.803300.pdf/stirlitz_was_walking.fbd +525 -0
- chgksuite-0.27.0/test_oschr/Arhipova_Shtirlic-shel-po-koridoru-.803300.pdf/stirlitz_was_walking.pdf +0 -0
- chgksuite-0.27.0/test_oschr/alexeeva.jpeg +0 -0
- chgksuite-0.27.0/test_oschr/arhipova.txt +1030 -0
- chgksuite-0.27.0/test_oschr/ber.png +0 -0
- chgksuite-0.27.0/test_oschr/columns.txt +35 -0
- chgksuite-0.27.0/test_oschr/columns_ru.pdf +0 -0
- chgksuite-0.27.0/test_oschr/cool.pdf +0 -0
- chgksuite-0.27.0/test_oschr/cool.png +0 -0
- chgksuite-0.27.0/test_oschr/dish.png +0 -0
- chgksuite-0.27.0/test_oschr/dubinki.png +0 -0
- chgksuite-0.27.0/test_oschr/duran01.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran02.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran03.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran04.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran05.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran06.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran07.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran08.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran09.jpg +0 -0
- chgksuite-0.27.0/test_oschr/duran10.jpg +0 -0
- chgksuite-0.27.0/test_oschr/eisenhower.png +0 -0
- chgksuite-0.27.0/test_oschr/emo.pdf +0 -0
- chgksuite-0.27.0/test_oschr/emo.png +0 -0
- chgksuite-0.27.0/test_oschr/emosong.png +0 -0
- chgksuite-0.27.0/test_oschr/emosong1.png +0 -0
- chgksuite-0.27.0/test_oschr/emosong2.png +0 -0
- chgksuite-0.27.0/test_oschr/handouts_test.txt +30 -0
- chgksuite-0.27.0/test_oschr/handouts_test_ru.tex +296 -0
- chgksuite-0.27.0/test_oschr/karikatura_razdatka.png +0 -0
- chgksuite-0.27.0/test_oschr/kuzmin-tat.png +0 -0
- chgksuite-0.27.0/test_oschr/kuzmin.txt +13242 -0
- chgksuite-0.27.0/test_oschr/otbor_studchr.txt +79 -0
- chgksuite-0.27.0/test_oschr/otbor_studchr_handouts.txt +16 -0
- chgksuite-0.27.0/test_oschr/otbor_studchr_handouts_ru.pdf +0 -0
- chgksuite-0.27.0/test_oschr/panchenko.txt +23670 -0
- chgksuite-0.27.0/test_oschr/zine.png +0 -0
- chgksuite-0.27.0/test_with_image.txt +3 -0
- chgksuite-0.27.0/test_with_real_image.txt +3 -0
- chgksuite-0.27.0/tests/2019-07-23_beln19_u.docx +0 -0
- chgksuite-0.27.0/tests/2019-07-23_beln19_u.docx.canon +690 -0
- chgksuite-0.27.0/tests/Kubok_knyagini_Olgi-2015.docx +0 -0
- chgksuite-0.27.0/tests/Kubok_knyagini_Olgi-2015.docx.canon +644 -0
- chgksuite-0.27.0/tests/Shkolny_Chemp_Estonii-2014_(48v).docx +0 -0
- chgksuite-0.27.0/tests/Shkolny_Chemp_Estonii-2014_(48v).docx.canon +361 -0
- chgksuite-0.27.0/tests/__init__.py +0 -0
- chgksuite-0.27.0/tests/balt09-1.txt +783 -0
- chgksuite-0.27.0/tests/balt09-1.txt.canon +286 -0
- chgksuite-0.27.0/tests/borromeo.txt +11 -0
- chgksuite-0.27.0/tests/borromeo.txt.canon +16 -0
- chgksuite-0.27.0/tests/canonize.py +69 -0
- chgksuite-0.27.0/tests/chgksuite_test.py +364 -0
- chgksuite-0.27.0/tests/conftest.py +21 -0
- chgksuite-0.27.0/tests/encrypt_test_files.py +147 -0
- chgksuite-0.27.0/tests/haifa2025.docx +0 -0
- chgksuite-0.27.0/tests/haifa2025.docx.canon +349 -0
- chgksuite-0.27.0/tests/haifa2025.docx.encrypted +0 -0
- chgksuite-0.27.0/tests/haifa2025.docx.encrypted.canon +0 -0
- chgksuite-0.27.0/tests/link_unwrap.docx +0 -0
- chgksuite-0.27.0/tests/link_unwrap.docx.canon +10 -0
- chgksuite-0.27.0/tests/ljcredentials +1 -0
- chgksuite-0.27.0/tests/long_handout.png +0 -0
- chgksuite-0.27.0/tests/malkin_papkov_synchr.docx +0 -0
- chgksuite-0.27.0/tests/malkin_papkov_synchr.docx.canon +99 -0
- chgksuite-0.27.0/tests/octo2021_khmelkov.docx +0 -0
- chgksuite-0.27.0/tests/octo2021_khmelkov.docx.canon +102 -0
- chgksuite-0.27.0/tests/ovsch_boronenko_3.4s +334 -0
- chgksuite-0.27.0/tests/ovsch_boronenko_3.docx +0 -0
- chgksuite-0.27.0/tests/ovsch_boronenko_3.docx.canon +334 -0
- chgksuite-0.27.0/tests/pass1.docx +0 -0
- chgksuite-0.27.0/tests/pass1.docx.canon +183 -0
- chgksuite-0.27.0/tests/settings.json +3 -0
- chgksuite-0.27.0/tests/single_number_line_test.docx +0 -0
- chgksuite-0.27.0/tests/single_number_line_test.docx.canon +46 -0
- chgksuite-0.27.0/tests/smalltest.4s +6 -0
- chgksuite-0.27.0/tests/test.jpg +0 -0
- chgksuite-0.27.0/tests/test_blitz.txt +8 -0
- chgksuite-0.27.0/tests/test_blitz.txt.canon +9 -0
- chgksuite-0.27.0/tests/tourrev_with_razmin.docx +0 -0
- chgksuite-0.27.0/tests/tourrev_with_razmin.docx.canon +34 -0
- chgksuite-0.27.0/tests//320/241/320/247/320/240_/320/250/320/265/321/200/320/265/320/264/320/265/320/263/320/260_/320/225/321/200/320/274/320/270/321/210/320/272/320/270/320/275.docx +0 -0
- chgksuite-0.27.0/tests//320/241/320/247/320/240_/320/250/320/265/321/200/320/265/320/264/320/265/320/263/320/260_/320/225/321/200/320/274/320/270/321/210/320/272/320/270/320/275.docx.canon +13 -0
- chgksuite-0.27.0/uv.lock +1454 -0
- chgksuite-0.27.0//320/235/320/276/321/207/321/214/320/241/320/276/320/263/321/200/320/265/320/262/320/260/321/216/321/211/320/265/320/263/320/276/320/236/321/207/320/260/320/263/320/2602025_001.jpeg +0 -0
- chgksuite-0.27.0//320/235/320/276/321/207/321/214/320/241/320/276/320/263/321/200/320/265/320/262/320/260/321/216/321/211/320/265/320/263/320/276/320/236/321/207/320/260/320/263/320/2602025_with_stats1.4s +373 -0
- chgksuite-0.27.0//320/235/320/276/321/207/321/214/320/241/320/276/320/263/321/200/320/265/320/262/320/260/321/216/321/211/320/265/320/263/320/276/320/236/321/207/320/260/320/263/320/2602025_with_stats1.dbg +562 -0
- chgksuite-0.27.0//320/235/320/276/321/207/321/214/320/241/320/276/320/263/321/200/320/265/320/262/320/260/321/216/321/211/320/265/320/263/320/276/320/236/321/207/320/260/320/263/320/2602025_with_stats1.docx +0 -0
- chgksuite-0.27.0//321/216 +0 -0
- chgksuite-0.26.1/PKG-INFO +0 -47
- chgksuite-0.26.1/chgksuite/composer/telegram_parser.py +0 -230
- chgksuite-0.26.1/chgksuite/handouter/runner.py +0 -237
- chgksuite-0.26.1/chgksuite/version.py +0 -1
- chgksuite-0.26.1/chgksuite.egg-info/SOURCES.txt +0 -64
- chgksuite-0.26.1/chgksuite.egg-info/dependency_links.txt +0 -1
- chgksuite-0.26.1/chgksuite.egg-info/entry_points.txt +0 -2
- chgksuite-0.26.1/chgksuite.egg-info/requires.txt +0 -18
- chgksuite-0.26.1/chgksuite.egg-info/top_level.txt +0 -1
- chgksuite-0.26.1/setup.cfg +0 -4
- chgksuite-0.26.1/setup.py +0 -66
- {chgksuite-0.26.1 → chgksuite-0.27.0}/LICENSE +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/MANIFEST.in +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/README.md +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/__init__.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/__main__.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/stats.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/composer/telegram_bot.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/__init__.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/installer.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/pack.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/handouter/utils.py +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/cheader.tex +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/fix-unnumbered-sections.sty +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/pptx_config.toml +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/template.docx +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/template.pptx +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/resources/trello.json +0 -0
- {chgksuite-0.26.1 → chgksuite-0.27.0}/chgksuite/vulture_whitelist.py +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
name: Build Standalone Executables
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- 'v*'
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
tag:
|
|
10
|
+
description: 'Tag to build and release (e.g., v0.26.1). Leave empty for build-only.'
|
|
11
|
+
required: false
|
|
12
|
+
default: ''
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
build:
|
|
16
|
+
strategy:
|
|
17
|
+
fail-fast: false
|
|
18
|
+
matrix:
|
|
19
|
+
include:
|
|
20
|
+
- os: ubuntu-24.04
|
|
21
|
+
platform: linux-x64
|
|
22
|
+
rust_target: x86_64-unknown-linux-gnu
|
|
23
|
+
- os: ubuntu-24.04-arm
|
|
24
|
+
platform: linux-arm64
|
|
25
|
+
rust_target: aarch64-unknown-linux-gnu
|
|
26
|
+
- os: macos-15-intel
|
|
27
|
+
platform: macos-x64
|
|
28
|
+
rust_target: x86_64-apple-darwin
|
|
29
|
+
- os: macos-latest
|
|
30
|
+
platform: macos-arm64
|
|
31
|
+
rust_target: aarch64-apple-darwin
|
|
32
|
+
- os: windows-latest
|
|
33
|
+
platform: windows-x64
|
|
34
|
+
rust_target: x86_64-pc-windows-msvc
|
|
35
|
+
|
|
36
|
+
runs-on: ${{ matrix.os }}
|
|
37
|
+
|
|
38
|
+
steps:
|
|
39
|
+
- name: Checkout chgksuite
|
|
40
|
+
uses: actions/checkout@v4
|
|
41
|
+
|
|
42
|
+
- name: Checkout pyapp
|
|
43
|
+
uses: actions/checkout@v4
|
|
44
|
+
with:
|
|
45
|
+
repository: ofek/pyapp
|
|
46
|
+
path: pyapp
|
|
47
|
+
ref: v0.29.0
|
|
48
|
+
|
|
49
|
+
- name: Install Rust
|
|
50
|
+
uses: dtolnay/rust-toolchain@stable
|
|
51
|
+
with:
|
|
52
|
+
targets: ${{ matrix.rust_target }}
|
|
53
|
+
|
|
54
|
+
- name: Create build directory
|
|
55
|
+
shell: bash
|
|
56
|
+
run: mkdir -p artifacts
|
|
57
|
+
|
|
58
|
+
# Determine versions and create requirements files
|
|
59
|
+
- name: Setup build configuration
|
|
60
|
+
id: config
|
|
61
|
+
shell: bash
|
|
62
|
+
run: |
|
|
63
|
+
TAG="${{ inputs.tag || github.ref_name }}"
|
|
64
|
+
|
|
65
|
+
# Check if this is a release build (tag) or dev build (branch)
|
|
66
|
+
IS_RELEASE="false"
|
|
67
|
+
if [[ "${{ github.ref }}" == refs/tags/* ]] || [[ -n "${{ inputs.tag }}" ]]; then
|
|
68
|
+
IS_RELEASE="true"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# Extract version from tag (remove 'v' prefix if present)
|
|
72
|
+
if [[ "$TAG" =~ ^v ]]; then
|
|
73
|
+
VERSION="${TAG:1}"
|
|
74
|
+
else
|
|
75
|
+
VERSION="$TAG"
|
|
76
|
+
fi
|
|
77
|
+
|
|
78
|
+
# Fallback to reading from version.py if no tag
|
|
79
|
+
if [ -z "$VERSION" ] || [[ ! "$VERSION" =~ ^[0-9] ]]; then
|
|
80
|
+
VERSION=$(grep -oP '__version__\s*=\s*"\K[^"]+' chgksuite/version.py 2>/dev/null || \
|
|
81
|
+
grep -o '__version__\s*=\s*"[^"]*"' chgksuite/version.py | cut -d'"' -f2 || \
|
|
82
|
+
echo "0.0.0")
|
|
83
|
+
fi
|
|
84
|
+
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
|
85
|
+
echo "is_release=$IS_RELEASE" >> $GITHUB_OUTPUT
|
|
86
|
+
|
|
87
|
+
# For non-release builds, always use --pre to get latest beta versions
|
|
88
|
+
if [ "$IS_RELEASE" = "false" ]; then
|
|
89
|
+
PIP_PRE="--pre"
|
|
90
|
+
elif [[ "$VERSION" =~ (a|b|rc)[0-9]+ ]]; then
|
|
91
|
+
PIP_PRE="--pre"
|
|
92
|
+
else
|
|
93
|
+
PIP_PRE=""
|
|
94
|
+
fi
|
|
95
|
+
echo "pip_pre=$PIP_PRE" >> $GITHUB_OUTPUT
|
|
96
|
+
|
|
97
|
+
echo "Build configuration:"
|
|
98
|
+
echo " Version: $VERSION"
|
|
99
|
+
echo " Is release: $IS_RELEASE"
|
|
100
|
+
echo " Pip pre flag: $PIP_PRE"
|
|
101
|
+
|
|
102
|
+
# Create requirements files in pyapp directory to avoid Windows path issues
|
|
103
|
+
- name: Create requirements files
|
|
104
|
+
shell: bash
|
|
105
|
+
run: |
|
|
106
|
+
# Qt requirements
|
|
107
|
+
echo "chgksuite" > pyapp/requirements-qt.txt
|
|
108
|
+
echo "chgksuite-qt" >> pyapp/requirements-qt.txt
|
|
109
|
+
|
|
110
|
+
# Tk requirements
|
|
111
|
+
echo "chgksuite" > pyapp/requirements-tk.txt
|
|
112
|
+
echo "chgksuite-tk" >> pyapp/requirements-tk.txt
|
|
113
|
+
|
|
114
|
+
echo "=== Qt requirements ==="
|
|
115
|
+
cat pyapp/requirements-qt.txt
|
|
116
|
+
echo "=== Tk requirements ==="
|
|
117
|
+
cat pyapp/requirements-tk.txt
|
|
118
|
+
|
|
119
|
+
# Build Qt GUI (skip on linux-arm64 - no PyQt6 wheel)
|
|
120
|
+
- name: Build Qt GUI
|
|
121
|
+
if: matrix.platform != 'linux-arm64'
|
|
122
|
+
shell: bash
|
|
123
|
+
working-directory: pyapp
|
|
124
|
+
run: |
|
|
125
|
+
export PYAPP_PROJECT_NAME="chgksuite-qt"
|
|
126
|
+
export PYAPP_PROJECT_VERSION="${{ steps.config.outputs.version }}"
|
|
127
|
+
export PYAPP_PROJECT_DEPENDENCY_FILE="$(pwd)/requirements-qt.txt"
|
|
128
|
+
export PYAPP_EXEC_SPEC="chgksuite_qt.__main__:main"
|
|
129
|
+
export PYAPP_PYTHON_VERSION="3.12"
|
|
130
|
+
export PYAPP_IS_GUI="1"
|
|
131
|
+
export PYAPP_UV_ENABLED="1"
|
|
132
|
+
export PYAPP_PIP_EXTRA_ARGS="${{ steps.config.outputs.pip_pre }}"
|
|
133
|
+
|
|
134
|
+
echo "Building Qt GUI with:"
|
|
135
|
+
echo " PYAPP_PROJECT_DEPENDENCY_FILE=$PYAPP_PROJECT_DEPENDENCY_FILE"
|
|
136
|
+
echo " PYAPP_PIP_EXTRA_ARGS=$PYAPP_PIP_EXTRA_ARGS"
|
|
137
|
+
|
|
138
|
+
cargo build --release --target ${{ matrix.rust_target }}
|
|
139
|
+
|
|
140
|
+
# Copy binary with platform-specific naming
|
|
141
|
+
if [ "${{ runner.os }}" = "Windows" ]; then
|
|
142
|
+
cp target/${{ matrix.rust_target }}/release/pyapp.exe ../artifacts/chgkq-${{ matrix.platform }}.exe
|
|
143
|
+
else
|
|
144
|
+
cp target/${{ matrix.rust_target }}/release/pyapp ../artifacts/chgkq-${{ matrix.platform }}
|
|
145
|
+
fi
|
|
146
|
+
|
|
147
|
+
# Build Tk GUI
|
|
148
|
+
- name: Build Tk GUI
|
|
149
|
+
shell: bash
|
|
150
|
+
working-directory: pyapp
|
|
151
|
+
run: |
|
|
152
|
+
export PYAPP_PROJECT_NAME="chgksuite-tk"
|
|
153
|
+
export PYAPP_PROJECT_VERSION="${{ steps.config.outputs.version }}"
|
|
154
|
+
export PYAPP_PROJECT_DEPENDENCY_FILE="$(pwd)/requirements-tk.txt"
|
|
155
|
+
export PYAPP_EXEC_SPEC="chgksuite_tk.__main__:main"
|
|
156
|
+
export PYAPP_PYTHON_VERSION="3.12"
|
|
157
|
+
export PYAPP_IS_GUI="1"
|
|
158
|
+
export PYAPP_UV_ENABLED="1"
|
|
159
|
+
export PYAPP_PIP_EXTRA_ARGS="${{ steps.config.outputs.pip_pre }}"
|
|
160
|
+
|
|
161
|
+
echo "Building Tk GUI with:"
|
|
162
|
+
echo " PYAPP_PROJECT_DEPENDENCY_FILE=$PYAPP_PROJECT_DEPENDENCY_FILE"
|
|
163
|
+
echo " PYAPP_PIP_EXTRA_ARGS=$PYAPP_PIP_EXTRA_ARGS"
|
|
164
|
+
|
|
165
|
+
cargo build --release --target ${{ matrix.rust_target }}
|
|
166
|
+
|
|
167
|
+
# Copy binary with platform-specific naming
|
|
168
|
+
if [ "${{ runner.os }}" = "Windows" ]; then
|
|
169
|
+
cp target/${{ matrix.rust_target }}/release/pyapp.exe ../artifacts/chgkt-${{ matrix.platform }}.exe
|
|
170
|
+
else
|
|
171
|
+
cp target/${{ matrix.rust_target }}/release/pyapp ../artifacts/chgkt-${{ matrix.platform }}
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
# Create macOS .app bundles (required for Finder launch)
|
|
175
|
+
- name: Create macOS app bundles
|
|
176
|
+
if: runner.os == 'macOS'
|
|
177
|
+
shell: bash
|
|
178
|
+
run: |
|
|
179
|
+
# Create Qt .app bundle
|
|
180
|
+
if [ -f "artifacts/chgkq-${{ matrix.platform }}" ]; then
|
|
181
|
+
mkdir -p "artifacts/chgkq.app/Contents/MacOS"
|
|
182
|
+
mv "artifacts/chgkq-${{ matrix.platform }}" "artifacts/chgkq.app/Contents/MacOS/chgkq"
|
|
183
|
+
cat > "artifacts/chgkq.app/Contents/Info.plist" << 'EOF'
|
|
184
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
185
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
186
|
+
<plist version="1.0">
|
|
187
|
+
<dict>
|
|
188
|
+
<key>CFBundleExecutable</key>
|
|
189
|
+
<string>chgkq</string>
|
|
190
|
+
<key>CFBundleIdentifier</key>
|
|
191
|
+
<string>me.pecheny.chgkq</string>
|
|
192
|
+
<key>CFBundleName</key>
|
|
193
|
+
<string>chgksuite-qt</string>
|
|
194
|
+
<key>CFBundlePackageType</key>
|
|
195
|
+
<string>APPL</string>
|
|
196
|
+
<key>CFBundleVersion</key>
|
|
197
|
+
<string>${{ steps.config.outputs.version }}</string>
|
|
198
|
+
<key>CFBundleShortVersionString</key>
|
|
199
|
+
<string>${{ steps.config.outputs.version }}</string>
|
|
200
|
+
<key>LSMinimumSystemVersion</key>
|
|
201
|
+
<string>10.15</string>
|
|
202
|
+
<key>NSHighResolutionCapable</key>
|
|
203
|
+
<true/>
|
|
204
|
+
<key>LSEnvironment</key>
|
|
205
|
+
<dict>
|
|
206
|
+
<key>PYAPP</key>
|
|
207
|
+
<string>1</string>
|
|
208
|
+
</dict>
|
|
209
|
+
</dict>
|
|
210
|
+
</plist>
|
|
211
|
+
EOF
|
|
212
|
+
# Ad-hoc sign the app bundle to prevent "damaged" error
|
|
213
|
+
codesign --force --deep --sign - "artifacts/chgkq.app"
|
|
214
|
+
# Zip the .app bundle
|
|
215
|
+
cd artifacts && zip -r "chgkq-${{ matrix.platform }}.zip" chgkq.app && rm -rf chgkq.app && cd ..
|
|
216
|
+
fi
|
|
217
|
+
|
|
218
|
+
# Create Tk .app bundle
|
|
219
|
+
if [ -f "artifacts/chgkt-${{ matrix.platform }}" ]; then
|
|
220
|
+
mkdir -p "artifacts/chgkt.app/Contents/MacOS"
|
|
221
|
+
mv "artifacts/chgkt-${{ matrix.platform }}" "artifacts/chgkt.app/Contents/MacOS/chgkt"
|
|
222
|
+
cat > "artifacts/chgkt.app/Contents/Info.plist" << 'EOF'
|
|
223
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
224
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
225
|
+
<plist version="1.0">
|
|
226
|
+
<dict>
|
|
227
|
+
<key>CFBundleExecutable</key>
|
|
228
|
+
<string>chgkt</string>
|
|
229
|
+
<key>CFBundleIdentifier</key>
|
|
230
|
+
<string>me.pecheny.chgkt</string>
|
|
231
|
+
<key>CFBundleName</key>
|
|
232
|
+
<string>chgksuite-tk</string>
|
|
233
|
+
<key>CFBundlePackageType</key>
|
|
234
|
+
<string>APPL</string>
|
|
235
|
+
<key>CFBundleVersion</key>
|
|
236
|
+
<string>${{ steps.config.outputs.version }}</string>
|
|
237
|
+
<key>CFBundleShortVersionString</key>
|
|
238
|
+
<string>${{ steps.config.outputs.version }}</string>
|
|
239
|
+
<key>LSMinimumSystemVersion</key>
|
|
240
|
+
<string>10.15</string>
|
|
241
|
+
<key>NSHighResolutionCapable</key>
|
|
242
|
+
<true/>
|
|
243
|
+
<key>LSEnvironment</key>
|
|
244
|
+
<dict>
|
|
245
|
+
<key>PYAPP</key>
|
|
246
|
+
<string>1</string>
|
|
247
|
+
</dict>
|
|
248
|
+
</dict>
|
|
249
|
+
</plist>
|
|
250
|
+
EOF
|
|
251
|
+
# Ad-hoc sign the app bundle to prevent "damaged" error
|
|
252
|
+
codesign --force --deep --sign - "artifacts/chgkt.app"
|
|
253
|
+
# Zip the .app bundle
|
|
254
|
+
cd artifacts && zip -r "chgkt-${{ matrix.platform }}.zip" chgkt.app && rm -rf chgkt.app && cd ..
|
|
255
|
+
fi
|
|
256
|
+
|
|
257
|
+
- name: List artifacts
|
|
258
|
+
shell: bash
|
|
259
|
+
run: ls -lh artifacts/
|
|
260
|
+
|
|
261
|
+
- name: Upload artifacts
|
|
262
|
+
uses: actions/upload-artifact@v4
|
|
263
|
+
with:
|
|
264
|
+
name: builds-${{ matrix.platform }}
|
|
265
|
+
path: artifacts/*
|
|
266
|
+
|
|
267
|
+
release:
|
|
268
|
+
needs: build
|
|
269
|
+
runs-on: ubuntu-latest
|
|
270
|
+
if: startsWith(github.ref, 'refs/tags/') || inputs.tag != ''
|
|
271
|
+
permissions:
|
|
272
|
+
contents: write
|
|
273
|
+
|
|
274
|
+
steps:
|
|
275
|
+
- name: Download all artifacts
|
|
276
|
+
uses: actions/download-artifact@v4
|
|
277
|
+
with:
|
|
278
|
+
path: artifacts
|
|
279
|
+
merge-multiple: true
|
|
280
|
+
|
|
281
|
+
- name: List artifacts
|
|
282
|
+
run: ls -la artifacts/
|
|
283
|
+
|
|
284
|
+
- name: Create Release
|
|
285
|
+
uses: softprops/action-gh-release@v1
|
|
286
|
+
with:
|
|
287
|
+
tag_name: ${{ inputs.tag || github.ref_name }}
|
|
288
|
+
files: artifacts/*
|
|
289
|
+
generate_release_notes: true
|
|
290
|
+
env:
|
|
291
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
image: python:3.14-trixie
|
|
2
|
+
|
|
3
|
+
before_script:
|
|
4
|
+
- pip install zensical
|
|
5
|
+
|
|
6
|
+
pages:
|
|
7
|
+
stage: deploy
|
|
8
|
+
script:
|
|
9
|
+
- cd docs
|
|
10
|
+
- zensical build
|
|
11
|
+
- mv public ../public
|
|
12
|
+
- cd ..
|
|
13
|
+
artifacts:
|
|
14
|
+
paths:
|
|
15
|
+
- public
|
|
16
|
+
rules:
|
|
17
|
+
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
,pecheny,pecheny-CQ5TXQ57J0,20.04.2025 22:07,file:///Users/pecheny/Library/Application%20Support/LibreOffice/4;
|
|
@@ -1,23 +1,21 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: chgksuite
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.27.0
|
|
4
4
|
Summary: A package for chgk automation
|
|
5
|
-
|
|
6
|
-
Author: Alexander Pecheny
|
|
7
|
-
|
|
8
|
-
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
-
Classifier: Operating System :: OS Independent
|
|
11
|
-
Description-Content-Type: text/markdown
|
|
5
|
+
Project-URL: Homepage, https://gitlab.com/peczony/chgksuite
|
|
6
|
+
Author-email: Alexander Pecheny <ap@pecheny.me>
|
|
7
|
+
License-Expression: MIT
|
|
12
8
|
License-File: LICENSE
|
|
9
|
+
Classifier: Operating System :: OS Independent
|
|
10
|
+
Classifier: Programming Language :: Python :: 3
|
|
11
|
+
Requires-Python: >=3.9
|
|
13
12
|
Requires-Dist: beautifulsoup4
|
|
14
13
|
Requires-Dist: chardet
|
|
15
|
-
Requires-Dist: dashtable
|
|
16
14
|
Requires-Dist: dateparser
|
|
17
15
|
Requires-Dist: mammoth
|
|
18
16
|
Requires-Dist: openpyxl
|
|
19
17
|
Requires-Dist: parse
|
|
20
|
-
Requires-Dist:
|
|
18
|
+
Requires-Dist: pillow
|
|
21
19
|
Requires-Dist: ply
|
|
22
20
|
Requires-Dist: pypandoc
|
|
23
21
|
Requires-Dist: pypdf
|
|
@@ -27,16 +25,9 @@ Requires-Dist: python-pptx
|
|
|
27
25
|
Requires-Dist: python-telegram-bot
|
|
28
26
|
Requires-Dist: requests
|
|
29
27
|
Requires-Dist: toml
|
|
28
|
+
Requires-Dist: urllib3>=2.6.2
|
|
30
29
|
Requires-Dist: watchdog
|
|
31
|
-
|
|
32
|
-
Dynamic: author-email
|
|
33
|
-
Dynamic: classifier
|
|
34
|
-
Dynamic: description
|
|
35
|
-
Dynamic: description-content-type
|
|
36
|
-
Dynamic: home-page
|
|
37
|
-
Dynamic: license-file
|
|
38
|
-
Dynamic: requires-dist
|
|
39
|
-
Dynamic: summary
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
40
31
|
|
|
41
32
|
**chgksuite** is an utility that helps chgk editors.
|
|
42
33
|
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import json
|
|
3
|
+
import re
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def process_json_files(directory):
|
|
7
|
+
# Pattern to match filenames starting with "regexes_" and ending with ".json"
|
|
8
|
+
pattern = re.compile(r"^regexes_.*\.json$")
|
|
9
|
+
|
|
10
|
+
# Count for reporting
|
|
11
|
+
processed_files = 0
|
|
12
|
+
|
|
13
|
+
# Walk through the directory
|
|
14
|
+
for root, _, files in os.walk(directory):
|
|
15
|
+
for filename in files:
|
|
16
|
+
# Check if the filename matches our pattern
|
|
17
|
+
if pattern.match(filename):
|
|
18
|
+
filepath = os.path.join(root, filename)
|
|
19
|
+
print(f"Processing file: {filepath}")
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
# Load the JSON content
|
|
23
|
+
with open(filepath, "r", encoding="utf-8") as file:
|
|
24
|
+
data = json.load(file)
|
|
25
|
+
|
|
26
|
+
# Make sure it's a dictionary
|
|
27
|
+
if not isinstance(data, dict):
|
|
28
|
+
print(
|
|
29
|
+
f" Warning: {filepath} does not contain a dictionary. Skipping."
|
|
30
|
+
)
|
|
31
|
+
continue
|
|
32
|
+
|
|
33
|
+
# Replace spaces with '\s' in all values
|
|
34
|
+
modified = False
|
|
35
|
+
for key, value in data.items():
|
|
36
|
+
if isinstance(value, str) and " " in value:
|
|
37
|
+
data[key] = value.replace(" ", "\\s")
|
|
38
|
+
modified = True
|
|
39
|
+
|
|
40
|
+
# Save the modified content only if changes were made
|
|
41
|
+
if modified:
|
|
42
|
+
with open(filepath, "w", encoding="utf-8") as file:
|
|
43
|
+
json.dump(data, file, ensure_ascii=False, indent=4)
|
|
44
|
+
print(f" Updated {filepath}")
|
|
45
|
+
else:
|
|
46
|
+
print(f" No spaces found in values of {filepath}")
|
|
47
|
+
|
|
48
|
+
processed_files += 1
|
|
49
|
+
|
|
50
|
+
except json.JSONDecodeError:
|
|
51
|
+
print(f" Error: {filepath} is not a valid JSON file. Skipping.")
|
|
52
|
+
except Exception as e:
|
|
53
|
+
print(f" Error processing {filepath}: {str(e)}")
|
|
54
|
+
|
|
55
|
+
print(f"\nSummary: Processed {processed_files} JSON files.")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if __name__ == "__main__":
|
|
59
|
+
# Get the directory from user
|
|
60
|
+
directory = input("Enter the directory path to search: ")
|
|
61
|
+
|
|
62
|
+
# Validate directory exists
|
|
63
|
+
if not os.path.isdir(directory):
|
|
64
|
+
print(f"Error: '{directory}' is not a valid directory.")
|
|
65
|
+
else:
|
|
66
|
+
process_json_files(directory)
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
#!usr/bin/env python
|
|
2
|
+
#! -*- coding: utf-8 -*-
|
|
3
|
+
import argparse
|
|
4
|
+
from collections import Counter
|
|
5
|
+
|
|
6
|
+
from chgksuite.composer import parse_4s
|
|
7
|
+
|
|
8
|
+
parser = argparse.ArgumentParser()
|
|
9
|
+
parser.add_argument("filename")
|
|
10
|
+
args = parser.parse_args()
|
|
11
|
+
|
|
12
|
+
authors = Counter()
|
|
13
|
+
|
|
14
|
+
with open(args.filename, "r", encoding="utf-8") as f:
|
|
15
|
+
structure = parse_4s(f.read().replace("\r", ""))
|
|
16
|
+
|
|
17
|
+
for element in structure:
|
|
18
|
+
if element[0] == "Question":
|
|
19
|
+
if "author" in element[1]:
|
|
20
|
+
authors[element[1]["author"].replace("`", "")] += 1
|
|
21
|
+
|
|
22
|
+
for au in authors.most_common():
|
|
23
|
+
print("{}\t{}".format(au[0], au[1]))
|
|
24
|
+
print("Total: {}".format(sum(authors.values())))
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Simple HTML table to Markdown converter.
|
|
2
|
+
|
|
3
|
+
Replaces dashtable.html2md with a minimal implementation that avoids
|
|
4
|
+
deprecated BeautifulSoup methods.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from bs4 import BeautifulSoup
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def html2md(html_string: str) -> str:
|
|
11
|
+
"""Convert an HTML table to a Markdown table string.
|
|
12
|
+
|
|
13
|
+
Parameters
|
|
14
|
+
----------
|
|
15
|
+
html_string : str
|
|
16
|
+
HTML string containing a table
|
|
17
|
+
|
|
18
|
+
Returns
|
|
19
|
+
-------
|
|
20
|
+
str
|
|
21
|
+
The table formatted as Markdown
|
|
22
|
+
"""
|
|
23
|
+
soup = BeautifulSoup(html_string, "html.parser")
|
|
24
|
+
table = soup.find("table")
|
|
25
|
+
|
|
26
|
+
if not table:
|
|
27
|
+
return ""
|
|
28
|
+
|
|
29
|
+
rows = table.find_all("tr")
|
|
30
|
+
if not rows:
|
|
31
|
+
return ""
|
|
32
|
+
|
|
33
|
+
# Extract all rows as lists of cell texts
|
|
34
|
+
data = []
|
|
35
|
+
for row in rows:
|
|
36
|
+
# Check for header cells first, then data cells
|
|
37
|
+
cells = row.find_all("th")
|
|
38
|
+
if not cells:
|
|
39
|
+
cells = row.find_all("td")
|
|
40
|
+
|
|
41
|
+
row_data = []
|
|
42
|
+
for cell in cells:
|
|
43
|
+
# Get text, normalize whitespace
|
|
44
|
+
text = " ".join(cell.get_text().split())
|
|
45
|
+
row_data.append(text)
|
|
46
|
+
if row_data:
|
|
47
|
+
data.append(row_data)
|
|
48
|
+
|
|
49
|
+
if not data:
|
|
50
|
+
return ""
|
|
51
|
+
|
|
52
|
+
# Normalize row lengths (pad shorter rows)
|
|
53
|
+
max_cols = max(len(row) for row in data)
|
|
54
|
+
for row in data:
|
|
55
|
+
while len(row) < max_cols:
|
|
56
|
+
row.append("")
|
|
57
|
+
|
|
58
|
+
# Calculate column widths (minimum 3 for markdown separator)
|
|
59
|
+
# Add 2 for space cushions on each side
|
|
60
|
+
widths = []
|
|
61
|
+
for col in range(max_cols):
|
|
62
|
+
width = max(len(row[col]) for row in data)
|
|
63
|
+
widths.append(max(width + 2, 3))
|
|
64
|
+
|
|
65
|
+
# Build markdown table
|
|
66
|
+
lines = []
|
|
67
|
+
|
|
68
|
+
# Header row (centered, with padding)
|
|
69
|
+
header = "|" + "|".join(_center(cell, widths[i]) for i, cell in enumerate(data[0])) + "|"
|
|
70
|
+
lines.append(header)
|
|
71
|
+
|
|
72
|
+
# Separator row (no spaces to avoid typotools converting --- to em-dash)
|
|
73
|
+
separator = "|" + "|".join("-" * w for w in widths) + "|"
|
|
74
|
+
lines.append(separator)
|
|
75
|
+
|
|
76
|
+
# Data rows (centered, with padding)
|
|
77
|
+
for row in data[1:]:
|
|
78
|
+
line = "|" + "|".join(_center(cell, widths[i]) for i, cell in enumerate(row)) + "|"
|
|
79
|
+
lines.append(line)
|
|
80
|
+
|
|
81
|
+
return "\n".join(lines)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _center(text: str, width: int) -> str:
|
|
85
|
+
"""Center text within width, with space padding."""
|
|
86
|
+
text = text.strip()
|
|
87
|
+
padding = width - len(text)
|
|
88
|
+
left = padding // 2
|
|
89
|
+
right = padding - left
|
|
90
|
+
return " " * left + text + " " * right
|
|
@@ -13,12 +13,14 @@ from chgksuite.common import (
|
|
|
13
13
|
)
|
|
14
14
|
from chgksuite.composer import gui_compose
|
|
15
15
|
from chgksuite.handouter.runner import gui_handouter
|
|
16
|
-
from chgksuite.handouter.tex_internals import GREYTEXT_LANGS
|
|
17
16
|
from chgksuite.parser import gui_parse
|
|
18
17
|
from chgksuite.trello import gui_trello
|
|
19
18
|
from chgksuite.version import __version__
|
|
20
19
|
|
|
21
|
-
LANGS = ["by", "by_tar", "en", "kz_cyr", "ru", "sr", "ua", "uz", "uz_cyr"] + [
|
|
20
|
+
LANGS = ["az", "by", "by_tar", "en", "kz_cyr", "ru", "sr", "ua", "uz", "uz_cyr"] + [
|
|
21
|
+
"custom"
|
|
22
|
+
]
|
|
23
|
+
HANDOUT_LANGS = [lang for lang in LANGS if lang != "custom"]
|
|
22
24
|
|
|
23
25
|
debug = False
|
|
24
26
|
|
|
@@ -594,6 +596,15 @@ class ArgparseBuilder:
|
|
|
594
596
|
caption="Имя 4s-файла",
|
|
595
597
|
filetypes=[("chgksuite markup files", "*.4s")],
|
|
596
598
|
)
|
|
599
|
+
cmdcompose_markdown = cmdcompose_filetype.add_parser("markdown")
|
|
600
|
+
self.add_argument(
|
|
601
|
+
cmdcompose_markdown,
|
|
602
|
+
"filename",
|
|
603
|
+
nargs="*",
|
|
604
|
+
help="file(s) to compose from.",
|
|
605
|
+
caption="Имя 4s-файла",
|
|
606
|
+
filetypes=[("chgksuite markup files", "*.4s")],
|
|
607
|
+
)
|
|
597
608
|
cmdcompose_pptx = cmdcompose_filetype.add_parser("pptx")
|
|
598
609
|
self.add_argument(
|
|
599
610
|
cmdcompose_pptx,
|
|
@@ -889,10 +900,11 @@ class ArgparseBuilder:
|
|
|
889
900
|
)
|
|
890
901
|
self.add_argument(
|
|
891
902
|
cmdhandouts_run,
|
|
892
|
-
"--
|
|
903
|
+
"--language",
|
|
904
|
+
"-lang",
|
|
893
905
|
default="ru",
|
|
894
906
|
argtype="radiobutton",
|
|
895
|
-
choices=sorted(
|
|
907
|
+
choices=sorted(HANDOUT_LANGS),
|
|
896
908
|
help="language",
|
|
897
909
|
caption="Язык",
|
|
898
910
|
advanced=True,
|
|
@@ -1012,12 +1024,13 @@ class ArgparseBuilder:
|
|
|
1012
1024
|
)
|
|
1013
1025
|
self.add_argument(
|
|
1014
1026
|
cmdhandouts_generate,
|
|
1015
|
-
"--
|
|
1027
|
+
"--language",
|
|
1028
|
+
"-lang",
|
|
1016
1029
|
default="ru",
|
|
1017
1030
|
help="language",
|
|
1018
1031
|
caption="Язык",
|
|
1019
1032
|
argtype="radiobutton",
|
|
1020
|
-
choices=sorted(
|
|
1033
|
+
choices=sorted(HANDOUT_LANGS),
|
|
1021
1034
|
advanced=True,
|
|
1022
1035
|
)
|
|
1023
1036
|
self.add_argument(
|
|
@@ -1084,9 +1097,9 @@ def single_action(args, use_wrapper, resourcedir):
|
|
|
1084
1097
|
args.console_mode = True
|
|
1085
1098
|
|
|
1086
1099
|
if args.language in LANGS:
|
|
1100
|
+
args.regexes_file = os.path.join(resourcedir, f"regexes_{args.language}.json")
|
|
1087
1101
|
if args.action == "parse":
|
|
1088
|
-
|
|
1089
|
-
args.regexes = os.path.join(resourcedir, f"regexes_{regex_lang}.json")
|
|
1102
|
+
args.regexes = args.regexes_file
|
|
1090
1103
|
args.labels_file = os.path.join(resourcedir, f"labels_{args.language}.toml")
|
|
1091
1104
|
if not args.docx_template:
|
|
1092
1105
|
args.docx_template = os.path.join(resourcedir, "template.docx")
|