Skip to content
This repository was archived by the owner on Feb 10, 2025. It is now read-only.

Commit c84f3b0

Browse files
committed
chore: init
1 parent b5417a5 commit c84f3b0

File tree

5 files changed

+67
-49
lines changed

5 files changed

+67
-49
lines changed

dev/App.vue

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,23 @@
11
<template>
22
<h1>Vue Diff</h1>
3-
<Diff
4-
language="javascript"
5-
:prev="prev"
6-
:current="current"
7-
/>
3+
<section>
4+
<h2>Split</h2>
5+
<Diff
6+
type="split"
7+
language="javascript"
8+
:prev="prev"
9+
:current="current"
10+
/>
11+
</section>
12+
<section>
13+
<h2>Unified</h2>
14+
<Diff
15+
type="unified"
16+
language="javascript"
17+
:prev="prev"
18+
:current="current"
19+
/>
20+
</section>
821
</template>
922

1023
<script lang="ts">

src/Diff.vue

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,30 @@
11
<template>
2-
<div class="vue-diff-wrapper">
3-
<!-- <Viewer type="unified" :language="language" :diffLines="diffLines" /> -->
4-
<Viewer type="prev" :language="language" :diffs="diffs" />
5-
<Viewer type="current" :language="language" :diffs="diffs" />
2+
<div class="vue-diff-wrapper" :class="`vue-diff-wrapper-${type}`">
3+
<template v-if="type === 'unified'">
4+
<Viewer role="unified" :language="language" :prev="prev" :current="current" />
5+
</template>
6+
<template v-else>
7+
<Viewer role="prev" :language="language" :prev="prev" :current="current" />
8+
<Viewer role="current" :language="language" :prev="prev" :current="current" />
9+
</template>
610
</div>
711
</template>
812

913
<script lang="ts">
10-
import { defineComponent, reactive } from 'vue'
11-
import * as Diff from 'diff'
14+
import { defineComponent, PropType } from 'vue'
1215
import Viewer from './Viewer.vue'
1316
17+
import { Type } from './utils'
18+
1419
export default defineComponent({
1520
components: {
1621
Viewer
1722
},
1823
props: {
24+
type: {
25+
type: String as PropType<Type>,
26+
required: true
27+
},
1928
language: {
2029
type: String,
2130
required: true
@@ -28,11 +37,6 @@ export default defineComponent({
2837
type: String,
2938
required: true
3039
}
31-
},
32-
setup (props) {
33-
const diffs = reactive(Diff.diffLines(props.prev, props.current))
34-
35-
return { diffs }
3640
}
3741
})
3842
</script>
@@ -44,7 +48,7 @@ export default defineComponent({
4448
width: 100%;
4549
}
4650
47-
.vue-diff-viewer {
51+
.vue-diff-wrapper-split .vue-diff-viewer {
4852
width: calc(50% - 10px);
4953
}
5054
</style>

src/Viewer.vue

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,38 @@
1414
</template>
1515

1616
<script lang="ts">
17+
import * as Diff from 'diff'
1718
import { defineComponent, ref, PropType } from 'vue'
1819
import { renderLines } from './utils'
1920
import Code from './Code.vue'
2021
21-
import type { Type, Change } from './utils'
22+
import type { Role } from './utils'
2223
2324
export default defineComponent({
2425
components: {
2526
Code
2627
},
2728
props: {
28-
type: {
29-
type: String as PropType<Type>,
29+
role: {
30+
type: String as PropType<Role>,
3031
required: true
3132
},
3233
language: {
3334
type: String,
3435
required: true
3536
},
36-
diffs: {
37-
type: Array as PropType<Array<Change>>,
37+
prev: {
38+
type: String,
39+
required: true
40+
},
41+
current: {
42+
type: String,
3843
required: true
3944
}
4045
},
4146
setup (props) {
42-
const lines = ref(renderLines(props.type, props.diffs))
47+
const diff = Diff.diffLines(props.prev, props.current)
48+
const lines = ref(renderLines(props.role, diff))
4349
4450
return { lines }
4551
}

src/utils.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import * as Diff from 'diff'
22

33
import type { Change } from 'diff'
44

5-
type Type = 'prev' | 'current' | 'unified'
5+
type Type = 'split' | 'unified'
6+
type Role = 'prev' | 'current' | 'unified'
67

78
interface Line {
89
type: 'added' | 'removed' | 'equal';
@@ -68,14 +69,16 @@ const renderCurrent = (diffs: Array<Change>) => {
6869

6970
diffs.map((diff, index) => {
7071
const type = getDiffType(diff)
72+
const prevDiff = index > 0 ? diffs[index - 1] : null
7173
const nextDiff = index < diffs.length - 1 ? diffs[index + 1] : null
74+
const isModifiedLine = prevDiff && diff.count === 1 && prevDiff.count === 1 && type === 'added' && prevDiff.removed
75+
const isUnuseLine = nextDiff && diff.count === 1 && nextDiff.count === 1 && type === 'removed' && nextDiff.added
7276

73-
if (nextDiff && type === 'removed' && nextDiff.added) {
74-
if (diff.count === 1 && nextDiff.count === 1) {
75-
const diffWords = Diff.diffWords(nextDiff.value, diff.value)
76-
diff.value = renderLine(diffWords)
77-
return
78-
}
77+
if (isUnuseLine) return
78+
79+
if (isModifiedLine) {
80+
const diffWords = Diff.diffWords((prevDiff as Change).value, diff.value)
81+
diff.value = renderLine(diffWords)
7982
}
8083

8184
diff.value.replace(/\n$/, '').split('\n').map((value) => {
@@ -100,15 +103,17 @@ const renderUnified = (diffs: Array<Change>) => {
100103
console.log(diffs)
101104
}
102105

103-
const renderLines = (type: Type, diffs: Array<Change>) => {
104-
if (type === 'prev') {
105-
return renderPrev([...diffs])
106-
} else if (type === 'current') {
107-
return renderCurrent([...diffs])
108-
} else if (type === 'unified') {
109-
return renderUnified([...diffs])
106+
const renderLines = (role: Role, diffs: Array<Change>) => {
107+
const deepCopy = JSON.parse(JSON.stringify(diffs))
108+
109+
if (role === 'prev') {
110+
return renderPrev(deepCopy)
111+
} else if (role === 'current') {
112+
return renderCurrent(deepCopy)
113+
} else if (role === 'unified') {
114+
return renderUnified(deepCopy)
110115
}
111116
}
112117

113118
export { renderLines }
114-
export type { Type, Change, Line }
119+
export type { Type, Role, Change, Line }

vite.config.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,7 @@
1-
import commonjs from '@rollup/plugin-commonjs'
2-
31
export default {
4-
rollupInputOptions: {
5-
plugins: [
6-
commonjs()
7-
]
8-
},
92
optimizeDeps: {
103
include: [
11-
// 'prismjs/components/index',
12-
// 'prismjs/plugins/autoloader/prism-autoloader',
13-
// 'prismjs/plugins/diff-highlight/prism-diff-highlight',
14-
// 'prismjs/plugins/line-numbers/prism-line-numbers'
4+
'prismjs/plugins/keep-markup/prism-keep-markup'
155
]
166
}
177
}

0 commit comments

Comments
 (0)