@@ -7,7 +7,15 @@ import sqlHljs from 'highlight.js/lib/languages/sql';
7
7
import xmlHljs from ' highlight.js/lib/languages/xml' ;
8
8
import yamlHljs from ' highlight.js/lib/languages/yaml' ;
9
9
import iniHljs from ' highlight.js/lib/languages/ini' ;
10
+ import bashHljs from ' highlight.js/lib/languages/bash' ;
11
+ import markdownHljs from ' highlight.js/lib/languages/markdown' ;
12
+ import jsHljs from ' highlight.js/lib/languages/javascript' ;
13
+ import cssHljs from ' highlight.js/lib/languages/css' ;
14
+ import goHljs from ' highlight.js/lib/languages/go' ;
15
+ import csharpHljs from ' highlight.js/lib/languages/csharp' ;
16
+ import { Base64 } from ' js-base64' ;
10
17
import { useCopy } from ' @/composable/copy' ;
18
+ import { useDownloadFileFromBase64 } from ' @/composable/downloadBase64' ;
11
19
12
20
const props = withDefaults (
13
21
defineProps <{
@@ -16,12 +24,17 @@ const props = withDefaults(
16
24
language? : string
17
25
copyPlacement? : ' top-right' | ' bottom-right' | ' outside' | ' none'
18
26
copyMessage? : string
27
+ wordWrap? : boolean
28
+ downloadFileName? : string
29
+ downloadButtonText? : string
19
30
}>(),
20
31
{
21
32
followHeightOf: null ,
22
33
language: ' txt' ,
23
34
copyPlacement: ' top-right' ,
24
35
copyMessage: ' Copy to clipboard' ,
36
+ downloadFileName: ' ' ,
37
+ downloadButtonText: ' Download' ,
25
38
},
26
39
);
27
40
hljs .registerLanguage (' sql' , sqlHljs );
@@ -30,12 +43,25 @@ hljs.registerLanguage('html', xmlHljs);
30
43
hljs .registerLanguage (' xml' , xmlHljs );
31
44
hljs .registerLanguage (' yaml' , yamlHljs );
32
45
hljs .registerLanguage (' toml' , iniHljs );
46
+ hljs .registerLanguage (' bash' , bashHljs );
47
+ hljs .registerLanguage (' markdown' , markdownHljs );
48
+ hljs .registerLanguage (' css' , cssHljs );
49
+ hljs .registerLanguage (' javascript' , jsHljs );
50
+ hljs .registerLanguage (' go' , goHljs );
51
+ hljs .registerLanguage (' csharp' , csharpHljs );
33
52
34
- const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs (props );
53
+ const { value, language, followHeightOf, copyPlacement, copyMessage, downloadFileName, downloadButtonText } = toRefs (props );
35
54
const { height } = followHeightOf .value ? useElementSize (followHeightOf ) : { height: ref (null ) };
36
55
37
56
const { copy, isJustCopied } = useCopy ({ source: value , createToast: false });
38
57
const tooltipText = computed (() => isJustCopied .value ? ' Copied!' : copyMessage .value );
58
+
59
+ const valueBase64 = computed (() => Base64 .encode (value .value ));
60
+ const { download } = useDownloadFileFromBase64 (
61
+ {
62
+ source: valueBase64 ,
63
+ filename: downloadFileName ,
64
+ });
39
65
</script >
40
66
41
67
<template >
@@ -47,11 +73,16 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
47
73
:style =" height ? `min-height: ${height - 40 /* card padding */ + 10 /* negative margin compensation */}px` : ''"
48
74
>
49
75
<n-config-provider :hljs =" hljs" >
50
- <n-code :code =" value" :language =" language" :trim =" false" data-test-id =" area-content" />
76
+ <n-code :code =" value" :language =" language" :word-wrap = " wordWrap " : trim =" false" data-test-id =" area-content" />
51
77
</n-config-provider >
52
78
</n-scrollbar >
53
- <div absolute right-10px top-10px >
54
- <c-tooltip v-if =" value" :tooltip =" tooltipText" position =" left" >
79
+ <div
80
+ v-if =" value && copyPlacement !== 'none'"
81
+ absolute right-10px
82
+ :top-10px =" copyPlacement === 'top-right' ? '' : 'no'"
83
+ :bottom-10px =" copyPlacement === 'bottom-right' ? '' : 'no'"
84
+ >
85
+ <c-tooltip v-if =" value && copyPlacement !== 'outside'" :tooltip =" tooltipText" position =" left" >
55
86
<c-button circle important:h-10 important:w-10 @click =" copy()" >
56
87
<n-icon size =" 22" :component =" Copy" />
57
88
</c-button >
@@ -63,6 +94,11 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
63
94
{{ tooltipText }}
64
95
</c-button >
65
96
</div >
97
+ <div v-if =" downloadFileName !== '' && value !== ''" mt-5 flex justify-center >
98
+ <c-button secondary @click =" download" >
99
+ {{ downloadButtonText }}
100
+ </c-button >
101
+ </div >
66
102
</div >
67
103
</template >
68
104
0 commit comments