@milkdown/plugin-emoji 6.1.1 → 6.1.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/filter/helper.d.ts +1 -1
- package/lib/filter/helper.d.ts.map +1 -1
- package/lib/filter/index.d.ts.map +1 -1
- package/lib/index.es.js +6 -10
- package/lib/index.es.js.map +1 -1
- package/lib/node.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/filter/helper.ts +1 -1
- package/src/filter/index.ts +3 -3
- package/src/node.ts +1 -5
package/lib/filter/helper.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EditorView } from '@milkdown/prose/view';
|
|
2
|
-
import { Emoji } from 'node-emoji';
|
|
2
|
+
import type { Emoji } from 'node-emoji';
|
|
3
3
|
export declare const checkTrigger: (view: EditorView, from: number, to: number, text: string, setRange: (from: number, to: number) => void, setSearch: (words: string) => void) => boolean;
|
|
4
4
|
export declare const renderDropdownList: (list: Emoji[], dropDown: HTMLElement, $active: HTMLElement | null, onConfirm: () => void, setActive: (active: HTMLElement | null) => void) => void;
|
|
5
5
|
//# sourceMappingURL=helper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/filter/helper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/filter/helper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKxC,eAAO,MAAM,YAAY,SACf,UAAU,QACV,MAAM,MACR,MAAM,QACJ,MAAM,mBACK,MAAM,MAAM,MAAM,KAAK,IAAI,qBACzB,MAAM,KAAK,IAAI,YAoBrC,CAAC;AAEF,eAAO,MAAM,kBAAkB,SACrB,KAAK,EAAE,YACH,WAAW,WACZ,WAAW,GAAG,IAAI,aAChB,MAAM,IAAI,sBACD,WAAW,GAAG,IAAI,KAAK,IAAI,SAmDlD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filter/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMxC,eAAO,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filter/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAMxC,eAAO,MAAM,GAAG,qBAAyC,CAAC;AAE1D,eAAO,MAAM,MAAM,UAAW,KAAK,eAAe,MAAM,qBAuKvD,CAAC"}
|
package/lib/index.es.js
CHANGED
|
@@ -19,7 +19,7 @@ var __spreadValues = (a, b) => {
|
|
|
19
19
|
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
20
|
import { createNode, AtomList } from "@milkdown/utils";
|
|
21
21
|
import { InputRule } from "@milkdown/prose/inputrules";
|
|
22
|
-
import nodeEmoji
|
|
22
|
+
import nodeEmoji from "node-emoji";
|
|
23
23
|
import remarkEmoji from "remark-emoji";
|
|
24
24
|
import { calculateNodePosition } from "@milkdown/prose";
|
|
25
25
|
import { PluginKey, Plugin } from "@milkdown/prose/state";
|
|
@@ -137,7 +137,7 @@ const injectStyle = (themeManager, { css, cx }) => {
|
|
|
137
137
|
`;
|
|
138
138
|
return cx(border, shadow, style);
|
|
139
139
|
};
|
|
140
|
-
const key = new PluginKey("
|
|
140
|
+
const key = new PluginKey("MILKDOWN_EMOJI_FILTER");
|
|
141
141
|
const filter = (utils, maxListSize) => {
|
|
142
142
|
let trigger = false;
|
|
143
143
|
let _from = 0;
|
|
@@ -170,8 +170,8 @@ const filter = (utils, maxListSize) => {
|
|
|
170
170
|
handleTextInput(view, from, to, text) {
|
|
171
171
|
trigger = checkTrigger(view, from, to, text, (from2) => {
|
|
172
172
|
_from = from2;
|
|
173
|
-
}, (
|
|
174
|
-
_search =
|
|
173
|
+
}, (search) => {
|
|
174
|
+
_search = search;
|
|
175
175
|
});
|
|
176
176
|
if (!trigger) {
|
|
177
177
|
off();
|
|
@@ -242,7 +242,7 @@ const filter = (utils, maxListSize) => {
|
|
|
242
242
|
dropDown.classList.add("hide");
|
|
243
243
|
return null;
|
|
244
244
|
}
|
|
245
|
-
const result = search(_search).slice(0, maxListSize);
|
|
245
|
+
const result = nodeEmoji.search(_search).slice(0, maxListSize);
|
|
246
246
|
const { node } = view.domAtPos(_from);
|
|
247
247
|
if (result.length === 0 || !node) {
|
|
248
248
|
dropDown.classList.add("hide");
|
|
@@ -337,10 +337,6 @@ const twemojiPlugin = () => {
|
|
|
337
337
|
};
|
|
338
338
|
const emojiNode = createNode((utils, options) => {
|
|
339
339
|
const getStyle = () => utils.getStyle(({ css }) => css`
|
|
340
|
-
display: inline-flex;
|
|
341
|
-
justify-content: center;
|
|
342
|
-
align-items: center;
|
|
343
|
-
|
|
344
340
|
.emoji {
|
|
345
341
|
height: 1em;
|
|
346
342
|
width: 1em;
|
|
@@ -353,7 +349,7 @@ const emojiNode = createNode((utils, options) => {
|
|
|
353
349
|
schema: () => ({
|
|
354
350
|
group: "inline",
|
|
355
351
|
inline: true,
|
|
356
|
-
|
|
352
|
+
atom: true,
|
|
357
353
|
attrs: {
|
|
358
354
|
html: {
|
|
359
355
|
default: ""
|
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): string => twemoji.parse(emoji, { attributes: setAttr }) as unknown as string;\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { EditorView } from '@milkdown/prose/view';\nimport { 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) => {\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);\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 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 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 position: absolute;\n &.hide {\n display: none;\n }\n\n border-radius: ${radius};\n background: ${palette('surface')};\n\n .milkdown-emoji-filter_item {\n display: flex;\n gap: 0.5em;\n height: 2.57143em;\n padding: 0 1em;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n line-height: 2;\n font-family: ${typography};\n font-size: 0.875em;\n &.active {\n background: ${palette('secondary', 0.12)};\n color: ${palette('primary')};\n }\n }\n\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 0.05em 0 0.1em;\n vertical-align: -0.1em;\n }\n `;\n return cx(border, shadow, style);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { calculateNodePosition } from '@milkdown/prose';\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { Utils } from '@milkdown/utils';\nimport { search } from 'node-emoji';\n\nimport { checkTrigger, renderDropdownList } from './helper';\nimport { injectStyle } from './style';\n\nexport const key = new PluginKey('MILKDOWN_PLUGIN_EMOJI_FILTER');\n\nexport const filter = (utils: Utils, maxListSize: number) => {\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 new Error();\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 = 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.classList.remove('hide');\n renderDropdownList(result, dropDown, $active, replace, (a) => {\n $active = a;\n });\n calculateNodePosition(view, dropDown, (selected, target, parent) => {\n const $editor = dropDown.parentElement;\n if (!$editor) {\n throw new Error();\n }\n const start = view.coordsAtPos(_from);\n let left = start.left - parent.left;\n let top = selected.bottom - parent.top + 14 + $editor.scrollTop;\n\n if (left < 0) {\n left = 0;\n }\n\n if (window.innerHeight - start.bottom < target.height) {\n top = selected.top - parent.top - target.height - 14 + $editor.scrollTop;\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 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 = () => {\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), type: 'emoji' });\n str = str.slice(index + emoji.length);\n }\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 { 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};\n\nexport const emojiNode = createNode<string, EmojiOptions>((utils, options) => {\n const getStyle = () =>\n utils.getStyle(\n ({ css }) => css`\n display: inline-flex;\n justify-content: center;\n align-items: center;\n\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 0.05em 0 0.1em;\n vertical-align: -0.1em;\n }\n `,\n );\n return {\n id: 'emoji',\n schema: () => ({\n group: 'inline',\n inline: true,\n selectable: false,\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 new Error();\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);\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],\n prosePlugins: () => [filter(utils, options?.maxListSize ?? 6)],\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":[],"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): string => twemoji.parse(emoji, { attributes: setAttr }) 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) => {\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);\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 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 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 position: absolute;\n &.hide {\n display: none;\n }\n\n border-radius: ${radius};\n background: ${palette('surface')};\n\n .milkdown-emoji-filter_item {\n display: flex;\n gap: 0.5em;\n height: 2.57143em;\n padding: 0 1em;\n align-items: center;\n justify-content: flex-start;\n cursor: pointer;\n line-height: 2;\n font-family: ${typography};\n font-size: 0.875em;\n &.active {\n background: ${palette('secondary', 0.12)};\n color: ${palette('primary')};\n }\n }\n\n .emoji {\n height: 1em;\n width: 1em;\n margin: 0 0.05em 0 0.1em;\n vertical-align: -0.1em;\n }\n `;\n return cx(border, shadow, style);\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { calculateNodePosition } from '@milkdown/prose';\nimport { Plugin, PluginKey } from '@milkdown/prose/state';\nimport { Utils } 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: Utils, maxListSize: number) => {\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 new Error();\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.classList.remove('hide');\n renderDropdownList(result, dropDown, $active, replace, (a) => {\n $active = a;\n });\n calculateNodePosition(view, dropDown, (selected, target, parent) => {\n const $editor = dropDown.parentElement;\n if (!$editor) {\n throw new Error();\n }\n const start = view.coordsAtPos(_from);\n let left = start.left - parent.left;\n let top = selected.bottom - parent.top + 14 + $editor.scrollTop;\n\n if (left < 0) {\n left = 0;\n }\n\n if (window.innerHeight - start.bottom < target.height) {\n top = selected.top - parent.top - target.height - 14 + $editor.scrollTop;\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 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 = () => {\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), type: 'emoji' });\n str = str.slice(index + emoji.length);\n }\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 { 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};\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 0.05em 0 0.1em;\n vertical-align: -0.1em;\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 new Error();\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);\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],\n prosePlugins: () => [filter(utils, options?.maxListSize ?? 6)],\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":[],"mappings":"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"}
|
package/lib/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAYA,oBAAY,YAAY,GAAG;IACvB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAYA,oBAAY,YAAY,GAAG;IACvB,WAAW,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;EAmFpB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milkdown/plugin-emoji",
|
|
3
|
-
"version": "6.1.
|
|
3
|
+
"version": "6.1.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./lib/index.es.js",
|
|
6
6
|
"types": "./lib/index.d.ts",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"milkdown plugin"
|
|
16
16
|
],
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@milkdown/core": "6.1.
|
|
19
|
-
"@milkdown/prose": "6.1.
|
|
18
|
+
"@milkdown/core": "6.1.4",
|
|
19
|
+
"@milkdown/prose": "6.1.4",
|
|
20
20
|
"@types/unist": "^2.0.6"
|
|
21
21
|
},
|
|
22
22
|
"peerDependencies": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"@milkdown/prose": "^6.0.1"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@milkdown/utils": "6.1.
|
|
27
|
+
"@milkdown/utils": "6.1.4",
|
|
28
28
|
"@types/node-emoji": "^1.8.1",
|
|
29
29
|
"emoji-regex": "^10.0.0",
|
|
30
30
|
"node-emoji": "^1.10.0",
|
package/src/filter/helper.ts
CHANGED
package/src/filter/index.ts
CHANGED
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import { calculateNodePosition } from '@milkdown/prose';
|
|
4
4
|
import { Plugin, PluginKey } from '@milkdown/prose/state';
|
|
5
5
|
import { Utils } from '@milkdown/utils';
|
|
6
|
-
import
|
|
6
|
+
import nodeEmoji from 'node-emoji';
|
|
7
7
|
|
|
8
8
|
import { checkTrigger, renderDropdownList } from './helper';
|
|
9
9
|
import { injectStyle } from './style';
|
|
10
10
|
|
|
11
|
-
export const key = new PluginKey('
|
|
11
|
+
export const key = new PluginKey('MILKDOWN_EMOJI_FILTER');
|
|
12
12
|
|
|
13
13
|
export const filter = (utils: Utils, maxListSize: number) => {
|
|
14
14
|
let trigger = false;
|
|
@@ -136,7 +136,7 @@ export const filter = (utils: Utils, maxListSize: number) => {
|
|
|
136
136
|
dropDown.classList.add('hide');
|
|
137
137
|
return null;
|
|
138
138
|
}
|
|
139
|
-
const result = search(_search).slice(0, maxListSize);
|
|
139
|
+
const result = nodeEmoji.search(_search).slice(0, maxListSize);
|
|
140
140
|
const { node } = view.domAtPos(_from);
|
|
141
141
|
if (result.length === 0 || !node) {
|
|
142
142
|
dropDown.classList.add('hide');
|
package/src/node.ts
CHANGED
|
@@ -18,10 +18,6 @@ export const emojiNode = createNode<string, EmojiOptions>((utils, options) => {
|
|
|
18
18
|
const getStyle = () =>
|
|
19
19
|
utils.getStyle(
|
|
20
20
|
({ css }) => css`
|
|
21
|
-
display: inline-flex;
|
|
22
|
-
justify-content: center;
|
|
23
|
-
align-items: center;
|
|
24
|
-
|
|
25
21
|
.emoji {
|
|
26
22
|
height: 1em;
|
|
27
23
|
width: 1em;
|
|
@@ -35,7 +31,7 @@ export const emojiNode = createNode<string, EmojiOptions>((utils, options) => {
|
|
|
35
31
|
schema: () => ({
|
|
36
32
|
group: 'inline',
|
|
37
33
|
inline: true,
|
|
38
|
-
|
|
34
|
+
atom: true,
|
|
39
35
|
attrs: {
|
|
40
36
|
html: {
|
|
41
37
|
default: '',
|