commit 683e32bee8bf5ab279fa34bce12b619190484def Author: Vladislav Ostapov Date: Tue May 27 10:15:34 2025 +0300 первый коммит diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..31ac57c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea +gost-espd-generator.iml +venv +result-* + diff --git a/README.md b/README.md new file mode 100644 index 0000000..8710758 --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# ГОСТ-ЕСПД генератор документов + +## Генератор документа с исходным кодом + +Запускать в той же директории, что и находится проект. + +Использование: + +```shell +python3 source_code_generator.py /path/to/source/code /path/to/out.docx DOC.NUMBER +``` + +После генерации нужно будет обновить ссылки в содержании и исправить текст в первых листах. diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..4ad9640 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +docxtpl + diff --git a/source_code_generator.py b/source_code_generator.py new file mode 100644 index 0000000..05f8d6e --- /dev/null +++ b/source_code_generator.py @@ -0,0 +1,44 @@ +from docxtpl import DocxTemplate +from pathlib import Path +import sys + +# Загрузка шаблона +doc = DocxTemplate("template/source-code-template.docx") + + +def get_sources(source_root): + filenames = [str(path.absolute())[len(source_root):] for path in Path(source_root).rglob('*.*')] + filenames.sort() + return filenames + + +def _get_file_context(source_root, filename): + with open(source_root + filename, 'r', encoding="utf8") as f: + return { + 'filename': filename.replace('\\', '/'), # для шиндовс, чтобы правильно генерить пути + 'content': f.read() + } + + +def render_source_code(source_root, out_filename, doc_number="РОФ.ГУТВ.00000-12"): + # Данные для заполнения шаблона + context = { + 'doc_number': doc_number, + 'files': [ + _get_file_context(source_root, src) + for src in get_sources(source_root) + ] + } + + # Заполнение шаблона данными + doc.render(context) + + # Сохранение документа + doc.save(out_filename) + + +if __name__ == '__main__': + if len(sys.argv) != 4: + print(f"Usage: {sys.argv[0]} /path/to/source/code /path/to/out.docx DOC.NUMBER") + else: + render_source_code(sys.argv[1], sys.argv[2], doc_number=sys.argv[3]) diff --git a/template/source-code-template.docx b/template/source-code-template.docx new file mode 100644 index 0000000..6ea52a5 Binary files /dev/null and b/template/source-code-template.docx differ