fix meme manager text overflowing

This commit is contained in:
2026-05-21 15:53:53 +02:00
parent 948e6461fd
commit 72b8140f77

View File

@@ -21,6 +21,59 @@
const memeFont = 'Impact, Charcoal, sans-serif'; const memeFont = 'Impact, Charcoal, sans-serif';
function wrapText(ctx, text, maxWidth) {
const paragraphs = text.split('\n');
const lines = [];
paragraphs.forEach(paragraph => {
if (paragraph.trim() === '') {
lines.push('');
return;
}
const words = paragraph.split(' ').filter(w => w !== '');
let currentLine = '';
words.forEach(word => {
const testLine = currentLine ? currentLine + ' ' + word : word;
let metrics = ctx.measureText(testLine);
if (metrics.width <= maxWidth) {
currentLine = testLine;
} else {
if (currentLine !== '') {
lines.push(currentLine);
currentLine = '';
}
metrics = ctx.measureText(word);
if (metrics.width <= maxWidth) {
currentLine = word;
} else {
let charLine = '';
for (let i = 0; i < word.length; i++) {
const char = word[i];
const testCharLine = charLine + char;
if (ctx.measureText(testCharLine).width > maxWidth && charLine !== '') {
lines.push(charLine);
charLine = char;
} else {
charLine = testCharLine;
}
}
currentLine = charLine;
}
}
});
if (currentLine) {
lines.push(currentLine);
}
});
return lines;
}
// Image Setup // Image Setup
img.crossOrigin = "anonymous"; img.crossOrigin = "anonymous";
img.onload = () => { img.onload = () => {
@@ -127,7 +180,7 @@
ctx.font = `bold ${fontSize}px ${memeFont}`; ctx.font = `bold ${fontSize}px ${memeFont}`;
let displayStr = layer.text.toUpperCase(); let displayStr = layer.text.toUpperCase();
const lines = displayStr.split('\n'); const lines = wrapText(ctx, displayStr, canvas.width * 0.9);
const h = lines.length * fontSize * 1.1; const h = lines.length * fontSize * 1.1;
const w = canvas.width * 0.9; const w = canvas.width * 0.9;
@@ -173,7 +226,10 @@
const isInsideText = (pt, layer) => { const isInsideText = (pt, layer) => {
if (!layer.text) return false; if (!layer.text) return false;
const fontSize = layer.fontSize || 40; const fontSize = layer.fontSize || 40;
const lines = layer.text.split('\n'); ctx.save();
ctx.font = `bold ${fontSize}px ${memeFont}`;
const lines = wrapText(ctx, layer.text.toUpperCase(), canvas.width * 0.9);
ctx.restore();
const w = canvas.width * 0.95; const w = canvas.width * 0.95;
const h = lines.length * fontSize * 1.2; const h = lines.length * fontSize * 1.2;