新增能力:Web 与 Desktop 支持新建和保存 Markdown;桌面端注册 .md/.markdown 打开程序,支持单实例文件转交、自定义主题目录以及窗口位置、尺寸和最大化状态的延迟原子持久化与屏幕越界修正。 界面与兼容性:保留打开 Markdown 为独立主操作,将新建、保存和主题目录收纳到更多菜单;Web 移除本地素材目录入口并明确默认不支持本地素材;新文档默认使用一级标题或首行合法化生成文件名,可不保存直接导出 PDF。 渲染修复:图片、Mermaid 和 ECharts 按文档顺序串行执行媒体分页回填,每个媒体元素至多重排一次;图片以限宽后的高度作为缩放基准,只缩放媒体主体并保持标题尺寸;ECharts 冻结为 SVG 图片后参与统一分页。 示例与文档:默认示例仅保留一张网络图片,增加有效 Base64 横图、竖图、边界图片及多尺寸 Mermaid/ECharts;更新根 README、Desktop README、部署文档、四个 packages README、PROGRESS 和 AGENTS 发布规范;登记 v0.4.6 超链接导航问题。 部署与验证:构建并运行 yixiong/md-to-pdf:v0.4.5 正式镜像,Compose 健康且 PDF 冒烟无 Mermaid/ECharts 错误;生成 NSIS 安装包和免安装 ZIP,本机已升级到 NSIS v0.4.5 并清理旧 Squirrel 安装;202 项测试、类型检查、生产构建和 git diff --check 全部通过。 发布产物:Setup.exe SHA-256 9CBD6362E15AA745185805E753D5A7749434E0E142E6CE0F66463E6A19468F1D;ZIP SHA-256 97B2D44E72F626A3396E5AB5B330FFB7F9BECAF945A1707808C876940A82E850;当前 Windows 产物未配置代码签名。
80 lines
2.4 KiB
TypeScript
80 lines
2.4 KiB
TypeScript
// @vitest-environment happy-dom
|
|
|
|
import { defaultExportConfig } from "@md-to-pdf/core";
|
|
import { describe, expect, it } from "vitest";
|
|
import { fitOversizedEChartsToPage } from "../src/echarts-page-fit";
|
|
|
|
describe("ECharts 单页高度适配", () => {
|
|
it("将超高 SVG 和宿主同步缩放到单页内容区", () => {
|
|
const root = document.createElement("div");
|
|
root.innerHTML = `
|
|
<h2 style="margin: 10px 0">大型图表</h2>
|
|
<figure class="md-echarts">
|
|
<div class="md-echarts-host" style="height: 2000px">
|
|
<svg width="1000" height="2000"></svg>
|
|
</div>
|
|
</figure>
|
|
`;
|
|
|
|
const figure = root.querySelector<HTMLElement>(".md-echarts");
|
|
const title = root.querySelector<HTMLElement>("h2");
|
|
const host = root.querySelector<HTMLElement>(
|
|
".md-echarts-host"
|
|
);
|
|
const svg = root.querySelector<SVGSVGElement>("svg");
|
|
if (title) {
|
|
title.getBoundingClientRect = () => ({
|
|
x: 0,
|
|
y: 0,
|
|
top: 0,
|
|
left: 0,
|
|
right: 700,
|
|
bottom: 40,
|
|
width: 700,
|
|
height: 40,
|
|
toJSON: () => ({})
|
|
});
|
|
}
|
|
fitOversizedEChartsToPage(root, defaultExportConfig);
|
|
|
|
expect(figure?.dataset.pageHeightFitted).toBe("true");
|
|
expect(title?.style.breakAfter).toBe("avoid-page");
|
|
expect(figure?.style.breakAfter).toBe("page");
|
|
expect(figure?.style.pageBreakAfter).toBe("always");
|
|
expect(figure?.nextElementSibling).toHaveProperty(
|
|
"dataset.mediaPageBreak",
|
|
"true"
|
|
);
|
|
expect(Number.parseFloat(host?.style.height ?? "0")).toBeCloseTo(
|
|
960.5748,
|
|
3
|
|
);
|
|
expect(host?.style.aspectRatio).toBe("");
|
|
expect(svg?.getAttribute("viewBox")).toBe("0 0 1000 2000");
|
|
expect(Number.parseFloat(svg?.style.height ?? "0")).toBeCloseTo(
|
|
960.5748,
|
|
3
|
|
);
|
|
});
|
|
|
|
it("普通高度图表不改变作者设置的宿主高度", () => {
|
|
const root = document.createElement("div");
|
|
root.innerHTML = `
|
|
<figure class="md-echarts">
|
|
<div class="md-echarts-host" style="height: 300px">
|
|
<svg viewBox="0 0 1000 400"></svg>
|
|
</div>
|
|
</figure>
|
|
`;
|
|
|
|
fitOversizedEChartsToPage(root, defaultExportConfig);
|
|
|
|
const figure = root.querySelector<HTMLElement>(".md-echarts");
|
|
const host = root.querySelector<HTMLElement>(
|
|
".md-echarts-host"
|
|
);
|
|
expect(figure?.dataset.pageHeightFitted).toBeUndefined();
|
|
expect(host?.style.height).toBe("300px");
|
|
});
|
|
});
|