missing.mjs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { getUnqualifiedEmojiSequence } from '../cleanup.mjs';
  2. import { emojiComponents } from '../data.mjs';
  3. import { getEmojiSequenceKeyword } from '../format.mjs';
  4. import { replaceEmojiComponentsInCombinedSequence } from './components.mjs';
  5. import '../convert.mjs';
  6. function findMissingEmojis(sequences, testDataTree) {
  7. const results = [];
  8. const existingItems = /* @__PURE__ */ Object.create(null);
  9. const copiedItems = /* @__PURE__ */ Object.create(null);
  10. sequences.forEach((item) => {
  11. const sequence = getUnqualifiedEmojiSequence(item.sequence);
  12. const key = getEmojiSequenceKeyword(sequence);
  13. if (!existingItems[key] || // If multiple matches for same sequence exist, use longest version
  14. existingItems[key].sequence.length < item.sequence.length) {
  15. existingItems[key] = item;
  16. }
  17. });
  18. const iterate = (type, parentTree, parentValues, parentItem, deep) => {
  19. const childTree = parentTree.children?.[type];
  20. if (!childTree) {
  21. return;
  22. }
  23. const range = emojiComponents[type];
  24. for (let number = range[0]; number < range[1]; number++) {
  25. const values = {
  26. "hair-style": [...parentValues["hair-style"]],
  27. "skin-tone": [...parentValues["skin-tone"]]
  28. };
  29. values[type].push(number);
  30. const sequence = replaceEmojiComponentsInCombinedSequence(
  31. childTree.item.sequence,
  32. values
  33. );
  34. const key = getEmojiSequenceKeyword(
  35. getUnqualifiedEmojiSequence(sequence)
  36. );
  37. const oldItem = existingItems[key];
  38. let item;
  39. if (oldItem) {
  40. item = oldItem;
  41. } else {
  42. item = copiedItems[key];
  43. if (!item) {
  44. item = {
  45. ...parentItem,
  46. sequence
  47. };
  48. if (item.sequenceKey) {
  49. item.sequenceKey = key;
  50. }
  51. copiedItems[key] = item;
  52. results.push(item);
  53. }
  54. }
  55. if (deep || oldItem) {
  56. for (const key2 in values) {
  57. iterate(
  58. key2,
  59. childTree,
  60. values,
  61. item,
  62. deep
  63. );
  64. }
  65. }
  66. }
  67. };
  68. const parse = (key, deep) => {
  69. const treeItem = testDataTree[key];
  70. const sequenceKey = treeItem.item.sequenceKey;
  71. const rootItem = existingItems[sequenceKey];
  72. if (!rootItem) {
  73. return;
  74. }
  75. const values = {
  76. "skin-tone": [],
  77. "hair-style": []
  78. };
  79. for (const key2 in values) {
  80. iterate(
  81. key2,
  82. treeItem,
  83. values,
  84. rootItem,
  85. deep
  86. );
  87. }
  88. };
  89. for (const key in testDataTree) {
  90. parse(key, false);
  91. parse(key, true);
  92. }
  93. return results;
  94. }
  95. export { findMissingEmojis };