@hkyhy/marsun-components-core 0.1.130 → 0.1.131

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.
Files changed (28) hide show
  1. package/README.md +1 -0
  2. package/dist/_virtual/index.js +5 -5
  3. package/dist/_virtual/index2.js +5 -5
  4. package/dist/components/Editor/RichTextEditor/RichTextEditor.d.ts +3 -1
  5. package/dist/components/Editor/RichTextEditor/RichTextEditor.js +140 -61
  6. package/dist/components/Editor/RichTextEditor/RichTextEditor.js.map +1 -1
  7. package/dist/components/Editor/RichTextEditor/style.module.scss.js +7 -7
  8. package/dist/components/Editor/index.d.ts +2 -2
  9. package/dist/components/Editor/index.js +20 -14
  10. package/dist/components/Editor/msgVarTokenPlugin.d.ts +22 -1
  11. package/dist/components/Editor/msgVarTokenPlugin.js +188 -45
  12. package/dist/components/Editor/msgVarTokenPlugin.js.map +1 -1
  13. package/dist/components/Editor/variableMention.d.ts +20 -1
  14. package/dist/components/Editor/variableMention.js +134 -46
  15. package/dist/components/Editor/variableMention.js.map +1 -1
  16. package/dist/components/FormInfo/RichTextField/index.d.ts +2 -0
  17. package/dist/components/FormInfo/RichTextField/index.js +46 -43
  18. package/dist/components/FormInfo/RichTextField/index.js.map +1 -1
  19. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js +121 -112
  20. package/dist/components/Tools/MessageCenter/MessageTemplateAdmin/Modal/TemplateFormModal.js.map +1 -1
  21. package/dist/editor.js +22 -16
  22. package/dist/index.js +361 -355
  23. package/dist/marsun-components-core.css +1 -1
  24. package/dist/node_modules/@antv/g-lite/dist/index.esm.js +1 -1
  25. package/dist/node_modules/@antv/g2/esm/data/kde.js +1 -1
  26. package/dist/node_modules/eventemitter3/index.js +1 -1
  27. package/dist/styles/global.css +1 -1
  28. package/package.json +1 -1
@@ -1,89 +1,232 @@
1
- var c = (e) => {
2
- throw TypeError(e);
1
+ var C = (o) => {
2
+ throw TypeError(o);
3
3
  };
4
- var f = (e, n, t) => n.has(e) || c("Cannot " + t);
5
- var m = (e, n, t) => n.has(e) ? c("Cannot add the same private member more than once") : n instanceof WeakSet ? n.add(e) : n.set(e, t);
6
- var a = (e, n, t) => (f(e, n, "access private method"), t);
7
- import { Plugin as h, Widget as v, viewToModelPositionOutsideModelElement as V, toWidget as k } from "ckeditor5";
8
- import { toVarToken as p } from "./variableMention.js";
9
- var s, g, d;
10
- class E extends h {
4
+ var B = (o, n, t) => n.has(o) || C("Cannot " + t);
5
+ var A = (o, n, t) => n.has(o) ? C("Cannot add the same private member more than once") : n instanceof WeakSet ? n.add(o) : n.set(o, t);
6
+ var f = (o, n, t) => (B(o, n, "access private method"), t);
7
+ import { Plugin as v, Widget as x, viewToModelPositionOutsideModelElement as P, toWidget as T } from "ckeditor5";
8
+ import { MSG_VAR_TOKEN_CLASS as d, toVarToken as F } from "./variableMention.js";
9
+ const h = [
10
+ "bold",
11
+ "italic",
12
+ "underline",
13
+ "fontColor",
14
+ "fontBackgroundColor"
15
+ ];
16
+ var a, M, S, k;
17
+ class j extends v {
11
18
  constructor() {
12
19
  super(...arguments);
13
- m(this, s);
20
+ A(this, a);
14
21
  }
15
22
  static get pluginName() {
16
23
  return "MsgVarWidget";
17
24
  }
18
25
  static get requires() {
19
- return [v];
26
+ return [x];
20
27
  }
21
28
  init() {
22
29
  const t = this.editor;
23
- a(this, s, g).call(this), a(this, s, d).call(this), t.editing.mapper.on(
30
+ f(this, a, M).call(this), f(this, a, S).call(this), f(this, a, k).call(this), t.editing.mapper.on(
24
31
  "viewToModelPosition",
25
- V(
32
+ P(
26
33
  t.model,
27
- (r) => r.hasClass("msg-var-token")
34
+ (e) => e.hasClass(d)
28
35
  )
29
36
  );
30
37
  }
31
38
  }
32
- s = new WeakSet(), g = function() {
39
+ a = new WeakSet(), M = function() {
33
40
  this.editor.model.schema.register("msgVar", {
34
41
  inheritAllFrom: "$inlineObject",
35
- allowAttributes: ["key"]
42
+ allowAttributes: ["key", ...h]
36
43
  });
37
- }, d = function() {
44
+ }, S = function() {
38
45
  const t = this.editor.conversion;
39
46
  t.for("editingDowncast").elementToElement({
40
47
  model: "msgVar",
41
- view: (r, { writer: o }) => {
42
- const i = String(r.getAttribute("key") || ""), u = l(o, i);
43
- return k(u, o, { label: `变量 ${i}` });
48
+ view: (e, { writer: r }) => {
49
+ const i = String(e.getAttribute("key") || ""), s = V(r, i, y(e));
50
+ return T(s, r, { label: `变量 ${i}` });
44
51
  }
45
52
  }), t.for("dataDowncast").elementToElement({
46
53
  model: "msgVar",
47
- view: (r, { writer: o }) => {
48
- const i = String(r.getAttribute("key") || "");
49
- return l(o, i);
54
+ view: (e, { writer: r }) => {
55
+ const i = String(e.getAttribute("key") || ""), s = y(e), l = V(r, i, s);
56
+ return _(r, l, s);
50
57
  }
51
58
  }), t.for("upcast").elementToElement({
52
59
  view: {
53
60
  name: "span",
54
- classes: ["msg-var-token"]
61
+ classes: [d]
55
62
  },
56
- model: (r, { writer: o }) => {
57
- const i = w(r);
58
- return i ? o.createElement("msgVar", { key: i }) : null;
63
+ model: (e, { writer: r }) => {
64
+ const i = R(e);
65
+ if (!i) return null;
66
+ const s = r.createElement("msgVar", { key: i }), l = {
67
+ ...E(e),
68
+ ...W(e)
69
+ };
70
+ return $(r, s, l), s;
59
71
  }
60
72
  });
73
+ }, /** 选中色块时,工具栏加粗/斜体/下划线/字色作用在 msgVar 属性上 */
74
+ k = function() {
75
+ const t = this.editor;
76
+ g(t, "bold"), g(t, "italic"), g(t, "underline"), p(t, "fontColor", "fontColor"), p(t, "fontBackgroundColor", "fontBackgroundColor");
77
+ const e = t.commands.get("removeFormat");
78
+ e && e.on(
79
+ "execute",
80
+ (r) => {
81
+ const i = u(t);
82
+ i && (r.stop(), t.model.change((s) => {
83
+ for (const l of h)
84
+ s.removeAttribute(l, i);
85
+ }));
86
+ },
87
+ { priority: "high" }
88
+ );
61
89
  };
62
- function l(e, n) {
63
- const t = e.createContainerElement("span", {
64
- class: "msg-var-token",
90
+ function g(o, n) {
91
+ const t = o.commands.get(n);
92
+ t && (t.on(
93
+ "execute",
94
+ (e) => {
95
+ const r = u(o);
96
+ r && (e.stop(), o.model.change((i) => {
97
+ r.getAttribute(n) ? i.removeAttribute(n, r) : i.setAttribute(n, !0, r);
98
+ }));
99
+ },
100
+ { priority: "high" }
101
+ ), t.on(
102
+ "refresh",
103
+ () => {
104
+ const e = u(o);
105
+ e && (t.value = !!e.getAttribute(n), t.isEnabled = !0);
106
+ },
107
+ { priority: "lowest" }
108
+ ));
109
+ }
110
+ function p(o, n, t) {
111
+ const e = o.commands.get(n);
112
+ e && (e.on(
113
+ "execute",
114
+ (r, i) => {
115
+ const s = u(o);
116
+ if (!s) return;
117
+ r.stop();
118
+ const l = String((i == null ? void 0 : i.value) || "").trim();
119
+ o.model.change((c) => {
120
+ l ? c.setAttribute(t, l, s) : c.removeAttribute(t, s);
121
+ });
122
+ },
123
+ { priority: "high" }
124
+ ), e.on(
125
+ "refresh",
126
+ () => {
127
+ const r = u(o);
128
+ r && (e.value = r.getAttribute(t) || void 0, e.isEnabled = !0);
129
+ },
130
+ { priority: "lowest" }
131
+ ));
132
+ }
133
+ function u(o) {
134
+ const n = o.model.document.selection, t = n.getSelectedElement();
135
+ if (t != null && t.is("element", "msgVar")) return t;
136
+ const e = n.getFirstPosition();
137
+ if (!e) return null;
138
+ const r = e.nodeBefore, i = e.nodeAfter;
139
+ return r != null && r.is("element", "msgVar") && n.isCollapsed ? r : i != null && i.is("element", "msgVar") && n.isCollapsed ? i : null;
140
+ }
141
+ function y(o) {
142
+ const n = {};
143
+ o.getAttribute("bold") && (n.bold = !0), o.getAttribute("italic") && (n.italic = !0), o.getAttribute("underline") && (n.underline = !0);
144
+ const t = String(o.getAttribute("fontColor") || "").trim(), e = String(o.getAttribute("fontBackgroundColor") || "").trim();
145
+ return t && (n.fontColor = t), e && (n.fontBackgroundColor = e), n;
146
+ }
147
+ function $(o, n, t) {
148
+ t.bold && o.setAttribute("bold", !0, n), t.italic && o.setAttribute("italic", !0, n), t.underline && o.setAttribute("underline", !0, n), t.fontColor && o.setAttribute("fontColor", t.fontColor, n), t.fontBackgroundColor && o.setAttribute("fontBackgroundColor", t.fontBackgroundColor, n);
149
+ }
150
+ function E(o) {
151
+ var i, s, l, c;
152
+ const n = {};
153
+ o.getAttribute("data-bold") === "1" && (n.bold = !0), o.getAttribute("data-italic") === "1" && (n.italic = !0), o.getAttribute("data-underline") === "1" && (n.underline = !0);
154
+ let t = String(o.getAttribute("data-font-color") || "").trim(), e = String(o.getAttribute("data-font-bg") || "").trim();
155
+ const r = String(o.getAttribute("style") || "");
156
+ return t || (t = ((s = (i = /(?:^|;)\s*color\s*:\s*([^;]+)/i.exec(r)) == null ? void 0 : i[1]) == null ? void 0 : s.trim()) || ""), e || (e = ((c = (l = /(?:^|;)\s*background(?:-color)?\s*:\s*([^;]+)/i.exec(r)) == null ? void 0 : l[1]) == null ? void 0 : c.trim()) || ""), t && (n.fontColor = t), e && (n.fontBackgroundColor = e), n;
157
+ }
158
+ function W(o) {
159
+ var e, r, i, s;
160
+ const n = {};
161
+ let t = o.parent;
162
+ for (; t && t.is("element"); ) {
163
+ const l = t.name;
164
+ if ((l === "strong" || l === "b") && (n.bold = !0), (l === "em" || l === "i") && (n.italic = !0), l === "u" && (n.underline = !0), l === "span") {
165
+ const c = String(t.getAttribute("style") || ""), b = (r = (e = /(?:^|;)\s*color\s*:\s*([^;]+)/i.exec(c)) == null ? void 0 : e[1]) == null ? void 0 : r.trim(), m = (s = (i = /(?:^|;)\s*background(?:-color)?\s*:\s*([^;]+)/i.exec(c)) == null ? void 0 : i[1]) == null ? void 0 : s.trim();
166
+ b && !n.fontColor && (n.fontColor = b), m && !n.fontBackgroundColor && (n.fontBackgroundColor = m);
167
+ }
168
+ if (["p", "li", "div", "h1", "h2", "h3", "h4", "td", "th", "body"].includes(l)) break;
169
+ t = t.parent;
170
+ }
171
+ return n;
172
+ }
173
+ function _(o, n, t) {
174
+ let e = n;
175
+ if (t.fontBackgroundColor && (e = o.createContainerElement("span", {
176
+ style: `background-color:${t.fontBackgroundColor}`
177
+ }), o.insert(o.createPositionAt(e, 0), n), n = e), t.fontColor) {
178
+ const r = o.createContainerElement("span", {
179
+ style: `color:${t.fontColor}`
180
+ });
181
+ o.insert(o.createPositionAt(r, 0), e), e = r;
182
+ }
183
+ if (t.underline) {
184
+ const r = o.createContainerElement("u");
185
+ o.insert(o.createPositionAt(r, 0), e), e = r;
186
+ }
187
+ if (t.italic) {
188
+ const r = o.createContainerElement("em");
189
+ o.insert(o.createPositionAt(r, 0), e), e = r;
190
+ }
191
+ if (t.bold) {
192
+ const r = o.createContainerElement("strong");
193
+ o.insert(o.createPositionAt(r, 0), e), e = r;
194
+ }
195
+ return e;
196
+ }
197
+ function V(o, n, t = {}) {
198
+ const e = {
199
+ class: d,
65
200
  "data-var": n
66
- });
67
- return e.insert(e.createPositionAt(t, 0), e.createText(p(n))), t;
201
+ };
202
+ t.bold && (e["data-bold"] = "1"), t.italic && (e["data-italic"] = "1"), t.underline && (e["data-underline"] = "1"), t.fontColor && (e["data-font-color"] = t.fontColor), t.fontBackgroundColor && (e["data-font-bg"] = t.fontBackgroundColor);
203
+ const r = [];
204
+ t.fontColor && r.push(`color:${t.fontColor}`), t.fontBackgroundColor && r.push(`background-color:${t.fontBackgroundColor}`), r.length && (e.style = r.join(";"));
205
+ const i = o.createContainerElement("span", e);
206
+ return o.insert(o.createPositionAt(i, 0), o.createText(F(n))), i;
68
207
  }
69
- function w(e) {
70
- const n = String(e.getAttribute("data-var") || "").trim();
208
+ function R(o) {
209
+ const n = String(o.getAttribute("data-var") || "").trim();
71
210
  if (n) return n;
72
211
  let t = "";
73
- for (const o of e.getChildren())
74
- (o.is("$text") || o.is("$textProxy")) && (t += o.data);
75
- const r = t.match(/^\{\{(\w+)\}\}$/);
76
- return (r == null ? void 0 : r[1]) ?? "";
212
+ for (const r of o.getChildren())
213
+ (r.is("$text") || r.is("$textProxy")) && (t += r.data);
214
+ const e = t.match(/^\{\{(\w+)\}\}$/);
215
+ return (e == null ? void 0 : e[1]) ?? "";
77
216
  }
78
- function M(e, n) {
217
+ function G(o, n) {
79
218
  const t = String(n || "").trim();
80
- t && (e.model.change((r) => {
81
- const o = r.createElement("msgVar", { key: t });
82
- e.model.insertContent(o);
83
- }), e.editing.view.focus());
219
+ t && (o.model.change((e) => {
220
+ const r = e.createElement("msgVar", { key: t });
221
+ o.model.insertContent(r);
222
+ }), o.editing.view.focus());
84
223
  }
85
224
  export {
86
- E as MsgVarWidget,
87
- M as insertMsgVar
225
+ h as MSG_VAR_MARK_ATTRS,
226
+ j as MsgVarWidget,
227
+ W as collectMarksFromAncestors,
228
+ E as collectMarksFromDataAttrs,
229
+ G as insertMsgVar,
230
+ _ as wrapMsgVarViewWithMarks
88
231
  };
89
232
  //# sourceMappingURL=msgVarTokenPlugin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"msgVarTokenPlugin.js","sources":["../../../src/components/Editor/msgVarTokenPlugin.ts"],"sourcesContent":["import {\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n type Editor,\n type ViewDowncastWriter,\n type ViewElement,\n} from 'ckeditor5';\nimport { toVarToken } from './variableMention';\n\n/**\n * 正文变量原子色块:isObject inline widget。\n * 不可改内部字符;Backspace/Delete 整颗删(对齐 Coze/Dify chip)。\n */\nexport class MsgVarWidget extends Plugin {\n public static get pluginName() {\n return 'MsgVarWidget' as const;\n }\n\n public static get requires() {\n return [Widget] as const;\n }\n\n public init(): void {\n const editor = this.editor;\n this.#defineSchema();\n this.#defineConverters();\n\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, (viewElement) =>\n viewElement.hasClass('msg-var-token'),\n ),\n );\n }\n\n #defineSchema(): void {\n const schema = this.editor.model.schema;\n schema.register('msgVar', {\n inheritAllFrom: '$inlineObject',\n allowAttributes: ['key'],\n });\n }\n\n #defineConverters(): void {\n const conversion = this.editor.conversion;\n\n conversion.for('editingDowncast').elementToElement({\n model: 'msgVar',\n view: (modelItem, { writer }) => {\n const key = String(modelItem.getAttribute('key') || '');\n const widgetElement = createMsgVarView(writer, key);\n return toWidget(widgetElement, writer, { label: `变量 ${key}` });\n },\n });\n\n conversion.for('dataDowncast').elementToElement({\n model: 'msgVar',\n view: (modelItem, { writer }) => {\n const key = String(modelItem.getAttribute('key') || '');\n return createMsgVarView(writer, key);\n },\n });\n\n conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n classes: ['msg-var-token'],\n },\n model: (viewElement, { writer }) => {\n const key = resolveKeyFromView(viewElement);\n if (!key) return null;\n return writer.createElement('msgVar', { key });\n },\n });\n }\n}\n\nfunction createMsgVarView(writer: ViewDowncastWriter, key: string): ViewElement {\n const span = writer.createContainerElement('span', {\n class: 'msg-var-token',\n 'data-var': key,\n });\n writer.insert(writer.createPositionAt(span, 0), writer.createText(toVarToken(key)));\n return span;\n}\n\nfunction resolveKeyFromView(viewElement: ViewElement): string {\n const fromAttr = String(viewElement.getAttribute('data-var') || '').trim();\n if (fromAttr) return fromAttr;\n let text = '';\n for (const child of viewElement.getChildren()) {\n if (child.is('$text') || child.is('$textProxy')) {\n text += child.data;\n }\n }\n const m = text.match(/^\\{\\{(\\w+)\\}\\}$/);\n return m?.[1] ?? '';\n}\n\n/** 在选区插入原子变量色块,并焦点回编辑器 */\nexport function insertMsgVar(editor: Editor, key: string): void {\n const k = String(key || '').trim();\n if (!k) return;\n editor.model.change((writer) => {\n const el = writer.createElement('msgVar', { key: k });\n editor.model.insertContent(el);\n });\n editor.editing.view.focus();\n}\n"],"names":["MsgVarWidget","Plugin","__privateAdd","_MsgVarWidget_instances","Widget","editor","__privateMethod","defineSchema_fn","defineConverters_fn","viewToModelPositionOutsideModelElement","viewElement","conversion","modelItem","writer","key","widgetElement","createMsgVarView","toWidget","resolveKeyFromView","span","toVarToken","fromAttr","text","child","m","insertMsgVar","k","el"],"mappings":"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"}
1
+ {"version":3,"file":"msgVarTokenPlugin.js","sources":["../../../src/components/Editor/msgVarTokenPlugin.ts"],"sourcesContent":["import {\n Plugin,\n Widget,\n toWidget,\n viewToModelPositionOutsideModelElement,\n type Editor,\n type ModelElement,\n type ViewDowncastWriter,\n type ViewElement,\n} from 'ckeditor5';\nimport { MSG_VAR_TOKEN_CLASS, toVarToken } from './variableMention';\n\n/** 色块可持久化的文本样式($inlineObject 本身不吃 bold 等 text attribute) */\nexport const MSG_VAR_MARK_ATTRS = [\n 'bold',\n 'italic',\n 'underline',\n 'fontColor',\n 'fontBackgroundColor',\n] as const;\n\nexport type MsgVarMarkAttr = (typeof MSG_VAR_MARK_ATTRS)[number];\n\ntype MsgVarMarks = Partial<{\n bold: true;\n italic: true;\n underline: true;\n fontColor: string;\n fontBackgroundColor: string;\n}>;\n\n/**\n * 正文变量原子色块:isObject inline widget。\n * 不可改内部字符;Backspace/Delete 整颗删(对齐 Coze/Dify chip)。\n * 加粗/斜体/下划线/字色落在色块上时写入 model 属性,存盘再包回 HTML,避免重开丢失。\n */\nexport class MsgVarWidget extends Plugin {\n public static get pluginName() {\n return 'MsgVarWidget' as const;\n }\n\n public static get requires() {\n return [Widget] as const;\n }\n\n public init(): void {\n const editor = this.editor;\n this.#defineSchema();\n this.#defineConverters();\n this.#bindFormatCommands();\n\n editor.editing.mapper.on(\n 'viewToModelPosition',\n viewToModelPositionOutsideModelElement(editor.model, (viewElement) =>\n viewElement.hasClass(MSG_VAR_TOKEN_CLASS),\n ),\n );\n }\n\n #defineSchema(): void {\n const schema = this.editor.model.schema;\n schema.register('msgVar', {\n inheritAllFrom: '$inlineObject',\n allowAttributes: ['key', ...MSG_VAR_MARK_ATTRS],\n });\n }\n\n #defineConverters(): void {\n const conversion = this.editor.conversion;\n\n conversion.for('editingDowncast').elementToElement({\n model: 'msgVar',\n view: (modelItem, { writer }) => {\n const key = String(modelItem.getAttribute('key') || '');\n // 编辑态:toWidget 必须包在色块 span 上;样式用 data-* + CSS,勿外包 strong\n const chip = createMsgVarChipView(writer, key, collectMarksFromModel(modelItem));\n return toWidget(chip, writer, { label: `变量 ${key}` });\n },\n });\n\n conversion.for('dataDowncast').elementToElement({\n model: 'msgVar',\n view: (modelItem, { writer }) => {\n const key = String(modelItem.getAttribute('key') || '');\n const marks = collectMarksFromModel(modelItem);\n const chip = createMsgVarChipView(writer, key, marks);\n return wrapMsgVarViewWithMarks(writer, chip, marks);\n },\n });\n\n conversion.for('upcast').elementToElement({\n view: {\n name: 'span',\n classes: [MSG_VAR_TOKEN_CLASS],\n },\n model: (viewElement, { writer }) => {\n const key = resolveKeyFromView(viewElement);\n if (!key) return null;\n const el = writer.createElement('msgVar', { key });\n const marks: MsgVarMarks = {\n ...collectMarksFromDataAttrs(viewElement),\n ...collectMarksFromAncestors(viewElement),\n };\n applyMarksToModel(writer, el, marks);\n return el;\n },\n });\n }\n\n /** 选中色块时,工具栏加粗/斜体/下划线/字色作用在 msgVar 属性上 */\n #bindFormatCommands(): void {\n const editor = this.editor;\n bindBooleanMarkCommand(editor, 'bold');\n bindBooleanMarkCommand(editor, 'italic');\n bindBooleanMarkCommand(editor, 'underline');\n bindColorMarkCommand(editor, 'fontColor', 'fontColor');\n bindColorMarkCommand(editor, 'fontBackgroundColor', 'fontBackgroundColor');\n\n const removeFormat = editor.commands.get('removeFormat');\n if (removeFormat) {\n removeFormat.on(\n 'execute',\n (evt) => {\n const msgVar = getSelectedMsgVar(editor);\n if (!msgVar) return;\n evt.stop();\n editor.model.change((writer) => {\n for (const attr of MSG_VAR_MARK_ATTRS) {\n writer.removeAttribute(attr, msgVar);\n }\n });\n },\n { priority: 'high' },\n );\n }\n }\n}\n\nfunction bindBooleanMarkCommand(\n editor: Editor,\n commandName: 'bold' | 'italic' | 'underline',\n): void {\n const command = editor.commands.get(commandName);\n if (!command) return;\n command.on(\n 'execute',\n (evt) => {\n const msgVar = getSelectedMsgVar(editor);\n if (!msgVar) return;\n evt.stop();\n editor.model.change((writer) => {\n if (msgVar.getAttribute(commandName)) {\n writer.removeAttribute(commandName, msgVar);\n } else {\n writer.setAttribute(commandName, true, msgVar);\n }\n });\n },\n { priority: 'high' },\n );\n command.on(\n 'refresh',\n () => {\n const msgVar = getSelectedMsgVar(editor);\n if (!msgVar) return;\n (command as { value: unknown; isEnabled: boolean }).value =\n !!msgVar.getAttribute(commandName);\n (command as { isEnabled: boolean }).isEnabled = true;\n },\n { priority: 'lowest' },\n );\n}\n\nfunction bindColorMarkCommand(\n editor: Editor,\n commandName: 'fontColor' | 'fontBackgroundColor',\n attr: 'fontColor' | 'fontBackgroundColor',\n): void {\n const command = editor.commands.get(commandName);\n if (!command) return;\n command.on(\n 'execute',\n (evt, args: { value?: string } | undefined) => {\n const msgVar = getSelectedMsgVar(editor);\n if (!msgVar) return;\n evt.stop();\n const next = String(args?.value || '').trim();\n editor.model.change((writer) => {\n if (!next) writer.removeAttribute(attr, msgVar);\n else writer.setAttribute(attr, next, msgVar);\n });\n },\n { priority: 'high' },\n );\n command.on(\n 'refresh',\n () => {\n const msgVar = getSelectedMsgVar(editor);\n if (!msgVar) return;\n (command as { value: unknown; isEnabled: boolean }).value =\n msgVar.getAttribute(attr) || undefined;\n (command as { isEnabled: boolean }).isEnabled = true;\n },\n { priority: 'lowest' },\n );\n}\n\nfunction getSelectedMsgVar(editor: Editor): ModelElement | null {\n const sel = editor.model.document.selection;\n const selected = sel.getSelectedElement();\n if (selected?.is('element', 'msgVar')) return selected;\n const pos = sel.getFirstPosition();\n if (!pos) return null;\n const nodeBefore = pos.nodeBefore;\n const nodeAfter = pos.nodeAfter;\n if (nodeBefore?.is('element', 'msgVar') && sel.isCollapsed) return nodeBefore;\n if (nodeAfter?.is('element', 'msgVar') && sel.isCollapsed) return nodeAfter;\n return null;\n}\n\nfunction collectMarksFromModel(modelItem: ModelElement): MsgVarMarks {\n const marks: MsgVarMarks = {};\n if (modelItem.getAttribute('bold')) marks.bold = true;\n if (modelItem.getAttribute('italic')) marks.italic = true;\n if (modelItem.getAttribute('underline')) marks.underline = true;\n const color = String(modelItem.getAttribute('fontColor') || '').trim();\n const bg = String(modelItem.getAttribute('fontBackgroundColor') || '').trim();\n if (color) marks.fontColor = color;\n if (bg) marks.fontBackgroundColor = bg;\n return marks;\n}\n\nfunction applyMarksToModel(\n writer: { setAttribute: (key: string, value: unknown, el: ModelElement) => void },\n el: ModelElement,\n marks: MsgVarMarks,\n): void {\n if (marks.bold) writer.setAttribute('bold', true, el);\n if (marks.italic) writer.setAttribute('italic', true, el);\n if (marks.underline) writer.setAttribute('underline', true, el);\n if (marks.fontColor) writer.setAttribute('fontColor', marks.fontColor, el);\n if (marks.fontBackgroundColor) {\n writer.setAttribute('fontBackgroundColor', marks.fontBackgroundColor, el);\n }\n}\n\n/** 色块自身 data-* / style(编辑态 downcast) */\nexport function collectMarksFromDataAttrs(viewElement: ViewElement): MsgVarMarks {\n const marks: MsgVarMarks = {};\n if (viewElement.getAttribute('data-bold') === '1') marks.bold = true;\n if (viewElement.getAttribute('data-italic') === '1') marks.italic = true;\n if (viewElement.getAttribute('data-underline') === '1') marks.underline = true;\n let color = String(viewElement.getAttribute('data-font-color') || '').trim();\n let bg = String(viewElement.getAttribute('data-font-bg') || '').trim();\n const style = String(viewElement.getAttribute('style') || '');\n if (!color) color = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim() || '';\n if (!bg) {\n bg = /(?:^|;)\\s*background(?:-color)?\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim() || '';\n }\n if (color) marks.fontColor = color;\n if (bg) marks.fontBackgroundColor = bg;\n return marks;\n}\n\n/** 从色块祖先读取 strong/em/u/color,供 upcast 写入 model */\nexport function collectMarksFromAncestors(viewElement: ViewElement): MsgVarMarks {\n const marks: MsgVarMarks = {};\n let el: ViewElement | null = viewElement.parent as ViewElement | null;\n while (el && el.is('element')) {\n const name = el.name;\n if (name === 'strong' || name === 'b') marks.bold = true;\n if (name === 'em' || name === 'i') marks.italic = true;\n if (name === 'u') marks.underline = true;\n if (name === 'span') {\n const style = String(el.getAttribute('style') || '');\n const color = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n const bg = /(?:^|;)\\s*background(?:-color)?\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n if (color && !marks.fontColor) marks.fontColor = color;\n if (bg && !marks.fontBackgroundColor) marks.fontBackgroundColor = bg;\n }\n if (['p', 'li', 'div', 'h1', 'h2', 'h3', 'h4', 'td', 'th', 'body'].includes(name)) break;\n el = el.parent as ViewElement | null;\n }\n return marks;\n}\n\n/**\n * dataDowncast:按 marks 包一层 HTML(strong/em/u/color),内层仍为 msg-var-token。\n * 导出供单测校验包层顺序。\n */\nexport function wrapMsgVarViewWithMarks(\n writer: ViewDowncastWriter,\n tokenView: ViewElement,\n marks: MsgVarMarks,\n): ViewElement {\n let view: ViewElement = tokenView;\n if (marks.fontBackgroundColor) {\n view = writer.createContainerElement('span', {\n style: `background-color:${marks.fontBackgroundColor}`,\n });\n writer.insert(writer.createPositionAt(view, 0), tokenView);\n tokenView = view;\n }\n if (marks.fontColor) {\n const colorWrap = writer.createContainerElement('span', {\n style: `color:${marks.fontColor}`,\n });\n writer.insert(writer.createPositionAt(colorWrap, 0), view);\n view = colorWrap;\n }\n if (marks.underline) {\n const u = writer.createContainerElement('u');\n writer.insert(writer.createPositionAt(u, 0), view);\n view = u;\n }\n if (marks.italic) {\n const em = writer.createContainerElement('em');\n writer.insert(writer.createPositionAt(em, 0), view);\n view = em;\n }\n if (marks.bold) {\n const strong = writer.createContainerElement('strong');\n writer.insert(writer.createPositionAt(strong, 0), view);\n view = strong;\n }\n return view;\n}\n\nfunction createMsgVarChipView(\n writer: ViewDowncastWriter,\n key: string,\n marks: MsgVarMarks = {},\n): ViewElement {\n const attrs: Record<string, string> = {\n class: MSG_VAR_TOKEN_CLASS,\n 'data-var': key,\n };\n if (marks.bold) attrs['data-bold'] = '1';\n if (marks.italic) attrs['data-italic'] = '1';\n if (marks.underline) attrs['data-underline'] = '1';\n if (marks.fontColor) attrs['data-font-color'] = marks.fontColor;\n if (marks.fontBackgroundColor) attrs['data-font-bg'] = marks.fontBackgroundColor;\n\n const styleParts: string[] = [];\n if (marks.fontColor) styleParts.push(`color:${marks.fontColor}`);\n if (marks.fontBackgroundColor) {\n styleParts.push(`background-color:${marks.fontBackgroundColor}`);\n }\n if (styleParts.length) attrs.style = styleParts.join(';');\n\n const span = writer.createContainerElement('span', attrs);\n writer.insert(writer.createPositionAt(span, 0), writer.createText(toVarToken(key)));\n return span;\n}\n\nfunction resolveKeyFromView(viewElement: ViewElement): string {\n const fromAttr = String(viewElement.getAttribute('data-var') || '').trim();\n if (fromAttr) return fromAttr;\n let text = '';\n for (const child of viewElement.getChildren()) {\n if (child.is('$text') || child.is('$textProxy')) {\n text += child.data;\n }\n }\n const m = text.match(/^\\{\\{(\\w+)\\}\\}$/);\n return m?.[1] ?? '';\n}\n\n/** 在选区插入原子变量色块,并焦点回编辑器 */\nexport function insertMsgVar(editor: Editor, key: string): void {\n const k = String(key || '').trim();\n if (!k) return;\n editor.model.change((writer) => {\n const el = writer.createElement('msgVar', { key: k });\n editor.model.insertContent(el);\n });\n editor.editing.view.focus();\n}\n"],"names":["MSG_VAR_MARK_ATTRS","MsgVarWidget","Plugin","__privateAdd","_MsgVarWidget_instances","Widget","editor","__privateMethod","defineSchema_fn","defineConverters_fn","bindFormatCommands_fn","viewToModelPositionOutsideModelElement","viewElement","MSG_VAR_TOKEN_CLASS","conversion","modelItem","writer","key","chip","createMsgVarChipView","collectMarksFromModel","toWidget","marks","wrapMsgVarViewWithMarks","resolveKeyFromView","el","collectMarksFromDataAttrs","collectMarksFromAncestors","applyMarksToModel","bindBooleanMarkCommand","bindColorMarkCommand","removeFormat","evt","msgVar","getSelectedMsgVar","attr","commandName","command","args","next","sel","selected","pos","nodeBefore","nodeAfter","color","bg","style","_b","_a","_d","_c","name","tokenView","view","colorWrap","u","em","strong","attrs","styleParts","span","toVarToken","fromAttr","text","child","m","insertMsgVar","k"],"mappings":"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"}
@@ -28,10 +28,29 @@ export declare function toMentionFeedItem(v: VariableMentionItem): {
28
28
  */
29
29
  export declare function normalizeMentionHtmlToVarTokens(html: string): string;
30
30
  /**
31
- * 读入编辑器前:裸 `{{key}}` / 旧色块 → 带 data-var 的 span,供 MsgVarWidget upcast。
31
+ * CKEditor Classic 根级必须是块级;库内/seed 常为纯文本 `{{x}}你好…`,
32
+ * 直接 setData 会被丢掉 → 编辑区空白而 Form/预览仍有值。
33
+ */
34
+ export declare function ensureRichTextBlockHtml(html: string): string;
35
+ /**
36
+ * CKEditor 模型里 bold/color 等 attribute 不能包住 $inlineObject(msgVar)。
37
+ * 若 `<strong>/<span style=color>` 内含色块,setData 会整段丢掉样式。
38
+ * 用 DOM 拆开(禁非贪婪正则,嵌套 span 会截断错误)。
39
+ */
40
+ export declare function splitInlineFormatAroundMsgVars(html: string): string;
41
+ /**
42
+ * 读入编辑器前:裸 `{{key}}` / 旧色块 → 带 data-var 的 span,供 MsgVarWidget upcast;
43
+ * 拆开「格式壳包色块」;保证块级包裹。
32
44
  */
33
45
  export declare function wrapVarTokensForDisplay(html: string): string;
46
+ /** 挂载/回填编辑器统一入口(含非变量模式) */
47
+ export declare function prepareEditorHtml(html: string, enableVariableMention: boolean): string;
34
48
  /** @deprecated 兼容旧名;等同 wrapVarTokensForDisplay */
35
49
  export declare function upliftVarTokensToMentions(html: string): string;
36
50
  /** 在纯文本光标处插入 `{{key}}` */
37
51
  export declare function insertVarTokenAt(text: string, key: string, caret?: number): string;
52
+ /**
53
+ * 存盘前:去掉 msg-var-token 色块壳,保留外层 strong/em/color 与字面 `{{key}}`。
54
+ * 样式以外层语义标签为准(dataDowncast 已包 strong/color);勿再按 data-* 套一层以免双重标签。
55
+ */
56
+ export declare function unwrapMsgVarSpansForStorage(html: string): string;
@@ -1,64 +1,152 @@
1
- const i = "msg-var-token", g = /\{\{(\w+)\}\}/g;
2
- function c(n) {
3
- return `{{${String(n || "").trim()}}}`;
4
- }
5
- function f(n) {
6
- const t = String(n.key || "").trim(), r = String(n.label || "").trim();
7
- return r && r !== t ? `${r} ${t}` : t;
8
- }
9
- function S(n, t) {
10
- const r = Array.isArray(n) ? n : [], a = String(t || "").replace(/^\//, "").trim().toLowerCase();
11
- return a ? r.filter((e) => {
12
- const s = String(e.key || "").toLowerCase(), o = String(e.label || "").toLowerCase();
13
- return s.includes(a) || o.includes(a);
14
- }) : r;
15
- }
16
- function m(n) {
17
- const t = String(n.key || "").trim();
1
+ const o = "msg-var-token", R = /\{\{(\w+)\}\}/g;
2
+ function w(e) {
3
+ return `{{${String(e || "").trim()}}}`;
4
+ }
5
+ function C(e) {
6
+ const t = String(e.key || "").trim(), n = String(e.label || "").trim();
7
+ return n && n !== t ? `${n} ${t}` : t;
8
+ }
9
+ function L(e, t) {
10
+ const n = Array.isArray(e) ? e : [], s = String(t || "").replace(/^\//, "").trim().toLowerCase();
11
+ return s ? n.filter((r) => {
12
+ const a = String(r.key || "").toLowerCase(), c = String(r.label || "").toLowerCase();
13
+ return a.includes(s) || c.includes(s);
14
+ }) : n;
15
+ }
16
+ function M(e) {
17
+ const t = String(e.key || "").trim();
18
18
  return {
19
19
  id: `/${t}`,
20
- text: c(t),
20
+ text: w(t),
21
21
  key: t,
22
- label: n.label
22
+ label: e.label
23
23
  };
24
24
  }
25
- function u(n) {
26
- return String(n || "").replace(
25
+ function x(e) {
26
+ return String(e || "").replace(
27
27
  /<span\b[^>]*\bdata-mention="\/(\w+)"[^>]*>[\s\S]*?<\/span>/gi,
28
- (t, r) => `<span class="${i}" data-var="${r}">{{${r}}}</span>`
28
+ (t, n) => `<span class="${o}" data-var="${n}">{{${n}}}</span>`
29
29
  );
30
30
  }
31
- function p(n) {
32
- let t = u(String(n || ""));
33
- const r = new RegExp(
34
- `<span\\b([^>]*\\bclass="[^"]*${i}[^"]*"[^>]*)>\\{\\{(\\w+)\\}\\}<\\/span>`,
31
+ function _(e) {
32
+ const t = String(e || "").trim();
33
+ return t ? /<(p|div|ul|ol|h[1-6]|table|blockquote|pre)\b/i.test(t) ? t : /[\r\n]/.test(t) ? t.split(/\r?\n/).map((n) => `<p>${n || "<br>"}</p>`).join("") : `<p>${t}</p>` : "";
34
+ }
35
+ function $(e, t, n) {
36
+ e.getAttribute(t) || e.setAttribute(t, n);
37
+ }
38
+ function k(e) {
39
+ const t = String(e || "");
40
+ if (!t.includes(o)) return t;
41
+ if (typeof DOMParser > "u") return V(t);
42
+ const s = new DOMParser().parseFromString(`<div id="__rte_root">${t}</div>`, "text/html").getElementById("__rte_root");
43
+ if (!s) return t;
44
+ let r = 0;
45
+ for (; r < 12; ) {
46
+ r += 1;
47
+ const a = A(s);
48
+ if (!a) break;
49
+ E(a);
50
+ }
51
+ return s.innerHTML;
52
+ }
53
+ function A(e) {
54
+ var n, s;
55
+ const t = e.querySelectorAll("strong, b, em, i, u, span[style]");
56
+ for (const r of Array.from(t))
57
+ if (!((n = r.classList) != null && n.contains(o)) && (s = r.querySelector) != null && s.call(r, `.${o}`))
58
+ return r;
59
+ return null;
60
+ }
61
+ function E(e) {
62
+ var i, f, g, b, m;
63
+ const t = e.parentNode;
64
+ if (!t) return;
65
+ const n = e.tagName.toLowerCase(), s = e.getAttribute("style") || "", r = (f = (i = /(?:^|;)\s*color\s*:\s*([^;]+)/i.exec(s)) == null ? void 0 : i[1]) == null ? void 0 : f.trim(), a = (b = (g = /(?:^|;)\s*background(?:-color)?\s*:\s*([^;]+)/i.exec(s)) == null ? void 0 : g[1]) == null ? void 0 : b.trim(), c = e.ownerDocument, l = c.createDocumentFragment(), p = Array.from(e.childNodes);
66
+ for (const d of p) {
67
+ if (d.nodeType === 1) {
68
+ const u = d;
69
+ if ((m = u.classList) != null && m.contains(o)) {
70
+ (n === "strong" || n === "b") && $(u, "data-bold", "1"), (n === "em" || n === "i") && $(u, "data-italic", "1"), n === "u" && $(u, "data-underline", "1"), r && $(u, "data-font-color", r), a && $(u, "data-font-bg", a), l.appendChild(u);
71
+ continue;
72
+ }
73
+ }
74
+ const S = c.createElement(n === "span" ? "span" : n);
75
+ n === "span" && s && S.setAttribute("style", s), S.appendChild(d), l.appendChild(S);
76
+ }
77
+ t.replaceChild(l, e);
78
+ }
79
+ function V(e) {
80
+ let t = e;
81
+ const n = `<span\\b[^>]*\\b${o}\\b[^>]*>\\s*\\{\\{\\w+\\}\\}\\s*<\\/span>`;
82
+ return t = t.replace(
83
+ new RegExp(`<(strong|b)(?:\\s[^>]*)?>\\s*(${n})\\s*<\\/\\1>`, "gi"),
84
+ (s, r, a) => a.includes("data-bold=") ? a : a.replace(/<span\b/i, '<span data-bold="1"')
85
+ ), t = t.replace(
86
+ new RegExp(`<(em|i)(?:\\s[^>]*)?>\\s*(${n})\\s*<\\/\\1>`, "gi"),
87
+ (s, r, a) => a.includes("data-italic=") ? a : a.replace(/<span\b/i, '<span data-italic="1"')
88
+ ), t = t.replace(
89
+ new RegExp(`<u(?:\\s[^>]*)?>\\s*(${n})\\s*<\\/u>`, "gi"),
90
+ (s, r) => r.includes("data-underline=") ? r : r.replace(/<span\b/i, '<span data-underline="1"')
91
+ ), t = t.replace(
92
+ new RegExp(
93
+ `<span(\\s[^>]*\\bstyle\\s*=\\s*["'][^"']*["'][^>]*)>\\s*(${n})\\s*<\\/span>`,
94
+ "gi"
95
+ ),
96
+ (s, r, a) => {
97
+ var f, g, b, m, d;
98
+ if (new RegExp(`\\b${o}\\b`, "i").test(r)) return s;
99
+ const c = ((f = /style\s*=\s*["']([^"']*)["']/i.exec(r)) == null ? void 0 : f[1]) || "", l = (b = (g = /(?:^|;)\s*color\s*:\s*([^;]+)/i.exec(c)) == null ? void 0 : g[1]) == null ? void 0 : b.trim(), p = (d = (m = /(?:^|;)\s*background(?:-color)?\s*:\s*([^;]+)/i.exec(c)) == null ? void 0 : m[1]) == null ? void 0 : d.trim();
100
+ let i = a;
101
+ return l && !/data-font-color=/.test(i) && (i = i.replace(/<span\b/i, `<span data-font-color="${l}"`)), p && !/data-font-bg=/.test(i) && (i = i.replace(/<span\b/i, `<span data-font-bg="${p}"`)), i;
102
+ }
103
+ ), t;
104
+ }
105
+ function y(e) {
106
+ let t = x(String(e || ""));
107
+ const n = new RegExp(
108
+ `<span\\b([^>]*\\bclass="[^"]*${o}[^"]*"[^>]*)>\\{\\{(\\w+)\\}\\}<\\/span>`,
35
109
  "gi"
36
110
  );
37
- return t = t.replace(r, (a, e, s) => /\bdata-var=/.test(e) ? `<span${e}>{{${s}}}</span>` : `<span class="${i}" data-var="${s}">{{${s}}}</span>`), t = t.replace(/(^|>)([^<]*)/g, (a, e, s) => {
38
- const o = s.replace(
111
+ return t = t.replace(n, (s, r, a) => /\bdata-var=/.test(r) ? `<span${r}>{{${a}}}</span>` : `<span class="${o}" data-var="${a}">{{${a}}}</span>`), t = t.replace(/(^|>)([^<]*)/g, (s, r, a) => {
112
+ const c = a.replace(
39
113
  /\{\{(\w+)\}\}/g,
40
- ($, l) => `<span class="${i}" data-var="${l}">{{${l}}}</span>`
114
+ (l, p) => `<span class="${o}" data-var="${p}">{{${p}}}</span>`
41
115
  );
42
- return `${e}${o}`;
43
- }), t;
116
+ return `${r}${c}`;
117
+ }), t = _(t), k(t);
44
118
  }
45
- function b(n) {
46
- return p(n);
119
+ function T(e, t) {
120
+ const n = String(e || "");
121
+ return t ? y(n) : _(n);
47
122
  }
48
- function d(n, t, r = -1) {
49
- const a = c(t), e = String(n || "");
50
- return r < 0 || r > e.length ? `${e}${a}` : `${e.slice(0, r)}${a}${e.slice(r)}`;
123
+ function h(e) {
124
+ return y(e);
125
+ }
126
+ function F(e, t, n = -1) {
127
+ const s = w(t), r = String(e || "");
128
+ return n < 0 || n > r.length ? `${r}${s}` : `${r.slice(0, n)}${s}${r.slice(n)}`;
129
+ }
130
+ function H(e) {
131
+ return String(e || "").replace(
132
+ /<span\b[^>]*\bmsg-var-token\b[^>]*>\s*\{\{(\w+)\}\}\s*<\/span>/gi,
133
+ (t, n) => `{{${n}}}`
134
+ );
51
135
  }
52
136
  export {
53
- i as MSG_VAR_TOKEN_CLASS,
54
- g as VAR_PLACEHOLDER_RE,
55
- S as filterVariableFeed,
56
- f as formatVariableOptionLabel,
57
- d as insertVarTokenAt,
58
- u as normalizeMentionHtmlToVarTokens,
59
- m as toMentionFeedItem,
60
- c as toVarToken,
61
- b as upliftVarTokensToMentions,
62
- p as wrapVarTokensForDisplay
137
+ o as MSG_VAR_TOKEN_CLASS,
138
+ R as VAR_PLACEHOLDER_RE,
139
+ _ as ensureRichTextBlockHtml,
140
+ L as filterVariableFeed,
141
+ C as formatVariableOptionLabel,
142
+ F as insertVarTokenAt,
143
+ x as normalizeMentionHtmlToVarTokens,
144
+ T as prepareEditorHtml,
145
+ k as splitInlineFormatAroundMsgVars,
146
+ M as toMentionFeedItem,
147
+ w as toVarToken,
148
+ H as unwrapMsgVarSpansForStorage,
149
+ h as upliftVarTokensToMentions,
150
+ y as wrapVarTokensForDisplay
63
151
  };
64
152
  //# sourceMappingURL=variableMention.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"variableMention.js","sources":["../../../src/components/Editor/variableMention.ts"],"sourcesContent":["/**\n * 变量占位工具:存盘 `{{key}}`(与 marsun_msg_center render 对齐)。\n * 插入走「插入变量」按钮(VariablePicker);正文为原子 widget。\n * 禁止 FE DEFAULT_VARS。\n */\n\nexport type VariableMentionItem = {\n key: string;\n label?: string;\n type?: string;\n};\n\n/** 编辑区色块 class(RTE content + Input 展示) */\nexport const MSG_VAR_TOKEN_CLASS = 'msg-var-token';\n\n/** 双花括号占位 */\nexport const VAR_PLACEHOLDER_RE = /\\{\\{(\\w+)\\}\\}/g;\n\nexport function toVarToken(key: string): string {\n return `{{${String(key || '').trim()}}}`;\n}\n\n/** 下拉展示:中文 label + code(无前导 /) */\nexport function formatVariableOptionLabel(v: VariableMentionItem): string {\n const key = String(v.key || '').trim();\n const label = String(v.label || '').trim();\n if (label && label !== key) return `${label} ${key}`;\n return key;\n}\n\nexport function filterVariableFeed(\n variables: VariableMentionItem[] | undefined,\n query: string,\n): VariableMentionItem[] {\n const list = Array.isArray(variables) ? variables : [];\n const q = String(query || '')\n .replace(/^\\//, '')\n .trim()\n .toLowerCase();\n if (!q) return list;\n return list.filter((v) => {\n const key = String(v.key || '').toLowerCase();\n const label = String(v.label || '').toLowerCase();\n return key.includes(q) || label.includes(q);\n });\n}\n\n/** CKEditor Mention feed item:id 须以 marker 开头;text 为插入的 {{key}} */\nexport function toMentionFeedItem(v: VariableMentionItem): {\n id: string;\n text: string;\n key: string;\n label?: string;\n} {\n const key = String(v.key || '').trim();\n return {\n id: `/${key}`,\n text: toVarToken(key),\n key,\n label: v.label,\n };\n}\n\n/**\n * 将 CKEditor mention 节点规范为字面 `{{key}}` 色块 span(存盘/预览用)。\n */\nexport function normalizeMentionHtmlToVarTokens(html: string): string {\n return String(html || '').replace(\n /<span\\b[^>]*\\bdata-mention=\"\\/(\\w+)\"[^>]*>[\\s\\S]*?<\\/span>/gi,\n (_m, key: string) => `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`,\n );\n}\n\n/**\n * 读入编辑器前:裸 `{{key}}` / 旧色块 → 带 data-var 的 span,供 MsgVarWidget upcast。\n */\nexport function wrapVarTokensForDisplay(html: string): string {\n let s = normalizeMentionHtmlToVarTokens(String(html || ''));\n const tokenSpanRe = new RegExp(\n `<span\\\\b([^>]*\\\\bclass=\"[^\"]*${MSG_VAR_TOKEN_CLASS}[^\"]*\"[^>]*)>\\\\{\\\\{(\\\\w+)\\\\}\\\\}<\\\\/span>`,\n 'gi',\n );\n s = s.replace(tokenSpanRe, (_m, attrs: string, key: string) => {\n if (/\\bdata-var=/.test(attrs)) return `<span${attrs}>{{${key}}}</span>`;\n return `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`;\n });\n s = s.replace(/(^|>)([^<]*)/g, (_full, prefix: string, text: string) => {\n const next = text.replace(\n /\\{\\{(\\w+)\\}\\}/g,\n (_m, key: string) =>\n `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`,\n );\n return `${prefix}${next}`;\n });\n return s;\n}\n\n/** @deprecated 兼容旧名;等同 wrapVarTokensForDisplay */\nexport function upliftVarTokensToMentions(html: string): string {\n return wrapVarTokensForDisplay(html);\n}\n\n/** 在纯文本光标处插入 `{{key}}` */\nexport function insertVarTokenAt(text: string, key: string, caret = -1): string {\n const token = toVarToken(key);\n const src = String(text || '');\n if (caret < 0 || caret > src.length) return `${src}${token}`;\n return `${src.slice(0, caret)}${token}${src.slice(caret)}`;\n}\n"],"names":["MSG_VAR_TOKEN_CLASS","VAR_PLACEHOLDER_RE","toVarToken","key","formatVariableOptionLabel","v","label","filterVariableFeed","variables","query","list","q","toMentionFeedItem","normalizeMentionHtmlToVarTokens","html","_m","wrapVarTokensForDisplay","s","tokenSpanRe","attrs","_full","prefix","text","next","upliftVarTokensToMentions","insertVarTokenAt","caret","token","src"],"mappings":"AAaO,MAAMA,IAAsB,iBAGtBC,IAAqB;AAE3B,SAASC,EAAWC,GAAqB;AAC9C,SAAO,KAAK,OAAOA,KAAO,EAAE,EAAE,MAAM;AACtC;AAGO,SAASC,EAA0BC,GAAgC;AACxE,QAAMF,IAAM,OAAOE,EAAE,OAAO,EAAE,EAAE,KAAA,GAC1BC,IAAQ,OAAOD,EAAE,SAAS,EAAE,EAAE,KAAA;AACpC,SAAIC,KAASA,MAAUH,IAAY,GAAGG,CAAK,KAAKH,CAAG,KAC5CA;AACT;AAEO,SAASI,EACdC,GACAC,GACuB;AACvB,QAAMC,IAAO,MAAM,QAAQF,CAAS,IAAIA,IAAY,CAAA,GAC9CG,IAAI,OAAOF,KAAS,EAAE,EACzB,QAAQ,OAAO,EAAE,EACjB,KAAA,EACA,YAAA;AACH,SAAKE,IACED,EAAK,OAAO,CAACL,MAAM;AACxB,UAAMF,IAAM,OAAOE,EAAE,OAAO,EAAE,EAAE,YAAA,GAC1BC,IAAQ,OAAOD,EAAE,SAAS,EAAE,EAAE,YAAA;AACpC,WAAOF,EAAI,SAASQ,CAAC,KAAKL,EAAM,SAASK,CAAC;AAAA,EAC5C,CAAC,IALcD;AAMjB;AAGO,SAASE,EAAkBP,GAKhC;AACA,QAAMF,IAAM,OAAOE,EAAE,OAAO,EAAE,EAAE,KAAA;AAChC,SAAO;AAAA,IACL,IAAI,IAAIF,CAAG;AAAA,IACX,MAAMD,EAAWC,CAAG;AAAA,IACpB,KAAAA;AAAA,IACA,OAAOE,EAAE;AAAA,EAAA;AAEb;AAKO,SAASQ,EAAgCC,GAAsB;AACpE,SAAO,OAAOA,KAAQ,EAAE,EAAE;AAAA,IACxB;AAAA,IACA,CAACC,GAAIZ,MAAgB,gBAAgBH,CAAmB,eAAeG,CAAG,OAAOA,CAAG;AAAA,EAAA;AAExF;AAKO,SAASa,EAAwBF,GAAsB;AAC5D,MAAIG,IAAIJ,EAAgC,OAAOC,KAAQ,EAAE,CAAC;AAC1D,QAAMI,IAAc,IAAI;AAAA,IACtB,gCAAgClB,CAAmB;AAAA,IACnD;AAAA,EAAA;AAEF,SAAAiB,IAAIA,EAAE,QAAQC,GAAa,CAACH,GAAII,GAAehB,MACzC,cAAc,KAAKgB,CAAK,IAAU,QAAQA,CAAK,MAAMhB,CAAG,cACrD,gBAAgBH,CAAmB,eAAeG,CAAG,OAAOA,CAAG,WACvE,GACDc,IAAIA,EAAE,QAAQ,iBAAiB,CAACG,GAAOC,GAAgBC,MAAiB;AACtE,UAAMC,IAAOD,EAAK;AAAA,MAChB;AAAA,MACA,CAACP,GAAIZ,MACH,gBAAgBH,CAAmB,eAAeG,CAAG,OAAOA,CAAG;AAAA,IAAA;AAEnE,WAAO,GAAGkB,CAAM,GAAGE,CAAI;AAAA,EACzB,CAAC,GACMN;AACT;AAGO,SAASO,EAA0BV,GAAsB;AAC9D,SAAOE,EAAwBF,CAAI;AACrC;AAGO,SAASW,EAAiBH,GAAcnB,GAAauB,IAAQ,IAAY;AAC9E,QAAMC,IAAQzB,EAAWC,CAAG,GACtByB,IAAM,OAAON,KAAQ,EAAE;AAC7B,SAAII,IAAQ,KAAKA,IAAQE,EAAI,SAAe,GAAGA,CAAG,GAAGD,CAAK,KACnD,GAAGC,EAAI,MAAM,GAAGF,CAAK,CAAC,GAAGC,CAAK,GAAGC,EAAI,MAAMF,CAAK,CAAC;AAC1D;"}
1
+ {"version":3,"file":"variableMention.js","sources":["../../../src/components/Editor/variableMention.ts"],"sourcesContent":["/**\n * 变量占位工具:存盘 `{{key}}`(与 marsun_msg_center render 对齐)。\n * 插入走「插入变量」按钮(VariablePicker);正文为原子 widget。\n * 禁止 FE DEFAULT_VARS。\n */\n\nexport type VariableMentionItem = {\n key: string;\n label?: string;\n type?: string;\n};\n\n/** 编辑区色块 class(RTE content + Input 展示) */\nexport const MSG_VAR_TOKEN_CLASS = 'msg-var-token';\n\n/** 双花括号占位 */\nexport const VAR_PLACEHOLDER_RE = /\\{\\{(\\w+)\\}\\}/g;\n\nexport function toVarToken(key: string): string {\n return `{{${String(key || '').trim()}}}`;\n}\n\n/** 下拉展示:中文 label + code(无前导 /) */\nexport function formatVariableOptionLabel(v: VariableMentionItem): string {\n const key = String(v.key || '').trim();\n const label = String(v.label || '').trim();\n if (label && label !== key) return `${label} ${key}`;\n return key;\n}\n\nexport function filterVariableFeed(\n variables: VariableMentionItem[] | undefined,\n query: string,\n): VariableMentionItem[] {\n const list = Array.isArray(variables) ? variables : [];\n const q = String(query || '')\n .replace(/^\\//, '')\n .trim()\n .toLowerCase();\n if (!q) return list;\n return list.filter((v) => {\n const key = String(v.key || '').toLowerCase();\n const label = String(v.label || '').toLowerCase();\n return key.includes(q) || label.includes(q);\n });\n}\n\n/** CKEditor Mention feed item:id 须以 marker 开头;text 为插入的 {{key}} */\nexport function toMentionFeedItem(v: VariableMentionItem): {\n id: string;\n text: string;\n key: string;\n label?: string;\n} {\n const key = String(v.key || '').trim();\n return {\n id: `/${key}`,\n text: toVarToken(key),\n key,\n label: v.label,\n };\n}\n\n/**\n * 将 CKEditor mention 节点规范为字面 `{{key}}` 色块 span(存盘/预览用)。\n */\nexport function normalizeMentionHtmlToVarTokens(html: string): string {\n return String(html || '').replace(\n /<span\\b[^>]*\\bdata-mention=\"\\/(\\w+)\"[^>]*>[\\s\\S]*?<\\/span>/gi,\n (_m, key: string) => `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`,\n );\n}\n\n/**\n * CKEditor Classic 根级必须是块级;库内/seed 常为纯文本 `{{x}}你好…`,\n * 直接 setData 会被丢掉 → 编辑区空白而 Form/预览仍有值。\n */\nexport function ensureRichTextBlockHtml(html: string): string {\n const s = String(html || '').trim();\n if (!s) return '';\n if (/<(p|div|ul|ol|h[1-6]|table|blockquote|pre)\\b/i.test(s)) return s;\n if (/[\\r\\n]/.test(s)) {\n return s\n .split(/\\r?\\n/)\n .map((line) => `<p>${line || '<br>'}</p>`)\n .join('');\n }\n return `<p>${s}</p>`;\n}\n\nfunction injectAttrOnMsgVarEl(el: Element, attr: string, value: string): void {\n if (!el.getAttribute(attr)) el.setAttribute(attr, value);\n}\n\n/**\n * CKEditor 模型里 bold/color 等 attribute 不能包住 $inlineObject(msgVar)。\n * 若 `<strong>/<span style=color>` 内含色块,setData 会整段丢掉样式。\n * 用 DOM 拆开(禁非贪婪正则,嵌套 span 会截断错误)。\n */\nexport function splitInlineFormatAroundMsgVars(html: string): string {\n const src = String(html || '');\n if (!src.includes(MSG_VAR_TOKEN_CLASS)) return src;\n if (typeof DOMParser === 'undefined') return splitFormatChipOnlyWrappers(src);\n\n const doc = new DOMParser().parseFromString(`<div id=\"__rte_root\">${src}</div>`, 'text/html');\n const root = doc.getElementById('__rte_root');\n if (!root) return src;\n\n let guard = 0;\n while (guard < 12) {\n guard += 1;\n const host = findFormatHostWithMsgVar(root);\n if (!host) break;\n explodeFormatHost(host);\n }\n return root.innerHTML;\n}\n\nfunction findFormatHostWithMsgVar(root: Element): Element | null {\n const candidates = root.querySelectorAll('strong, b, em, i, u, span[style]');\n for (const el of Array.from(candidates)) {\n if (el.classList?.contains(MSG_VAR_TOKEN_CLASS)) continue;\n if (el.querySelector?.(`.${MSG_VAR_TOKEN_CLASS}`)) return el;\n }\n return null;\n}\n\nfunction explodeFormatHost(host: Element): void {\n const parent = host.parentNode;\n if (!parent) return;\n const tag = host.tagName.toLowerCase();\n const style = host.getAttribute('style') || '';\n const color = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n const bg = /(?:^|;)\\s*background(?:-color)?\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n const doc = host.ownerDocument;\n\n const frag = doc.createDocumentFragment();\n const children = Array.from(host.childNodes);\n for (const node of children) {\n if (node.nodeType === 1) {\n const el = node as Element;\n if (el.classList?.contains(MSG_VAR_TOKEN_CLASS)) {\n if (tag === 'strong' || tag === 'b') injectAttrOnMsgVarEl(el, 'data-bold', '1');\n if (tag === 'em' || tag === 'i') injectAttrOnMsgVarEl(el, 'data-italic', '1');\n if (tag === 'u') injectAttrOnMsgVarEl(el, 'data-underline', '1');\n if (color) injectAttrOnMsgVarEl(el, 'data-font-color', color);\n if (bg) injectAttrOnMsgVarEl(el, 'data-font-bg', bg);\n frag.appendChild(el);\n continue;\n }\n }\n // 非色块:保留原格式壳\n const wrap = doc.createElement(tag === 'span' ? 'span' : tag);\n if (tag === 'span' && style) wrap.setAttribute('style', style);\n wrap.appendChild(node);\n frag.appendChild(wrap);\n }\n parent.replaceChild(frag, host);\n}\n\n/** Node 无 DOMParser 时的兜底:只处理「格式壳内仅一颗色块」 */\nfunction splitFormatChipOnlyWrappers(html: string): string {\n let s = html;\n const chip = `<span\\\\b[^>]*\\\\b${MSG_VAR_TOKEN_CLASS}\\\\b[^>]*>\\\\s*\\\\{\\\\{\\\\w+\\\\}\\\\}\\\\s*<\\\\/span>`;\n s = s.replace(\n new RegExp(`<(strong|b)(?:\\\\s[^>]*)?>\\\\s*(${chip})\\\\s*<\\\\/\\\\1>`, 'gi'),\n (_m, _t, c: string) =>\n c.includes('data-bold=') ? c : c.replace(/<span\\b/i, '<span data-bold=\"1\"'),\n );\n s = s.replace(\n new RegExp(`<(em|i)(?:\\\\s[^>]*)?>\\\\s*(${chip})\\\\s*<\\\\/\\\\1>`, 'gi'),\n (_m, _t, c: string) =>\n c.includes('data-italic=') ? c : c.replace(/<span\\b/i, '<span data-italic=\"1\"'),\n );\n s = s.replace(new RegExp(`<u(?:\\\\s[^>]*)?>\\\\s*(${chip})\\\\s*<\\\\/u>`, 'gi'), (_m, c: string) =>\n c.includes('data-underline=') ? c : c.replace(/<span\\b/i, '<span data-underline=\"1\"'),\n );\n s = s.replace(\n new RegExp(\n `<span(\\\\s[^>]*\\\\bstyle\\\\s*=\\\\s*[\"'][^\"']*[\"'][^>]*)>\\\\s*(${chip})\\\\s*<\\\\/span>`,\n 'gi',\n ),\n (_m, attrs: string, c: string) => {\n if (new RegExp(`\\\\b${MSG_VAR_TOKEN_CLASS}\\\\b`, 'i').test(attrs)) return _m;\n const style = /style\\s*=\\s*[\"']([^\"']*)[\"']/i.exec(attrs)?.[1] || '';\n const color = /(?:^|;)\\s*color\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n const bg = /(?:^|;)\\s*background(?:-color)?\\s*:\\s*([^;]+)/i.exec(style)?.[1]?.trim();\n let next = c;\n if (color && !/data-font-color=/.test(next)) {\n next = next.replace(/<span\\b/i, `<span data-font-color=\"${color}\"`);\n }\n if (bg && !/data-font-bg=/.test(next)) {\n next = next.replace(/<span\\b/i, `<span data-font-bg=\"${bg}\"`);\n }\n return next;\n },\n );\n return s;\n}\n\n/**\n * 读入编辑器前:裸 `{{key}}` / 旧色块 → 带 data-var 的 span,供 MsgVarWidget upcast;\n * 拆开「格式壳包色块」;保证块级包裹。\n */\nexport function wrapVarTokensForDisplay(html: string): string {\n let s = normalizeMentionHtmlToVarTokens(String(html || ''));\n const tokenSpanRe = new RegExp(\n `<span\\\\b([^>]*\\\\bclass=\"[^\"]*${MSG_VAR_TOKEN_CLASS}[^\"]*\"[^>]*)>\\\\{\\\\{(\\\\w+)\\\\}\\\\}<\\\\/span>`,\n 'gi',\n );\n s = s.replace(tokenSpanRe, (_m, attrs: string, key: string) => {\n if (/\\bdata-var=/.test(attrs)) return `<span${attrs}>{{${key}}}</span>`;\n return `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`;\n });\n s = s.replace(/(^|>)([^<]*)/g, (_full, prefix: string, text: string) => {\n const next = text.replace(\n /\\{\\{(\\w+)\\}\\}/g,\n (_m, key: string) =>\n `<span class=\"${MSG_VAR_TOKEN_CLASS}\" data-var=\"${key}\">{{${key}}}</span>`,\n );\n return `${prefix}${next}`;\n });\n s = ensureRichTextBlockHtml(s);\n return splitInlineFormatAroundMsgVars(s);\n}\n\n/** 挂载/回填编辑器统一入口(含非变量模式) */\nexport function prepareEditorHtml(html: string, enableVariableMention: boolean): string {\n const raw = String(html || '');\n if (enableVariableMention) return wrapVarTokensForDisplay(raw);\n return ensureRichTextBlockHtml(raw);\n}\n\n/** @deprecated 兼容旧名;等同 wrapVarTokensForDisplay */\nexport function upliftVarTokensToMentions(html: string): string {\n return wrapVarTokensForDisplay(html);\n}\n\n/** 在纯文本光标处插入 `{{key}}` */\nexport function insertVarTokenAt(text: string, key: string, caret = -1): string {\n const token = toVarToken(key);\n const src = String(text || '');\n if (caret < 0 || caret > src.length) return `${src}${token}`;\n return `${src.slice(0, caret)}${token}${src.slice(caret)}`;\n}\n\n/**\n * 存盘前:去掉 msg-var-token 色块壳,保留外层 strong/em/color 与字面 `{{key}}`。\n * 样式以外层语义标签为准(dataDowncast 已包 strong/color);勿再按 data-* 套一层以免双重标签。\n */\nexport function unwrapMsgVarSpansForStorage(html: string): string {\n return String(html || '').replace(\n /<span\\b[^>]*\\bmsg-var-token\\b[^>]*>\\s*\\{\\{(\\w+)\\}\\}\\s*<\\/span>/gi,\n (_m, key: string) => `{{${key}}}`,\n );\n}\n"],"names":["MSG_VAR_TOKEN_CLASS","VAR_PLACEHOLDER_RE","toVarToken","key","formatVariableOptionLabel","v","label","filterVariableFeed","variables","query","list","q","toMentionFeedItem","normalizeMentionHtmlToVarTokens","html","_m","ensureRichTextBlockHtml","s","line","injectAttrOnMsgVarEl","el","attr","value","splitInlineFormatAroundMsgVars","src","splitFormatChipOnlyWrappers","root","guard","host","findFormatHostWithMsgVar","explodeFormatHost","_a","_b","candidates","_c","_d","_e","parent","tag","style","color","bg","doc","frag","children","node","wrap","chip","_t","c","attrs","next","wrapVarTokensForDisplay","tokenSpanRe","_full","prefix","text","prepareEditorHtml","enableVariableMention","raw","upliftVarTokensToMentions","insertVarTokenAt","caret","token","unwrapMsgVarSpansForStorage"],"mappings":"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"}