tree.cjs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 'use strict';
  2. const emoji_regex_base = require('./base.cjs');
  3. const emoji_cleanup = require('../cleanup.cjs');
  4. const emoji_convert = require('../convert.cjs');
  5. const emoji_regex_numbers = require('./numbers.cjs');
  6. const emoji_data = require('../data.cjs');
  7. const emoji_regex_similar = require('./similar.cjs');
  8. function createEmojisTree(sequences) {
  9. const root = [];
  10. for (let i = 0; i < sequences.length; i++) {
  11. const split = emoji_cleanup.splitEmojiSequences(
  12. emoji_convert.convertEmojiSequenceToUTF32(sequences[i])
  13. );
  14. let parent = root;
  15. for (let j = 0; j < split.length; j++) {
  16. const regex = emoji_regex_numbers.createRegexForNumbersSequence(split[j]);
  17. let item;
  18. const match = parent.find(
  19. (item2) => item2.regex.regex === regex.regex
  20. );
  21. if (!match) {
  22. item = {
  23. regex
  24. };
  25. parent.push(item);
  26. } else {
  27. item = match;
  28. }
  29. if (j === split.length - 1) {
  30. item.end = true;
  31. break;
  32. }
  33. parent = item.children || (item.children = []);
  34. }
  35. }
  36. return root;
  37. }
  38. function parseEmojiTree(items) {
  39. function mergeParsedChildren(items2) {
  40. const parsedItems = [];
  41. const mapWithoutEnd = /* @__PURE__ */ Object.create(null);
  42. const mapWithEnd = /* @__PURE__ */ Object.create(null);
  43. for (let i = 0; i < items2.length; i++) {
  44. const item = items2[i];
  45. const children = item.children;
  46. if (children) {
  47. const fullItem = item;
  48. const target = item.end ? mapWithEnd : mapWithoutEnd;
  49. const regex = children.regex;
  50. if (!target[regex]) {
  51. target[regex] = [fullItem];
  52. } else {
  53. target[regex].push(fullItem);
  54. }
  55. } else {
  56. parsedItems.push(item.regex);
  57. }
  58. }
  59. [mapWithEnd, mapWithoutEnd].forEach((source) => {
  60. for (const regex in source) {
  61. const items3 = source[regex];
  62. const firstItem = items3[0];
  63. let childSequence = [
  64. emoji_regex_base.createUTF16EmojiRegexItem([emoji_data.joinerEmoji]),
  65. firstItem.children
  66. ];
  67. if (firstItem.end) {
  68. childSequence = [
  69. emoji_regex_base.createOptionalEmojiRegexItem(
  70. emoji_regex_base.createSequenceEmojiRegexItem(childSequence)
  71. )
  72. ];
  73. }
  74. let mergedRegex;
  75. if (items3.length === 1) {
  76. mergedRegex = firstItem.regex;
  77. } else {
  78. mergedRegex = emoji_regex_similar.mergeSimilarItemsInSet(
  79. emoji_regex_base.createSetEmojiRegexItem(items3.map((item) => item.regex))
  80. );
  81. }
  82. const sequence = emoji_regex_base.createSequenceEmojiRegexItem([
  83. mergedRegex,
  84. ...childSequence
  85. ]);
  86. parsedItems.push(sequence);
  87. }
  88. });
  89. if (parsedItems.length === 1) {
  90. return parsedItems[0];
  91. }
  92. const set = emoji_regex_base.createSetEmojiRegexItem(parsedItems);
  93. const result = emoji_regex_similar.mergeSimilarItemsInSet(set);
  94. return result;
  95. }
  96. function parseItemChildren(item) {
  97. const result = {
  98. regex: item.regex,
  99. end: !!item.end
  100. };
  101. const children = item.children;
  102. if (!children) {
  103. return result;
  104. }
  105. const parsedChildren = children.map(parseItemChildren);
  106. result.children = mergeParsedChildren(parsedChildren);
  107. return result;
  108. }
  109. const parsed = items.map(parseItemChildren);
  110. return mergeParsedChildren(parsed);
  111. }
  112. exports.createEmojisTree = createEmojisTree;
  113. exports.parseEmojiTree = parseEmojiTree;