|
1 | 1 | <template> |
2 | | - <tr v-if="mode === 'split'" :class="`vue-diff-row-${mode}`"> |
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 |
9 | | - :class="`language-${language}`" |
10 | | - v-html="line.type.match(/added|removed/) ? |
11 | | - getHighlightCode(line.value, data, index) : |
12 | | - getHighlightCode(line.value)" |
13 | | - ></code></pre> |
14 | | - </td> |
15 | | - </template> |
16 | | - </tr> |
17 | | - <template v-if="mode === 'unified'"> |
18 | | - <tr :class="`vue-diff-row-${mode}`"> |
19 | | - <td class="lineNum" :class="`vue-diff-cell-${data[0].type}`"> |
20 | | - {{ data[0].lineNum }} |
21 | | - </td> |
22 | | - <td class="code" :class="`vue-diff-cell-${data[0].type}`"> |
23 | | - <pre :class="`language-${language}`"><code :class="`language-${language}`" v-html="getHighlightCode(data[0].value)"></code></pre> |
24 | | - </td> |
25 | | - </tr> |
26 | | - </template> |
| 2 | + <pre :class="`language-${language}`"><code |
| 3 | + :class="`language-${language}`" |
| 4 | + v-html="code" |
| 5 | + ></code></pre> |
27 | 6 | </template> |
28 | 7 |
|
29 | 8 | <script lang="ts"> |
30 | | -import Prism from 'prismjs' |
31 | | -import { defineComponent, PropType } from 'vue' |
32 | | -import { MODIFIED_START_TAG, MODIFIED_CLOSE_TAG, renderWords } from './utils' |
33 | | -
|
34 | | -import type { Mode, Lines } from './utils' |
35 | | -
|
36 | | -// @ts-ignore |
37 | | -Prism.manual = true |
| 9 | +import hljs from 'highlight.js' |
| 10 | +import { defineComponent, ref, onMounted } from 'vue' |
| 11 | +import { MODIFIED_START_TAG, MODIFIED_CLOSE_TAG } from './utils' |
| 12 | +import 'highlight.js/styles/monokai.css' |
38 | 13 |
|
39 | 14 | export default defineComponent({ |
40 | 15 | props: { |
41 | | - mode: { |
42 | | - type: String as PropType<Mode>, |
43 | | - required: true |
44 | | - }, |
45 | 16 | language: { |
46 | 17 | type: String, |
47 | 18 | required: true |
48 | 19 | }, |
49 | | - data: { |
50 | | - type: Object as PropType<Lines>, |
| 20 | + value: { |
| 21 | + type: String, |
51 | 22 | required: true |
52 | 23 | } |
53 | 24 | }, |
54 | 25 | setup (props) { |
55 | | - const getHighlightCode = (value: string, data?: Lines, index?: number) => { |
56 | | - if (!value) return '\n' |
57 | | -
|
58 | | - const code = value |
| 26 | + const code = ref('') |
59 | 27 |
|
60 | | - // if (data) { // Diff words |
61 | | - // const diffIndex = index === 0 ? 1 : 0 |
62 | | - // const diffValue = data[diffIndex].value |
| 28 | + const pureValue = props.value.replace(new RegExp(`(${MODIFIED_START_TAG}|${MODIFIED_CLOSE_TAG})`, 'g'), '') |
| 29 | + code.value = hljs.highlight(props.language, pureValue).value |
63 | 30 |
|
64 | | - // if (diffValue) { // Wrap custom highlight |
65 | | - // code = renderWords(diffValue, value) |
66 | | - // } |
67 | | - // } |
| 31 | + onMounted(() => { |
| 32 | + const el = document.createElement('div') |
| 33 | + el.innerHTML = code.value |
68 | 34 |
|
69 | | - const grammar = Prism.languages[props.language] |
70 | | - const highlightCode = Prism.highlight(code, grammar, props.language) |
71 | | -
|
72 | | - return highlightCode |
73 | | - } |
| 35 | + console.log(el.childNodes) |
| 36 | + }) |
74 | 37 |
|
75 | 38 | return { |
76 | | - getHighlightCode |
| 39 | + code |
77 | 40 | } |
78 | 41 | } |
79 | 42 | }) |
80 | 43 | </script> |
81 | 44 |
|
82 | 45 | <style scoped lang="scss"> |
83 | | -td { |
84 | | - padding: 0 0.5em; |
85 | | - vertical-align: top; |
86 | | -
|
87 | | - &.lineNum { |
88 | | - width: 3.5em; |
89 | | - padding-top: .05em; |
90 | | - text-align: right; |
91 | | - color: #999; |
92 | | - font-size: 0.9em; |
93 | | - } |
94 | | -
|
95 | | - pre[class*="language-"]:before { |
96 | | - display: inline-block; |
97 | | - position: absolute; |
98 | | - left: 0; |
99 | | - top: 0; |
100 | | - opacity: 0.8; |
101 | | - } |
102 | | -
|
103 | | - pre[class*="language-"] { |
104 | | - display: block; |
105 | | - position: relative; |
106 | | - max-width: 100%; |
107 | | - margin: 0; |
108 | | - padding: 0; |
109 | | - padding-left: 1.5em; |
110 | | - overflow: visible; |
111 | | - background: none; |
112 | | - border-radius: 0; |
113 | | - } |
114 | | -
|
115 | | - code { |
116 | | - word-wrap: break-all !important; |
117 | | - word-break: break-all !important; |
118 | | - white-space: pre-wrap !important; |
119 | | - } |
120 | | -} |
121 | | -
|
122 | | -td.vue-diff-cell-removed { |
123 | | - background-color: rgba(255, 0, 0, .1); |
124 | | -
|
125 | | - :deep(.token.modified) { |
126 | | - background-color: rgba(255, 0, 0, .3); |
127 | | - } |
128 | | -} |
129 | | -
|
130 | | -td.vue-diff-cell-removed.code { |
131 | | - pre[class*="language-"]:before { |
132 | | - content: "-"; |
133 | | - } |
134 | | -} |
135 | | -
|
136 | | -td.vue-diff-cell-added { |
137 | | - background-color: rgba(0, 255, 128, .1); |
138 | | -
|
139 | | - :deep(.token.modified) { |
140 | | - background-color: rgba(0, 255, 128, .3); |
141 | | - } |
142 | | -} |
143 | | -
|
144 | | -td.vue-diff-cell-added.code { |
145 | | - pre[class*="language-"]:before { |
146 | | - content: "+"; |
147 | | - } |
148 | | -} |
149 | | -
|
150 | | -td.vue-diff-cell-disabled { |
151 | | - background-color: rgba(128, 128, 128, 0.1); |
| 46 | +code { |
| 47 | + word-wrap: break-all !important; |
| 48 | + word-break: break-all !important; |
| 49 | + white-space: pre-wrap !important; |
152 | 50 | } |
153 | 51 | </style> |
0 commit comments