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
+6
View File
@@ -149,6 +149,8 @@ function createPdfServerTiming(
`navigation;dur=${milliseconds(timings.navigationMs)}`,
`document-render;dur=${milliseconds(timings.documentRenderMs)}`,
`runtime-setup;dur=${milliseconds(timings.runtimeSetupMs)}`,
`echarts;dur=${milliseconds(timings.echartsMs)}`,
`echarts-fit;dur=${milliseconds(timings.echartsFitMs)}`,
`mermaid;dur=${milliseconds(timings.mermaidMs)}`,
`mermaid-fit;dur=${milliseconds(timings.mermaidFitMs)}`,
`mermaid-conversion;dur=${milliseconds(
@@ -397,6 +399,10 @@ export function buildApp(options: BuildAppOptions = {}) {
.header("cache-control", "no-store")
.header("server-timing", serverTiming)
.header("x-pdf-page-count", String(generated.pageCount))
.header(
"x-echarts-error-count",
String(generated.echartsErrors.length)
)
.header(
"x-mermaid-error-count",
String(generated.mermaidErrors.length)
+8
View File
@@ -10,6 +10,7 @@ export type PdfRenderPayload = PagedDocumentPayload;
export interface PdfGenerationResult {
pdf: Buffer;
pageCount: number;
echartsErrors: string[];
mermaidErrors: string[];
timings: PdfGenerationTimings;
}
@@ -21,6 +22,8 @@ export interface PdfGenerationTimings {
navigationMs: number;
documentRenderMs: number;
runtimeSetupMs: number;
echartsMs: number;
echartsFitMs: number;
mermaidMs: number;
mermaidFitMs: number;
mermaidConversionMs: number;
@@ -59,6 +62,8 @@ interface PdfDocumentResult
| "navigationMs"
| "documentRenderMs"
| "runtimeSetupMs"
| "echartsMs"
| "echartsFitMs"
| "mermaidMs"
| "mermaidFitMs"
| "mermaidConversionMs"
@@ -469,11 +474,14 @@ export class PlaywrightPdfGenerator implements PdfGenerator {
return {
pdf,
pageCount: renderResult.pageCount,
echartsErrors: renderResult.echartsErrors,
mermaidErrors: renderResult.mermaidErrors,
timings: {
navigationMs,
documentRenderMs,
runtimeSetupMs: renderResult.timings.setupMs,
echartsMs: renderResult.timings.echartsMs,
echartsFitMs: renderResult.timings.echartsFitMs,
mermaidMs: renderResult.timings.mermaidMs,
mermaidFitMs: renderResult.timings.mermaidFitMs,
mermaidConversionMs: