Skip to content

Commit f3b3149

Browse files
silverwindfsologureng
authored andcommitted
Improvements for Content Copy (go-gitea#21842)
It now supports copying Markdown, SVG and Images (not in Firefox currently because of lacking [`ClipboardItem`](https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem) support, but can be enabled in `about:config` and works). It will fetch the data if in a rendered view or when it's an image. Followup to go-gitea#21629.
1 parent d6afc99 commit f3b3149

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

web_src/js/utils.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,3 +133,51 @@ export function convertImage(blob, mime) {
133133
}
134134
});
135135
}
136+
137+
// convert a Blob to a DataURI
138+
export function blobToDataURI(blob) {
139+
return new Promise((resolve, reject) => {
140+
try {
141+
const reader = new FileReader();
142+
reader.addEventListener('load', (e) => {
143+
resolve(e.target.result);
144+
});
145+
reader.addEventListener('error', () => {
146+
reject(new Error('FileReader failed'));
147+
});
148+
reader.readAsDataURL(blob);
149+
} catch (err) {
150+
reject(err);
151+
}
152+
});
153+
}
154+
155+
// convert image Blob to another mime-type format.
156+
export function convertImage(blob, mime) {
157+
return new Promise(async (resolve, reject) => {
158+
try {
159+
const img = new Image();
160+
const canvas = document.createElement('canvas');
161+
img.addEventListener('load', () => {
162+
try {
163+
canvas.width = img.naturalWidth;
164+
canvas.height = img.naturalHeight;
165+
const context = canvas.getContext('2d');
166+
context.drawImage(img, 0, 0);
167+
canvas.toBlob((blob) => {
168+
if (!(blob instanceof Blob)) return reject(new Error('imageBlobToPng failed'));
169+
resolve(blob);
170+
}, mime);
171+
} catch (err) {
172+
reject(err);
173+
}
174+
});
175+
img.addEventListener('error', () => {
176+
reject(new Error('imageBlobToPng failed'));
177+
});
178+
img.src = await blobToDataURI(blob);
179+
} catch (err) {
180+
reject(err);
181+
}
182+
});
183+
}

0 commit comments

Comments
 (0)