diff --git a/md2gost/__init__.py b/md2gost/__init__.py new file mode 100644 index 0000000..9e21d00 --- /dev/null +++ b/md2gost/__init__.py @@ -0,0 +1,6 @@ +"""md2gost — Markdown в DOCX по ГОСТ 7.32-2017""" + +from .converter import DocumentSettings, MarkdownToDocxConverter + +__version__ = "1.0.0" +__all__ = ["DocumentSettings", "MarkdownToDocxConverter", "__version__"] diff --git a/md2gost/__main__.py b/md2gost/__main__.py new file mode 100644 index 0000000..dd8a8c9 --- /dev/null +++ b/md2gost/__main__.py @@ -0,0 +1,5 @@ +import sys + +from .cli import main + +sys.exit(main()) diff --git a/md2gost/cli.py b/md2gost/cli.py new file mode 100644 index 0000000..81cc502 --- /dev/null +++ b/md2gost/cli.py @@ -0,0 +1,47 @@ +import argparse +import sys +from pathlib import Path + +from . import __version__ +from .converter import DocumentSettings, MarkdownToDocxConverter + + +def build_parser(): + parser = argparse.ArgumentParser( + prog="md2gost", + description="Конвертирует Markdown в DOCX, оформленный по ГОСТ 7.32-2017: поля, шрифт, интервалы, " + "нумерация страниц и заголовков, таблицы, списки, сноски, список литературы.", + ) + parser.add_argument("input", type=Path, help="файл .md") + parser.add_argument("-o", "--output", type=Path, help="куда сохранить .docx (по умолчанию — рядом с .md)") + parser.add_argument("--font", default="Times New Roman", help="шрифт (по умолчанию Times New Roman)") + parser.add_argument("--size", type=int, default=14, help="размер основного текста, пт (по умолчанию 14)") + parser.add_argument("--spacing", type=float, default=1.5, help="межстрочный интервал (по умолчанию 1.5)") + parser.add_argument("--no-heading-numbers", action="store_true", help="не нумеровать заголовки") + parser.add_argument("--no-page-numbers", action="store_true", help="не нумеровать страницы") + parser.add_argument("--number-title-page", action="store_true", help="ставить номер и на первой странице") + parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}") + return parser + + +def main(argv=None): + args = build_parser().parse_args(argv) + if not args.input.is_file(): + print(f"md2gost: файл не найден: {args.input}", file=sys.stderr) + return 1 + + settings = DocumentSettings() + settings.font_name = args.font + settings.font_size = args.size + settings.line_spacing = args.spacing + settings.auto_numbering_headings = not args.no_heading_numbers + settings.page_numbering = not args.no_page_numbers + settings.exclude_title_page_numbering = not args.number_title_page + + output = MarkdownToDocxConverter(settings).convert(str(args.input), str(args.output) if args.output else None) + print(output) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b9ec4f0 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,44 @@ +[build-system] +requires = ["hatchling>=1.24"] +build-backend = "hatchling.build" + +[project] +name = "md2gost" +dynamic = ["version"] +description = "Markdown to DOCX formatted per GOST 7.32-2017 (Russian standard for reports)" +readme = "README.en.md" +license = "MIT" +license-files = ["LICENSE"] +authors = [{ name = "Egor Deev", email = "egor@deev.space" }] +requires-python = ">=3.9" +dependencies = ["python-docx>=1.1"] +keywords = ["markdown", "docx", "gost", "word", "report", "converter"] +classifiers = [ + "Programming Language :: Python :: 3", + "Operating System :: OS Independent", + "Environment :: Console", + "Natural Language :: Russian", + "Topic :: Office/Business :: Office Suites", + "Topic :: Text Processing :: Markup :: Markdown", +] + +[project.urls] +Homepage = "https://github.com/EDeev/my_converterbot" +Issues = "https://github.com/EDeev/my_converterbot/issues" +Bot = "https://t.me/my_convbot" + +[project.scripts] +md2gost = "md2gost.cli:main" + +[tool.hatch.version] +path = "md2gost/__init__.py" + +[tool.hatch.build.targets.wheel] +packages = ["md2gost"] + +[tool.hatch.build.targets.sdist] +include = ["md2gost", "tests/test_md2gost.py", "README.md", "README.en.md", "LICENSE"] + +[tool.ruff] +target-version = "py39" +line-length = 120