This commit is contained in:
Andrew Pimenov 2026-09-04 10:07:45 +03:00 • committed by GitHub
commit ab6805daf5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -11,8 +11,8 @@ export interface ExportImageDeps {
t(key: string): string; t(key: string): string;
} }
export async function exportSheetImage(deps: ExportImageDeps): Promise<void> { function createImageCanvas(deps: ExportImageDeps): HTMLCanvasElement {
const { lines: rawLines, results: doc, fontSize, toast, t } = deps; const { lines: rawLines, results: doc, fontSize } = deps;
const dpr = window.devicePixelRatio || 1; const dpr = window.devicePixelRatio || 1;
const style = getComputedStyle(document.documentElement); const style = getComputedStyle(document.documentElement);
const bgColor = style.getPropertyValue("--bg").trim() || "#ffffff"; const bgColor = style.getPropertyValue("--bg").trim() || "#ffffff";
@ -49,9 +49,11 @@ export async function exportSheetImage(deps: ExportImageDeps): Promise<void> {
} }
} }
const blob = await new Promise<Blob | null>((res) => canvas.toBlob(res, "image/png")); return canvas;
if (!blob) { toast(t("imageFailed")); return; } }
async function copyOrSaveImage(blob: Blob, deps: ExportImageDeps): Promise<void> {
const { toast, t } = deps;
try { try {
await navigator.clipboard.write([new ClipboardItem({ "image/png": blob })]); await navigator.clipboard.write([new ClipboardItem({ "image/png": blob })]);
toast(t("imageCopied")); toast(t("imageCopied"));
@ -69,6 +71,18 @@ export async function exportSheetImage(deps: ExportImageDeps): Promise<void> {
} }
} }
export async function exportSheetImage(deps: ExportImageDeps): Promise<void> {
const canvas = createImageCanvas(deps);
const blob = await new Promise<Blob | null>((res) => canvas.toBlob(res, "image/png"));
if (!blob) {
deps.toast(deps.t("imageFailed"));
return;
}
await copyOrSaveImage(blob, deps);
}
/** chunked to avoid "Maximum call stack size exceeded" from spreading a large array as args */ /** chunked to avoid "Maximum call stack size exceeded" from spreading a large array as args */
function bytesToBase64(bytes: Uint8Array): string { function bytesToBase64(bytes: Uint8Array): string {
let bin = ""; let bin = "";