@milkdown/plugin-emoji 7.4.0 → 7.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"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
+ {"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,CAM5E"}
@@ -1 +1 @@
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
+ {"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;AAqCpD,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,cAAc,CAmCzD,CAAA"}
@@ -1 +1 @@
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
+ {"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,EAC/C,MAAM,EAAE,CAAC,EACT,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,aAAa,CAAC,GAC9C,CAAC,CASH"}
@@ -1 +1 @@
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"}
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,gDAgDrB,CAAA;AAUH,eAAO,MAAM,iBAAiB,sEAG7B,CAAA;AAWD,eAAO,MAAM,mBAAmB,mGAAgD,CAAA;AAYhF,eAAO,MAAM,oBAAoB,sCAehC,CAAA;AAOD,eAAO,MAAM,KAAK,EAAE,cAAc,EAM1B,CAAA"}
package/lib/index.es.js CHANGED
@@ -7,7 +7,11 @@ import I from "twemoji";
7
7
  import L from "emoji-regex";
8
8
  const b = (r) => ({ title: r });
9
9
  function w(r, e) {
10
- return I.parse(r, { attributes: b, base: "https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/", ...e });
10
+ return I.parse(r, {
11
+ attributes: b,
12
+ base: "https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/",
13
+ ...e
14
+ });
11
15
  }
12
16
  const k = L(), C = (r) => !!r.children, H = (r) => !!r.value;
13
17
  function S(r, e) {
@@ -34,15 +38,17 @@ function S(r, e) {
34
38
  const $ = (r) => {
35
39
  function e(m) {
36
40
  S(m, (t) => {
37
- if (!H(t))
38
- return [t];
39
- if (t.type === "code")
40
- return [t];
41
+ if (!H(t)) return [t];
42
+ if (t.type === "code") return [t];
41
43
  const n = t.value, i = [];
42
44
  let a, o = n;
43
45
  for (; a = k.exec(o); ) {
44
46
  const { index: c } = a, l = a[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;
47
+ l && (c > 0 && i.push({ ...t, value: o.slice(0, c) }), i.push({
48
+ ...t,
49
+ value: w(l, r),
50
+ type: "emoji"
51
+ }), o = o.slice(c + l.length)), k.lastIndex = 0;
46
52
  }
47
53
  return o.length && i.push({ ...t, value: o }), i;
48
54
  });
@@ -76,8 +82,7 @@ const u = x("emoji", (r) => ({
76
82
  {
77
83
  tag: 'span[data-type="emoji"]',
78
84
  getAttrs: (e) => {
79
- if (!(e instanceof HTMLElement))
80
- throw M(e);
85
+ if (!(e instanceof HTMLElement)) throw M(e);
81
86
  return { html: e.innerHTML };
82
87
  }
83
88
  }
@@ -87,7 +92,9 @@ const u = x("emoji", (r) => ({
87
92
  const m = r.get(j.key)(e), t = document.createElement("span");
88
93
  t.innerHTML = e.attrs.html;
89
94
  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];
95
+ return t.remove(), n && n instanceof HTMLElement && Object.entries(m.img).forEach(
96
+ ([a, o]) => n.setAttribute(a, o)
97
+ ), ["span", { ...m.container, "data-type": "emoji" }, n];
91
98
  },
92
99
  parseMarkdown: {
93
100
  match: ({ type: e }) => e === "emoji",
@@ -111,7 +118,10 @@ s(u.node, {
111
118
  s(u.ctx, {
112
119
  displayName: "NodeSchemaCtx<emoji>"
113
120
  });
114
- const g = y("remarkEmoji", () => A);
121
+ const g = y(
122
+ "remarkEmoji",
123
+ () => A
124
+ );
115
125
  s(g.plugin, {
116
126
  displayName: "Remark<remarkEmojiPlugin>"
117
127
  });
@@ -125,16 +135,16 @@ s(p.plugin, {
125
135
  s(p.options, {
126
136
  displayName: "RemarkConfig<remarkTwemojiPlugin>"
127
137
  });
128
- const E = T((r) => new v(/(:([^:\s]+):)$/, (e, m, t, n) => {
129
- const i = m[0];
130
- if (!i)
131
- return null;
132
- const a = P(i);
133
- if (!a || i.includes(a))
134
- return null;
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();
137
- }));
138
+ const E = T(
139
+ (r) => new v(/(:([^:\s]+):)$/, (e, m, t, n) => {
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, r.get(p.options.key));
145
+ return e.tr.setMeta("emoji", !0).replaceRangeWith(t, n, u.type(r).create({ html: o })).scrollIntoView();
146
+ })
147
+ );
138
148
  s(E, {
139
149
  displayName: "InputRule<insertEmojiInputRule>"
140
150
  });
@@ -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, { 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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"}
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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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@milkdown/plugin-emoji",
3
3
  "type": "module",
4
- "version": "7.4.0",
4
+ "version": "7.5.8",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git+https://github.com/Milkdown/milkdown.git",
9
- "directory": "packages/plugin-emoji"
9
+ "directory": "packages/plugins/plugin-emoji"
10
10
  },
11
11
  "keywords": [
12
12
  "milkdown",
@@ -37,14 +37,14 @@
37
37
  "tslib": "^2.5.0",
38
38
  "twemoji": "^14.0.2",
39
39
  "unist-util-visit": "^5.0.0",
40
- "@milkdown/exception": "7.4.0",
41
- "@milkdown/utils": "7.4.0"
40
+ "@milkdown/exception": "7.5.8",
41
+ "@milkdown/utils": "7.5.8"
42
42
  },
43
43
  "devDependencies": {
44
- "@milkdown/core": "7.4.0",
45
- "@milkdown/ctx": "7.4.0",
46
- "@milkdown/prose": "7.4.0",
47
- "@milkdown/transformer": "7.4.0"
44
+ "@milkdown/ctx": "7.5.8",
45
+ "@milkdown/prose": "7.5.8",
46
+ "@milkdown/core": "7.5.8",
47
+ "@milkdown/transformer": "7.5.8"
48
48
  },
49
49
  "nx": {
50
50
  "targets": {
@@ -53,19 +53,13 @@
53
53
  "{projectRoot}/lib"
54
54
  ],
55
55
  "dependsOn": [
56
- {
57
- "target": "build",
58
- "projects": "dependencies"
59
- }
56
+ "build"
60
57
  ]
61
58
  },
62
59
  "tsc": {
63
60
  "outputs": [],
64
61
  "dependsOn": [
65
- {
66
- "target": "build",
67
- "projects": "dependencies"
68
- }
62
+ "build"
69
63
  ]
70
64
  }
71
65
  }
@@ -41,5 +41,9 @@ export interface TwemojiOptions {
41
41
  }
42
42
 
43
43
  export function parse(emoji: string, twemojiOptions?: TwemojiOptions): string {
44
- return twemoji.parse(emoji, { attributes: setAttr, base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/', ...twemojiOptions }) as unknown as string
44
+ return twemoji.parse(emoji, {
45
+ attributes: setAttr,
46
+ base: 'https://cdn.jsdelivr.net/gh/twitter/twemoji/assets/',
47
+ ...twemojiOptions,
48
+ }) as unknown as string
45
49
  }
@@ -5,10 +5,15 @@ import { type TwemojiOptions, parse } from './parse'
5
5
 
6
6
  const regex = emojiRegex()
7
7
 
8
- const isParent = (node: Node): node is Node & { children: Node[] } => !!(node as Node & { children: Node[] }).children
9
- const isLiteral = (node: Node): node is Node & { value: string } => !!(node as Node & { value: string }).value
8
+ const isParent = (node: Node): node is Node & { children: Node[] } =>
9
+ !!(node as Node & { children: Node[] }).children
10
+ const isLiteral = (node: Node): node is Node & { value: string } =>
11
+ !!(node as Node & { value: string }).value
10
12
 
11
- function flatMap(ast: Node, fn: (node: Node, index: number, parent: Node | null) => Node[]) {
13
+ function flatMap(
14
+ ast: Node,
15
+ fn: (node: Node, index: number, parent: Node | null) => Node[]
16
+ ) {
12
17
  return transform(ast, 0, null)[0]
13
18
 
14
19
  function transform(node: Node, index: number, parent: Node | null) {
@@ -21,8 +26,7 @@ function flatMap(ast: Node, fn: (node: Node, index: number, parent: Node | null)
21
26
  if (xs) {
22
27
  for (let j = 0, m = xs.length; j < m; j++) {
23
28
  const item = xs[j]
24
- if (item)
25
- out.push(item)
29
+ if (item) out.push(item)
26
30
  }
27
31
  }
28
32
  }
@@ -34,35 +38,36 @@ function flatMap(ast: Node, fn: (node: Node, index: number, parent: Node | null)
34
38
  }
35
39
  }
36
40
 
37
- export const twemojiPlugin: RemarkPluginRaw<TwemojiOptions> = (twemojiOptions) => {
41
+ export const twemojiPlugin: RemarkPluginRaw<TwemojiOptions> = (
42
+ twemojiOptions
43
+ ) => {
38
44
  function transformer(tree: Node) {
39
45
  flatMap(tree, (node) => {
40
- if (!isLiteral(node))
41
- return [node]
46
+ if (!isLiteral(node)) return [node]
42
47
 
43
48
  // Should not convert code block
44
- if (node.type === 'code')
45
- return [node]
49
+ if (node.type === 'code') return [node]
46
50
 
47
51
  const value = node.value
48
52
  const output: Array<Node & { value: string }> = []
49
53
  let match
50
54
  let str = value
51
- // eslint-disable-next-line no-cond-assign
52
55
  while ((match = regex.exec(str))) {
53
56
  const { index } = match
54
57
  const emoji = match[0]
55
58
  if (emoji) {
56
- if (index > 0)
57
- output.push({ ...node, value: str.slice(0, index) })
59
+ if (index > 0) output.push({ ...node, value: str.slice(0, index) })
58
60
 
59
- output.push({ ...node, value: parse(emoji, twemojiOptions), type: 'emoji' })
61
+ output.push({
62
+ ...node,
63
+ value: parse(emoji, twemojiOptions),
64
+ type: 'emoji',
65
+ })
60
66
  str = str.slice(index + emoji.length)
61
67
  }
62
68
  regex.lastIndex = 0
63
69
  }
64
- if (str.length)
65
- output.push({ ...node, value: str })
70
+ if (str.length) output.push({ ...node, value: str })
66
71
 
67
72
  return output
68
73
  })
@@ -1,6 +1,9 @@
1
1
  import type { Meta, MilkdownPlugin } from '@milkdown/ctx'
2
2
 
3
- export function withMeta<T extends MilkdownPlugin>(plugin: T, meta: Partial<Meta> & Pick<Meta, 'displayName'>): T {
3
+ export function withMeta<T extends MilkdownPlugin>(
4
+ plugin: T,
5
+ meta: Partial<Meta> & Pick<Meta, 'displayName'>
6
+ ): T {
4
7
  Object.assign(plugin, {
5
8
  meta: {
6
9
  package: '@milkdown/plugin-emoji',
package/src/index.ts CHANGED
@@ -21,7 +21,7 @@ withMeta(emojiAttr, {
21
21
  })
22
22
 
23
23
  /// Schema for emoji node.
24
- export const emojiSchema = $nodeSchema('emoji', ctx => ({
24
+ export const emojiSchema = $nodeSchema('emoji', (ctx) => ({
25
25
  group: 'inline',
26
26
  inline: true,
27
27
  attrs: {
@@ -33,8 +33,7 @@ export const emojiSchema = $nodeSchema('emoji', ctx => ({
33
33
  {
34
34
  tag: 'span[data-type="emoji"]',
35
35
  getAttrs: (dom) => {
36
- if (!(dom instanceof HTMLElement))
37
- throw expectDomTypeError(dom)
36
+ if (!(dom instanceof HTMLElement)) throw expectDomTypeError(dom)
38
37
 
39
38
  return { html: dom.innerHTML }
40
39
  },
@@ -47,7 +46,9 @@ export const emojiSchema = $nodeSchema('emoji', ctx => ({
47
46
  const dom = tmp.firstElementChild?.cloneNode()
48
47
  tmp.remove()
49
48
  if (dom && dom instanceof HTMLElement)
50
- Object.entries<string>(attrs.img).forEach(([key, value]) => dom.setAttribute(key, value))
49
+ Object.entries<string>(attrs.img).forEach(([key, value]) =>
50
+ dom.setAttribute(key, value)
51
+ )
51
52
 
52
53
  return ['span', { ...attrs.container, 'data-type': 'emoji' }, dom]
53
54
  },
@@ -58,7 +59,7 @@ export const emojiSchema = $nodeSchema('emoji', ctx => ({
58
59
  },
59
60
  },
60
61
  toMarkdown: {
61
- match: node => node.type.name === 'emoji',
62
+ match: (node) => node.type.name === 'emoji',
62
63
  runner: (state, node) => {
63
64
  const span = document.createElement('span')
64
65
  span.innerHTML = node.attrs.html
@@ -78,7 +79,10 @@ withMeta(emojiSchema.ctx, {
78
79
  })
79
80
 
80
81
  /// This plugin wraps [remark-emoji](https://github.com/rhysd/remark-emoji).
81
- export const remarkEmojiPlugin = $remark('remarkEmoji', () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>)
82
+ export const remarkEmojiPlugin = $remark(
83
+ 'remarkEmoji',
84
+ () => remarkEmoji as RemarkPluginRaw<RemarkEmojiOptions>
85
+ )
82
86
 
83
87
  withMeta(remarkEmojiPlugin.plugin, {
84
88
  displayName: 'Remark<remarkEmojiPlugin>',
@@ -101,21 +105,22 @@ withMeta(remarkTwemojiPlugin.options, {
101
105
 
102
106
  /// Input rule for inserting emoji.
103
107
  /// For example, `:smile:` will be replaced with `😄`.
104
- export const insertEmojiInputRule = $inputRule(ctx => new InputRule(/(:([^:\s]+):)$/, (state, match, start, end) => {
105
- const content = match[0]
106
- if (!content)
107
- return null
108
- const got = get(content)
109
- if (!got || content.includes(got))
110
- return null
111
-
112
- const html = parse(got, ctx.get(remarkTwemojiPlugin.options.key))
113
-
114
- return state.tr
115
- .setMeta('emoji', true)
116
- .replaceRangeWith(start, end, emojiSchema.type(ctx).create({ html }))
117
- .scrollIntoView()
118
- }))
108
+ export const insertEmojiInputRule = $inputRule(
109
+ (ctx) =>
110
+ new InputRule(/(:([^:\s]+):)$/, (state, match, start, end) => {
111
+ const content = match[0]
112
+ if (!content) return null
113
+ const got = get(content)
114
+ if (!got || content.includes(got)) return null
115
+
116
+ const html = parse(got, ctx.get(remarkTwemojiPlugin.options.key))
117
+
118
+ return state.tr
119
+ .setMeta('emoji', true)
120
+ .replaceRangeWith(start, end, emojiSchema.type(ctx).create({ html }))
121
+ .scrollIntoView()
122
+ })
123
+ )
119
124
 
120
125
  withMeta(insertEmojiInputRule, {
121
126
  displayName: 'InputRule<insertEmojiInputRule>',