@udecode/plate-emoji
Version:
Emoji plugin for Plate
1 lines • 20.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/lib/BaseEmojiPlugin.ts","../src/lib/types.ts","../src/lib/constants.ts","../src/lib/transforms/insertEmoji.ts","../src/lib/utils/EmojiLibrary/EmojiInlineLibrary.ts","../src/lib/utils/Grid/Grid.ts","../src/lib/utils/Grid/GridSection.ts","../src/lib/utils/IndexSearch/IndexSearch.ts","../src/lib/utils/IndexSearch/EmojiFloatingIndexSearch.ts","../src/lib/utils/IndexSearch/EmojiInlineIndexSearch.ts"],"sourcesContent":["import type { Emoji, EmojiMartData } from '@emoji-mart/data';\n\nimport {\n type Descendant,\n type PluginConfig,\n createSlatePlugin,\n createTSlatePlugin,\n} from '@udecode/plate';\nimport {\n type TriggerComboboxPluginOptions,\n withTriggerCombobox,\n} from '@udecode/plate-combobox';\n\nimport { DEFAULT_EMOJI_LIBRARY } from './constants';\n\nexport type EmojiInputConfig = PluginConfig<\n 'emoji',\n {\n /**\n * The emoji data.\n *\n * @example\n * import emojiMartData from '@emoji-mart/data';\n */\n data?: EmojiMartData;\n createEmojiNode?: (emoji: Emoji) => Descendant;\n } & TriggerComboboxPluginOptions\n>;\n\nexport const BaseEmojiInputPlugin = createSlatePlugin({\n key: 'emoji_input',\n node: { isElement: true, isInline: true, isVoid: true },\n});\n\nexport const BaseEmojiPlugin = createTSlatePlugin<EmojiInputConfig>({\n key: 'emoji',\n options: {\n data: DEFAULT_EMOJI_LIBRARY,\n trigger: ':',\n triggerPreviousCharPattern: /^\\s?$/,\n createComboboxInput: () => ({\n children: [{ text: '' }],\n type: BaseEmojiInputPlugin.key,\n }),\n createEmojiNode: ({ skins }) => ({ text: skins[0].native }),\n },\n plugins: [BaseEmojiInputPlugin],\n}).overrideEditor(withTriggerCombobox);\n","export type EmojiSettingsType = {\n buttonSize: {\n value: number;\n };\n categories: {\n value?: EmojiCategoryList[];\n };\n perLine: {\n value: number;\n };\n showFrequent: {\n value: boolean;\n key?: string;\n limit?: number;\n prefix?: string;\n };\n};\n\ntype ReverseMap<T> = T[keyof T];\n\nexport const EmojiCategory = {\n Activity: 'activity',\n Custom: 'custom',\n Flags: 'flags',\n Foods: 'foods',\n Frequent: 'frequent',\n Nature: 'nature',\n Objects: 'objects',\n People: 'people',\n Places: 'places',\n Symbols: 'symbols',\n} as const;\n\nexport type EmojiCategoryList = ReverseMap<typeof EmojiCategory>;\n\nexport type EmojiIconList<T = string> = {\n categories: Record<EmojiCategoryList, { outline: T; solid: T }>;\n search: {\n delete: T;\n loupe: T;\n };\n};\n\nexport type FrequentEmojis = Record<string, number>;\n\nexport type i18nProps = {\n categories: Record<EmojiCategoryList, string>;\n clear: string;\n pick: string;\n search: string;\n searchNoResultsSubtitle: string;\n searchNoResultsTitle: string;\n searchResult: string;\n skins: Record<'1' | '2' | '3' | '4' | '5' | '6' | 'choose', string>;\n};\n","import type { EmojiMartData } from '@emoji-mart/data';\n\nimport {\n type EmojiCategoryList,\n type EmojiSettingsType,\n type FrequentEmojis,\n type i18nProps,\n EmojiCategory,\n} from './types';\n\nexport const EMOJI_MAX_SEARCH_RESULT = 60;\n\nexport const DEFAULT_EMOJI_LIBRARY: EmojiMartData = {\n aliases: {},\n categories: [\n {\n id: 'people',\n emojis: ['+1'],\n },\n ],\n emojis: {\n '+1': {\n id: '+1',\n keywords: [],\n name: 'Thumbs Up',\n skins: [\n {\n native: '👍',\n unified: '1f44d',\n },\n {\n native: '👍🏻',\n unified: '1f44d-1f3fb',\n },\n {\n native: '👍🏼',\n unified: '1f44d-1f3fc',\n },\n {\n native: '👍🏽',\n unified: '1f44d-1f3fd',\n },\n {\n native: '👍🏾',\n unified: '1f44d-1f3fe',\n },\n {\n native: '👍🏿',\n unified: '1f44d-1f3ff',\n },\n ],\n version: 1,\n },\n },\n sheet: {\n cols: 1,\n rows: 1,\n },\n};\n\nexport const defaultCategories: EmojiCategoryList[] = [\n EmojiCategory.People,\n EmojiCategory.Nature,\n EmojiCategory.Foods,\n EmojiCategory.Activity,\n EmojiCategory.Places,\n EmojiCategory.Objects,\n EmojiCategory.Symbols,\n EmojiCategory.Flags,\n];\n\nexport const EmojiSettings: EmojiSettingsType = {\n buttonSize: {\n value: 36,\n },\n categories: {\n value: undefined,\n },\n perLine: {\n value: 8,\n },\n showFrequent: {\n limit: 16,\n value: true,\n },\n};\n\nexport const DEFAULT_FREQUENTLY_USED_EMOJI: FrequentEmojis = {\n '+1': 1,\n clap: 1,\n grinning: 1,\n heart: 1,\n heart_eyes: 1,\n hugging_face: 1,\n joy: 1,\n kissing_heart: 1,\n laughing: 1,\n pray: 1,\n rocket: 1,\n scream: 1,\n see_no_evil: 1,\n};\n\nexport const NUM_OF_CATEGORIES = Object.values(EmojiCategory).length;\n\nexport const i18n: i18nProps = {\n categories: {\n activity: 'Activity',\n custom: 'Custom',\n flags: 'Flags',\n foods: 'Food & Drink',\n frequent: 'Frequently used',\n nature: 'Animals & Nature',\n objects: 'Objects',\n people: 'Smileys & People',\n places: 'Travel & Places',\n symbols: 'Symbols',\n },\n clear: 'Clear',\n pick: 'Pick an emoji...',\n search: 'Search all emoji',\n searchNoResultsSubtitle: 'That emoji couldn’t be found',\n searchNoResultsTitle: 'Oh no!',\n searchResult: 'Search Results',\n skins: {\n '1': 'Default',\n '2': 'Light',\n '3': 'Medium-Light',\n '4': 'Medium',\n '5': 'Medium-Dark',\n '6': 'Dark',\n choose: 'Choose default skin tone',\n },\n};\n","import type { Emoji } from '@emoji-mart/data';\nimport type { SlateEditor } from '@udecode/plate';\n\nimport { BaseEmojiPlugin } from '../BaseEmojiPlugin';\n\nexport const insertEmoji = <TEmoji extends Emoji = Emoji>(\n editor: SlateEditor,\n emoji: TEmoji\n) => {\n const { createEmojiNode } = editor.getOptions(BaseEmojiPlugin);\n\n const emojiNode = createEmojiNode!(emoji);\n editor.tf.insertNodes(emojiNode);\n};\n","import type {\n Emoji,\n EmojiLibrary,\n Emojis,\n IEmojiLibrary,\n} from './EmojiLibrary.types';\n\nimport { DEFAULT_EMOJI_LIBRARY } from '../../constants';\n\nexport type THash = Record<string, string>;\n\nexport class EmojiInlineLibrary implements IEmojiLibrary {\n protected _emojis: Emojis;\n protected _hash: THash = {};\n protected _keys: string[] = [];\n\n constructor(library: EmojiLibrary = DEFAULT_EMOJI_LIBRARY) {\n this._emojis = library.emojis;\n this.init();\n }\n\n private createSearchableString(emoji: Emoji) {\n const { id, keywords, name } = emoji;\n\n return `${id},${this.getName(name)},${keywords.join(',')}`;\n }\n\n private getName(name: string) {\n return name.toLowerCase().split(' ').join(',');\n }\n\n private init() {\n Object.values(this._emojis).forEach((emoji) => {\n const searchableString = this.createSearchableString(emoji);\n this._keys.push(searchableString);\n this._hash[searchableString] = emoji.id;\n });\n }\n\n getEmoji(id: string) {\n return this._emojis[id];\n }\n\n getEmojiId(key: string) {\n return this._hash[key];\n }\n\n get keys(): string[] {\n return this._keys;\n }\n}\n","import type {\n GridElements,\n IGrid,\n IGridSection,\n SectionElements,\n SectionId,\n} from './Grid.types';\n\nexport class Grid<R, T extends SectionId = SectionId> implements IGrid<R, T> {\n protected grid = new Map<T, IGridSection<R, T>>();\n protected rowsCount = 1;\n protected sectionsIds: T[] = [];\n\n public addSection(\n sectionId: T,\n section: IGridSection<R, T>,\n elements: GridElements\n ) {\n section.setIndexRowStart(this.rowsCount).addElements(elements[sectionId]);\n this.rowsCount += section.rowsNum;\n this.grid.set(sectionId, section);\n this.sectionsIds.push(sectionId);\n\n return this;\n }\n\n public indexOf(sectionId: T) {\n return this.sectionsIds.indexOf(sectionId);\n }\n\n public section(sectionId: T) {\n return this.grid.get(sectionId)!;\n }\n\n public sections() {\n return Array.from(this.grid.values());\n }\n\n public updateSection(sectionId: T, elements: SectionElements) {\n if (this.grid.has(sectionId)) {\n const section = this.grid.get(sectionId);\n section!.updateElements(elements);\n }\n\n return this;\n }\n\n public get size() {\n return this.grid.size;\n }\n}\n","import type {\n GridRows,\n IGridSection,\n SectionElements,\n SectionId,\n Unknown,\n} from './Grid.types';\n\nexport abstract class AGridSection<R extends Unknown, T = SectionId>\n implements IGridSection<R, T>\n{\n protected _indexRowStart = 0;\n protected _root!: R;\n protected _rowsNum = 0;\n protected rows: GridRows = [];\n\n constructor(\n protected _id: T,\n protected perLine = 8\n ) {\n this.createRootRef();\n }\n\n private addRow(elements: SectionElements, lastPosition: number) {\n const start = lastPosition * this.perLine;\n const end = start + this.perLine;\n this.rows.push({\n id: this._indexRowStart + lastPosition,\n elements: elements.slice(start, end),\n });\n }\n\n private initRows(elements: SectionElements) {\n let i = 0;\n\n while (i < this.rowsNum) {\n this.addRow(elements, i++);\n }\n }\n\n protected abstract createRootRef(): void;\n\n public addElements(elements: SectionElements) {\n this._rowsNum = Math.ceil(elements.length / this.perLine);\n this.initRows(elements);\n\n return this;\n }\n\n getRows() {\n return this.rows;\n }\n\n public setIndexRowStart(start: number) {\n this._indexRowStart = start;\n\n return this;\n }\n\n public updateElements(elements: SectionElements) {\n this.rows = [];\n this.addElements(elements);\n\n return this;\n }\n\n get id() {\n return this._id;\n }\n\n get root(): R {\n return this._root;\n }\n\n get rowsNum() {\n return this._rowsNum;\n }\n}\n","import type { Emoji } from '@emoji-mart/data';\n\nimport type { IEmojiLibrary } from '../EmojiLibrary';\n\nimport { EMOJI_MAX_SEARCH_RESULT } from '../../constants';\n\ninterface IIndexSearch {\n get: () => Emoji[];\n hasFound: () => boolean;\n search: (input: string) => void;\n}\n\nexport abstract class AIndexSearch implements IIndexSearch {\n protected input: string | undefined;\n protected maxResult = EMOJI_MAX_SEARCH_RESULT;\n protected result: string[] = [];\n protected scores = {};\n\n protected constructor(protected library: IEmojiLibrary) {}\n\n private createSearchResult(value: string) {\n this.scores = {};\n this.result = [];\n\n for (const key of this.library!.keys) {\n const score = key.indexOf(`${value}`);\n\n if (score === -1) continue;\n\n const emojiId = this.library!.getEmojiId(key);\n this.result.push(emojiId);\n\n (this.scores as any)[emojiId] || ((this.scores as any)[emojiId] = 0);\n (this.scores as any)[emojiId] += emojiId === value ? 0 : score + 1;\n }\n }\n\n private sortResultByScores(result: string[], scores: {}) {\n result.sort((a, b) => {\n const aScore = (scores as any)[a];\n const bScore = (scores as any)[b];\n\n if (aScore === bScore) {\n return a.localeCompare(b);\n }\n\n return aScore - bScore;\n });\n }\n\n get() {\n const emojis = [];\n\n for (const key of this.result) {\n const emoji = this.library?.getEmoji(key);\n emojis.push(emoji);\n\n if (emojis.length >= this.maxResult) break;\n }\n\n return emojis;\n }\n\n getEmoji(): Emoji | undefined {\n return this.get()[0];\n }\n\n hasFound(exact = false) {\n if (exact && this.input) {\n return this.result.includes(this.input);\n }\n\n return this.result.length > 0;\n }\n\n search(input: string): this {\n this.input = input.toLowerCase();\n const value = this.input;\n\n if (value) {\n this.createSearchResult(value);\n this.sortResultByScores(this.result, this.scores);\n } else {\n this.scores = {};\n this.result = [];\n }\n\n return this;\n }\n}\n","import type { IEmojiLibrary } from '../EmojiLibrary';\n\nimport { AIndexSearch } from './IndexSearch';\n\nexport class EmojiFloatingIndexSearch extends AIndexSearch {\n protected static instance?: EmojiFloatingIndexSearch;\n\n private constructor(protected library: IEmojiLibrary) {\n super(library);\n }\n\n public static getInstance(library: IEmojiLibrary) {\n if (!EmojiFloatingIndexSearch.instance) {\n EmojiFloatingIndexSearch.instance = new EmojiFloatingIndexSearch(library);\n }\n\n return EmojiFloatingIndexSearch.instance;\n }\n}\n","import type { EmojiMartData } from '@emoji-mart/data';\n\nimport type { IEmojiLibrary } from '../EmojiLibrary';\n\nimport { DEFAULT_EMOJI_LIBRARY } from '../../constants';\nimport { EmojiInlineLibrary } from '../EmojiLibrary/EmojiInlineLibrary';\nimport { AIndexSearch } from './IndexSearch';\n\nexport class EmojiInlineIndexSearch extends AIndexSearch {\n protected static instance?: EmojiInlineIndexSearch;\n\n private constructor(protected library: IEmojiLibrary) {\n super(library);\n }\n\n public static getInstance(data: EmojiMartData = DEFAULT_EMOJI_LIBRARY) {\n if (!EmojiInlineIndexSearch.instance) {\n EmojiInlineIndexSearch.instance = new EmojiInlineIndexSearch(\n new EmojiInlineLibrary(data)\n );\n }\n\n return EmojiInlineIndexSearch.instance;\n }\n}\n"],"mappings":"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","names":[]}