Initial commit: omp-edit DSH plugin (oh-my-pi port) with docs and tests
This commit is contained in:
commit
71953ffb8f
19 files changed
+2412
No files matched your search
+38
@@ -0,0 +1,38 @@
|
||||
// Hunk diffs for the DSH diff card ({path, oldText, newText} per hunk, 3 lines of context).
|
||||
import { lineMap } from './store.js'
|
||||
import { splitLines } from './text.js'
|
||||
|
||||
export function hunkDiffs(path, before, after, context = 3) {
|
||||
const a = splitLines(before).lines
|
||||
const b = splitLines(after).lines
|
||||
const map = lineMap(a, b)
|
||||
// Walk both sides, emitting ops: '=' common, '-' removed, '+' added.
|
||||
const ops = []
|
||||
let i = 1; let j = 1
|
||||
const pairs = [...map.entries()].sort((x, y) => x[0] - y[0])
|
||||
for (const [ai, bj] of pairs) {
|
||||
while (i < ai) ops.push(['-', a[i++ - 1]])
|
||||
while (j < bj) ops.push(['+', b[j++ - 1]])
|
||||
ops.push(['=', a[i - 1]]); i++; j++
|
||||
}
|
||||
while (i <= a.length) ops.push(['-', a[i++ - 1]])
|
||||
while (j <= b.length) ops.push(['+', b[j++ - 1]])
|
||||
const changed = ops.map((o, k) => (o[0] !== '=' ? k : -1)).filter((k) => k >= 0)
|
||||
if (!changed.length) return []
|
||||
const spans = []
|
||||
for (const k of changed) {
|
||||
const s = Math.max(0, k - context); const e = Math.min(ops.length - 1, k + context)
|
||||
const last = spans.at(-1)
|
||||
if (last && s <= last[1] + 1) last[1] = Math.max(last[1], e)
|
||||
else spans.push([s, e])
|
||||
}
|
||||
return spans.map(([s, e]) => {
|
||||
const oldL = []; const newL = []
|
||||
for (let k = s; k <= e; k++) {
|
||||
const [op, text] = ops[k]
|
||||
if (op !== '+') oldL.push(text)
|
||||
if (op !== '-') newL.push(text)
|
||||
}
|
||||
return { path, oldText: oldL.length ? oldL.join('\n') : null, newText: newL.join('\n') }
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user