"""Export service for VoIdea — JSON, Markdown, HTML (printable as PDF).""" import json from datetime import datetime from typing import Any def export_json( title: str, content: str, metadata: dict[str, Any] | None = None, ) -> str: data = { "title": title, "exported_at": datetime.utcnow().isoformat(), "content": content, "metadata": metadata or {}, } return json.dumps(data, ensure_ascii=False, indent=2) def export_markdown( title: str, content: str, metadata: dict[str, Any] | None = None, ) -> str: lines = [f"# {title}", ""] if metadata: for k, v in metadata.items(): lines.append(f"- **{k}**: {v}") lines.append("") lines.append("---") lines.append("") lines.append(content) lines.append("") lines.append(f"*Экспортировано {datetime.utcnow().isoformat()}*") return "\n".join(lines) def export_html( title: str, content: str, metadata: dict[str, Any] | None = None, ) -> str: meta_rows = "" if metadata: for k, v in metadata.items(): meta_rows += f"{k}{v}\n" content_html = content.replace("\n", "
\n") return f""" {title}

{title}

{meta_rows}

{content_html}
""" CONTENT_TYPE_MAP = { "json": "application/json", "md": "text/markdown; charset=utf-8", "html": "text/html; charset=utf-8", } FILE_EXT_MAP = { "json": "json", "md": "md", "html": "html", } def export_content( fmt: str, title: str, content: str, metadata: dict[str, Any] | None = None, ) -> tuple[str, str, str]: """Export content in requested format. Returns (content_str, content_type, file_extension). """ fmt = fmt.lower() if fmt == "json": return export_json(title, content, metadata), CONTENT_TYPE_MAP["json"], FILE_EXT_MAP["json"] elif fmt == "md": return export_markdown(title, content, metadata), CONTENT_TYPE_MAP["md"], FILE_EXT_MAP["md"] else: return export_html(title, content, metadata), CONTENT_TYPE_MAP["html"], FILE_EXT_MAP["html"]