Skip to content

Commit 7a140fc

Browse files
committed
Merge branch 'feat/bounce-parser' into chore/all-my-stuffs
# Conflicts: # src/components/TextareaCopyable.vue # src/tools/index.ts
2 parents c8118b0 + 7170450 commit 7a140fc

File tree

10 files changed

+242
-20
lines changed

10 files changed

+242
-20
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"crypto-js": "^4.1.1",
6666
"date-fns": "^2.29.3",
6767
"dompurify": "^3.0.6",
68+
"email-bounce-parser-browser": "^1.1",
6869
"email-normalizer": "^1.0.0",
6970
"emojilib": "^3.0.10",
7071
"figlet": "^1.7.0",

pnpm-lock.yaml

Lines changed: 72 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/re2.wasm

838 KB
Binary file not shown.

src/components/TextareaCopyable.vue

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,15 @@ import sqlHljs from 'highlight.js/lib/languages/sql';
77
import xmlHljs from 'highlight.js/lib/languages/xml';
88
import yamlHljs from 'highlight.js/lib/languages/yaml';
99
import iniHljs from 'highlight.js/lib/languages/ini';
10+
import bashHljs from 'highlight.js/lib/languages/bash';
1011
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';
1117
import { useCopy } from '@/composable/copy';
18+
import { useDownloadFileFromBase64 } from '@/composable/downloadBase64';
1219
1320
const props = withDefaults(
1421
defineProps<{
@@ -18,12 +25,16 @@ const props = withDefaults(
1825
copyPlacement?: 'top-right' | 'bottom-right' | 'outside' | 'none'
1926
copyMessage?: string
2027
wordWrap?: boolean
28+
downloadFileName?: string
29+
downloadButtonText?: string
2130
}>(),
2231
{
2332
followHeightOf: null,
2433
language: 'txt',
2534
copyPlacement: 'top-right',
2635
copyMessage: 'Copy to clipboard',
36+
downloadFileName: '',
37+
downloadButtonText: 'Download',
2738
},
2839
);
2940
hljs.registerLanguage('sql', sqlHljs);
@@ -32,13 +43,25 @@ hljs.registerLanguage('html', xmlHljs);
3243
hljs.registerLanguage('xml', xmlHljs);
3344
hljs.registerLanguage('yaml', yamlHljs);
3445
hljs.registerLanguage('toml', iniHljs);
46+
hljs.registerLanguage('bash', bashHljs);
3547
hljs.registerLanguage('markdown', markdownHljs);
48+
hljs.registerLanguage('css', cssHljs);
49+
hljs.registerLanguage('javascript', jsHljs);
50+
hljs.registerLanguage('go', goHljs);
51+
hljs.registerLanguage('csharp', csharpHljs);
3652
37-
const { value, language, followHeightOf, copyPlacement, copyMessage } = toRefs(props);
53+
const { value, language, followHeightOf, copyPlacement, copyMessage, downloadFileName, downloadButtonText } = toRefs(props);
3854
const { height } = followHeightOf.value ? useElementSize(followHeightOf) : { height: ref(null) };
3955
4056
const { copy, isJustCopied } = useCopy({ source: value, createToast: false });
4157
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+
});
4265
</script>
4366

4467
<template>
@@ -53,8 +76,13 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
5376
<n-code :code="value" :language="language" :word-wrap="wordWrap" :trim="false" data-test-id="area-content" />
5477
</n-config-provider>
5578
</n-scrollbar>
56-
<div absolute right-10px top-10px>
57-
<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">
5886
<c-button circle important:h-10 important:w-10 @click="copy()">
5987
<n-icon size="22" :component="Copy" />
6088
</c-button>
@@ -66,6 +94,11 @@ const tooltipText = computed(() => isJustCopied.value ? 'Copied!' : copyMessage.
6694
{{ tooltipText }}
6795
</c-button>
6896
</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>
69102
</div>
70103
</template>
71104

src/composable/downloadBase64.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { extension as getExtensionFromMimeType, extension as getMimeTypeFromExtension } from 'mime-types';
2-
import type { Ref } from 'vue';
2+
import type { MaybeRef, Ref } from 'vue';
33
import _ from 'lodash';
4+
import { get } from '@vueuse/core';
45

56
export {
67
getMimeTypeFromBase64,
@@ -75,21 +76,11 @@ function downloadFromBase64({ sourceValue, filename, extension, fileMimeType }:
7576
}
7677

7778
function useDownloadFileFromBase64(
78-
{ source, filename, extension, fileMimeType }:
79-
{ source: Ref<string>; filename?: string; extension?: string; fileMimeType?: string }) {
80-
return {
81-
download() {
82-
downloadFromBase64({ sourceValue: source.value, filename, extension, fileMimeType });
83-
},
84-
};
85-
}
86-
87-
function useDownloadFileFromBase64Refs(
8879
{ source, filename, extension }:
89-
{ source: Ref<string>; filename?: Ref<string>; extension?: Ref<string> }) {
80+
{ source: MaybeRef<string>; filename?: MaybeRef<string>; extension?: MaybeRef<string> }) {
9081
return {
9182
download() {
92-
downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value });
83+
downloadFromBase64({ sourceValue: get(source), filename: get(filename), extension: get(extension) });
9384
},
9485
};
9586
}
@@ -116,3 +107,13 @@ function previewImageFromBase64(base64String: string): HTMLImageElement {
116107

117108
return img;
118109
}
110+
111+
function useDownloadFileFromBase64Refs(
112+
{ source, filename, extension }:
113+
{ source: Ref<string>; filename?: Ref<string>; extension?: Ref<string> }) {
114+
return {
115+
download() {
116+
downloadFromBase64({ sourceValue: source.value, filename: filename?.value, extension: extension?.value });
117+
},
118+
};
119+
}

0 commit comments

Comments
 (0)