Files
_Geulbeot/03.Code/geulbeot_업로드용/handlers/template/doc_template_analyzer.py

54 lines
2.3 KiB
Python

# -*- coding: utf-8 -*-
"""
문서 템플릿 분석기 v5.1 (자동 추출 방식)
"""
import json
from pathlib import Path
from .tools import (
page_setup, font, char_style, para_style, border_fill,
table, header_footer, section, style_def, numbering,
image, content_order
)
class DocTemplateAnalyzer:
def analyze(self, parsed: dict) -> dict:
raw_xml = parsed.get("raw_xml", {})
extractors = {
"page": lambda: page_setup.extract(raw_xml, parsed),
"fonts": lambda: font.extract(raw_xml, parsed),
"char_styles": lambda: char_style.extract(raw_xml, parsed),
"para_styles": lambda: para_style.extract(raw_xml, parsed),
"border_fills": lambda: border_fill.extract(raw_xml, parsed),
"tables": lambda: table.extract(raw_xml, parsed),
"header": lambda: header_footer.extract_header(raw_xml, parsed),
"footer": lambda: header_footer.extract_footer(raw_xml, parsed),
"section": lambda: section.extract(raw_xml, parsed),
"styles": lambda: style_def.extract(raw_xml, parsed),
"numbering": lambda: numbering.extract(raw_xml, parsed),
"images": lambda: image.extract(raw_xml, parsed),
"content_order":lambda: content_order.extract(raw_xml, parsed),
}
result = {}
for key, extractor in extractors.items():
try:
value = extractor()
if value is not None:
result[key] = value
except Exception as e:
result.setdefault("_errors", []).append(f"{key}: {type(e).__name__}: {e}")
return result
def merge_user_config(self, template_info: dict, config: dict) -> dict:
user_overrides = config.get("user_overrides", {})
if not user_overrides:
return template_info
template_info["user_overrides"] = user_overrides
return template_info
def save_style(self, template_info: dict, save_path: Path) -> Path:
save_path = Path(save_path)
save_path.parent.mkdir(parents=True, exist_ok=True)
with open(save_path, 'w', encoding='utf-8') as f:
json.dump(template_info, f, ensure_ascii=False, indent=2)
return save_path