- 新增 PdfExporter(reportlab)与 DocxExporter(python-docx),实现与 HtmlExporter 一致的同步 render + 异步 export,v1 文本优先(标题/段落/ 行内强调与链接/列表/引用/表格/代码块/数学文本),function_plot 与 mermaid 保留源码占位并记 warning。 - service 层加 _EXPORTERS 注册表按格式分发,删除 format!=html 硬限制, 扩展名/MIME/产物清理泛化到 html/pdf/docx 三种格式。 - 新增 app/plot/renderer.py:StaticRenderRequest + StaticRenderer Protocol + FunctionPlotStaticRenderer + MermaidStaticRenderer;HtmlExporter 改经 FunctionPlotStaticRenderer 消费,去除对 render_svg 的直接依赖。 - 补齐 PDF/DOCX 魔法字节、CJK 字体、占位 warning 与 StaticRenderer 契约测试。 - 更新 Export开发说明.md。 Co-Authored-By: Claude Code <noreply@anthropic.com>
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
"""导出器共享工具:URL 协议校验与占位 warning 文案。
|
|
|
|
html / pdf / docx 三个导出器共用同一套安全规则,避免各写一份导致行为漂移。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from urllib.parse import urlparse
|
|
|
|
# 链接/图片地址允许的协议;无 scheme 的相对地址视为安全,其余协议一律降级
|
|
ALLOWED_URL_SCHEMES = frozenset({"http", "https", "mailto"})
|
|
|
|
MERMAID_WARNING = "mermaid 需前端渲染,已保留为占位代码块"
|
|
RAW_HTML_WARNING = "原始 HTML 已按纯文本转义保留"
|
|
# PDF/DOCX 暂不支持静态渲染函数图像,统一回退源码占位
|
|
PLOT_PLACEHOLDER_WARNING = "函数图像:该格式暂不支持静态渲染,已保留为源码占位"
|
|
|
|
|
|
def safe_url(url: str) -> str | None:
|
|
"""校验 URL 协议;安全返回原串,不安全返回 None。"""
|
|
url = url.strip()
|
|
if not url:
|
|
return None
|
|
scheme = urlparse(url).scheme.lower()
|
|
if scheme and scheme not in ALLOWED_URL_SCHEMES:
|
|
return None
|
|
return url
|
|
|
|
|
|
def format_meta_value(value: object) -> str:
|
|
"""把元数据值转成可读文本:datetime 转 ISO、列表用逗号连接。"""
|
|
if isinstance(value, datetime):
|
|
return value.isoformat()
|
|
if isinstance(value, list):
|
|
return ", ".join(str(item) for item in value)
|
|
return str(value)
|