components.mjs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { emojiComponents } from '../data.mjs';
  2. import { getEmojiSequenceKeyword } from '../format.mjs';
  3. import '../convert.mjs';
  4. function mapEmojiTestDataComponents(testSequences) {
  5. const results = {
  6. converted: /* @__PURE__ */ new Map(),
  7. items: /* @__PURE__ */ new Map(),
  8. names: /* @__PURE__ */ new Map(),
  9. types: {},
  10. keywords: {}
  11. };
  12. for (const key in emojiComponents) {
  13. const type = key;
  14. const range = emojiComponents[type];
  15. for (let number = range[0]; number < range[1]; number++) {
  16. const keyword = getEmojiSequenceKeyword([number]);
  17. const item = testSequences[keyword];
  18. if (!item) {
  19. throw new Error(
  20. `Missing emoji component in test sequence: "${keyword}"`
  21. );
  22. }
  23. results.converted.set(number, keyword);
  24. results.items.set(number, item);
  25. results.items.set(keyword, item);
  26. const name = item.name;
  27. results.names.set(number, name);
  28. results.names.set(keyword, name);
  29. results.types[name] = type;
  30. results.keywords[name] = keyword;
  31. }
  32. }
  33. return results;
  34. }
  35. function emojiSequenceWithComponentsToString(sequence) {
  36. return sequence.map((item) => typeof item === "number" ? item.toString(16) : item).join("-");
  37. }
  38. function findEmojiComponentsInSequence(sequence) {
  39. const components = [];
  40. for (let index = 0; index < sequence.length; index++) {
  41. const code = sequence[index];
  42. for (const key in emojiComponents) {
  43. const type = key;
  44. const range = emojiComponents[type];
  45. if (code >= range[0] && code < range[1]) {
  46. components.push({
  47. index,
  48. type
  49. });
  50. break;
  51. }
  52. }
  53. }
  54. return components;
  55. }
  56. function replaceEmojiComponentsInCombinedSequence(sequence, values) {
  57. const indexes = {
  58. "hair-style": 0,
  59. "skin-tone": 0
  60. };
  61. return sequence.map((item) => {
  62. if (typeof item === "number") {
  63. return item;
  64. }
  65. const index = indexes[item]++;
  66. const list = values[item];
  67. if (!list || !list.length) {
  68. throw new Error(`Cannot replace ${item}: no valid values provided`);
  69. }
  70. return list[index >= list.length ? list.length - 1 : index];
  71. });
  72. }
  73. export { emojiSequenceWithComponentsToString, findEmojiComponentsInSequence, mapEmojiTestDataComponents, replaceEmojiComponentsInCombinedSequence };