astro-ghostcms/.pnpm-store/v3/files/49/6245b897259eb2c18a63f679aee...

114 lines
3.4 KiB
Plaintext

import { createUTF16EmojiRegexItem, createOptionalEmojiRegexItem, createSequenceEmojiRegexItem, createSetEmojiRegexItem } from './base.mjs';
import { splitEmojiSequences } from '../cleanup.mjs';
import { convertEmojiSequenceToUTF32 } from '../convert.mjs';
import { createRegexForNumbersSequence } from './numbers.mjs';
import { joinerEmoji } from '../data.mjs';
import { mergeSimilarItemsInSet } from './similar.mjs';
function createEmojisTree(sequences) {
const root = [];
for (let i = 0; i < sequences.length; i++) {
const split = splitEmojiSequences(
convertEmojiSequenceToUTF32(sequences[i])
);
let parent = root;
for (let j = 0; j < split.length; j++) {
const regex = createRegexForNumbersSequence(split[j]);
let item;
const match = parent.find(
(item2) => item2.regex.regex === regex.regex
);
if (!match) {
item = {
regex
};
parent.push(item);
} else {
item = match;
}
if (j === split.length - 1) {
item.end = true;
break;
}
parent = item.children || (item.children = []);
}
}
return root;
}
function parseEmojiTree(items) {
function mergeParsedChildren(items2) {
const parsedItems = [];
const mapWithoutEnd = /* @__PURE__ */ Object.create(null);
const mapWithEnd = /* @__PURE__ */ Object.create(null);
for (let i = 0; i < items2.length; i++) {
const item = items2[i];
const children = item.children;
if (children) {
const fullItem = item;
const target = item.end ? mapWithEnd : mapWithoutEnd;
const regex = children.regex;
if (!target[regex]) {
target[regex] = [fullItem];
} else {
target[regex].push(fullItem);
}
} else {
parsedItems.push(item.regex);
}
}
[mapWithEnd, mapWithoutEnd].forEach((source) => {
for (const regex in source) {
const items3 = source[regex];
const firstItem = items3[0];
let childSequence = [
createUTF16EmojiRegexItem([joinerEmoji]),
firstItem.children
];
if (firstItem.end) {
childSequence = [
createOptionalEmojiRegexItem(
createSequenceEmojiRegexItem(childSequence)
)
];
}
let mergedRegex;
if (items3.length === 1) {
mergedRegex = firstItem.regex;
} else {
mergedRegex = mergeSimilarItemsInSet(
createSetEmojiRegexItem(items3.map((item) => item.regex))
);
}
const sequence = createSequenceEmojiRegexItem([
mergedRegex,
...childSequence
]);
parsedItems.push(sequence);
}
});
if (parsedItems.length === 1) {
return parsedItems[0];
}
const set = createSetEmojiRegexItem(parsedItems);
const result = mergeSimilarItemsInSet(set);
return result;
}
function parseItemChildren(item) {
const result = {
regex: item.regex,
end: !!item.end
};
const children = item.children;
if (!children) {
return result;
}
const parsedChildren = children.map(parseItemChildren);
result.children = mergeParsedChildren(parsedChildren);
return result;
}
const parsed = items.map(parseItemChildren);
return mergeParsedChildren(parsed);
}
export { createEmojisTree, parseEmojiTree };