Unicode-safe text diff and Unified Diff rendering for MoonBit
A dependency-free, Unicode-safe text diff and Unified Diff library for MoonBit.
| 能力 | API | 说明 |
|---|---|---|
| 字符级差异 | diff | 返回最短的 Equal/Delete/Insert 编辑脚本 |
| 相邻操作合并 | compact | 将逐字符操作合并为适合展示和传输的文本片段 |
| 文本重建 | reconstruct_old/new | 从编辑脚本恢复修改前或修改后的文本 |
| 差异统计 | stats | 统计相同、删除、插入的 Unicode 字符数 |
| 全量 Unified Diff | unified_diff | 使用默认标签并输出覆盖全部输入的单个 hunk |
| 上下文 Unified Diff | unified_diff_with_context | 自定义标签和上下文,远距离修改自动拆分为多个 hunk |
moon add pei0331/moonbit_diff@0.3.0import {
"pei0331/moonbit_diff" @diff,
}let edits = @diff.diff("Moon😀 diff", "Moon🌕 patch")
let compacted = @diff.compact(edits)
for edit in compacted {
match edit {
Equal(text) => println("Equal(\{text})")
Delete(text) => println("Delete(\{text})")
Insert(text) => println("Insert(\{text})")
}
}Equal(Moon)
Delete(😀)
Insert(🌕)
Equal( )
Delete(diff)
Insert(patch)let edits = @diff.diff("A😀bc", "A😀🌕d")
assert_eq!(@diff.reconstruct_old(edits), "A😀bc")
assert_eq!(@diff.reconstruct_new(edits), "A😀🌕d")
let summary = @diff.stats(edits)
println("equal: \{summary.equal_count}")
println("deleted: \{summary.delete_count}")
println("inserted: \{summary.insert_count}")let patch = @diff.unified_diff(
"one\ntwo\nthree",
"one\n2\nthree",
)
println(patch)--- old
+++ new
@@ -1,3 +1,3 @@
one
-two
+2
threelet patch = @diff.unified_diff_with_context(
old_source,
new_source,
"src/before.mbt",
"src/after.mbt",
3,
)pub(all) enum EditOp {
Equal(String)
Delete(String)
Insert(String)
}
pub(all) struct DiffStats {
equal_count : Int
delete_count : Int
insert_count : Int
}
pub fn diff(String, String) -> Array[EditOp]
pub fn compact(Array[EditOp]) -> Array[EditOp]
pub fn reconstruct_old(Array[EditOp]) -> String
pub fn reconstruct_new(Array[EditOp]) -> String
pub fn stats(Array[EditOp]) -> DiffStats
pub fn unified_diff(String, String) -> String
pub fn unified_diff_with_context(
String,
String,
String,
String,
Int,
) -> Stringmoon infomoon run examples/basicmoon fmt --check
moon check --deny-warn
moon build --target wasm-gc
moon test --target wasm-gc
moon run examples/basicfn unified_diff(old_text : String, new_text : String) -> Stringfn unified_diff_with_context(old_text : String, new_text : String, old_label : String, new_label : String, context : Int) -> StringUnicode-safe text diff and Unified Diff rendering for MoonBit