@yadsh/dsh-qa-surface 0.7.4 → 0.9.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 +169 -12
- package/compatibility.json +5 -0
- package/lib/access/capability-catalog.js +32 -3
- package/lib/access/capability-catalog.js.map +1 -1
- package/lib/access/model.js +24 -4
- package/lib/access/model.js.map +1 -1
- package/lib/access/role-repository.js +199 -91
- package/lib/access/role-repository.js.map +1 -1
- package/lib/access/service.js +223 -7
- package/lib/access/service.js.map +1 -1
- package/lib/account-remotes.js +2 -4
- package/lib/account-remotes.js.map +1 -1
- package/lib/accounts/database.js +447 -0
- package/lib/accounts/database.js.map +1 -0
- package/lib/accounts/errors.js.map +1 -1
- package/lib/accounts/file.js +27 -90
- package/lib/accounts/file.js.map +1 -1
- package/lib/accounts/store.js +224 -59
- package/lib/accounts/store.js.map +1 -1
- package/lib/admin/permissions.js +4 -0
- package/lib/admin/permissions.js.map +1 -1
- package/lib/admin/quality-store.js +270 -54
- package/lib/admin/quality-store.js.map +1 -1
- package/lib/admin/service.js +145 -7
- package/lib/admin/service.js.map +1 -1
- package/lib/admin/session-log.js +66 -5
- package/lib/admin/session-log.js.map +1 -1
- package/lib/cli.js +2 -1
- package/lib/cli.js.map +1 -1
- package/lib/client/QaSessionController.js +379 -39
- package/lib/client/QaSessionController.js.map +1 -1
- package/lib/client/QaSurface.js +94 -34
- package/lib/client/QaSurface.js.map +1 -1
- package/lib/client/QaTranscriptAdapter.js +40 -0
- package/lib/client/QaTranscriptAdapter.js.map +1 -1
- package/lib/client/admin/QaAdmin.js +26 -8
- package/lib/client/admin/QaAdmin.js.map +1 -1
- package/lib/client/admin/{format.js → copy.js} +1 -1
- package/lib/client/admin/copy.js.map +1 -0
- package/lib/client/admin/pages/Conversations.js +34 -8
- package/lib/client/admin/pages/Conversations.js.map +1 -1
- package/lib/client/admin/pages/Overview.js +1 -1
- package/lib/client/admin/pages/Overview.js.map +1 -1
- package/lib/client/admin/pages/Quality.js +1 -1
- package/lib/client/admin/pages/Quality.js.map +1 -1
- package/lib/client/admin/pages/Review.js +1 -1
- package/lib/client/admin/pages/Review.js.map +1 -1
- package/lib/client/admin/pages/Users.js +6 -2
- package/lib/client/admin/pages/Users.js.map +1 -1
- package/lib/client/admin/shared.js +10 -1
- package/lib/client/admin/shared.js.map +1 -1
- package/lib/client/admin/styles.js +2 -0
- package/lib/client/admin/styles.js.map +1 -1
- package/lib/client/audit/QaAuditDialog.js +74 -0
- package/lib/client/audit/QaAuditDialog.js.map +1 -0
- package/lib/client/audit/QaAuditRowBadge.js +17 -0
- package/lib/client/audit/QaAuditRowBadge.js.map +1 -0
- package/lib/client/audit/controller.js +39 -0
- package/lib/client/audit/controller.js.map +1 -0
- package/lib/client/audit/types.js +36 -0
- package/lib/client/audit/types.js.map +1 -0
- package/lib/client/audit/use-chat-audits.js +139 -0
- package/lib/client/audit/use-chat-audits.js.map +1 -0
- package/lib/client/components/Markdown.js +14 -206
- package/lib/client/components/Markdown.js.map +1 -1
- package/lib/client/components/QaChangelog.js +91 -0
- package/lib/client/components/QaChangelog.js.map +1 -1
- package/lib/client/components/QaComposer.js +63 -3
- package/lib/client/components/QaComposer.js.map +1 -1
- package/lib/client/components/QaHeader.js +1 -3
- package/lib/client/components/QaHeader.js.map +1 -1
- package/lib/client/components/QaMessage.js +25 -4
- package/lib/client/components/QaMessage.js.map +1 -1
- package/lib/client/components/QaQuestions.js +1 -1
- package/lib/client/components/QaQuestions.js.map +1 -1
- package/lib/client/components/QaSidebar.js +17 -3
- package/lib/client/components/QaSidebar.js.map +1 -1
- package/lib/client/components/QaSourcesPanel.js +3 -18
- package/lib/client/components/QaSourcesPanel.js.map +1 -1
- package/lib/client/components/QaWorkGroup.js +4 -8
- package/lib/client/components/QaWorkGroup.js.map +1 -1
- package/lib/client/components/source-icon.js +26 -0
- package/lib/client/components/source-icon.js.map +1 -0
- package/lib/client/components/thinking-phrases.js +2 -11
- package/lib/client/components/thinking-phrases.js.map +1 -1
- package/lib/client/components/use-now.js +21 -0
- package/lib/client/components/use-now.js.map +1 -0
- package/lib/client/index.js +33 -5
- package/lib/client/index.js.map +1 -1
- package/lib/client/lineage.js +18 -0
- package/lib/client/lineage.js.map +1 -0
- package/lib/client/markdown/CodeBlock.js +28 -0
- package/lib/client/markdown/CodeBlock.js.map +1 -0
- package/lib/client/markdown/blocks.js +342 -0
- package/lib/client/markdown/blocks.js.map +1 -0
- package/lib/client/markdown/highlight.js +1089 -0
- package/lib/client/markdown/highlight.js.map +1 -0
- package/lib/client/markdown/inline.js +377 -0
- package/lib/client/markdown/inline.js.map +1 -0
- package/lib/client/markdown/render.js +147 -0
- package/lib/client/markdown/render.js.map +1 -0
- package/lib/client/markdown/source-chip.js +55 -0
- package/lib/client/markdown/source-chip.js.map +1 -0
- package/lib/client/markdown/use-transient-flag.js +27 -0
- package/lib/client/markdown/use-transient-flag.js.map +1 -0
- package/lib/client/project-session-state.js +15 -2
- package/lib/client/project-session-state.js.map +1 -1
- package/lib/client/prompt-content.js +26 -0
- package/lib/client/prompt-content.js.map +1 -1
- package/lib/client/role/RoleSelector.js +11 -2
- package/lib/client/role/RoleSelector.js.map +1 -1
- package/lib/client/role/preview.js +123 -0
- package/lib/client/role/preview.js.map +1 -0
- package/lib/client/settings/card.js +2 -2
- package/lib/client/settings/card.js.map +1 -1
- package/lib/client/settings/sections/lockdown.js +1 -6
- package/lib/client/settings/sections/lockdown.js.map +1 -1
- package/lib/client/settings/sections/slash.js +57 -0
- package/lib/client/settings/sections/slash.js.map +1 -0
- package/lib/client/settings/sections/status.js +9 -1
- package/lib/client/settings/sections/status.js.map +1 -1
- package/lib/client/settings/sections.js +1 -0
- package/lib/client/settings/sections.js.map +1 -1
- package/lib/client/slash/SlashPalette.js +48 -0
- package/lib/client/slash/SlashPalette.js.map +1 -0
- package/lib/client/slash/copy.js +54 -0
- package/lib/client/slash/copy.js.map +1 -0
- package/lib/client/slash/slash-router.js +49 -0
- package/lib/client/slash/slash-router.js.map +1 -0
- package/lib/client/slash/useSlashNavigation.js +95 -0
- package/lib/client/slash/useSlashNavigation.js.map +1 -0
- package/lib/client/styles.js +124 -20
- package/lib/client/styles.js.map +1 -1
- package/lib/client/types.js +11 -0
- package/lib/client/types.js.map +1 -1
- package/lib/client.js +7615 -1567
- package/lib/client.js.map +1 -1
- package/lib/config-resolvers/accounts.js +15 -0
- package/lib/config-resolvers/accounts.js.map +1 -1
- package/lib/config-resolvers/basics.js +11 -2
- package/lib/config-resolvers/basics.js.map +1 -1
- package/lib/config-resolvers/defaults.js +30 -0
- package/lib/config-resolvers/defaults.js.map +1 -1
- package/lib/config-resolvers/lockdown.js +8 -2
- package/lib/config-resolvers/lockdown.js.map +1 -1
- package/lib/config-resolvers/slash-commands.js +60 -0
- package/lib/config-resolvers/slash-commands.js.map +1 -0
- package/lib/config-resolvers/sources.js +16 -0
- package/lib/config-resolvers/sources.js.map +1 -1
- package/lib/config.js +118 -2
- package/lib/config.js.map +1 -1
- package/lib/index.js +183 -11
- package/lib/index.js.map +1 -1
- package/lib/lockdown-policy.js +19 -0
- package/lib/lockdown-policy.js.map +1 -1
- package/lib/personal-skills/service.js +16 -3
- package/lib/personal-skills/service.js.map +1 -1
- package/lib/provenance/host-store.js +25 -4
- package/lib/provenance/host-store.js.map +1 -1
- package/lib/provenance/retention.js +25 -0
- package/lib/provenance/retention.js.map +1 -0
- package/lib/provenance/snapshot-store.js +290 -35
- package/lib/provenance/snapshot-store.js.map +1 -1
- package/lib/questions.js +98 -38
- package/lib/questions.js.map +1 -1
- package/lib/resolve-config.js +5 -0
- package/lib/resolve-config.js.map +1 -1
- package/lib/secure-session.js +139 -21
- package/lib/secure-session.js.map +1 -1
- package/lib/slash/catalog.js +77 -0
- package/lib/slash/catalog.js.map +1 -0
- package/lib/slash/matcher.js +100 -0
- package/lib/slash/matcher.js.map +1 -0
- package/lib/slash/parser.js +79 -0
- package/lib/slash/parser.js.map +1 -0
- package/lib/slash/policy.js +72 -0
- package/lib/slash/policy.js.map +1 -0
- package/lib/slash/remotes.js +272 -0
- package/lib/slash/remotes.js.map +1 -0
- package/lib/typert.host.js +348 -56
- package/lib/typert.remote-client.d.ts +7 -1
- package/lib/typert.remote-client.js +274 -51
- package/lib/types/access/capability-catalog.d.ts +28 -1
- package/lib/types/access/role-repository.d.ts +38 -7
- package/lib/types/access/service.d.ts +106 -3
- package/lib/types/account-remotes.d.ts +8 -4
- package/lib/types/accounts/database.d.ts +84 -0
- package/lib/types/accounts/errors.d.ts +7 -1
- package/lib/types/accounts/file.d.ts +17 -39
- package/lib/types/accounts/store.d.ts +110 -19
- package/lib/types/admin/quality-store.d.ts +38 -2
- package/lib/types/admin/service.d.ts +34 -2
- package/lib/types/admin/session-log.d.ts +65 -1
- package/lib/types/client/QaSessionController.d.ts +84 -2
- package/lib/types/client/QaSurface.d.ts +14 -1
- package/lib/types/client/admin/{format.d.ts → copy.d.ts} +1 -1
- package/lib/types/client/admin/pages/Conversations.d.ts +4 -0
- package/lib/types/client/audit/QaAuditDialog.d.ts +21 -0
- package/lib/types/client/audit/QaAuditRowBadge.d.ts +18 -0
- package/lib/types/client/audit/controller.d.ts +27 -0
- package/lib/types/client/audit/types.d.ts +72 -0
- package/lib/types/client/audit/use-chat-audits.d.ts +20 -0
- package/lib/types/client/components/Markdown.d.ts +7 -8
- package/lib/types/client/components/QaComposer.d.ts +12 -2
- package/lib/types/client/components/QaQuestions.d.ts +7 -0
- package/lib/types/client/components/QaSidebar.d.ts +11 -1
- package/lib/types/client/components/QaSourcesPanel.d.ts +1 -3
- package/lib/types/client/components/source-icon.d.ts +12 -0
- package/lib/types/client/components/use-now.d.ts +8 -0
- package/lib/types/client/lineage.d.ts +15 -0
- package/lib/types/client/markdown/CodeBlock.d.ts +14 -0
- package/lib/types/client/markdown/blocks.d.ts +74 -0
- package/lib/types/client/markdown/highlight.d.ts +29 -0
- package/lib/types/client/markdown/inline.d.ts +40 -0
- package/lib/types/client/markdown/render.d.ts +13 -0
- package/lib/types/client/markdown/source-chip.d.ts +32 -0
- package/lib/types/client/markdown/use-transient-flag.d.ts +12 -0
- package/lib/types/client/project-session-state.d.ts +3 -1
- package/lib/types/client/prompt-content.d.ts +9 -1
- package/lib/types/client/role/RoleSelector.d.ts +11 -1
- package/lib/types/client/role/preview.d.ts +109 -0
- package/lib/types/client/settings/sections/slash.d.ts +16 -0
- package/lib/types/client/settings/sections.d.ts +1 -0
- package/lib/types/client/slash/SlashPalette.d.ts +24 -0
- package/lib/types/client/slash/copy.d.ts +30 -0
- package/lib/types/client/slash/slash-router.d.ts +67 -0
- package/lib/types/client/slash/useSlashNavigation.d.ts +47 -0
- package/lib/types/client/styles.d.ts +9 -0
- package/lib/types/client/types.d.ts +16 -1
- package/lib/types/config-resolvers/slash-commands.d.ts +20 -0
- package/lib/types/index.d.ts +83 -2
- package/lib/types/lockdown-policy.d.ts +16 -0
- package/lib/types/personal-skills/service.d.ts +5 -0
- package/lib/types/provenance/host-store.d.ts +20 -3
- package/lib/types/provenance/retention.d.ts +46 -0
- package/lib/types/provenance/snapshot-store.d.ts +63 -7
- package/lib/types/questions.d.ts +13 -0
- package/lib/types/secure-session.d.ts +27 -1
- package/lib/types/slash/catalog.d.ts +56 -0
- package/lib/types/slash/matcher.d.ts +51 -0
- package/lib/types/slash/parser.d.ts +46 -0
- package/lib/types/slash/policy.d.ts +40 -0
- package/lib/types/slash/remotes.d.ts +35 -0
- package/lib/types/types.d.ts +254 -5
- package/package.json +9 -5
- package/scripts/attach-workspace-sessions.mjs +472 -0
- package/lib/client/admin/format.js.map +0 -1
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GFM block grammar for the chat renderer: the container and leaf blocks the
|
|
3
|
+
* assistant's answers actually use, parsed here and handed to `render.tsx` as
|
|
4
|
+
* plain data. Text inside a leaf block stays raw Markdown — `parseInline`
|
|
5
|
+
* resolves it at render time — so one block pass feeds every inline consumer.
|
|
6
|
+
*
|
|
7
|
+
* The grammar is deliberately a subset of CommonMark: nested containers and
|
|
8
|
+
* lazy continuation are supported, while the pathological corners (HTML
|
|
9
|
+
* blocks, setext inside lists, link reference definitions spanning lines) stay
|
|
10
|
+
* out. Raw HTML never becomes a block: a tag line is a paragraph whose inline
|
|
11
|
+
* pass leaves the tag as literal text.
|
|
12
|
+
*/
|
|
13
|
+
/** Container depth ceiling: enough for real answers, too low to recurse away.
|
|
14
|
+
* Past it a marker stays literal text — the content is never dropped. */
|
|
15
|
+
const MAX_DEPTH = 8;
|
|
16
|
+
const ATX_HEADING = /^ {0,3}(#{1,6})(?:[ \t]+(.*?))?[ \t]*$/u;
|
|
17
|
+
const SETEXT_UNDERLINE = /^ {0,3}(=+|-+)[ \t]*$/u;
|
|
18
|
+
const FENCE = /^ {0,3}(`{3,}|~{3,})[ \t]*(.*)$/u;
|
|
19
|
+
const RULE = /^ {0,3}(?:(?:\*[ \t]*){3,}|(?:-[ \t]*){3,}|(?:_[ \t]*){3,})$/u;
|
|
20
|
+
const QUOTE = /^ {0,3}>[ \t]?(.*)$/u;
|
|
21
|
+
const LIST_MARKER = /^( {0,3})([-+*]|\d{1,9}[.)])([ \t]+|$)/u;
|
|
22
|
+
const DEFINITION = /^ {0,3}\[([^\]^][^\]]*)\]:[ \t]*<?([^\s>]+)>?[ \t]*$/u;
|
|
23
|
+
const ALIGNMENT_CELL = /^:?-+:?$/u;
|
|
24
|
+
const CHECKBOX = /^\[([ xX])\][ \t]+/u;
|
|
25
|
+
function isBlank(line) {
|
|
26
|
+
return line.trim() === "";
|
|
27
|
+
}
|
|
28
|
+
function indentOf(line) {
|
|
29
|
+
return line.length - line.trimStart().length;
|
|
30
|
+
}
|
|
31
|
+
/** True when a line opens a block that ends the paragraph it follows. */
|
|
32
|
+
function startsBlock(line) {
|
|
33
|
+
return (FENCE.test(line) ||
|
|
34
|
+
ATX_HEADING.test(line) ||
|
|
35
|
+
RULE.test(line) ||
|
|
36
|
+
QUOTE.test(line) ||
|
|
37
|
+
LIST_MARKER.test(line));
|
|
38
|
+
}
|
|
39
|
+
/** Split one table row into trimmed cells, honoring escaped pipes. */
|
|
40
|
+
export function splitTableRow(line) {
|
|
41
|
+
let row = line.trim();
|
|
42
|
+
if (row.startsWith("|"))
|
|
43
|
+
row = row.slice(1);
|
|
44
|
+
if (row.endsWith("|") && !row.endsWith("\\|"))
|
|
45
|
+
row = row.slice(0, -1);
|
|
46
|
+
return row
|
|
47
|
+
.split(/(?<!\\)\|/u)
|
|
48
|
+
.map((cell) => cell.trim().replace(/\\\|/gu, "|"));
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Does a GFM table start at `index`? The header must carry a pipe and the
|
|
52
|
+
* delimiter row must match it cell for cell — which is also what keeps a
|
|
53
|
+
* setext underline (`---` after a paragraph) out of the table arm.
|
|
54
|
+
*/
|
|
55
|
+
function tableAlignments(lines, index) {
|
|
56
|
+
const headerLine = lines[index];
|
|
57
|
+
const delimiter = lines[index + 1];
|
|
58
|
+
if (headerLine === undefined || delimiter === undefined)
|
|
59
|
+
return undefined;
|
|
60
|
+
if (!headerLine.includes("|"))
|
|
61
|
+
return undefined;
|
|
62
|
+
const cells = splitTableRow(delimiter);
|
|
63
|
+
if (cells.length === 0 || cells.length !== splitTableRow(headerLine).length) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
const alignments = [];
|
|
67
|
+
for (const cell of cells) {
|
|
68
|
+
if (!ALIGNMENT_CELL.test(cell))
|
|
69
|
+
return undefined;
|
|
70
|
+
const left = cell.startsWith(":");
|
|
71
|
+
const right = cell.endsWith(":");
|
|
72
|
+
alignments.push(left && right ? "center" : right ? "right" : "left");
|
|
73
|
+
}
|
|
74
|
+
return alignments;
|
|
75
|
+
}
|
|
76
|
+
/** A fence closes on a run of its own marker at least as long as the opener's. */
|
|
77
|
+
function closesFence(line, marker) {
|
|
78
|
+
const trimmed = line.trim();
|
|
79
|
+
if (trimmed === "")
|
|
80
|
+
return false;
|
|
81
|
+
if (indentOf(line) > 3)
|
|
82
|
+
return false;
|
|
83
|
+
if (![...trimmed].every((char) => char === marker[0]))
|
|
84
|
+
return false;
|
|
85
|
+
return trimmed.length >= marker.length;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse a whole document.
|
|
89
|
+
* @param text - Markdown source with any line endings.
|
|
90
|
+
* @returns Blocks plus the definitions the inline pass resolves against.
|
|
91
|
+
*/
|
|
92
|
+
export function parseMarkdown(text) {
|
|
93
|
+
const definitions = new Map();
|
|
94
|
+
const lines = text.replace(/\r\n?/gu, "\n").split("\n");
|
|
95
|
+
return { blocks: parseBlocks(lines, definitions, 0), definitions };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Parse the blocks of one container (document, quote, or list item).
|
|
99
|
+
* @param lines - Container lines, already de-indented by the caller.
|
|
100
|
+
* @param definitions - Document-wide definition accumulator.
|
|
101
|
+
* @param depth - Container nesting depth.
|
|
102
|
+
* @returns The container's blocks.
|
|
103
|
+
*/
|
|
104
|
+
export function parseBlocks(lines, definitions, depth) {
|
|
105
|
+
const blocks = [];
|
|
106
|
+
let index = 0;
|
|
107
|
+
while (index < lines.length) {
|
|
108
|
+
const line = lines[index] ?? "";
|
|
109
|
+
if (isBlank(line)) {
|
|
110
|
+
index += 1;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const fence = FENCE.exec(line);
|
|
114
|
+
if (fence !== null) {
|
|
115
|
+
const code = [];
|
|
116
|
+
const indent = indentOf(line);
|
|
117
|
+
index += 1;
|
|
118
|
+
while (index < lines.length &&
|
|
119
|
+
!closesFence(lines[index] ?? "", fence[1] ?? "")) {
|
|
120
|
+
code.push((lines[index] ?? "").slice(Math.min(indent, indentOf(lines[index] ?? ""))));
|
|
121
|
+
index += 1;
|
|
122
|
+
}
|
|
123
|
+
if (index < lines.length)
|
|
124
|
+
index += 1;
|
|
125
|
+
const lang = /^\S+/u.exec(fence[2]?.trim() ?? "")?.[0];
|
|
126
|
+
blocks.push({
|
|
127
|
+
kind: "code",
|
|
128
|
+
text: code.join("\n"),
|
|
129
|
+
...(lang === undefined ? {} : { lang }),
|
|
130
|
+
});
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const heading = ATX_HEADING.exec(line);
|
|
134
|
+
if (heading !== null) {
|
|
135
|
+
blocks.push({
|
|
136
|
+
kind: "heading",
|
|
137
|
+
depth: (heading[1] ?? "#").length,
|
|
138
|
+
text: (heading[2] ?? "").replace(/[ \t]+#+[ \t]*$/u, "").trim(),
|
|
139
|
+
});
|
|
140
|
+
index += 1;
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
if (RULE.test(line)) {
|
|
144
|
+
blocks.push({ kind: "rule" });
|
|
145
|
+
index += 1;
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
const quote = depth < MAX_DEPTH ? QUOTE.exec(line) : null;
|
|
149
|
+
if (quote !== null) {
|
|
150
|
+
const body = [];
|
|
151
|
+
while (index < lines.length) {
|
|
152
|
+
const current = lines[index] ?? "";
|
|
153
|
+
const inside = QUOTE.exec(current);
|
|
154
|
+
if (inside !== null) {
|
|
155
|
+
body.push(inside[1] ?? "");
|
|
156
|
+
index += 1;
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
// Lazy continuation: prose directly under a quote stays in the quote.
|
|
160
|
+
if (isBlank(current) || startsBlock(current))
|
|
161
|
+
break;
|
|
162
|
+
body.push(current);
|
|
163
|
+
index += 1;
|
|
164
|
+
}
|
|
165
|
+
blocks.push({
|
|
166
|
+
kind: "quote",
|
|
167
|
+
blocks: parseBlocks(body, definitions, depth + 1),
|
|
168
|
+
});
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
const alignments = tableAlignments(lines, index);
|
|
172
|
+
if (alignments !== undefined && LIST_MARKER.exec(line) === null) {
|
|
173
|
+
const head = splitTableRow(line);
|
|
174
|
+
const rows = [];
|
|
175
|
+
let cursor = index + 2;
|
|
176
|
+
while (cursor < lines.length) {
|
|
177
|
+
const row = lines[cursor] ?? "";
|
|
178
|
+
if (isBlank(row) || !row.includes("|") || startsBlock(row))
|
|
179
|
+
break;
|
|
180
|
+
rows.push(splitTableRow(row));
|
|
181
|
+
cursor += 1;
|
|
182
|
+
}
|
|
183
|
+
blocks.push({ kind: "table", align: alignments, head, rows });
|
|
184
|
+
index = cursor;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (depth < MAX_DEPTH && LIST_MARKER.test(line)) {
|
|
188
|
+
const list = parseList(lines, index, definitions, depth);
|
|
189
|
+
blocks.push(list.list);
|
|
190
|
+
index = list.next;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const definition = DEFINITION.exec(line);
|
|
194
|
+
if (definition !== null) {
|
|
195
|
+
const id = (definition[1] ?? "").trim().toUpperCase();
|
|
196
|
+
if (!definitions.has(id))
|
|
197
|
+
definitions.set(id, definition[2] ?? "");
|
|
198
|
+
index += 1;
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const paragraph = collectParagraph(lines, index);
|
|
202
|
+
blocks.push(paragraph.block);
|
|
203
|
+
index = paragraph.next;
|
|
204
|
+
}
|
|
205
|
+
return blocks;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Collect a leaf paragraph, promoting it to a setext heading when the line
|
|
209
|
+
* after it is an underline.
|
|
210
|
+
* @param lines - Container lines.
|
|
211
|
+
* @param start - Index of the paragraph's first line.
|
|
212
|
+
* @returns The block and the index after it.
|
|
213
|
+
*/
|
|
214
|
+
function collectParagraph(lines, start) {
|
|
215
|
+
const text = [];
|
|
216
|
+
let index = start;
|
|
217
|
+
while (index < lines.length) {
|
|
218
|
+
const line = lines[index] ?? "";
|
|
219
|
+
if (isBlank(line))
|
|
220
|
+
break;
|
|
221
|
+
if (text.length > 0) {
|
|
222
|
+
const underline = SETEXT_UNDERLINE.exec(line);
|
|
223
|
+
if (underline !== null) {
|
|
224
|
+
return {
|
|
225
|
+
block: {
|
|
226
|
+
kind: "heading",
|
|
227
|
+
depth: (underline[1] ?? "=").startsWith("=") ? 1 : 2,
|
|
228
|
+
text: text.join("\n").trim(),
|
|
229
|
+
},
|
|
230
|
+
next: index + 1,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
if (startsBlock(line))
|
|
234
|
+
break;
|
|
235
|
+
if (tableAlignments(lines, index) !== undefined)
|
|
236
|
+
break;
|
|
237
|
+
}
|
|
238
|
+
text.push(line.trimStart());
|
|
239
|
+
index += 1;
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
block: { kind: "paragraph", text: text.join("\n").trim() },
|
|
243
|
+
next: index,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Parse one list: sibling items at the same level, their nested blocks
|
|
248
|
+
* recursively parsed.
|
|
249
|
+
* @param lines - Container lines.
|
|
250
|
+
* @param start - Index of the first item's marker.
|
|
251
|
+
* @param definitions - Document-wide definition accumulator.
|
|
252
|
+
* @param depth - Container nesting depth.
|
|
253
|
+
* @returns The list block and the index after its last item.
|
|
254
|
+
*/
|
|
255
|
+
function parseList(lines, start, definitions, depth) {
|
|
256
|
+
const first = LIST_MARKER.exec(lines[start] ?? "");
|
|
257
|
+
const ordered = /^\d/u.test(first?.[2] ?? "-");
|
|
258
|
+
const bullet = first?.[2] ?? "-";
|
|
259
|
+
const delimiter = ordered ? bullet.slice(-1) : bullet;
|
|
260
|
+
const baseIndent = first?.[1]?.length ?? 0;
|
|
261
|
+
const startNumber = ordered ? Number.parseInt(bullet, 10) : 1;
|
|
262
|
+
const items = [];
|
|
263
|
+
let loose = false;
|
|
264
|
+
let index = start;
|
|
265
|
+
while (index < lines.length) {
|
|
266
|
+
let blanks = 0;
|
|
267
|
+
while (index < lines.length && isBlank(lines[index] ?? "")) {
|
|
268
|
+
index += 1;
|
|
269
|
+
blanks += 1;
|
|
270
|
+
}
|
|
271
|
+
const marker = LIST_MARKER.exec(lines[index] ?? "");
|
|
272
|
+
if (marker === null)
|
|
273
|
+
break;
|
|
274
|
+
const token = marker[2] ?? "-";
|
|
275
|
+
const sameKind = ordered === /^\d/u.test(token) &&
|
|
276
|
+
(ordered ? token.slice(-1) === delimiter : token === bullet);
|
|
277
|
+
if (!sameKind || (marker[1]?.length ?? 0) > baseIndent + 1)
|
|
278
|
+
break;
|
|
279
|
+
// A blank line only spreads the list when another item really follows it.
|
|
280
|
+
if (blanks > 0)
|
|
281
|
+
loose = true;
|
|
282
|
+
const padding = marker[3]?.length ?? 1;
|
|
283
|
+
const markerWidth = (marker[1]?.length ?? 0) + token.length + (padding > 4 ? 1 : padding);
|
|
284
|
+
const itemLines = [(lines[index] ?? "").slice(markerWidth)];
|
|
285
|
+
index += 1;
|
|
286
|
+
let itemSpread = false;
|
|
287
|
+
while (index < lines.length) {
|
|
288
|
+
const current = lines[index] ?? "";
|
|
289
|
+
if (isBlank(current)) {
|
|
290
|
+
let next = index + 1;
|
|
291
|
+
while (next < lines.length && isBlank(lines[next] ?? ""))
|
|
292
|
+
next += 1;
|
|
293
|
+
const following = lines[next] ?? "";
|
|
294
|
+
if (next >= lines.length || indentOf(following) < markerWidth)
|
|
295
|
+
break;
|
|
296
|
+
itemLines.push("");
|
|
297
|
+
itemSpread = true;
|
|
298
|
+
index += 1;
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (indentOf(current) >= markerWidth) {
|
|
302
|
+
itemLines.push(current.slice(markerWidth));
|
|
303
|
+
index += 1;
|
|
304
|
+
continue;
|
|
305
|
+
}
|
|
306
|
+
// A lazy continuation line belongs to the item's paragraph; anything
|
|
307
|
+
// that opens a block of its own ends the item instead.
|
|
308
|
+
if (startsBlock(current))
|
|
309
|
+
break;
|
|
310
|
+
if (tableAlignments(lines, index) !== undefined)
|
|
311
|
+
break;
|
|
312
|
+
itemLines.push(current.trimStart());
|
|
313
|
+
index += 1;
|
|
314
|
+
}
|
|
315
|
+
const checkbox = CHECKBOX.exec(itemLines[0] ?? "");
|
|
316
|
+
const task = checkbox !== null;
|
|
317
|
+
if (checkbox !== null) {
|
|
318
|
+
itemLines[0] = (itemLines[0] ?? "").slice(checkbox[0].length);
|
|
319
|
+
}
|
|
320
|
+
const itemBlocks = depth >= MAX_DEPTH ? [] : parseBlocks(itemLines, definitions, depth + 1);
|
|
321
|
+
// Only a blank line inside the item spreads it: an item that merely carries
|
|
322
|
+
// a nested list or a fence still renders as a tight item, as GFM says.
|
|
323
|
+
if (itemSpread)
|
|
324
|
+
loose = true;
|
|
325
|
+
items.push({
|
|
326
|
+
blocks: itemBlocks,
|
|
327
|
+
task,
|
|
328
|
+
checked: (checkbox?.[1] ?? " ").toLowerCase() === "x",
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
list: {
|
|
333
|
+
kind: "list",
|
|
334
|
+
ordered,
|
|
335
|
+
start: startNumber,
|
|
336
|
+
loose,
|
|
337
|
+
items,
|
|
338
|
+
},
|
|
339
|
+
next: index,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../../src/client/markdown/blocks.ts"],"names":[],"mappings":"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"}
|