@chayns-components/emoji-input
Version:
Input field that supports HTML elements and emojis
61 lines (60 loc) • 3.05 kB
JavaScript
import { BB_LC_MENTION_REGEX, BB_NER_IGNORE_REGEX, BB_NER_REPLACE_REGEX, BB_IGNORE_EMOJI_REGEX, HTML_A_TAG_REGEX, HTML_BOLD_REGEX, HTML_LC_MENTION_REGEX, HTML_NER_IGNORE_REGEX, HTML_NER_REPLACE_REGEX, HTML_NO_EMOJI_REGEX } from '../constants/regex';
import { escapeHTML, unescapeHTML } from './emoji';
export const convertTextToHTML = text => {
const element = document.createElement('div');
element.style.position = 'absolute';
element.style.opacity = '0';
element.contentEditable = 'true';
element.innerText = text;
document.body.appendChild(element);
let result = element.innerHTML;
document.body.removeChild(element);
result = unescapeHTML(result);
result = result.replace(HTML_A_TAG_REGEX, '$1').replace(BB_LC_MENTION_REGEX, '<lc_mention contenteditable="false" id="$1"><span>@</span>$2</lc_mention>\u200B').replace(BB_NER_IGNORE_REGEX, '<nerIgnore contenteditable="false">$1</nerIgnore>').replace(BB_NER_REPLACE_REGEX, (_, prefix, type, value, entity) => {
const prefixAttr = prefix ? `prefix="${prefix}" ` : '';
return `<nerReplace contenteditable="false" ${prefixAttr}type="${type}" value="${value}">${entity}</nerReplace>`;
}).replace(BB_IGNORE_EMOJI_REGEX, '<span class="no-emoji-convert">$1</span>');
return result;
};
export const convertHTMLToText = (text, {
preserveSpaces = false,
shouldSerializeNoEmojiToBBCode = true
} = {}) => {
let result = text;
result = result.replace(HTML_A_TAG_REGEX, '$1').replace(HTML_BOLD_REGEX, '[b]$1[/b]').replace(HTML_LC_MENTION_REGEX, '[lc_mention id="$1"]$2[/lc_mention]').replace(HTML_NER_IGNORE_REGEX, '[nerIgnore]$1[/nerIgnore]').replace(HTML_NER_REPLACE_REGEX, (_, prefix, type, value, entity) => {
const prefixAttr = prefix ? `prefix="${prefix}" ` : '';
return `[nerReplace ${prefixAttr}type="${type}" value="${value}"]${entity}[/nerReplace]`;
}).replace(HTML_NO_EMOJI_REGEX, shouldSerializeNoEmojiToBBCode ? '[ignoreEmoji]$1[/ignoreEmoji]' : '$1');
if (preserveSpaces) {
return result.replace(/ /g, '\u00A0') // non-breaking space
.replace(/\u200B/g, '\u200B'); // zero-width space (sichtbar gemacht)
}
// eslint-disable-next-line no-irregular-whitespace
result = result.replace(/\u200B/g, '');
result = escapeHTML(result);
const element = document.createElement('div');
element.style.position = 'absolute';
element.style.opacity = '0';
element.contentEditable = 'true';
element.innerHTML = result;
document.body.appendChild(element);
result = element.innerText;
document.body.removeChild(element);
return result;
};
export const getElementTextLength = element => {
let textLength = 0;
try {
textLength = convertHTMLToText(element.outerHTML, {
shouldSerializeNoEmojiToBBCode: false
}).length;
} catch (e) {
// Do nothing
}
return textLength;
};
export const cleanupEmptyIgnoreEmojiSpans = html => {
// Remove empty no-emoji-convert spans that have no text content
return html.replace(/<span class="no-emoji-convert"><\/span>/g, '');
};
//# sourceMappingURL=text.js.map