diff --git a/src/element/textElement.test.ts b/src/element/textElement.test.ts index c61db05f..b849db01 100644 --- a/src/element/textElement.test.ts +++ b/src/element/textElement.test.ts @@ -12,6 +12,20 @@ describe("Test wrapText", () => { expect(res).toBe("Hello whats up "); }); + it("should work with emojis", () => { + const text = "πŸ˜€"; + const maxWidth = 1; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("πŸ˜€"); + }); + + it("should show the text correctly when min width reached", () => { + const text = "HelloπŸ˜€"; + const maxWidth = 10; + const res = wrapText(text, font, maxWidth); + expect(res).toBe("H\ne\nl\nl\no\nπŸ˜€"); + }); + describe("When text doesn't contain new lines", () => { const text = "Hello whats up"; [ diff --git a/src/element/textElement.ts b/src/element/textElement.ts index 7f1b7e1d..7f44a9ed 100644 --- a/src/element/textElement.ts +++ b/src/element/textElement.ts @@ -359,96 +359,94 @@ export const wrapText = (text: string, font: FontString, maxWidth: number) => { // This means its newline so push it if (words.length === 1 && words[0] === "") { lines.push(words[0]); - } else { - let currentLine = ""; - let currentLineWidthTillNow = 0; + return; // continue + } + let currentLine = ""; + let currentLineWidthTillNow = 0; - let index = 0; - while (index < words.length) { - const currentWordWidth = getLineWidth(words[index], font); + let index = 0; + while (index < words.length) { + const currentWordWidth = getLineWidth(words[index], font); - // Start breaking longer words exceeding max width - if (currentWordWidth >= maxWidth) { - // push current line since the current word exceeds the max width - // so will be appended in next line + // Start breaking longer words exceeding max width + if (currentWordWidth >= maxWidth) { + // push current line since the current word exceeds the max width + // so will be appended in next line + push(currentLine); + currentLine = ""; + currentLineWidthTillNow = 0; + while (words[index].length > 0) { + const currentChar = String.fromCodePoint( + words[index].codePointAt(0)!, + ); + const width = charWidth.calculate(currentChar, font); + currentLineWidthTillNow += width; + words[index] = words[index].slice(currentChar.length); + + if (currentLineWidthTillNow >= maxWidth) { + // only remove last trailing space which we have added when joining words + if (currentLine.slice(-1) === " ") { + currentLine = currentLine.slice(0, -1); + } + push(currentLine); + currentLine = currentChar; + currentLineWidthTillNow = width; + } else { + currentLine += currentChar; + } + } + // push current line if appending space exceeds max width + if (currentLineWidthTillNow + spaceWidth >= maxWidth) { push(currentLine); currentLine = ""; currentLineWidthTillNow = 0; - while (words[index].length > 0) { - const currentChar = words[index][0]; - const width = charWidth.calculate(currentChar, font); - currentLineWidthTillNow += width; - words[index] = words[index].slice(1); - - if (currentLineWidthTillNow >= maxWidth) { - // only remove last trailing space which we have added when joining words - if (currentLine.slice(-1) === " ") { - currentLine = currentLine.slice(0, -1); - } - push(currentLine); - currentLine = currentChar; - currentLineWidthTillNow = width; - if (currentLineWidthTillNow === maxWidth) { - currentLine = ""; - currentLineWidthTillNow = 0; - } - } else { - currentLine += currentChar; - } - } - // push current line if appending space exceeds max width - if (currentLineWidthTillNow + spaceWidth >= maxWidth) { - push(currentLine); - currentLine = ""; - currentLineWidthTillNow = 0; - } else { - // space needs to be appended before next word - // as currentLine contains chars which couldn't be appended - // to previous line - currentLine += " "; - currentLineWidthTillNow += spaceWidth; - } - - index++; } else { - // Start appending words in a line till max width reached - while (currentLineWidthTillNow < maxWidth && index < words.length) { - const word = words[index]; - currentLineWidthTillNow = getLineWidth(currentLine + word, font); + // space needs to be appended before next word + // as currentLine contains chars which couldn't be appended + // to previous line + currentLine += " "; + currentLineWidthTillNow += spaceWidth; + } - if (currentLineWidthTillNow >= maxWidth) { - push(currentLine); - currentLineWidthTillNow = 0; - currentLine = ""; + index++; + } else { + // Start appending words in a line till max width reached + while (currentLineWidthTillNow < maxWidth && index < words.length) { + const word = words[index]; + currentLineWidthTillNow = getLineWidth(currentLine + word, font); - break; - } - index++; - currentLine += `${word} `; + if (currentLineWidthTillNow >= maxWidth) { + push(currentLine); + currentLineWidthTillNow = 0; + currentLine = ""; - // Push the word if appending space exceeds max width - if (currentLineWidthTillNow + spaceWidth >= maxWidth) { - const word = currentLine.slice(0, -1); - push(word); - currentLine = ""; - currentLineWidthTillNow = 0; - break; - } + break; } - if (currentLineWidthTillNow === maxWidth) { + index++; + currentLine += `${word} `; + + // Push the word if appending space exceeds max width + if (currentLineWidthTillNow + spaceWidth >= maxWidth) { + const word = currentLine.slice(0, -1); + push(word); currentLine = ""; currentLineWidthTillNow = 0; + break; } } - } - if (currentLine) { - // only remove last trailing space which we have added when joining words - if (currentLine.slice(-1) === " ") { - currentLine = currentLine.slice(0, -1); + if (currentLineWidthTillNow === maxWidth) { + currentLine = ""; + currentLineWidthTillNow = 0; } - push(currentLine); } } + if (currentLine) { + // only remove last trailing space which we have added when joining words + if (currentLine.slice(-1) === " ") { + currentLine = currentLine.slice(0, -1); + } + push(currentLine); + } }); return lines.join("\n"); };