Compare commits
2 commits
076fcfc1c4
...
f826e27523
Author | SHA1 | Date | |
---|---|---|---|
f826e27523 | |||
3068b16a72 |
2 changed files with 64 additions and 3 deletions
13
web/static/js/jszip.min.js
vendored
Normal file
13
web/static/js/jszip.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -64,6 +64,7 @@
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<script src="{{ url_for('static', filename='js/jszip.min.js') }}"></script>
|
||||||
<script>
|
<script>
|
||||||
const canvas = document.getElementById("cardCanvas");
|
const canvas = document.getElementById("cardCanvas");
|
||||||
const ctx = canvas.getContext("2d");
|
const ctx = canvas.getContext("2d");
|
||||||
|
@ -221,13 +222,17 @@ function wrapText(text, x, y, maxWidth, lineHeight) {
|
||||||
|
|
||||||
// Download button
|
// Download button
|
||||||
downloadBtn.addEventListener("click", () => {
|
downloadBtn.addEventListener("click", () => {
|
||||||
|
// Sanitize file name
|
||||||
|
const safeName = (nameInput.value || "card").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const safePack = (packInput.value || "pack").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const fileName = `kemoverse_${safePack}_${safeName}.webp`;
|
||||||
|
|
||||||
const link = document.createElement("a");
|
const link = document.createElement("a");
|
||||||
link.download = "kemoverse-card.webp";
|
link.download = fileName;
|
||||||
link.href = canvas.toDataURL("image/webp", 0.95);
|
link.href = canvas.toDataURL("image/webp", 0.95);
|
||||||
link.click();
|
link.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Create and place the JSON download button below the card download button
|
|
||||||
const jsonBtn = document.createElement("button");
|
const jsonBtn = document.createElement("button");
|
||||||
jsonBtn.textContent = "Download Card Info";
|
jsonBtn.textContent = "Download Card Info";
|
||||||
jsonBtn.style.marginTop = "0.5rem";
|
jsonBtn.style.marginTop = "0.5rem";
|
||||||
|
@ -242,13 +247,56 @@ jsonBtn.onclick = () => {
|
||||||
artist: artistInput.value,
|
artist: artistInput.value,
|
||||||
frame: frameSelect.value
|
frame: frameSelect.value
|
||||||
};
|
};
|
||||||
|
const safeName = (nameInput.value || "card").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const safePack = (packInput.value || "pack").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const fileName = `kemoverse_${safePack}_${safeName}.json`;
|
||||||
|
|
||||||
const blob = new Blob([JSON.stringify(cardData, null, 2)], {type: "application/json"});
|
const blob = new Blob([JSON.stringify(cardData, null, 2)], {type: "application/json"});
|
||||||
const link = document.createElement("a");
|
const link = document.createElement("a");
|
||||||
link.href = URL.createObjectURL(blob);
|
link.href = URL.createObjectURL(blob);
|
||||||
link.download = "kemoverse-card.json";
|
link.download = fileName;
|
||||||
link.click();
|
link.click();
|
||||||
};
|
};
|
||||||
|
|
||||||
// Place the button below the downloadBtn
|
// Place the button below the downloadBtn
|
||||||
downloadBtn.parentNode.insertBefore(jsonBtn, downloadBtn.nextSibling);
|
downloadBtn.parentNode.insertBefore(jsonBtn, downloadBtn.nextSibling);
|
||||||
|
|
||||||
|
const zipBtn = document.createElement("button");
|
||||||
|
zipBtn.textContent = "Download Card ZIP";
|
||||||
|
zipBtn.style.marginTop = "0.5rem";
|
||||||
|
zipBtn.onclick = async () => {
|
||||||
|
const cardData = {
|
||||||
|
name: nameInput.value,
|
||||||
|
pack: packInput.value,
|
||||||
|
power: powerInput.value,
|
||||||
|
charm: charmInput.value,
|
||||||
|
wit: witInput.value,
|
||||||
|
flavor: flavorInput.value,
|
||||||
|
artist: artistInput.value,
|
||||||
|
frame: frameSelect.value
|
||||||
|
};
|
||||||
|
const safeName = (nameInput.value || "card").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const safePack = (packInput.value || "pack").replace(/[^a-z0-9_\-]/gi, "_");
|
||||||
|
const imgFileName = `kemoverse_${safePack}_${safeName}.webp`;
|
||||||
|
const jsonFileName = `kemoverse_${safePack}_${safeName}.json`;
|
||||||
|
|
||||||
|
// Create ZIP
|
||||||
|
const zip = new JSZip();
|
||||||
|
// Add image
|
||||||
|
const imgData = canvas.toDataURL("image/webp", 0.95).split(',')[1];
|
||||||
|
zip.file(imgFileName, imgData, {base64: true});
|
||||||
|
// Add JSON
|
||||||
|
zip.file(jsonFileName, JSON.stringify(cardData, null, 2));
|
||||||
|
|
||||||
|
// Generate and download
|
||||||
|
const content = await zip.generateAsync({type: "blob"});
|
||||||
|
const link = document.createElement("a");
|
||||||
|
link.href = URL.createObjectURL(content);
|
||||||
|
link.download = `kemoverse_${safePack}_${safeName}.zip`;
|
||||||
|
link.click();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Place the button below the downloadBtn
|
||||||
|
downloadBtn.parentNode.insertBefore(zipBtn, downloadBtn.nextSibling);
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
Loading…
Add table
Reference in a new issue