@milkdown/plugin-emoji 6.5.2 → 6.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/constant.d.ts.map +1 -1
- package/lib/filter/helper.d.ts +2 -2
- package/lib/filter/helper.d.ts.map +1 -1
- package/lib/filter/index.d.ts +1 -1
- package/lib/filter/index.d.ts.map +1 -1
- package/lib/filter/style.d.ts +1 -1
- package/lib/filter/style.d.ts.map +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.es.js +158 -170
- package/lib/index.es.js.map +1 -1
- package/lib/node.d.ts +2 -2
- package/lib/node.d.ts.map +1 -1
- package/lib/parse.d.ts.map +1 -1
- package/lib/remark-twemoji.d.ts +1 -1
- package/lib/remark-twemoji.d.ts.map +1 -1
- package/package.json +20 -15
- package/src/constant.ts +3 -3
- package/src/filter/helper.ts +66 -77
- package/src/filter/index.ts +208 -210
- package/src/filter/style.ts +22 -20
- package/src/index.ts +4 -4
- package/src/node.ts +89 -88
- package/src/parse.ts +3 -3
- package/src/remark-twemoji.ts +57 -57
package/lib/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/constant.ts","../src/parse.ts","../src/filter/helper.ts","../src/filter/style.ts","../src/filter/index.ts","../src/remark-twemoji.ts","../src/node.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nexport const part = /:\\+1|:-1|:[\\w-]+/;\nexport const full = /:\\+1:|:-1:|:[\\w-]+:/;\nexport const input = /(:([^:\\s]+):)$/;\n","/* Copyright 2021, Milkdown by Mirone. */\nimport twemoji from 'twemoji';\n\nconst setAttr = (text: string) => ({ title: text });\n\nexport const parse = (emoji: string, twemojiOptions?: TwemojiOptions): string =>\n twemoji.parse(emoji, { attributes: setAttr, ...twemojiOptions }) as unknown as string;\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { EditorView } from '@milkdown/prose/view';\nimport type { Emoji } from 'node-emoji';\n\nimport { full, part } from '../constant';\nimport { parse } from '../parse';\n\nexport const checkTrigger = (\n view: EditorView,\n from: number,\n to: number,\n text: string,\n setRange: (from: number, to: number) => void,\n setSearch: (words: string) => void,\n) => {\n if (view.composing) return false;\n const { state } = view;\n const $from = state.doc.resolve(from);\n if ($from.parent.type.spec.code) return false;\n const textBefore = (\n $from.parent.textBetween(Math.max(0, $from.parentOffset - 10), $from.parentOffset, undefined, '\\ufffc') + text\n ).toLowerCase();\n if (full.test(textBefore)) {\n return false;\n }\n const regex = part.exec(textBefore);\n if (regex && regex[0] && textBefore.endsWith(regex[0])) {\n const match = regex[0];\n setRange(from - (match.length - text.length), to);\n setSearch(match);\n return true;\n }\n return false;\n};\n\nexport const renderDropdownList = (\n list: Emoji[],\n dropDown: HTMLElement,\n $active: HTMLElement | null,\n onConfirm: () => void,\n setActive: (active: HTMLElement | null) => void,\n twemojiOptions?: TwemojiOptions,\n) => {\n while (dropDown.firstChild) {\n dropDown.firstChild.remove();\n }\n list.forEach(({ emoji, key }, i) => {\n const container = document.createElement('div');\n container.className = 'milkdown-emoji-filter_item';\n\n const emojiSpan = document.createElement('span');\n emojiSpan.innerHTML = parse(emoji, twemojiOptions);\n\n emojiSpan.className = 'milkdown-emoji-filter_item-emoji';\n const keySpan = document.createElement('span');\n keySpan.textContent = ':' + key + ':';\n keySpan.className = 'milkdown-emoji-filter_item-key';\n\n container.appendChild(emojiSpan);\n container.appendChild(keySpan);\n dropDown.appendChild(container);\n\n if (i === 0) {\n container.classList.add('active');\n setActive(container);\n }\n\n const onEnter = (e: MouseEvent) => {\n if ($active) {\n $active.classList.remove('active');\n }\n const { target } = e;\n if (!(target instanceof HTMLElement)) return;\n target.classList.add('active');\n setActive(target);\n };\n\n const onLeave = (e: MouseEvent) => {\n const { target } = e;\n if (!(target instanceof HTMLElement)) return;\n target.classList.remove('active');\n };\n\n const onClick = (e: MouseEvent) => {\n e.preventDefault();\n onConfirm();\n };\n\n container.addEventListener('mouseenter', onEnter);\n container.addEventListener('mouseleave', onLeave);\n container.addEventListener('mousedown', onClick);\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport {\n Color,\n Emotion,\n ThemeBorder,\n ThemeColor,\n ThemeFont,\n ThemeManager,\n ThemeScrollbar,\n ThemeShadow,\n ThemeSize,\n} from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css, cx }: Emotion) => {\n const border = themeManager.get(ThemeBorder, undefined);\n const shadow = themeManager.get(ThemeShadow, undefined);\n const scrollbar = themeManager.get(ThemeScrollbar, undefined);\n const radius = themeManager.get(ThemeSize, 'radius');\n const typography = themeManager.get(ThemeFont, 'typography');\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity]);\n\n const style = css`\n min-height: 36px;\n max-height: 320px;\n overflow-y: auto;\n border-radius: ${radius};\n position: absolute;\n background: ${palette('surface')};\n\n &.hide {\n display: none;\n }\n\n .milkdown-emoji-filter_item {\n display: flex;\n gap: 8px;\n height: 36px;\n padding: 0 14px;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n line-height: 2;\n font-family: ${typography};\n font-size: 14px;\n &.active {\n background: ${palette('secondary', 0.12)};\n color: ${palette('primary')};\n }\n }\n\n .emoji {\n height: 14px;\n width: 14px;\n margin: 0 1px 0 1.5px;\n vertical-align: -1.5px;\n }\n `;\n return cx(border, shadow, scrollbar, style);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { missingRootElement } from '@milkdown/exception';\nimport { calculateNodePosition } from '@milkdown/prose';\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { ThemeUtils } from '@milkdown/utils';\nimport nodeEmoji from 'node-emoji';\n\nimport { checkTrigger, renderDropdownList } from './helper';\nimport { injectStyle } from './style';\n\nexport const key = new PluginKey('MILKDOWN_EMOJI_FILTER');\n\nexport const filter = (utils: ThemeUtils, maxListSize: number, twemojiOptions?: TwemojiOptions) => {\n let trigger = false;\n let _from = 0;\n let _search = '';\n let $active: null | HTMLElement = null;\n\n const off = () => {\n trigger = false;\n _from = 0;\n _search = '';\n $active = null;\n };\n\n return new Plugin({\n key,\n props: {\n handleKeyDown(_, event) {\n if (['Delete', 'Backspace'].includes(event.key)) {\n _search = _search.slice(0, -1);\n if (_search.length <= 1) {\n off();\n }\n return false;\n }\n if (!trigger) return false;\n if (!['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key)) {\n return false;\n }\n return true;\n },\n handleTextInput(view, from, to, text) {\n trigger = checkTrigger(\n view,\n from,\n to,\n text,\n (from) => {\n _from = from;\n },\n (search) => {\n _search = search;\n },\n );\n if (!trigger) {\n off();\n }\n return false;\n },\n },\n view: (editorView) => {\n const { parentNode } = editorView.dom;\n if (!parentNode) {\n throw missingRootElement();\n }\n\n const dropDown = document.createElement('div');\n\n dropDown.classList.add('milkdown-emoji-filter', 'hide');\n\n utils.themeManager.onFlush(() => {\n const className = dropDown.className\n .split(' ')\n .filter((x) => ['hide', 'milkdown-emoji-filter'].includes(x));\n dropDown.className = className.join(' ');\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion));\n if (style) {\n style.split(' ').forEach((x) => dropDown.classList.add(x));\n }\n });\n\n const replace = () => {\n if (!$active) return;\n\n const { tr } = editorView.state;\n const node = editorView.state.schema.node('emoji', { html: $active.firstElementChild?.innerHTML });\n\n editorView.dispatch(tr.delete(_from, _from + _search.length).insert(_from, node));\n off();\n dropDown.classList.add('hide');\n };\n\n parentNode.appendChild(dropDown);\n const onKeydown = (e: Event) => {\n if (!trigger || !(e instanceof KeyboardEvent)) return;\n\n const { key } = e;\n\n if (key === 'Enter') {\n replace();\n return;\n }\n\n if (['ArrowDown', 'ArrowUp'].includes(key)) {\n const next =\n key === 'ArrowDown'\n ? $active?.nextElementSibling || dropDown.firstElementChild\n : $active?.previousElementSibling || dropDown.lastElementChild;\n if ($active) {\n $active.classList.remove('active');\n }\n if (!next) return;\n next.classList.add('active');\n $active = next as HTMLElement;\n\n return;\n }\n };\n const onClick = (e: Event) => {\n if (!trigger) return;\n\n e.stopPropagation();\n off();\n dropDown.classList.add('hide');\n };\n parentNode.addEventListener('keydown', onKeydown);\n parentNode.addEventListener('mousedown', onClick);\n\n return {\n update: (view) => {\n const { selection } = view.state;\n\n if (selection.from - selection.to !== 0 || !trigger) {\n off();\n dropDown.classList.add('hide');\n return null;\n }\n const result = nodeEmoji.search(_search).slice(0, maxListSize);\n const { node } = view.domAtPos(_from);\n if (result.length === 0 || !node) {\n dropDown.classList.add('hide');\n return null;\n }\n\n dropDown.style.maxHeight = '';\n dropDown.classList.remove('hide');\n renderDropdownList(\n result,\n dropDown,\n $active,\n replace,\n (a) => {\n $active = a;\n },\n twemojiOptions,\n );\n calculateNodePosition(view, dropDown, (_selected, target, parent) => {\n const $editor = dropDown.parentElement;\n if (!$editor) {\n throw missingRootElement();\n }\n const start = view.coordsAtPos(_from);\n let left = start.left - parent.left;\n\n if (left < 0) {\n left = 0;\n }\n\n let direction: 'top' | 'bottom';\n let maxHeight: number | undefined;\n const startToTop = start.top - parent.top;\n const startToBottom = parent.height + parent.top - start.bottom;\n if (startToBottom >= target.height + 28) {\n direction = 'bottom';\n } else if (startToTop >= target.height + 28) {\n direction = 'top';\n } else if (startToBottom >= startToTop) {\n direction = 'bottom';\n maxHeight = startToBottom - 28;\n } else {\n direction = 'top';\n maxHeight = startToTop - 28;\n }\n if (startToTop < 0 || startToBottom < 0) {\n maxHeight = parent.height - (start.bottom - start.top) - 28;\n if (maxHeight > target.height) {\n maxHeight = undefined;\n }\n }\n\n const top =\n direction === 'top'\n ? start.top - parent.top - (maxHeight ?? target.height) - 14 + $editor.scrollTop\n : start.bottom - parent.top + 14 + $editor.scrollTop;\n\n dropDown.style.maxHeight = maxHeight !== undefined && maxHeight > 0 ? `${maxHeight}px` : '';\n\n const maxLeft = $editor.clientWidth - (dropDown.offsetWidth + 4);\n if (left > maxLeft) {\n left = maxLeft;\n }\n\n return [top, left];\n });\n\n return null;\n },\n\n destroy: () => {\n parentNode.removeEventListener('keydown', onKeydown);\n parentNode.removeEventListener('mousedown', onClick);\n dropDown.remove();\n },\n };\n },\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { RemarkPlugin } from '@milkdown/core';\nimport emojiRegex from 'emoji-regex';\nimport { Literal, Node, Parent } from 'unist';\n\nimport { parse } from './parse';\n\nconst regex = emojiRegex();\n\nconst isParent = (node: Node): node is Parent => !!(node as Parent).children;\nconst isLiteral = (node: Node): node is Literal => !!(node as Literal).value;\n\nfunction flatMap(ast: Node, fn: (node: Node, index: number, parent: Node | null) => Node[]) {\n return transform(ast, 0, null)[0];\n\n function transform(node: Node, index: number, parent: Node | null) {\n if (isParent(node)) {\n const out = [];\n for (let i = 0, n = node.children.length; i < n; i++) {\n const nthChild = node.children[i];\n if (nthChild) {\n const xs = transform(nthChild, i, node);\n if (xs) {\n for (let j = 0, m = xs.length; j < m; j++) {\n const item = xs[j];\n if (item) {\n out.push(item);\n }\n }\n }\n }\n }\n node.children = out;\n }\n\n return fn(node, index, parent);\n }\n}\n\nexport const twemojiPlugin: (twemojiOptions?: TwemojiOptions) => RemarkPlugin = (twemojiOptions) => () => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node)) {\n return [node];\n }\n const value = node.value as string;\n const output: Literal<string>[] = [];\n let match;\n let str = value;\n while ((match = regex.exec(str))) {\n const { index } = match;\n const emoji = match[0];\n if (emoji) {\n if (index > 0) {\n output.push({ ...node, value: str.slice(0, index) });\n }\n output.push({ ...node, value: parse(emoji, twemojiOptions), type: 'emoji' });\n str = str.slice(index + emoji.length);\n }\n regex.lastIndex = 0;\n }\n if (str.length) {\n output.push({ ...node, value: str });\n }\n return output;\n });\n }\n return transformer;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { RemarkPlugin } from '@milkdown/core';\nimport { expectDomTypeError } from '@milkdown/exception';\nimport { InputRule } from '@milkdown/prose/inputrules';\nimport { createNode } from '@milkdown/utils';\nimport nodeEmoji from 'node-emoji';\nimport remarkEmoji from 'remark-emoji';\n\nimport { input } from './constant';\nimport { filter } from './filter';\nimport { parse } from './parse';\nimport { twemojiPlugin } from './remark-twemoji';\n\nexport type EmojiOptions = {\n maxListSize: number;\n twemojiOptions: TwemojiOptions;\n};\n\nexport const emojiNode = createNode<string, EmojiOptions>((utils, options) => {\n const getStyle = () =>\n utils.getStyle(\n ({ css }) => css`\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 1px 0 1.5px;\n vertical-align: -1.5px;\n }\n `,\n );\n return {\n id: 'emoji',\n schema: () => ({\n group: 'inline',\n inline: true,\n atom: true,\n attrs: {\n html: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: 'span[data-type=\"emoji\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) {\n throw expectDomTypeError(dom);\n }\n return { html: dom.innerHTML };\n },\n },\n ],\n toDOM: (node) => {\n const span = document.createElement('span');\n span.classList.add('emoji-wrapper');\n span.dataset['type'] = 'emoji';\n utils.themeManager.onFlush(() => {\n const style = getStyle();\n if (style) {\n span.classList.add(style);\n }\n });\n span.innerHTML = node.attrs['html'];\n return { dom: span };\n },\n parseMarkdown: {\n match: ({ type }) => type === 'emoji',\n runner: (state, node, type) => {\n state.addNode(type, { html: node['value'] as string });\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === 'emoji',\n runner: (state, node) => {\n const span = document.createElement('span');\n span.innerHTML = node.attrs['html'];\n const img = span.querySelector('img');\n const title = img?.title;\n span.remove();\n state.addNode('text', undefined, title);\n },\n },\n }),\n inputRules: (nodeType) => [\n new InputRule(input, (state, match, start, end) => {\n const content = match[0];\n if (!content) return null;\n const got = nodeEmoji.get(content);\n if (!got || content.includes(got)) return null;\n\n const html = parse(got, options?.twemojiOptions);\n\n return state.tr\n .setMeta('emoji', true)\n .replaceRangeWith(start, end, nodeType.create({ html }))\n .scrollIntoView();\n }),\n ],\n remarkPlugins: () => [remarkEmoji as RemarkPlugin, twemojiPlugin(options?.twemojiOptions)],\n prosePlugins: () => [filter(utils, options?.maxListSize ?? 6, options?.twemojiOptions)],\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { AtomList } from '@milkdown/utils';\n\nimport { emojiNode } from './node';\nexport * from './node';\n\nexport const emoji = AtomList.create([emojiNode()]);\n"],"names":["part","full","input","setAttr","text","parse","emoji","twemojiOptions","twemoji","checkTrigger","view","from","to","setRange","setSearch","state","$from","textBefore","regex","match","renderDropdownList","list","dropDown","$active","onConfirm","setActive","key","i","container","emojiSpan","keySpan","onEnter","e","target","onLeave","onClick","injectStyle","themeManager","css","cx","border","ThemeBorder","shadow","ThemeShadow","scrollbar","ThemeScrollbar","radius","ThemeSize","typography","ThemeFont","palette","color","opacity","ThemeColor","style","PluginKey","filter","utils","maxListSize","trigger","_from","_search","off","Plugin","_","event","search","editorView","parentNode","missingRootElement","className","x","emotion","replace","tr","node","_a","onKeydown","next","selection","result","nodeEmoji","a","calculateNodePosition","_selected","parent","$editor","start","left","direction","maxHeight","startToTop","startToBottom","top","maxLeft","emojiRegex","isParent","isLiteral","flatMap","ast","fn","transform","index","out","n","nthChild","xs","j","m","item","twemojiPlugin","transformer","tree","value","output","str","emojiNode","createNode","options","getStyle","dom","expectDomTypeError","span","type","img","title","nodeType","InputRule","end","content","got","html","remarkEmoji","AtomList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/constant.ts","../src/parse.ts","../src/filter/helper.ts","../src/filter/style.ts","../src/filter/index.ts","../src/remark-twemoji.ts","../src/node.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nexport const part = /:\\+1|:-1|:[\\w-]+/\nexport const full = /:\\+1:|:-1:|:[\\w-]+:/\nexport const input = /(:([^:\\s]+):)$/\n","/* Copyright 2021, Milkdown by Mirone. */\nimport twemoji from 'twemoji'\n\nconst setAttr = (text: string) => ({ title: text })\n\nexport const parse = (emoji: string, twemojiOptions?: TwemojiOptions): string =>\n twemoji.parse(emoji, { attributes: setAttr, ...twemojiOptions }) as unknown as string\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport type { EditorView } from '@milkdown/prose/view'\nimport type { Emoji } from 'node-emoji'\n\nimport { full, part } from '../constant'\nimport { parse } from '../parse'\n\nexport const checkTrigger = (\n view: EditorView,\n from: number,\n to: number,\n text: string,\n setRange: (from: number, to: number) => void,\n setSearch: (words: string) => void,\n) => {\n if (view.composing)\n return false\n const { state } = view\n const $from = state.doc.resolve(from)\n if ($from.parent.type.spec.code)\n return false\n const textBefore = (\n $from.parent.textBetween(Math.max(0, $from.parentOffset - 10), $from.parentOffset, undefined, '\\uFFFC') + text\n ).toLowerCase()\n if (full.test(textBefore))\n return false\n\n const regex = part.exec(textBefore)\n if (regex && regex[0] && textBefore.endsWith(regex[0])) {\n const match = regex[0]\n setRange(from - (match.length - text.length), to)\n setSearch(match)\n return true\n }\n return false\n}\n\nexport const renderDropdownList = (\n list: Emoji[],\n dropDown: HTMLElement,\n onConfirm: () => void,\n setActive: (active: HTMLElement | null) => void,\n twemojiOptions?: TwemojiOptions,\n) => {\n while (dropDown.firstChild)\n dropDown.firstChild.remove()\n\n list.forEach(({ emoji, key }, i) => {\n const container = document.createElement('div')\n container.className = 'milkdown-emoji-filter_item'\n\n const emojiSpan = document.createElement('span')\n emojiSpan.innerHTML = parse(emoji, twemojiOptions)\n\n emojiSpan.className = 'milkdown-emoji-filter_item-emoji'\n const keySpan = document.createElement('span')\n keySpan.textContent = `:${key}:`\n keySpan.className = 'milkdown-emoji-filter_item-key'\n\n container.appendChild(emojiSpan)\n container.appendChild(keySpan)\n dropDown.appendChild(container)\n\n if (i === 0)\n setActive(container)\n\n const onEnter = (e: MouseEvent) => {\n const { target } = e\n if (!(target instanceof HTMLElement))\n return\n setActive(target)\n }\n\n const onClick = (e: MouseEvent) => {\n e.preventDefault()\n onConfirm()\n }\n\n container.addEventListener('mouseenter', onEnter)\n container.addEventListener('mousedown', onClick)\n })\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type {\n Color,\n Emotion,\n ThemeManager,\n} from '@milkdown/core'\nimport {\n ThemeBorder,\n ThemeColor,\n ThemeFont,\n ThemeScrollbar,\n ThemeShadow,\n ThemeSize,\n} from '@milkdown/core'\n\nexport const injectStyle = (themeManager: ThemeManager, { css, cx }: Emotion) => {\n const border = themeManager.get(ThemeBorder, undefined)\n const shadow = themeManager.get(ThemeShadow, undefined)\n const scrollbar = themeManager.get(ThemeScrollbar, undefined)\n const radius = themeManager.get(ThemeSize, 'radius')\n const typography = themeManager.get(ThemeFont, 'typography')\n const palette = (color: Color, opacity = 1) => themeManager.get(ThemeColor, [color, opacity])\n\n const style = css`\n min-height: 36px;\n max-height: 320px;\n overflow-y: auto;\n border-radius: ${radius};\n position: absolute;\n background: ${palette('surface')};\n\n &.hide {\n display: none;\n }\n\n .milkdown-emoji-filter_item {\n display: flex;\n gap: 8px;\n height: 36px;\n padding: 0 14px;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n line-height: 2;\n font-family: ${typography};\n font-size: 14px;\n &.active {\n background: ${palette('secondary', 0.12)};\n color: ${palette('primary')};\n }\n }\n\n .emoji {\n height: 14px;\n width: 14px;\n margin: 0 1px 0 1.5px;\n vertical-align: -1.5px;\n }\n `\n return cx(border, shadow, scrollbar, style)\n}\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { missingRootElement } from '@milkdown/exception'\nimport { calculateNodePosition } from '@milkdown/prose'\nimport { Plugin, PluginKey } from '@milkdown/prose/state'\nimport type { ThemeUtils } from '@milkdown/utils'\nimport nodeEmoji from 'node-emoji'\n\nimport { checkTrigger, renderDropdownList } from './helper'\nimport { injectStyle } from './style'\n\nexport const key = new PluginKey('MILKDOWN_EMOJI_FILTER')\n\nexport const filter = (utils: ThemeUtils, maxListSize: number, twemojiOptions?: TwemojiOptions) => {\n let trigger = false\n let _from = 0\n let _search = ''\n let $active: null | HTMLElement = null\n\n const off = () => {\n trigger = false\n _from = 0\n _search = ''\n $active = null\n }\n\n const setActive = (active: HTMLElement | null) => {\n if ($active)\n $active.classList.remove('active')\n\n if (active)\n active.classList.add('active')\n\n $active = active\n }\n\n return new Plugin({\n key,\n props: {\n handleKeyDown(_, event) {\n if (['Delete', 'Backspace'].includes(event.key)) {\n _search = _search.slice(0, -1)\n if (_search.length <= 1)\n off()\n\n return false\n }\n if (!trigger)\n return false\n if (!['ArrowUp', 'ArrowDown', 'Enter'].includes(event.key))\n return false\n\n return true\n },\n handleTextInput(view, from, to, text) {\n trigger = checkTrigger(\n view,\n from,\n to,\n text,\n (from) => {\n _from = from\n },\n (search) => {\n _search = search\n },\n )\n if (!trigger)\n off()\n\n return false\n },\n },\n view: (editorView) => {\n const { parentNode } = editorView.dom\n if (!parentNode)\n throw missingRootElement()\n\n const dropDown = document.createElement('div')\n\n dropDown.classList.add('milkdown-emoji-filter', 'hide')\n\n utils.themeManager.onFlush(() => {\n const className = dropDown.className\n .split(' ')\n .filter(x => ['hide', 'milkdown-emoji-filter'].includes(x))\n dropDown.className = className.join(' ')\n const style = utils.getStyle(emotion => injectStyle(utils.themeManager, emotion))\n if (style)\n style.split(' ').forEach(x => dropDown.classList.add(x))\n })\n\n const replace = () => {\n if (!$active)\n return\n\n const { tr } = editorView.state\n const node = editorView.state.schema.node('emoji', { html: $active.firstElementChild?.innerHTML })\n\n editorView.dispatch(tr.delete(_from, _from + _search.length).insert(_from, node))\n off()\n dropDown.classList.add('hide')\n }\n\n parentNode.appendChild(dropDown)\n const onKeydown = (e: Event) => {\n if (!trigger || !(e instanceof KeyboardEvent))\n return\n\n const { key } = e\n\n if (key === 'Enter') {\n replace()\n return\n }\n\n if (['ArrowDown', 'ArrowUp'].includes(key)) {\n const next\n = key === 'ArrowDown'\n ? $active?.nextElementSibling || dropDown.firstElementChild\n : $active?.previousElementSibling || dropDown.lastElementChild\n if (!next)\n return\n setActive(next as HTMLElement)\n }\n }\n const onClick = (e: Event) => {\n if (!trigger)\n return\n\n e.stopPropagation()\n off()\n dropDown.classList.add('hide')\n }\n parentNode.addEventListener('keydown', onKeydown)\n parentNode.addEventListener('mousedown', onClick)\n\n return {\n update: (view) => {\n const { selection } = view.state\n\n if (selection.from - selection.to !== 0 || !trigger) {\n off()\n dropDown.classList.add('hide')\n return null\n }\n const result = nodeEmoji.search(_search).slice(0, maxListSize)\n const { node } = view.domAtPos(_from)\n if (result.length === 0 || !node) {\n dropDown.classList.add('hide')\n return null\n }\n\n dropDown.style.maxHeight = ''\n dropDown.classList.remove('hide')\n renderDropdownList(result, dropDown, replace, setActive, twemojiOptions)\n calculateNodePosition(view, dropDown, (_selected, target, parent) => {\n const $editor = dropDown.parentElement\n if (!$editor)\n throw missingRootElement()\n\n const start = view.coordsAtPos(_from)\n let left = start.left - parent.left\n\n if (left < 0)\n left = 0\n\n let direction: 'top' | 'bottom'\n let maxHeight: number | undefined\n const startToTop = start.top - parent.top\n const startToBottom = parent.height + parent.top - start.bottom\n if (startToBottom >= target.height + 28) {\n direction = 'bottom'\n }\n else if (startToTop >= target.height + 28) {\n direction = 'top'\n }\n else if (startToBottom >= startToTop) {\n direction = 'bottom'\n maxHeight = startToBottom - 28\n }\n else {\n direction = 'top'\n maxHeight = startToTop - 28\n }\n if (startToTop < 0 || startToBottom < 0) {\n maxHeight = parent.height - (start.bottom - start.top) - 28\n if (maxHeight > target.height)\n maxHeight = undefined\n }\n\n const top\n = direction === 'top'\n ? start.top - parent.top - (maxHeight ?? target.height) - 14 + $editor.scrollTop\n : start.bottom - parent.top + 14 + $editor.scrollTop\n\n dropDown.style.maxHeight = maxHeight !== undefined && maxHeight > 0 ? `${maxHeight}px` : ''\n\n const maxLeft = $editor.clientWidth - (dropDown.offsetWidth + 4)\n if (left > maxLeft)\n left = maxLeft\n\n return [top, left]\n })\n\n return null\n },\n\n destroy: () => {\n parentNode.removeEventListener('keydown', onKeydown)\n parentNode.removeEventListener('mousedown', onClick)\n dropDown.remove()\n },\n }\n },\n })\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { RemarkPlugin } from '@milkdown/core'\nimport emojiRegex from 'emoji-regex'\nimport type { Literal, Node, Parent } from 'unist'\n\nimport { parse } from './parse'\n\nconst regex = emojiRegex()\n\nconst isParent = (node: Node): node is Parent => !!(node as Parent).children\nconst isLiteral = (node: Node): node is Literal => !!(node as Literal).value\n\nfunction flatMap(ast: Node, fn: (node: Node, index: number, parent: Node | null) => Node[]) {\n return transform(ast, 0, null)[0]\n\n function transform(node: Node, index: number, parent: Node | null) {\n if (isParent(node)) {\n const out = []\n for (let i = 0, n = node.children.length; i < n; i++) {\n const nthChild = node.children[i]\n if (nthChild) {\n const xs = transform(nthChild, i, node)\n if (xs) {\n for (let j = 0, m = xs.length; j < m; j++) {\n const item = xs[j]\n if (item)\n out.push(item)\n }\n }\n }\n }\n node.children = out\n }\n\n return fn(node, index, parent)\n }\n}\n\nexport const twemojiPlugin: (twemojiOptions?: TwemojiOptions) => RemarkPlugin = twemojiOptions => () => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node))\n return [node]\n\n const value = node.value as string\n const output: Literal<string>[] = []\n let match\n let str = value\n // eslint-disable-next-line no-cond-assign\n while ((match = regex.exec(str))) {\n const { index } = match\n const emoji = match[0]\n if (emoji) {\n if (index > 0)\n output.push({ ...node, value: str.slice(0, index) })\n\n output.push({ ...node, value: parse(emoji, twemojiOptions), type: 'emoji' })\n str = str.slice(index + emoji.length)\n }\n regex.lastIndex = 0\n }\n if (str.length)\n output.push({ ...node, value: str })\n\n return output\n })\n }\n return transformer\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { RemarkPlugin } from '@milkdown/core'\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport { createNode } from '@milkdown/utils'\nimport nodeEmoji from 'node-emoji'\nimport remarkEmoji from 'remark-emoji'\n\nimport { input } from './constant'\nimport { filter } from './filter'\nimport { parse } from './parse'\nimport { twemojiPlugin } from './remark-twemoji'\n\nexport interface EmojiOptions {\n maxListSize: number\n twemojiOptions: TwemojiOptions\n}\n\nexport const emojiNode = createNode<string, EmojiOptions>((utils, options) => {\n const getStyle = () =>\n utils.getStyle(\n ({ css }) => css`\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 1px 0 1.5px;\n vertical-align: -1.5px;\n }\n `,\n )\n return {\n id: 'emoji',\n schema: () => ({\n group: 'inline',\n inline: true,\n atom: true,\n attrs: {\n html: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: 'span[data-type=\"emoji\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return { html: dom.innerHTML }\n },\n },\n ],\n toDOM: (node) => {\n const span = document.createElement('span')\n span.classList.add('emoji-wrapper')\n span.dataset.type = 'emoji'\n utils.themeManager.onFlush(() => {\n const style = getStyle()\n if (style)\n span.classList.add(style)\n })\n span.innerHTML = node.attrs.html\n return { dom: span }\n },\n parseMarkdown: {\n match: ({ type }) => type === 'emoji',\n runner: (state, node, type) => {\n state.addNode(type, { html: node.value as string })\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'emoji',\n runner: (state, node) => {\n const span = document.createElement('span')\n span.innerHTML = node.attrs.html\n const img = span.querySelector('img')\n const title = img?.title\n span.remove()\n state.addNode('text', undefined, title)\n },\n },\n }),\n inputRules: nodeType => [\n new InputRule(input, (state, match, start, end) => {\n const content = match[0]\n if (!content)\n return null\n const got = nodeEmoji.get(content)\n if (!got || content.includes(got))\n return null\n\n const html = parse(got, options?.twemojiOptions)\n\n return state.tr\n .setMeta('emoji', true)\n .replaceRangeWith(start, end, nodeType.create({ html }))\n .scrollIntoView()\n }),\n ],\n remarkPlugins: () => [remarkEmoji as RemarkPlugin, twemojiPlugin(options?.twemojiOptions)],\n prosePlugins: () => [filter(utils, options?.maxListSize ?? 6, options?.twemojiOptions)],\n }\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { AtomList } from '@milkdown/utils'\n\nimport { emojiNode } from './node'\nexport * from './node'\n\nexport const emoji = AtomList.create([emojiNode()])\n"],"names":["part","full","input","setAttr","text","parse","emoji","twemojiOptions","twemoji","checkTrigger","view","from","to","setRange","setSearch","state","$from","textBefore","regex","match","renderDropdownList","list","dropDown","onConfirm","setActive","key","container","emojiSpan","keySpan","onEnter","e","target","onClick","injectStyle","themeManager","css","cx","border","ThemeBorder","shadow","ThemeShadow","scrollbar","ThemeScrollbar","radius","ThemeSize","typography","ThemeFont","palette","color","opacity","ThemeColor","style","PluginKey","filter","utils","maxListSize","trigger","_from","_search","$active","off","active","Plugin","_","event","search","editorView","parentNode","missingRootElement","className","x","emotion","replace","tr","node","_a","onKeydown","next","selection","result","nodeEmoji","calculateNodePosition","_selected","parent","$editor","start","left","direction","maxHeight","startToTop","startToBottom","top","maxLeft","emojiRegex","isParent","isLiteral","flatMap","ast","fn","transform","index","out","n","nthChild","xs","j","m","item","twemojiPlugin","transformer","tree","value","output","str","emojiNode","createNode","options","getStyle","dom","expectDomTypeError","span","type","img","title","nodeType","InputRule","end","content","got","html","remarkEmoji","AtomList"],"mappings":"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"}
|
package/lib/node.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface EmojiOptions {
|
|
2
2
|
maxListSize: number;
|
|
3
3
|
twemojiOptions: TwemojiOptions;
|
|
4
|
-
}
|
|
4
|
+
}
|
|
5
5
|
export declare const emojiNode: import("@milkdown/utils").NodeCreator<string, EmojiOptions>;
|
|
6
6
|
//# sourceMappingURL=node.d.ts.map
|
package/lib/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAaA,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,eAAO,MAAM,SAAS,6DAoFpB,CAAA"}
|
package/lib/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,UAAW,MAAM,mBAAmB,cAAc,KAAG,
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,KAAK,UAAW,MAAM,mBAAmB,cAAc,KAAG,MACgB,CAAA"}
|
package/lib/remark-twemoji.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remark-twemoji.d.ts","sourceRoot":"","sources":["../src/remark-twemoji.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,
|
|
1
|
+
{"version":3,"file":"remark-twemoji.d.ts","sourceRoot":"","sources":["../src/remark-twemoji.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAqClD,eAAO,MAAM,aAAa,EAAE,CAAC,cAAc,CAAC,EAAE,cAAc,KAAK,YA8BhE,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,38 +1,43 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milkdown/plugin-emoji",
|
|
3
|
-
"version": "6.5.2",
|
|
4
3
|
"type": "module",
|
|
4
|
+
"version": "6.5.4",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/Saul-Mirone/milkdown.git",
|
|
9
|
+
"directory": "packages/plugin-emoji"
|
|
10
|
+
},
|
|
11
|
+
"keywords": [
|
|
12
|
+
"milkdown",
|
|
13
|
+
"milkdown plugin"
|
|
14
|
+
],
|
|
15
|
+
"sideEffects": false,
|
|
5
16
|
"main": "./lib/index.es.js",
|
|
6
17
|
"types": "./lib/index.d.ts",
|
|
7
|
-
"sideEffects": false,
|
|
8
|
-
"license": "MIT",
|
|
9
18
|
"files": [
|
|
10
19
|
"lib",
|
|
11
20
|
"src"
|
|
12
21
|
],
|
|
13
|
-
"keywords": [
|
|
14
|
-
"milkdown",
|
|
15
|
-
"milkdown plugin"
|
|
16
|
-
],
|
|
17
|
-
"devDependencies": {
|
|
18
|
-
"@milkdown/core": "6.5.2",
|
|
19
|
-
"@milkdown/prose": "6.5.2",
|
|
20
|
-
"@types/unist": "^2.0.6"
|
|
21
|
-
},
|
|
22
22
|
"peerDependencies": {
|
|
23
23
|
"@milkdown/core": "^6.0.1",
|
|
24
24
|
"@milkdown/prose": "^6.0.1"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@milkdown/exception": "6.5.2",
|
|
28
|
-
"@milkdown/utils": "6.5.2",
|
|
29
27
|
"@types/node-emoji": "^1.8.1",
|
|
30
28
|
"emoji-regex": "^10.0.0",
|
|
31
29
|
"node-emoji": "^1.10.0",
|
|
32
30
|
"remark-emoji": "^3.0.1",
|
|
33
31
|
"tslib": "^2.4.0",
|
|
34
32
|
"twemoji": "^14.0.1",
|
|
35
|
-
"unist-util-visit": "^4.0.0"
|
|
33
|
+
"unist-util-visit": "^4.0.0",
|
|
34
|
+
"@milkdown/exception": "6.5.4",
|
|
35
|
+
"@milkdown/utils": "6.5.4"
|
|
36
|
+
},
|
|
37
|
+
"devDependencies": {
|
|
38
|
+
"@types/unist": "^2.0.6",
|
|
39
|
+
"@milkdown/core": "6.5.4",
|
|
40
|
+
"@milkdown/prose": "6.5.4"
|
|
36
41
|
},
|
|
37
42
|
"nx": {
|
|
38
43
|
"targets": {
|
package/src/constant.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
-
export const part = /:\+1|:-1|:[\w-]
|
|
3
|
-
export const full = /:\+1:|:-1:|:[\w-]
|
|
4
|
-
export const input = /(:([^:\s]+):)
|
|
2
|
+
export const part = /:\+1|:-1|:[\w-]+/
|
|
3
|
+
export const full = /:\+1:|:-1:|:[\w-]+:/
|
|
4
|
+
export const input = /(:([^:\s]+):)$/
|
package/src/filter/helper.ts
CHANGED
|
@@ -1,94 +1,83 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
|
|
3
|
-
import { EditorView } from '@milkdown/prose/view'
|
|
4
|
-
import type { Emoji } from 'node-emoji'
|
|
3
|
+
import type { EditorView } from '@milkdown/prose/view'
|
|
4
|
+
import type { Emoji } from 'node-emoji'
|
|
5
5
|
|
|
6
|
-
import { full, part } from '../constant'
|
|
7
|
-
import { parse } from '../parse'
|
|
6
|
+
import { full, part } from '../constant'
|
|
7
|
+
import { parse } from '../parse'
|
|
8
8
|
|
|
9
9
|
export const checkTrigger = (
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
view: EditorView,
|
|
11
|
+
from: number,
|
|
12
|
+
to: number,
|
|
13
|
+
text: string,
|
|
14
|
+
setRange: (from: number, to: number) => void,
|
|
15
|
+
setSearch: (words: string) => void,
|
|
16
16
|
) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return
|
|
35
|
-
}
|
|
17
|
+
if (view.composing)
|
|
18
|
+
return false
|
|
19
|
+
const { state } = view
|
|
20
|
+
const $from = state.doc.resolve(from)
|
|
21
|
+
if ($from.parent.type.spec.code)
|
|
22
|
+
return false
|
|
23
|
+
const textBefore = (
|
|
24
|
+
$from.parent.textBetween(Math.max(0, $from.parentOffset - 10), $from.parentOffset, undefined, '\uFFFC') + text
|
|
25
|
+
).toLowerCase()
|
|
26
|
+
if (full.test(textBefore))
|
|
27
|
+
return false
|
|
28
|
+
|
|
29
|
+
const regex = part.exec(textBefore)
|
|
30
|
+
if (regex && regex[0] && textBefore.endsWith(regex[0])) {
|
|
31
|
+
const match = regex[0]
|
|
32
|
+
setRange(from - (match.length - text.length), to)
|
|
33
|
+
setSearch(match)
|
|
34
|
+
return true
|
|
35
|
+
}
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
36
38
|
|
|
37
39
|
export const renderDropdownList = (
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
twemojiOptions?: TwemojiOptions,
|
|
40
|
+
list: Emoji[],
|
|
41
|
+
dropDown: HTMLElement,
|
|
42
|
+
onConfirm: () => void,
|
|
43
|
+
setActive: (active: HTMLElement | null) => void,
|
|
44
|
+
twemojiOptions?: TwemojiOptions,
|
|
44
45
|
) => {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
list.forEach(({ emoji, key }, i) => {
|
|
49
|
-
const container = document.createElement('div');
|
|
50
|
-
container.className = 'milkdown-emoji-filter_item';
|
|
46
|
+
while (dropDown.firstChild)
|
|
47
|
+
dropDown.firstChild.remove()
|
|
51
48
|
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
list.forEach(({ emoji, key }, i) => {
|
|
50
|
+
const container = document.createElement('div')
|
|
51
|
+
container.className = 'milkdown-emoji-filter_item'
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
keySpan.textContent = ':' + key + ':';
|
|
58
|
-
keySpan.className = 'milkdown-emoji-filter_item-key';
|
|
53
|
+
const emojiSpan = document.createElement('span')
|
|
54
|
+
emojiSpan.innerHTML = parse(emoji, twemojiOptions)
|
|
59
55
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
emojiSpan.className = 'milkdown-emoji-filter_item-emoji'
|
|
57
|
+
const keySpan = document.createElement('span')
|
|
58
|
+
keySpan.textContent = `:${key}:`
|
|
59
|
+
keySpan.className = 'milkdown-emoji-filter_item-key'
|
|
63
60
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
61
|
+
container.appendChild(emojiSpan)
|
|
62
|
+
container.appendChild(keySpan)
|
|
63
|
+
dropDown.appendChild(container)
|
|
68
64
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
$active.classList.remove('active');
|
|
72
|
-
}
|
|
73
|
-
const { target } = e;
|
|
74
|
-
if (!(target instanceof HTMLElement)) return;
|
|
75
|
-
target.classList.add('active');
|
|
76
|
-
setActive(target);
|
|
77
|
-
};
|
|
65
|
+
if (i === 0)
|
|
66
|
+
setActive(container)
|
|
78
67
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
68
|
+
const onEnter = (e: MouseEvent) => {
|
|
69
|
+
const { target } = e
|
|
70
|
+
if (!(target instanceof HTMLElement))
|
|
71
|
+
return
|
|
72
|
+
setActive(target)
|
|
73
|
+
}
|
|
84
74
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
75
|
+
const onClick = (e: MouseEvent) => {
|
|
76
|
+
e.preventDefault()
|
|
77
|
+
onConfirm()
|
|
78
|
+
}
|
|
89
79
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
};
|
|
80
|
+
container.addEventListener('mouseenter', onEnter)
|
|
81
|
+
container.addEventListener('mousedown', onClick)
|
|
82
|
+
})
|
|
83
|
+
}
|