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

Commit 89004dc

Browse files
committed
chore: development
1 parent 0fd14c7 commit 89004dc

File tree

3 files changed

+156
-152
lines changed

3 files changed

+156
-152
lines changed

src/Code.vue

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,64 @@
11
<template>
2-
<tr :class="`vue-diff-row vue-diff-row-${data.type}`">
3-
<td class="lineNum">
4-
{{ data.lineNum }}
5-
</td>
6-
<td class="code">
7-
<pre :class="`language-${language}`"><code ref="codeRef" :class="`language-${language}`" v-html="code || '\n'"></code></pre>
8-
</td>
2+
<tr v-if="mode === 'split'">
3+
<template :key="index" v-for="(line, index) in data">
4+
<td class="lineNum" :class="`vue-diff-cell-${line.type}`">
5+
{{ line.lineNum }}
6+
</td>
7+
<td class="code" :class="`vue-diff-cell-${line.type}`">
8+
<pre :class="`language-${language}`"><code :class="`language-${language}`" v-html="getHighlight(line.value)"></code></pre>
9+
</td>
10+
</template>
911
</tr>
12+
<template v-if="mode === 'unified'">
13+
<template :key="index" v-for="(line, index) in data">
14+
<tr v-if="!getSkipUnified(line, index)">
15+
<td class="lineNum" :class="`vue-diff-cell-${line.type}`">
16+
{{ index === 1 ? line.lineNum : undefined }}
17+
</td>
18+
<td class="code" :class="`vue-diff-cell-${line.type}`">
19+
<pre :class="`language-${language}`"><code :class="`language-${language}`" v-html="getHighlight(line.value)"></code></pre>
20+
</td>
21+
</tr>
22+
</template>
23+
</template>
1024
</template>
1125

1226
<script lang="ts">
1327
import Prism from 'prismjs'
1428
import { defineComponent, PropType, ref, computed } from 'vue'
15-
import { MODIFIED_START_TAG, MODIFIED_CLOSE_TAG, Line } from './utils'
29+
import { MODIFIED_START_TAG, MODIFIED_CLOSE_TAG } from './utils'
1630
17-
// @ts-ignore
18-
Prism.manual = true
31+
import type { Mode, Lines, Line } from './utils'
1932
2033
export default defineComponent({
2134
props: {
22-
data: {
23-
type: Object as PropType<Line>,
35+
mode: {
36+
type: String as PropType<Mode>,
2437
required: true
2538
},
2639
language: {
2740
type: String,
2841
required: true
42+
},
43+
data: {
44+
type: Object as PropType<Array<Lines>>,
45+
required: true
2946
}
3047
},
3148
setup (props) {
32-
const codeRef = ref(null)
33-
const code = computed(() => {
34-
return Prism.highlight(props.data.value, Prism.languages[props.language], props.language)
35-
.replace(new RegExp(`${MODIFIED_START_TAG}`, 'gi'), '<span class="token modified">')
36-
.replace(new RegExp(`${MODIFIED_CLOSE_TAG}`, 'gi'), '</span>')
37-
})
38-
39-
return { codeRef, code }
49+
const getSkipUnified = (line: Line, index: number) => {
50+
return ((index === 0 && line.type === 'equal') || line.type === 'disabled')
51+
}
52+
53+
const getHighlight = (value: string) => {
54+
if (!value) return '\n'
55+
56+
console.log(Prism.highlight(value, Prism.languages[props.language], props.language))
57+
return Prism.highlight(value, Prism.languages[props.language], props.language)
58+
// .replace(new RegExp(`${MODIFIED_START_TAG}`, 'gi'), '<span class="token modified">')
59+
// .replace(new RegExp(`${MODIFIED_CLOSE_TAG}`, 'gi'), '</span>')
60+
}
61+
return { getSkipUnified, getHighlight }
4062
}
4163
})
4264
</script>
@@ -72,47 +94,35 @@ pre[class*="language-"] {
7294
border-radius: 0;
7395
}
7496
75-
tr.vue-diff-row-removed td {
97+
td.vue-diff-cell-removed {
7698
background-color: rgba(255, 0, 0, .1);
7799
78100
:deep(.token.modified) {
79101
background-color: rgba(255, 0, 0, .3);
80102
}
103+
}
81104
105+
td.vue-diff-cell-removed.code {
82106
pre[class*="language-"]:before {
83107
content: "-";
84108
}
85109
}
86110
87-
.vue-diff-viewer-prev {
88-
tr.vue-diff-row-added td {
89-
background-color: rgba(128, 128, 128, 0.1);
90-
91-
pre[class*="language-"]:before {
92-
display: none;
93-
}
94-
}
95-
}
96-
97-
tr.vue-diff-row-added td {
111+
td.vue-diff-cell-added {
98112
background-color: rgba(0, 255, 128, .1);
99113
100114
:deep(.token.modified) {
101115
background-color: rgba(0, 255, 128, .3);
102116
}
117+
}
103118
119+
td.vue-diff-cell-added.code {
104120
pre[class*="language-"]:before {
105121
content: "+";
106122
}
107123
}
108124
109-
.vue-diff-viewer-current {
110-
tr.vue-diff-row-removed td {
111-
background-color: rgba(128, 128, 128, 0.1);
112-
113-
pre[class*="language-"]:before {
114-
display: none;
115-
}
116-
}
125+
td.vue-diff-cell-disabled {
126+
background-color: rgba(128, 128, 128, 0.1);
117127
}
118128
</style>

src/Diff.vue

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
11
<template>
22
<div class="vue-diff-wrapper" :class="`vue-diff-wrapper-${mode}`">
3-
<template v-if="mode === '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>
3+
<div ref="viewer" class="vue-diff-viewer">
4+
<table>
5+
<tbody>
6+
<Code
7+
:key="index"
8+
v-for="(data, index) in lines"
9+
:mode="mode"
10+
:language="language"
11+
:data="data"
12+
/>
13+
</tbody>
14+
</table>
15+
</div>
1016
</div>
1117
</template>
1218

1319
<script lang="ts">
14-
import { defineComponent, PropType } from 'vue'
15-
import Viewer from './Viewer.vue'
20+
import { defineComponent, PropType, ref, watch } from 'vue'
21+
import { renderLines } from './utils'
22+
import Code from './Code.vue'
1623
17-
import { Mode } from './utils'
24+
import type { Mode, Lines } from './utils'
1825
1926
export default defineComponent({
2027
components: {
21-
Viewer
28+
Code
2229
},
2330
props: {
2431
mode: {
@@ -37,6 +44,19 @@ export default defineComponent({
3744
type: String,
3845
required: true
3946
}
47+
},
48+
setup (props) {
49+
const lines = ref<Array<Lines>>([])
50+
51+
watch([
52+
() => props.mode,
53+
() => props.prev,
54+
() => props.current
55+
], () => {
56+
lines.value = renderLines(props.prev, props.current)
57+
}, { immediate: true })
58+
59+
return { lines }
4060
}
4161
})
4262
</script>
@@ -47,4 +67,17 @@ export default defineComponent({
4767
justify-content: space-between;
4868
width: 100%;
4969
}
70+
71+
.vue-diff-viewer {
72+
overflow: auto;
73+
width: 100%;
74+
padding: 1em 0;
75+
border-radius: 0.3em;
76+
}
77+
78+
table {
79+
min-width: 100%;
80+
table-layout: fixed;
81+
border-collapse: collapse;
82+
}
5083
</style>

0 commit comments

Comments
 (0)