tree.cjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. 'use strict';
  2. const emoji_data = require('../data.cjs');
  3. function mergeComponentTypes(value) {
  4. return "[" + value.join(",") + "]";
  5. }
  6. function mergeComponentsCount(value) {
  7. const keys = [];
  8. for (const key in emoji_data.emojiComponents) {
  9. const type = key;
  10. for (let i = 0; i < value[type]; i++) {
  11. keys.push(type);
  12. }
  13. }
  14. return keys.length ? mergeComponentTypes(keys) : "";
  15. }
  16. function getGroupItem(items, components) {
  17. const key = mergeComponentsCount(components);
  18. const item = items[key];
  19. if (item) {
  20. item.parsed = true;
  21. return item.item;
  22. }
  23. }
  24. function getEmojiTestDataTree(data) {
  25. const groups = /* @__PURE__ */ Object.create(null);
  26. for (const key in data) {
  27. const item = data[key];
  28. const text = item.name.key;
  29. const parent = groups[text] || (groups[text] = {});
  30. const components = {
  31. "hair-style": 0,
  32. "skin-tone": 0
  33. };
  34. item.sequence.forEach((value) => {
  35. if (typeof value !== "number") {
  36. components[value]++;
  37. }
  38. });
  39. const componentsKey = mergeComponentsCount(components);
  40. if (parent[componentsKey]) {
  41. throw new Error(`Duplicate components tree item for "${text}"`);
  42. }
  43. parent[componentsKey] = {
  44. item: {
  45. ...item,
  46. components,
  47. componentsKey
  48. }
  49. };
  50. }
  51. const results = /* @__PURE__ */ Object.create(null);
  52. for (const key in groups) {
  53. const items = groups[key];
  54. const check = (parent, parentComponents, type) => {
  55. const item = parse(parentComponents, [type]);
  56. if (item) {
  57. const children = parent.children || (parent.children = {});
  58. children[type] = item;
  59. return true;
  60. }
  61. };
  62. const parse = (parentComponents, newComponents) => {
  63. const components = {
  64. "hair-style": 0,
  65. "skin-tone": 0
  66. };
  67. const componentsList = parentComponents.concat(newComponents);
  68. componentsList.forEach((type) => {
  69. components[type]++;
  70. });
  71. let item = getGroupItem(items, components);
  72. if (!item && newComponents.length === 1 && newComponents[0] === "skin-tone") {
  73. const doubleComponents = {
  74. ...components
  75. };
  76. doubleComponents["skin-tone"]++;
  77. item = getGroupItem(items, doubleComponents);
  78. }
  79. if (item) {
  80. const result = {
  81. item
  82. };
  83. for (const key2 in emoji_data.emojiComponents) {
  84. check(result, componentsList, key2);
  85. }
  86. return result;
  87. }
  88. };
  89. const root = parse([], []);
  90. if (!root) {
  91. throw new Error(`Cannot find parent item for "${key}"`);
  92. }
  93. for (const itemsKey in items) {
  94. if (!items[itemsKey].parsed) {
  95. throw new Error(`Error generating tree for "${key}"`);
  96. }
  97. }
  98. if (root.children) {
  99. results[key] = root;
  100. }
  101. }
  102. return results;
  103. }
  104. exports.getEmojiTestDataTree = getEmojiTestDataTree;