@brett_lamy/docstream 1.18.1 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +65 -19
  2. package/dist/docs/DocsRenderer.d.ts.map +1 -1
  3. package/dist/docs/DocsRenderer.js +14 -3
  4. package/dist/docs/DocsRenderer.js.map +1 -1
  5. package/dist/gitbook/parse.js +10 -2
  6. package/dist/gitbook/parse.js.map +1 -1
  7. package/dist/openapi/OpenApiOperation.d.ts.map +1 -1
  8. package/dist/openapi/OpenApiOperation.js +13 -5
  9. package/dist/openapi/OpenApiOperation.js.map +1 -1
  10. package/dist/replay/ReplayStageImpl.d.ts.map +1 -1
  11. package/dist/replay/ReplayStageImpl.js +4 -1
  12. package/dist/replay/ReplayStageImpl.js.map +1 -1
  13. package/dist/site/DocsSite.d.ts +74 -0
  14. package/dist/site/DocsSite.d.ts.map +1 -0
  15. package/dist/site/DocsSite.js +479 -0
  16. package/dist/site/DocsSite.js.map +1 -0
  17. package/dist/site/index.d.ts +7 -0
  18. package/dist/site/index.d.ts.map +1 -0
  19. package/dist/site/index.js +5 -0
  20. package/dist/site/index.js.map +1 -0
  21. package/dist/site/search.d.ts +28 -0
  22. package/dist/site/search.d.ts.map +1 -0
  23. package/dist/site/search.js +125 -0
  24. package/dist/site/search.js.map +1 -0
  25. package/dist/site/site.css +816 -0
  26. package/dist/site/tree.d.ts +105 -0
  27. package/dist/site/tree.d.ts.map +1 -0
  28. package/dist/site/tree.js +411 -0
  29. package/dist/site/tree.js.map +1 -0
  30. package/dist/styles.css +1 -0
  31. package/package.json +8 -1
  32. package/src/docs/DocsRenderer.tsx +14 -3
  33. package/src/gitbook/parse.ts +10 -2
  34. package/src/openapi/OpenApiOperation.tsx +13 -5
  35. package/src/replay/ReplayStageImpl.tsx +4 -1
  36. package/src/site/DocsSite.tsx +958 -0
  37. package/src/site/index.ts +18 -0
  38. package/src/site/search.ts +138 -0
  39. package/src/site/site.css +816 -0
  40. package/src/site/tree.ts +482 -0
  41. package/src/styles.css +1 -0
@@ -0,0 +1,125 @@
1
+ /* Client-side full-text search over a docs tree: each page is split into sections at its
2
+ headings, so a hit can jump straight to the heading it was found under. */
3
+ import { slugify } from "../gitbook/outline.js";
4
+ import { plainTitle } from "./tree.js";
5
+ const HEADING = /^(#{1,6})[ \t]+(.+?)[ \t]*#*[ \t]*$/;
6
+ const TABS_TITLE = /^\{%\s*tabs\b[^%]*\btitle="([^"]+)"/;
7
+ /** Markdown → searchable plain text (tags, HTML and punctuation removed, code kept). */
8
+ export function searchableText(markdown) {
9
+ return markdown
10
+ .replace(/^(`{3,}|~{3,}).*$/gm, " ")
11
+ .replace(/\{%[^%]*%\}/g, " ")
12
+ .replace(/<[^>]+>/g, " ")
13
+ .replace(/!\[([^\]]*)\]\([^)]*\)/g, "$1")
14
+ .replace(/\[([^\]]*)\]\([^)]*\)/g, "$1")
15
+ .replace(/^\[\^[^\]]+\]:.*$/gm, " ")
16
+ .replace(/\[\^[^\]]+\]/g, "")
17
+ .replace(/[*~`>|#]+/g, " ")
18
+ // `_` only as emphasis at a word's edge, so `@brett_lamy` and `snake_case` stay whole.
19
+ .replace(/(^|[\s(])_+|_+(?=[\s).,;:!?]|$)/g, "$1 ")
20
+ .replace(/^\s*[-+]\s+(\[.\]\s+)?/gm, " ")
21
+ .replace(/\$\$/g, " ")
22
+ .replace(/\s+/g, " ")
23
+ .trim();
24
+ }
25
+ function sectionsOf(page) {
26
+ const out = [];
27
+ let heading;
28
+ let buf = [];
29
+ let fence = null;
30
+ const flush = () => {
31
+ const text = searchableText(buf.join("\n"));
32
+ if (text || heading)
33
+ out.push({ page, heading, anchor: heading ? slugify(heading) : undefined, text });
34
+ buf = [];
35
+ };
36
+ for (const line of page.body.split("\n")) {
37
+ const trimmed = line.trim();
38
+ const f = /^(`{3,}|~{3,})/.exec(trimmed);
39
+ if (f) {
40
+ if (!fence)
41
+ fence = f[1][0];
42
+ else if (f[1][0] === fence)
43
+ fence = null;
44
+ buf.push(line);
45
+ continue;
46
+ }
47
+ const h = fence ? null : HEADING.exec(line) ?? TABS_TITLE.exec(trimmed);
48
+ if (h) {
49
+ flush();
50
+ heading = plainTitle(h.length === 3 ? h[2] : h[1]);
51
+ continue;
52
+ }
53
+ buf.push(line);
54
+ }
55
+ flush();
56
+ return out;
57
+ }
58
+ function snippetAround(text, at, length) {
59
+ if (at < 0)
60
+ return { snippet: text.length > 140 ? `${text.slice(0, 140).trimEnd()}…` : text };
61
+ const start = Math.max(0, at - 50);
62
+ const end = Math.min(text.length, at + length + 90);
63
+ const lead = start > 0 ? "…" : "";
64
+ const snippet = `${lead}${text.slice(start, end).trim()}${end < text.length ? "…" : ""}`;
65
+ const offset = lead.length + (at - start) - (text.slice(start, end).length - text.slice(start, end).trimStart().length);
66
+ return { snippet, highlight: [offset, offset + length] };
67
+ }
68
+ /** An in-memory index of every page; `search` ranks title, then heading, then body matches. */
69
+ export function createDocsSearchIndex(tree) {
70
+ const sections = tree.pages.flatMap(sectionsOf);
71
+ return {
72
+ sections,
73
+ search(query, limit = 20) {
74
+ const q = query.trim().toLowerCase();
75
+ if (!q)
76
+ return [];
77
+ const terms = q.split(/\s+/).filter(Boolean);
78
+ const results = [];
79
+ for (const s of sections) {
80
+ const title = s.page.title.toLowerCase();
81
+ const heading = s.heading?.toLowerCase() ?? "";
82
+ const text = s.text.toLowerCase();
83
+ const haystack = `${title} ${heading} ${text}`;
84
+ if (!terms.every((t) => haystack.includes(t)))
85
+ continue;
86
+ let score = 0;
87
+ for (const t of terms) {
88
+ if (title.startsWith(t))
89
+ score += 12;
90
+ else if (title.includes(t))
91
+ score += 8;
92
+ if (heading.startsWith(t))
93
+ score += 6;
94
+ else if (heading.includes(t))
95
+ score += 4;
96
+ if (text.includes(t))
97
+ score += 1;
98
+ }
99
+ if (title === q)
100
+ score += 20;
101
+ if (heading === q)
102
+ score += 10;
103
+ // A page's opening section carries its title match; deeper sections rank by their heading.
104
+ if (s.heading)
105
+ score -= title.includes(terms[0]) ? 6 : 0;
106
+ const at = text.indexOf(terms[0]);
107
+ results.push({ page: s.page, heading: s.heading, anchor: s.anchor, score, ...snippetAround(s.text, at, at >= 0 ? terms[0].length : 0) });
108
+ }
109
+ results.sort((a, b) => b.score - a.score);
110
+ const seen = new Set();
111
+ const out = [];
112
+ for (const r of results) {
113
+ const key = `${r.page.slug}#${r.anchor ?? ""}`;
114
+ if (seen.has(key))
115
+ continue;
116
+ seen.add(key);
117
+ out.push(r);
118
+ if (out.length >= limit)
119
+ break;
120
+ }
121
+ return out;
122
+ },
123
+ };
124
+ }
125
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/site/search.ts"],"names":[],"mappings":"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"}