| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- 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 };
|