@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 +94 -63
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +94 -62
- package/dist/index.esm.js.map +1 -1
- package/package.json +2 -7
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
263
|
-
let rawHtml = md.render(
|
|
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
|
|
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
|
|
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: "
|
|
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
|
|
5067
|
-
if (!
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
5151
|
+
container.addEventListener("scroll", handleScroll);
|
|
5121
5152
|
return () => {
|
|
5122
5153
|
editor.off("selectionUpdate", handleSelectionUpdate);
|
|
5123
|
-
|
|
5154
|
+
container.removeEventListener("scroll", handleScroll);
|
|
5124
5155
|
};
|
|
5125
5156
|
}, [editor]);
|
|
5126
5157
|
React16.useEffect(() => {
|