@milkdown/plugin-emoji 6.5.1 → 6.5.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,QAAqB,CAAC;AACvC,eAAO,MAAM,IAAI,QAAwB,CAAC;AAC1C,eAAO,MAAM,KAAK,QAAmB,CAAC"}
1
+ {"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,QAAqB,CAAA;AACtC,eAAO,MAAM,IAAI,QAAwB,CAAA;AACzC,eAAO,MAAM,KAAK,QAAmB,CAAA"}
@@ -1,5 +1,5 @@
1
- import { EditorView } from '@milkdown/prose/view';
1
+ import type { EditorView } from '@milkdown/prose/view';
2
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
- export declare const renderDropdownList: (list: Emoji[], dropDown: HTMLElement, $active: HTMLElement | null, onConfirm: () => void, setActive: (active: HTMLElement | null) => void, twemojiOptions?: TwemojiOptions) => void;
4
+ export declare const renderDropdownList: (list: Emoji[], dropDown: HTMLElement, onConfirm: () => void, setActive: (active: HTMLElement | null) => void, twemojiOptions?: TwemojiOptions) => 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,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,mBAC9B,cAAc,SAmDlC,CAAC"}
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../../src/filter/helper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAKvC,eAAO,MAAM,YAAY,SACjB,UAAU,QACV,MAAM,MACR,MAAM,QACJ,MAAM,mBACK,MAAM,MAAM,MAAM,KAAK,IAAI,qBACzB,MAAM,KAAK,IAAI,YAsBnC,CAAA;AAED,eAAO,MAAM,kBAAkB,SACvB,KAAK,EAAE,YACH,WAAW,aACV,MAAM,IAAI,sBACD,WAAW,GAAG,IAAI,KAAK,IAAI,mBAC9B,cAAc,SAuChC,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { Plugin, PluginKey } from '@milkdown/prose/state';
2
- import { ThemeUtils } from '@milkdown/utils';
2
+ import type { ThemeUtils } from '@milkdown/utils';
3
3
  export declare const key: PluginKey<any>;
4
4
  export declare const filter: (utils: ThemeUtils, maxListSize: number, twemojiOptions?: TwemojiOptions) => Plugin<any>;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filter/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAM7C,eAAO,MAAM,GAAG,gBAAyC,CAAC;AAE1D,eAAO,MAAM,MAAM,UAAW,UAAU,eAAe,MAAM,mBAAmB,cAAc,gBA8K7F,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/filter/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAMjD,eAAO,MAAM,GAAG,gBAAyC,CAAA;AAEzD,eAAO,MAAM,MAAM,UAAW,UAAU,eAAe,MAAM,mBAAmB,cAAc,gBA2M7F,CAAA"}
@@ -1,3 +1,3 @@
1
- import { Emotion, ThemeManager } from '@milkdown/core';
1
+ import type { Emotion, ThemeManager } from '@milkdown/core';
2
2
  export declare const injectStyle: (themeManager: ThemeManager, { css, cx }: Emotion) => string;
3
3
  //# sourceMappingURL=style.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/filter/style.ts"],"names":[],"mappings":"AACA,OAAO,EAEH,OAAO,EAIP,YAAY,EAGf,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,WAAW,iBAAkB,YAAY,eAAe,OAAO,WAyC3E,CAAC"}
1
+ {"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/filter/style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,OAAO,EACP,YAAY,EACb,MAAM,gBAAgB,CAAA;AAUvB,eAAO,MAAM,WAAW,iBAAkB,YAAY,eAAe,OAAO,WA6C3E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAG3C,cAAc,QAAQ,CAAC;AAEvB,eAAO,MAAM,KAAK,oKAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,cAAc,QAAQ,CAAA;AAEtB,eAAO,MAAM,KAAK,oKAAiC,CAAA"}
package/lib/index.es.js CHANGED
@@ -1,60 +1,59 @@
1
- import { createNode as S, AtomList as b } from "@milkdown/utils";
2
- import { missingRootElement as T, expectDomTypeError as D } from "@milkdown/exception";
3
- import { InputRule as P } from "@milkdown/prose/inputrules";
4
- import M from "node-emoji";
5
- import A from "remark-emoji";
6
- import { calculateNodePosition as H } from "@milkdown/prose";
7
- import { PluginKey as O, Plugin as _ } from "@milkdown/prose/state";
8
- import F from "twemoji";
9
- import { ThemeBorder as I, ThemeShadow as R, ThemeSize as K, ThemeFont as B, ThemeColor as $ } from "@milkdown/core";
10
- import z from "emoji-regex";
11
- const W = /:\+1|:-1|:[\w-]+/, U = /:\+1:|:-1:|:[\w-]+:/, q = /(:([^:\s]+):)$/, J = (i) => ({ title: i }), j = (i, a) => F.parse(i, { attributes: J, ...a }), G = (i, a, u, e, l, o) => {
12
- if (i.composing)
1
+ import { createNode as _, AtomList as O } from "@milkdown/utils";
2
+ import { missingRootElement as N, expectDomTypeError as H } from "@milkdown/exception";
3
+ import { InputRule as F } from "@milkdown/prose/inputrules";
4
+ import A from "node-emoji";
5
+ import I from "remark-emoji";
6
+ import { calculateNodePosition as $ } from "@milkdown/prose";
7
+ import { PluginKey as R, Plugin as B } from "@milkdown/prose/state";
8
+ import K from "twemoji";
9
+ import { ThemeBorder as W, ThemeShadow as z, ThemeScrollbar as U, ThemeSize as q, ThemeFont as J, ThemeColor as G } from "@milkdown/core";
10
+ import Q from "emoji-regex";
11
+ const X = /:\+1|:-1|:[\w-]+/, Y = /:\+1:|:-1:|:[\w-]+:/, Z = /(:([^:\s]+):)$/, V = (n) => ({ title: n }), C = (n, s) => K.parse(n, { attributes: V, ...s }), ee = (n, s, d, e, l, o) => {
12
+ if (n.composing)
13
13
  return !1;
14
- const { state: n } = i, s = n.doc.resolve(a);
15
- if (s.parent.type.spec.code)
14
+ const { state: r } = n, i = r.doc.resolve(s);
15
+ if (i.parent.type.spec.code)
16
16
  return !1;
17
- const c = (s.parent.textBetween(Math.max(0, s.parentOffset - 10), s.parentOffset, void 0, "\uFFFC") + e).toLowerCase();
18
- if (U.test(c))
17
+ const a = (i.parent.textBetween(Math.max(0, i.parentOffset - 10), i.parentOffset, void 0, "\uFFFC") + e).toLowerCase();
18
+ if (Y.test(a))
19
19
  return !1;
20
- const t = W.exec(c);
21
- if (t && t[0] && c.endsWith(t[0])) {
22
- const r = t[0];
23
- return l(a - (r.length - e.length), u), o(r), !0;
20
+ const t = X.exec(a);
21
+ if (t && t[0] && a.endsWith(t[0])) {
22
+ const m = t[0];
23
+ return l(s - (m.length - e.length), d), o(m), !0;
24
24
  }
25
25
  return !1;
26
- }, Q = (i, a, u, e, l, o) => {
27
- for (; a.firstChild; )
28
- a.firstChild.remove();
29
- i.forEach(({ emoji: n, key: s }, c) => {
30
- const t = document.createElement("div");
31
- t.className = "milkdown-emoji-filter_item";
32
- const r = document.createElement("span");
33
- r.innerHTML = j(n, o), r.className = "milkdown-emoji-filter_item-emoji";
34
- const h = document.createElement("span");
35
- h.textContent = ":" + s + ":", h.className = "milkdown-emoji-filter_item-key", t.appendChild(r), t.appendChild(h), a.appendChild(t), c === 0 && (t.classList.add("active"), l(t));
36
- const p = (d) => {
37
- u && u.classList.remove("active");
38
- const { target: m } = d;
39
- m instanceof HTMLElement && (m.classList.add("active"), l(m));
40
- }, g = (d) => {
41
- const { target: m } = d;
42
- m instanceof HTMLElement && m.classList.remove("active");
43
- }, f = (d) => {
44
- d.preventDefault(), e();
26
+ }, te = (n, s, d, e, l) => {
27
+ for (; s.firstChild; )
28
+ s.firstChild.remove();
29
+ n.forEach(({ emoji: o, key: r }, i) => {
30
+ const a = document.createElement("div");
31
+ a.className = "milkdown-emoji-filter_item";
32
+ const t = document.createElement("span");
33
+ t.innerHTML = C(o, l), t.className = "milkdown-emoji-filter_item-emoji";
34
+ const m = document.createElement("span");
35
+ m.textContent = `:${r}:`, m.className = "milkdown-emoji-filter_item-key", a.appendChild(t), a.appendChild(m), s.appendChild(a), i === 0 && e(a);
36
+ const c = (u) => {
37
+ const { target: j } = u;
38
+ j instanceof HTMLElement && e(j);
39
+ }, w = (u) => {
40
+ u.preventDefault(), d();
45
41
  };
46
- t.addEventListener("mouseenter", p), t.addEventListener("mouseleave", g), t.addEventListener("mousedown", f);
42
+ a.addEventListener("mouseenter", c), a.addEventListener("mousedown", w);
47
43
  });
48
- }, X = (i, { css: a, cx: u }) => {
49
- const e = i.get(I, void 0), l = i.get(R, void 0), o = i.get(K, "radius"), n = i.get(B, "typography"), s = (t, r = 1) => i.get($, [t, r]), c = a`
44
+ }, ne = (n, { css: s, cx: d }) => {
45
+ const e = n.get(W, void 0), l = n.get(z, void 0), o = n.get(U, void 0), r = n.get(q, "radius"), i = n.get(J, "typography"), a = (m, c = 1) => n.get(G, [m, c]), t = s`
46
+ min-height: 36px;
47
+ max-height: 320px;
48
+ overflow-y: auto;
49
+ border-radius: ${r};
50
50
  position: absolute;
51
+ background: ${a("surface")};
52
+
51
53
  &.hide {
52
54
  display: none;
53
55
  }
54
56
 
55
- border-radius: ${o};
56
- background: ${s("surface")};
57
-
58
57
  .milkdown-emoji-filter_item {
59
58
  display: flex;
60
59
  gap: 8px;
@@ -64,11 +63,11 @@ const W = /:\+1|:-1|:[\w-]+/, U = /:\+1:|:-1:|:[\w-]+:/, q = /(:([^:\s]+):)$/, J
64
63
  justify-content: flex-start;
65
64
  cursor: pointer;
66
65
  line-height: 2;
67
- font-family: ${n};
66
+ font-family: ${i};
68
67
  font-size: 14px;
69
68
  &.active {
70
- background: ${s("secondary", 0.12)};
71
- color: ${s("primary")};
69
+ background: ${a("secondary", 0.12)};
70
+ color: ${a("primary")};
72
71
  }
73
72
  }
74
73
 
@@ -79,132 +78,147 @@ const W = /:\+1|:-1|:[\w-]+/, U = /:\+1:|:-1:|:[\w-]+:/, q = /(:([^:\s]+):)$/, J
79
78
  vertical-align: -1.5px;
80
79
  }
81
80
  `;
82
- return u(e, l, c);
83
- }, Y = new O("MILKDOWN_EMOJI_FILTER"), Z = (i, a, u) => {
84
- let e = !1, l = 0, o = "", n = null;
85
- const s = () => {
86
- e = !1, l = 0, o = "", n = null;
81
+ return d(e, l, o, t);
82
+ }, oe = new R("MILKDOWN_EMOJI_FILTER"), re = (n, s, d) => {
83
+ let e = !1, l = 0, o = "", r = null;
84
+ const i = () => {
85
+ e = !1, l = 0, o = "", r = null;
86
+ }, a = (t) => {
87
+ r && r.classList.remove("active"), t && t.classList.add("active"), r = t;
87
88
  };
88
- return new _({
89
- key: Y,
89
+ return new B({
90
+ key: oe,
90
91
  props: {
91
- handleKeyDown(c, t) {
92
- return ["Delete", "Backspace"].includes(t.key) ? (o = o.slice(0, -1), o.length <= 1 && s(), !1) : !(!e || !["ArrowUp", "ArrowDown", "Enter"].includes(t.key));
92
+ handleKeyDown(t, m) {
93
+ return ["Delete", "Backspace"].includes(m.key) ? (o = o.slice(0, -1), o.length <= 1 && i(), !1) : !(!e || !["ArrowUp", "ArrowDown", "Enter"].includes(m.key));
93
94
  },
94
- handleTextInput(c, t, r, h) {
95
- return e = G(c, t, r, h, (p) => {
96
- l = p;
97
- }, (p) => {
98
- o = p;
99
- }), e || s(), !1;
95
+ handleTextInput(t, m, c, w) {
96
+ return e = ee(
97
+ t,
98
+ m,
99
+ c,
100
+ w,
101
+ (u) => {
102
+ l = u;
103
+ },
104
+ (u) => {
105
+ o = u;
106
+ }
107
+ ), e || i(), !1;
100
108
  }
101
109
  },
102
- view: (c) => {
103
- const { parentNode: t } = c.dom;
104
- if (!t)
105
- throw T();
106
- const r = document.createElement("div");
107
- r.classList.add("milkdown-emoji-filter", "hide"), i.themeManager.onFlush(() => {
108
- const f = r.className.split(" ").filter((m) => ["hide", "milkdown-emoji-filter"].includes(m));
109
- r.className = f.join(" ");
110
- const d = i.getStyle((m) => X(i.themeManager, m));
111
- d && d.split(" ").forEach((m) => r.classList.add(m));
110
+ view: (t) => {
111
+ const { parentNode: m } = t.dom;
112
+ if (!m)
113
+ throw N();
114
+ const c = document.createElement("div");
115
+ c.classList.add("milkdown-emoji-filter", "hide"), n.themeManager.onFlush(() => {
116
+ const h = c.className.split(" ").filter((f) => ["hide", "milkdown-emoji-filter"].includes(f));
117
+ c.className = h.join(" ");
118
+ const p = n.getStyle((f) => ne(n.themeManager, f));
119
+ p && p.split(" ").forEach((f) => c.classList.add(f));
112
120
  });
113
- const h = () => {
114
- var m;
115
- if (!n)
121
+ const w = () => {
122
+ var f;
123
+ if (!r)
116
124
  return;
117
- const { tr: f } = c.state, d = c.state.schema.node("emoji", { html: (m = n.firstElementChild) == null ? void 0 : m.innerHTML });
118
- c.dispatch(f.delete(l, l + o.length).insert(l, d)), s(), r.classList.add("hide");
125
+ const { tr: h } = t.state, p = t.state.schema.node("emoji", { html: (f = r.firstElementChild) == null ? void 0 : f.innerHTML });
126
+ t.dispatch(h.delete(l, l + o.length).insert(l, p)), i(), c.classList.add("hide");
119
127
  };
120
- t.appendChild(r);
121
- const p = (f) => {
122
- if (!e || !(f instanceof KeyboardEvent))
128
+ m.appendChild(c);
129
+ const u = (h) => {
130
+ if (!e || !(h instanceof KeyboardEvent))
123
131
  return;
124
- const { key: d } = f;
125
- if (d === "Enter") {
126
- h();
132
+ const { key: p } = h;
133
+ if (p === "Enter") {
134
+ w();
127
135
  return;
128
136
  }
129
- if (["ArrowDown", "ArrowUp"].includes(d)) {
130
- const m = d === "ArrowDown" ? (n == null ? void 0 : n.nextElementSibling) || r.firstElementChild : (n == null ? void 0 : n.previousElementSibling) || r.lastElementChild;
131
- if (n && n.classList.remove("active"), !m)
137
+ if (["ArrowDown", "ArrowUp"].includes(p)) {
138
+ const f = p === "ArrowDown" ? (r == null ? void 0 : r.nextElementSibling) || c.firstElementChild : (r == null ? void 0 : r.previousElementSibling) || c.lastElementChild;
139
+ if (!f)
132
140
  return;
133
- m.classList.add("active"), n = m;
134
- return;
141
+ a(f);
135
142
  }
136
- }, g = (f) => {
137
- !e || (f.stopPropagation(), s(), r.classList.add("hide"));
143
+ }, j = (h) => {
144
+ !e || (h.stopPropagation(), i(), c.classList.add("hide"));
138
145
  };
139
- return t.addEventListener("keydown", p), t.addEventListener("mousedown", g), {
140
- update: (f) => {
141
- const { selection: d } = f.state;
142
- if (d.from - d.to !== 0 || !e)
143
- return s(), r.classList.add("hide"), null;
144
- const m = M.search(o).slice(0, a), { node: N } = f.domAtPos(l);
145
- return m.length === 0 || !N ? (r.classList.add("hide"), null) : (r.classList.remove("hide"), Q(m, r, n, h, (w) => {
146
- n = w;
147
- }, u), H(f, r, (w, E, y) => {
148
- const L = r.parentElement;
149
- if (!L)
150
- throw T();
151
- const x = f.coordsAtPos(l);
152
- let v = x.left - y.left, k = w.bottom - y.top + 14 + L.scrollTop;
153
- return v < 0 && (v = 0), window.innerHeight - x.bottom < E.height && (k = w.top - y.top - E.height - 14 + L.scrollTop), [k, v];
146
+ return m.addEventListener("keydown", u), m.addEventListener("mousedown", j), {
147
+ update: (h) => {
148
+ const { selection: p } = h.state;
149
+ if (p.from - p.to !== 0 || !e)
150
+ return i(), c.classList.add("hide"), null;
151
+ const f = A.search(o).slice(0, s), { node: D } = h.domAtPos(l);
152
+ return f.length === 0 || !D ? (c.classList.add("hide"), null) : (c.style.maxHeight = "", c.classList.remove("hide"), te(f, c, w, a, d), $(h, c, (me, v, y) => {
153
+ const k = c.parentElement;
154
+ if (!k)
155
+ throw N();
156
+ const x = h.coordsAtPos(l);
157
+ let E = x.left - y.left;
158
+ E < 0 && (E = 0);
159
+ let L, g;
160
+ const T = x.top - y.top, b = y.height + y.top - x.bottom;
161
+ b >= v.height + 28 ? L = "bottom" : T >= v.height + 28 ? L = "top" : b >= T ? (L = "bottom", g = b - 28) : (L = "top", g = T - 28), (T < 0 || b < 0) && (g = y.height - (x.bottom - x.top) - 28, g > v.height && (g = void 0));
162
+ const P = L === "top" ? x.top - y.top - (g != null ? g : v.height) - 14 + k.scrollTop : x.bottom - y.top + 14 + k.scrollTop;
163
+ c.style.maxHeight = g !== void 0 && g > 0 ? `${g}px` : "";
164
+ const M = k.clientWidth - (c.offsetWidth + 4);
165
+ return E > M && (E = M), [P, E];
154
166
  }), null);
155
167
  },
156
168
  destroy: () => {
157
- t.removeEventListener("keydown", p), t.removeEventListener("mousedown", g), r.remove();
169
+ m.removeEventListener("keydown", u), m.removeEventListener("mousedown", j), c.remove();
158
170
  }
159
171
  };
160
172
  }
161
173
  });
162
- }, C = z(), V = (i) => !!i.children, ee = (i) => !!i.value;
163
- function te(i, a) {
164
- return u(i, 0, null)[0];
165
- function u(e, l, o) {
166
- if (V(e)) {
167
- const n = [];
168
- for (let s = 0, c = e.children.length; s < c; s++) {
169
- const t = e.children[s];
174
+ }, S = Q(), ie = (n) => !!n.children, se = (n) => !!n.value;
175
+ function le(n, s) {
176
+ return d(n, 0, null)[0];
177
+ function d(e, l, o) {
178
+ if (ie(e)) {
179
+ const r = [];
180
+ for (let i = 0, a = e.children.length; i < a; i++) {
181
+ const t = e.children[i];
170
182
  if (t) {
171
- const r = u(t, s, e);
172
- if (r)
173
- for (let h = 0, p = r.length; h < p; h++) {
174
- const g = r[h];
175
- g && n.push(g);
183
+ const m = d(t, i, e);
184
+ if (m)
185
+ for (let c = 0, w = m.length; c < w; c++) {
186
+ const u = m[c];
187
+ u && r.push(u);
176
188
  }
177
189
  }
178
190
  }
179
- e.children = n;
191
+ e.children = r;
180
192
  }
181
- return a(e, l, o);
193
+ return s(e, l, o);
182
194
  }
183
195
  }
184
- const ne = (i) => () => {
185
- function a(u) {
186
- te(u, (e) => {
187
- if (!ee(e))
196
+ const ce = (n) => () => {
197
+ function s(d) {
198
+ le(d, (e) => {
199
+ if (!se(e))
188
200
  return [e];
189
201
  const l = e.value, o = [];
190
- let n, s = l;
191
- for (; n = C.exec(s); ) {
192
- const { index: c } = n, t = n[0];
193
- t && (c > 0 && o.push({ ...e, value: s.slice(0, c) }), o.push({ ...e, value: j(t, i), type: "emoji" }), s = s.slice(c + t.length)), C.lastIndex = 0;
202
+ let r, i = l;
203
+ for (; r = S.exec(i); ) {
204
+ const { index: a } = r, t = r[0];
205
+ t && (a > 0 && o.push({ ...e, value: i.slice(0, a) }), o.push({ ...e, value: C(t, n), type: "emoji" }), i = i.slice(a + t.length)), S.lastIndex = 0;
194
206
  }
195
- return s.length && o.push({ ...e, value: s }), o;
207
+ return i.length && o.push({ ...e, value: i }), o;
196
208
  });
197
209
  }
198
- return a;
199
- }, re = S((i, a) => {
200
- const u = () => i.getStyle(({ css: e }) => e`
210
+ return s;
211
+ }, ae = _((n, s) => {
212
+ const d = () => n.getStyle(
213
+ ({ css: e }) => e`
201
214
  .emoji {
202
215
  height: 1em;
203
216
  width: 1em;
204
217
  margin: 0 1px 0 1.5px;
205
218
  vertical-align: -1.5px;
206
219
  }
207
- `);
220
+ `
221
+ );
208
222
  return {
209
223
  id: "emoji",
210
224
  schema: () => ({
@@ -221,15 +235,15 @@ const ne = (i) => () => {
221
235
  tag: 'span[data-type="emoji"]',
222
236
  getAttrs: (e) => {
223
237
  if (!(e instanceof HTMLElement))
224
- throw D(e);
238
+ throw H(e);
225
239
  return { html: e.innerHTML };
226
240
  }
227
241
  }
228
242
  ],
229
243
  toDOM: (e) => {
230
244
  const l = document.createElement("span");
231
- return l.classList.add("emoji-wrapper"), l.dataset.type = "emoji", i.themeManager.onFlush(() => {
232
- const o = u();
245
+ return l.classList.add("emoji-wrapper"), l.dataset.type = "emoji", n.themeManager.onFlush(() => {
246
+ const o = d();
233
247
  o && l.classList.add(o);
234
248
  }), l.innerHTML = e.attrs.html, { dom: l };
235
249
  },
@@ -244,32 +258,32 @@ const ne = (i) => () => {
244
258
  runner: (e, l) => {
245
259
  const o = document.createElement("span");
246
260
  o.innerHTML = l.attrs.html;
247
- const n = o.querySelector("img"), s = n == null ? void 0 : n.title;
248
- o.remove(), e.addNode("text", void 0, s);
261
+ const r = o.querySelector("img"), i = r == null ? void 0 : r.title;
262
+ o.remove(), e.addNode("text", void 0, i);
249
263
  }
250
264
  }
251
265
  }),
252
266
  inputRules: (e) => [
253
- new P(q, (l, o, n, s) => {
254
- const c = o[0];
255
- if (!c)
267
+ new F(Z, (l, o, r, i) => {
268
+ const a = o[0];
269
+ if (!a)
256
270
  return null;
257
- const t = M.get(c);
258
- if (!t || c.includes(t))
271
+ const t = A.get(a);
272
+ if (!t || a.includes(t))
259
273
  return null;
260
- const r = j(t, a == null ? void 0 : a.twemojiOptions);
261
- return l.tr.setMeta("emoji", !0).replaceRangeWith(n, s, e.create({ html: r })).scrollIntoView();
274
+ const m = C(t, s == null ? void 0 : s.twemojiOptions);
275
+ return l.tr.setMeta("emoji", !0).replaceRangeWith(r, i, e.create({ html: m })).scrollIntoView();
262
276
  })
263
277
  ],
264
- remarkPlugins: () => [A, ne(a == null ? void 0 : a.twemojiOptions)],
278
+ remarkPlugins: () => [I, ce(s == null ? void 0 : s.twemojiOptions)],
265
279
  prosePlugins: () => {
266
280
  var e;
267
- return [Z(i, (e = a == null ? void 0 : a.maxListSize) != null ? e : 6, a == null ? void 0 : a.twemojiOptions)];
281
+ return [re(n, (e = s == null ? void 0 : s.maxListSize) != null ? e : 6, s == null ? void 0 : s.twemojiOptions)];
268
282
  }
269
283
  };
270
- }), he = b.create([re()]);
284
+ }), Ee = O.create([ae()]);
271
285
  export {
272
- he as emoji,
273
- re as emojiNode
286
+ Ee as emoji,
287
+ ae as emojiNode
274
288
  };
275
289
  //# sourceMappingURL=index.es.js.map
@@ -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 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: 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, 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.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 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 { 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":[],"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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"}