Skip to content

Commit e24b82f

Browse files
fix(emoji): improve character splitting for Unicode and emoji support
1 parent cd6fafb commit e24b82f

File tree

1 file changed

+33
-23
lines changed

1 file changed

+33
-23
lines changed

src/index.js

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -349,30 +349,40 @@ export default class SplitText {
349349
}
350350
} else {
351351
// Regular handling for non-CJK text or when handleCJK is false
352-
const words = contents.split(splitOn);
353-
let i = 0,
354-
splitText;
355-
356-
const recursiveSupportNBSpaces = () => {
357-
if (key === 'char') return;
358-
let matched = false;
359-
const charAt = contents.charAt(contents.indexOf(splitText) + splitText.length);
360-
const space = NBSPACES.find((s) => s === charAt);
361-
if (space) {
362-
splitText = splitText.concat(space).concat(words[++i]);
363-
matched = true;
352+
if (key === 'char') {
353+
// Use Array.from to properly split Unicode characters including emojis
354+
const chars = Array.from(contents);
355+
chars.forEach((char) => {
356+
const splitEl = this.createElement(parentEl, key, char);
357+
elements.push(splitEl);
358+
allElements.push(splitEl);
359+
});
360+
} else {
361+
const words = contents.split(splitOn);
362+
let i = 0,
363+
splitText;
364+
365+
const recursiveSupportNBSpaces = () => {
366+
if (key === 'char') return;
367+
let matched = false;
368+
const charAt = contents.charAt(contents.indexOf(splitText) + splitText.length);
369+
const space = NBSPACES.find((s) => s === charAt);
370+
if (space) {
371+
splitText = splitText.concat(space).concat(words[++i]);
372+
matched = true;
373+
}
374+
contents = contents.substring(contents.indexOf(splitText));
375+
if (matched) return recursiveSupportNBSpaces();
376+
};
377+
378+
for (; i < words.length; i++) {
379+
splitText = words[i];
380+
if (i && preserveWhitespace) allElements.push(document.createTextNode(' '));
381+
recursiveSupportNBSpaces();
382+
const splitEl = this.createElement(parentEl, key, splitText);
383+
elements.push(splitEl);
384+
allElements.push(splitEl);
364385
}
365-
contents = contents.substring(contents.indexOf(splitText));
366-
if (matched) return recursiveSupportNBSpaces();
367-
};
368-
369-
for (; i < words.length; i++) {
370-
splitText = words[i];
371-
if (i && preserveWhitespace) allElements.push(document.createTextNode(' '));
372-
recursiveSupportNBSpaces();
373-
const splitEl = this.createElement(parentEl, key, splitText);
374-
elements.push(splitEl);
375-
allElements.push(splitEl);
376386
}
377387
}
378388

0 commit comments

Comments
 (0)