@connextar/house 0.1.1 → 0.2.0
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/README.md +205 -28
- package/dist/changelog/changelog.d.ts +60 -0
- package/dist/changelog/changelog.d.ts.map +1 -0
- package/dist/changelog/changelog.js +61 -0
- package/dist/changelog/changelog.js.map +1 -0
- package/dist/changelog/index.d.ts +2 -0
- package/dist/changelog/index.d.ts.map +1 -0
- package/dist/changelog/index.js +2 -0
- package/dist/changelog/index.js.map +1 -0
- package/dist/editor/block-handle.d.ts +15 -0
- package/dist/editor/block-handle.d.ts.map +1 -0
- package/dist/editor/block-handle.js +106 -0
- package/dist/editor/block-handle.js.map +1 -0
- package/dist/editor/blocks.d.ts +35 -0
- package/dist/editor/blocks.d.ts.map +1 -0
- package/dist/editor/blocks.js +114 -0
- package/dist/editor/blocks.js.map +1 -0
- package/dist/editor/bubble-toolbar.d.ts +11 -0
- package/dist/editor/bubble-toolbar.d.ts.map +1 -0
- package/dist/editor/bubble-toolbar.js +87 -0
- package/dist/editor/bubble-toolbar.js.map +1 -0
- package/dist/editor/content-index.d.ts +2 -0
- package/dist/editor/content-index.d.ts.map +1 -0
- package/dist/editor/content-index.js +2 -0
- package/dist/editor/content-index.js.map +1 -0
- package/dist/editor/content.d.ts +30 -0
- package/dist/editor/content.d.ts.map +1 -0
- package/dist/editor/content.js +256 -0
- package/dist/editor/content.js.map +1 -0
- package/dist/editor/editor.d.ts +52 -0
- package/dist/editor/editor.d.ts.map +1 -0
- package/dist/editor/editor.js +160 -0
- package/dist/editor/editor.js.map +1 -0
- package/dist/editor/emoji-index.d.ts +2 -0
- package/dist/editor/emoji-index.d.ts.map +1 -0
- package/dist/editor/emoji-index.js +2 -0
- package/dist/editor/emoji-index.js.map +1 -0
- package/dist/editor/emoji-picker.d.ts +16 -0
- package/dist/editor/emoji-picker.d.ts.map +1 -0
- package/dist/editor/emoji-picker.js +37 -0
- package/dist/editor/emoji-picker.js.map +1 -0
- package/dist/editor/emoji.d.ts +18 -0
- package/dist/editor/emoji.d.ts.map +1 -0
- package/dist/editor/emoji.js +418 -0
- package/dist/editor/emoji.js.map +1 -0
- package/dist/editor/index.d.ts +5 -0
- package/dist/editor/index.d.ts.map +1 -0
- package/dist/editor/index.js +6 -0
- package/dist/editor/index.js.map +1 -0
- package/dist/editor/suggestion-popup.d.ts +17 -0
- package/dist/editor/suggestion-popup.d.ts.map +1 -0
- package/dist/editor/suggestion-popup.js +57 -0
- package/dist/editor/suggestion-popup.js.map +1 -0
- package/dist/editor/suggestions.d.ts +93 -0
- package/dist/editor/suggestions.d.ts.map +1 -0
- package/dist/editor/suggestions.js +179 -0
- package/dist/editor/suggestions.js.map +1 -0
- package/dist/editor/ui.d.ts +54 -0
- package/dist/editor/ui.d.ts.map +1 -0
- package/dist/editor/ui.js +58 -0
- package/dist/editor/ui.js.map +1 -0
- package/dist/house.css +267 -0
- package/dist/internal/cx.d.ts +3 -0
- package/dist/internal/cx.d.ts.map +1 -0
- package/dist/internal/cx.js +5 -0
- package/dist/internal/cx.js.map +1 -0
- package/dist/internal/next-link.d.ts +23 -0
- package/dist/internal/next-link.d.ts.map +1 -0
- package/dist/internal/next-link.js +3 -0
- package/dist/internal/next-link.js.map +1 -0
- package/dist/markdown/guide.d.ts +98 -0
- package/dist/markdown/guide.d.ts.map +1 -0
- package/dist/markdown/guide.js +328 -0
- package/dist/markdown/guide.js.map +1 -0
- package/dist/markdown/index.d.ts +4 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +4 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/table-view.d.ts +28 -0
- package/dist/markdown/table-view.d.ts.map +1 -0
- package/dist/markdown/table-view.js +25 -0
- package/dist/markdown/table-view.js.map +1 -0
- package/dist/markdown/table.d.ts +35 -0
- package/dist/markdown/table.d.ts.map +1 -0
- package/dist/markdown/table.js +79 -0
- package/dist/markdown/table.js.map +1 -0
- package/dist/release/changelog.d.ts +72 -0
- package/dist/release/changelog.d.ts.map +1 -0
- package/dist/release/changelog.js +92 -0
- package/dist/release/changelog.js.map +1 -0
- package/dist/release/index.d.ts +3 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +3 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/version.d.ts +33 -0
- package/dist/release/version.d.ts.map +1 -0
- package/dist/release/version.js +57 -0
- package/dist/release/version.js.map +1 -0
- package/dist/trail/index.d.ts +3 -0
- package/dist/trail/index.d.ts.map +1 -0
- package/dist/trail/index.js +3 -0
- package/dist/trail/index.js.map +1 -0
- package/dist/trail/rules.d.ts +44 -0
- package/dist/trail/rules.d.ts.map +1 -0
- package/dist/trail/rules.js +74 -0
- package/dist/trail/rules.js.map +1 -0
- package/dist/trail/trail.d.ts +49 -0
- package/dist/trail/trail.d.ts.map +1 -0
- package/dist/trail/trail.js +188 -0
- package/dist/trail/trail.js.map +1 -0
- package/docs/ReleaseProcess.md +315 -0
- package/package.json +75 -11
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from "../internal/next-link.js";
|
|
3
|
+
import { readTable, isTableStart } from "./table.js";
|
|
4
|
+
import { MarkdownTableView } from "./table-view.js";
|
|
5
|
+
const lines = (markdown) => markdown.replace(/\r\n/g, "\n").split("\n");
|
|
6
|
+
const isFence = (line) => line.trim().startsWith("```");
|
|
7
|
+
const isRule = (line) => /^(-{3,}|\*{3,}|_{3,})$/.test(line.trim());
|
|
8
|
+
const isHeading = (line) => /^#{2,4}\s+/.test(line.trim());
|
|
9
|
+
const isOrderedItem = (line) => /^\s*\d+\.\s+/.test(line);
|
|
10
|
+
const isUnorderedItem = (line) => /^\s*[-*]\s+/.test(line);
|
|
11
|
+
/** Split a raw guide into its title, lede and body. */
|
|
12
|
+
export function parseGuideFrontmatter(markdown) {
|
|
13
|
+
const all = lines(markdown);
|
|
14
|
+
let i = 0;
|
|
15
|
+
let title = "";
|
|
16
|
+
let lede;
|
|
17
|
+
while (i < all.length && (all[i] ?? "").trim() === "")
|
|
18
|
+
i++;
|
|
19
|
+
if ((all[i] ?? "").startsWith("# ")) {
|
|
20
|
+
title = (all[i] ?? "")
|
|
21
|
+
.slice(2)
|
|
22
|
+
.trim()
|
|
23
|
+
.replace(/\s*[—-]\s*User Guide$/i, "");
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
while (i < all.length && (all[i] ?? "").trim() === "")
|
|
27
|
+
i++;
|
|
28
|
+
if ((all[i] ?? "").trim().startsWith(">")) {
|
|
29
|
+
const quote = [];
|
|
30
|
+
while (i < all.length && (all[i] ?? "").trim().startsWith(">")) {
|
|
31
|
+
quote.push((all[i] ?? "").trim().replace(/^>\s?/, ""));
|
|
32
|
+
i++;
|
|
33
|
+
}
|
|
34
|
+
lede = quote.join(" ").trim();
|
|
35
|
+
}
|
|
36
|
+
return { title, ...(lede === undefined ? {} : { lede }), body: all.slice(i).join("\n") };
|
|
37
|
+
}
|
|
38
|
+
/** Inline Markdown reduced to plain text, for structured data and search. */
|
|
39
|
+
export function stripInline(text) {
|
|
40
|
+
return text
|
|
41
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1")
|
|
42
|
+
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
43
|
+
.replace(/\*([^*]+)\*/g, "$1")
|
|
44
|
+
.replace(/_([^_]+)_/g, "$1")
|
|
45
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
46
|
+
.replace(/\s+/g, " ")
|
|
47
|
+
.trim();
|
|
48
|
+
}
|
|
49
|
+
/** A heading's text as a URL fragment, before de-duplication. */
|
|
50
|
+
export function headingSlug(text) {
|
|
51
|
+
return (stripInline(text)
|
|
52
|
+
.toLowerCase()
|
|
53
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
54
|
+
.replace(/^-+|-+$/g, "") || "section");
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Hands out unique fragments in document order: the second "Tips" is `tips-2`.
|
|
58
|
+
* The renderer and `extractHeadings` each take one, and both feed it exactly the
|
|
59
|
+
* `##` and `###` headings outside code fences — which is what keeps a contents
|
|
60
|
+
* link and the heading it points at in step.
|
|
61
|
+
*/
|
|
62
|
+
export function createHeadingIds() {
|
|
63
|
+
const seen = new Map();
|
|
64
|
+
return (text) => {
|
|
65
|
+
const base = headingSlug(text);
|
|
66
|
+
const count = seen.get(base) ?? 0;
|
|
67
|
+
seen.set(base, count + 1);
|
|
68
|
+
return count === 0 ? base : `${base}-${count + 1}`;
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
/** The `##` and `###` headings, in order, with the ids the renderer gives them. */
|
|
72
|
+
export function extractHeadings(body) {
|
|
73
|
+
const nextId = createHeadingIds();
|
|
74
|
+
const headings = [];
|
|
75
|
+
let inFence = false;
|
|
76
|
+
for (const raw of lines(body)) {
|
|
77
|
+
if (isFence(raw)) {
|
|
78
|
+
inFence = !inFence;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (inFence)
|
|
82
|
+
continue;
|
|
83
|
+
const match = raw.trim().match(/^(#{2,3})\s+(.*)$/);
|
|
84
|
+
if (!match)
|
|
85
|
+
continue;
|
|
86
|
+
const source = match[2] ?? "";
|
|
87
|
+
headings.push({ id: nextId(source), text: stripInline(source), level: (match[1] ?? "").length });
|
|
88
|
+
}
|
|
89
|
+
return headings;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The `###` steps of a guide's "## Step by step" section as plain text, for
|
|
93
|
+
* HowTo structured data. Each step's text is its prose and list lines, capped
|
|
94
|
+
* so the schema stays lean. Empty when the guide has no such section.
|
|
95
|
+
*/
|
|
96
|
+
export function extractHowToSteps(body) {
|
|
97
|
+
const all = lines(body);
|
|
98
|
+
const start = all.findIndex((line) => /^##\s+Step by step\s*$/i.test(line.trim()));
|
|
99
|
+
if (start === -1)
|
|
100
|
+
return [];
|
|
101
|
+
let end = all.length;
|
|
102
|
+
for (let i = start + 1; i < all.length; i++) {
|
|
103
|
+
if (/^##\s+/.test((all[i] ?? "").trim())) {
|
|
104
|
+
end = i;
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const steps = [];
|
|
109
|
+
let current = null;
|
|
110
|
+
const flush = () => {
|
|
111
|
+
if (!current)
|
|
112
|
+
return;
|
|
113
|
+
const text = stripInline(current.parts.join(" "));
|
|
114
|
+
steps.push({ name: current.name, text: text.length > 320 ? `${text.slice(0, 317)}…` : text || current.name });
|
|
115
|
+
current = null;
|
|
116
|
+
};
|
|
117
|
+
for (let i = start + 1; i < end; i++) {
|
|
118
|
+
const line = (all[i] ?? "").trim();
|
|
119
|
+
const step = line.match(/^###\s+(.*)$/);
|
|
120
|
+
if (step) {
|
|
121
|
+
flush();
|
|
122
|
+
current = { name: stripInline(step[1] ?? ""), parts: [] };
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
if (!current || line === "" || line.startsWith(">"))
|
|
126
|
+
continue;
|
|
127
|
+
current.parts.push(line.replace(/^\s*([-*]|\d+\.)\s+/, ""));
|
|
128
|
+
}
|
|
129
|
+
flush();
|
|
130
|
+
return steps;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Where a link in a guide goes. `other-guide.md#part` becomes
|
|
134
|
+
* `/guides/other-guide#part`; same-site paths, fragments, `mailto:` and web
|
|
135
|
+
* addresses pass through; anything else — `javascript:`, `data:`, a
|
|
136
|
+
* protocol-relative `//host` — becomes `#`.
|
|
137
|
+
*/
|
|
138
|
+
export function resolveGuideHref(href, { guidesPath = "/guides", indexSlug } = {}) {
|
|
139
|
+
const guide = href.match(/^([\w-]+)\.md(#.*)?$/);
|
|
140
|
+
if (guide) {
|
|
141
|
+
const slug = guide[1] ?? "";
|
|
142
|
+
const hash = guide[2] ?? "";
|
|
143
|
+
return slug === indexSlug ? `${guidesPath}${hash}` : `${guidesPath}/${slug}${hash}`;
|
|
144
|
+
}
|
|
145
|
+
const samePath = href.startsWith("/") && !href.startsWith("//") && !href.startsWith("/\\");
|
|
146
|
+
if (samePath || href.startsWith("#") || href.startsWith("mailto:") || /^https?:\/\//i.test(href))
|
|
147
|
+
return href;
|
|
148
|
+
return "#";
|
|
149
|
+
}
|
|
150
|
+
/** The house look, on the shared theme tokens. */
|
|
151
|
+
export const GUIDE_CLASS_NAMES = {
|
|
152
|
+
h2: "mt-12 scroll-mt-24 text-2xl font-bold tracking-tight text-foreground",
|
|
153
|
+
h3: "mt-8 scroll-mt-24 text-lg font-semibold text-foreground",
|
|
154
|
+
h4: "mt-6 text-base font-semibold text-foreground",
|
|
155
|
+
paragraph: "my-4 leading-relaxed text-muted-foreground",
|
|
156
|
+
blockquote: "my-6 border-l-4 border-primary/60 bg-card/60 py-3 pr-3 pl-4 text-muted-foreground italic",
|
|
157
|
+
orderedList: "my-4 ml-5 list-decimal space-y-2 text-muted-foreground marker:text-muted-foreground",
|
|
158
|
+
unorderedList: "my-4 ml-5 list-disc space-y-2 text-muted-foreground marker:text-muted-foreground",
|
|
159
|
+
listItem: "pl-1 leading-relaxed",
|
|
160
|
+
link: "font-medium text-primary hover:underline",
|
|
161
|
+
strong: "font-semibold text-foreground",
|
|
162
|
+
code: "rounded bg-muted px-1.5 py-0.5 font-mono text-[0.85em] text-foreground",
|
|
163
|
+
pre: "my-6 overflow-x-auto rounded-xl border border-border bg-muted/60 p-4 font-mono text-[0.85em] leading-relaxed text-foreground",
|
|
164
|
+
hr: "my-8 border-border",
|
|
165
|
+
table: {},
|
|
166
|
+
};
|
|
167
|
+
/** Render a guide body. */
|
|
168
|
+
export function GuideMarkdown({ content, guidesPath, indexSlug, classNames }) {
|
|
169
|
+
const c = { ...GUIDE_CLASS_NAMES, ...classNames };
|
|
170
|
+
// `table` is itself a set of parts, so an override of one part keeps the rest.
|
|
171
|
+
c.table = { ...GUIDE_CLASS_NAMES.table, ...classNames?.table };
|
|
172
|
+
const linkOptions = {
|
|
173
|
+
...(guidesPath === undefined ? {} : { guidesPath }),
|
|
174
|
+
...(indexSlug === undefined ? {} : { indexSlug }),
|
|
175
|
+
};
|
|
176
|
+
const inline = (text, keyPrefix) => renderInline(text, keyPrefix, c, linkOptions);
|
|
177
|
+
const all = lines(content);
|
|
178
|
+
const nextId = createHeadingIds();
|
|
179
|
+
const blocks = [];
|
|
180
|
+
let i = 0;
|
|
181
|
+
let key = 0;
|
|
182
|
+
/** A line that ends the paragraph or list item before it. */
|
|
183
|
+
const startsBlock = (at) => {
|
|
184
|
+
const line = all[at] ?? "";
|
|
185
|
+
const trimmed = line.trim();
|
|
186
|
+
return (trimmed === "" ||
|
|
187
|
+
isHeading(line) ||
|
|
188
|
+
trimmed.startsWith(">") ||
|
|
189
|
+
isRule(line) ||
|
|
190
|
+
isFence(line) ||
|
|
191
|
+
isTableStart(all, at));
|
|
192
|
+
};
|
|
193
|
+
/** A list: each item, with any wrapped lines that follow it folded in. */
|
|
194
|
+
const readList = (isItem, marker) => {
|
|
195
|
+
const items = [];
|
|
196
|
+
while (i < all.length && isItem(all[i] ?? "")) {
|
|
197
|
+
let item = (all[i] ?? "").replace(marker, "");
|
|
198
|
+
i++;
|
|
199
|
+
while (i < all.length && !startsBlock(i) && !isOrderedItem(all[i] ?? "") && !isUnorderedItem(all[i] ?? "")) {
|
|
200
|
+
item += ` ${(all[i] ?? "").trim()}`;
|
|
201
|
+
i++;
|
|
202
|
+
}
|
|
203
|
+
items.push(item);
|
|
204
|
+
}
|
|
205
|
+
return items;
|
|
206
|
+
};
|
|
207
|
+
while (i < all.length) {
|
|
208
|
+
const line = all[i] ?? "";
|
|
209
|
+
const trimmed = line.trim();
|
|
210
|
+
if (trimmed === "") {
|
|
211
|
+
i++;
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (isRule(line)) {
|
|
215
|
+
blocks.push(_jsx("hr", { className: c.hr }, key++));
|
|
216
|
+
i++;
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
if (isFence(line)) {
|
|
220
|
+
const code = [];
|
|
221
|
+
i++;
|
|
222
|
+
while (i < all.length && !isFence(all[i] ?? "")) {
|
|
223
|
+
code.push(all[i] ?? "");
|
|
224
|
+
i++;
|
|
225
|
+
}
|
|
226
|
+
i++; // the closing fence; an unclosed one simply runs to the end
|
|
227
|
+
blocks.push(_jsx("pre", { className: c.pre, children: _jsx("code", { children: code.join("\n") }) }, key++));
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const heading = trimmed.match(/^(#{2,4})\s+(.*)$/);
|
|
231
|
+
if (heading) {
|
|
232
|
+
const level = (heading[1] ?? "").length;
|
|
233
|
+
const source = heading[2] ?? "";
|
|
234
|
+
const nodes = inline(source, `h${key}`);
|
|
235
|
+
if (level === 2) {
|
|
236
|
+
blocks.push(_jsx("h2", { id: nextId(source), className: c.h2, children: nodes }, key++));
|
|
237
|
+
}
|
|
238
|
+
else if (level === 3) {
|
|
239
|
+
blocks.push(_jsx("h3", { id: nextId(source), className: c.h3, children: nodes }, key++));
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
blocks.push(_jsx("h4", { className: c.h4, children: nodes }, key++));
|
|
243
|
+
}
|
|
244
|
+
i++;
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
if (trimmed.startsWith(">")) {
|
|
248
|
+
const quote = [];
|
|
249
|
+
while (i < all.length && (all[i] ?? "").trim().startsWith(">")) {
|
|
250
|
+
quote.push((all[i] ?? "").trim().replace(/^>\s?/, ""));
|
|
251
|
+
i++;
|
|
252
|
+
}
|
|
253
|
+
blocks.push(_jsx("blockquote", { className: c.blockquote, children: inline(quote.join(" "), `q${key}`) }, key++));
|
|
254
|
+
continue;
|
|
255
|
+
}
|
|
256
|
+
const table = readTable(all, i);
|
|
257
|
+
if (table) {
|
|
258
|
+
const tableKey = key++;
|
|
259
|
+
blocks.push(_jsx(MarkdownTableView, { table: table.table, classNames: c.table, renderCell: (text, cellKey) => inline(text, `t${tableKey}-${cellKey}`) }, tableKey));
|
|
260
|
+
i = table.next;
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
if (isOrderedItem(line)) {
|
|
264
|
+
const listKey = key++;
|
|
265
|
+
const items = readList(isOrderedItem, /^\s*\d+\.\s+/);
|
|
266
|
+
blocks.push(_jsx("ol", { className: c.orderedList, children: items.map((item, n) => (_jsx("li", { className: c.listItem, children: inline(item, `ol${listKey}-${n}`) }, n))) }, listKey));
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (isUnorderedItem(line)) {
|
|
270
|
+
const listKey = key++;
|
|
271
|
+
const items = readList(isUnorderedItem, /^\s*[-*]\s+/);
|
|
272
|
+
blocks.push(_jsx("ul", { className: c.unorderedList, children: items.map((item, n) => (_jsx("li", { className: c.listItem, children: inline(item, `ul${listKey}-${n}`) }, n))) }, listKey));
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
const paragraph = [];
|
|
276
|
+
while (i < all.length &&
|
|
277
|
+
!startsBlock(i) &&
|
|
278
|
+
(paragraph.length === 0 || (!isOrderedItem(all[i] ?? "") && !isUnorderedItem(all[i] ?? "")))) {
|
|
279
|
+
paragraph.push((all[i] ?? "").trim());
|
|
280
|
+
i++;
|
|
281
|
+
}
|
|
282
|
+
const paragraphKey = key++;
|
|
283
|
+
blocks.push(_jsx("p", { className: c.paragraph, children: inline(paragraph.join(" "), `p${paragraphKey}`) }, paragraphKey));
|
|
284
|
+
}
|
|
285
|
+
return _jsx(_Fragment, { children: blocks });
|
|
286
|
+
}
|
|
287
|
+
/** Bold, italic, code and links, as React nodes. Links are matched first so their text isn't parsed twice. */
|
|
288
|
+
function renderInline(text, keyPrefix, c, linkOptions) {
|
|
289
|
+
const nodes = [];
|
|
290
|
+
const pattern = /(\[([^\]]+)\]\(([^)]+)\))|(\*\*([^*]+)\*\*)|(`([^`]+)`)|(\*([^*]+)\*)|(_([^_]+)_)/g;
|
|
291
|
+
let lastIndex = 0;
|
|
292
|
+
let n = 0;
|
|
293
|
+
for (let match = pattern.exec(text); match !== null; match = pattern.exec(text)) {
|
|
294
|
+
if (match.index > lastIndex)
|
|
295
|
+
nodes.push(text.slice(lastIndex, match.index));
|
|
296
|
+
const key = `${keyPrefix}-${n++}`;
|
|
297
|
+
if (match[1]) {
|
|
298
|
+
const href = resolveGuideHref(match[3] ?? "", linkOptions);
|
|
299
|
+
const label = match[2];
|
|
300
|
+
if (href.startsWith("/") || href.startsWith("#")) {
|
|
301
|
+
nodes.push(_jsx(Link, { href: href, className: c.link, children: label }, key));
|
|
302
|
+
}
|
|
303
|
+
else if (/^https?:\/\//i.test(href)) {
|
|
304
|
+
nodes.push(_jsx("a", { href: href, className: c.link, target: "_blank", rel: "noopener noreferrer", children: label }, key));
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
nodes.push(_jsx("a", { href: href, className: c.link, children: label }, key));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
else if (match[4]) {
|
|
311
|
+
nodes.push(_jsx("strong", { className: c.strong, children: match[5] }, key));
|
|
312
|
+
}
|
|
313
|
+
else if (match[6]) {
|
|
314
|
+
nodes.push(_jsx("code", { className: c.code, children: match[7] }, key));
|
|
315
|
+
}
|
|
316
|
+
else if (match[8]) {
|
|
317
|
+
nodes.push(_jsx("em", { children: match[9] }, key));
|
|
318
|
+
}
|
|
319
|
+
else if (match[10]) {
|
|
320
|
+
nodes.push(_jsx("em", { children: match[11] }, key));
|
|
321
|
+
}
|
|
322
|
+
lastIndex = pattern.lastIndex;
|
|
323
|
+
}
|
|
324
|
+
if (lastIndex < text.length)
|
|
325
|
+
nodes.push(text.slice(lastIndex));
|
|
326
|
+
return nodes;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=guide.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guide.js","sourceRoot":"","sources":["../../src/markdown/guide.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAgC,MAAM,iBAAiB,CAAC;AA0ClF,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAChF,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAChE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5E,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEnE,uDAAuD;AACvD,MAAM,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,IAAwB,CAAC;IAE7B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,CAAC,EAAE,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACnB,KAAK,CAAC,CAAC,CAAC;aACR,IAAI,EAAE;aACN,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;QACzC,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,CAAC,EAAE,CAAC;IAC3D,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC,EAAE,CAAC;QACN,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3F,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,IAAI;SACR,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC;SACvC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,iEAAiE;AACjE,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,CACL,WAAW,CAAC,IAAI,CAAC;SACd,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,SAAS,CACxC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvC,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1B,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;IACrD,CAAC,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,GAAG,CAAC,OAAO,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,OAAO;YAAE,SAAS;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACpD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAe,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnF,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YACzC,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAA6C,IAAI,CAAC;IAC7D,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9G,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACxC,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,EAAE,CAAC;YACR,OAAO,GAAG,EAAE,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9D,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,KAAK,EAAE,CAAC;IAER,OAAO,KAAK,CAAC;AACf,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,EAAE,UAAU,GAAG,SAAS,EAAE,SAAS,KAAuB,EAAE;IACzG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;IACtF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3F,IAAI,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9G,OAAO,GAAG,CAAC;AACb,CAAC;AAoBD,kDAAkD;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAoB;IAChD,EAAE,EAAE,sEAAsE;IAC1E,EAAE,EAAE,yDAAyD;IAC7D,EAAE,EAAE,8CAA8C;IAClD,SAAS,EAAE,4CAA4C;IACvD,UAAU,EAAE,0FAA0F;IACtG,WAAW,EAAE,qFAAqF;IAClG,aAAa,EAAE,kFAAkF;IACjG,QAAQ,EAAE,sBAAsB;IAChC,IAAI,EAAE,0CAA0C;IAChD,MAAM,EAAE,+BAA+B;IACvC,IAAI,EAAE,wEAAwE;IAC9E,GAAG,EAAE,8HAA8H;IACnI,EAAE,EAAE,oBAAoB;IACxB,KAAK,EAAE,EAAE;CACV,CAAC;AAOF,2BAA2B;AAC3B,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAsB;IAC9F,MAAM,CAAC,GAAoB,EAAE,GAAG,iBAAiB,EAAE,GAAG,UAAU,EAAE,CAAC;IACnE,+EAA+E;IAC/E,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,iBAAiB,CAAC,KAAK,EAAE,GAAG,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG;QAClB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,SAAiB,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAClG,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,6DAA6D;IAC7D,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,OAAO,CACL,OAAO,KAAK,EAAE;YACd,SAAS,CAAC,IAAI,CAAC;YACf,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YACvB,MAAM,CAAC,IAAI,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;YACb,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CACtB,CAAC;IACJ,CAAC,CAAC;IAEF,0EAA0E;IAC1E,MAAM,QAAQ,GAAG,CAAC,MAAiC,EAAE,MAAc,EAAE,EAAE;QACrE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC9C,IAAI,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC9C,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC3G,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpC,CAAC,EAAE,CAAC;YACN,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,MAAM,CAAC,IAAI,CAAC,aAAgB,SAAS,EAAE,CAAC,CAAC,EAAE,IAAtB,GAAG,EAAE,CAAqB,CAAC,CAAC;YACjD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,EAAE,CAAC,CAAC,4DAA4D;YACjE,MAAM,CAAC,IAAI,CACT,cAAiB,SAAS,EAAE,CAAC,CAAC,GAAG,YAC/B,yBAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAQ,IADtB,GAAG,EAAE,CAET,CACP,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACxC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,CACT,aAAgB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,YAChD,KAAK,IADC,GAAG,EAAE,CAET,CACN,CAAC;YACJ,CAAC;iBAAM,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CACT,aAAgB,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,YAChD,KAAK,IADC,GAAG,EAAE,CAET,CACN,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CACT,aAAgB,SAAS,EAAE,CAAC,CAAC,EAAE,YAC5B,KAAK,IADC,GAAG,EAAE,CAET,CACN,CAAC;YACJ,CAAC;YACD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/D,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC,EAAE,CAAC;YACN,CAAC;YACD,MAAM,CAAC,IAAI,CACT,qBAAwB,SAAS,EAAE,CAAC,CAAC,UAAU,YAC5C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,IADpB,GAAG,EAAE,CAET,CACd,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,KAAC,iBAAiB,IAEhB,KAAK,EAAE,KAAK,CAAC,KAAK,EAClB,UAAU,EAAE,CAAC,CAAC,KAAK,EACnB,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC,IAHjE,QAAQ,CAIb,CACH,CAAC;YACF,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CACT,aAAkB,SAAS,EAAE,CAAC,CAAC,WAAW,YACvC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,aAAY,SAAS,EAAE,CAAC,CAAC,QAAQ,YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,IAD3B,CAAC,CAEL,CACN,CAAC,IALK,OAAO,CAMX,CACN,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;YACvD,MAAM,CAAC,IAAI,CACT,aAAkB,SAAS,EAAE,CAAC,CAAC,aAAa,YACzC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,aAAY,SAAS,EAAE,CAAC,CAAC,QAAQ,YAC9B,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,IAD3B,CAAC,CAEL,CACN,CAAC,IALK,OAAO,CAMX,CACN,CAAC;YACF,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,OACE,CAAC,GAAG,GAAG,CAAC,MAAM;YACd,CAAC,WAAW,CAAC,CAAC,CAAC;YACf,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAC5F,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC,EAAE,CAAC;QACN,CAAC;QACD,MAAM,YAAY,GAAG,GAAG,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CACT,YAAsB,SAAS,EAAE,CAAC,CAAC,SAAS,YACzC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,YAAY,EAAE,CAAC,IAD1C,YAAY,CAEhB,CACL,CAAC;IACJ,CAAC;IAED,OAAO,4BAAG,MAAM,GAAI,CAAC;AACvB,CAAC;AAED,8GAA8G;AAC9G,SAAS,YAAY,CAAC,IAAY,EAAE,SAAiB,EAAE,CAAkB,EAAE,WAA6B;IACtG,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,oFAAoF,CAAC;IACrG,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAChF,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,GAAG,SAAS,IAAI,CAAC,EAAE,EAAE,CAAC;QAElC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjD,KAAK,CAAC,IAAI,CACR,KAAC,IAAI,IAAW,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,YAC1C,KAAK,IADG,GAAG,CAEP,CACR,CAAC;YACJ,CAAC;iBAAM,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CACR,YAAa,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAC,QAAQ,EAAC,GAAG,EAAC,qBAAqB,YAClF,KAAK,IADA,GAAG,CAEP,CACL,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CACR,YAAa,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,YACvC,KAAK,IADA,GAAG,CAEP,CACL,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CACR,iBAAkB,SAAS,EAAE,CAAC,CAAC,MAAM,YAClC,KAAK,CAAC,CAAC,CAAC,IADE,GAAG,CAEP,CACV,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CACR,eAAgB,SAAS,EAAE,CAAC,CAAC,IAAI,YAC9B,KAAK,CAAC,CAAC,CAAC,IADA,GAAG,CAEP,CACR,CAAC;QACJ,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,uBAAe,KAAK,CAAC,CAAC,CAAC,IAAd,GAAG,CAAiB,CAAC,CAAC;QAC5C,CAAC;aAAM,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,uBAAe,KAAK,CAAC,EAAE,CAAC,IAAf,GAAG,CAAkB,CAAC,CAAC;QAC7C,CAAC;QAED,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IAChC,CAAC;IAED,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createHeadingIds, extractHeadings, extractHowToSteps, GUIDE_CLASS_NAMES, GuideMarkdown, headingSlug, parseGuideFrontmatter, resolveGuideHref, stripInline, type GuideClassNames, type GuideHeading, type GuideLinkOptions, type GuideMarkdownProps, type HowToStep, type ParsedGuide, } from "./guide.js";
|
|
2
|
+
export { alignmentOf, isTableRow, isTableSeparator, isTableStart, readTable, splitTableRow, type MarkdownTable, type TableAlign, } from "./table.js";
|
|
3
|
+
export { MARKDOWN_TABLE_CLASS_NAMES, MarkdownTableView, type MarkdownTableClassNames } from "./table-view.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,EACX,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,KAAK,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createHeadingIds, extractHeadings, extractHowToSteps, GUIDE_CLASS_NAMES, GuideMarkdown, headingSlug, parseGuideFrontmatter, resolveGuideHref, stripInline, } from "./guide.js";
|
|
2
|
+
export { alignmentOf, isTableRow, isTableSeparator, isTableStart, readTable, splitTableRow, } from "./table.js";
|
|
3
|
+
export { MARKDOWN_TABLE_CLASS_NAMES, MarkdownTableView } from "./table-view.js";
|
|
4
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/markdown/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,WAAW,GAOZ,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,aAAa,GAGd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,0BAA0B,EAAE,iBAAiB,EAAgC,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import type { MarkdownTable } from "./table.js";
|
|
3
|
+
/** The parts of a table an app can restyle. Each replaces the default for that part. */
|
|
4
|
+
export interface MarkdownTableClassNames {
|
|
5
|
+
wrapper: string;
|
|
6
|
+
table: string;
|
|
7
|
+
head: string;
|
|
8
|
+
headerCell: string;
|
|
9
|
+
row: string;
|
|
10
|
+
cell: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const MARKDOWN_TABLE_CLASS_NAMES: MarkdownTableClassNames;
|
|
13
|
+
/**
|
|
14
|
+
* A parsed Markdown table, drawn with the house token classes so it takes the
|
|
15
|
+
* host app's look. Cells arrive as Markdown text; `renderCell` is the host
|
|
16
|
+
* renderer's own inline pass (bold, code, links), so a table cell reads exactly
|
|
17
|
+
* like the prose around it and link rewriting stays the app's business.
|
|
18
|
+
*
|
|
19
|
+
* An app whose theme has no tokens (a plain Tailwind palette) passes
|
|
20
|
+
* `classNames`. Server-safe: no hooks, no client boundary.
|
|
21
|
+
*/
|
|
22
|
+
export declare function MarkdownTableView({ table, renderCell, className, classNames, }: {
|
|
23
|
+
table: MarkdownTable;
|
|
24
|
+
renderCell: (text: string, key: string) => ReactNode;
|
|
25
|
+
className?: string;
|
|
26
|
+
classNames?: Partial<MarkdownTableClassNames>;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=table-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-view.d.ts","sourceRoot":"","sources":["../../src/markdown/table-view.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,YAAY,CAAC;AAI5D,wFAAwF;AACxF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,0BAA0B,EAAE,uBAOxC,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,SAAS,EACT,UAAU,GACX,EAAE;IACD,KAAK,EAAE,aAAa,CAAC;IACrB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC/C,+BA4BA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cx } from "../internal/cx.js";
|
|
3
|
+
const ALIGN = { left: "text-left", center: "text-center", right: "text-right" };
|
|
4
|
+
export const MARKDOWN_TABLE_CLASS_NAMES = {
|
|
5
|
+
wrapper: "my-6 overflow-x-auto rounded-xl border border-border",
|
|
6
|
+
table: "w-full border-collapse text-sm",
|
|
7
|
+
head: "bg-muted/60",
|
|
8
|
+
headerCell: "px-3 py-2 align-top font-semibold text-foreground",
|
|
9
|
+
row: "border-t border-border",
|
|
10
|
+
cell: "px-3 py-2 align-top leading-relaxed text-muted-foreground",
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A parsed Markdown table, drawn with the house token classes so it takes the
|
|
14
|
+
* host app's look. Cells arrive as Markdown text; `renderCell` is the host
|
|
15
|
+
* renderer's own inline pass (bold, code, links), so a table cell reads exactly
|
|
16
|
+
* like the prose around it and link rewriting stays the app's business.
|
|
17
|
+
*
|
|
18
|
+
* An app whose theme has no tokens (a plain Tailwind palette) passes
|
|
19
|
+
* `classNames`. Server-safe: no hooks, no client boundary.
|
|
20
|
+
*/
|
|
21
|
+
export function MarkdownTableView({ table, renderCell, className, classNames, }) {
|
|
22
|
+
const c = { ...MARKDOWN_TABLE_CLASS_NAMES, ...classNames };
|
|
23
|
+
return (_jsx("div", { className: cx(c.wrapper, className), children: _jsxs("table", { className: c.table, children: [_jsx("thead", { className: c.head, children: _jsx("tr", { children: table.header.map((cell, col) => (_jsx("th", { scope: "col", className: cx(c.headerCell, ALIGN[table.aligns[col] ?? "left"]), children: renderCell(cell, `th-${col}`) }, col))) }) }), _jsx("tbody", { children: table.rows.map((row, r) => (_jsx("tr", { className: c.row, children: row.map((cell, col) => (_jsx("td", { className: cx(c.cell, ALIGN[table.aligns[col] ?? "left"]), children: renderCell(cell, `td-${r}-${col}`) }, col))) }, r))) })] }) }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=table-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-view.js","sourceRoot":"","sources":["../../src/markdown/table-view.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAGvC,MAAM,KAAK,GAA+B,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;AAY5G,MAAM,CAAC,MAAM,0BAA0B,GAA4B;IACjE,OAAO,EAAE,sDAAsD;IAC/D,KAAK,EAAE,gCAAgC;IACvC,IAAI,EAAE,aAAa;IACnB,UAAU,EAAE,mDAAmD;IAC/D,GAAG,EAAE,wBAAwB;IAC7B,IAAI,EAAE,2DAA2D;CAClE,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,KAAK,EACL,UAAU,EACV,SAAS,EACT,UAAU,GAMX;IACC,MAAM,CAAC,GAAG,EAAE,GAAG,0BAA0B,EAAE,GAAG,UAAU,EAAE,CAAC;IAC3D,OAAO,CACL,cAAK,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,YACtC,iBAAO,SAAS,EAAE,CAAC,CAAC,KAAK,aACvB,gBAAO,SAAS,EAAE,CAAC,CAAC,IAAI,YACtB,uBACG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CAC/B,aAAc,KAAK,EAAC,KAAK,EAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,YACtF,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,IADvB,GAAG,CAEP,CACN,CAAC,GACC,GACC,EACR,0BACG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,aAAY,SAAS,EAAE,CAAC,CAAC,GAAG,YACzB,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,CACtB,aAAc,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,YACpE,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC,IAD5B,GAAG,CAEP,CACN,CAAC,IALK,CAAC,CAML,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub-flavoured Markdown tables, for the hand-rolled guide renderers.
|
|
3
|
+
*
|
|
4
|
+
* The in-app help centres render their guides with small, dependency-free
|
|
5
|
+
* Markdown parsers. Each grew the same blind spot: a table rendered as one
|
|
6
|
+
* paragraph of pipes, so every troubleshooting section ("Problem | What to try")
|
|
7
|
+
* and every plan comparison showed raw markup on a public page. This is the
|
|
8
|
+
* parsing half, shared; `./table.tsx` draws it.
|
|
9
|
+
*/
|
|
10
|
+
export type TableAlign = "left" | "center" | "right";
|
|
11
|
+
export interface MarkdownTable {
|
|
12
|
+
header: string[];
|
|
13
|
+
aligns: TableAlign[];
|
|
14
|
+
/** Body rows. A short row is padded to the header's width; a long one is cut to it. */
|
|
15
|
+
rows: string[][];
|
|
16
|
+
}
|
|
17
|
+
/** A line that is a table row: starts and ends with a pipe. */
|
|
18
|
+
export declare function isTableRow(line: string): boolean;
|
|
19
|
+
/** Cells of a table row, with `\|` kept as a literal pipe. */
|
|
20
|
+
export declare function splitTableRow(line: string): string[];
|
|
21
|
+
/** The row under a header: `| --- | :-: | --: |`, nothing but dashes and colons. */
|
|
22
|
+
export declare function isTableSeparator(line: string): boolean;
|
|
23
|
+
/** A row followed by a separator row — a lone `| a | b |` line is prose, not a table. */
|
|
24
|
+
export declare function isTableStart(lines: readonly string[], i: number): boolean;
|
|
25
|
+
export declare function alignmentOf(separatorCell: string): TableAlign;
|
|
26
|
+
/**
|
|
27
|
+
* Read the table that starts at `lines[i]`, or null when none does. Returns the
|
|
28
|
+
* index of the first line after it, so a renderer's block loop carries on from
|
|
29
|
+
* there.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readTable(lines: readonly string[], i: number): {
|
|
32
|
+
table: MarkdownTable;
|
|
33
|
+
next: number;
|
|
34
|
+
} | null;
|
|
35
|
+
//# sourceMappingURL=table.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/markdown/table.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,uFAAuF;IACvF,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;CAClB;AAED,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBpD;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAIzE;AAED,wBAAgB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAM7D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAkB5G"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub-flavoured Markdown tables, for the hand-rolled guide renderers.
|
|
3
|
+
*
|
|
4
|
+
* The in-app help centres render their guides with small, dependency-free
|
|
5
|
+
* Markdown parsers. Each grew the same blind spot: a table rendered as one
|
|
6
|
+
* paragraph of pipes, so every troubleshooting section ("Problem | What to try")
|
|
7
|
+
* and every plan comparison showed raw markup on a public page. This is the
|
|
8
|
+
* parsing half, shared; `./table.tsx` draws it.
|
|
9
|
+
*/
|
|
10
|
+
/** A line that is a table row: starts and ends with a pipe. */
|
|
11
|
+
export function isTableRow(line) {
|
|
12
|
+
const trimmed = line.trim();
|
|
13
|
+
return trimmed.length > 1 && trimmed.startsWith("|") && trimmed.endsWith("|");
|
|
14
|
+
}
|
|
15
|
+
/** Cells of a table row, with `\|` kept as a literal pipe. */
|
|
16
|
+
export function splitTableRow(line) {
|
|
17
|
+
const inner = line.trim().slice(1, -1);
|
|
18
|
+
const cells = [];
|
|
19
|
+
let current = "";
|
|
20
|
+
for (let i = 0; i < inner.length; i++) {
|
|
21
|
+
const ch = inner[i];
|
|
22
|
+
if (ch === "\\" && inner[i + 1] === "|") {
|
|
23
|
+
current += "|";
|
|
24
|
+
i++;
|
|
25
|
+
}
|
|
26
|
+
else if (ch === "|") {
|
|
27
|
+
cells.push(current.trim());
|
|
28
|
+
current = "";
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
current += ch;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
cells.push(current.trim());
|
|
35
|
+
return cells;
|
|
36
|
+
}
|
|
37
|
+
/** The row under a header: `| --- | :-: | --: |`, nothing but dashes and colons. */
|
|
38
|
+
export function isTableSeparator(line) {
|
|
39
|
+
return isTableRow(line) && splitTableRow(line).every((cell) => /^:?-+:?$/.test(cell));
|
|
40
|
+
}
|
|
41
|
+
/** A row followed by a separator row — a lone `| a | b |` line is prose, not a table. */
|
|
42
|
+
export function isTableStart(lines, i) {
|
|
43
|
+
const line = lines[i];
|
|
44
|
+
const next = lines[i + 1];
|
|
45
|
+
return line !== undefined && next !== undefined && isTableRow(line) && isTableSeparator(next);
|
|
46
|
+
}
|
|
47
|
+
export function alignmentOf(separatorCell) {
|
|
48
|
+
const left = separatorCell.startsWith(":");
|
|
49
|
+
const right = separatorCell.endsWith(":");
|
|
50
|
+
if (left && right)
|
|
51
|
+
return "center";
|
|
52
|
+
if (right)
|
|
53
|
+
return "right";
|
|
54
|
+
return "left";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Read the table that starts at `lines[i]`, or null when none does. Returns the
|
|
58
|
+
* index of the first line after it, so a renderer's block loop carries on from
|
|
59
|
+
* there.
|
|
60
|
+
*/
|
|
61
|
+
export function readTable(lines, i) {
|
|
62
|
+
if (!isTableStart(lines, i))
|
|
63
|
+
return null;
|
|
64
|
+
const header = splitTableRow(lines[i] ?? "");
|
|
65
|
+
const aligns = splitTableRow(lines[i + 1] ?? "").map(alignmentOf);
|
|
66
|
+
const width = header.length;
|
|
67
|
+
let next = i + 2;
|
|
68
|
+
const rows = [];
|
|
69
|
+
while (next < lines.length && isTableRow(lines[next] ?? "")) {
|
|
70
|
+
const cells = splitTableRow(lines[next] ?? "");
|
|
71
|
+
rows.push(Array.from({ length: width }, (_, col) => cells[col] ?? ""));
|
|
72
|
+
next++;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
table: { header, aligns: Array.from({ length: width }, (_, col) => aligns[col] ?? "left"), rows },
|
|
76
|
+
next,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=table.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/markdown/table.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shape of a product changelog: numbered, dated releases, each with a
|
|
3
|
+
* headline, a one-sentence summary and its changes grouped by product area.
|
|
4
|
+
*
|
|
5
|
+
* The data is each app's own. What is shared is the shape, the rules that keep
|
|
6
|
+
* it honest (see `releaseHistoryProblems`) and the page that draws it — so a
|
|
7
|
+
* release reads the same way in every product, and the drift between an app's
|
|
8
|
+
* package.json and its public changelog is caught the same way everywhere.
|
|
9
|
+
*/
|
|
10
|
+
/** The kind of change — drives the coloured tag. `changed` means someone may need to act. */
|
|
11
|
+
export type ChangeType = "new" | "improved" | "changed" | "fixed";
|
|
12
|
+
export declare const CHANGE_TYPES: readonly ChangeType[];
|
|
13
|
+
/** One change within a release section. */
|
|
14
|
+
export interface ChangelogChange {
|
|
15
|
+
type: ChangeType;
|
|
16
|
+
/** A short headline, sentence case, no full stop. Shown in bold, so it must carry the change alone. */
|
|
17
|
+
title: string;
|
|
18
|
+
/** One to three sentences: what a person can now do, and where. May use `**bold**` for UI labels. */
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
/** Changes grouped under a product area, as people name it ("Invoices", "Fixes"). */
|
|
22
|
+
export interface ChangelogSection {
|
|
23
|
+
heading: string;
|
|
24
|
+
changes: ChangelogChange[];
|
|
25
|
+
}
|
|
26
|
+
/** A numbered, dated release. */
|
|
27
|
+
export interface ChangelogRelease {
|
|
28
|
+
/** MAJOR.MINOR.PATCH, no "v". */
|
|
29
|
+
version: string;
|
|
30
|
+
/** ISO calendar date (YYYY-MM-DD) the release was cut. */
|
|
31
|
+
date: string;
|
|
32
|
+
/** The headline — a few words. */
|
|
33
|
+
title: string;
|
|
34
|
+
/** One sentence on why the release matters. */
|
|
35
|
+
summary: string;
|
|
36
|
+
/** Most important first; "Fixes" and "Behind the scenes" last. */
|
|
37
|
+
sections: ChangelogSection[];
|
|
38
|
+
}
|
|
39
|
+
/** What a release guard compares the changelog against. Parsed JSON, so this stays free of `node:fs`. */
|
|
40
|
+
export interface ReleaseManifest {
|
|
41
|
+
/** `package.json`. */
|
|
42
|
+
pkg: {
|
|
43
|
+
version?: string;
|
|
44
|
+
};
|
|
45
|
+
/** `package-lock.json`, when the app has one. */
|
|
46
|
+
lock?: {
|
|
47
|
+
version?: string;
|
|
48
|
+
packages?: Record<string, {
|
|
49
|
+
version?: string;
|
|
50
|
+
} | undefined>;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Everything wrong with a release history, as sentences — an empty list means
|
|
55
|
+
* it is sound. An app's guard test is one assertion:
|
|
56
|
+
*
|
|
57
|
+
* ```ts
|
|
58
|
+
* expect(releaseHistoryProblems(CHANGELOG, { pkg, lock })).toEqual([]);
|
|
59
|
+
* ```
|
|
60
|
+
*
|
|
61
|
+
* A version lives in three places — package.json, its lockfile and the newest
|
|
62
|
+
* changelog release — and a bump that touches one and forgets another is the
|
|
63
|
+
* drift this exists to catch. Returning problems rather than throwing on the
|
|
64
|
+
* first means a broken history is reported whole.
|
|
65
|
+
*/
|
|
66
|
+
export declare function releaseHistoryProblems(changelog: readonly ChangelogRelease[], manifest?: ReleaseManifest): string[];
|
|
67
|
+
/** A fragment id without dots, so it never needs escaping as a selector: `v0-25-0`. */
|
|
68
|
+
export declare function releaseAnchor(version: string): string;
|
|
69
|
+
/** Format an ISO date as "29 August 2026" (or the locale's equivalent), in UTC so it never shifts a day. */
|
|
70
|
+
export declare function formatReleaseDate(iso: string, locale?: string): string;
|
|
71
|
+
export declare function countChanges(release: ChangelogRelease): number;
|
|
72
|
+
//# sourceMappingURL=changelog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.d.ts","sourceRoot":"","sources":["../../src/release/changelog.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,6FAA6F;AAC7F,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;AAElE,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAA4C,CAAC;AAE3F,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,CAAC;IACjB,uGAAuG;IACvG,KAAK,EAAE,MAAM,CAAC;IACd,qGAAqG;IACrG,IAAI,EAAE,MAAM,CAAC;CACd;AAED,qFAAqF;AACrF,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED,iCAAiC;AACjC,MAAM,WAAW,gBAAgB;IAC/B,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAED,yGAAyG;AACzG,MAAM,WAAW,eAAe;IAC9B,sBAAsB;IACtB,GAAG,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,iDAAiD;IACjD,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,SAAS,CAAC,CAAA;KAAE,CAAC;CAC1F;AAID;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,gBAAgB,EAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,MAAM,EAAE,CA+DnH;AAED,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAU,GAAG,MAAM,CAIvE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAE9D"}
|