@miadi/chronicle-tui 0.3.0 → 0.4.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/README.md +41 -21
- package/dist/App.d.ts +14 -5
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +595 -321
- package/dist/App.js.map +1 -1
- package/dist/actions.d.ts +31 -21
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +62 -44
- package/dist/actions.js.map +1 -1
- package/dist/api.d.ts +58 -30
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +129 -44
- package/dist/api.js.map +1 -1
- package/dist/attention.d.ts +50 -0
- package/dist/attention.d.ts.map +1 -0
- package/dist/attention.js +69 -0
- package/dist/attention.js.map +1 -0
- package/dist/bin.d.ts +2 -1
- package/dist/bin.d.ts.map +1 -1
- package/dist/bin.js +19 -11
- package/dist/bin.js.map +1 -1
- package/dist/data.d.ts +48 -12
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +124 -24
- package/dist/data.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/model.d.ts +10 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +47 -35
- package/dist/model.js.map +1 -1
- package/dist/text.d.ts +23 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +57 -0
- package/dist/text.js.map +1 -0
- package/package.json +5 -4
package/dist/model.js
CHANGED
|
@@ -5,17 +5,19 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import stringWidth from "string-width";
|
|
7
7
|
import { findTextReferences, readEpisode } from "@miadi/inquiry-weave";
|
|
8
|
-
|
|
8
|
+
import { clean, cleanLine } from "./text.js";
|
|
9
|
+
export function toRow(entry, audience = "public") {
|
|
9
10
|
return {
|
|
10
11
|
name: entry.name,
|
|
11
12
|
number: entry.number,
|
|
12
13
|
date: entry.date,
|
|
13
|
-
title: entry.title ?? entry.slug ?? entry.name,
|
|
14
|
-
slug: entry.slug,
|
|
15
|
-
type: entry.type,
|
|
16
|
-
status: entry.status,
|
|
14
|
+
title: cleanLine(entry.title ?? entry.slug ?? entry.name),
|
|
15
|
+
slug: entry.slug === undefined ? undefined : cleanLine(entry.slug),
|
|
16
|
+
type: entry.type === undefined ? undefined : cleanLine(entry.type),
|
|
17
|
+
status: entry.status === undefined ? undefined : cleanLine(entry.status),
|
|
17
18
|
structured: Boolean(entry.structured),
|
|
18
19
|
readings: readEpisode(entry),
|
|
20
|
+
audience,
|
|
19
21
|
};
|
|
20
22
|
}
|
|
21
23
|
/** Newest first; folders without a number last, by name. */
|
|
@@ -99,8 +101,14 @@ export function clamp(value, count) {
|
|
|
99
101
|
const shortId = (id) => (id.length > 22 ? `${id.slice(0, 20)}…` : id);
|
|
100
102
|
/** The words a chip shows: the author's label, or what the reference names. */
|
|
101
103
|
export function chipText(ref) {
|
|
104
|
+
return cleanLine(rawChipText(ref));
|
|
105
|
+
}
|
|
106
|
+
function rawChipText(ref) {
|
|
102
107
|
if (ref.kind === "chronicle")
|
|
103
108
|
return `↗ ${ref.label ?? ref.uri.replace(/^miadi-chronicle:(\/\/)?/i, "ep ")}`;
|
|
109
|
+
// A foundation packet (SPEC §10): the slug, and the file when one is named.
|
|
110
|
+
if (ref.kind === "foundation")
|
|
111
|
+
return `◇ ${ref.label ?? ref.uri.replace(/^miadi-foundation:(\/\/)?/i, "").replace(/[?#].*$/, "")}`;
|
|
104
112
|
// A circle's id already begins with `circle:`; the chip says it once.
|
|
105
113
|
const id = ref.uri.replace(/^miadi-(ceremony|circle):/i, "").replace(/^(ceremony|circle):/i, "");
|
|
106
114
|
const mark = ref.kind === "ceremony" ? "◆" : "○";
|
|
@@ -114,27 +122,34 @@ function lineSegments(line, refs, lineStart, style) {
|
|
|
114
122
|
return;
|
|
115
123
|
const from = ref.start - lineStart;
|
|
116
124
|
if (from > at)
|
|
117
|
-
segments.push({ text: line.slice(at, from), style });
|
|
125
|
+
segments.push({ text: clean(line.slice(at, from)), style });
|
|
118
126
|
segments.push({ text: chipText(ref), style: "ref", ref: index });
|
|
119
127
|
at = ref.end - lineStart;
|
|
120
128
|
});
|
|
121
129
|
if (at < line.length || segments.length === 0)
|
|
122
|
-
segments.push({ text: line.slice(at), style });
|
|
130
|
+
segments.push({ text: clean(line.slice(at)), style });
|
|
123
131
|
return segments;
|
|
124
132
|
}
|
|
125
|
-
|
|
133
|
+
const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
134
|
+
/**
|
|
135
|
+
* Cut segments into screen lines no wider than `width` columns, breaking at
|
|
136
|
+
* spaces where it can. Each word is measured once and a word longer than a
|
|
137
|
+
* line is cut by grapheme, so the cost is linear in the text and an emoji or
|
|
138
|
+
* a combining mark is never split (0.3.0 measured the whole remaining line for
|
|
139
|
+
* every piece: 13 s for one 500 KB line).
|
|
140
|
+
*/
|
|
126
141
|
export function wrapSegments(segments, width) {
|
|
127
142
|
const limit = Math.max(8, width);
|
|
128
143
|
const lines = [[]];
|
|
129
144
|
let used = 0;
|
|
130
|
-
const
|
|
145
|
+
const append = (text, segment, w) => {
|
|
131
146
|
const last = lines[lines.length - 1];
|
|
132
147
|
const prev = last[last.length - 1];
|
|
133
148
|
if (prev && prev.style === segment.style && prev.ref === segment.ref)
|
|
134
|
-
prev.text +=
|
|
149
|
+
prev.text += text;
|
|
135
150
|
else
|
|
136
|
-
last.push({ ...segment });
|
|
137
|
-
used +=
|
|
151
|
+
last.push({ ...segment, text });
|
|
152
|
+
used += w;
|
|
138
153
|
};
|
|
139
154
|
const newline = () => {
|
|
140
155
|
lines.push([]);
|
|
@@ -143,33 +158,28 @@ export function wrapSegments(segments, width) {
|
|
|
143
158
|
for (const segment of segments) {
|
|
144
159
|
if (segment.style === "ref") {
|
|
145
160
|
// A chip is never split.
|
|
146
|
-
|
|
161
|
+
const w = stringWidth(segment.text);
|
|
162
|
+
if (used > 0 && used + w > limit)
|
|
147
163
|
newline();
|
|
148
|
-
|
|
164
|
+
append(segment.text, segment, w);
|
|
149
165
|
continue;
|
|
150
166
|
}
|
|
151
167
|
for (const word of segment.text.split(/(?<= )/)) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
168
|
+
const w = stringWidth(word);
|
|
169
|
+
if (used + w <= limit) {
|
|
170
|
+
append(word, segment, w);
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
if (w <= limit) {
|
|
174
|
+
newline();
|
|
175
|
+
append(word, segment, w);
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
for (const { segment: grapheme } of graphemeSegmenter.segment(word)) {
|
|
179
|
+
const gw = stringWidth(grapheme);
|
|
180
|
+
if (used > 0 && used + gw > limit)
|
|
161
181
|
newline();
|
|
162
|
-
|
|
163
|
-
else {
|
|
164
|
-
// A word longer than a whole line is cut where the line ends.
|
|
165
|
-
let cut = 0;
|
|
166
|
-
while (cut < rest.length && stringWidth(rest.slice(0, cut + 1)) <= room)
|
|
167
|
-
cut++;
|
|
168
|
-
push({ ...segment, text: rest.slice(0, Math.max(1, cut)) });
|
|
169
|
-
rest = rest.slice(Math.max(1, cut));
|
|
170
|
-
if (rest)
|
|
171
|
-
newline();
|
|
172
|
-
}
|
|
182
|
+
append(grapheme, segment, gw);
|
|
173
183
|
}
|
|
174
184
|
}
|
|
175
185
|
}
|
|
@@ -188,7 +198,9 @@ export function fileView(content, width) {
|
|
|
188
198
|
if (fenceLine)
|
|
189
199
|
fence = !fence;
|
|
190
200
|
for (const segments of wrapSegments(lineSegments(line, refs, offset, style), width)) {
|
|
191
|
-
|
|
201
|
+
// An empty line still takes a row, or paragraphs run together.
|
|
202
|
+
const empty = segments.every((segment) => segment.text.length === 0);
|
|
203
|
+
lines.push({ segments: empty ? [{ text: " ", style }] : segments, source: index + 1 });
|
|
192
204
|
}
|
|
193
205
|
offset += raw.length + 1;
|
|
194
206
|
});
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,WAAW,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAA4C,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"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"}
|
package/dist/text.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the browser prints passes through here first.
|
|
3
|
+
*
|
|
4
|
+
* Chronicle files, titles, file names, attention questions, ceremony
|
|
5
|
+
* intentions and server messages are written by many agents and people, so
|
|
6
|
+
* none of it is trusted to reach a terminal as it is: an escape sequence in a
|
|
7
|
+
* file planted its own hyperlink, hid text, or rewrote a line in 0.3.0
|
|
8
|
+
* (jgwill/Miadi#706 security review, F2). This module removes terminal control
|
|
9
|
+
* sequences and controls, expands tabs (a terminal moves to the next stop, a
|
|
10
|
+
* width measure counts nothing), and decides which URLs may become links.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TAB_WIDTH = 4;
|
|
13
|
+
/** Text as a terminal may print it: no control sequence, no control, no bidi override, tabs expanded. */
|
|
14
|
+
export declare function clean(text: string, tabWidth?: number): string;
|
|
15
|
+
/** One line of text for a single-line slot: newlines become spaces. */
|
|
16
|
+
export declare function cleanLine(text: string): string;
|
|
17
|
+
/** Tabs to spaces, up to the next stop, line by line. */
|
|
18
|
+
export declare function expandTabs(text: string, tabWidth?: number): string;
|
|
19
|
+
/** A URL that may be printed as a link and handed to an opener: http(s) or file, no control, no space. */
|
|
20
|
+
export declare function isSafeUrl(url: string): boolean;
|
|
21
|
+
/** A clickable link where the URL is safe; otherwise the clean label alone. */
|
|
22
|
+
export declare function link(url: string, label?: string): string;
|
|
23
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,eAAO,MAAM,SAAS,IAAI,CAAA;AAS1B,yGAAyG;AACzG,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,MAAM,CAGhE;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,yDAAyD;AACzD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,MAAM,CAarE;AAED,0GAA0G;AAC1G,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAG9C;AAED,+EAA+E;AAC/E,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,GAAE,MAAY,GAAG,MAAM,CAG7D"}
|
package/dist/text.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Everything the browser prints passes through here first.
|
|
3
|
+
*
|
|
4
|
+
* Chronicle files, titles, file names, attention questions, ceremony
|
|
5
|
+
* intentions and server messages are written by many agents and people, so
|
|
6
|
+
* none of it is trusted to reach a terminal as it is: an escape sequence in a
|
|
7
|
+
* file planted its own hyperlink, hid text, or rewrote a line in 0.3.0
|
|
8
|
+
* (jgwill/Miadi#706 security review, F2). This module removes terminal control
|
|
9
|
+
* sequences and controls, expands tabs (a terminal moves to the next stop, a
|
|
10
|
+
* width measure counts nothing), and decides which URLs may become links.
|
|
11
|
+
*/
|
|
12
|
+
import { osc8 } from "@miadi/inquiry-weave";
|
|
13
|
+
export const TAB_WIDTH = 4;
|
|
14
|
+
// ESC sequences: CSI (incl. SGR), OSC (to BEL or ST), DCS/SOS/PM/APC (to ST), and two-byte ESC forms.
|
|
15
|
+
const ESCAPE_SEQUENCE = /\u001b\[[0-?]*[ -/]*[@-~]|\u001b\][\s\S]*?(?:\u0007|\u001b\\|$)|\u001b[PX^_][\s\S]*?(?:\u001b\\|$)|\u001b[ -/]*[0-~]/g;
|
|
16
|
+
// What is left: C0 except tab and newline, DEL, C1 (incl. 8-bit CSI/OSC), and bidi overrides and isolates.
|
|
17
|
+
const CONTROL = /[\u0000-\u0008\u000b-\u001f\u007f-\u009f]/g;
|
|
18
|
+
const BIDI = /[--]/g;
|
|
19
|
+
/** Text as a terminal may print it: no control sequence, no control, no bidi override, tabs expanded. */
|
|
20
|
+
export function clean(text, tabWidth = TAB_WIDTH) {
|
|
21
|
+
const stripped = text.replace(ESCAPE_SEQUENCE, "").replace(/\r/g, "").replace(BIDI, "");
|
|
22
|
+
return expandTabs(stripped, tabWidth).replace(CONTROL, "�");
|
|
23
|
+
}
|
|
24
|
+
/** One line of text for a single-line slot: newlines become spaces. */
|
|
25
|
+
export function cleanLine(text) {
|
|
26
|
+
return clean(text).replace(/\n+/g, " ");
|
|
27
|
+
}
|
|
28
|
+
/** Tabs to spaces, up to the next stop, line by line. */
|
|
29
|
+
export function expandTabs(text, tabWidth = TAB_WIDTH) {
|
|
30
|
+
if (!text.includes("\t"))
|
|
31
|
+
return text;
|
|
32
|
+
return text
|
|
33
|
+
.split("\n")
|
|
34
|
+
.map((line) => {
|
|
35
|
+
let out = "";
|
|
36
|
+
for (const char of line) {
|
|
37
|
+
if (char === "\t")
|
|
38
|
+
out += " ".repeat(tabWidth - (out.length % tabWidth));
|
|
39
|
+
else
|
|
40
|
+
out += char;
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
})
|
|
44
|
+
.join("\n");
|
|
45
|
+
}
|
|
46
|
+
/** A URL that may be printed as a link and handed to an opener: http(s) or file, no control, no space. */
|
|
47
|
+
export function isSafeUrl(url) {
|
|
48
|
+
if (/[\u0000- \u007f-\u009f]/.test(url))
|
|
49
|
+
return false;
|
|
50
|
+
return /^(https?|file):\/\//i.test(url);
|
|
51
|
+
}
|
|
52
|
+
/** A clickable link where the URL is safe; otherwise the clean label alone. */
|
|
53
|
+
export function link(url, label = url) {
|
|
54
|
+
const shown = cleanLine(label);
|
|
55
|
+
return isSafeUrl(url) ? osc8(url, shown) : shown;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=text.js.map
|
package/dist/text.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.js","sourceRoot":"","sources":["../src/text.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAE3C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAA;AAE1B,sGAAsG;AACtG,MAAM,eAAe,GACnB,uHAAuH,CAAA;AACzH,2GAA2G;AAC3G,MAAM,OAAO,GAAG,4CAA4C,CAAA;AAC5D,MAAM,IAAI,GAAG,WAAW,CAAA;AAExB,yGAAyG;AACzG,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,QAAQ,GAAG,SAAS;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IACvF,OAAO,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;AAC7D,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;AACzC,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAQ,GAAG,SAAS;IAC3D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,IAAI,KAAK,IAAI;gBAAE,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAA;;gBACnE,GAAG,IAAI,IAAI,CAAA;QAClB,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;AACf,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACrD,OAAO,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACzC,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,QAAgB,GAAG;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;IAC9B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;AAClD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@miadi/chronicle-tui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "Browse the Miadi Chronicle from a terminal: list and filter every episode, search their text, read a vessel's files with their chronicle, ceremony and circle references as chips, and open the room, the wheel or the vessel as clickable links or a QR code. Every operation is an action in one registry, so writes join the same list later.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -45,9 +45,10 @@
|
|
|
45
45
|
"url": "https://github.com/jgwill/Miadi/issues"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@miadi/
|
|
49
|
-
"@miadi/
|
|
50
|
-
"@miadi/
|
|
48
|
+
"@miadi/attention-core": "0.1.1",
|
|
49
|
+
"@miadi/episode-vessel": "0.2.1",
|
|
50
|
+
"@miadi/episodic-memory-schema": "0.12.0",
|
|
51
|
+
"@miadi/inquiry-weave": "0.16.0",
|
|
51
52
|
"ink": "^7.1.1",
|
|
52
53
|
"react": "^19.3.0",
|
|
53
54
|
"string-width": "^8.3.0",
|