// 文风漂移段的「内容锚」定位(QA H3 / #9):用漂移段携带的原文 `text` 在终稿里做 // 内容匹配定位回炉目标,而不是用位置索引 idx——因为审稿端的分段方式与前端按空行切段 // 不一定一致,靠 idx 取段会命中错段、越界则静默落空。纯逻辑,便于 node 环境单测。 import type { StyleDriftSegment } from "@/lib/review/sse"; // 在终稿里定位漂移段原文: // 1) 段自带 text 且能在终稿里逐字搜到 → 返回该原文(最可靠,内容锚)。 // 2) text 为空/搜不到(旧数据、或作者已手改导致原文不在)→ 回退到位置 idx 取段; // idx 越界或取到空段 → 返回 null(由调用方就 #9 给出「无法定位」提示,不静默 no-op)。 export function locateDriftSegment( finalParas: readonly string[], segment: Pick, ): string | null { const anchor = segment.text.trim(); if (anchor.length > 0) { // 内容匹配:原文需在某一段里出现(终稿整体含该原文即视为可定位)。 const found = finalParas.some((p) => p.includes(anchor)); if (found) return anchor; // 自带原文但终稿里搜不到(已被手改)→ 不回退到可能错位的 idx,直接判定为定位失败。 return null; } // 无内容锚(旧数据)→ 退回位置 idx 取段(兼容旧留痕)。 const para = finalParas[segment.idx]?.trim() ?? ""; return para.length > 0 ? para : null; }