release: 发布 v0.6.1 DOCX 视觉一致性修复
新增通用 CSS 到 OOXML 翻译修复,统一字体、字距、精确行距、段落、列表、表格、引用、代码块与行内代码连续性,不引入按主题 ID 分支。 新增 MdTP Mono 并统一 Serif、Sans、Mono 三字体包的 Chromium 与 DOCX 使用链;字体声明、嵌入部件和 Word/WPS 实际采用均进入硬门禁。 重建封面整页及正文语义块视觉差分,14 套主题、纵横两个方向、五组页边距共 140 个真实场景全部通过,阻断失败和诊断失败均为零。 源码服务、Docker Web API 与实际安装 Desktop 的 red-briefing 导出均包含 5 个字体部件;Word/WPS 原生渲染和逐页复核通过。修复 Docker 构建上下文与运行层复用软链接,并完善 v0.6.1 版本、发行说明和发布归集。 验证:npm test(116 个文件、616 项测试)、npm run typecheck、npm run build、git diff --check 全部通过。Desktop 安装器与 ZIP、Docker v0.6.1 镜像已生成;Windows 产物仍为未签名内部发行。
This commit is contained in:
@@ -442,34 +442,32 @@ function normalizeComputedSlot(
|
||||
style.spacingAfterPt = spacingAfterPt;
|
||||
}
|
||||
}
|
||||
if (context.kind !== "inline") {
|
||||
const padding = {
|
||||
top: length(context, "padding-top", computed.paddingTop, {
|
||||
nonNegative: true
|
||||
}),
|
||||
right: length(context, "padding-right", computed.paddingRight, {
|
||||
nonNegative: true
|
||||
}),
|
||||
bottom: length(context, "padding-bottom", computed.paddingBottom, {
|
||||
nonNegative: true
|
||||
}),
|
||||
left: length(context, "padding-left", computed.paddingLeft, {
|
||||
nonNegative: true
|
||||
})
|
||||
const padding = {
|
||||
top: length(context, "padding-top", computed.paddingTop, {
|
||||
nonNegative: true
|
||||
}),
|
||||
right: length(context, "padding-right", computed.paddingRight, {
|
||||
nonNegative: true
|
||||
}),
|
||||
bottom: length(context, "padding-bottom", computed.paddingBottom, {
|
||||
nonNegative: true
|
||||
}),
|
||||
left: length(context, "padding-left", computed.paddingLeft, {
|
||||
nonNegative: true
|
||||
})
|
||||
};
|
||||
if (
|
||||
padding.top !== undefined &&
|
||||
padding.right !== undefined &&
|
||||
padding.bottom !== undefined &&
|
||||
padding.left !== undefined
|
||||
) {
|
||||
style.paddingPt = {
|
||||
top: padding.top,
|
||||
right: padding.right,
|
||||
bottom: padding.bottom,
|
||||
left: padding.left
|
||||
};
|
||||
if (
|
||||
padding.top !== undefined &&
|
||||
padding.right !== undefined &&
|
||||
padding.bottom !== undefined &&
|
||||
padding.left !== undefined
|
||||
) {
|
||||
style.paddingPt = {
|
||||
top: padding.top,
|
||||
right: padding.right,
|
||||
bottom: padding.bottom,
|
||||
left: padding.left
|
||||
};
|
||||
}
|
||||
}
|
||||
const containingBlockWidthPt = computed.containingBlockWidth
|
||||
? parseCssLengthToPt(computed.containingBlockWidth)
|
||||
@@ -652,7 +650,8 @@ function applyBorderColor(
|
||||
function applyOverrides(
|
||||
slot: DocxStyleSlotName,
|
||||
styleInput: DocxSlotStyleToken,
|
||||
overrides: DocxThemeStyleOverrides
|
||||
overrides: DocxThemeStyleOverrides,
|
||||
replaceExisting: boolean
|
||||
): {
|
||||
style: DocxSlotStyleToken;
|
||||
applied: boolean;
|
||||
@@ -663,7 +662,10 @@ function applyOverrides(
|
||||
key: Key,
|
||||
value: MutableStyle[Key] | undefined
|
||||
) => {
|
||||
if (value !== undefined) {
|
||||
if (
|
||||
value !== undefined &&
|
||||
(replaceExisting || style[key] === undefined)
|
||||
) {
|
||||
style[key] = value;
|
||||
applied = true;
|
||||
}
|
||||
@@ -887,7 +889,10 @@ export function resolveDocxThemeTokens(
|
||||
const override = applyOverrides(
|
||||
definition.name,
|
||||
resolved.style,
|
||||
input.config.overrides
|
||||
input.config.overrides,
|
||||
input.config.mode === "explicit" ||
|
||||
!input.config.legacyPreset ||
|
||||
resolved.source === "preset-fallback"
|
||||
);
|
||||
if (override.applied) {
|
||||
diagnostics.push({
|
||||
@@ -907,6 +912,43 @@ export function resolveDocxThemeTokens(
|
||||
return resolved;
|
||||
}
|
||||
);
|
||||
const blockQuote = slots.find((entry) => entry.slot === "block-quote");
|
||||
const blockQuoteText = slots.find(
|
||||
(entry) => entry.slot === "block-quote-text"
|
||||
);
|
||||
if (blockQuote && blockQuoteText) {
|
||||
const text = blockQuoteText.style;
|
||||
blockQuote.style = {
|
||||
...blockQuote.style,
|
||||
...(text.fontCandidates.length > 0
|
||||
? { fontCandidates: text.fontCandidates }
|
||||
: {}),
|
||||
...(text.fontSizePt !== undefined
|
||||
? { fontSizePt: text.fontSizePt }
|
||||
: {}),
|
||||
...(text.bold !== undefined ? { bold: text.bold } : {}),
|
||||
...(text.italic !== undefined ? { italic: text.italic } : {}),
|
||||
...(text.underline !== undefined
|
||||
? { underline: text.underline }
|
||||
: {}),
|
||||
...(text.strikethrough !== undefined
|
||||
? { strikethrough: text.strikethrough }
|
||||
: {}),
|
||||
...(text.color !== undefined ? { color: text.color } : {}),
|
||||
...(text.lineSpacing !== undefined
|
||||
? { lineSpacing: text.lineSpacing }
|
||||
: {}),
|
||||
...(text.letterSpacingPt !== undefined
|
||||
? { letterSpacingPt: text.letterSpacingPt }
|
||||
: {}),
|
||||
...(text.alignment !== undefined
|
||||
? { alignment: text.alignment }
|
||||
: {}),
|
||||
...(text.firstLineIndentPt !== undefined
|
||||
? { firstLineIndentPt: text.firstLineIndentPt }
|
||||
: {})
|
||||
};
|
||||
}
|
||||
return docxThemeTokenSetSchema.parse({
|
||||
schemaVersion: 1,
|
||||
themeId: snapshot.themeId,
|
||||
|
||||
Reference in New Issue
Block a user