11<template >
2- <tr v-if =" mode === 'split'" >
2+ <tr v-if =" mode === 'split'" :class = " `vue-diff-row-${mode}` " >
33 <template :key =" index " v-for =" (line , index ) in data " >
44 <td class =" lineNum" :class =" `vue-diff-cell-${line.type}`" >
55 {{ line.lineNum }}
66 </td >
77 <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 >
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 >
914 </td >
1015 </template >
1116 </tr >
1217 <template v-if =" mode === ' unified' " >
13- <tr >
18+ <tr :class = " `vue-diff-row-${mode}` " >
1419 <td class =" lineNum" :class =" `vue-diff-cell-${data[0].type}`" >
1520 {{ data[0].lineNum }}
1621 </td >
1722 <td class =" code" :class =" `vue-diff-cell-${data[0].type}`" >
18- <pre :class =" `language-${language}`" ><code :class =" `language-${language}`" v-html =" getHighlight (data[0].value)" ></code ></pre >
23+ <pre :class =" `language-${language}`" ><code :class =" `language-${language}`" v-html =" getHighlightCode (data[0].value)" ></code ></pre >
1924 </td >
2025 </tr >
2126 </template >
2227</template >
2328
2429<script lang="ts">
2530import Prism from ' prismjs'
26- import { defineComponent , PropType , ref , computed } from ' vue'
27- import { MODIFIED_START_TAG , MODIFIED_CLOSE_TAG } from ' ./utils'
31+ import { defineComponent , PropType } from ' vue'
32+ import { MODIFIED_START_TAG , MODIFIED_CLOSE_TAG , renderWords } from ' ./utils'
2833
29- import type { Mode , Lines , Line } from ' ./utils'
34+ import type { Mode , Lines } from ' ./utils'
35+
36+ // @ts-ignore
37+ Prism .manual = true
38+
39+ // Prism.hooks.add('before-tokenize', function (env) {
40+ // if (env.code.match(new RegExp(`${MODIFIED_START_TAG}`, 'gi'))) {
41+ // const code = env.code
42+ // const pureCode = env.code
43+ // .replace(new RegExp(`${MODIFIED_START_TAG}`, 'gi'), '')
44+ // .replace(new RegExp(`${MODIFIED_CLOSE_TAG}`, 'gi'), '')
45+
46+ // env._modified = code
47+ // env.code = pureCode
48+ // }
49+ // })
50+
51+ // Prism.hooks.add('after-tokenize', function (env) {
52+ // if (env._modified) {
53+ // console.log(env)
54+ // }
55+ // })
3056
3157export default defineComponent ({
3258 props: {
@@ -39,38 +65,60 @@ export default defineComponent({
3965 required: true
4066 },
4167 data: {
42- type: Object as PropType <Array < Lines > >,
68+ type: Object as PropType <Lines >,
4369 required: true
4470 }
4571 },
4672 setup (props ) {
47- const getSkipUnified = (line : Line , index : number ) => {
48- return ((index === 0 && line .type === ' equal' ) || line .type === ' disabled' )
49- }
50-
51- const getHighlight = (value : string ) => {
73+ const getHighlightCode = (value : string , data ? : Lines , index ? : number ) => {
5274 if (! value ) return ' \n '
5375
54- return Prism .highlight (value , Prism .languages [props .language ], props .language )
55- // .replace(new RegExp(`${MODIFIED_START_TAG}`, 'gi'), '<span class="token modified">')
56- // .replace(new RegExp(`${MODIFIED_CLOSE_TAG}`, 'gi'), '</span>')
76+ let code = value
77+
78+ if (data ) { // Diff words
79+ const diffIndex = index === 0 ? 1 : 0
80+ const diffValue = data [diffIndex ].value
81+
82+ if (diffValue ) { // Wrap custom highlight
83+ code = renderWords (diffValue , value )
84+ }
85+ }
86+
87+ const grammer = Prism .languages [props .language ]
88+ const highlightCode = Prism .highlight (code , grammer , props .language )
89+
90+ const regexStartTag = Prism .Token .stringify (Prism .util .encode (Prism .tokenize (MODIFIED_START_TAG , grammer )), props .language )
91+ const regexCloseTag = Prism .Token .stringify (Prism .util .encode (Prism .tokenize (MODIFIED_CLOSE_TAG , grammer )), props .language )
92+
93+ return highlightCode
94+ // .replace(new RegExp(`${regexStartTag}`, 'gi'), '<span class="token modified">')
95+ // .replace(new RegExp(`${regexCloseTag}`, 'gi'), '</span>')
96+ }
97+
98+ return {
99+ getHighlightCode
57100 }
58- return { getSkipUnified , getHighlight }
59101 }
60102})
61103 </script >
62104
63105<style scoped lang="scss">
64106td {
65107 padding : 0 0.5em ;
108+ vertical-align : top ;
66109
67110 & .lineNum {
68- width : 2em ;
111+ width : 3.5em ;
112+ padding-top : .05em ;
69113 text-align : right ;
70114 color : #999 ;
71115 font-size : 0.9em ;
72116 }
73117
118+ & .code {
119+ width : calc (100% - 2em );
120+ }
121+
74122 pre [class *= " language-" ]:before {
75123 display : inline-block ;
76124 position : absolute ;
80128 }
81129}
82130
131+ tr .vue-diff-row-split {
132+ td .code {
133+ width : calc (50% - 2em );
134+ }
135+ }
136+
83137pre [class *= " language-" ] {
84138 display : block ;
85139 position : relative ;
140+ max-width : 100% ;
86141 margin : 0 ;
87142 padding : 0 ;
88143 padding-left : 1.5em ;
@@ -91,6 +146,12 @@ pre[class*="language-"] {
91146 border-radius : 0 ;
92147}
93148
149+ code {
150+ word-wrap : break-all ;
151+ word-break : break-all ;
152+ white-space : pre-wrap ;
153+ }
154+
94155td .vue-diff-cell-removed {
95156 background-color : rgba (255 , 0 , 0 , .1 );
96157
0 commit comments