feat: 增加 ECharts 渲染与预览交互增强

- 新增可复用的 markdown-echarts 工作区,支持安全的 YAML 围栏、默认值、语义校验、错误占位和 SVG 渲染
- 将 ECharts 接入统一 Markdown、快速预览、精确预览与 PDF 链路,并复用 Mermaid 的不可跨页和超高图单页适配策略
- 默认示例加入 ECharts,增加源文本折叠、顶部文档状态、页码输入跳转与滚动同步
- 快速预览改用外层容器滚动,使滚动条与精确预览统一贴在预览区域右侧,并兼容显示缩放
- 完善 Docker 工作区复制、可配置 Compose 镜像、测试覆盖和进度文档
This commit is contained in:
SkyJourney
2026-07-27 16:05:14 +08:00
parent 1db21c80fc
commit f5a46f79f1
53 changed files with 3998 additions and 221 deletions
+7
View File
@@ -369,6 +369,7 @@ describe("PDF API", () => {
const generate = vi.fn(async () => ({
pdf: Buffer.from("%PDF-test"),
pageCount: 3,
echartsErrors: ["图表 2"],
mermaidErrors: ["图表 1"],
timings: {
queueMs: 0,
@@ -377,6 +378,8 @@ describe("PDF API", () => {
navigationMs: 3,
documentRenderMs: 4,
runtimeSetupMs: 0.1,
echartsMs: 0.15,
echartsFitMs: 0.18,
mermaidMs: 0.2,
mermaidFitMs: 0.3,
mermaidConversionMs: 0.35,
@@ -415,6 +418,7 @@ describe("PDF API", () => {
"filename*=UTF-8''%E6%B5%8B%E8%AF%95%E6%96%87%E6%A1%A3.pdf"
);
expect(response.headers["x-pdf-page-count"]).toBe("3");
expect(response.headers["x-echarts-error-count"]).toBe("1");
expect(response.headers["x-mermaid-error-count"]).toBe("1");
expect(response.headers["server-timing"]).toContain(
"document-render;dur=4.0"
@@ -422,6 +426,9 @@ describe("PDF API", () => {
expect(response.headers["server-timing"]).toContain(
"pdf-print;dur=5.0"
);
expect(response.headers["server-timing"]).toContain(
"echarts;dur=0.1"
);
expect(response.headers["server-timing"]).toContain(
"mermaid;dur=0.2"
);
+5
View File
@@ -47,9 +47,12 @@ function fakeBrowser(
waitForFunction: vi.fn(async () => undefined),
evaluate: vi.fn(async () => ({
pageCount: 2,
echartsErrors: [],
mermaidErrors: [],
timings: {
setupMs: 1,
echartsMs: 1.5,
echartsFitMs: 1.75,
mermaidMs: 2,
mermaidFitMs: 3,
mermaidConversionMs: 3.5,
@@ -191,6 +194,8 @@ describe("Playwright PDF 生成器", () => {
navigationMs: expect.any(Number),
documentRenderMs: expect.any(Number),
runtimeSetupMs: 1,
echartsMs: 1.5,
echartsFitMs: 1.75,
mermaidMs: 2,
mermaidFitMs: 3,
mermaidConversionMs: 3.5,