feat/export-service
main
Export Service:把笔记或未保存的 Markdown 文本导出为 HTML / PDF / DOCX 的完整链路——创建即返回 queued、后台 asyncio.Task 渲染、产物 24h 过期、轮询 GET /api/exports/{job_id} 下载。
queued
GET /api/exports/{job_id}
renderer="ast"
DocumentNode
DocumentExporter
HtmlExporter
PdfExporter
Drawing
DocxExporter
w:eastAsia=宋体
parser.py
compute_geometry
render.py
render_reportlab.py
StaticRenderer
renderer.py
app/contracts.py
app/routes.py
/api/exports*
tests/test_export.py
tests/test_plot.py
docs/development/Export开发说明.md
720 passed
git diff --check
暂不建议合并,仍有以下问题需要修复:
函数图像采样仅排除了非有限坐标,没有将曲线裁剪到绘图区。
例如设置 range: -1, 1 并绘制 y = 10*x 时,生成的曲线坐标会远超图表和页面范围。ReportLab 不会像 SVG viewport 一样自动裁剪,可能导致曲线覆盖 PDF 中的其他内容。
range: -1, 1
y = 10*x
建议:
range
纵轴标签先使用绝对坐标定位,随后又以相同坐标作为旋转中心,造成坐标重复变换。实测标签边界落在负数横坐标区域,因此导出的 PDF 中无法正常显示纵轴标签。
当前实现已经支持把 Function Plot 作为矢量图嵌入 PDF,但 pdf.py 的模块说明仍称函数图像使用占位内容,请同步更新。
pdf.py
上一轮提出的问题均已解决:
717 passed
另外,本 PR 后续加入了 PDF 函数图像矢量渲染,但标题和描述尚未体现,测试数量仍写为 711。建议修复上述问题后同步更新 PR 描述和测试结果。
这三条意见与上一轮(PR #39)一致,且均已在本 PR 的 head edc41fd(fix(export): 裁剪超出范围的曲线并修正 PDF 纵轴标签)中修复;审阅到的内容似乎仍是旧提交状态:
edc41fd
fix(export): 裁剪超出范围的曲线并修正 PDF 纵轴标签
app/plot/render.py
_PLOT_X0/Y0
_PLOT_X1/Y1
test_compute_geometry_clips_curves_to_plot_rect
app/plot/render_reportlab.py
String(0,0)
translate
rotate
T·R
test_render_reportlab_ylabel_within_drawing_bounds
完整测试 719 passed,PR 标题与描述已同步(不再是 711)。烦请对当前 head edc41fd 重新审阅。
暂不建议合并,渐近线问题。
当前实现只在采样结果为非有限值时断开折线。如果渐近点恰好位于两个采样点之间,两侧采样结果仍是有限值,随后会被 Liang-Barsky 算法裁剪成贯穿整个绘图区的伪线段。
已复现:
domain: -1, 1 range: -10, 10 y = 1/(x-0.013)
该配置会生成一条从绘图区底部延伸到顶部的错误竖线。
本 PR 实际包含整个 Export Service:
但当前标题和描述主要说明曲线裁剪及纵轴标签修复,无法准确反映实际合并范围。建议同步补全 PR 标题和描述,便于后续审阅、变更追踪和问题复盘。
719 passed
P2 渐近线错误连接已修复(head 4276cb7):
4276cb7
< ymin
> ymax
test_compute_geometry_breaks_at_asymptote
domain:-1,1 range:-10,10 y=1/(x-0.013)
PR 标题/描述已补全为整个 Export Service 范围(HTML / PDF / DOCX + 函数图像渲染,28 文件 / +4836 行)。
完整测试 720 passed。
No dependencies set.
The note is not visible to the blocked user.
概述
Export Service:把笔记或未保存的 Markdown 文本导出为 HTML / PDF / DOCX 的完整链路——创建即返回
queued、后台 asyncio.Task 渲染、产物 24h 过期、轮询GET /api/exports/{job_id}下载。范围(相对 main:28 文件 / +4836 行)
renderer="ast"→DocumentNode内部协议 +DocumentExporterProtocol。HtmlExporter:完整 HTML5 + function-plot 静态 SVG 内嵌。PdfExporter:reportlab,function-plot 内嵌矢量Drawing(与 SVG 同源共享几何),中文字体 STSong-Light,列表/表格/引用/行内语义。DocxExporter:python-docx,标题/列表/链接/表格,中文经w:eastAsia=宋体。parser.py)、共享几何compute_geometry(render.py)、reportlab 矢量后端(render_reportlab.py)、StaticRenderer内部契约(renderer.py)。app/contracts.py+app/routes.py的/api/exports*(创建/查询/下载/取消)。tests/test_export.py、tests/test_plot.py,docs/development/Export开发说明.md、接口契约 §10。审阅修复记录(多轮)
验证结果
720 passedgit diff --check:通过main:无合并冲突审阅结论
暂不建议合并,仍有以下问题需要修复:
P2:显式范围外的曲线未裁剪
函数图像采样仅排除了非有限坐标,没有将曲线裁剪到绘图区。
例如设置
range: -1, 1并绘制y = 10*x时,生成的曲线坐标会远超图表和页面范围。ReportLab 不会像 SVG viewport 一样自动裁剪,可能导致曲线覆盖 PDF 中的其他内容。建议:
range时的回归测试。P2:PDF 纵轴标签被旋转到画布之外
纵轴标签先使用绝对坐标定位,随后又以相同坐标作为旋转中心,造成坐标重复变换。实测标签边界落在负数横坐标区域,因此导出的 PDF 中无法正常显示纵轴标签。
建议:
P3:PDF 导出器说明已经过时
当前实现已经支持把 Function Plot 作为矢量图嵌入 PDF,但
pdf.py的模块说明仍称函数图像使用占位内容,请同步更新。已确认修复
上一轮提出的问题均已解决:
验证结果
717 passedgit diff --check:通过main:无合并冲突另外,本 PR 后续加入了 PDF 函数图像矢量渲染,但标题和描述尚未体现,测试数量仍写为 711。建议修复上述问题后同步更新 PR 描述和测试结果。
回复:本轮三条意见已在当前 head 修复
这三条意见与上一轮(PR #39)一致,且均已在本 PR 的 head
edc41fd(fix(export): 裁剪超出范围的曲线并修正 PDF 纵轴标签)中修复;审阅到的内容似乎仍是旧提交状态:app/plot/render.py已在共享几何层用 Liang-Barsky 把折线裁剪到绘图矩形(_PLOT_X0/Y0~_PLOT_X1/Y1),新增test_compute_geometry_clips_curves_to_plot_rect。app/plot/render_reportlab.py改为组内局部坐标String(0,0)+ 先translate后rotate(得到T·R),标签边界回到 Drawing 内,新增test_render_reportlab_ylabel_within_drawing_bounds。完整测试 719 passed,PR 标题与描述已同步(不再是 711)。烦请对当前 head
edc41fd重新审阅。审阅结论
暂不建议合并,渐近线问题。
P2:渐近线会被错误连接
当前实现只在采样结果为非有限值时断开折线。如果渐近点恰好位于两个采样点之间,两侧采样结果仍是有限值,随后会被 Liang-Barsky 算法裁剪成贯穿整个绘图区的伪线段。
已复现:
该配置会生成一条从绘图区底部延伸到顶部的错误竖线。
建议:
PR 范围说明
本 PR 实际包含整个 Export Service:
但当前标题和描述主要说明曲线裁剪及纵轴标签修复,无法准确反映实际合并范围。建议同步补全 PR 标题和描述,便于后续审阅、变更追踪和问题复盘。
验证结果
edc41fd719 passedgit diff --check:通过main:无合并冲突回复
P2 渐近线错误连接已修复(head
4276cb7):app/plot/render.py采样阶段新增断段:相邻有限采样点分居可见范围上下两侧(一个< ymin、一个> ymax)时判定中间夹着竖直渐近线,先断段再裁剪,避免被 Liang-Barsky 裁剪成贯穿绘图区的伪竖线。test_compute_geometry_breaks_at_asymptote(复现用例domain:-1,1 range:-10,10 y=1/(x-0.013)),断言不存在跨越上下边界的伪连接线段。PR 标题/描述已补全为整个 Export Service 范围(HTML / PDF / DOCX + 函数图像渲染,28 文件 / +4836 行)。
完整测试 720 passed。
fix(export): 裁剪超出范围的曲线并修正 PDF 纵轴标签(复审)to feat(export): 多格式文档导出服务(HTML / PDF / DOCX + 函数图像渲染)Pull request closed