missing.cjs 2.7 KB

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