variations.mjs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import { splitEmojiSequences, joinEmojiSequences, getUnqualifiedEmojiSequence } from '../cleanup.mjs';
  2. import { convertEmojiSequenceToUTF32 } from '../convert.mjs';
  3. import { vs16Emoji, keycapEmoji, emojiComponents } from '../data.mjs';
  4. import { getEmojiSequenceKeyword } from '../format.mjs';
  5. function guessQualifiedEmojiSequence(sequence) {
  6. const split = splitEmojiSequences(sequence).map((part) => {
  7. if (part.indexOf(vs16Emoji) !== -1) {
  8. return part;
  9. }
  10. if (part.length === 2) {
  11. const lastNum = part[1];
  12. if (lastNum === keycapEmoji) {
  13. return [part[0], vs16Emoji, lastNum];
  14. }
  15. for (const key in emojiComponents) {
  16. const range = emojiComponents[key];
  17. if (lastNum >= range[0] && lastNum < range[1]) {
  18. return [part[0], vs16Emoji, lastNum];
  19. }
  20. }
  21. }
  22. return part.length === 1 ? [part[0], vs16Emoji] : part;
  23. });
  24. return joinEmojiSequences(split);
  25. }
  26. function getQualifiedEmojiVariation(item) {
  27. const unqualifiedSequence = getUnqualifiedEmojiSequence(
  28. convertEmojiSequenceToUTF32(item.sequence)
  29. );
  30. const result = {
  31. ...item,
  32. sequence: guessQualifiedEmojiSequence(unqualifiedSequence)
  33. };
  34. if (result.sequenceKey) {
  35. result.sequenceKey = getEmojiSequenceKeyword(unqualifiedSequence);
  36. }
  37. return result;
  38. }
  39. function getQualifiedEmojiVariations(items) {
  40. const results = /* @__PURE__ */ Object.create(null);
  41. for (let i = 0; i < items.length; i++) {
  42. const result = getQualifiedEmojiVariation(items[i]);
  43. const key = getEmojiSequenceKeyword(
  44. getUnqualifiedEmojiSequence(result.sequence)
  45. );
  46. if (!results[key] || results[key].sequence.length < result.sequence.length) {
  47. results[key] = result;
  48. }
  49. }
  50. return Object.values(results);
  51. }
  52. export { getQualifiedEmojiVariation, getQualifiedEmojiVariations, guessQualifiedEmojiSequence };