Files
infocom-systems-design/node_modules/@iconify/utils/lib/emoji/test/missing.js
2025-10-03 22:27:28 +03:00

70 lines
2.3 KiB
JavaScript

import { emojiComponents } from "../data.js";
import { getUnqualifiedEmojiSequence } from "../cleanup.js";
import { getEmojiSequenceKeyword } from "../format.js";
import { replaceEmojiComponentsInCombinedSequence } from "./components.js";
/**
* Find missing emojis
*
* Result includes missing items, which are extended from items that needs to
* be copied. To identify which emojis to copy, source object should include
* something like `iconName` key that points to icon sequence represents.
*/
function findMissingEmojis(sequences, testDataTree) {
const results = [];
const existingItems = Object.create(null);
const copiedItems = Object.create(null);
sequences.forEach((item) => {
const sequence = getUnqualifiedEmojiSequence(item.sequence);
const key = getEmojiSequenceKeyword(sequence);
if (!existingItems[key] || existingItems[key].sequence.length < item.sequence.length) existingItems[key] = item;
});
const iterate = (type, parentTree, parentValues, parentItem, deep) => {
const childTree = parentTree.children?.[type];
if (!childTree) return;
const range = emojiComponents[type];
for (let number = range[0]; number < range[1]; number++) {
const values = {
"hair-style": [...parentValues["hair-style"]],
"skin-tone": [...parentValues["skin-tone"]]
};
values[type].push(number);
const sequence = replaceEmojiComponentsInCombinedSequence(childTree.item.sequence, values);
const key = getEmojiSequenceKeyword(getUnqualifiedEmojiSequence(sequence));
const oldItem = existingItems[key];
let item;
if (oldItem) item = oldItem;
else {
item = copiedItems[key];
if (!item) {
item = {
...parentItem,
sequence
};
if (item.sequenceKey) item.sequenceKey = key;
copiedItems[key] = item;
results.push(item);
}
}
if (deep || oldItem) for (const key$1 in values) iterate(key$1, childTree, values, item, deep);
}
};
const parse = (key, deep) => {
const treeItem = testDataTree[key];
const sequenceKey = treeItem.item.sequenceKey;
const rootItem = existingItems[sequenceKey];
if (!rootItem) return;
const values = {
"skin-tone": [],
"hair-style": []
};
for (const key$1 in values) iterate(key$1, treeItem, values, rootItem, deep);
};
for (const key in testDataTree) {
parse(key, false);
parse(key, true);
}
return results;
}
export { findMissingEmojis };