@miadi/chronicle-tui 0.3.0 → 0.4.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 +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 +60 -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 +117 -23
- 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 +44 -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 +4 -3
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,6 +101,9 @@ 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 ")}`;
|
|
104
109
|
// A circle's id already begins with `circle:`; the chip says it once.
|
|
@@ -114,27 +119,34 @@ function lineSegments(line, refs, lineStart, style) {
|
|
|
114
119
|
return;
|
|
115
120
|
const from = ref.start - lineStart;
|
|
116
121
|
if (from > at)
|
|
117
|
-
segments.push({ text: line.slice(at, from), style });
|
|
122
|
+
segments.push({ text: clean(line.slice(at, from)), style });
|
|
118
123
|
segments.push({ text: chipText(ref), style: "ref", ref: index });
|
|
119
124
|
at = ref.end - lineStart;
|
|
120
125
|
});
|
|
121
126
|
if (at < line.length || segments.length === 0)
|
|
122
|
-
segments.push({ text: line.slice(at), style });
|
|
127
|
+
segments.push({ text: clean(line.slice(at)), style });
|
|
123
128
|
return segments;
|
|
124
129
|
}
|
|
125
|
-
|
|
130
|
+
const graphemeSegmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
|
|
131
|
+
/**
|
|
132
|
+
* Cut segments into screen lines no wider than `width` columns, breaking at
|
|
133
|
+
* spaces where it can. Each word is measured once and a word longer than a
|
|
134
|
+
* line is cut by grapheme, so the cost is linear in the text and an emoji or
|
|
135
|
+
* a combining mark is never split (0.3.0 measured the whole remaining line for
|
|
136
|
+
* every piece: 13 s for one 500 KB line).
|
|
137
|
+
*/
|
|
126
138
|
export function wrapSegments(segments, width) {
|
|
127
139
|
const limit = Math.max(8, width);
|
|
128
140
|
const lines = [[]];
|
|
129
141
|
let used = 0;
|
|
130
|
-
const
|
|
142
|
+
const append = (text, segment, w) => {
|
|
131
143
|
const last = lines[lines.length - 1];
|
|
132
144
|
const prev = last[last.length - 1];
|
|
133
145
|
if (prev && prev.style === segment.style && prev.ref === segment.ref)
|
|
134
|
-
prev.text +=
|
|
146
|
+
prev.text += text;
|
|
135
147
|
else
|
|
136
|
-
last.push({ ...segment });
|
|
137
|
-
used +=
|
|
148
|
+
last.push({ ...segment, text });
|
|
149
|
+
used += w;
|
|
138
150
|
};
|
|
139
151
|
const newline = () => {
|
|
140
152
|
lines.push([]);
|
|
@@ -143,33 +155,28 @@ export function wrapSegments(segments, width) {
|
|
|
143
155
|
for (const segment of segments) {
|
|
144
156
|
if (segment.style === "ref") {
|
|
145
157
|
// A chip is never split.
|
|
146
|
-
|
|
158
|
+
const w = stringWidth(segment.text);
|
|
159
|
+
if (used > 0 && used + w > limit)
|
|
147
160
|
newline();
|
|
148
|
-
|
|
161
|
+
append(segment.text, segment, w);
|
|
149
162
|
continue;
|
|
150
163
|
}
|
|
151
164
|
for (const word of segment.text.split(/(?<= )/)) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
165
|
+
const w = stringWidth(word);
|
|
166
|
+
if (used + w <= limit) {
|
|
167
|
+
append(word, segment, w);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (w <= limit) {
|
|
171
|
+
newline();
|
|
172
|
+
append(word, segment, w);
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
for (const { segment: grapheme } of graphemeSegmenter.segment(word)) {
|
|
176
|
+
const gw = stringWidth(grapheme);
|
|
177
|
+
if (used > 0 && used + gw > limit)
|
|
161
178
|
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
|
-
}
|
|
179
|
+
append(grapheme, segment, gw);
|
|
173
180
|
}
|
|
174
181
|
}
|
|
175
182
|
}
|
|
@@ -188,7 +195,9 @@ export function fileView(content, width) {
|
|
|
188
195
|
if (fenceLine)
|
|
189
196
|
fence = !fence;
|
|
190
197
|
for (const segments of wrapSegments(lineSegments(line, refs, offset, style), width)) {
|
|
191
|
-
|
|
198
|
+
// An empty line still takes a row, or paragraphs run together.
|
|
199
|
+
const empty = segments.every((segment) => segment.text.length === 0);
|
|
200
|
+
lines.push({ segments: empty ? [{ text: " ", style }] : segments, source: index + 1 });
|
|
192
201
|
}
|
|
193
202
|
offset += raw.length + 1;
|
|
194
203
|
});
|
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.0",
|
|
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/
|
|
48
|
+
"@miadi/attention-core": "0.1.1",
|
|
49
|
+
"@miadi/episode-vessel": "0.2.1",
|
|
49
50
|
"@miadi/episodic-memory-schema": "0.11.1",
|
|
50
|
-
"@miadi/inquiry-weave": "0.15.
|
|
51
|
+
"@miadi/inquiry-weave": "0.15.1",
|
|
51
52
|
"ink": "^7.1.1",
|
|
52
53
|
"react": "^19.3.0",
|
|
53
54
|
"string-width": "^8.3.0",
|