""" Пересобирает results/source-bundle.md и results/source-toc.md из очищенных исходников v1/ (без taffy и без backup-каталогов). Запуск: python3 build_bundle.py Что делает: 1. Обходит v1/ рекурсивно, собирает все .cfc и .cfm файлы (исключая taffy/ и bk/) 2. Формирует results/source-bundle.md — один большой MD, каждый файл как раздел ## filepath + код в блоке ```cfml 3. Формирует results/source-toc.md — оглавление с номерами строк в bundle (не страниц) Настройки: ROOT — корневая директория исходников SKIP — папки, которые исключаются из обхода OUT_DIR — куда писать результирующие файлы """ import os import re from datetime import date ROOT = 'v1' SKIP = ['taffy', 'bk'] OUT_DIR = 'results' BUILD_DATE = date.today().isoformat() def collect_files(root, skip): files = [] for dirpath, dirnames, filenames in os.walk(root): dirnames[:] = sorted([d for d in dirnames if d not in skip]) for fname in sorted(filenames): if fname.endswith('.cfc') or fname.endswith('.cfm'): files.append(os.path.join(dirpath, fname)) return files def build_bundle(files): lines = [] lines.append(f'# Исходники svc-api-x\n') lines.append(f'Дата сборки: {BUILD_DATE}\n') lines.append('Прикладной слой после cleanup: v1/ без taffy и без backup-каталогов.\n') for fpath in files: with open(fpath, encoding='utf-8', errors='ignore') as f: code = f.read().rstrip('\n') lines.append(f'\n## {fpath}\n') lines.append(f'\n```cfml\n{code}\n```\n') return '\n'.join(lines) def build_toc(bundle_content): bundle_lines = bundle_content.split('\n') toc_entries = [] for i, line in enumerate(bundle_lines, 1): m = re.match(r'^## (.+)$', line) if m: toc_entries.append((m.group(1).strip(), i)) out = [] out.append(f'# Оглавление исходников svc-api-x\n') out.append(f'Дата сборки: {BUILD_DATE}\n') out.append('\n## Прикладной слой\n') out.append('```text') for rel, lineno in toc_entries: dots = '.' * max(1, 55 - len(rel) - len(str(lineno))) out.append(f'{rel} {dots} {lineno}') out.append('```') return '\n'.join(out) + '\n' if __name__ == '__main__': files = collect_files(ROOT, SKIP) bundle = build_bundle(files) bundle_path = os.path.join(OUT_DIR, 'source-bundle.md') with open(bundle_path, 'w', encoding='utf-8') as f: f.write(bundle) toc = build_toc(bundle) toc_path = os.path.join(OUT_DIR, 'source-toc.md') with open(toc_path, 'w', encoding='utf-8') as f: f.write(toc) print(f'Файлов в bundle: {len(files)}') print(f'{bundle_path} — готово') print(f'{toc_path} — готово')