@milkdown/plugin-emoji 7.3.5 → 7.4.0

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.
@@ -30,7 +30,7 @@ export interface TwemojiOptions {
30
30
  * @param variant variant the optional \uFE0F ("as image") variant, in case this info is anyhow meaningful. By default this is ignored.
31
31
  *
32
32
  */
33
- attributes?(icon: string, variant: string): object;
33
+ attributes?: (icon: string, variant: string) => object;
34
34
  }
35
35
  export declare function parse(emoji: string, twemojiOptions?: TwemojiOptions): string;
36
36
  //# sourceMappingURL=parse.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/__internal__/parse.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,CAAA;IAC7E;;;;;;OAMG;IACH,UAAU,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CACnD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,MAAM,CAE5E"}
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/__internal__/parse.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IACb;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,CAAA;IAC7E;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,CAAA;CACvD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,cAAc,GAAG,MAAM,CAE5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"remark-twemoji.d.ts","sourceRoot":"","sources":["../../src/__internal__/remark-twemoji.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAQ,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAS,MAAM,SAAS,CAAA;AAiCpD,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,cAAc,CA8BzD,CAAA"}
1
+ {"version":3,"file":"remark-twemoji.d.ts","sourceRoot":"","sources":["../../src/__internal__/remark-twemoji.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAGlE,OAAO,EAAE,KAAK,cAAc,EAAS,MAAM,SAAS,CAAA;AAiCpD,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,cAAc,CAkCzD,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"with-meta.d.ts","sourceRoot":"","sources":["../../src/__internal__/with-meta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEzD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAShH"}
1
+ {"version":3,"file":"with-meta.d.ts","sourceRoot":"","sources":["../../src/__internal__/with-meta.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEzD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,CAShH"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAMnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAQtD,eAAO,MAAM,SAAS,qCAGnB,CAAA;AAMH,eAAO,MAAM,WAAW,gDA+CrB,CAAA;AAUH,eAAO,MAAM,iBAAiB,sEAAmF,CAAA;AAWjH,eAAO,MAAM,mBAAmB,mGAAgD,CAAA;AAYhF,eAAO,MAAM,oBAAoB,sCAc9B,CAAA;AAOH,eAAO,MAAM,KAAK,EAAE,cAAc,EAM1B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAMnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAQtD,eAAO,MAAM,SAAS,qCAGnB,CAAA;AAMH,eAAO,MAAM,WAAW,gDA+CrB,CAAA;AAUH,eAAO,MAAM,iBAAiB,sEAAmF,CAAA;AAWjH,eAAO,MAAM,mBAAmB,mGAAgD,CAAA;AAYhF,eAAO,MAAM,oBAAoB,sCAc9B,CAAA;AAOH,eAAO,MAAM,KAAK,EAAE,cAAc,EAM1B,CAAA"}
package/lib/index.es.js CHANGED
@@ -5,55 +5,57 @@ import { get as P } from "node-emoji";
5
5
  import A from "remark-emoji";
6
6
  import I from "twemoji";
7
7
  import L from "emoji-regex";
8
- const b = (n) => ({ title: n });
9
- function w(n, t) {
10
- return I.parse(n, { attributes: b, base: "https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/", ...t });
8
+ const b = (r) => ({ title: r });
9
+ function w(r, e) {
10
+ return I.parse(r, { attributes: b, base: "https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/", ...e });
11
11
  }
12
- const k = L(), C = (n) => !!n.children, H = (n) => !!n.value;
13
- function S(n, t) {
14
- return m(n, 0, null)[0];
15
- function m(e, r, i) {
16
- if (C(e)) {
12
+ const k = L(), C = (r) => !!r.children, H = (r) => !!r.value;
13
+ function S(r, e) {
14
+ return m(r, 0, null)[0];
15
+ function m(t, n, i) {
16
+ if (C(t)) {
17
17
  const a = [];
18
- for (let o = 0, c = e.children.length; o < c; o++) {
19
- const l = e.children[o];
18
+ for (let o = 0, c = t.children.length; o < c; o++) {
19
+ const l = t.children[o];
20
20
  if (l) {
21
- const f = m(l, o, e);
21
+ const f = m(l, o, t);
22
22
  if (f)
23
23
  for (let h = 0, N = f.length; h < N; h++) {
24
- const g = f[h];
25
- g && a.push(g);
24
+ const d = f[h];
25
+ d && a.push(d);
26
26
  }
27
27
  }
28
28
  }
29
- e.children = a;
29
+ t.children = a;
30
30
  }
31
- return t(e, r, i);
31
+ return e(t, n, i);
32
32
  }
33
33
  }
34
- const $ = (n) => {
35
- function t(m) {
36
- S(m, (e) => {
37
- if (!H(e))
38
- return [e];
39
- const r = e.value, i = [];
40
- let a, o = r;
34
+ const $ = (r) => {
35
+ function e(m) {
36
+ S(m, (t) => {
37
+ if (!H(t))
38
+ return [t];
39
+ if (t.type === "code")
40
+ return [t];
41
+ const n = t.value, i = [];
42
+ let a, o = n;
41
43
  for (; a = k.exec(o); ) {
42
44
  const { index: c } = a, l = a[0];
43
- l && (c > 0 && i.push({ ...e, value: o.slice(0, c) }), i.push({ ...e, value: w(l, n), type: "emoji" }), o = o.slice(c + l.length)), k.lastIndex = 0;
45
+ l && (c > 0 && i.push({ ...t, value: o.slice(0, c) }), i.push({ ...t, value: w(l, r), type: "emoji" }), o = o.slice(c + l.length)), k.lastIndex = 0;
44
46
  }
45
- return o.length && i.push({ ...e, value: o }), i;
47
+ return o.length && i.push({ ...t, value: o }), i;
46
48
  });
47
49
  }
48
- return t;
50
+ return e;
49
51
  };
50
- function s(n, t) {
51
- return Object.assign(n, {
52
+ function s(r, e) {
53
+ return Object.assign(r, {
52
54
  meta: {
53
55
  package: "@milkdown/plugin-emoji",
54
- ...t
56
+ ...e
55
57
  }
56
- }), n;
58
+ }), r;
57
59
  }
58
60
  const j = R("emoji", () => ({
59
61
  span: {},
@@ -62,7 +64,7 @@ const j = R("emoji", () => ({
62
64
  s(j, {
63
65
  displayName: "Attr<emoji>"
64
66
  });
65
- const u = x("emoji", (n) => ({
67
+ const u = x("emoji", (r) => ({
66
68
  group: "inline",
67
69
  inline: !0,
68
70
  attrs: {
@@ -73,33 +75,33 @@ const u = x("emoji", (n) => ({
73
75
  parseDOM: [
74
76
  {
75
77
  tag: 'span[data-type="emoji"]',
76
- getAttrs: (t) => {
77
- if (!(t instanceof HTMLElement))
78
- throw M(t);
79
- return { html: t.innerHTML };
78
+ getAttrs: (e) => {
79
+ if (!(e instanceof HTMLElement))
80
+ throw M(e);
81
+ return { html: e.innerHTML };
80
82
  }
81
83
  }
82
84
  ],
83
- toDOM: (t) => {
85
+ toDOM: (e) => {
84
86
  var i;
85
- const m = n.get(j.key)(t), e = document.createElement("span");
86
- e.innerHTML = t.attrs.html;
87
- const r = (i = e.firstElementChild) == null ? void 0 : i.cloneNode();
88
- return e.remove(), r && r instanceof HTMLElement && Object.entries(m.img).forEach(([a, o]) => r.setAttribute(a, o)), ["span", { ...m.container, "data-type": "emoji" }, r];
87
+ const m = r.get(j.key)(e), t = document.createElement("span");
88
+ t.innerHTML = e.attrs.html;
89
+ const n = (i = t.firstElementChild) == null ? void 0 : i.cloneNode();
90
+ return t.remove(), n && n instanceof HTMLElement && Object.entries(m.img).forEach(([a, o]) => n.setAttribute(a, o)), ["span", { ...m.container, "data-type": "emoji" }, n];
89
91
  },
90
92
  parseMarkdown: {
91
- match: ({ type: t }) => t === "emoji",
92
- runner: (t, m, e) => {
93
- t.addNode(e, { html: m.value });
93
+ match: ({ type: e }) => e === "emoji",
94
+ runner: (e, m, t) => {
95
+ e.addNode(t, { html: m.value });
94
96
  }
95
97
  },
96
98
  toMarkdown: {
97
- match: (t) => t.type.name === "emoji",
98
- runner: (t, m) => {
99
- const e = document.createElement("span");
100
- e.innerHTML = m.attrs.html;
101
- const r = e.querySelector("img"), i = (r == null ? void 0 : r.title) || (r == null ? void 0 : r.alt);
102
- e.remove(), t.addNode("text", void 0, i);
99
+ match: (e) => e.type.name === "emoji",
100
+ runner: (e, m) => {
101
+ const t = document.createElement("span");
102
+ t.innerHTML = m.attrs.html;
103
+ const n = t.querySelector("img"), i = (n == null ? void 0 : n.title) || (n == null ? void 0 : n.alt);
104
+ t.remove(), e.addNode("text", void 0, i);
103
105
  }
104
106
  }
105
107
  }));
@@ -109,11 +111,11 @@ s(u.node, {
109
111
  s(u.ctx, {
110
112
  displayName: "NodeSchemaCtx<emoji>"
111
113
  });
112
- const d = y("remarkEmoji", () => A);
113
- s(d.plugin, {
114
+ const g = y("remarkEmoji", () => A);
115
+ s(g.plugin, {
114
116
  displayName: "Remark<remarkEmojiPlugin>"
115
117
  });
116
- s(d.options, {
118
+ s(g.options, {
117
119
  displayName: "RemarkConfig<remarkEmojiPlugin>"
118
120
  });
119
121
  const p = y("remarkTwemoji", () => $);
@@ -123,22 +125,22 @@ s(p.plugin, {
123
125
  s(p.options, {
124
126
  displayName: "RemarkConfig<remarkTwemojiPlugin>"
125
127
  });
126
- const E = T((n) => new v(/(:([^:\s]+):)$/, (t, m, e, r) => {
128
+ const E = T((r) => new v(/(:([^:\s]+):)$/, (e, m, t, n) => {
127
129
  const i = m[0];
128
130
  if (!i)
129
131
  return null;
130
132
  const a = P(i);
131
133
  if (!a || i.includes(a))
132
134
  return null;
133
- const o = w(a, n.get(p.options.key));
134
- return t.tr.setMeta("emoji", !0).replaceRangeWith(e, r, u.type(n).create({ html: o })).scrollIntoView();
135
+ const o = w(a, r.get(p.options.key));
136
+ return e.tr.setMeta("emoji", !0).replaceRangeWith(t, n, u.type(r).create({ html: o })).scrollIntoView();
135
137
  }));
136
138
  s(E, {
137
139
  displayName: "InputRule<insertEmojiInputRule>"
138
140
  });
139
141
  const F = [
140
142
  j,
141
- d,
143
+ g,
142
144
  p,
143
145
  u,
144
146
  E
@@ -148,7 +150,7 @@ export {
148
150
  j as emojiAttr,
149
151
  u as emojiSchema,
150
152
  E as insertEmojiInputRule,
151
- d as remarkEmojiPlugin,
153
+ g as remarkEmojiPlugin,
152
154
  p as remarkTwemojiPlugin
153
155
  };
154
156
  //# 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":["/* Copyright 2021, Milkdown by Mirone. */\nimport 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, { attributes: setAttr, base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/', ...twemojiOptions }) as unknown as string\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport 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[] } => !!(node as Node & { children: Node[] }).children\nconst isLiteral = (node: Node): node is Node & { value: string } => !!(node as Node & { value: string }).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: RemarkPluginRaw<TwemojiOptions> = (twemojiOptions) => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node))\n return [node]\n\n const value = node.value\n const output: Array<Node & { value: 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 { Meta, MilkdownPlugin } from '@milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(plugin: T, meta: Partial<Meta> & Pick<Meta, 'displayName'>): T {\n Object.assign(plugin, {\n meta: {\n package: '@milkdown/plugin-emoji',\n ...meta,\n },\n })\n\n return plugin\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport 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))\n 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]) => dom.setAttribute(key, value))\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('remarkEmoji', () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>)\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(ctx => new InputRule(/(:([^:\\s]+):)$/, (state, match, start, end) => {\n const content = match[0]\n if (!content)\n return null\n const got = get(content)\n if (!got || content.includes(got))\n 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\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, { attributes: setAttr, base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/', ...twemojiOptions }) 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[] } => !!(node as Node & { children: Node[] }).children\nconst isLiteral = (node: Node): node is Node & { value: string } => !!(node as Node & { value: string }).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: RemarkPluginRaw<TwemojiOptions> = (twemojiOptions) => {\n function transformer(tree: Node) {\n flatMap(tree, (node) => {\n if (!isLiteral(node))\n return [node]\n\n // Should not convert code block\n if (node.type === 'code')\n return [node]\n\n const value = node.value\n const output: Array<Node & { value: 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","import type { Meta, MilkdownPlugin } from '@milkdown/ctx'\n\nexport function withMeta<T extends MilkdownPlugin>(plugin: T, meta: Partial<Meta> & Pick<Meta, 'displayName'>): 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))\n 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]) => dom.setAttribute(key, value))\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('remarkEmoji', () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>)\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(ctx => new InputRule(/(:([^:\\s]+):)$/, (state, match, start, end) => {\n const content = match[0]\n if (!content)\n return null\n const got = get(content)\n if (!got || content.includes(got))\n 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\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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@milkdown/plugin-emoji",
3
3
  "type": "module",
4
- "version": "7.3.5",
4
+ "version": "7.4.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -31,21 +31,20 @@
31
31
  "@milkdown/transformer": "^7.2.0"
32
32
  },
33
33
  "dependencies": {
34
- "@types/node-emoji": "^1.8.1",
35
34
  "emoji-regex": "^10.0.0",
36
- "node-emoji": "^2.0.0",
37
- "remark-emoji": "^4.0.0",
35
+ "node-emoji": "^2.1.3",
36
+ "remark-emoji": "^5.0.0",
38
37
  "tslib": "^2.5.0",
39
38
  "twemoji": "^14.0.2",
40
39
  "unist-util-visit": "^5.0.0",
41
- "@milkdown/exception": "7.3.5",
42
- "@milkdown/utils": "7.3.5"
40
+ "@milkdown/exception": "7.4.0",
41
+ "@milkdown/utils": "7.4.0"
43
42
  },
44
43
  "devDependencies": {
45
- "@milkdown/core": "7.3.5",
46
- "@milkdown/ctx": "7.3.5",
47
- "@milkdown/prose": "7.3.5",
48
- "@milkdown/transformer": "7.3.5"
44
+ "@milkdown/core": "7.4.0",
45
+ "@milkdown/ctx": "7.4.0",
46
+ "@milkdown/prose": "7.4.0",
47
+ "@milkdown/transformer": "7.4.0"
49
48
  },
50
49
  "nx": {
51
50
  "targets": {
@@ -1,4 +1,3 @@
1
- /* Copyright 2021, Milkdown by Mirone. */
2
1
  import twemoji from 'twemoji'
3
2
 
4
3
  const setAttr = (text: string) => ({ title: text })
@@ -38,7 +37,7 @@ export interface TwemojiOptions {
38
37
  * @param variant variant the optional \uFE0F ("as image") variant, in case this info is anyhow meaningful. By default this is ignored.
39
38
  *
40
39
  */
41
- attributes?(icon: string, variant: string): object
40
+ attributes?: (icon: string, variant: string) => object
42
41
  }
43
42
 
44
43
  export function parse(emoji: string, twemojiOptions?: TwemojiOptions): string {
@@ -1,4 +1,3 @@
1
- /* Copyright 2021, Milkdown by Mirone. */
2
1
  import type { Node, RemarkPluginRaw } from '@milkdown/transformer'
3
2
  import emojiRegex from 'emoji-regex'
4
3
 
@@ -41,6 +40,10 @@ export const twemojiPlugin: RemarkPluginRaw<TwemojiOptions> = (twemojiOptions) =
41
40
  if (!isLiteral(node))
42
41
  return [node]
43
42
 
43
+ // Should not convert code block
44
+ if (node.type === 'code')
45
+ return [node]
46
+
44
47
  const value = node.value
45
48
  const output: Array<Node & { value: string }> = []
46
49
  let match
@@ -1,4 +1,3 @@
1
- /* Copyright 2021, Milkdown by Mirone. */
2
1
  import type { Meta, MilkdownPlugin } from '@milkdown/ctx'
3
2
 
4
3
  export function withMeta<T extends MilkdownPlugin>(plugin: T, meta: Partial<Meta> & Pick<Meta, 'displayName'>): T {
package/src/index.ts CHANGED
@@ -1,4 +1,3 @@
1
- /* Copyright 2021, Milkdown by Mirone. */
2
1
  import type { MilkdownPlugin } from '@milkdown/ctx'
3
2
  import type { RemarkPluginRaw } from '@milkdown/transformer'
4
3
  import { expectDomTypeError } from '@milkdown/exception'