54 lines
2.3 KiB
Python
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
|