// 一键采纳改法:把审稿提议的补丁(original→replacement)应用到终稿。 // 纯逻辑(可单测,不依赖 DOM)。粒度=最小句段;找不到原文则不动正文(作者手改)。 export type FixOutcome = | { status: "applied"; text: string } // 命中原文并替换:text=改后终稿 | { status: "not-found"; text: string } // 有补丁但终稿里找不到原文(作者已改稿/漂移):text 原样 | { status: "no-patch"; text: string }; // 该冲突无可自动应用的补丁:text 原样 // 是否带可应用补丁:original 非空 + replacement 为字符串(容许空串=删除)。 export function hasApplicableFix( original: string | null | undefined, replacement: string | null | undefined, ): boolean { return ( typeof original === "string" && original.length > 0 && typeof replacement === "string" ); } // 把首个匹配的 original 替换为 replacement(不可变:返回新串,不改入参)。 // 无补丁 → no-patch;有补丁但未命中 → not-found(终稿不变);命中 → applied。 export function applyConflictFix( text: string, original: string | null | undefined, replacement: string | null | undefined, ): FixOutcome { if (!hasApplicableFix(original, replacement)) { return { status: "no-patch", text }; } // hasApplicableFix 已收窄为 string。 const from = original as string; const to = replacement as string; const idx = text.indexOf(from); if (idx === -1) { return { status: "not-found", text }; } return { status: "applied", text: text.slice(0, idx) + to + text.slice(idx + from.length), }; }