@hyperbook/markdown 0.8.1 → 0.9.1
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.js +448 -0
- package/dist/index.js.map +7 -0
- package/package.json +10 -18
- package/dist/index.cjs.js +0 -1650
- package/dist/index.cjs.js.map +0 -7
- package/dist/index.esm.mjs +0 -1640
- package/dist/index.esm.mjs.map +0 -7
package/dist/index.js
ADDED
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __spreadValues = (a, b) => {
|
|
9
|
+
for (var prop in b ||= {})
|
|
10
|
+
if (__hasOwnProp.call(b, prop))
|
|
11
|
+
__defNormalProp(a, prop, b[prop]);
|
|
12
|
+
if (__getOwnPropSymbols)
|
|
13
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
+
if (__propIsEnum.call(b, prop))
|
|
15
|
+
__defNormalProp(a, prop, b[prop]);
|
|
16
|
+
}
|
|
17
|
+
return a;
|
|
18
|
+
};
|
|
19
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
|
|
21
|
+
// src/Markdown.tsx
|
|
22
|
+
import remarkDirective from "remark-directive";
|
|
23
|
+
import remarkDirectiveRehype from "remark-directive-rehype";
|
|
24
|
+
import remarkGfm from "remark-gfm";
|
|
25
|
+
import remarkMath from "remark-math";
|
|
26
|
+
import remarkGemoji from "remark-gemoji";
|
|
27
|
+
import remarkUnwrapImages from "remark-unwrap-images";
|
|
28
|
+
import rehypeKatex from "rehype-katex";
|
|
29
|
+
import rehypeHighlight from "rehype-highlight";
|
|
30
|
+
import { useDirectives as useDirectives2 } from "@hyperbook/provider";
|
|
31
|
+
import { Drawer } from "@hyperbook/drawer";
|
|
32
|
+
|
|
33
|
+
// src/Code.tsx
|
|
34
|
+
import { useDirectives } from "@hyperbook/provider";
|
|
35
|
+
import { Fragment, useRef, useState } from "react";
|
|
36
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
37
|
+
var MdContentCopy = () => {
|
|
38
|
+
return /* @__PURE__ */ jsxs(
|
|
39
|
+
"svg",
|
|
40
|
+
{
|
|
41
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
42
|
+
stroke: "currentColor",
|
|
43
|
+
fill: "currentColor",
|
|
44
|
+
strokeWidth: "0",
|
|
45
|
+
height: "1em",
|
|
46
|
+
width: "1em",
|
|
47
|
+
viewBox: "0 0 24 24",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ jsx("path", { d: "M0 0h24v24H0z", fill: "none" }),
|
|
50
|
+
/* @__PURE__ */ jsx("path", { d: "M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z" })
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
};
|
|
55
|
+
var MdDone = () => {
|
|
56
|
+
return /* @__PURE__ */ jsxs(
|
|
57
|
+
"svg",
|
|
58
|
+
{
|
|
59
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
60
|
+
stroke: "currentColor",
|
|
61
|
+
fill: "currentColor",
|
|
62
|
+
strokeWidth: "0",
|
|
63
|
+
height: "1em",
|
|
64
|
+
width: "1em",
|
|
65
|
+
viewBox: "0 0 24 24",
|
|
66
|
+
children: [
|
|
67
|
+
/* @__PURE__ */ jsx("path", { d: "M0 0h24v24H0z", fill: "none" }),
|
|
68
|
+
/* @__PURE__ */ jsx("path", { d: "M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z" })
|
|
69
|
+
]
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
};
|
|
73
|
+
var copyNoNavigator = (text) => {
|
|
74
|
+
const isIos = navigator.userAgent.match(/ipad|iphone/i);
|
|
75
|
+
const textarea = document.createElement("textarea");
|
|
76
|
+
textarea.value = text;
|
|
77
|
+
textarea.style.fontSize = "20px";
|
|
78
|
+
document.body.appendChild(textarea);
|
|
79
|
+
if (isIos) {
|
|
80
|
+
const range = document.createRange();
|
|
81
|
+
range.selectNodeContents(textarea);
|
|
82
|
+
const selection = window.getSelection();
|
|
83
|
+
if (selection) {
|
|
84
|
+
selection.removeAllRanges();
|
|
85
|
+
selection.addRange(range);
|
|
86
|
+
}
|
|
87
|
+
textarea.setSelectionRange(0, 999999);
|
|
88
|
+
} else {
|
|
89
|
+
textarea.select();
|
|
90
|
+
}
|
|
91
|
+
document.execCommand("copy");
|
|
92
|
+
document.body.removeChild(textarea);
|
|
93
|
+
};
|
|
94
|
+
var Code = ({
|
|
95
|
+
children,
|
|
96
|
+
className
|
|
97
|
+
}) => {
|
|
98
|
+
const directives = useDirectives();
|
|
99
|
+
if (className === "language-mermaid" && directives["mermaid"]) {
|
|
100
|
+
const Mermaid = directives["mermaid"];
|
|
101
|
+
return /* @__PURE__ */ jsx(Mermaid, { children });
|
|
102
|
+
}
|
|
103
|
+
const ref = useRef(null);
|
|
104
|
+
const [copied, setCopied] = useState(false);
|
|
105
|
+
const copyCode = () => {
|
|
106
|
+
if (ref.current) {
|
|
107
|
+
const text = ref.current.innerText;
|
|
108
|
+
if (navigator.clipboard) {
|
|
109
|
+
navigator.clipboard.writeText(text).then(() => {
|
|
110
|
+
setCopied(true);
|
|
111
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
112
|
+
}).catch(() => {
|
|
113
|
+
copyNoNavigator(text);
|
|
114
|
+
setCopied(true);
|
|
115
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
116
|
+
});
|
|
117
|
+
} else {
|
|
118
|
+
copyNoNavigator(text);
|
|
119
|
+
setCopied(true);
|
|
120
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
return !className ? /* @__PURE__ */ jsxs("span", { className: "inline", children: [
|
|
125
|
+
/* @__PURE__ */ jsx("code", { ref, className, children }),
|
|
126
|
+
/* @__PURE__ */ jsx("button", { className: "copy", onClick: copyCode, "aria-label": "Copy Code", children: copied ? /* @__PURE__ */ jsx(MdDone, {}) : /* @__PURE__ */ jsx(MdContentCopy, {}) })
|
|
127
|
+
] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
128
|
+
/* @__PURE__ */ jsx("code", { ref, className, children }),
|
|
129
|
+
/* @__PURE__ */ jsx("button", { className: "copy", onClick: copyCode, "aria-label": "Copy Code", children: copied ? /* @__PURE__ */ jsx(MdDone, {}) : /* @__PURE__ */ jsx(MdContentCopy, {}) })
|
|
130
|
+
] });
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// src/Link.tsx
|
|
134
|
+
import { useConfig, useLink } from "@hyperbook/provider";
|
|
135
|
+
import { useEffect, useState as useState2 } from "react";
|
|
136
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
137
|
+
function formatUrl(url) {
|
|
138
|
+
if (typeof url !== "string") {
|
|
139
|
+
return url;
|
|
140
|
+
}
|
|
141
|
+
var doubleSlash = url.split("//");
|
|
142
|
+
var formatted = doubleSlash.map(
|
|
143
|
+
(str) => (
|
|
144
|
+
// Insert a word break opportunity after a colon
|
|
145
|
+
str.replace(new RegExp("(?<after>:)", "giu"), "$1<wbr>").replace(new RegExp("(?<before>[/~.,\\-_?#%])", "giu"), "<wbr>$1").replace(new RegExp("(?<beforeAndAfter>[=&])", "giu"), "<wbr>$1<wbr>")
|
|
146
|
+
)
|
|
147
|
+
// Reconnect the strings with word break opportunities after double slashes
|
|
148
|
+
).join("//<wbr>");
|
|
149
|
+
return formatted;
|
|
150
|
+
}
|
|
151
|
+
var Link = ({
|
|
152
|
+
href,
|
|
153
|
+
title,
|
|
154
|
+
children
|
|
155
|
+
}) => {
|
|
156
|
+
const L = useLink();
|
|
157
|
+
const config = useConfig();
|
|
158
|
+
const [isExternal, setIsExternal] = useState2(false);
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
var _a;
|
|
161
|
+
if (href) {
|
|
162
|
+
const tmp = document.createElement("a");
|
|
163
|
+
tmp.href = href;
|
|
164
|
+
if (tmp.host !== window.location.host) {
|
|
165
|
+
setIsExternal(true);
|
|
166
|
+
} else if (config.basePath && !((_a = window.location.pathname) == null ? void 0 : _a.startsWith(config.basePath))) {
|
|
167
|
+
setIsExternal(true);
|
|
168
|
+
} else {
|
|
169
|
+
setIsExternal(false);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}, [href, config]);
|
|
173
|
+
if (isExternal) {
|
|
174
|
+
/* @__PURE__ */ jsx2(L, { href, title, target: "_blank", children: formatUrl(children) });
|
|
175
|
+
}
|
|
176
|
+
return /* @__PURE__ */ jsx2(L, { href, title, children: formatUrl(children) });
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// src/Table.tsx
|
|
180
|
+
import { jsx as jsx3 } from "react/jsx-runtime";
|
|
181
|
+
var tableHeaders = [];
|
|
182
|
+
var tdIndex = 0;
|
|
183
|
+
var Table = ({
|
|
184
|
+
children,
|
|
185
|
+
style
|
|
186
|
+
}) => {
|
|
187
|
+
tableHeaders = [];
|
|
188
|
+
return /* @__PURE__ */ jsx3("table", { style, children });
|
|
189
|
+
};
|
|
190
|
+
var Tr = ({
|
|
191
|
+
children,
|
|
192
|
+
style
|
|
193
|
+
}) => {
|
|
194
|
+
tdIndex = 0;
|
|
195
|
+
return /* @__PURE__ */ jsx3("tr", { style, children });
|
|
196
|
+
};
|
|
197
|
+
var Td = ({
|
|
198
|
+
children,
|
|
199
|
+
style
|
|
200
|
+
}) => {
|
|
201
|
+
return /* @__PURE__ */ jsx3("td", { "data-label": tableHeaders[tdIndex++], style, children });
|
|
202
|
+
};
|
|
203
|
+
var Th = ({
|
|
204
|
+
children,
|
|
205
|
+
style
|
|
206
|
+
}) => {
|
|
207
|
+
tableHeaders.push(children);
|
|
208
|
+
return /* @__PURE__ */ jsx3("th", { style, children });
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
// src/Headings.tsx
|
|
212
|
+
import { useBookmark, useConfig as useConfig2 } from "@hyperbook/provider";
|
|
213
|
+
import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
214
|
+
var makeAnchor = (heading) => {
|
|
215
|
+
let anchor = heading.toLowerCase();
|
|
216
|
+
anchor = anchor.replace(/[^a-zA-Z0-9 ]/g, "");
|
|
217
|
+
anchor = anchor.replace(/ /g, "-");
|
|
218
|
+
return anchor;
|
|
219
|
+
};
|
|
220
|
+
var Headings = (level) => ({ children, id }) => {
|
|
221
|
+
var _a;
|
|
222
|
+
const config = useConfig2();
|
|
223
|
+
const bookmarksConfig = (_a = config == null ? void 0 : config.elements) == null ? void 0 : _a.bookmarks;
|
|
224
|
+
const heading = (children == null ? void 0 : children[0]) || "";
|
|
225
|
+
let anchor = typeof heading === "string" ? makeAnchor(heading) : "";
|
|
226
|
+
const label = typeof heading === "string" ? heading : anchor;
|
|
227
|
+
const [bookmark, toggleBookmark] = useBookmark(anchor, label);
|
|
228
|
+
const container = (children2) => /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
229
|
+
/* @__PURE__ */ jsx4("a", { className: "heading", id: id != null ? id : anchor, href: `#${id != null ? id : anchor}`, children: /* @__PURE__ */ jsx4("span", { children: children2 }) }),
|
|
230
|
+
bookmarksConfig !== false && /* @__PURE__ */ jsx4(
|
|
231
|
+
"button",
|
|
232
|
+
{
|
|
233
|
+
className: bookmark ? "bookmark active" : "bookmark",
|
|
234
|
+
onClick: () => toggleBookmark(),
|
|
235
|
+
title: "Bookmark",
|
|
236
|
+
children: "\u{1F516}"
|
|
237
|
+
}
|
|
238
|
+
)
|
|
239
|
+
] });
|
|
240
|
+
switch (level) {
|
|
241
|
+
case 1:
|
|
242
|
+
return /* @__PURE__ */ jsx4("h1", { children: container(children) });
|
|
243
|
+
case 2:
|
|
244
|
+
return /* @__PURE__ */ jsx4("h2", { children: container(children) });
|
|
245
|
+
case 3:
|
|
246
|
+
return /* @__PURE__ */ jsx4("h3", { children: container(children) });
|
|
247
|
+
case 4:
|
|
248
|
+
return /* @__PURE__ */ jsx4("h4", { children: container(children) });
|
|
249
|
+
case 5:
|
|
250
|
+
return /* @__PURE__ */ jsx4("h5", { children: container(children) });
|
|
251
|
+
default:
|
|
252
|
+
return /* @__PURE__ */ jsx4("h6", { children: container(children) });
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
// src/Image.tsx
|
|
257
|
+
import { useMakeUrl } from "@hyperbook/provider";
|
|
258
|
+
import { useState as useState3 } from "react";
|
|
259
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
260
|
+
var Image = ({
|
|
261
|
+
src,
|
|
262
|
+
title,
|
|
263
|
+
alt
|
|
264
|
+
}) => {
|
|
265
|
+
const makeUrl = useMakeUrl();
|
|
266
|
+
const [full, setFull] = useState3(false);
|
|
267
|
+
src = makeUrl(src, "public");
|
|
268
|
+
return /* @__PURE__ */ jsxs3("figure", { className: full ? "lightbox" : void 0, children: [
|
|
269
|
+
/* @__PURE__ */ jsx5("img", { src, alt, onClick: () => setFull((f) => !f) }),
|
|
270
|
+
title && /* @__PURE__ */ jsx5("figcaption", { children: title })
|
|
271
|
+
] });
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
// src/remarkRemoveComments.ts
|
|
275
|
+
import { visit, SKIP } from "unist-util-visit";
|
|
276
|
+
var remarkRemoveComments = () => (tree) => {
|
|
277
|
+
const htmlCommentRegex = /<!--([\s\S]*?)-->/g;
|
|
278
|
+
const handler = (node, index, parent) => {
|
|
279
|
+
const isComment = node.value.match(htmlCommentRegex);
|
|
280
|
+
if (isComment) {
|
|
281
|
+
parent.children.splice(index, 1);
|
|
282
|
+
return [SKIP, index];
|
|
283
|
+
}
|
|
284
|
+
};
|
|
285
|
+
visit(tree, "html", handler);
|
|
286
|
+
visit(tree, "jsx", handler);
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
// src/remarkCustomHeadingIds.ts
|
|
290
|
+
import { visit as visit2 } from "unist-util-visit";
|
|
291
|
+
var remarkCustomHeadingIds = () => {
|
|
292
|
+
return function(node) {
|
|
293
|
+
visit2(node, "heading", (node2) => {
|
|
294
|
+
let lastChild = node2.children[node2.children.length - 1];
|
|
295
|
+
if (lastChild && lastChild.type === "text") {
|
|
296
|
+
let string = lastChild.value.replace(/ +$/, "");
|
|
297
|
+
let matched = string.match(/ {#([^]+?)}$/);
|
|
298
|
+
if (matched) {
|
|
299
|
+
let id = matched[1];
|
|
300
|
+
if (!!id.length) {
|
|
301
|
+
if (!node2.data) {
|
|
302
|
+
node2.data = {};
|
|
303
|
+
}
|
|
304
|
+
if (!node2.data.hProperties) {
|
|
305
|
+
node2.data.hProperties = {};
|
|
306
|
+
}
|
|
307
|
+
node2.data.id = node2.data.hProperties.id = id;
|
|
308
|
+
string = string.substring(0, matched.index);
|
|
309
|
+
lastChild.value = string;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
});
|
|
314
|
+
};
|
|
315
|
+
};
|
|
316
|
+
|
|
317
|
+
// src/useRemarkSync.ts
|
|
318
|
+
import { Fragment as Fragment3, createElement } from "react";
|
|
319
|
+
import { unified } from "unified";
|
|
320
|
+
import remarkParse from "remark-parse";
|
|
321
|
+
import remarkToRehype from "remark-rehype";
|
|
322
|
+
import rehypeReact from "rehype-react";
|
|
323
|
+
var useRemarkSync = (source, {
|
|
324
|
+
remarkToRehypeOptions,
|
|
325
|
+
rehypeReactOptions,
|
|
326
|
+
remarkPlugins = [],
|
|
327
|
+
rehypePlugins = []
|
|
328
|
+
} = {}) => unified().use(remarkParse).use(remarkPlugins).use(remarkToRehype, remarkToRehypeOptions).use(rehypePlugins).use(rehypeReact, __spreadValues({
|
|
329
|
+
createElement,
|
|
330
|
+
Fragment: Fragment3
|
|
331
|
+
}, rehypeReactOptions)).processSync(source).result;
|
|
332
|
+
|
|
333
|
+
// src/useToc.ts
|
|
334
|
+
import remarkParse2 from "remark-parse";
|
|
335
|
+
import remarkStringify from "remark-stringify";
|
|
336
|
+
import { unified as unified2 } from "unified";
|
|
337
|
+
|
|
338
|
+
// src/remarkHeadings.ts
|
|
339
|
+
import { visit as visit3 } from "unist-util-visit";
|
|
340
|
+
import { toString } from "mdast-util-to-string";
|
|
341
|
+
var getAnchor = (heading) => {
|
|
342
|
+
var _a;
|
|
343
|
+
if ((_a = heading == null ? void 0 : heading.data) == null ? void 0 : _a.id) {
|
|
344
|
+
return heading.data.id;
|
|
345
|
+
}
|
|
346
|
+
let anchor = toString(heading, { includeImageAlt: false }).toLowerCase();
|
|
347
|
+
anchor = anchor.replace(/[^a-zA-Z0-9 ]/g, "");
|
|
348
|
+
anchor = anchor.replace(/ /g, "-");
|
|
349
|
+
return anchor;
|
|
350
|
+
};
|
|
351
|
+
var headings = (root) => {
|
|
352
|
+
const headingList = [];
|
|
353
|
+
visit3(root, "heading", (node) => {
|
|
354
|
+
const heading = {
|
|
355
|
+
level: node.depth,
|
|
356
|
+
label: toString(node, { includeImageAlt: false }),
|
|
357
|
+
anchor: getAnchor(node)
|
|
358
|
+
};
|
|
359
|
+
headingList.push(heading);
|
|
360
|
+
});
|
|
361
|
+
return headingList;
|
|
362
|
+
};
|
|
363
|
+
var remarkHeadings = () => {
|
|
364
|
+
return (tree, file) => {
|
|
365
|
+
file.data.headings = headings(tree);
|
|
366
|
+
};
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
// src/useToc.ts
|
|
370
|
+
var useToc = (markdown) => {
|
|
371
|
+
return unified2().use(remarkCustomHeadingIds).use(remarkParse2).use(remarkStringify).use(remarkHeadings).processSync(markdown).data.headings;
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
// src/Markdown.tsx
|
|
375
|
+
import { Fragment as Fragment4, useState as useState4 } from "react";
|
|
376
|
+
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
377
|
+
var Markdown = ({ children, showToc = true }) => {
|
|
378
|
+
const directives = useDirectives2();
|
|
379
|
+
const toc = useToc(children);
|
|
380
|
+
const [isTocOpen, setIsTocOpen] = useState4(false);
|
|
381
|
+
const reactContent = useRemarkSync(children, {
|
|
382
|
+
rehypeReactOptions: {
|
|
383
|
+
passNode: true,
|
|
384
|
+
components: __spreadProps(__spreadValues({}, directives), {
|
|
385
|
+
a: Link,
|
|
386
|
+
code: Code,
|
|
387
|
+
td: Td,
|
|
388
|
+
th: Th,
|
|
389
|
+
table: Table,
|
|
390
|
+
tr: Tr,
|
|
391
|
+
h1: Headings(1),
|
|
392
|
+
h2: Headings(2),
|
|
393
|
+
h3: Headings(3),
|
|
394
|
+
h4: Headings(4),
|
|
395
|
+
h5: Headings(5),
|
|
396
|
+
h6: Headings(6),
|
|
397
|
+
img: Image
|
|
398
|
+
})
|
|
399
|
+
},
|
|
400
|
+
remarkPlugins: [
|
|
401
|
+
remarkRemoveComments,
|
|
402
|
+
remarkCustomHeadingIds,
|
|
403
|
+
remarkGfm,
|
|
404
|
+
remarkDirective,
|
|
405
|
+
remarkDirectiveRehype,
|
|
406
|
+
remarkMath,
|
|
407
|
+
remarkGemoji,
|
|
408
|
+
remarkUnwrapImages
|
|
409
|
+
],
|
|
410
|
+
rehypePlugins: [
|
|
411
|
+
rehypeKatex,
|
|
412
|
+
[rehypeHighlight, { ignoreMissing: true, plainText: ["mermaid"] }]
|
|
413
|
+
]
|
|
414
|
+
});
|
|
415
|
+
return /* @__PURE__ */ jsxs4("div", { className: "hyperbook-markdown", children: [
|
|
416
|
+
showToc && /* @__PURE__ */ jsxs4(Fragment4, { children: [
|
|
417
|
+
/* @__PURE__ */ jsxs4(
|
|
418
|
+
"button",
|
|
419
|
+
{
|
|
420
|
+
className: isTocOpen ? "toc-toggle open" : "toc-toggle",
|
|
421
|
+
onClick: () => setIsTocOpen(!isTocOpen),
|
|
422
|
+
title: "Table of Contents",
|
|
423
|
+
children: [
|
|
424
|
+
/* @__PURE__ */ jsx6("div", { className: "bar1" }),
|
|
425
|
+
/* @__PURE__ */ jsx6("div", { className: "bar2" }),
|
|
426
|
+
/* @__PURE__ */ jsx6("div", { className: "bar3" }),
|
|
427
|
+
/* @__PURE__ */ jsx6("div", { className: "bar4" })
|
|
428
|
+
]
|
|
429
|
+
}
|
|
430
|
+
),
|
|
431
|
+
/* @__PURE__ */ jsx6(
|
|
432
|
+
Drawer,
|
|
433
|
+
{
|
|
434
|
+
isOpen: isTocOpen,
|
|
435
|
+
onClose: () => setIsTocOpen(false),
|
|
436
|
+
position: "right",
|
|
437
|
+
children: /* @__PURE__ */ jsx6("div", { id: "toc-sidebar", children: /* @__PURE__ */ jsx6("nav", { className: "toc", children: /* @__PURE__ */ jsx6("ul", { children: toc.map((h, i) => /* @__PURE__ */ jsx6("li", { className: `level-${h.level}`, children: /* @__PURE__ */ jsx6("a", { href: `#${h.anchor}`, children: h.label }) }, i)) }) }) })
|
|
438
|
+
}
|
|
439
|
+
)
|
|
440
|
+
] }),
|
|
441
|
+
reactContent
|
|
442
|
+
] });
|
|
443
|
+
};
|
|
444
|
+
export {
|
|
445
|
+
Markdown,
|
|
446
|
+
useToc
|
|
447
|
+
};
|
|
448
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/Markdown.tsx", "../src/Code.tsx", "../src/Link.tsx", "../src/Table.tsx", "../src/Headings.tsx", "../src/Image.tsx", "../src/remarkRemoveComments.ts", "../src/remarkCustomHeadingIds.ts", "../src/useRemarkSync.ts", "../src/useToc.ts", "../src/remarkHeadings.ts"],
|
|
4
|
+
"sourcesContent": ["import remarkDirective from \"remark-directive\";\nimport remarkDirectiveRehype from \"remark-directive-rehype\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport remarkGemoji from \"remark-gemoji\";\nimport remarkUnwrapImages from \"remark-unwrap-images\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport { useDirectives } from \"@hyperbook/provider\";\nimport { Drawer } from \"@hyperbook/drawer\";\nimport { Code } from \"./Code\";\nimport { Link } from \"./Link\";\nimport { Table, Td, Th, Tr } from \"./Table\";\nimport { Headings } from \"./Headings\";\nimport { Image } from \"./Image\";\n\nimport \"./index.css\";\nimport { remarkRemoveComments } from \"./remarkRemoveComments\";\nimport { remarkCustomHeadingIds } from \"./remarkCustomHeadingIds\";\nimport { useRemarkSync } from \"./useRemarkSync\";\nimport { useToc } from \"./useToc\";\nimport { Fragment, useState } from \"react\";\n\nexport type MarkdownProps = {\n children: string;\n showToc?: boolean;\n};\n\nexport const Markdown = ({ children, showToc = true }: MarkdownProps) => {\n const directives = useDirectives();\n\n const toc = useToc(children);\n const [isTocOpen, setIsTocOpen] = useState(false);\n const reactContent = useRemarkSync(children, {\n rehypeReactOptions: {\n passNode: true,\n components: {\n ...directives,\n a: Link,\n code: Code,\n td: Td,\n th: Th,\n table: Table,\n tr: Tr,\n h1: Headings(1),\n h2: Headings(2),\n h3: Headings(3),\n h4: Headings(4),\n h5: Headings(5),\n h6: Headings(6),\n img: Image,\n },\n },\n remarkPlugins: [\n remarkRemoveComments,\n remarkCustomHeadingIds,\n remarkGfm,\n remarkDirective,\n remarkDirectiveRehype,\n remarkMath,\n remarkGemoji,\n remarkUnwrapImages,\n ],\n rehypePlugins: [\n rehypeKatex,\n [rehypeHighlight, { ignoreMissing: true, plainText: [\"mermaid\"] }],\n ],\n });\n\n return (\n <div className=\"hyperbook-markdown\">\n {showToc && (\n <Fragment>\n <button\n className={isTocOpen ? \"toc-toggle open\" : \"toc-toggle\"}\n onClick={() => setIsTocOpen(!isTocOpen)}\n title=\"Table of Contents\"\n >\n <div className=\"bar1\"></div>\n <div className=\"bar2\"></div>\n <div className=\"bar3\"></div>\n <div className=\"bar4\"></div>\n </button>\n <Drawer\n isOpen={isTocOpen}\n onClose={() => setIsTocOpen(false)}\n position=\"right\"\n >\n <div id=\"toc-sidebar\">\n <nav className=\"toc\">\n <ul>\n {toc.map((h, i) => (\n <li key={i} className={`level-${h.level}`}>\n <a href={`#${h.anchor}`}>{h.label}</a>\n </li>\n ))}\n </ul>\n </nav>\n </div>\n </Drawer>\n </Fragment>\n )}\n {reactContent}\n </div>\n );\n};\n", "import { useDirectives } from \"@hyperbook/provider\";\nimport { ComponentType, Fragment, useRef, useState } from \"react\";\n\nconst MdContentCopy = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n height=\"1em\"\n width=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z\" />\n </svg>\n );\n};\n\nconst MdDone = () => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n height=\"1em\"\n width=\"1em\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M0 0h24v24H0z\" fill=\"none\" />\n <path d=\"M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z\" />\n </svg>\n );\n};\n\nconst copyNoNavigator = (text: string) => {\n const isIos = navigator.userAgent.match(/ipad|iphone/i);\n const textarea = document.createElement(\"textarea\");\n\n // create textarea\n textarea.value = text;\n\n // ios will zoom in on the input if the font-size is < 16px\n textarea.style.fontSize = \"20px\";\n document.body.appendChild(textarea);\n\n // select text\n if (isIos) {\n const range = document.createRange();\n range.selectNodeContents(textarea);\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n textarea.setSelectionRange(0, 999999);\n } else {\n textarea.select();\n }\n\n // copy selection\n document.execCommand(\"copy\");\n\n // cleanup\n document.body.removeChild(textarea);\n};\n\nexport const Code: ComponentType<JSX.IntrinsicElements[\"code\"]> = ({\n children,\n className,\n}) => {\n const directives = useDirectives();\n if (className === \"language-mermaid\" && directives[\"mermaid\"]) {\n const Mermaid = directives[\"mermaid\"];\n return <Mermaid children={children} />;\n }\n\n const ref = useRef<HTMLElement>(null);\n const [copied, setCopied] = useState(false);\n const copyCode = () => {\n if (ref.current) {\n const text = ref.current.innerText;\n if (navigator.clipboard) {\n navigator.clipboard\n .writeText(text)\n .then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n })\n .catch(() => {\n copyNoNavigator(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n });\n } else {\n copyNoNavigator(text);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }\n };\n\n return !className ? (\n <span className=\"inline\">\n <code ref={ref} className={className}>\n {children}\n </code>\n <button className=\"copy\" onClick={copyCode} aria-label=\"Copy Code\">\n {copied ? <MdDone /> : <MdContentCopy />}\n </button>\n </span>\n ) : (\n <Fragment>\n <code ref={ref} className={className}>\n {children}\n </code>\n <button className=\"copy\" onClick={copyCode} aria-label=\"Copy Code\">\n {copied ? <MdDone /> : <MdContentCopy />}\n </button>\n </Fragment>\n );\n};\n", "import { useConfig, useLink } from \"@hyperbook/provider\";\nimport { ComponentType, ReactNode, useEffect, useState } from \"react\";\n\n// see: https://css-tricks.com/better-line-breaks-for-long-urls/\nfunction formatUrl(url: ReactNode) {\n if (typeof url !== \"string\") {\n return url;\n }\n // Split the URL into an array to distinguish double slashes from single slashes\n var doubleSlash = url.split(\"//\");\n\n // Format the strings on either side of double slashes separately\n var formatted = doubleSlash\n .map(\n (str) =>\n // Insert a word break opportunity after a colon\n str\n .replace(/(?<after>:)/giu, \"$1<wbr>\")\n // Before a single slash, tilde, period, comma, hyphen, underline, question mark, number sign, or percent symbol\n .replace(/(?<before>[/~.,\\-_?#%])/giu, \"<wbr>$1\")\n // Before and after an equals sign or ampersand\n .replace(/(?<beforeAndAfter>[=&])/giu, \"<wbr>$1<wbr>\")\n // Reconnect the strings with word break opportunities after double slashes\n )\n .join(\"//<wbr>\");\n\n return formatted;\n}\n\nexport const Link: ComponentType<JSX.IntrinsicElements[\"a\"]> = ({\n href,\n title,\n children,\n}) => {\n const L = useLink();\n const config = useConfig();\n const [isExternal, setIsExternal] = useState(false);\n\n useEffect(() => {\n if (href) {\n const tmp = document.createElement(\"a\");\n tmp.href = href;\n if (tmp.host !== window.location.host) {\n setIsExternal(true);\n } else if (\n config.basePath &&\n !window.location.pathname?.startsWith(config.basePath)\n ) {\n setIsExternal(true);\n } else {\n setIsExternal(false);\n }\n }\n }, [href, config]);\n\n if (isExternal) {\n <L href={href} title={title} target=\"_blank\">\n {formatUrl(children)}\n </L>;\n }\n\n return (\n <L href={href} title={title}>\n {formatUrl(children)}\n </L>\n );\n};\n", "import { ComponentType, ReactNode } from \"react\";\n\nlet tableHeaders: ReactNode[] = [];\nlet tdIndex = 0;\n\nexport const Table: ComponentType<JSX.IntrinsicElements[\"table\"]> = ({\n children,\n style,\n}) => {\n tableHeaders = [];\n return <table style={style}>{children}</table>;\n};\n\nexport const Tr: ComponentType<JSX.IntrinsicElements[\"tr\"]> = ({\n children,\n style,\n}) => {\n tdIndex = 0;\n return <tr style={style}>{children}</tr>;\n};\n\nexport const Td: ComponentType<JSX.IntrinsicElements[\"td\"]> = ({\n children,\n style,\n}) => {\n return (\n <td data-label={tableHeaders[tdIndex++]} style={style}>\n {children}\n </td>\n );\n};\n\nexport const Th: ComponentType<JSX.IntrinsicElements[\"th\"]> = ({\n children,\n style,\n}) => {\n tableHeaders.push(children);\n return <th style={style}>{children}</th>;\n};\n", "import { useBookmark, useConfig } from \"@hyperbook/provider\";\nimport { ComponentType } from \"react\";\n\nexport const makeAnchor = (heading: string) => {\n // If we have a heading, make it lower case\n let anchor = heading.toLowerCase();\n\n // Clean anchor (replace special characters whitespaces).\n // Alternatively, use encodeURIComponent() if you don't care about\n // pretty anchor links\n anchor = anchor.replace(/[^a-zA-Z0-9 ]/g, \"\");\n anchor = anchor.replace(/ /g, \"-\");\n\n return anchor;\n};\n\nexport const Headings =\n (level: number): ComponentType<JSX.IntrinsicElements[\"h1\"]> =>\n ({ children, id }) => {\n const config = useConfig();\n const bookmarksConfig = config?.elements?.bookmarks;\n // Access actual (string) value of heading\n const heading = children?.[0] || \"\";\n\n // If we have a heading, make it lower case\n let anchor = typeof heading === \"string\" ? makeAnchor(heading) : \"\";\n\n const label = typeof heading === \"string\" ? heading : anchor;\n\n const [bookmark, toggleBookmark] = useBookmark(anchor, label);\n\n // Utility\n const container = (children: React.ReactNode): JSX.Element => (\n <>\n <a className=\"heading\" id={id ?? anchor} href={`#${id ?? anchor}`}>\n <span>{children}</span>\n </a>\n {bookmarksConfig !== false && (\n <button\n className={bookmark ? \"bookmark active\" : \"bookmark\"}\n onClick={() => toggleBookmark()}\n title=\"Bookmark\"\n >\n \uD83D\uDD16\n </button>\n )}\n </>\n );\n\n switch (level) {\n case 1:\n return <h1>{container(children)}</h1>;\n case 2:\n return <h2>{container(children)}</h2>;\n case 3:\n return <h3>{container(children)}</h3>;\n case 4:\n return <h4>{container(children)}</h4>;\n case 5:\n return <h5>{container(children)}</h5>;\n\n default:\n return <h6>{container(children)}</h6>;\n }\n };\n", "import { useMakeUrl } from \"@hyperbook/provider\";\nimport { ComponentType, useState } from \"react\";\n\nexport const Image: ComponentType<JSX.IntrinsicElements[\"img\"]> = ({\n src,\n title,\n alt,\n}) => {\n const makeUrl = useMakeUrl();\n const [full, setFull] = useState(false);\n src = makeUrl(src, \"public\");\n\n return (\n <figure className={full ? \"lightbox\" : undefined}>\n <img src={src} alt={alt} onClick={() => setFull((f) => !f)} />\n {title && <figcaption>{title}</figcaption>}\n </figure>\n );\n};\n", "//@ts-nocheck\nimport { visit, SKIP } from \"unist-util-visit\";\nimport { Transformer } from \"unified\";\nimport { BuildVisitor } from \"unist-util-visit/complex-types\";\n\nexport const remarkRemoveComments: () => Transformer = () => (tree) => {\n const htmlCommentRegex = /<!--([\\s\\S]*?)-->/g;\n\n const handler: BuildVisitor = (node, index, parent) => {\n const isComment = node.value.match(htmlCommentRegex);\n\n if (isComment) {\n // remove node\n parent.children.splice(index, 1);\n // Do not traverse `node`, continue at the node *now* at `index`. http://unifiedjs.com/learn/recipe/remove-node/\n return [SKIP, index];\n }\n };\n\n visit(tree, \"html\", handler);\n\n visit(tree, \"jsx\", handler);\n};\n", "import { visit } from \"unist-util-visit\";\nimport { Transformer } from \"unified\";\n\nexport const remarkCustomHeadingIds: () => Transformer = () => {\n return function (node) {\n visit(node, \"heading\", (node) => {\n let lastChild = node.children[node.children.length - 1];\n if (lastChild && lastChild.type === \"text\") {\n let string = lastChild.value.replace(/ +$/, \"\");\n let matched = string.match(/ {#([^]+?)}$/);\n\n if (matched) {\n let id = matched[1];\n if (!!id.length) {\n if (!node.data) {\n node.data = {};\n }\n if (!node.data.hProperties) {\n node.data.hProperties = {};\n }\n node.data.id = node.data.hProperties.id = id;\n\n string = string.substring(0, matched.index);\n lastChild.value = string;\n }\n }\n }\n });\n };\n};\n", "import { Fragment, ReactElement, createElement } from \"react\";\nimport { PluggableList, unified } from \"unified\";\nimport remarkParse from \"remark-parse\";\nimport { Options as RemarkRehypeOptions } from \"mdast-util-to-hast\";\nimport remarkToRehype from \"remark-rehype\";\nimport rehypeReact, { Options as RehypeReactOptions } from \"rehype-react\";\n\ntype PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\nexport interface UseRemarkSyncOptions {\n remarkToRehypeOptions?: RemarkRehypeOptions;\n rehypeReactOptions?: PartialBy<RehypeReactOptions, \"createElement\">;\n remarkPlugins?: PluggableList;\n rehypePlugins?: PluggableList;\n}\n\nexport const useRemarkSync = (\n source: string,\n {\n remarkToRehypeOptions,\n rehypeReactOptions,\n remarkPlugins = [],\n rehypePlugins = [],\n }: UseRemarkSyncOptions = {}\n): ReactElement =>\n unified()\n .use(remarkParse)\n .use(remarkPlugins)\n .use(remarkToRehype, remarkToRehypeOptions)\n .use(rehypePlugins)\n .use(rehypeReact, {\n createElement,\n Fragment,\n ...rehypeReactOptions,\n } as RehypeReactOptions)\n .processSync(source).result as ReactElement;\n", "import remarkParse from \"remark-parse\";\nimport remarkStringify from \"remark-stringify\";\nimport { unified } from \"unified\";\nimport { remarkCustomHeadingIds } from \"./remarkCustomHeadingIds\";\nimport { Heading, remarkHeadings } from \"./remarkHeadings\";\n\nexport const useToc = (markdown: string): Heading[] => {\n return unified()\n .use(remarkCustomHeadingIds)\n .use(remarkParse)\n .use(remarkStringify)\n .use(remarkHeadings)\n .processSync(markdown).data.headings;\n};\n", "import { Plugin } from \"unified\";\nimport { Root as MdastRoot, Heading as AstHeading } from \"mdast\";\nimport { Root as HastRoot } from \"hast\";\nimport { visit } from \"unist-util-visit\";\nimport { toString } from \"mdast-util-to-string\";\n\nexport interface Heading {\n level: number;\n label: string;\n anchor: string;\n}\n\nconst getAnchor = (heading: AstHeading): string => {\n // If we have a heading, make it lower case\n if (heading?.data?.id) {\n return heading.data.id as string;\n }\n\n let anchor = toString(heading, { includeImageAlt: false }).toLowerCase();\n\n // Clean anchor (replace special characters whitespaces).\n // Alternatively, use encodeURIComponent() if you don't care about\n // pretty anchor links\n anchor = anchor.replace(/[^a-zA-Z0-9 ]/g, \"\");\n anchor = anchor.replace(/ /g, \"-\");\n\n return anchor;\n};\n\nconst headings = (root: MdastRoot) => {\n const headingList: Heading[] = [];\n\n visit(root, \"heading\", (node: AstHeading) => {\n const heading: Heading = {\n level: node.depth,\n label: toString(node, { includeImageAlt: false }),\n anchor: getAnchor(node),\n };\n\n headingList.push(heading);\n });\n\n return headingList;\n};\n\nexport const remarkHeadings: Plugin<[], MdastRoot, HastRoot> = () => {\n return (tree, file) => {\n file.data.headings = headings(tree);\n };\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["useDirectives", "useState", "jsx", "jsx", "useConfig", "Fragment", "jsx", "jsxs", "children", "useState", "jsx", "jsxs", "visit", "node", "Fragment", "Fragment", "remarkParse", "unified", "visit", "unified", "remarkParse", "Fragment", "useState", "jsx", "jsxs", "useDirectives", "useState", "Fragment"]
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,28 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperbook/markdown",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.1",
|
|
4
4
|
"author": "Mike Barkmin",
|
|
5
5
|
"homepage": "https://github.com/openpatch/hyperbook#readme",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"
|
|
8
|
-
"
|
|
7
|
+
"type": "module",
|
|
8
|
+
"main": "dist/index.js",
|
|
9
9
|
"types": "dist/index.d.ts",
|
|
10
|
-
"typings": "dist/index.d.ts",
|
|
11
10
|
"sideEffects": false,
|
|
12
11
|
"exports": {
|
|
13
|
-
".":
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
},
|
|
17
|
-
"./katex.css": "./dist/assets/katex.min.css",
|
|
18
|
-
"./index.css": "./dist/index.css"
|
|
12
|
+
".": "./dist/index.js",
|
|
13
|
+
"./index.css": "./dist/index.css",
|
|
14
|
+
"./katex.css": "./dist/assets/katex.min.css"
|
|
19
15
|
},
|
|
20
16
|
"files": [
|
|
21
17
|
"dist"
|
|
22
18
|
],
|
|
23
|
-
"bundle": [
|
|
24
|
-
"unified"
|
|
25
|
-
],
|
|
26
19
|
"publishConfig": {
|
|
27
20
|
"access": "public"
|
|
28
21
|
},
|
|
@@ -49,8 +42,9 @@
|
|
|
49
42
|
"remark-stringify": "^10.0.3",
|
|
50
43
|
"remark-unwrap-images": "3.0.1",
|
|
51
44
|
"unist-util-visit": "^4.1.1",
|
|
52
|
-
"
|
|
53
|
-
"@hyperbook/
|
|
45
|
+
"unified": "^10.1.2",
|
|
46
|
+
"@hyperbook/provider": "0.4.0",
|
|
47
|
+
"@hyperbook/drawer": "0.1.1"
|
|
54
48
|
},
|
|
55
49
|
"peerDependencies": {
|
|
56
50
|
"react": "18.x",
|
|
@@ -68,15 +62,13 @@
|
|
|
68
62
|
"remark-gfm": "3.0.1",
|
|
69
63
|
"remark-parse": "^10.0.1",
|
|
70
64
|
"remark-rehype": "^10.1.0",
|
|
71
|
-
"unified": "^10.1.2",
|
|
72
65
|
"vitest": "^0.30.0"
|
|
73
66
|
},
|
|
74
67
|
"scripts": {
|
|
75
|
-
"prebuild": "rimraf dist",
|
|
76
68
|
"version": "pnpm build",
|
|
77
69
|
"lint": "tsc --noEmit",
|
|
78
70
|
"test": "vitest",
|
|
79
|
-
"build": "pnpm build:pkg && pnpm build:types",
|
|
71
|
+
"build": "rimraf dist && pnpm build:pkg && pnpm build:types",
|
|
80
72
|
"build:pkg": "node ../../scripts/build.mjs && cp -r assets dist/",
|
|
81
73
|
"build:types": "tsc --project tsconfig.build.json --declaration --emitDeclarationOnly"
|
|
82
74
|
}
|