@chayns-components/emoji-input 5.5.4 → 5.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,11 +3,30 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getElementTextLength = exports.convertTextToHTML = exports.convertHTMLToText = exports.cleanupEmptyIgnoreEmojiSpans = void 0;
6
+ exports.serializeHTMLToText = exports.getElementTextLength = exports.convertTextToHTML = exports.convertHTMLToText = exports.cleanupEmptyIgnoreEmojiSpans = void 0;
7
7
  var _regex = require("../constants/regex");
8
8
  var _emoji = require("./emoji");
9
9
  const BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);
10
10
  const BLOCK_SEPARATOR = '<br>';
11
+ const isMeaningfulTextNode = node => {
12
+ var _node$textContent;
13
+ return node.nodeType !== Node.TEXT_NODE || (((_node$textContent = node.textContent) === null || _node$textContent === void 0 ? void 0 : _node$textContent.length) ?? 0) > 0;
14
+ };
15
+ const isBreakElement = node => node.nodeType === Node.ELEMENT_NODE && node.tagName === 'BR';
16
+ const serializeBlockElementToText = element => {
17
+ const childNodes = Array.from(element.childNodes).filter(isMeaningfulTextNode);
18
+ if (childNodes.length === 0) {
19
+ return '';
20
+ }
21
+ if (childNodes.length === 1 && isBreakElement(childNodes[0])) {
22
+ return '';
23
+ }
24
+ let serializedText = serializeHTMLToText(childNodes);
25
+ if (childNodes.length > 1 && isBreakElement(childNodes[0]) && serializedText.startsWith(BLOCK_SEPARATOR)) {
26
+ serializedText = serializedText.slice(BLOCK_SEPARATOR.length);
27
+ }
28
+ return serializedText;
29
+ };
11
30
  const serializeHTMLNodeToText = node => {
12
31
  if (node.nodeType === Node.TEXT_NODE) {
13
32
  return node.textContent ?? '';
@@ -20,7 +39,7 @@ const serializeHTMLNodeToText = node => {
20
39
  return '<br>';
21
40
  }
22
41
  if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {
23
- return serializeHTMLToText(element.childNodes);
42
+ return serializeBlockElementToText(element);
24
43
  }
25
44
  return element.outerHTML;
26
45
  };
@@ -42,6 +61,7 @@ const serializeHTMLToText = nodes => {
42
61
  });
43
62
  return result;
44
63
  };
64
+ exports.serializeHTMLToText = serializeHTMLToText;
45
65
  const convertTextToHTML = text => {
46
66
  const element = document.createElement('div');
47
67
  element.style.position = 'absolute';
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":["_regex","require","_emoji","BLOCK_ELEMENT_TAG_NAMES","Set","BLOCK_SEPARATOR","serializeHTMLNodeToText","node","nodeType","Node","TEXT_NODE","textContent","ELEMENT_NODE","element","tagName","has","serializeHTMLToText","childNodes","outerHTML","nodes","serializedNodes","Array","from","result","didSerializeBlockElement","forEach","serializedNode","isBlockElement","convertTextToHTML","text","document","createElement","style","position","opacity","contentEditable","innerText","body","appendChild","innerHTML","removeChild","unescapeHTML","replace","HTML_A_TAG_REGEX","BB_LC_MENTION_REGEX","BB_NER_IGNORE_REGEX","BB_NER_REPLACE_REGEX","_","prefix","type","value","entity","prefixAttr","BB_IGNORE_EMOJI_REGEX","exports","convertHTMLToText","preserveSpaces","shouldSerializeNoEmojiToBBCode","HTML_BOLD_REGEX","HTML_LC_MENTION_REGEX","HTML_NER_IGNORE_REGEX","HTML_NER_REPLACE_REGEX","HTML_NO_EMOJI_REGEX","container","escapeHTML","getElementTextLength","textLength","length","e","cleanupEmptyIgnoreEmojiSpans","html"],"sources":["../../../src/utils/text.ts"],"sourcesContent":["import {\n BB_LC_MENTION_REGEX,\n BB_NER_IGNORE_REGEX,\n BB_NER_REPLACE_REGEX,\n BB_IGNORE_EMOJI_REGEX,\n HTML_A_TAG_REGEX,\n HTML_BOLD_REGEX,\n HTML_LC_MENTION_REGEX,\n HTML_NER_IGNORE_REGEX,\n HTML_NER_REPLACE_REGEX,\n HTML_NO_EMOJI_REGEX,\n} from '../constants/regex';\nimport { escapeHTML, unescapeHTML } from './emoji';\n\ninterface ConvertHTMLToTextOptions {\n preserveSpaces?: boolean;\n shouldSerializeNoEmojiToBBCode?: boolean;\n}\n\nconst BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);\nconst BLOCK_SEPARATOR = '<br>';\n\nconst serializeHTMLNodeToText = (node: ChildNode): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent ?? '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as HTMLElement;\n\n if (element.tagName === 'BR') {\n return '<br>';\n }\n\n if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {\n return serializeHTMLToText(element.childNodes);\n }\n\n return element.outerHTML;\n};\n\nconst serializeHTMLToText = (nodes: NodeListOf<ChildNode> | ChildNode[]) => {\n const serializedNodes = Array.from(nodes);\n\n let result = '';\n let didSerializeBlockElement = false;\n\n serializedNodes.forEach((node) => {\n const serializedNode = serializeHTMLNodeToText(node);\n\n const isBlockElement =\n node.nodeType === Node.ELEMENT_NODE &&\n BLOCK_ELEMENT_TAG_NAMES.has((node as HTMLElement).tagName);\n\n if (!serializedNode && !isBlockElement) {\n return;\n }\n\n if (result && (isBlockElement || didSerializeBlockElement)) {\n result += BLOCK_SEPARATOR;\n }\n\n result += serializedNode;\n didSerializeBlockElement = isBlockElement;\n });\n\n return result;\n};\n\nexport const convertTextToHTML = (text: string) => {\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerText = text;\n\n document.body.appendChild(element);\n\n let result = element.innerHTML;\n\n document.body.removeChild(element);\n\n result = unescapeHTML(result);\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(\n BB_LC_MENTION_REGEX,\n '<lc_mention contenteditable=\"false\" id=\"$1\"><span>@</span>$2</lc_mention>\\u200B',\n )\n .replace(BB_NER_IGNORE_REGEX, '<nerIgnore contenteditable=\"false\">$1</nerIgnore>')\n .replace(\n BB_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `<nerReplace contenteditable=\"false\" ${prefixAttr}type=\"${type}\" value=\"${value}\">${entity}</nerReplace>`;\n },\n )\n .replace(BB_IGNORE_EMOJI_REGEX, '<span class=\"no-emoji-convert\">$1</span>');\n\n return result;\n};\n\nexport const convertHTMLToText = (\n text: string,\n {\n preserveSpaces = false,\n shouldSerializeNoEmojiToBBCode = true,\n }: ConvertHTMLToTextOptions = {},\n) => {\n let result = text;\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(HTML_BOLD_REGEX, '[b]$1[/b]')\n .replace(HTML_LC_MENTION_REGEX, '[lc_mention id=\"$1\"]$2[/lc_mention]')\n .replace(HTML_NER_IGNORE_REGEX, '[nerIgnore]$1[/nerIgnore]')\n .replace(\n HTML_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `[nerReplace ${prefixAttr}type=\"${type}\" value=\"${value}\"]${entity}[/nerReplace]`;\n },\n )\n .replace(\n HTML_NO_EMOJI_REGEX,\n shouldSerializeNoEmojiToBBCode ? '[ignoreEmoji]$1[/ignoreEmoji]' : '$1',\n );\n\n const container = document.createElement('div');\n\n container.innerHTML = result;\n\n result = serializeHTMLToText(container.childNodes);\n\n if (preserveSpaces) {\n return result\n .replace(/&nbsp;/g, '\\u00A0') // non-breaking space\n .replace(/\\u200B/g, '\\u200B'); // zero-width space (sichtbar gemacht)\n }\n\n // eslint-disable-next-line no-irregular-whitespace\n result = result.replace(/\\u200B/g, '');\n result = escapeHTML(result);\n\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerHTML = result;\n\n document.body.appendChild(element);\n\n result = element.innerText;\n\n document.body.removeChild(element);\n\n return result;\n};\n\nexport const getElementTextLength = (element: Element) => {\n let textLength = 0;\n\n try {\n textLength = convertHTMLToText(element.outerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n } catch (e) {\n // Do nothing\n }\n\n return textLength;\n};\n\nexport const cleanupEmptyIgnoreEmojiSpans = (html: string) => {\n // Remove empty no-emoji-convert spans that have no text content\n return html.replace(/<span class=\"no-emoji-convert\"><\\/span>/g, '');\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"text.js","names":["_regex","require","_emoji","BLOCK_ELEMENT_TAG_NAMES","Set","BLOCK_SEPARATOR","isMeaningfulTextNode","node","_node$textContent","nodeType","Node","TEXT_NODE","textContent","length","isBreakElement","ELEMENT_NODE","tagName","serializeBlockElementToText","element","childNodes","Array","from","filter","serializedText","serializeHTMLToText","startsWith","slice","serializeHTMLNodeToText","has","outerHTML","nodes","serializedNodes","result","didSerializeBlockElement","forEach","serializedNode","isBlockElement","exports","convertTextToHTML","text","document","createElement","style","position","opacity","contentEditable","innerText","body","appendChild","innerHTML","removeChild","unescapeHTML","replace","HTML_A_TAG_REGEX","BB_LC_MENTION_REGEX","BB_NER_IGNORE_REGEX","BB_NER_REPLACE_REGEX","_","prefix","type","value","entity","prefixAttr","BB_IGNORE_EMOJI_REGEX","convertHTMLToText","preserveSpaces","shouldSerializeNoEmojiToBBCode","HTML_BOLD_REGEX","HTML_LC_MENTION_REGEX","HTML_NER_IGNORE_REGEX","HTML_NER_REPLACE_REGEX","HTML_NO_EMOJI_REGEX","container","escapeHTML","getElementTextLength","textLength","e","cleanupEmptyIgnoreEmojiSpans","html"],"sources":["../../../src/utils/text.ts"],"sourcesContent":["import {\n BB_LC_MENTION_REGEX,\n BB_NER_IGNORE_REGEX,\n BB_NER_REPLACE_REGEX,\n BB_IGNORE_EMOJI_REGEX,\n HTML_A_TAG_REGEX,\n HTML_BOLD_REGEX,\n HTML_LC_MENTION_REGEX,\n HTML_NER_IGNORE_REGEX,\n HTML_NER_REPLACE_REGEX,\n HTML_NO_EMOJI_REGEX,\n} from '../constants/regex';\nimport { escapeHTML, unescapeHTML } from './emoji';\n\ninterface ConvertHTMLToTextOptions {\n preserveSpaces?: boolean;\n shouldSerializeNoEmojiToBBCode?: boolean;\n}\n\nconst BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);\nconst BLOCK_SEPARATOR = '<br>';\n\nconst isMeaningfulTextNode = (node: ChildNode) =>\n node.nodeType !== Node.TEXT_NODE || (node.textContent?.length ?? 0) > 0;\n\nconst isBreakElement = (node: ChildNode) =>\n node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).tagName === 'BR';\n\nconst serializeBlockElementToText = (element: HTMLElement) => {\n const childNodes = Array.from(element.childNodes).filter(isMeaningfulTextNode);\n\n if (childNodes.length === 0) {\n return '';\n }\n\n if (childNodes.length === 1 && isBreakElement(childNodes[0]!)) {\n return '';\n }\n\n let serializedText = serializeHTMLToText(childNodes);\n\n if (\n childNodes.length > 1 &&\n isBreakElement(childNodes[0]!) &&\n serializedText.startsWith(BLOCK_SEPARATOR)\n ) {\n serializedText = serializedText.slice(BLOCK_SEPARATOR.length);\n }\n\n return serializedText;\n};\n\nconst serializeHTMLNodeToText = (node: ChildNode): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent ?? '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as HTMLElement;\n\n if (element.tagName === 'BR') {\n return '<br>';\n }\n\n if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {\n return serializeBlockElementToText(element);\n }\n\n return element.outerHTML;\n};\n\nexport const serializeHTMLToText = (nodes: NodeListOf<ChildNode> | ChildNode[]) => {\n const serializedNodes = Array.from(nodes);\n\n let result = '';\n let didSerializeBlockElement = false;\n\n serializedNodes.forEach((node) => {\n const serializedNode = serializeHTMLNodeToText(node);\n\n const isBlockElement =\n node.nodeType === Node.ELEMENT_NODE &&\n BLOCK_ELEMENT_TAG_NAMES.has((node as HTMLElement).tagName);\n\n if (!serializedNode && !isBlockElement) {\n return;\n }\n\n if (result && (isBlockElement || didSerializeBlockElement)) {\n result += BLOCK_SEPARATOR;\n }\n\n result += serializedNode;\n didSerializeBlockElement = isBlockElement;\n });\n\n return result;\n};\n\nexport const convertTextToHTML = (text: string) => {\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerText = text;\n\n document.body.appendChild(element);\n\n let result = element.innerHTML;\n\n document.body.removeChild(element);\n\n result = unescapeHTML(result);\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(\n BB_LC_MENTION_REGEX,\n '<lc_mention contenteditable=\"false\" id=\"$1\"><span>@</span>$2</lc_mention>\\u200B',\n )\n .replace(BB_NER_IGNORE_REGEX, '<nerIgnore contenteditable=\"false\">$1</nerIgnore>')\n .replace(\n BB_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `<nerReplace contenteditable=\"false\" ${prefixAttr}type=\"${type}\" value=\"${value}\">${entity}</nerReplace>`;\n },\n )\n .replace(BB_IGNORE_EMOJI_REGEX, '<span class=\"no-emoji-convert\">$1</span>');\n\n return result;\n};\n\nexport const convertHTMLToText = (\n text: string,\n {\n preserveSpaces = false,\n shouldSerializeNoEmojiToBBCode = true,\n }: ConvertHTMLToTextOptions = {},\n) => {\n let result = text;\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(HTML_BOLD_REGEX, '[b]$1[/b]')\n .replace(HTML_LC_MENTION_REGEX, '[lc_mention id=\"$1\"]$2[/lc_mention]')\n .replace(HTML_NER_IGNORE_REGEX, '[nerIgnore]$1[/nerIgnore]')\n .replace(\n HTML_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `[nerReplace ${prefixAttr}type=\"${type}\" value=\"${value}\"]${entity}[/nerReplace]`;\n },\n )\n .replace(\n HTML_NO_EMOJI_REGEX,\n shouldSerializeNoEmojiToBBCode ? '[ignoreEmoji]$1[/ignoreEmoji]' : '$1',\n );\n\n const container = document.createElement('div');\n\n container.innerHTML = result;\n\n result = serializeHTMLToText(container.childNodes);\n\n if (preserveSpaces) {\n return result\n .replace(/&nbsp;/g, '\\u00A0') // non-breaking space\n .replace(/\\u200B/g, '\\u200B'); // zero-width space (sichtbar gemacht)\n }\n\n // eslint-disable-next-line no-irregular-whitespace\n result = result.replace(/\\u200B/g, '');\n result = escapeHTML(result);\n\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerHTML = result;\n\n document.body.appendChild(element);\n\n result = element.innerText;\n\n document.body.removeChild(element);\n\n return result;\n};\n\nexport const getElementTextLength = (element: Element) => {\n let textLength = 0;\n\n try {\n textLength = convertHTMLToText(element.outerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n } catch (e) {\n // Do nothing\n }\n\n return textLength;\n};\n\nexport const cleanupEmptyIgnoreEmojiSpans = (html: string) => {\n // Remove empty no-emoji-convert spans that have no text content\n return html.replace(/<span class=\"no-emoji-convert\"><\\/span>/g, '');\n};\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAYA,IAAAC,MAAA,GAAAD,OAAA;AAOA,MAAME,uBAAuB,GAAG,IAAIC,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACrD,MAAMC,eAAe,GAAG,MAAM;AAE9B,MAAMC,oBAAoB,GAAIC,IAAe;EAAA,IAAAC,iBAAA;EAAA,OACzCD,IAAI,CAACE,QAAQ,KAAKC,IAAI,CAACC,SAAS,IAAI,CAAC,EAAAH,iBAAA,GAAAD,IAAI,CAACK,WAAW,cAAAJ,iBAAA,uBAAhBA,iBAAA,CAAkBK,MAAM,KAAI,CAAC,IAAI,CAAC;AAAA;AAE3E,MAAMC,cAAc,GAAIP,IAAe,IACnCA,IAAI,CAACE,QAAQ,KAAKC,IAAI,CAACK,YAAY,IAAKR,IAAI,CAAiBS,OAAO,KAAK,IAAI;AAEjF,MAAMC,2BAA2B,GAAIC,OAAoB,IAAK;EAC1D,MAAMC,UAAU,GAAGC,KAAK,CAACC,IAAI,CAACH,OAAO,CAACC,UAAU,CAAC,CAACG,MAAM,CAAChB,oBAAoB,CAAC;EAE9E,IAAIa,UAAU,CAACN,MAAM,KAAK,CAAC,EAAE;IACzB,OAAO,EAAE;EACb;EAEA,IAAIM,UAAU,CAACN,MAAM,KAAK,CAAC,IAAIC,cAAc,CAACK,UAAU,CAAC,CAAC,CAAE,CAAC,EAAE;IAC3D,OAAO,EAAE;EACb;EAEA,IAAII,cAAc,GAAGC,mBAAmB,CAACL,UAAU,CAAC;EAEpD,IACIA,UAAU,CAACN,MAAM,GAAG,CAAC,IACrBC,cAAc,CAACK,UAAU,CAAC,CAAC,CAAE,CAAC,IAC9BI,cAAc,CAACE,UAAU,CAACpB,eAAe,CAAC,EAC5C;IACEkB,cAAc,GAAGA,cAAc,CAACG,KAAK,CAACrB,eAAe,CAACQ,MAAM,CAAC;EACjE;EAEA,OAAOU,cAAc;AACzB,CAAC;AAED,MAAMI,uBAAuB,GAAIpB,IAAe,IAAa;EACzD,IAAIA,IAAI,CAACE,QAAQ,KAAKC,IAAI,CAACC,SAAS,EAAE;IAClC,OAAOJ,IAAI,CAACK,WAAW,IAAI,EAAE;EACjC;EAEA,IAAIL,IAAI,CAACE,QAAQ,KAAKC,IAAI,CAACK,YAAY,EAAE;IACrC,OAAO,EAAE;EACb;EAEA,MAAMG,OAAO,GAAGX,IAAmB;EAEnC,IAAIW,OAAO,CAACF,OAAO,KAAK,IAAI,EAAE;IAC1B,OAAO,MAAM;EACjB;EAEA,IAAIb,uBAAuB,CAACyB,GAAG,CAACV,OAAO,CAACF,OAAO,CAAC,EAAE;IAC9C,OAAOC,2BAA2B,CAACC,OAAO,CAAC;EAC/C;EAEA,OAAOA,OAAO,CAACW,SAAS;AAC5B,CAAC;AAEM,MAAML,mBAAmB,GAAIM,KAA0C,IAAK;EAC/E,MAAMC,eAAe,GAAGX,KAAK,CAACC,IAAI,CAACS,KAAK,CAAC;EAEzC,IAAIE,MAAM,GAAG,EAAE;EACf,IAAIC,wBAAwB,GAAG,KAAK;EAEpCF,eAAe,CAACG,OAAO,CAAE3B,IAAI,IAAK;IAC9B,MAAM4B,cAAc,GAAGR,uBAAuB,CAACpB,IAAI,CAAC;IAEpD,MAAM6B,cAAc,GAChB7B,IAAI,CAACE,QAAQ,KAAKC,IAAI,CAACK,YAAY,IACnCZ,uBAAuB,CAACyB,GAAG,CAAErB,IAAI,CAAiBS,OAAO,CAAC;IAE9D,IAAI,CAACmB,cAAc,IAAI,CAACC,cAAc,EAAE;MACpC;IACJ;IAEA,IAAIJ,MAAM,KAAKI,cAAc,IAAIH,wBAAwB,CAAC,EAAE;MACxDD,MAAM,IAAI3B,eAAe;IAC7B;IAEA2B,MAAM,IAAIG,cAAc;IACxBF,wBAAwB,GAAGG,cAAc;EAC7C,CAAC,CAAC;EAEF,OAAOJ,MAAM;AACjB,CAAC;AAACK,OAAA,CAAAb,mBAAA,GAAAA,mBAAA;AAEK,MAAMc,iBAAiB,GAAIC,IAAY,IAAK;EAC/C,MAAMrB,OAAO,GAAGsB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;EAE7CvB,OAAO,CAACwB,KAAK,CAACC,QAAQ,GAAG,UAAU;EACnCzB,OAAO,CAACwB,KAAK,CAACE,OAAO,GAAG,GAAG;EAE3B1B,OAAO,CAAC2B,eAAe,GAAG,MAAM;EAChC3B,OAAO,CAAC4B,SAAS,GAAGP,IAAI;EAExBC,QAAQ,CAACO,IAAI,CAACC,WAAW,CAAC9B,OAAO,CAAC;EAElC,IAAIc,MAAM,GAAGd,OAAO,CAAC+B,SAAS;EAE9BT,QAAQ,CAACO,IAAI,CAACG,WAAW,CAAChC,OAAO,CAAC;EAElCc,MAAM,GAAG,IAAAmB,mBAAY,EAACnB,MAAM,CAAC;EAE7BA,MAAM,GAAGA,MAAM,CACVoB,OAAO,CAACC,uBAAgB,EAAE,IAAI,CAAC,CAC/BD,OAAO,CACJE,0BAAmB,EACnB,iFACJ,CAAC,CACAF,OAAO,CAACG,0BAAmB,EAAE,mDAAmD,CAAC,CACjFH,OAAO,CACJI,2BAAoB,EACpB,CAACC,CAAC,EAAEC,MAA0B,EAAEC,IAAY,EAAEC,KAAa,EAAEC,MAAc,KAAK;IAC5E,MAAMC,UAAU,GAAGJ,MAAM,GAAG,WAAWA,MAAM,IAAI,GAAG,EAAE;IAEtD,OAAO,uCAAuCI,UAAU,SAASH,IAAI,YAAYC,KAAK,KAAKC,MAAM,eAAe;EACpH,CACJ,CAAC,CACAT,OAAO,CAACW,4BAAqB,EAAE,0CAA0C,CAAC;EAE/E,OAAO/B,MAAM;AACjB,CAAC;AAACK,OAAA,CAAAC,iBAAA,GAAAA,iBAAA;AAEK,MAAM0B,iBAAiB,GAAGA,CAC7BzB,IAAY,EACZ;EACI0B,cAAc,GAAG,KAAK;EACtBC,8BAA8B,GAAG;AACX,CAAC,GAAG,CAAC,CAAC,KAC/B;EACD,IAAIlC,MAAM,GAAGO,IAAI;EAEjBP,MAAM,GAAGA,MAAM,CACVoB,OAAO,CAACC,uBAAgB,EAAE,IAAI,CAAC,CAC/BD,OAAO,CAACe,sBAAe,EAAE,WAAW,CAAC,CACrCf,OAAO,CAACgB,4BAAqB,EAAE,qCAAqC,CAAC,CACrEhB,OAAO,CAACiB,4BAAqB,EAAE,2BAA2B,CAAC,CAC3DjB,OAAO,CACJkB,6BAAsB,EACtB,CAACb,CAAC,EAAEC,MAA0B,EAAEC,IAAY,EAAEC,KAAa,EAAEC,MAAc,KAAK;IAC5E,MAAMC,UAAU,GAAGJ,MAAM,GAAG,WAAWA,MAAM,IAAI,GAAG,EAAE;IAEtD,OAAO,eAAeI,UAAU,SAASH,IAAI,YAAYC,KAAK,KAAKC,MAAM,eAAe;EAC5F,CACJ,CAAC,CACAT,OAAO,CACJmB,0BAAmB,EACnBL,8BAA8B,GAAG,+BAA+B,GAAG,IACvE,CAAC;EAEL,MAAMM,SAAS,GAAGhC,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;EAE/C+B,SAAS,CAACvB,SAAS,GAAGjB,MAAM;EAE5BA,MAAM,GAAGR,mBAAmB,CAACgD,SAAS,CAACrD,UAAU,CAAC;EAElD,IAAI8C,cAAc,EAAE;IAChB,OAAOjC,MAAM,CACRoB,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAAA,CAC7BA,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;EACvC;;EAEA;EACApB,MAAM,GAAGA,MAAM,CAACoB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;EACtCpB,MAAM,GAAG,IAAAyC,iBAAU,EAACzC,MAAM,CAAC;EAE3B,MAAMd,OAAO,GAAGsB,QAAQ,CAACC,aAAa,CAAC,KAAK,CAAC;EAE7CvB,OAAO,CAACwB,KAAK,CAACC,QAAQ,GAAG,UAAU;EACnCzB,OAAO,CAACwB,KAAK,CAACE,OAAO,GAAG,GAAG;EAE3B1B,OAAO,CAAC2B,eAAe,GAAG,MAAM;EAChC3B,OAAO,CAAC+B,SAAS,GAAGjB,MAAM;EAE1BQ,QAAQ,CAACO,IAAI,CAACC,WAAW,CAAC9B,OAAO,CAAC;EAElCc,MAAM,GAAGd,OAAO,CAAC4B,SAAS;EAE1BN,QAAQ,CAACO,IAAI,CAACG,WAAW,CAAChC,OAAO,CAAC;EAElC,OAAOc,MAAM;AACjB,CAAC;AAACK,OAAA,CAAA2B,iBAAA,GAAAA,iBAAA;AAEK,MAAMU,oBAAoB,GAAIxD,OAAgB,IAAK;EACtD,IAAIyD,UAAU,GAAG,CAAC;EAElB,IAAI;IACAA,UAAU,GAAGX,iBAAiB,CAAC9C,OAAO,CAACW,SAAS,EAAE;MAC9CqC,8BAA8B,EAAE;IACpC,CAAC,CAAC,CAACrD,MAAM;EACb,CAAC,CAAC,OAAO+D,CAAC,EAAE;IACR;EAAA;EAGJ,OAAOD,UAAU;AACrB,CAAC;AAACtC,OAAA,CAAAqC,oBAAA,GAAAA,oBAAA;AAEK,MAAMG,4BAA4B,GAAIC,IAAY,IAAK;EAC1D;EACA,OAAOA,IAAI,CAAC1B,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC;AACvE,CAAC;AAACf,OAAA,CAAAwC,4BAAA,GAAAA,4BAAA","ignoreList":[]}
@@ -2,6 +2,22 @@ import { BB_LC_MENTION_REGEX, BB_NER_IGNORE_REGEX, BB_NER_REPLACE_REGEX, BB_IGNO
2
2
  import { escapeHTML, unescapeHTML } from './emoji';
3
3
  const BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);
4
4
  const BLOCK_SEPARATOR = '<br>';
5
+ const isMeaningfulTextNode = node => node.nodeType !== Node.TEXT_NODE || (node.textContent?.length ?? 0) > 0;
6
+ const isBreakElement = node => node.nodeType === Node.ELEMENT_NODE && node.tagName === 'BR';
7
+ const serializeBlockElementToText = element => {
8
+ const childNodes = Array.from(element.childNodes).filter(isMeaningfulTextNode);
9
+ if (childNodes.length === 0) {
10
+ return '';
11
+ }
12
+ if (childNodes.length === 1 && isBreakElement(childNodes[0])) {
13
+ return '';
14
+ }
15
+ let serializedText = serializeHTMLToText(childNodes);
16
+ if (childNodes.length > 1 && isBreakElement(childNodes[0]) && serializedText.startsWith(BLOCK_SEPARATOR)) {
17
+ serializedText = serializedText.slice(BLOCK_SEPARATOR.length);
18
+ }
19
+ return serializedText;
20
+ };
5
21
  const serializeHTMLNodeToText = node => {
6
22
  if (node.nodeType === Node.TEXT_NODE) {
7
23
  return node.textContent ?? '';
@@ -14,11 +30,11 @@ const serializeHTMLNodeToText = node => {
14
30
  return '<br>';
15
31
  }
16
32
  if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {
17
- return serializeHTMLToText(element.childNodes);
33
+ return serializeBlockElementToText(element);
18
34
  }
19
35
  return element.outerHTML;
20
36
  };
21
- const serializeHTMLToText = nodes => {
37
+ export const serializeHTMLToText = nodes => {
22
38
  const serializedNodes = Array.from(nodes);
23
39
  let result = '';
24
40
  let didSerializeBlockElement = false;
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","names":["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","escapeHTML","unescapeHTML","BLOCK_ELEMENT_TAG_NAMES","Set","BLOCK_SEPARATOR","serializeHTMLNodeToText","node","nodeType","Node","TEXT_NODE","textContent","ELEMENT_NODE","element","tagName","has","serializeHTMLToText","childNodes","outerHTML","nodes","serializedNodes","Array","from","result","didSerializeBlockElement","forEach","serializedNode","isBlockElement","convertTextToHTML","text","document","createElement","style","position","opacity","contentEditable","innerText","body","appendChild","innerHTML","removeChild","replace","_","prefix","type","value","entity","prefixAttr","convertHTMLToText","preserveSpaces","shouldSerializeNoEmojiToBBCode","container","getElementTextLength","textLength","length","e","cleanupEmptyIgnoreEmojiSpans","html"],"sources":["../../../src/utils/text.ts"],"sourcesContent":["import {\n BB_LC_MENTION_REGEX,\n BB_NER_IGNORE_REGEX,\n BB_NER_REPLACE_REGEX,\n BB_IGNORE_EMOJI_REGEX,\n HTML_A_TAG_REGEX,\n HTML_BOLD_REGEX,\n HTML_LC_MENTION_REGEX,\n HTML_NER_IGNORE_REGEX,\n HTML_NER_REPLACE_REGEX,\n HTML_NO_EMOJI_REGEX,\n} from '../constants/regex';\nimport { escapeHTML, unescapeHTML } from './emoji';\n\ninterface ConvertHTMLToTextOptions {\n preserveSpaces?: boolean;\n shouldSerializeNoEmojiToBBCode?: boolean;\n}\n\nconst BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);\nconst BLOCK_SEPARATOR = '<br>';\n\nconst serializeHTMLNodeToText = (node: ChildNode): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent ?? '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as HTMLElement;\n\n if (element.tagName === 'BR') {\n return '<br>';\n }\n\n if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {\n return serializeHTMLToText(element.childNodes);\n }\n\n return element.outerHTML;\n};\n\nconst serializeHTMLToText = (nodes: NodeListOf<ChildNode> | ChildNode[]) => {\n const serializedNodes = Array.from(nodes);\n\n let result = '';\n let didSerializeBlockElement = false;\n\n serializedNodes.forEach((node) => {\n const serializedNode = serializeHTMLNodeToText(node);\n\n const isBlockElement =\n node.nodeType === Node.ELEMENT_NODE &&\n BLOCK_ELEMENT_TAG_NAMES.has((node as HTMLElement).tagName);\n\n if (!serializedNode && !isBlockElement) {\n return;\n }\n\n if (result && (isBlockElement || didSerializeBlockElement)) {\n result += BLOCK_SEPARATOR;\n }\n\n result += serializedNode;\n didSerializeBlockElement = isBlockElement;\n });\n\n return result;\n};\n\nexport const convertTextToHTML = (text: string) => {\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerText = text;\n\n document.body.appendChild(element);\n\n let result = element.innerHTML;\n\n document.body.removeChild(element);\n\n result = unescapeHTML(result);\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(\n BB_LC_MENTION_REGEX,\n '<lc_mention contenteditable=\"false\" id=\"$1\"><span>@</span>$2</lc_mention>\\u200B',\n )\n .replace(BB_NER_IGNORE_REGEX, '<nerIgnore contenteditable=\"false\">$1</nerIgnore>')\n .replace(\n BB_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `<nerReplace contenteditable=\"false\" ${prefixAttr}type=\"${type}\" value=\"${value}\">${entity}</nerReplace>`;\n },\n )\n .replace(BB_IGNORE_EMOJI_REGEX, '<span class=\"no-emoji-convert\">$1</span>');\n\n return result;\n};\n\nexport const convertHTMLToText = (\n text: string,\n {\n preserveSpaces = false,\n shouldSerializeNoEmojiToBBCode = true,\n }: ConvertHTMLToTextOptions = {},\n) => {\n let result = text;\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(HTML_BOLD_REGEX, '[b]$1[/b]')\n .replace(HTML_LC_MENTION_REGEX, '[lc_mention id=\"$1\"]$2[/lc_mention]')\n .replace(HTML_NER_IGNORE_REGEX, '[nerIgnore]$1[/nerIgnore]')\n .replace(\n HTML_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `[nerReplace ${prefixAttr}type=\"${type}\" value=\"${value}\"]${entity}[/nerReplace]`;\n },\n )\n .replace(\n HTML_NO_EMOJI_REGEX,\n shouldSerializeNoEmojiToBBCode ? '[ignoreEmoji]$1[/ignoreEmoji]' : '$1',\n );\n\n const container = document.createElement('div');\n\n container.innerHTML = result;\n\n result = serializeHTMLToText(container.childNodes);\n\n if (preserveSpaces) {\n return result\n .replace(/&nbsp;/g, '\\u00A0') // non-breaking space\n .replace(/\\u200B/g, '\\u200B'); // zero-width space (sichtbar gemacht)\n }\n\n // eslint-disable-next-line no-irregular-whitespace\n result = result.replace(/\\u200B/g, '');\n result = escapeHTML(result);\n\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerHTML = result;\n\n document.body.appendChild(element);\n\n result = element.innerText;\n\n document.body.removeChild(element);\n\n return result;\n};\n\nexport const getElementTextLength = (element: Element) => {\n let textLength = 0;\n\n try {\n textLength = convertHTMLToText(element.outerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n } catch (e) {\n // Do nothing\n }\n\n return textLength;\n};\n\nexport const cleanupEmptyIgnoreEmojiSpans = (html: string) => {\n // Remove empty no-emoji-convert spans that have no text content\n return html.replace(/<span class=\"no-emoji-convert\"><\\/span>/g, '');\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"text.js","names":["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","escapeHTML","unescapeHTML","BLOCK_ELEMENT_TAG_NAMES","Set","BLOCK_SEPARATOR","isMeaningfulTextNode","node","nodeType","Node","TEXT_NODE","textContent","length","isBreakElement","ELEMENT_NODE","tagName","serializeBlockElementToText","element","childNodes","Array","from","filter","serializedText","serializeHTMLToText","startsWith","slice","serializeHTMLNodeToText","has","outerHTML","nodes","serializedNodes","result","didSerializeBlockElement","forEach","serializedNode","isBlockElement","convertTextToHTML","text","document","createElement","style","position","opacity","contentEditable","innerText","body","appendChild","innerHTML","removeChild","replace","_","prefix","type","value","entity","prefixAttr","convertHTMLToText","preserveSpaces","shouldSerializeNoEmojiToBBCode","container","getElementTextLength","textLength","e","cleanupEmptyIgnoreEmojiSpans","html"],"sources":["../../../src/utils/text.ts"],"sourcesContent":["import {\n BB_LC_MENTION_REGEX,\n BB_NER_IGNORE_REGEX,\n BB_NER_REPLACE_REGEX,\n BB_IGNORE_EMOJI_REGEX,\n HTML_A_TAG_REGEX,\n HTML_BOLD_REGEX,\n HTML_LC_MENTION_REGEX,\n HTML_NER_IGNORE_REGEX,\n HTML_NER_REPLACE_REGEX,\n HTML_NO_EMOJI_REGEX,\n} from '../constants/regex';\nimport { escapeHTML, unescapeHTML } from './emoji';\n\ninterface ConvertHTMLToTextOptions {\n preserveSpaces?: boolean;\n shouldSerializeNoEmojiToBBCode?: boolean;\n}\n\nconst BLOCK_ELEMENT_TAG_NAMES = new Set(['DIV', 'P']);\nconst BLOCK_SEPARATOR = '<br>';\n\nconst isMeaningfulTextNode = (node: ChildNode) =>\n node.nodeType !== Node.TEXT_NODE || (node.textContent?.length ?? 0) > 0;\n\nconst isBreakElement = (node: ChildNode) =>\n node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).tagName === 'BR';\n\nconst serializeBlockElementToText = (element: HTMLElement) => {\n const childNodes = Array.from(element.childNodes).filter(isMeaningfulTextNode);\n\n if (childNodes.length === 0) {\n return '';\n }\n\n if (childNodes.length === 1 && isBreakElement(childNodes[0]!)) {\n return '';\n }\n\n let serializedText = serializeHTMLToText(childNodes);\n\n if (\n childNodes.length > 1 &&\n isBreakElement(childNodes[0]!) &&\n serializedText.startsWith(BLOCK_SEPARATOR)\n ) {\n serializedText = serializedText.slice(BLOCK_SEPARATOR.length);\n }\n\n return serializedText;\n};\n\nconst serializeHTMLNodeToText = (node: ChildNode): string => {\n if (node.nodeType === Node.TEXT_NODE) {\n return node.textContent ?? '';\n }\n\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const element = node as HTMLElement;\n\n if (element.tagName === 'BR') {\n return '<br>';\n }\n\n if (BLOCK_ELEMENT_TAG_NAMES.has(element.tagName)) {\n return serializeBlockElementToText(element);\n }\n\n return element.outerHTML;\n};\n\nexport const serializeHTMLToText = (nodes: NodeListOf<ChildNode> | ChildNode[]) => {\n const serializedNodes = Array.from(nodes);\n\n let result = '';\n let didSerializeBlockElement = false;\n\n serializedNodes.forEach((node) => {\n const serializedNode = serializeHTMLNodeToText(node);\n\n const isBlockElement =\n node.nodeType === Node.ELEMENT_NODE &&\n BLOCK_ELEMENT_TAG_NAMES.has((node as HTMLElement).tagName);\n\n if (!serializedNode && !isBlockElement) {\n return;\n }\n\n if (result && (isBlockElement || didSerializeBlockElement)) {\n result += BLOCK_SEPARATOR;\n }\n\n result += serializedNode;\n didSerializeBlockElement = isBlockElement;\n });\n\n return result;\n};\n\nexport const convertTextToHTML = (text: string) => {\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerText = text;\n\n document.body.appendChild(element);\n\n let result = element.innerHTML;\n\n document.body.removeChild(element);\n\n result = unescapeHTML(result);\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(\n BB_LC_MENTION_REGEX,\n '<lc_mention contenteditable=\"false\" id=\"$1\"><span>@</span>$2</lc_mention>\\u200B',\n )\n .replace(BB_NER_IGNORE_REGEX, '<nerIgnore contenteditable=\"false\">$1</nerIgnore>')\n .replace(\n BB_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `<nerReplace contenteditable=\"false\" ${prefixAttr}type=\"${type}\" value=\"${value}\">${entity}</nerReplace>`;\n },\n )\n .replace(BB_IGNORE_EMOJI_REGEX, '<span class=\"no-emoji-convert\">$1</span>');\n\n return result;\n};\n\nexport const convertHTMLToText = (\n text: string,\n {\n preserveSpaces = false,\n shouldSerializeNoEmojiToBBCode = true,\n }: ConvertHTMLToTextOptions = {},\n) => {\n let result = text;\n\n result = result\n .replace(HTML_A_TAG_REGEX, '$1')\n .replace(HTML_BOLD_REGEX, '[b]$1[/b]')\n .replace(HTML_LC_MENTION_REGEX, '[lc_mention id=\"$1\"]$2[/lc_mention]')\n .replace(HTML_NER_IGNORE_REGEX, '[nerIgnore]$1[/nerIgnore]')\n .replace(\n HTML_NER_REPLACE_REGEX,\n (_, prefix: string | undefined, type: string, value: string, entity: string) => {\n const prefixAttr = prefix ? `prefix=\"${prefix}\" ` : '';\n\n return `[nerReplace ${prefixAttr}type=\"${type}\" value=\"${value}\"]${entity}[/nerReplace]`;\n },\n )\n .replace(\n HTML_NO_EMOJI_REGEX,\n shouldSerializeNoEmojiToBBCode ? '[ignoreEmoji]$1[/ignoreEmoji]' : '$1',\n );\n\n const container = document.createElement('div');\n\n container.innerHTML = result;\n\n result = serializeHTMLToText(container.childNodes);\n\n if (preserveSpaces) {\n return result\n .replace(/&nbsp;/g, '\\u00A0') // non-breaking space\n .replace(/\\u200B/g, '\\u200B'); // zero-width space (sichtbar gemacht)\n }\n\n // eslint-disable-next-line no-irregular-whitespace\n result = result.replace(/\\u200B/g, '');\n result = escapeHTML(result);\n\n const element = document.createElement('div');\n\n element.style.position = 'absolute';\n element.style.opacity = '0';\n\n element.contentEditable = 'true';\n element.innerHTML = result;\n\n document.body.appendChild(element);\n\n result = element.innerText;\n\n document.body.removeChild(element);\n\n return result;\n};\n\nexport const getElementTextLength = (element: Element) => {\n let textLength = 0;\n\n try {\n textLength = convertHTMLToText(element.outerHTML, {\n shouldSerializeNoEmojiToBBCode: false,\n }).length;\n } catch (e) {\n // Do nothing\n }\n\n return textLength;\n};\n\nexport const cleanupEmptyIgnoreEmojiSpans = (html: string) => {\n // Remove empty no-emoji-convert spans that have no text content\n return html.replace(/<span class=\"no-emoji-convert\"><\\/span>/g, '');\n};\n"],"mappings":"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","ignoreList":[]}
@@ -2,6 +2,7 @@ interface ConvertHTMLToTextOptions {
2
2
  preserveSpaces?: boolean;
3
3
  shouldSerializeNoEmojiToBBCode?: boolean;
4
4
  }
5
+ export declare const serializeHTMLToText: (nodes: NodeListOf<ChildNode> | ChildNode[]) => string;
5
6
  export declare const convertTextToHTML: (text: string) => string;
6
7
  export declare const convertHTMLToText: (text: string, { preserveSpaces, shouldSerializeNoEmojiToBBCode, }?: ConvertHTMLToTextOptions) => string;
7
8
  export declare const getElementTextLength: (element: Element) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chayns-components/emoji-input",
3
- "version": "5.5.4",
3
+ "version": "5.5.5",
4
4
  "description": "Input field that supports HTML elements and emojis",
5
5
  "sideEffects": false,
6
6
  "browserslist": [
@@ -89,5 +89,5 @@
89
89
  "publishConfig": {
90
90
  "access": "public"
91
91
  },
92
- "gitHead": "f26cbe2bd3cf9e257c3e05953dc4dfebac710101"
92
+ "gitHead": "a2a718765460d24d97d87b5e2b17c6890d1038e1"
93
93
  }