milkdown-inline-diff 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,134 @@
1
+ export type DiffType = "equal" | "insert" | "delete"
2
+
3
+ export interface DiffOp<T> {
4
+ type: DiffType
5
+ items: T[]
6
+ }
7
+
8
+ export function myersDiff<T>(
9
+ a: T[],
10
+ b: T[],
11
+ equal: (a: T, b: T) => boolean
12
+ ): DiffOp<T>[] {
13
+ const N = a.length
14
+ const M = b.length
15
+
16
+ if (N === 0 && M === 0) return []
17
+ if (N === 0) return [{ type: "insert" as DiffType, items: [...b] }]
18
+ if (M === 0) return [{ type: "delete" as DiffType, items: [...a] }]
19
+
20
+ const MAX = N + M
21
+ const offset = MAX
22
+ const v: number[] = new Array(2 * MAX + 1).fill(0)
23
+ v[1 + offset] = 0
24
+
25
+ const trace: number[][] = []
26
+
27
+ for (let d = 0; d <= MAX; d++) {
28
+ trace.push([...v])
29
+
30
+ for (let k = -d; k <= d; k += 2) {
31
+ const kIndex = k + offset
32
+ let x: number
33
+
34
+ if (k === -d || (k !== d && v[k - 1 + offset] < v[k + 1 + offset])) {
35
+ x = v[k + 1 + offset]
36
+ } else {
37
+ x = v[k - 1 + offset] + 1
38
+ }
39
+
40
+ let y = x - k
41
+
42
+ while (x < N && y < M) {
43
+ const itemA = a[x]
44
+ const itemB = b[y]
45
+ if (!itemA || !itemB || !equal(itemA, itemB)) break
46
+ x++
47
+ y++
48
+ }
49
+
50
+ v[kIndex] = x
51
+
52
+ if (x >= N && y >= M) {
53
+ return buildDiff(trace, a, b, N, M, offset)
54
+ }
55
+ }
56
+ }
57
+
58
+ return []
59
+ }
60
+
61
+ function buildDiff<T>(
62
+ trace: number[][],
63
+ a: T[],
64
+ b: T[],
65
+ startX: number,
66
+ startY: number,
67
+ offset: number
68
+ ): DiffOp<T>[] {
69
+ let x = startX
70
+ let y = startY
71
+
72
+ const result: DiffOp<T>[] = []
73
+
74
+ for (let d = trace.length - 1; d >= 0; d--) {
75
+ const v = trace[d]
76
+ const k = x - y
77
+
78
+ let prevK: number
79
+
80
+ if (k === -d || (k !== d && v[k - 1 + offset] < v[k + 1 + offset])) {
81
+ prevK = k + 1
82
+ } else {
83
+ prevK = k - 1
84
+ }
85
+
86
+ const prevX = v[prevK + offset]
87
+ const prevY = prevX - prevK
88
+
89
+ while (x > prevX && y > prevY) {
90
+ const item = a[x - 1]
91
+ if (item) push(result, "equal", item)
92
+ x--
93
+ y--
94
+ }
95
+
96
+ if (d === 0) break
97
+
98
+ if (x === prevX) {
99
+ const item = b[y - 1]
100
+ if (item) push(result, "insert", item)
101
+ y--
102
+ } else {
103
+ const item = a[x - 1]
104
+ if (item) push(result, "delete", item)
105
+ x--
106
+ }
107
+ }
108
+
109
+ return mergeOps(result.reverse())
110
+ }
111
+
112
+ function push<T>(
113
+ ops: DiffOp<T>[],
114
+ type: DiffType,
115
+ item: T
116
+ ) {
117
+ ops.push({ type, items: [item] })
118
+ }
119
+
120
+ function mergeOps<T>(ops: DiffOp<T>[]): DiffOp<T>[] {
121
+ const result: DiffOp<T>[] = []
122
+
123
+ for (const op of ops) {
124
+ const prev = result[result.length - 1]
125
+
126
+ if (prev && prev.type === op.type) {
127
+ prev.items.push(...op.items)
128
+ } else {
129
+ result.push({ ...op })
130
+ }
131
+ }
132
+
133
+ return result
134
+ }
package/src/style.css ADDED
@@ -0,0 +1,152 @@
1
+ :root {
2
+ --diff-delete-bg: #ffccc7;
3
+ --diff-delete-active: #ffb4ac;
4
+ --diff-insert-bg: #d9f7be;
5
+ --diff-insert-active: #c8e8a8;
6
+ --diff-modify-bg: #fffb8f;
7
+ --diff-modify-active: #fff570;
8
+ --diff-accept-btn: #52c41a;
9
+ --diff-reject-btn: #ff4d4f;
10
+ }
11
+
12
+ .diff-decoration-delete {
13
+ background-color: var(--diff-delete-bg);
14
+ border-radius: 2px;
15
+ padding: 2px 4px;
16
+ }
17
+
18
+ .diff-decoration-insert {
19
+ background-color: var(--diff-insert-bg);
20
+ border-radius: 2px;
21
+ padding: 2px 4px;
22
+ }
23
+
24
+ .diff-decoration-modify {
25
+ background-color: var(--diff-modify-bg);
26
+ border-radius: 2px;
27
+ padding: 2px 4px;
28
+ }
29
+
30
+ .milkdown-code-block.diff-decoration-delete {
31
+ background-color: var(--diff-delete-bg) !important;
32
+ }
33
+
34
+ .milkdown-code-block.diff-decoration-delete .cm-editor {
35
+ background-color: var(--diff-delete-bg) !important;
36
+ }
37
+
38
+ .milkdown-code-block.diff-decoration-delete .cm-lineNumbers,
39
+ .milkdown-code-block.diff-decoration-delete .cm-gutter {
40
+ background-color: var(--diff-delete-bg) !important;
41
+ }
42
+
43
+ .milkdown-code-block.diff-decoration-delete .cm-focused .cm-activeLine {
44
+ background-color: var(--diff-delete-active) !important;
45
+ }
46
+
47
+ .milkdown-code-block.diff-decoration-delete .cm-focused .cm-activeLineGutter {
48
+ background-color: var(--diff-delete-active) !important;
49
+ }
50
+
51
+ .milkdown-code-block.diff-decoration-delete .cm-activeLineGutter {
52
+ background-color: var(--diff-delete-bg) !important;
53
+ }
54
+
55
+ .milkdown-code-block.diff-decoration-delete .cm-activeLine {
56
+ background-color: var(--diff-delete-bg) !important;
57
+ }
58
+
59
+ .milkdown-code-block.diff-decoration-insert {
60
+ background-color: var(--diff-insert-bg) !important;
61
+ }
62
+
63
+ .milkdown-code-block.diff-decoration-insert .cm-editor {
64
+ background-color: var(--diff-insert-bg) !important;
65
+ }
66
+
67
+ .milkdown-code-block.diff-decoration-insert .cm-lineNumbers,
68
+ .milkdown-code-block.diff-decoration-insert .cm-gutter {
69
+ background-color: var(--diff-insert-bg) !important;
70
+ }
71
+
72
+ .milkdown-code-block.diff-decoration-insert .cm-focused .cm-activeLine {
73
+ background-color: var(--diff-insert-active) !important;
74
+ }
75
+
76
+ .milkdown-code-block.diff-decoration-insert .cm-focused .cm-activeLineGutter {
77
+ background-color: var(--diff-insert-active) !important;
78
+ }
79
+
80
+ .milkdown-code-block.diff-decoration-insert .cm-activeLineGutter {
81
+ background-color: var(--diff-insert-bg) !important;
82
+ }
83
+
84
+ .milkdown-code-block.diff-decoration-insert .cm-activeLine {
85
+ background-color: var(--diff-insert-bg) !important;
86
+ }
87
+
88
+ .milkdown-code-block.diff-decoration-modify {
89
+ background-color: var(--diff-modify-bg) !important;
90
+ }
91
+
92
+ .milkdown-code-block.diff-decoration-modify .cm-editor {
93
+ background-color: var(--diff-modify-bg) !important;
94
+ }
95
+
96
+ .milkdown-code-block.diff-decoration-modify .cm-lineNumbers,
97
+ .milkdown-code-block.diff-decoration-modify .cm-gutter {
98
+ background-color: var(--diff-modify-bg) !important;
99
+ }
100
+
101
+ .milkdown-code-block.diff-decoration-modify .cm-focused .cm-activeLine {
102
+ background-color: var(--diff-modify-active) !important;
103
+ }
104
+
105
+ .milkdown-code-block.diff-decoration-modify .cm-focused .cm-activeLineGutter {
106
+ background-color: var(--diff-modify-active) !important;
107
+ }
108
+
109
+ .milkdown-code-block.diff-decoration-modify .cm-activeLineGutter {
110
+ background-color: var(--diff-modify-bg) !important;
111
+ }
112
+
113
+ .milkdown-code-block.diff-decoration-modify .cm-activeLine {
114
+ background-color: var(--diff-modify-bg) !important;
115
+ }
116
+
117
+ .milkdown-merge-tool-tooltip {
118
+ position: absolute;
119
+ z-index: 1000;
120
+ padding: 8px;
121
+ background:
122
+ var(--crepe-color-surface, var(--nord-editor-background, rgba(220, 231, 245, 0.98)));
123
+ border-radius: 10px;
124
+ box-shadow: 0 12px 24px rgba(15, 23, 42, 0.1);
125
+ backdrop-filter: blur(10px);
126
+ }
127
+
128
+ .milkdown-merge-tool-tooltip[data-show='false'] {
129
+ display: none;
130
+ }
131
+
132
+ .milkdown-merge-tool-button-container {
133
+ display: flex;
134
+ gap: 8px;
135
+ }
136
+
137
+ .milkdown-merge-tool-button {
138
+ padding: 6px 12px;
139
+ border: none;
140
+ border-radius: 6px;
141
+ cursor: pointer;
142
+ font-weight: 600;
143
+ color: #f8fafc;
144
+ }
145
+
146
+ .milkdown-merge-tool-button.accept {
147
+ background: var(--diff-accept-btn);
148
+ }
149
+
150
+ .milkdown-merge-tool-button.reject {
151
+ background: var(--diff-reject-btn);
152
+ }