release: 发布 v0.5.1
新增能力:内置 4 套红头、3 套正式文档和 3 套标书主题,支持主题推荐页边距、页面装饰、页眉页脚和页码;增加结构化公文、项目报告及标书 Front Matter,内置 Fandol 中文字体、两份教程和 14 份主题示例。 桌面工作流:重组更多菜单,增加新建、保存、另存为快捷键和未保存确认;另存为后跟随新路径,主题示例自动切换主题,Desktop 发行包完整携带教程、示例与字体。 问题修复:修正红头标题居中与正式文档字体;围栏代码按正文宽度自动换行,长内容安全断行,至少两行即可在当前页分页,并统一保留 8px 左侧内容留白;Docker Web 镜像正确打包 samples。 兼容与部署:未声明主题推荐设置时继续使用 16mm 默认页边距;Web 隐藏不适用的另存为。正式镜像 yixiong/md-to-pdf:v0.5.1 内容 ID 为 sha256:72f519a69bfd6cb2f6df30c2be938e58ceb6f20e4748a32551874de3d436b276,Compose 健康运行。 验证结果:最终修复前 65 个测试文件、286 项测试通过,最终代码块与主题定向测试 27 项通过;全项目类型检查、生产构建和 git diff --check 通过。容器检出 14 套主题、17 份 Markdown,代码块回归 PDF 为 2 页且无越界。NSIS SHA-256 为 676CCE73D782B0B15AC6BC68F253CFBC4740383583E4DAA98F746EDF9999C5CC,ZIP SHA-256 为 82BF6ADF1200604F145CC86FA3ED193955CF6741EBEE3DF8953483515CFF621F。
This commit is contained in:
@@ -11,6 +11,8 @@ import {
|
||||
isPagedPreviewFrameMessage,
|
||||
isPagedPreviewRenderRequest,
|
||||
PAGED_PREVIEW_MESSAGE_SCOPE,
|
||||
resolvePageNumberAlignment,
|
||||
shouldRenderPageNumber,
|
||||
type PagedPreviewPayload
|
||||
} from "../src/paged-preview.js";
|
||||
|
||||
@@ -36,6 +38,9 @@ describe("分页预览协议", () => {
|
||||
expect(css).toContain("size: 210mm 297mm");
|
||||
expect(css).toContain("margin: 16mm 16mm");
|
||||
expect(css).toContain("@bottom-center");
|
||||
expect(css).toContain(
|
||||
'font-family: "Segoe UI", "Microsoft YaHei", sans-serif'
|
||||
);
|
||||
expect(css).not.toContain("counter-reset: page");
|
||||
expect(css).toContain("#write thead");
|
||||
expect(css).toContain("display: table-header-group");
|
||||
@@ -149,6 +154,36 @@ describe("分页预览协议", () => {
|
||||
5
|
||||
)
|
||||
).toBe("- 5 -");
|
||||
expect(
|
||||
formatPageNumber(
|
||||
{
|
||||
...defaultExportConfig.footer,
|
||||
format: "official-page"
|
||||
},
|
||||
4,
|
||||
5
|
||||
)
|
||||
).toBe("— 5 —");
|
||||
});
|
||||
|
||||
it("将公文页码放在奇偶页外侧并支持首页隐藏", () => {
|
||||
const officialFooter = {
|
||||
...defaultExportConfig.footer,
|
||||
alignment: "outer" as const,
|
||||
showOnFirstPage: false
|
||||
};
|
||||
|
||||
expect(resolvePageNumberAlignment(officialFooter, 0)).toBe(
|
||||
"right"
|
||||
);
|
||||
expect(resolvePageNumberAlignment(officialFooter, 1)).toBe(
|
||||
"left"
|
||||
);
|
||||
expect(resolvePageNumberAlignment(officialFooter, 2)).toBe(
|
||||
"right"
|
||||
);
|
||||
expect(shouldRenderPageNumber(officialFooter, 0)).toBe(false);
|
||||
expect(shouldRenderPageNumber(officialFooter, 1)).toBe(true);
|
||||
});
|
||||
|
||||
it("在主题 CSS 之后强制分页画布保持透明", () => {
|
||||
@@ -168,6 +203,39 @@ describe("分页预览协议", () => {
|
||||
);
|
||||
});
|
||||
|
||||
it("只在至少两行的代码组之间分页", () => {
|
||||
const css = buildPagedMediaCss(defaultExportConfig, payload);
|
||||
|
||||
expect(css).toContain("#write .md-code-pagination-chunk");
|
||||
expect(css).toContain("#write .md-code-line-group");
|
||||
expect(css).toContain("page-break-inside: avoid;");
|
||||
expect(css).toContain(
|
||||
'[data-code-pagination-position="first"]'
|
||||
);
|
||||
expect(css).toContain(
|
||||
'[data-code-pagination-position="last"]'
|
||||
);
|
||||
expect(css).toContain("#write .md-code-line");
|
||||
expect(css).toContain("min-height: 1lh;");
|
||||
});
|
||||
|
||||
it("代码围栏按正文宽度保留缩进并自动折行", () => {
|
||||
expect(documentBaseCss).toContain("#write pre.md-fences,");
|
||||
expect(documentBaseCss).toContain(
|
||||
"#write .md-code-pagination-chunk"
|
||||
);
|
||||
expect(documentBaseCss).toContain("max-width: 100%;");
|
||||
expect(documentBaseCss).toContain("padding-left: 8px;");
|
||||
expect(documentBaseCss).toContain("white-space: pre-wrap;");
|
||||
expect(documentBaseCss).toContain("overflow-wrap: anywhere;");
|
||||
expect(documentBaseCss).toContain("word-break: break-word;");
|
||||
|
||||
const css = buildPagedMediaCss(defaultExportConfig, payload);
|
||||
expect(css).toContain("#write .md-code-line");
|
||||
expect(css).toContain("overflow-wrap: inherit;");
|
||||
expect(css).toContain("word-break: inherit;");
|
||||
});
|
||||
|
||||
it("以低优先级兜底样式保留链接识别和焦点反馈", () => {
|
||||
expect(documentInteractionCss).toContain(":where(#write a[href])");
|
||||
expect(documentInteractionCss).toContain(
|
||||
|
||||
Reference in New Issue
Block a user