@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.
- 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 +166 -152
- 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 +15 -15
- package/src/constant.ts +3 -3
- package/src/filter/helper.ts +66 -77
- package/src/filter/index.ts +208 -179
- package/src/filter/style.ts +28 -21
- 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/constant.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.d.ts","sourceRoot":"","sources":["../src/constant.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,IAAI,QAAqB,
|
|
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"}
|
package/lib/filter/helper.d.ts
CHANGED
|
@@ -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,
|
|
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,
|
|
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"}
|
package/lib/filter/index.d.ts
CHANGED
|
@@ -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,
|
|
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"}
|
package/lib/filter/style.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../src/filter/style.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
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"}
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,
|
|
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
|
|
2
|
-
import { missingRootElement as
|
|
3
|
-
import { InputRule as
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import { calculateNodePosition as
|
|
7
|
-
import { PluginKey as
|
|
8
|
-
import
|
|
9
|
-
import { ThemeBorder as
|
|
10
|
-
import
|
|
11
|
-
const
|
|
12
|
-
if (
|
|
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:
|
|
15
|
-
if (
|
|
14
|
+
const { state: r } = n, i = r.doc.resolve(s);
|
|
15
|
+
if (i.parent.type.spec.code)
|
|
16
16
|
return !1;
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
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 =
|
|
21
|
-
if (t && t[0] &&
|
|
22
|
-
const
|
|
23
|
-
return l(
|
|
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
|
-
},
|
|
27
|
-
for (;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
|
|
42
|
+
a.addEventListener("mouseenter", c), a.addEventListener("mousedown", w);
|
|
47
43
|
});
|
|
48
|
-
},
|
|
49
|
-
const e =
|
|
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: ${
|
|
66
|
+
font-family: ${i};
|
|
68
67
|
font-size: 14px;
|
|
69
68
|
&.active {
|
|
70
|
-
background: ${
|
|
71
|
-
color: ${
|
|
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
|
|
83
|
-
},
|
|
84
|
-
let e = !1, l = 0, o = "",
|
|
85
|
-
const
|
|
86
|
-
e = !1, l = 0, o = "",
|
|
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:
|
|
89
|
+
return new B({
|
|
90
|
+
key: oe,
|
|
90
91
|
props: {
|
|
91
|
-
handleKeyDown(
|
|
92
|
-
return ["Delete", "Backspace"].includes(
|
|
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(
|
|
95
|
-
return e =
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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: (
|
|
103
|
-
const { parentNode:
|
|
104
|
-
if (!
|
|
105
|
-
throw
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
const
|
|
111
|
-
|
|
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
|
|
114
|
-
var
|
|
115
|
-
if (!
|
|
121
|
+
const w = () => {
|
|
122
|
+
var f;
|
|
123
|
+
if (!r)
|
|
116
124
|
return;
|
|
117
|
-
const { tr:
|
|
118
|
-
|
|
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
|
-
|
|
121
|
-
const
|
|
122
|
-
if (!e || !(
|
|
128
|
+
m.appendChild(c);
|
|
129
|
+
const u = (h) => {
|
|
130
|
+
if (!e || !(h instanceof KeyboardEvent))
|
|
123
131
|
return;
|
|
124
|
-
const { key:
|
|
125
|
-
if (
|
|
126
|
-
|
|
132
|
+
const { key: p } = h;
|
|
133
|
+
if (p === "Enter") {
|
|
134
|
+
w();
|
|
127
135
|
return;
|
|
128
136
|
}
|
|
129
|
-
if (["ArrowDown", "ArrowUp"].includes(
|
|
130
|
-
const
|
|
131
|
-
if (
|
|
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
|
-
|
|
134
|
-
return;
|
|
141
|
+
a(f);
|
|
135
142
|
}
|
|
136
|
-
},
|
|
137
|
-
!e || (
|
|
143
|
+
}, j = (h) => {
|
|
144
|
+
!e || (h.stopPropagation(), i(), c.classList.add("hide"));
|
|
138
145
|
};
|
|
139
|
-
return
|
|
140
|
-
update: (
|
|
141
|
-
const { selection:
|
|
142
|
-
if (
|
|
143
|
-
return
|
|
144
|
-
const
|
|
145
|
-
return
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
let
|
|
153
|
-
|
|
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
|
-
|
|
169
|
+
m.removeEventListener("keydown", u), m.removeEventListener("mousedown", j), c.remove();
|
|
158
170
|
}
|
|
159
171
|
};
|
|
160
172
|
}
|
|
161
173
|
});
|
|
162
|
-
},
|
|
163
|
-
function
|
|
164
|
-
return
|
|
165
|
-
function
|
|
166
|
-
if (
|
|
167
|
-
const
|
|
168
|
-
for (let
|
|
169
|
-
const t = e.children[
|
|
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
|
|
172
|
-
if (
|
|
173
|
-
for (let
|
|
174
|
-
const
|
|
175
|
-
|
|
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 =
|
|
191
|
+
e.children = r;
|
|
180
192
|
}
|
|
181
|
-
return
|
|
193
|
+
return s(e, l, o);
|
|
182
194
|
}
|
|
183
195
|
}
|
|
184
|
-
const
|
|
185
|
-
function
|
|
186
|
-
|
|
187
|
-
if (!
|
|
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
|
|
191
|
-
for (;
|
|
192
|
-
const { index:
|
|
193
|
-
t && (
|
|
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
|
|
207
|
+
return i.length && o.push({ ...e, value: i }), o;
|
|
196
208
|
});
|
|
197
209
|
}
|
|
198
|
-
return
|
|
199
|
-
},
|
|
200
|
-
const
|
|
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
|
|
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",
|
|
232
|
-
const o =
|
|
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
|
|
248
|
-
o.remove(), e.addNode("text", void 0,
|
|
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
|
|
254
|
-
const
|
|
255
|
-
if (!
|
|
267
|
+
new F(Z, (l, o, r, i) => {
|
|
268
|
+
const a = o[0];
|
|
269
|
+
if (!a)
|
|
256
270
|
return null;
|
|
257
|
-
const t =
|
|
258
|
-
if (!t ||
|
|
271
|
+
const t = A.get(a);
|
|
272
|
+
if (!t || a.includes(t))
|
|
259
273
|
return null;
|
|
260
|
-
const
|
|
261
|
-
return l.tr.setMeta("emoji", !0).replaceRangeWith(
|
|
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: () => [
|
|
278
|
+
remarkPlugins: () => [I, ce(s == null ? void 0 : s.twemojiOptions)],
|
|
265
279
|
prosePlugins: () => {
|
|
266
280
|
var e;
|
|
267
|
-
return [
|
|
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
|
-
}),
|
|
284
|
+
}), Ee = O.create([ae()]);
|
|
271
285
|
export {
|
|
272
|
-
|
|
273
|
-
|
|
286
|
+
Ee as emoji,
|
|
287
|
+
ae as emojiNode
|
|
274
288
|
};
|
|
275
289
|
//# sourceMappingURL=index.es.js.map
|
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 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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"}
|