@miadi/reference-ui 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +92 -2
- package/dist/index.d.ts +218 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +381 -0
- package/dist/index.js.map +1 -0
- package/dist/react.d.ts +47 -0
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +58 -0
- package/dist/react.js.map +1 -0
- package/package.json +74 -3
- package/src/index.ts +531 -0
- package/src/react.tsx +108 -0
- package/src/reference-ui.css +176 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @miadi/reference-ui — the presentation half of Miadi references.
|
|
3
|
+
*
|
|
4
|
+
* `@miadi/inquiry-weave/references` owns the ADDRESS: parse, scan, fold
|
|
5
|
+
* `{{ … }}` directives. This package owns how a reference LOOKS once a
|
|
6
|
+
* resolver has answered: a view model, an HTML renderer with no framework,
|
|
7
|
+
* and (on `./react`) React components with the same markup.
|
|
8
|
+
*
|
|
9
|
+
* The split is the Dexter reference model's: what a link points to and how it
|
|
10
|
+
* is presented are separate layers with separate interfaces. Finding the
|
|
11
|
+
* target is the host's job, because only the host knows who is reading — the
|
|
12
|
+
* Miadi app reads its catalog on disk as the viewer, a review service asks a
|
|
13
|
+
* public front. So nothing here holds a URL, a token or a chronicle root.
|
|
14
|
+
* `createRemoteResolver` takes the front as an argument.
|
|
15
|
+
*
|
|
16
|
+
* Ref: jgwill/Miadi#713. Grounding: foundations/resource-addressing-and-terminal-hypermedia/.
|
|
17
|
+
*/
|
|
18
|
+
import { findTextReferences, foundationRoute, isFoundationUri, isMiadiChronicleUri, isWheelRefUri, linkBareReferences, parseFoundationUri, parseMiadiChronicleUri, parseWheelRefUri, transformDirectives, } from "@miadi/inquiry-weave/references";
|
|
19
|
+
/** True for the four schemes this package renders. */
|
|
20
|
+
export function isReferenceUri(url) {
|
|
21
|
+
return isMiadiChronicleUri(url) || isFoundationUri(url) || isWheelRefUri(url);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A markdown renderer's URL filter that lets the four schemes through and
|
|
25
|
+
* hands everything else to the host's own filter. react-markdown strips
|
|
26
|
+
* unknown schemes by default, which would blank every reference.
|
|
27
|
+
*/
|
|
28
|
+
export function referenceUrlTransform(fallback) {
|
|
29
|
+
return (url) => (isReferenceUri(url) ? url : fallback(url));
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* The href a view may carry: a path on this host (`/x`, never `//x`), made
|
|
33
|
+
* absolute on `base` when one is given, or an http(s) URL on `base`'s own
|
|
34
|
+
* origin. Anything else — `javascript:`, `//evil.example`, another origin —
|
|
35
|
+
* is refused, and the view renders unresolved. A resolver's answer is data
|
|
36
|
+
* from the network, and the HTML renderer cannot rely on React's own
|
|
37
|
+
* `javascript:` guard (jgwill/Miadi#713 review, F1).
|
|
38
|
+
*/
|
|
39
|
+
export function safeHref(route, base) {
|
|
40
|
+
if (typeof route !== "string" || /[\u0000-\u001f\u007f\s\\]/.test(route))
|
|
41
|
+
return null;
|
|
42
|
+
if (/^\/(?!\/)/.test(route))
|
|
43
|
+
return base ? `${base.replace(/\/+$/, "")}${route}` : route;
|
|
44
|
+
if (!base)
|
|
45
|
+
return null;
|
|
46
|
+
try {
|
|
47
|
+
const url = new URL(route);
|
|
48
|
+
const origin = new URL(base).origin;
|
|
49
|
+
return (url.protocol === "https:" || url.protocol === "http:") && url.origin === origin ? url.href : null;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const showOf = (options) => (options.show === "card" ? "card" : "chip");
|
|
56
|
+
const pad = (n) => String(n).padStart(3, "0");
|
|
57
|
+
function base(uri, options, fallback) {
|
|
58
|
+
return {
|
|
59
|
+
uri,
|
|
60
|
+
...(options.label ? { label: options.label } : {}),
|
|
61
|
+
fallback,
|
|
62
|
+
show: showOf(options),
|
|
63
|
+
highlight: options.highlight === "true",
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function unresolvedView(uri, scheme, reason, options = {}, fallback) {
|
|
67
|
+
return { kind: "unresolved", scheme, reason, ...base(uri, options, fallback ?? uri.replace(/^miadi-[a-z]+:(\/\/)?/i, "")) };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The view of an episode reference, from a parse and a resolution
|
|
71
|
+
* (`resolveChronicleRef`, or the `resolution` field of `/api/chronicle/resolve`).
|
|
72
|
+
* `base` makes the room route absolute for a host on another origin.
|
|
73
|
+
*/
|
|
74
|
+
export function episodeReferenceView(parsed, resolution, options = {}) {
|
|
75
|
+
const target = resolution?.target;
|
|
76
|
+
const waypoints = Array.isArray(resolution?.waypoints) ? resolution.waypoints : [];
|
|
77
|
+
const href = target?.resolved === true && typeof target.name === "string" ? safeHref(target.route, options.base) : null;
|
|
78
|
+
if (!target || !href) {
|
|
79
|
+
return unresolvedView(parsed.uri, "chronicle", `Unresolved chronicle reference: ${parsed.uri}`, parsed.options, parsed.episodePath);
|
|
80
|
+
}
|
|
81
|
+
const title = typeof target.title === "string" ? target.title : undefined;
|
|
82
|
+
return {
|
|
83
|
+
kind: "episode",
|
|
84
|
+
// A bare mention or a link with no words of its own shows the title.
|
|
85
|
+
...base(parsed.uri, parsed.options, title ?? parsed.episodePath),
|
|
86
|
+
href,
|
|
87
|
+
badge: typeof target.number === "number" ? `ep ${pad(target.number)}` : target.name,
|
|
88
|
+
name: target.name,
|
|
89
|
+
...(title ? { title } : {}),
|
|
90
|
+
...(typeof target.date === "string" ? { date: target.date } : {}),
|
|
91
|
+
...(typeof target.direction === "string" ? { direction: target.direction } : {}),
|
|
92
|
+
...(typeof target.theme === "string" ? { theme: target.theme } : {}),
|
|
93
|
+
via: waypoints.map((w) => (typeof w?.number === "number" ? `ep ${w.number}` : String(w?.segment ?? ""))),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function foundationReferenceView(parsed, info, options = {}) {
|
|
97
|
+
const fallback = parsed.file ? `${parsed.slug}/${parsed.file}` : parsed.slug;
|
|
98
|
+
const href = info && info.exists === true ? safeHref(info.route ?? foundationRoute(parsed), options.base) : null;
|
|
99
|
+
if (!info || !href) {
|
|
100
|
+
return unresolvedView(parsed.uri, "foundation", `Unresolved foundation reference: ${parsed.uri}`, parsed.options, fallback);
|
|
101
|
+
}
|
|
102
|
+
const title = typeof info.title === "string" ? info.title : undefined;
|
|
103
|
+
return {
|
|
104
|
+
kind: "foundation",
|
|
105
|
+
...base(parsed.uri, parsed.options, title && !parsed.file ? title : fallback),
|
|
106
|
+
href,
|
|
107
|
+
slug: parsed.slug,
|
|
108
|
+
...(parsed.file ? { file: parsed.file } : {}),
|
|
109
|
+
...(title ? { title } : {}),
|
|
110
|
+
...(typeof info.version === "string" ? { version: info.version } : {}),
|
|
111
|
+
fields: Array.isArray(info.fields) ? info.fields.filter((f) => typeof f === "string") : [],
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* An episode's own packet, `miadi-chronicle:<ep>/foundations/<topic>`: a
|
|
116
|
+
* foundation chip whose page is the episode room opened on the packet README.
|
|
117
|
+
*/
|
|
118
|
+
export function episodeFoundationView(parsed, resolution, info, options = {}) {
|
|
119
|
+
const topic = parsed.artifactName ?? "";
|
|
120
|
+
const episode = episodeReferenceView(parsed, resolution, options);
|
|
121
|
+
if (episode.kind !== "episode" || !info.exists || !topic) {
|
|
122
|
+
return unresolvedView(parsed.uri, "chronicle", `Unresolved episode foundation: ${parsed.uri}`, parsed.options, topic || parsed.episodePath);
|
|
123
|
+
}
|
|
124
|
+
const title = typeof info.title === "string" ? info.title : undefined;
|
|
125
|
+
return {
|
|
126
|
+
kind: "foundation",
|
|
127
|
+
...base(parsed.uri, parsed.options, title ?? topic),
|
|
128
|
+
// The room's own `?file=` door, its query placed before any fragment, and
|
|
129
|
+
// only when the packet has a README to open (#713, V9).
|
|
130
|
+
href: info.hasReadme === false ? episode.href : withQuery(episode.href, `file=${encodeURIComponent(`foundations/${topic}/README.md`)}`),
|
|
131
|
+
slug: topic,
|
|
132
|
+
...(title ? { title } : {}),
|
|
133
|
+
fields: [],
|
|
134
|
+
episode: episode.badge,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
export function wheelReferenceView(parsed, route, options = {}) {
|
|
138
|
+
const href = safeHref(route, options.base);
|
|
139
|
+
if (!href)
|
|
140
|
+
return unresolvedView(parsed.uri, parsed.kind, `Unresolved ${parsed.kind} reference: ${parsed.uri}`, parsed.options, parsed.kind);
|
|
141
|
+
return {
|
|
142
|
+
kind: "wheel",
|
|
143
|
+
wheel: parsed.kind,
|
|
144
|
+
id: parsed.id,
|
|
145
|
+
href,
|
|
146
|
+
...base(parsed.uri, parsed.options, parsed.kind),
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/** Put a query before the fragment of an href. */
|
|
150
|
+
export function withQuery(href, query) {
|
|
151
|
+
const hash = href.indexOf("#");
|
|
152
|
+
const head = hash === -1 ? href : href.slice(0, hash);
|
|
153
|
+
const tail = hash === -1 ? "" : href.slice(hash);
|
|
154
|
+
return `${head}${head.includes("?") ? "&" : "?"}${query}${tail}`;
|
|
155
|
+
}
|
|
156
|
+
// ── HTML ─────────────────────────────────────────────────────────────────────
|
|
157
|
+
const ESCAPES = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" };
|
|
158
|
+
export function escapeHtml(text) {
|
|
159
|
+
return text.replace(/[&<>"']/g, (c) => ESCAPES[c]);
|
|
160
|
+
}
|
|
161
|
+
const DIRECTIONS = new Set(["east", "south", "west", "north"]);
|
|
162
|
+
/** Class names, shared by the HTML renderer and the React components so the markup is one. */
|
|
163
|
+
export function referenceClasses(view) {
|
|
164
|
+
if (view.kind === "unresolved")
|
|
165
|
+
return `mr-ref mr-ref--chip mr-ref--unresolved not-prose`;
|
|
166
|
+
const dir = view.kind === "episode" && view.direction && DIRECTIONS.has(view.direction) ? ` mr-dir-${view.direction}` : "";
|
|
167
|
+
const highlight = view.highlight ? " mr-ref--highlight" : "";
|
|
168
|
+
return `mr-ref mr-ref--${view.show} mr-ref--${view.kind}${dir}${highlight} not-prose`;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* What a view shows. `text` is the link text a markdown author wrote
|
|
172
|
+
* (`[text](uri)`), which outranks the fallback but not an explicit `mc.label`.
|
|
173
|
+
*/
|
|
174
|
+
export function referenceParts(view, text) {
|
|
175
|
+
// A bare mention linked to itself has no words of its own (#713 review, F10).
|
|
176
|
+
const words = text && !isReferenceUri(text.trim()) ? text : undefined;
|
|
177
|
+
const label = view.label || words || view.fallback;
|
|
178
|
+
switch (view.kind) {
|
|
179
|
+
case "unresolved":
|
|
180
|
+
return { badge: view.scheme === "foundation" ? "◇" : "⟐", label, note: "(unresolved)", tooltip: view.reason };
|
|
181
|
+
case "wheel":
|
|
182
|
+
return { badge: view.wheel === "ceremony" ? "◆" : "○", label, tooltip: `${view.wheel} ${view.id}: its page asks for your seat` };
|
|
183
|
+
case "episode": {
|
|
184
|
+
const meta = [
|
|
185
|
+
view.label && view.title && view.label !== view.title ? view.title : "",
|
|
186
|
+
view.date ?? "",
|
|
187
|
+
view.theme ?? "",
|
|
188
|
+
view.via.length > 0 ? `via ${view.via.join(" → ")}` : "",
|
|
189
|
+
].filter(Boolean).join(" · ");
|
|
190
|
+
return view.show === "card"
|
|
191
|
+
? { badge: `⟐ ${view.badge}${view.direction ? ` · ${view.direction}` : ""}`, label, title: view.label || view.title || label, meta, tooltip: view.title ?? view.name }
|
|
192
|
+
: { badge: `⟐ ${view.badge}`, label, tooltip: `${view.title ?? view.name}${view.date ? ` (${view.date})` : ""}` };
|
|
193
|
+
}
|
|
194
|
+
case "foundation": {
|
|
195
|
+
const kind = view.episode ? `foundation · ${view.episode}` : "foundation";
|
|
196
|
+
// A package number reads `v0.1.6`; a source commit reads `at a9cf5d29b4c9`.
|
|
197
|
+
const version = view.version ? (/^\d+\.\d+/.test(view.version) ? `v${view.version}` : `at ${view.version}`) : "";
|
|
198
|
+
const meta = [view.file ?? "", view.fields.slice(0, 3).join(" · "), version].filter(Boolean).join(" · ");
|
|
199
|
+
return view.show === "card"
|
|
200
|
+
? { badge: `◇ ${kind}`, label, title: view.label || view.title || label, meta, tooltip: view.title ?? view.slug }
|
|
201
|
+
: { badge: `◇ ${kind}`, label, tooltip: `${view.title ?? view.slug}${view.file ? ` · ${view.file}` : ""}` };
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
/** One reference as an HTML string, for hosts without React. Every text is escaped. */
|
|
206
|
+
export function renderReferenceHtml(view, text) {
|
|
207
|
+
const p = referenceParts(view, text);
|
|
208
|
+
const cls = referenceClasses(view);
|
|
209
|
+
const data = `data-miadi-uri="${escapeHtml(view.uri)}" data-miadi-resolved="${view.kind === "unresolved" ? "false" : "true"}"`;
|
|
210
|
+
if (view.kind === "unresolved") {
|
|
211
|
+
return `<span class="${cls}" title="${escapeHtml(p.tooltip)}" ${data}><span class="mr-ref__badge">${escapeHtml(p.badge)}</span> <span class="mr-ref__label">${escapeHtml(p.label)}</span> <span class="mr-ref__note">${escapeHtml(p.note)}</span></span>`;
|
|
212
|
+
}
|
|
213
|
+
const head = `<a class="${cls}" href="${escapeHtml(view.href)}" title="${escapeHtml(p.tooltip)}" ${data}>`;
|
|
214
|
+
if (view.show === "card" && view.kind !== "wheel") {
|
|
215
|
+
return `${head}<span class="mr-ref__badge">${escapeHtml(p.badge)}</span><span class="mr-ref__title">${escapeHtml(p.title)}</span>${p.meta ? `<span class="mr-ref__meta">${escapeHtml(p.meta)}</span>` : ""}</a>`;
|
|
216
|
+
}
|
|
217
|
+
return `${head}<span class="mr-ref__badge">${escapeHtml(p.badge)}</span> <span class="mr-ref__label">${escapeHtml(p.label)}</span></a>`;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* A resolver over a Miadi front's public resolve door. The front is an
|
|
221
|
+
* argument, never a default: `createRemoteResolver({ origin: process.env.MIADI_PUBLIC_URL })`.
|
|
222
|
+
* Only that origin is asked. A failure answers null, which renders as an
|
|
223
|
+
* unresolved chip: a broken reference is data, never a page error.
|
|
224
|
+
*/
|
|
225
|
+
export function createRemoteResolver(options) {
|
|
226
|
+
const origin = options.origin.replace(/\/+$/, "");
|
|
227
|
+
const doFetch = options.fetch ?? fetch;
|
|
228
|
+
return async (uri) => {
|
|
229
|
+
const controller = new AbortController();
|
|
230
|
+
const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 8_000);
|
|
231
|
+
try {
|
|
232
|
+
// A Headers instance or a tuple list survives the merge (#713 review, F11).
|
|
233
|
+
const headers = new Headers(options.init?.headers);
|
|
234
|
+
headers.set("accept", "application/json");
|
|
235
|
+
const response = await doFetch(`${origin}/api/chronicle/resolve?uri=${encodeURIComponent(uri)}`, {
|
|
236
|
+
...options.init,
|
|
237
|
+
signal: controller.signal,
|
|
238
|
+
headers,
|
|
239
|
+
});
|
|
240
|
+
if (!response.ok)
|
|
241
|
+
return null;
|
|
242
|
+
const body = await response.json();
|
|
243
|
+
return body && typeof body === "object" ? body : null;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
finally {
|
|
249
|
+
clearTimeout(timer);
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const isObject = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
254
|
+
/** A resolution as far as this package reads it, or undefined (#713 review, F5). */
|
|
255
|
+
function resolutionOf(value) {
|
|
256
|
+
if (!isObject(value) || !isObject(value.target) || typeof value.target.resolved !== "boolean")
|
|
257
|
+
return undefined;
|
|
258
|
+
return {
|
|
259
|
+
resolved: value.resolved === true,
|
|
260
|
+
target: value.target,
|
|
261
|
+
waypoints: Array.isArray(value.waypoints) ? value.waypoints.filter(isObject) : [],
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* The view a resolver's answer makes for one URI. The answer is data from the
|
|
266
|
+
* network: a field of the wrong shape makes the reference unresolved, never a
|
|
267
|
+
* thrown page. `base` makes relative routes absolute.
|
|
268
|
+
*/
|
|
269
|
+
export function viewFromAnswer(uri, answer, options = {}) {
|
|
270
|
+
const a = isObject(answer) ? answer : {};
|
|
271
|
+
const foundation = parseFoundationUri(uri);
|
|
272
|
+
if (foundation) {
|
|
273
|
+
const info = isObject(a.foundation) && a.foundation.slug === foundation.slug ? a.foundation : null;
|
|
274
|
+
return foundationReferenceView(foundation, info, options);
|
|
275
|
+
}
|
|
276
|
+
const wheel = parseWheelRefUri(uri);
|
|
277
|
+
if (wheel) {
|
|
278
|
+
const route = isObject(a.wheelRef) ? a.wheelRef.route : undefined;
|
|
279
|
+
return typeof route === "string"
|
|
280
|
+
? wheelReferenceView(wheel, route, options)
|
|
281
|
+
: unresolvedView(uri, wheel.kind, `Unresolved ${wheel.kind} reference: ${uri}`, wheel.options, wheel.kind);
|
|
282
|
+
}
|
|
283
|
+
const chronicle = parseMiadiChronicleUri(uri);
|
|
284
|
+
if (!chronicle)
|
|
285
|
+
return null;
|
|
286
|
+
const resolution = resolutionOf(a.resolution);
|
|
287
|
+
if (!resolution)
|
|
288
|
+
return unresolvedView(uri, "chronicle", `Unresolved chronicle reference: ${uri}`, chronicle.options, chronicle.episodePath);
|
|
289
|
+
if (chronicle.artifact === "foundations" && chronicle.artifactName) {
|
|
290
|
+
const own = isObject(a.episodeFoundation) ? a.episodeFoundation : {};
|
|
291
|
+
return episodeFoundationView(chronicle, resolution, { exists: own.exists === true, hasReadme: own.hasReadme !== false, ...(typeof own.title === "string" ? { title: own.title } : {}) }, options);
|
|
292
|
+
}
|
|
293
|
+
return episodeReferenceView(chronicle, resolution, options);
|
|
294
|
+
}
|
|
295
|
+
function safeDecode(s) {
|
|
296
|
+
try {
|
|
297
|
+
return decodeURIComponent(s);
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
return s;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* One key for every spelling of the same reference: the destination the
|
|
305
|
+
* scanner reports (`TextReference.href`, escapes already processed) and the
|
|
306
|
+
* href a markdown parser hands the link component (percent-encoded, `//`
|
|
307
|
+
* kept or dropped) map to it. The parts are kept apart as a JSON tuple, so
|
|
308
|
+
* two different references never share a key: joining them with `|` or `&`
|
|
309
|
+
* let `mc.label=a%26mc.show%3Dcard` collide with `mc.label=a&mc.show=card`
|
|
310
|
+
* (jgwill/Miadi#713, V6).
|
|
311
|
+
*/
|
|
312
|
+
export function referenceKey(href) {
|
|
313
|
+
const text = href.trim();
|
|
314
|
+
const pairs = (query) => Object.entries(query).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
315
|
+
const foundation = parseFoundationUri(text);
|
|
316
|
+
if (foundation) {
|
|
317
|
+
return JSON.stringify(["foundation", foundation.slug, foundation.file ?? "", pairs(foundation.query), pairs(foundation.options), safeDecode(foundation.fragment ?? "")]);
|
|
318
|
+
}
|
|
319
|
+
const wheel = parseWheelRefUri(text);
|
|
320
|
+
if (wheel)
|
|
321
|
+
return JSON.stringify([wheel.kind, wheel.id, pairs(wheel.query), pairs(wheel.options), safeDecode(wheel.fragment ?? "")]);
|
|
322
|
+
const chronicle = parseMiadiChronicleUri(text);
|
|
323
|
+
if (chronicle) {
|
|
324
|
+
return JSON.stringify(["chronicle", chronicle.episodePath, pairs(chronicle.query), pairs(chronicle.options), safeDecode(chronicle.fragment ?? "")]);
|
|
325
|
+
}
|
|
326
|
+
return JSON.stringify(["other", safeDecode(text)]);
|
|
327
|
+
}
|
|
328
|
+
/** References past this many on one page render unresolved, so one text cannot make a server ask a front without bound. */
|
|
329
|
+
export const DEFAULT_MAX_REFERENCES = 100;
|
|
330
|
+
/**
|
|
331
|
+
* Prepare a markdown text for rendering: fold `{{ … }}` directives into
|
|
332
|
+
* links, optionally link bare mentions, then resolve every distinct reference
|
|
333
|
+
* once (at most `concurrency` at a time, at most `maxReferences` in all) and
|
|
334
|
+
* build its view. A renderer then finds each link's view with `lookupView`,
|
|
335
|
+
* synchronously.
|
|
336
|
+
*/
|
|
337
|
+
export async function prepareReferenceViews(markdown, resolver, options = {}) {
|
|
338
|
+
let text = transformDirectives(markdown);
|
|
339
|
+
if (options.linkBare)
|
|
340
|
+
text = linkBareReferences(text);
|
|
341
|
+
// Keyed and resolved by the destination as written: a wheel reference's
|
|
342
|
+
// `uri` is canonical and drops its options and fragment (#713, V3).
|
|
343
|
+
const byKey = new Map();
|
|
344
|
+
for (const ref of findTextReferences(text)) {
|
|
345
|
+
if (ref.form === "bare" || ref.form === "directive")
|
|
346
|
+
continue;
|
|
347
|
+
const href = ref.href ?? ref.uri;
|
|
348
|
+
const key = referenceKey(href);
|
|
349
|
+
if (!byKey.has(key))
|
|
350
|
+
byKey.set(key, href);
|
|
351
|
+
}
|
|
352
|
+
const views = new Map();
|
|
353
|
+
const limit = options.maxReferences ?? DEFAULT_MAX_REFERENCES;
|
|
354
|
+
const entries = [...byKey.entries()];
|
|
355
|
+
for (const [key, uri] of entries.slice(limit)) {
|
|
356
|
+
const view = viewFromAnswer(uri, null, { base: options.base });
|
|
357
|
+
if (view)
|
|
358
|
+
views.set(key, { ...view, ...(view.kind === "unresolved" ? { reason: `Not resolved: more than ${limit} references on this page` } : {}) });
|
|
359
|
+
}
|
|
360
|
+
const asked = entries.slice(0, limit);
|
|
361
|
+
let next = 0;
|
|
362
|
+
const worker = async () => {
|
|
363
|
+
while (next < asked.length) {
|
|
364
|
+
const [key, uri] = asked[next++];
|
|
365
|
+
let answer = null;
|
|
366
|
+
try {
|
|
367
|
+
answer = await resolver(uri);
|
|
368
|
+
}
|
|
369
|
+
catch {
|
|
370
|
+
answer = null;
|
|
371
|
+
}
|
|
372
|
+
const view = viewFromAnswer(uri, answer, { base: options.base });
|
|
373
|
+
if (view)
|
|
374
|
+
views.set(key, view);
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
await Promise.all(Array.from({ length: Math.min(options.concurrency ?? 6, asked.length) }, worker));
|
|
378
|
+
return { markdown: text, views };
|
|
379
|
+
}
|
|
380
|
+
export { transformDirectives, linkBareReferences, isMiadiChronicleUri, isFoundationUri, isWheelRefUri };
|
|
381
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @miadi/reference-ui/react — the React host of the reference views. The
|
|
3
|
+
* markup is `renderReferenceHtml`'s, element for element (a parity test holds
|
|
4
|
+
* it there), so a page rendered on the server by React and a page rendered as
|
|
5
|
+
* a string look the same.
|
|
6
|
+
*
|
|
7
|
+
* The link element is the host's: pass `LinkComponent` (Next's `Link`) to keep
|
|
8
|
+
* client navigation; the default is a plain `<a>`.
|
|
9
|
+
*/
|
|
10
|
+
import type { ComponentType, ReactNode } from "react";
|
|
11
|
+
import { type ReferenceView } from "./index.js";
|
|
12
|
+
export type LinkLike = ComponentType<{
|
|
13
|
+
href: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
title?: string;
|
|
16
|
+
children?: ReactNode;
|
|
17
|
+
[data: `data-${string}`]: string | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export interface ReferenceProps {
|
|
20
|
+
view: ReferenceView;
|
|
21
|
+
/** The link text the author wrote, used when the reference carries no label. */
|
|
22
|
+
children?: ReactNode;
|
|
23
|
+
LinkComponent?: LinkLike;
|
|
24
|
+
}
|
|
25
|
+
/** One reference: a chip, a card, a wheel page link, or the unresolved chip. */
|
|
26
|
+
export declare function Reference({ view, children, LinkComponent }: ReferenceProps): import("react").JSX.Element;
|
|
27
|
+
/**
|
|
28
|
+
* Find the view for an href as a markdown parser hands it over. `views` is
|
|
29
|
+
* what `prepareReferenceViews` returned, or the same entries as a plain
|
|
30
|
+
* object after crossing from a server component to a client one.
|
|
31
|
+
*/
|
|
32
|
+
export declare function lookupView(views: ReadonlyMap<string, ReferenceView> | Readonly<Record<string, ReferenceView>>, href: string | undefined): ReferenceView | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* A link override for react-markdown (`components={{ a }}`): a reference href
|
|
35
|
+
* with a prepared view renders as a Reference; every other link renders as the
|
|
36
|
+
* plain anchor it was, its attributes intact.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createReferenceLink(views: ReadonlyMap<string, ReferenceView> | Readonly<Record<string, ReferenceView>>, options?: {
|
|
39
|
+
LinkComponent?: LinkLike;
|
|
40
|
+
externalLinksInNewTab?: boolean;
|
|
41
|
+
}): (props: {
|
|
42
|
+
href?: string;
|
|
43
|
+
children?: ReactNode;
|
|
44
|
+
node?: unknown;
|
|
45
|
+
[key: string]: unknown;
|
|
46
|
+
}) => import("react").JSX.Element;
|
|
47
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACrD,OAAO,EAIL,KAAK,aAAa,EACnB,MAAM,YAAY,CAAA;AAEnB,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,CAAC,IAAI,EAAE,QAAQ,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAA;CAC7C,CAAC,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,aAAa,CAAA;IACnB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,aAAa,CAAC,EAAE,QAAQ,CAAA;CACzB;AAQD,gFAAgF;AAChF,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,cAAc,+BA+B1E;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EACnF,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,aAAa,GAAG,SAAS,CAM3B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EACnF,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,QAAQ,CAAC;IAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAAO,IAE7C,OAAO;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,iCASrH"}
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { referenceClasses, referenceKey, referenceParts, } from "./index.js";
|
|
3
|
+
function textOf(children) {
|
|
4
|
+
if (typeof children === "string")
|
|
5
|
+
return children;
|
|
6
|
+
if (Array.isArray(children) && children.every((c) => typeof c === "string"))
|
|
7
|
+
return children.join("");
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
/** One reference: a chip, a card, a wheel page link, or the unresolved chip. */
|
|
11
|
+
export function Reference({ view, children, LinkComponent }) {
|
|
12
|
+
const text = textOf(children);
|
|
13
|
+
const p = referenceParts(view, text);
|
|
14
|
+
// A label that is not plain text (an emphasised link text) is shown as the author wrote it.
|
|
15
|
+
const label = view.label || text !== undefined || children === undefined || children === null ? p.label : children;
|
|
16
|
+
const className = referenceClasses(view);
|
|
17
|
+
const data = { "data-miadi-uri": view.uri, "data-miadi-resolved": view.kind === "unresolved" ? "false" : "true" };
|
|
18
|
+
if (view.kind === "unresolved") {
|
|
19
|
+
return (_jsxs("span", { className: className, title: p.tooltip, ...data, children: [_jsx("span", { className: "mr-ref__badge", children: p.badge }), " ", _jsx("span", { className: "mr-ref__label", children: label }), " ", _jsx("span", { className: "mr-ref__note", children: p.note })] }));
|
|
20
|
+
}
|
|
21
|
+
const Link = LinkComponent ?? ((props) => _jsx("a", { ...props }));
|
|
22
|
+
if (view.show === "card" && view.kind !== "wheel") {
|
|
23
|
+
return (_jsxs(Link, { className: className, href: view.href, title: p.tooltip, ...data, children: [_jsx("span", { className: "mr-ref__badge", children: p.badge }), _jsx("span", { className: "mr-ref__title", children: p.title }), p.meta ? _jsx("span", { className: "mr-ref__meta", children: p.meta }) : null] }));
|
|
24
|
+
}
|
|
25
|
+
return (_jsxs(Link, { className: className, href: view.href, title: p.tooltip, ...data, children: [_jsx("span", { className: "mr-ref__badge", children: p.badge }), " ", _jsx("span", { className: "mr-ref__label", children: label })] }));
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Find the view for an href as a markdown parser hands it over. `views` is
|
|
29
|
+
* what `prepareReferenceViews` returned, or the same entries as a plain
|
|
30
|
+
* object after crossing from a server component to a client one.
|
|
31
|
+
*/
|
|
32
|
+
export function lookupView(views, href) {
|
|
33
|
+
if (!href)
|
|
34
|
+
return undefined;
|
|
35
|
+
const key = referenceKey(href);
|
|
36
|
+
if (views instanceof Map)
|
|
37
|
+
return views.get(key);
|
|
38
|
+
// Own keys only: `constructor` or `__proto__` read from a plain object is not a view (#713, V1).
|
|
39
|
+
return Object.hasOwn(views, key) ? views[key] : undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* A link override for react-markdown (`components={{ a }}`): a reference href
|
|
43
|
+
* with a prepared view renders as a Reference; every other link renders as the
|
|
44
|
+
* plain anchor it was, its attributes intact.
|
|
45
|
+
*/
|
|
46
|
+
export function createReferenceLink(views, options = {}) {
|
|
47
|
+
return function ReferenceLink(props) {
|
|
48
|
+
const { node: _node, ...rest } = props;
|
|
49
|
+
const view = lookupView(views, props.href);
|
|
50
|
+
if (view)
|
|
51
|
+
return _jsx(Reference, { view: view, LinkComponent: options.LinkComponent, children: props.children });
|
|
52
|
+
if (options.externalLinksInNewTab && typeof props.href === "string" && /^https?:\/\//.test(props.href)) {
|
|
53
|
+
return _jsx("a", { ...rest, target: "_blank", rel: "noreferrer" });
|
|
54
|
+
}
|
|
55
|
+
return _jsx("a", { ...rest });
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,77 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miadi/reference-ui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Render Miadi references — miadi-chronicle:<episode>, miadi-foundation:<slug>, miadi-ceremony:<id>, miadi-circle:<id> — as chips and cards in any host. A view model and an HTML renderer with no framework, React components on ./react, and a resolver client for a Miadi front's public /api/chronicle/resolve. It holds no URL or token: the host passes the resolver.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"sideEffects": [
|
|
11
|
+
"**/*.css"
|
|
12
|
+
],
|
|
13
|
+
"style": "./src/reference-ui.css",
|
|
14
|
+
"main": "./dist/index.js",
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js",
|
|
20
|
+
"default": "./dist/index.js"
|
|
21
|
+
},
|
|
22
|
+
"./react": {
|
|
23
|
+
"types": "./dist/react.d.ts",
|
|
24
|
+
"import": "./dist/react.js",
|
|
25
|
+
"default": "./dist/react.js"
|
|
26
|
+
},
|
|
27
|
+
"./styles.css": "./src/reference-ui.css",
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"src",
|
|
33
|
+
"README.md"
|
|
34
|
+
],
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/jgwill/Miadi.git",
|
|
38
|
+
"directory": "packages/reference-ui"
|
|
39
|
+
},
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/jgwill/Miadi/issues"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"miadi",
|
|
48
|
+
"chronicle",
|
|
49
|
+
"foundation",
|
|
50
|
+
"hypermedia",
|
|
51
|
+
"uri",
|
|
52
|
+
"react"
|
|
53
|
+
],
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@miadi/inquiry-weave": "^0.16.1"
|
|
56
|
+
},
|
|
57
|
+
"peerDependencies": {
|
|
58
|
+
"react": ">=18"
|
|
59
|
+
},
|
|
60
|
+
"peerDependenciesMeta": {
|
|
61
|
+
"react": {
|
|
62
|
+
"optional": true
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"devDependencies": {
|
|
66
|
+
"@types/react": "^19",
|
|
67
|
+
"@types/react-dom": "^19",
|
|
68
|
+
"react": "^19",
|
|
69
|
+
"react-dom": "^19",
|
|
70
|
+
"typescript": "^5.4.0"
|
|
71
|
+
},
|
|
72
|
+
"scripts": {
|
|
73
|
+
"build": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && ../../node_modules/.bin/tsc -p tsconfig.build.json",
|
|
74
|
+
"type-check": "../../node_modules/.bin/tsc -p tsconfig.build.json --noEmit",
|
|
75
|
+
"test": "npm run build && node --test test/*.test.mjs"
|
|
76
|
+
}
|
|
6
77
|
}
|