@milkdown/plugin-emoji 7.6.2 → 7.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@ The emoji plugin of [milkdown](https://milkdown.dev/).
4
4
 
5
5
  # Official Documentation
6
6
 
7
- Documentation can be found on the [Milkdown website](https://milkdown.dev/docs/api/plugin-emoji).
7
+ Documentation can be found on the [Milkdown website](https://milkdown.dev/).
8
8
 
9
9
  # License
10
10
 
package/lib/index.es.js CHANGED
@@ -1,78 +1,91 @@
1
- import { expectDomTypeError as M } from "@milkdown/exception";
2
- import { InputRule as R } from "@milkdown/prose/inputrules";
3
- import { $nodeAttr as v, $nodeSchema as x, $remark as y, $inputRule as T } from "@milkdown/utils";
4
- import { get as P } from "node-emoji";
5
- import A from "remark-emoji";
6
- import I from "twemoji";
7
- import L from "emoji-regex";
8
- const b = (n) => ({ title: n });
9
- function w(n, t) {
10
- return I.parse(n, {
11
- attributes: b,
1
+ import { expectDomTypeError } from "@milkdown/exception";
2
+ import { InputRule } from "@milkdown/prose/inputrules";
3
+ import { $nodeAttr, $nodeSchema, $remark, $inputRule } from "@milkdown/utils";
4
+ import { get } from "node-emoji";
5
+ import remarkEmoji from "remark-emoji";
6
+ import twemoji from "twemoji";
7
+ import emojiRegex from "emoji-regex";
8
+ const setAttr = (text) => ({ title: text });
9
+ function parse(emoji2, twemojiOptions) {
10
+ return twemoji.parse(emoji2, {
11
+ attributes: setAttr,
12
12
  base: "https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/",
13
- ...t
13
+ ...twemojiOptions
14
14
  });
15
15
  }
16
- const k = L(), C = (n) => !!n.children, H = (n) => !!n.value;
17
- function S(n, t) {
18
- return m(n, 0, null)[0];
19
- function m(e, r, i) {
20
- if (C(e)) {
21
- const a = [];
22
- for (let o = 0, c = e.children.length; o < c; o++) {
23
- const l = e.children[o];
24
- if (l) {
25
- const f = m(l, o, e);
26
- if (f)
27
- for (let h = 0, N = f.length; h < N; h++) {
28
- const g = f[h];
29
- g && a.push(g);
16
+ const regex = emojiRegex();
17
+ const isParent = (node) => !!node.children;
18
+ const isLiteral = (node) => !!node.value;
19
+ function flatMap(ast, fn) {
20
+ return transform(ast, 0, null)[0];
21
+ function transform(node, index, parent) {
22
+ if (isParent(node)) {
23
+ const out = [];
24
+ for (let i = 0, n = node.children.length; i < n; i++) {
25
+ const nthChild = node.children[i];
26
+ if (nthChild) {
27
+ const xs = transform(nthChild, i, node);
28
+ if (xs) {
29
+ for (let j = 0, m = xs.length; j < m; j++) {
30
+ const item = xs[j];
31
+ if (item) out.push(item);
30
32
  }
33
+ }
31
34
  }
32
35
  }
33
- e.children = a;
36
+ node.children = out;
34
37
  }
35
- return t(e, r, i);
38
+ return fn(node, index, parent);
36
39
  }
37
40
  }
38
- const $ = (n) => {
39
- function t(m) {
40
- S(m, (e) => {
41
- if (!H(e)) return [e];
42
- if (e.type === "code") return [e];
43
- const r = e.value, i = [];
44
- let a, o = r;
45
- for (; a = k.exec(o); ) {
46
- const { index: c } = a, l = a[0];
47
- l && (c > 0 && i.push({ ...e, value: o.slice(0, c) }), i.push({
48
- ...e,
49
- value: w(l, n),
50
- type: "emoji"
51
- }), o = o.slice(c + l.length)), k.lastIndex = 0;
41
+ const twemojiPlugin = (twemojiOptions) => {
42
+ function transformer(tree) {
43
+ flatMap(tree, (node) => {
44
+ if (!isLiteral(node)) return [node];
45
+ if (node.type === "code") return [node];
46
+ const value = node.value;
47
+ const output = [];
48
+ let match;
49
+ let str = value;
50
+ while (match = regex.exec(str)) {
51
+ const { index } = match;
52
+ const emoji2 = match[0];
53
+ if (emoji2) {
54
+ if (index > 0) output.push({ ...node, value: str.slice(0, index) });
55
+ output.push({
56
+ ...node,
57
+ value: parse(emoji2, twemojiOptions),
58
+ type: "emoji"
59
+ });
60
+ str = str.slice(index + emoji2.length);
61
+ }
62
+ regex.lastIndex = 0;
52
63
  }
53
- return o.length && i.push({ ...e, value: o }), i;
64
+ if (str.length) output.push({ ...node, value: str });
65
+ return output;
54
66
  });
55
67
  }
56
- return t;
68
+ return transformer;
57
69
  };
58
- function s(n, t) {
59
- return Object.assign(n, {
70
+ function withMeta(plugin, meta) {
71
+ Object.assign(plugin, {
60
72
  meta: {
61
73
  package: "@milkdown/plugin-emoji",
62
- ...t
74
+ ...meta
63
75
  }
64
- }), n;
76
+ });
77
+ return plugin;
65
78
  }
66
- const j = v("emoji", () => ({
79
+ const emojiAttr = $nodeAttr("emoji", () => ({
67
80
  span: {},
68
81
  img: {}
69
82
  }));
70
- s(j, {
83
+ withMeta(emojiAttr, {
71
84
  displayName: "Attr<emoji>"
72
85
  });
73
- const u = x("emoji", (n) => ({
86
+ const emojiSchema = $nodeSchema("emoji", (ctx) => ({
74
87
  group: "inline",
75
- inline: !0,
88
+ inline: true,
76
89
  attrs: {
77
90
  html: {
78
91
  default: ""
@@ -81,86 +94,92 @@ const u = x("emoji", (n) => ({
81
94
  parseDOM: [
82
95
  {
83
96
  tag: 'span[data-type="emoji"]',
84
- getAttrs: (t) => {
85
- if (!(t instanceof HTMLElement)) throw M(t);
86
- return { html: t.innerHTML };
97
+ getAttrs: (dom) => {
98
+ if (!(dom instanceof HTMLElement)) throw expectDomTypeError(dom);
99
+ return { html: dom.innerHTML };
87
100
  }
88
101
  }
89
102
  ],
90
- toDOM: (t) => {
91
- var i;
92
- const m = n.get(j.key)(t), e = document.createElement("span");
93
- e.innerHTML = t.attrs.html;
94
- const r = (i = e.firstElementChild) == null ? void 0 : i.cloneNode();
95
- return e.remove(), r && r instanceof HTMLElement && Object.entries(m.img).forEach(
96
- ([a, o]) => r.setAttribute(a, o)
97
- ), ["span", { ...m.container, "data-type": "emoji" }, r];
103
+ toDOM: (node) => {
104
+ var _a;
105
+ const attrs = ctx.get(emojiAttr.key)(node);
106
+ const tmp = document.createElement("span");
107
+ tmp.innerHTML = node.attrs.html;
108
+ const dom = (_a = tmp.firstElementChild) == null ? void 0 : _a.cloneNode();
109
+ tmp.remove();
110
+ if (dom && dom instanceof HTMLElement)
111
+ Object.entries(attrs.img).forEach(
112
+ ([key, value]) => dom.setAttribute(key, value)
113
+ );
114
+ return ["span", { ...attrs.container, "data-type": "emoji" }, dom];
98
115
  },
99
116
  parseMarkdown: {
100
- match: ({ type: t }) => t === "emoji",
101
- runner: (t, m, e) => {
102
- t.addNode(e, { html: m.value });
117
+ match: ({ type }) => type === "emoji",
118
+ runner: (state, node, type) => {
119
+ state.addNode(type, { html: node.value });
103
120
  }
104
121
  },
105
122
  toMarkdown: {
106
- match: (t) => t.type.name === "emoji",
107
- runner: (t, m) => {
108
- const e = document.createElement("span");
109
- e.innerHTML = m.attrs.html;
110
- const r = e.querySelector("img"), i = (r == null ? void 0 : r.title) || (r == null ? void 0 : r.alt);
111
- e.remove(), t.addNode("text", void 0, i);
123
+ match: (node) => node.type.name === "emoji",
124
+ runner: (state, node) => {
125
+ const span = document.createElement("span");
126
+ span.innerHTML = node.attrs.html;
127
+ const img = span.querySelector("img");
128
+ const title = (img == null ? void 0 : img.title) || (img == null ? void 0 : img.alt);
129
+ span.remove();
130
+ state.addNode("text", void 0, title);
112
131
  }
113
132
  }
114
133
  }));
115
- s(u.node, {
134
+ withMeta(emojiSchema.node, {
116
135
  displayName: "NodeSchema<emoji>"
117
136
  });
118
- s(u.ctx, {
137
+ withMeta(emojiSchema.ctx, {
119
138
  displayName: "NodeSchemaCtx<emoji>"
120
139
  });
121
- const d = y(
140
+ const remarkEmojiPlugin = $remark(
122
141
  "remarkEmoji",
123
- () => A
142
+ () => remarkEmoji
124
143
  );
125
- s(d.plugin, {
144
+ withMeta(remarkEmojiPlugin.plugin, {
126
145
  displayName: "Remark<remarkEmojiPlugin>"
127
146
  });
128
- s(d.options, {
147
+ withMeta(remarkEmojiPlugin.options, {
129
148
  displayName: "RemarkConfig<remarkEmojiPlugin>"
130
149
  });
131
- const p = y("remarkTwemoji", () => $);
132
- s(p.plugin, {
150
+ const remarkTwemojiPlugin = $remark("remarkTwemoji", () => twemojiPlugin);
151
+ withMeta(remarkTwemojiPlugin.plugin, {
133
152
  displayName: "Remark<remarkTwemojiPlugin>"
134
153
  });
135
- s(p.options, {
154
+ withMeta(remarkTwemojiPlugin.options, {
136
155
  displayName: "RemarkConfig<remarkTwemojiPlugin>"
137
156
  });
138
- const E = T(
139
- (n) => new R(/(:([^:\s]+):)$/, (t, m, e, r) => {
140
- const i = m[0];
141
- if (!i) return null;
142
- const a = P(i);
143
- if (!a || i.includes(a)) return null;
144
- const o = w(a, n.get(p.options.key));
145
- return t.tr.setMeta("emoji", !0).replaceRangeWith(e, r, u.type(n).create({ html: o })).scrollIntoView();
157
+ const insertEmojiInputRule = $inputRule(
158
+ (ctx) => new InputRule(/(:([^:\s]+):)$/, (state, match, start, end) => {
159
+ const content = match[0];
160
+ if (!content) return null;
161
+ const got = get(content);
162
+ if (!got || content.includes(got)) return null;
163
+ const html = parse(got, ctx.get(remarkTwemojiPlugin.options.key));
164
+ return state.tr.setMeta("emoji", true).replaceRangeWith(start, end, emojiSchema.type(ctx).create({ html })).scrollIntoView();
146
165
  })
147
166
  );
148
- s(E, {
167
+ withMeta(insertEmojiInputRule, {
149
168
  displayName: "InputRule<insertEmojiInputRule>"
150
169
  });
151
- const F = [
152
- j,
153
- d,
154
- p,
155
- u,
156
- E
170
+ const emoji = [
171
+ emojiAttr,
172
+ remarkEmojiPlugin,
173
+ remarkTwemojiPlugin,
174
+ emojiSchema,
175
+ insertEmojiInputRule
157
176
  ].flat();
158
177
  export {
159
- F as emoji,
160
- j as emojiAttr,
161
- u as emojiSchema,
162
- E as insertEmojiInputRule,
163
- d as remarkEmojiPlugin,
164
- p as remarkTwemojiPlugin
178
+ emoji,
179
+ emojiAttr,
180
+ emojiSchema,
181
+ insertEmojiInputRule,
182
+ remarkEmojiPlugin,
183
+ remarkTwemojiPlugin
165
184
  };
166
185
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/__internal__/parse.ts","../src/__internal__/remark-twemoji.ts","../src/__internal__/with-meta.ts","../src/index.ts"],"sourcesContent":["import twemoji from 'twemoji'\n\nconst setAttr = (text: string) => ({ title: text })\n\n/// @internal\n/// This is copied from https://github.com/twitter/twemoji/blob/master/index.d.ts#L14\n/// The file is not released for some reason, so I have to copy it here.\nexport interface TwemojiOptions {\n /**\n * Default: Cloudflare\n */\n base?: string\n /**\n * Default: .png\n */\n ext?: string\n /**\n * Default: emoji\n */\n className?: string\n /**\n * Default: 72x72\n */\n size?: string | number\n /**\n * To render with SVG use `folder: svg, ext: .svg`\n */\n folder?: string\n /**\n * The function to invoke in order to generate image src(s).\n */\n callback?: (icon: string, options: object, variant: string) => string | false\n /**\n * The function to invoke in order to generate additional, custom attributes for the image tag.\n * Default () => ({})\n * @param icon the lower case HEX code point i.e. \"1f4a9\"\n * @param variant variant the optional \\uFE0F (\"as image\") variant, in case this info is anyhow meaningful. By default this is ignored.\n *\n */\n attributes?: (icon: string, variant: string) => object\n}\n\nexport function parse(emoji: string, twemojiOptions?: TwemojiOptions): string {\n return twemoji.parse(emoji, {\n attributes: setAttr,\n base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/',\n ...twemojiOptions,\n }) as unknown as string\n}\n","import type { Node, RemarkPluginRaw } from '@milkdown/transformer'\nimport emojiRegex from 'emoji-regex'\n\nimport { type TwemojiOptions, parse } from './parse'\n\nconst regex = emojiRegex()\n\nconst isParent = (node: Node): node is Node & { children: Node[] } =>\n !!(node as Node & { children: Node[] }).children\nconst isLiteral = (node: Node): node is Node & { value: string } =>\n !!(node as Node & { value: string }).value\n\nfunction flatMap(\n ast: Node,\n fn: (node: Node, index: number, parent: Node | null) => Node[]\n) {\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) 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: RemarkPluginRaw<TwemojiOptions> = (\n twemojiOptions\n) => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node)) return [node]\n\n // Should not convert code block\n if (node.type === 'code') return [node]\n\n const value = node.value\n const output: Array<Node & { value: 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) output.push({ ...node, value: str.slice(0, index) })\n\n output.push({\n ...node,\n value: parse(emoji, twemojiOptions),\n type: 'emoji',\n })\n str = str.slice(index + emoji.length)\n }\n regex.lastIndex = 0\n }\n if (str.length) output.push({ ...node, value: str })\n\n return output\n })\n }\n return transformer\n}\n","import type { Meta, MilkdownPlugin } from '@milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(\n plugin: T,\n meta: Partial<Meta> & Pick<Meta, 'displayName'>\n): T {\n Object.assign(plugin, {\n meta: {\n package: '@milkdown/plugin-emoji',\n ...meta,\n },\n })\n\n return plugin\n}\n","import type { MilkdownPlugin } from '@milkdown/ctx'\nimport type { RemarkPluginRaw } from '@milkdown/transformer'\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport { $inputRule, $nodeAttr, $nodeSchema, $remark } from '@milkdown/utils'\nimport { get } from 'node-emoji'\nimport type { RemarkEmojiOptions } from 'remark-emoji'\nimport remarkEmoji from 'remark-emoji'\n\nimport { parse } from './__internal__/parse'\nimport { twemojiPlugin } from './__internal__/remark-twemoji'\nimport { withMeta } from './__internal__/with-meta'\n\n/// HTML attributes for emoji node.\nexport const emojiAttr = $nodeAttr('emoji', () => ({\n span: {},\n img: {},\n}))\nwithMeta(emojiAttr, {\n displayName: 'Attr<emoji>',\n})\n\n/// Schema for emoji node.\nexport const emojiSchema = $nodeSchema('emoji', (ctx) => ({\n group: 'inline',\n inline: 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)) throw expectDomTypeError(dom)\n\n return { html: dom.innerHTML }\n },\n },\n ],\n toDOM: (node) => {\n const attrs = ctx.get(emojiAttr.key)(node)\n const tmp = document.createElement('span')\n tmp.innerHTML = node.attrs.html\n const dom = tmp.firstElementChild?.cloneNode()\n tmp.remove()\n if (dom && dom instanceof HTMLElement)\n Object.entries<string>(attrs.img).forEach(([key, value]) =>\n dom.setAttribute(key, value)\n )\n\n return ['span', { ...attrs.container, 'data-type': 'emoji' }, dom]\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 || img?.alt\n span.remove()\n state.addNode('text', undefined, title)\n },\n },\n}))\n\nwithMeta(emojiSchema.node, {\n displayName: 'NodeSchema<emoji>',\n})\nwithMeta(emojiSchema.ctx, {\n displayName: 'NodeSchemaCtx<emoji>',\n})\n\n/// This plugin wraps [remark-emoji](https://github.com/rhysd/remark-emoji).\nexport const remarkEmojiPlugin = $remark(\n 'remarkEmoji',\n () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>\n)\n\nwithMeta(remarkEmojiPlugin.plugin, {\n displayName: 'Remark<remarkEmojiPlugin>',\n})\n\nwithMeta(remarkEmojiPlugin.options, {\n displayName: 'RemarkConfig<remarkEmojiPlugin>',\n})\n\n/// This plugin is used for transforming emoji to twemoji.\nexport const remarkTwemojiPlugin = $remark('remarkTwemoji', () => twemojiPlugin)\n\nwithMeta(remarkTwemojiPlugin.plugin, {\n displayName: 'Remark<remarkTwemojiPlugin>',\n})\n\nwithMeta(remarkTwemojiPlugin.options, {\n displayName: 'RemarkConfig<remarkTwemojiPlugin>',\n})\n\n/// Input rule for inserting emoji.\n/// For example, `:smile:` will be replaced with `😄`.\nexport const insertEmojiInputRule = $inputRule(\n (ctx) =>\n new InputRule(/(:([^:\\s]+):)$/, (state, match, start, end) => {\n const content = match[0]\n if (!content) return null\n const got = get(content)\n if (!got || content.includes(got)) return null\n\n const html = parse(got, ctx.get(remarkTwemojiPlugin.options.key))\n\n return state.tr\n .setMeta('emoji', true)\n .replaceRangeWith(start, end, emojiSchema.type(ctx).create({ html }))\n .scrollIntoView()\n })\n)\n\nwithMeta(insertEmojiInputRule, {\n displayName: 'InputRule<insertEmojiInputRule>',\n})\n\n/// All plugins exported by this package.\nexport const emoji: MilkdownPlugin[] = [\n emojiAttr,\n remarkEmojiPlugin,\n remarkTwemojiPlugin,\n emojiSchema,\n insertEmojiInputRule,\n].flat()\n"],"names":["setAttr","text","parse","emoji","twemojiOptions","twemoji","regex","emojiRegex","isParent","node","isLiteral","flatMap","ast","fn","transform","index","parent","out","i","n","nthChild","xs","j","m","item","twemojiPlugin","transformer","tree","value","output","match","str","withMeta","plugin","meta","emojiAttr","$nodeAttr","emojiSchema","$nodeSchema","ctx","dom","expectDomTypeError","attrs","tmp","_a","key","type","state","span","img","title","remarkEmojiPlugin","$remark","remarkEmoji","remarkTwemojiPlugin","insertEmojiInputRule","$inputRule","InputRule","start","end","content","got","get","html"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/__internal__/parse.ts","../src/__internal__/remark-twemoji.ts","../src/__internal__/with-meta.ts","../src/index.ts"],"sourcesContent":["import twemoji from 'twemoji'\n\nconst setAttr = (text: string) => ({ title: text })\n\n/// @internal\n/// This is copied from https://github.com/twitter/twemoji/blob/master/index.d.ts#L14\n/// The file is not released for some reason, so I have to copy it here.\nexport interface TwemojiOptions {\n /**\n * Default: Cloudflare\n */\n base?: string\n /**\n * Default: .png\n */\n ext?: string\n /**\n * Default: emoji\n */\n className?: string\n /**\n * Default: 72x72\n */\n size?: string | number\n /**\n * To render with SVG use `folder: svg, ext: .svg`\n */\n folder?: string\n /**\n * The function to invoke in order to generate image src(s).\n */\n callback?: (icon: string, options: object, variant: string) => string | false\n /**\n * The function to invoke in order to generate additional, custom attributes for the image tag.\n * Default () => ({})\n * @param icon the lower case HEX code point i.e. \"1f4a9\"\n * @param variant variant the optional \\uFE0F (\"as image\") variant, in case this info is anyhow meaningful. By default this is ignored.\n *\n */\n attributes?: (icon: string, variant: string) => object\n}\n\nexport function parse(emoji: string, twemojiOptions?: TwemojiOptions): string {\n return twemoji.parse(emoji, {\n attributes: setAttr,\n base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/',\n ...twemojiOptions,\n }) as unknown as string\n}\n","import type { Node, RemarkPluginRaw } from '@milkdown/transformer'\nimport emojiRegex from 'emoji-regex'\n\nimport { type TwemojiOptions, parse } from './parse'\n\nconst regex = emojiRegex()\n\nconst isParent = (node: Node): node is Node & { children: Node[] } =>\n !!(node as Node & { children: Node[] }).children\nconst isLiteral = (node: Node): node is Node & { value: string } =>\n !!(node as Node & { value: string }).value\n\nfunction flatMap(\n ast: Node,\n fn: (node: Node, index: number, parent: Node | null) => Node[]\n) {\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) 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: RemarkPluginRaw<TwemojiOptions> = (\n twemojiOptions\n) => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node)) return [node]\n\n // Should not convert code block\n if (node.type === 'code') return [node]\n\n const value = node.value\n const output: Array<Node & { value: 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) output.push({ ...node, value: str.slice(0, index) })\n\n output.push({\n ...node,\n value: parse(emoji, twemojiOptions),\n type: 'emoji',\n })\n str = str.slice(index + emoji.length)\n }\n regex.lastIndex = 0\n }\n if (str.length) output.push({ ...node, value: str })\n\n return output\n })\n }\n return transformer\n}\n","import type { Meta, MilkdownPlugin } from '@milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(\n plugin: T,\n meta: Partial<Meta> & Pick<Meta, 'displayName'>\n): T {\n Object.assign(plugin, {\n meta: {\n package: '@milkdown/plugin-emoji',\n ...meta,\n },\n })\n\n return plugin\n}\n","import type { MilkdownPlugin } from '@milkdown/ctx'\nimport type { RemarkPluginRaw } from '@milkdown/transformer'\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport { $inputRule, $nodeAttr, $nodeSchema, $remark } from '@milkdown/utils'\nimport { get } from 'node-emoji'\nimport type { RemarkEmojiOptions } from 'remark-emoji'\nimport remarkEmoji from 'remark-emoji'\n\nimport { parse } from './__internal__/parse'\nimport { twemojiPlugin } from './__internal__/remark-twemoji'\nimport { withMeta } from './__internal__/with-meta'\n\n/// HTML attributes for emoji node.\nexport const emojiAttr = $nodeAttr('emoji', () => ({\n span: {},\n img: {},\n}))\nwithMeta(emojiAttr, {\n displayName: 'Attr<emoji>',\n})\n\n/// Schema for emoji node.\nexport const emojiSchema = $nodeSchema('emoji', (ctx) => ({\n group: 'inline',\n inline: 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)) throw expectDomTypeError(dom)\n\n return { html: dom.innerHTML }\n },\n },\n ],\n toDOM: (node) => {\n const attrs = ctx.get(emojiAttr.key)(node)\n const tmp = document.createElement('span')\n tmp.innerHTML = node.attrs.html\n const dom = tmp.firstElementChild?.cloneNode()\n tmp.remove()\n if (dom && dom instanceof HTMLElement)\n Object.entries<string>(attrs.img).forEach(([key, value]) =>\n dom.setAttribute(key, value)\n )\n\n return ['span', { ...attrs.container, 'data-type': 'emoji' }, dom]\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 || img?.alt\n span.remove()\n state.addNode('text', undefined, title)\n },\n },\n}))\n\nwithMeta(emojiSchema.node, {\n displayName: 'NodeSchema<emoji>',\n})\nwithMeta(emojiSchema.ctx, {\n displayName: 'NodeSchemaCtx<emoji>',\n})\n\n/// This plugin wraps [remark-emoji](https://github.com/rhysd/remark-emoji).\nexport const remarkEmojiPlugin = $remark(\n 'remarkEmoji',\n () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>\n)\n\nwithMeta(remarkEmojiPlugin.plugin, {\n displayName: 'Remark<remarkEmojiPlugin>',\n})\n\nwithMeta(remarkEmojiPlugin.options, {\n displayName: 'RemarkConfig<remarkEmojiPlugin>',\n})\n\n/// This plugin is used for transforming emoji to twemoji.\nexport const remarkTwemojiPlugin = $remark('remarkTwemoji', () => twemojiPlugin)\n\nwithMeta(remarkTwemojiPlugin.plugin, {\n displayName: 'Remark<remarkTwemojiPlugin>',\n})\n\nwithMeta(remarkTwemojiPlugin.options, {\n displayName: 'RemarkConfig<remarkTwemojiPlugin>',\n})\n\n/// Input rule for inserting emoji.\n/// For example, `:smile:` will be replaced with `😄`.\nexport const insertEmojiInputRule = $inputRule(\n (ctx) =>\n new InputRule(/(:([^:\\s]+):)$/, (state, match, start, end) => {\n const content = match[0]\n if (!content) return null\n const got = get(content)\n if (!got || content.includes(got)) return null\n\n const html = parse(got, ctx.get(remarkTwemojiPlugin.options.key))\n\n return state.tr\n .setMeta('emoji', true)\n .replaceRangeWith(start, end, emojiSchema.type(ctx).create({ html }))\n .scrollIntoView()\n })\n)\n\nwithMeta(insertEmojiInputRule, {\n displayName: 'InputRule<insertEmojiInputRule>',\n})\n\n/// All plugins exported by this package.\nexport const emoji: MilkdownPlugin[] = [\n emojiAttr,\n remarkEmojiPlugin,\n remarkTwemojiPlugin,\n emojiSchema,\n insertEmojiInputRule,\n].flat()\n"],"names":["emoji"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@milkdown/plugin-emoji",
3
3
  "type": "module",
4
- "version": "7.6.2",
4
+ "version": "7.6.4",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -37,14 +37,14 @@
37
37
  "tslib": "^2.8.1",
38
38
  "twemoji": "^14.0.2",
39
39
  "unist-util-visit": "^5.0.0",
40
- "@milkdown/exception": "7.6.2",
41
- "@milkdown/utils": "7.6.2"
40
+ "@milkdown/utils": "7.6.4",
41
+ "@milkdown/exception": "7.6.4"
42
42
  },
43
43
  "devDependencies": {
44
- "@milkdown/core": "7.6.2",
45
- "@milkdown/prose": "7.6.2",
46
- "@milkdown/ctx": "7.6.2",
47
- "@milkdown/transformer": "7.6.2"
44
+ "@milkdown/ctx": "7.6.4",
45
+ "@milkdown/transformer": "7.6.4",
46
+ "@milkdown/prose": "7.6.4",
47
+ "@milkdown/core": "7.6.4"
48
48
  },
49
49
  "nx": {
50
50
  "targets": {