@zero-library/common 2.0.3 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -7,7 +7,6 @@ var antd = require('antd');
7
7
  var parse = require('html-react-parser');
8
8
  var jsonrepair = require('jsonrepair');
9
9
  var markdownit = require('markdown-it');
10
- var container = require('markdown-it-container');
11
10
  var core$1 = require('@react-pdf-viewer/core');
12
11
  var pageNavigation = require('@react-pdf-viewer/page-navigation');
13
12
  var thumbnail = require('@react-pdf-viewer/thumbnail');
@@ -70,7 +69,6 @@ function _interopNamespace(e) {
70
69
  var React16__namespace = /*#__PURE__*/_interopNamespace(React16);
71
70
  var parse__default = /*#__PURE__*/_interopDefault(parse);
72
71
  var markdownit__default = /*#__PURE__*/_interopDefault(markdownit);
73
- var container__default = /*#__PURE__*/_interopDefault(container);
74
72
  var zh_CN__default = /*#__PURE__*/_interopDefault(zh_CN);
75
73
  var dayjs__default = /*#__PURE__*/_interopDefault(dayjs);
76
74
  var relativeTime__default = /*#__PURE__*/_interopDefault(relativeTime);
@@ -190,64 +188,92 @@ md.renderer.rules.link_open = function(tokens, idx, options, env, self) {
190
188
  token.attrPush(["target", "_blank"]);
191
189
  return self.renderToken(tokens, idx, options);
192
190
  };
193
- var replaceSpecialCharacter = (str) => {
194
- return str.replace(/</g, "&lt;").replace(/>/g, "&gt;");
195
- };
196
- function parseParams(info) {
197
- const params = {};
198
- const regex = /(\w+)\s*=\s*(?:(['"])(.*?)\2|(\S+))/g;
199
- let match;
200
- while ((match = regex.exec(info)) !== null) {
201
- const key = match[1];
202
- const value = match[3] ?? match[4] ?? "";
203
- if (key === "data") {
204
- let obj = {};
205
- try {
206
- obj = JSON.parse(value);
207
- } catch {
208
- try {
209
- obj = JSON.parse(jsonrepair.jsonrepair(value));
210
- } catch {
211
- obj = {};
212
- }
213
- }
214
- params[key] = replaceSpecialCharacter(JSON.stringify(obj));
215
- } else {
216
- params[key] = value;
217
- }
218
- }
219
- return params;
220
- }
221
- md.use(container__default.default, "alert", {
222
- validate: (params) => /^alert/.test(params.trim()),
223
- render: function(tokens, idx) {
224
- const token = tokens[idx];
225
- if (token.nesting === 1) {
226
- const info = token.info.trim();
227
- const params = parseParams(info);
228
- return `<lazy-component ${Object.entries(params).map(([key, value]) => `${key}=${value}`).join(" ")}>`;
229
- } else {
230
- return "</lazy-component>";
191
+ function parseData(raw) {
192
+ let obj = {};
193
+ try {
194
+ obj = JSON.parse(raw);
195
+ } catch {
196
+ try {
197
+ obj = JSON.parse(jsonrepair.jsonrepair(raw));
198
+ } catch {
199
+ obj = { _raw: raw };
231
200
  }
232
201
  }
233
- });
234
- function preprocess(content) {
235
- return content.replace(
236
- /:::alert([\s\S]*?):::/g,
237
- // 匹配 :::alert ... :::
238
- (match, params) => {
239
- return `
240
- :::alert ${params.trim()}
241
- :::
242
- `;
243
- }
244
- );
202
+ return obj;
245
203
  }
246
204
  function highlightKeywords(html, keywords) {
247
205
  const escaped = keywords.map((k) => k.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"));
248
206
  const regex = new RegExp(`(${escaped.join("|")})`, "gi");
249
207
  return html.replace(regex, '<span class="cube-hl">$1</span>');
250
208
  }
209
+ function makePlaceholder(id) {
210
+ return `__ALERT_DATA_${id}__`;
211
+ }
212
+ function extractAlertPlaceholders(src) {
213
+ let pos = 0;
214
+ let id = 0;
215
+ let out = "";
216
+ const placeholders = /* @__PURE__ */ new Map();
217
+ while (pos < src.length) {
218
+ const start = src.indexOf(":::alert", pos);
219
+ if (start === -1) {
220
+ out += src.slice(pos);
221
+ break;
222
+ }
223
+ out += src.slice(pos, start);
224
+ const afterStart = src.slice(start);
225
+ const relAfter = afterStart.slice(":::alert".length);
226
+ const matchLineEnd = relAfter.search(/\n:::\s*(\n|$)/);
227
+ let endIdx = -1;
228
+ if (matchLineEnd !== -1) {
229
+ endIdx = start + ":::alert".length + matchLineEnd + 1;
230
+ } else {
231
+ const fallback = src.indexOf(":::", start + ":::alert".length);
232
+ if (fallback === -1) {
233
+ out += src.slice(start);
234
+ pos = src.length;
235
+ break;
236
+ } else {
237
+ endIdx = fallback;
238
+ }
239
+ }
240
+ const inner = src.slice(start + ":::alert".length, endIdx).trim();
241
+ const typeMatch = inner.match(/type\s*=\s*(?:(['"])(.*?)\1|(\S+))/);
242
+ const type = typeMatch ? typeMatch[2] ?? typeMatch[3] : void 0;
243
+ const dataIdx = inner.search(/\bdata\s*=/);
244
+ let rawData = "";
245
+ if (dataIdx !== -1) {
246
+ rawData = inner.slice(dataIdx + inner.slice(dataIdx).match(/\bdata\s*=/)[0].length).trim();
247
+ }
248
+ const ph = makePlaceholder(id++);
249
+ placeholders.set(ph, rawData);
250
+ const typeText = type ? ` type=${JSON.stringify(type)}` : "";
251
+ out += `:::alert${typeText} data="${ph}" :::`;
252
+ const realClose = src.indexOf(":::", endIdx);
253
+ pos = realClose === -1 ? endIdx : realClose + 3;
254
+ }
255
+ return { text: out, placeholders };
256
+ }
257
+ function alertInlinePlugin(md2) {
258
+ md2.inline.ruler.before("emphasis", "alert_inline", function(state, silent) {
259
+ const pos = state.pos;
260
+ const src = state.src;
261
+ if (src.slice(pos, pos + 3) !== ":::") return false;
262
+ const m = src.slice(pos).match(/^:::alert\b([^\n\r]*?):::/);
263
+ if (!m) return false;
264
+ if (silent) return false;
265
+ const raw = m[1].trim();
266
+ const html = `<lazy-component ${raw} />`;
267
+ const token = state.push("html_inline", "", 0);
268
+ token.content = html;
269
+ state.pos += m[0].length;
270
+ return true;
271
+ });
272
+ }
273
+ try {
274
+ md.use(alertInlinePlugin);
275
+ } catch {
276
+ }
251
277
  var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onChange, onPartialChange }) => {
252
278
  const reactContent = React16.useMemo(() => {
253
279
  if (!content) return null;
@@ -259,8 +285,8 @@ var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onC
259
285
  incomplete = true;
260
286
  fixedContent += ":::";
261
287
  }
262
- fixedContent = preprocess(fixedContent);
263
- let rawHtml = md.render(fixedContent);
288
+ const { text: preprocessed, placeholders } = extractAlertPlaceholders(fixedContent);
289
+ let rawHtml = md.render(preprocessed);
264
290
  rawHtml = searchValue ? highlightKeywords(rawHtml, [searchValue]) : rawHtml;
265
291
  let lazyIndex = -1;
266
292
  const allLazyMatches = [...rawHtml.matchAll(/<lazy-component/gi)];
@@ -271,7 +297,12 @@ var RenderMarkdown_default = ({ content = "", searchValue, customComponents, onC
271
297
  lazyIndex++;
272
298
  const el = domNode;
273
299
  const type = el.attribs.type;
274
- const data = JSON.parse(el.attribs.data || "{}");
300
+ const dataAttr = el.attribs.data || "";
301
+ let data = {};
302
+ if (/^__ALERT_DATA_\d+__$/.test(dataAttr)) {
303
+ const raw = placeholders.get(dataAttr) ?? "";
304
+ data = parseData(raw);
305
+ }
275
306
  const loading = incomplete && lazyIndex === lastLazyIndex;
276
307
  return /* @__PURE__ */ jsxRuntime.jsx(
277
308
  LazyComponent_default,
@@ -4112,10 +4143,10 @@ var NodeButton = React16__namespace.forwardRef(
4112
4143
  );
4113
4144
  NodeButton.displayName = "NodeButton";
4114
4145
  var QuoteIcon = React16__namespace.memo(({ className, ...props }) => {
4115
- return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", className, viewBox: "0 0 24 24", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsxRuntime.jsx(
4146
+ return /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", className, viewBox: "0 0 1024 1024", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", ...props, children: /* @__PURE__ */ jsxRuntime.jsx(
4116
4147
  "path",
4117
4148
  {
4118
- d: "M6 17H10L8.5 15.5C9.33 15.5 10 14.83 10 14V10C10 8.9 9.1 8 8 8H6C5.45 8 5 8.45 5 9V15C5 16.1 5.9 17 6 17ZM14 17H18L16.5 15.5C17.33 15.5 18 14.83 18 14V10C18 8.9 17.1 8 16 8H14C13.45 8 13 8.45 13 9V15C13 16.1 13.9 17 14 17Z",
4149
+ d: "M130.16 789.92V500.25q-1.85-62.51 18-117.41T204 286.23a308 308 0 0 1 86.13-69.1A304.32 304.32 0 0 1 386.26 184 11 11 0 0 1 399 194.86v104.52a11 11 0 0 1-7.21 10.29q-66.13 24.5-91.25 70.31-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.84a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11h-257.9z m403.3 0V500.25q-2-62.51 17.95-117.41t55.85-96.61q35.94-41.6 86.13-69.1A304.7 304.7 0 0 1 789.56 184a11 11 0 0 1 12.76 10.82v104.56a11 11 0 0 1-7.21 10.29Q729 334.18 703.86 380q-24.41 44.36-26.32 107a11 11 0 0 0 11 11.3h102.82a11 11 0 0 1 11 11V779a11 11 0 0 1-11 11H533.45z m0 0",
4119
4150
  fill: "currentColor"
4120
4151
  }
4121
4152
  ) });
@@ -5063,8 +5094,8 @@ var MarkdownEditor_default = ({ value = "", onChange, onScrollPage, searchValue,
5063
5094
  }, 300);
5064
5095
  React16.useEffect(() => {
5065
5096
  if (!editor) return;
5066
- const container2 = document.querySelector(".content-wrapper");
5067
- if (!container2) return;
5097
+ const container = document.querySelector(".content-wrapper");
5098
+ if (!container) return;
5068
5099
  const handleSelectionUpdate = () => {
5069
5100
  const { from } = editor.state.selection;
5070
5101
  const domAtPos = editor.view.domAtPos(from);
@@ -5095,11 +5126,11 @@ var MarkdownEditor_default = ({ value = "", onChange, onScrollPage, searchValue,
5095
5126
  }
5096
5127
  };
5097
5128
  const handleScroll = () => {
5098
- const pageNos = Array.from(container2.querySelectorAll(".page-no"));
5129
+ const pageNos = Array.from(container.querySelectorAll(".page-no"));
5099
5130
  if (!pageNos.length) return;
5100
5131
  let closestNode = null;
5101
5132
  let closestTopDiff = -Infinity;
5102
- const containerTop = container2.getBoundingClientRect().top;
5133
+ const containerTop = container.getBoundingClientRect().top;
5103
5134
  pageNos.forEach((node) => {
5104
5135
  const rect = node.getBoundingClientRect();
5105
5136
  const top = rect.top - containerTop;
@@ -5117,10 +5148,10 @@ var MarkdownEditor_default = ({ value = "", onChange, onScrollPage, searchValue,
5117
5148
  }
5118
5149
  };
5119
5150
  editor.on("selectionUpdate", handleSelectionUpdate);
5120
- container2.addEventListener("scroll", handleScroll);
5151
+ container.addEventListener("scroll", handleScroll);
5121
5152
  return () => {
5122
5153
  editor.off("selectionUpdate", handleSelectionUpdate);
5123
- container2.removeEventListener("scroll", handleScroll);
5154
+ container.removeEventListener("scroll", handleScroll);
5124
5155
  };
5125
5156
  }, [editor]);
5126
5157
  React16.useEffect(() => {