|
1 | 1 | <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> |
9 | 11 | </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> |
10 | 24 | </template> |
11 | 25 |
|
12 | 26 | <script lang="ts"> |
13 | 27 | import Prism from 'prismjs' |
14 | 28 | 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' |
16 | 30 |
|
17 | | -// @ts-ignore |
18 | | -Prism.manual = true |
| 31 | +import type { Mode, Lines, Line } from './utils' |
19 | 32 |
|
20 | 33 | export default defineComponent({ |
21 | 34 | props: { |
22 | | - data: { |
23 | | - type: Object as PropType<Line>, |
| 35 | + mode: { |
| 36 | + type: String as PropType<Mode>, |
24 | 37 | required: true |
25 | 38 | }, |
26 | 39 | language: { |
27 | 40 | type: String, |
28 | 41 | required: true |
| 42 | + }, |
| 43 | + data: { |
| 44 | + type: Object as PropType<Array<Lines>>, |
| 45 | + required: true |
29 | 46 | } |
30 | 47 | }, |
31 | 48 | 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 } |
40 | 62 | } |
41 | 63 | }) |
42 | 64 | </script> |
@@ -72,47 +94,35 @@ pre[class*="language-"] { |
72 | 94 | border-radius: 0; |
73 | 95 | } |
74 | 96 |
|
75 | | -tr.vue-diff-row-removed td { |
| 97 | +td.vue-diff-cell-removed { |
76 | 98 | background-color: rgba(255, 0, 0, .1); |
77 | 99 |
|
78 | 100 | :deep(.token.modified) { |
79 | 101 | background-color: rgba(255, 0, 0, .3); |
80 | 102 | } |
| 103 | +} |
81 | 104 |
|
| 105 | +td.vue-diff-cell-removed.code { |
82 | 106 | pre[class*="language-"]:before { |
83 | 107 | content: "-"; |
84 | 108 | } |
85 | 109 | } |
86 | 110 |
|
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 { |
98 | 112 | background-color: rgba(0, 255, 128, .1); |
99 | 113 |
|
100 | 114 | :deep(.token.modified) { |
101 | 115 | background-color: rgba(0, 255, 128, .3); |
102 | 116 | } |
| 117 | +} |
103 | 118 |
|
| 119 | +td.vue-diff-cell-added.code { |
104 | 120 | pre[class*="language-"]:before { |
105 | 121 | content: "+"; |
106 | 122 | } |
107 | 123 | } |
108 | 124 |
|
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); |
117 | 127 | } |
118 | 128 | </style> |
0 commit comments