文字與日常工具·文字工具包
基於行的文字差異解釋:為什麼一個更改的單字會標記整行
· 工作原理
文字差異 檔案比較 編輯
解釋基於行的差異比較的內容、為什麼它將單字編輯報告為替換行,以及如何準備兩個文字以便比較突出顯示實際更改的內容。
說明一切都發生了變化的差異 - 重排的段落如何將一個編輯變成數十個標記行
合同管理員可以更改条款中的一項义務,將两個文件版本粘贴到比较中,並查看围绕该編輯报告的大塊。通常的原因並不是每個句子都改變了。從文字處理程式複製會重新排列該段落,將後面的單字移到不同的實體行。
行比較只能對齊它接收到的單位。如果版本 A 將一個段落放在「供應商」之後,而版本 B 將其放在「供應商必須」之後,則即使大多數措辭相同,剩餘的行也不再完全匹配。在確定檔案包含數十個實質修訂之前,恢復有意的行邊界。
行差異比較的內容-以整行為單位,相等匹配,中間有插入和刪除
ToolAcre 將每個輸入分成几行,並比较這些完整的字符串是否相等。它建立一個最長公共子序列表,該表標識雙方共享的相同行的最大有序集。然後,這些錨點之間的材料會以從左側刪除的行或新增到右側的行的形式發射。
順序和文字一樣重要。未更改的子句只能在其按順序出現的位置錨定對齊;將其移動到其他地方並不由特殊的移動操作表示。結果是一個最小的面向行的編輯腳本,而不是對法律含義的解釋或嘗試按主題配對相似的句子。
為什麼一個單字標記一整行——比較單位是行,所以任何差異都會取代它
將“may”更改為“must”會使整行不相等。在此實作中,該行以從舊端刪除並添加到新端的方式發出;核心函數不會為單字替換發出更改的行。這兩行描述了行粒度的替換,而不是整個想法的刪除。
一起閱讀相鄰的行。他們共享的措辭可以幫助人們找到編輯的術語,但原始程式碼中顯示的演演算法不會突出顯示其中的字元。這種差異解釋了為什麼結果既準確又顯得寬泛:其最小的可報告比較單位是一行,無論編輯有多小。
為什麼在此實作中一個單字會產生刪除的行和新增的行
單字級差異可以更精細地標記散文,並可以隔離「可能」與「必須」。字元級差異可以進一步縮小顯示範圍,這對於標點符號或拼字很有用。這些方法還會創建更多碎片,並需要有關令牌邊界的規則,因此它們表面上的精確性可能會導致更繁忙的審查。
當每一行已經代表一個有意義的項目時,行比較適合列表、配置區塊、日誌和子句。它為審閱者提供了穩定的上下文並保持順序,而無需假裝理解句子。當審閱必須辨識長段落內的編輯時,選擇更精細的工具;不要指望這條路線能夠製造出這樣的細節。
準備好文字以進行良好的比較——每行一個句子或一個項目,修剪空白和一致的行結尾
準備兩個版本,使一個句子、編號子句或列表項目佔據每一行。當這些差異沒有意義時,刪除意外的空白行並修剪前導或尾隨空格。在重要的時候保留有意的縮進,因為比較函數本身會測試精確的行字串,並在相等檢查之前不會規範化空格。
大綱要求一致的行結尾,但 `toLines` 已接受 CRLF、LF 和單獨的 CR 作為分隔符號。更重要的一致性是語義:相同的項目應該在相同的地方開始和結束。避免以頁面寬度手動換行,因為變更後的邊距可能會偽裝成變更後的內容。
準備穩定的線路單位;混合 CRLF、LF 和單獨 CR 已被接受
假設舊清單包含三個單獨的行:「1. 星期五之前交貨。」、「2. 買方可以檢查記錄。」和「3. 付款應在 30 天內到期。」修訂版僅將中間行更改為「2. 買方必須檢查記錄」。在執行比較之前,將所有三個子句保留在各自的行中。
第一行和第三行保持相同的錨點。舊的中間子句顯示為已刪除,修訂後的中間子句顯示為已添加,從而使管理員可以重點審查一對。如果將相同的條款貼為重排散文,則換行差異可能會破壞這些錨點並擴大明顯的變更集。
這不包括什麼——三向合併、移動塊檢測和格式化檔案的差異
此比較不執行三向合併,因此它無法根據共享基礎版本協調兩個已編輯的後代。它也沒有移動區塊分類:重新定位子句可以在其舊位置顯示為刪除,在其新位置顯示為添加,即使其文字未受影響。
格式化文件引入了另一個邊界。字體、追蹤變更、表格、註解和佈局不會以傳遞給 `diffLines` 的純字串表示。首先提取並建構相關文字,同時保留原始文字以供正式審查。有用的文字差異補充了檔案控制;它不會取代它們。
結論-文字工具包的差異在設計上是基於行的;準備輸入,它會準確顯示哪些項目發生了變化
當每一行都包含一個可審查的決策時,行差異資訊最豐富。 ToolAcre 精確對齊行,保留其順序,並將不匹配的材料報告為新增或刪除。這種設計是可以預測的:一個單字的編輯會影響其整行,而其周圍的相同行則提供保持結果緊湊的錨點。
在比較子句清單之前,仔細考慮邊界,修剪不相關的邊緣空間,並刪除不新增結構的空白行。然後打開文字差異並檢查相鄰的已刪除和新增的行作為替換。良好的準備不會改變合約;它使演演算法的基於行的報告與審閱者真正關心的單位相匹配。