@k-l-lambda/portolan 0.0.0-stage → 0.1.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/dist/parse.js ADDED
@@ -0,0 +1,468 @@
1
+ import { basename, extname } from "node:path";
2
+ import { isMap, isScalar, parseDocument } from "yaml";
3
+ import { parse as parseLine } from "./generated/line-parser.js";
4
+ export const RHUMB_VERSION = "0.1";
5
+ const STATUS = {
6
+ " ": "todo", "/": "doing", "~": "doing", x: "done", X: "done",
7
+ "-": "dropped", "!": "blocked", "?": "idea",
8
+ };
9
+ export const EDGE_KINDS = new Set(["needs", "blocks", "relates", "replaces", "from"]);
10
+ const FRONT_MATTER_KEYS = new Set(["rhumb", "title", "links"]);
11
+ const ATTR_KEYS = new Set(["owner", "due", "tags", "priority", "star"]);
12
+ const URL_SCHEMES = new Set(["http", "https", "mailto"]);
13
+ export const HAND_ID = /^[a-z0-9][a-z0-9-]{0,47}$/;
14
+ export const GEN_ID = /^_[a-z2-7]{6}$/;
15
+ const LEVELS = { E: "error", W: "warning", I: "info" };
16
+ export function diagnostic(code, line, message) {
17
+ return { code, level: LEVELS[code[0]], line, message };
18
+ }
19
+ export function parse(source, options = {}) {
20
+ const diagnostics = [];
21
+ const report = (code, line, message) => diagnostics.push(diagnostic(code, line, message));
22
+ const lines = source.replace(/\r\n?/g, "\n").split("\n");
23
+ if (lines.length > 0 && lines[lines.length - 1] === "")
24
+ lines.pop();
25
+ const doc = {
26
+ rhumb: RHUMB_VERSION,
27
+ title: options.fileName ? basename(options.fileName, extname(options.fileName)) : null,
28
+ links: {},
29
+ nodes: [],
30
+ edges: [],
31
+ diagnostics,
32
+ };
33
+ const bodyStart = readFrontMatter(lines, doc, report);
34
+ if (bodyStart < 0)
35
+ return finish(doc);
36
+ const parents = new Map();
37
+ const stmts = [];
38
+ const stack = [];
39
+ for (let i = bodyStart; i < lines.length; i++) {
40
+ const lineNo = i + 1;
41
+ const raw = lines[i];
42
+ const { indent, rest } = splitIndent(raw);
43
+ let parsed;
44
+ try {
45
+ parsed = parseLine(rest, { startRule: "Line" });
46
+ }
47
+ catch {
48
+ report("E001", lineNo, "Unrecognized line");
49
+ continue;
50
+ }
51
+ if (parsed.type === "blank" || parsed.type === "comment")
52
+ continue;
53
+ if (parsed.type === "edge") {
54
+ if (indent > 0) {
55
+ report("E001", lineNo, "Edge statements must start at column 0");
56
+ continue;
57
+ }
58
+ stmts.push({ from: parsed.from, kind: parsed.kind, to: parsed.to, label: parsed.label, line: lineNo });
59
+ continue;
60
+ }
61
+ // List item: find its parent by indentation.
62
+ let popped = false;
63
+ while (stack.length > 0 && stack[stack.length - 1].indent > indent) {
64
+ stack.pop();
65
+ popped = true;
66
+ }
67
+ const top = stack[stack.length - 1];
68
+ if (top && top.indent === indent)
69
+ stack.pop();
70
+ else if (top && popped)
71
+ report("E004", lineNo, "Dedent does not match any open indentation level");
72
+ const parent = stack[stack.length - 1] ?? null;
73
+ if (parsed.type === "note") {
74
+ let owner;
75
+ let depth = 0;
76
+ if (parent === null) {
77
+ owner = null;
78
+ report("W001", lineNo, "Top-level note has no owning node and is ignored");
79
+ }
80
+ else if (parent.type === "node") {
81
+ owner = parent.node;
82
+ }
83
+ else {
84
+ owner = parent.owner;
85
+ depth = parent.depth + 1;
86
+ }
87
+ if (owner) {
88
+ owner.notes.push({ text: parsed.text, line: lineNo, depth });
89
+ owner.anchors.push(...extractAnchors(parsed.text, lineNo, doc.links, report));
90
+ }
91
+ stack.push({ type: "note", indent, owner, depth });
92
+ continue;
93
+ }
94
+ // Node.
95
+ const status = STATUS[parsed.status] ?? null;
96
+ if (status === null)
97
+ report("E002", lineNo, `Unknown status [${parsed.status}]`);
98
+ const { title, attrs, id, generated, badId } = splitBody(parsed.body);
99
+ if (badId)
100
+ report("W009", lineNo, "Trailing ^token is not a valid ID and is kept in the title");
101
+ if (title === "")
102
+ report("E011", lineNo, "Node has an empty title");
103
+ for (const key of Object.keys(attrs)) {
104
+ if (!ATTR_KEYS.has(key))
105
+ report("I002", lineNo, `Unknown attribute key "${key}"`);
106
+ }
107
+ if ("star" in attrs && typeof attrs.star !== "boolean") {
108
+ report("W010", lineNo, "star must be true or false; this node is treated as not starred");
109
+ }
110
+ const node = {
111
+ id, generated_id: generated, status, title, attrs,
112
+ notes: [], anchors: extractAnchors(title, lineNo, doc.links, report),
113
+ children: [], line: lineNo,
114
+ };
115
+ let parentNode = null;
116
+ if (parent?.type === "node")
117
+ parentNode = parent.node;
118
+ else if (parent?.type === "note") {
119
+ parentNode = parent.owner;
120
+ report("W002", lineNo, "Node nested under a note is attached to the note's owner");
121
+ }
122
+ (parentNode ? parentNode.children : doc.nodes).push(node);
123
+ parents.set(node, parentNode);
124
+ stack.push({ type: "node", indent, node });
125
+ }
126
+ resolveEdges(doc, stmts, parents, report);
127
+ return finish(doc);
128
+ }
129
+ function finish(doc) {
130
+ doc.diagnostics.sort((a, b) => a.line - b.line);
131
+ return doc;
132
+ }
133
+ /** Returns the body's first line index, or -1 when the front matter is unusable. */
134
+ function readFrontMatter(lines, doc, report) {
135
+ if (lines[0]?.trimEnd() !== "---")
136
+ return 0;
137
+ const end = lines.findIndex((l, i) => i > 0 && l.trimEnd() === "---");
138
+ if (end < 0) {
139
+ report("E012", 1, "Front matter is not terminated by ---");
140
+ return -1;
141
+ }
142
+ const text = lines.slice(1, end).join("\n");
143
+ const yaml = parseDocument(text);
144
+ if (yaml.errors.length > 0) {
145
+ report("E012", 1, `Front matter is not valid YAML: ${yaml.errors[0].message}`);
146
+ return end + 1;
147
+ }
148
+ if (yaml.contents === null)
149
+ return end + 1;
150
+ if (!isMap(yaml.contents)) {
151
+ report("E012", 1, "Front matter must be a YAML mapping");
152
+ return end + 1;
153
+ }
154
+ // Line of a YAML node, offset by the opening --- line.
155
+ const lineOf = (offset) => text.slice(0, offset).split("\n").length + 1;
156
+ for (const pair of yaml.contents.items) {
157
+ if (!isScalar(pair.key))
158
+ continue;
159
+ const key = String(pair.key.value);
160
+ const keyLine = lineOf(pair.key.range?.[0] ?? 0);
161
+ const value = pair.value;
162
+ if (key === "rhumb") {
163
+ // Use the source text so that `0.10` or `9.0` are read as written, not as numbers.
164
+ const version = isScalar(value) && value.range ? text.slice(value.range[0], value.range[1]).trim() : "";
165
+ doc.rhumb = version;
166
+ if (!isSupportedVersion(version))
167
+ report("E013", keyLine, `Unsupported rhumb version "${version}"`);
168
+ }
169
+ else if (key === "title") {
170
+ if (isScalar(value) && value.value !== null)
171
+ doc.title = String(value.value);
172
+ }
173
+ else if (key === "links") {
174
+ const links = value?.toJSON?.();
175
+ if (!links || typeof links !== "object" || Array.isArray(links)
176
+ || !Object.values(links).every((v) => typeof v === "string")) {
177
+ report("E012", keyLine, "links must map prefixes to string templates");
178
+ }
179
+ else {
180
+ doc.links = links;
181
+ }
182
+ }
183
+ else if (!FRONT_MATTER_KEYS.has(key)) {
184
+ report("I001", keyLine, `Unknown front matter key "${key}"`);
185
+ }
186
+ }
187
+ return end + 1;
188
+ }
189
+ function isSupportedVersion(version) {
190
+ const m = /^(\d+)\.(\d+)$/.exec(version);
191
+ if (!m)
192
+ return false;
193
+ const [major, minor] = RHUMB_VERSION.split(".").map(Number);
194
+ return Number(m[1]) === major && Number(m[2]) <= minor;
195
+ }
196
+ /** Leading whitespace width with tabs advancing to the next multiple of 4 (CommonMark). */
197
+ export function splitIndent(line) {
198
+ let col = 0;
199
+ let i = 0;
200
+ for (; i < line.length; i++) {
201
+ if (line[i] === " ")
202
+ col++;
203
+ else if (line[i] === "\t")
204
+ col += 4 - (col % 4);
205
+ else
206
+ break;
207
+ }
208
+ return { indent: col, rest: line.slice(i).trimEnd() };
209
+ }
210
+ /** Strips trailing `^id` then `{attrs}` from a node body; the rest is the title. */
211
+ function splitBody(body) {
212
+ let rest = body.trimEnd();
213
+ let id = null;
214
+ let badId = false;
215
+ const idMatch = /(^|\s)\^(\S+)$/.exec(rest);
216
+ if (idMatch && !rest.endsWith("\\^" + idMatch[2])) {
217
+ const token = idMatch[2];
218
+ if (HAND_ID.test(token) || GEN_ID.test(token)) {
219
+ id = token;
220
+ rest = rest.slice(0, rest.length - token.length - 1).trimEnd();
221
+ }
222
+ else {
223
+ badId = true;
224
+ }
225
+ }
226
+ let attrs = {};
227
+ if (rest.endsWith("}")) {
228
+ const open = matchingBrace(rest);
229
+ if (open !== null && (open === 0 || /\s/.test(rest[open - 1]))) {
230
+ const parsed = tryAttrs(rest.slice(open));
231
+ if (parsed) {
232
+ attrs = parsed;
233
+ rest = rest.slice(0, open).trimEnd();
234
+ }
235
+ }
236
+ }
237
+ const title = rest.replace(/\\([\^{])/g, "$1");
238
+ return { title, attrs, id, generated: id !== null && GEN_ID.test(id), badId };
239
+ }
240
+ /** Index of the unescaped `{` balancing the final `}`, or null. */
241
+ function matchingBrace(text) {
242
+ let depth = 0;
243
+ for (let i = text.length - 1; i >= 0; i--) {
244
+ const ch = text[i];
245
+ if (i > 0 && text[i - 1] === "\\")
246
+ continue;
247
+ if (ch === "}")
248
+ depth++;
249
+ else if (ch === "{" && --depth === 0)
250
+ return i;
251
+ }
252
+ return null;
253
+ }
254
+ /** A YAML flow mapping whose every key has a value; `{}` is allowed. */
255
+ function tryAttrs(text) {
256
+ const yaml = parseDocument(text);
257
+ if (yaml.errors.length > 0 || !isMap(yaml.contents))
258
+ return null;
259
+ const value = yaml.toJSON();
260
+ if (Object.values(value).some((v) => v === null))
261
+ return null;
262
+ return value;
263
+ }
264
+ function extractAnchors(text, line, links, report) {
265
+ const found = parseLine(text, { startRule: "Inline" });
266
+ // A `](<` that did not become a link is almost always an unescaped `>` inside the target.
267
+ const opened = [...text.matchAll(/\]\(</g)].length;
268
+ const parsed = found.filter((f) => text.startsWith("](<", f.start + f.text.length + 1)).length;
269
+ if (opened > parsed) {
270
+ report("W011", line, "A <…> link target was not recognized; escape > inside it as \\>");
271
+ }
272
+ return found.map(({ text: label, target }) => {
273
+ const anchor = classifyTarget(label, target, line);
274
+ if (anchor.kind === "prefix" && !(anchor.prefix in links)) {
275
+ report("E005", line, `Link prefix "${anchor.prefix}" is not defined in front matter links`);
276
+ }
277
+ return anchor;
278
+ });
279
+ }
280
+ /**
281
+ * Parses the part after `#`, narrowing left to right:
282
+ * `slug`, then `:~:text=…` (rest of the fragment) or `^=prefix` / ``^=`prefix` ``, then `+L3` / `-L2`;
283
+ * or an absolute `L42` / `L42-L50`.
284
+ * GitHub slugs are lowercase and never contain `+ ^ = \` : ~`, so these separators are unambiguous.
285
+ */
286
+ export function parseFragment(raw) {
287
+ const f = { slug: null, text_fragment: null, line_prefix: null, line_offset: null, lines: null, error: null };
288
+ const fail = (error) => ({ ...f, error });
289
+ const abs = /^L(\d+)(?:-L(\d+))?(.*)$/.exec(raw);
290
+ if (abs) {
291
+ const a = Number(abs[1]), b = abs[2] === undefined ? a : Number(abs[2]);
292
+ if (/^[+-]L\d+$/.test(abs[3]))
293
+ return fail(`an absolute line L${a} cannot take an offset`);
294
+ if (abs[3] !== "")
295
+ return fail(`unexpected "${abs[3]}" after line L${a}`);
296
+ if (a < 1)
297
+ return fail("lines start at L1");
298
+ if (b < a)
299
+ return fail(`line range L${a}-L${b} ends before it starts`);
300
+ return { ...f, lines: [a, b] };
301
+ }
302
+ const tf = raw.indexOf(":~:text=");
303
+ if (tf >= 0) {
304
+ // The text fragment runs to the end, so `+` inside it is text, not an offset.
305
+ return { ...f, slug: raw.slice(0, tf) || null, text_fragment: safeDecode(raw.slice(tf + ":~:text=".length)) };
306
+ }
307
+ let rest = raw;
308
+ const offset = /([+-])L(\d+)$/.exec(rest);
309
+ const sel = rest.indexOf("^=");
310
+ // An offset belongs to the fragment only if it is not inside the ^= prefix text.
311
+ const takeOffset = () => {
312
+ if (!offset)
313
+ return;
314
+ f.line_offset = (offset[1] === "-" ? -1 : 1) * Number(offset[2]);
315
+ rest = rest.slice(0, offset.index);
316
+ };
317
+ if (sel < 0) {
318
+ takeOffset();
319
+ f.slug = rest || null;
320
+ if (f.line_offset !== null && f.slug === null)
321
+ return fail("a line offset needs a heading or a ^= prefix");
322
+ return f;
323
+ }
324
+ f.slug = rest.slice(0, sel) || null;
325
+ let value = rest.slice(sel + 2);
326
+ if (value.startsWith("`")) {
327
+ const close = value.indexOf("`", 1);
328
+ if (close < 0)
329
+ return fail("unterminated ` in ^= prefix");
330
+ const after = value.slice(close + 1);
331
+ value = value.slice(1, close);
332
+ const m = /^([+-])L(\d+)$/.exec(after);
333
+ if (m)
334
+ f.line_offset = (m[1] === "-" ? -1 : 1) * Number(m[2]);
335
+ else if (after !== "")
336
+ return fail(`unexpected "${after}" after the ^= prefix`);
337
+ }
338
+ else {
339
+ const m = /^(.*?)([+-])L(\d+)$/.exec(value);
340
+ if (m && m[1] !== "")
341
+ (value = m[1], (f.line_offset = (m[2] === "-" ? -1 : 1) * Number(m[3])));
342
+ }
343
+ value = safeDecode(value);
344
+ if (value.trim() === "")
345
+ return fail("empty ^= prefix");
346
+ f.line_prefix = value;
347
+ return f;
348
+ }
349
+ function classifyTarget(text, target, line) {
350
+ const hash = target.indexOf("#");
351
+ const base = hash < 0 ? target : target.slice(0, hash);
352
+ const frag = hash < 0 ? null : parseFragment(target.slice(hash + 1));
353
+ const anchor = {
354
+ text, target, line, kind: "relative", prefix: null, path: base,
355
+ fragment: frag?.slug ?? null, text_fragment: frag?.text_fragment ?? null,
356
+ line_prefix: frag?.line_prefix ?? null, line_offset: frag?.line_offset ?? null,
357
+ lines: frag?.lines ?? null, fragment_error: frag?.error ?? null,
358
+ };
359
+ const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):/.exec(base);
360
+ if (scheme) {
361
+ const name = scheme[1];
362
+ if (URL_SCHEMES.has(name.toLowerCase())) {
363
+ Object.assign(anchor, { kind: "url", path: null, fragment: null, text_fragment: null,
364
+ line_prefix: null, line_offset: null, lines: null, fragment_error: null });
365
+ }
366
+ else {
367
+ Object.assign(anchor, { kind: "prefix", prefix: name, path: base.slice(name.length + 1) });
368
+ }
369
+ }
370
+ return anchor;
371
+ }
372
+ function safeDecode(s) {
373
+ try {
374
+ return decodeURIComponent(s);
375
+ }
376
+ catch {
377
+ return s;
378
+ }
379
+ }
380
+ function resolveEdges(doc, stmts, parents, report) {
381
+ // First occurrence wins for duplicate IDs.
382
+ const byId = new Map();
383
+ for (const node of parents.keys()) {
384
+ if (node.id === null)
385
+ continue;
386
+ if (byId.has(node.id))
387
+ report("E003", node.line, `Duplicate ID "${node.id}"`);
388
+ else
389
+ byId.set(node.id, node);
390
+ }
391
+ const isAncestor = (a, b) => {
392
+ for (let p = parents.get(b) ?? null; p; p = parents.get(p) ?? null)
393
+ if (p === a)
394
+ return true;
395
+ return false;
396
+ };
397
+ // Dependency graph: x -> y means x needs y.
398
+ const deps = new Map();
399
+ const reaches = (from, to) => {
400
+ const seen = new Set();
401
+ const todo = [from];
402
+ while (todo.length > 0) {
403
+ const cur = todo.pop();
404
+ if (cur === to)
405
+ return true;
406
+ if (seen.has(cur))
407
+ continue;
408
+ seen.add(cur);
409
+ for (const next of deps.get(cur) ?? [])
410
+ todo.push(next);
411
+ }
412
+ return false;
413
+ };
414
+ const seen = new Set();
415
+ for (const stmt of stmts) {
416
+ if (!EDGE_KINDS.has(stmt.kind)) {
417
+ // Prose that happens to look like `word word word` is not an edge attempt.
418
+ if (byId.has(stmt.from.id))
419
+ report("E008", stmt.line, `Unknown edge kind "${stmt.kind}"`);
420
+ else
421
+ report("E001", stmt.line, "Unrecognized line");
422
+ continue;
423
+ }
424
+ const kind = stmt.kind;
425
+ for (const to of stmt.to) {
426
+ if (stmt.from.file !== null || to.file !== null) {
427
+ report("E006", stmt.line, "Cross-file references are not supported in 0.1");
428
+ continue;
429
+ }
430
+ const a = byId.get(stmt.from.id);
431
+ const b = byId.get(to.id);
432
+ if (!a || !b) {
433
+ report("E007", stmt.line, `Unknown ID "${!a ? stmt.from.id : to.id}"`);
434
+ continue;
435
+ }
436
+ if (a === b) {
437
+ report("E010", stmt.line, `Edge from "${a.id}" to itself`);
438
+ continue;
439
+ }
440
+ // Unlabeled relates is undirected; labeled edges are distinct per direction and label.
441
+ const key = kind === "relates" && !stmt.label
442
+ ? `relates ${[a.id, b.id].sort().join(" ")}`
443
+ : `${kind} ${a.id} ${b.id} ${stmt.label ?? ""}`;
444
+ if (seen.has(key)) {
445
+ report("W004", stmt.line, "Duplicate edge");
446
+ continue;
447
+ }
448
+ seen.add(key);
449
+ if (kind === "needs" || kind === "blocks") {
450
+ if (isAncestor(a, b) || isAncestor(b, a)) {
451
+ report("W005", stmt.line, "Dependency between a node and its descendant");
452
+ }
453
+ const [x, y] = kind === "needs" ? [a.id, b.id] : [b.id, a.id];
454
+ if (reaches(y, x))
455
+ report("E009", stmt.line, "Dependency cycle");
456
+ if (!deps.has(x))
457
+ deps.set(x, new Set());
458
+ deps.get(x).add(y);
459
+ }
460
+ doc.edges.push({ kind, from: a.id, to: b.id, label: stmt.label, line: stmt.line });
461
+ }
462
+ }
463
+ }
464
+ /** A node is starred only with `{star: true}`; any other value (W010) counts as not starred. */
465
+ export function isStarred(node) {
466
+ return node.attrs.star === true;
467
+ }
468
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Anchor, Diagnostic, RhumbDocument } from "./types.ts";
2
+ export interface ResolveContext {
3
+ /** Directory of the .rhumb file; relative targets resolve against it. */
4
+ baseDir: string;
5
+ links: Record<string, string>;
6
+ /** Returns file text, or null when the file does not exist. */
7
+ readFile: (path: string) => string | null;
8
+ }
9
+ export interface Resolved {
10
+ /** Absolute URL when the target is (or a link template expands to) a URL. */
11
+ url: string | null;
12
+ file: string | null;
13
+ heading: {
14
+ text: string;
15
+ line: number;
16
+ } | null;
17
+ /** 1-based line of the list entry matched by the text fragment. */
18
+ entryLine: number | null;
19
+ /** 1-based line the anchor points at (after ^= prefix, offset or absolute line). */
20
+ line: number | null;
21
+ /** Last line of an absolute range (`#L42-L50`); equals `line` for a single line. */
22
+ lineEnd: number | null;
23
+ /** Diagnostics are reported on the anchor's line in the .rhumb file. */
24
+ diagnostics: Diagnostic[];
25
+ }
26
+ export declare function resolveAnchor(anchor: Anchor, ctx: ResolveContext): Resolved;
27
+ /** Resolves every anchor in the document and returns only the diagnostics. */
28
+ export declare function checkAnchors(doc: RhumbDocument, ctx: ResolveContext): Diagnostic[];
29
+ /** The Markdown excerpt an anchor points at: the matched entry, else the heading section. */
30
+ export declare function excerpt(text: string, r: Resolved, maxLines?: number): string | null;
31
+ export declare function contextFor(rhumbPath: string, doc: RhumbDocument, readFile: ResolveContext["readFile"]): ResolveContext;
32
+ interface Heading {
33
+ text: string;
34
+ slug: string;
35
+ depth: number;
36
+ line: number;
37
+ }
38
+ /** ATX headings outside fenced code, with GitHub-style slugs (duplicates get -1, -2…). */
39
+ export declare function markdownHeadings(text: string): Heading[];
40
+ export declare function githubSlug(heading: string): string;
41
+ export {};