mirror of
https://github.com/remko/waforth
synced 2024-12-26 09:59:09 +01:00
thurtle: Support unicode in body
This commit is contained in:
parent
0e4fda92bb
commit
88daa57838
1 changed files with 34 additions and 4 deletions
|
@ -21,6 +21,31 @@ import draw from "./draw";
|
||||||
|
|
||||||
declare let bootstrap: any;
|
declare let bootstrap: any;
|
||||||
|
|
||||||
|
async function b64encode(bs: Uint8Array, forURL?: boolean) {
|
||||||
|
const url = await new Promise<string>((resolve) => {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = () => {
|
||||||
|
resolve(reader.result as string);
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(new Blob([bs]));
|
||||||
|
});
|
||||||
|
const result = url.slice(url.indexOf(",") + 1);
|
||||||
|
return forURL
|
||||||
|
? result.replace(/\//g, "_").replace(/\+/g, "-").replace(/=+$/, "")
|
||||||
|
: result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function b64decode(s: string) {
|
||||||
|
if (s.length % 4 != 0) {
|
||||||
|
s += "===".slice(0, 4 - (s.length % 4));
|
||||||
|
}
|
||||||
|
return new Uint8Array(
|
||||||
|
[...atob(s.replace(/_/g, "/").replace(/-/g, "+"))].map((c) =>
|
||||||
|
c.charCodeAt(0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function parseQS(sqs = window.location.search) {
|
function parseQS(sqs = window.location.search) {
|
||||||
const qs: Record<string, string> = {};
|
const qs: Record<string, string> = {};
|
||||||
const sqss = sqs
|
const sqss = sqs
|
||||||
|
@ -492,6 +517,9 @@ async function downloadPNG(ev: MouseEvent) {
|
||||||
img.style.display = "none";
|
img.style.display = "none";
|
||||||
document.body.appendChild(img);
|
document.body.appendChild(img);
|
||||||
try {
|
try {
|
||||||
|
const imgSrc =
|
||||||
|
"data:image/svg+xml;base64," +
|
||||||
|
(await b64encode(new TextEncoder().encode(svg.data)));
|
||||||
const dataURL = await new Promise<string>((resolve, reject) => {
|
const dataURL = await new Promise<string>((resolve, reject) => {
|
||||||
img.onerror = (e) => {
|
img.onerror = (e) => {
|
||||||
reject(e);
|
reject(e);
|
||||||
|
@ -504,7 +532,7 @@ async function downloadPNG(ev: MouseEvent) {
|
||||||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
||||||
resolve(canvas.toDataURL("image/png"));
|
resolve(canvas.toDataURL("image/png"));
|
||||||
};
|
};
|
||||||
img.src = "data:image/svg+xml;base64," + btoa(svg.data);
|
img.src = imgSrc;
|
||||||
});
|
});
|
||||||
const blob = await (await fetch(dataURL)).blob();
|
const blob = await (await fetch(dataURL)).blob();
|
||||||
saveAs(blob, programsEl.value + ".png");
|
saveAs(blob, programsEl.value + ".png");
|
||||||
|
@ -516,14 +544,16 @@ async function downloadPNG(ev: MouseEvent) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function share(ev: MouseEvent) {
|
async function share(ev: MouseEvent) {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
shareModalTitleEl.innerText = programsEl.value;
|
shareModalTitleEl.innerText = programsEl.value;
|
||||||
shareModalURLEl.value = `${window.location.protocol}//${
|
shareModalURLEl.value = `${window.location.protocol}//${
|
||||||
window.location.host
|
window.location.host
|
||||||
}${window.location.pathname}?pn=${encodeURIComponent(
|
}${window.location.pathname}?pn=${encodeURIComponent(
|
||||||
programsEl.value
|
programsEl.value
|
||||||
)}&p=${encodeURIComponent(btoa(editor.getValue()))}&ar=1`;
|
)}&p=${encodeURIComponent(
|
||||||
|
await b64encode(new TextEncoder().encode(editor.getValue()), true)
|
||||||
|
)}&ar=1`;
|
||||||
shareModal.show();
|
shareModal.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -581,7 +611,7 @@ async function reset() {
|
||||||
/////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
if (qs.p) {
|
if (qs.p) {
|
||||||
saveProgram(qs.pn ?? "", atob(qs.p), true);
|
saveProgram(qs.pn ?? "", new TextDecoder().decode(b64decode(qs.p)), true);
|
||||||
loadPrograms();
|
loadPrograms();
|
||||||
loadProgram(qs.pn);
|
loadProgram(qs.pn);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue