Skip to content

Commit afd627f

Browse files
authored
fix(composables): mermaid download optimization (#400)
fix(composables): mermaid download optimization (#400)
2 parents be2c8cc + 28316ab commit afd627f

File tree

1 file changed

+28
-24
lines changed
  • packages/core/src/components/XMarkdownCore/components/Mermaid

1 file changed

+28
-24
lines changed

packages/core/src/components/XMarkdownCore/components/Mermaid/composables.ts

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
// 复制到剪贴板
22
export async function copyToClipboard(content: string): Promise<boolean> {
3-
if (!content)
4-
return false;
3+
if (!content) return false;
54

65
try {
76
if (navigator.clipboard && window.isSecureContext) {
87
await navigator.clipboard.writeText(content);
98
return true;
10-
}
11-
else {
9+
} else {
1210
const textArea = document.createElement('textarea');
1311
textArea.value = content;
1412
textArea.style.position = 'fixed';
@@ -21,30 +19,41 @@ export async function copyToClipboard(content: string): Promise<boolean> {
2119
textArea.remove();
2220
return true;
2321
}
24-
}
25-
catch (err) {
22+
} catch (err) {
2623
console.error('复制失败: ', err);
2724
return false;
2825
}
2926
}
3027

3128
// SVG下载功能
32-
export function downloadSvgAsPng(svg: string): void {
33-
if (!svg)
34-
return;
29+
/**
30+
* DownloadOptions
31+
* @scale 2:标准分辨率;4:高分辨率(默认); 8:超高分辨率
32+
* @quality 0.8:良好质量,文件较小;0.9:良好质量,文件适中;1.0:无损质量(默认)
33+
*/
34+
interface DownloadOptions {
35+
scale?: number; // 缩放因子,默认4
36+
quality?: number; // 图片质量,默认1.0
37+
format?: string; // 图片格式,默认'image/png'
38+
}
39+
export function downloadSvgAsPng(
40+
svg: string,
41+
options: DownloadOptions = {}
42+
): void {
43+
if (!svg) return;
3544

3645
try {
46+
const { scale = 4, quality = 1.0, format = 'image/png' } = options;
47+
3748
const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
3849
const img = new Image();
3950

4051
img.onload = () => {
4152
try {
4253
const canvas = document.createElement('canvas');
4354
const ctx = canvas.getContext('2d', { willReadFrequently: false });
44-
if (!ctx)
45-
return;
55+
if (!ctx) return;
4656

47-
const scale = 2;
4857
canvas.width = img.width * scale;
4958
canvas.height = img.height * scale;
5059
ctx.imageSmoothingEnabled = true;
@@ -66,8 +75,7 @@ export function downloadSvgAsPng(svg: string): void {
6675
try {
6776
canvas.toBlob(
6877
blob => {
69-
if (!blob)
70-
return;
78+
if (!blob) return;
7179
const url = URL.createObjectURL(blob);
7280
const link = document.createElement('a');
7381
link.href = url;
@@ -77,11 +85,10 @@ export function downloadSvgAsPng(svg: string): void {
7785
document.body.removeChild(link);
7886
URL.revokeObjectURL(url);
7987
},
80-
'image/png',
81-
0.95
88+
format,
89+
quality
8290
);
83-
}
84-
catch (toBlobError) {
91+
} catch (toBlobError) {
8592
console.error('toBlobError:', toBlobError);
8693
// 降级方案
8794
try {
@@ -92,13 +99,11 @@ export function downloadSvgAsPng(svg: string): void {
9299
document.body.appendChild(link);
93100
link.click();
94101
document.body.removeChild(link);
95-
}
96-
catch (dataUrlError) {
102+
} catch (dataUrlError) {
97103
console.error('dataUrlError:', dataUrlError);
98104
}
99105
}
100-
}
101-
catch (canvasError) {
106+
} catch (canvasError) {
102107
console.error('Canvas操作失败:', canvasError);
103108
}
104109
};
@@ -108,8 +113,7 @@ export function downloadSvgAsPng(svg: string): void {
108113
};
109114

110115
img.src = svgDataUrl;
111-
}
112-
catch (error) {
116+
} catch (error) {
113117
console.error('下载失败:', error);
114118
}
115119
}

0 commit comments

Comments
 (0)