@profullstack/readm3 0.2.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.
Files changed (49) hide show
  1. package/README.md +222 -13
  2. package/dist/cli.d.ts +5 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +52 -6
  5. package/dist/cli.js.map +1 -1
  6. package/dist/cloud-cli.d.ts +4 -0
  7. package/dist/cloud-cli.d.ts.map +1 -0
  8. package/dist/cloud-cli.js +192 -0
  9. package/dist/cloud-cli.js.map +1 -0
  10. package/dist/cloud-client.d.ts +14 -0
  11. package/dist/cloud-client.d.ts.map +1 -0
  12. package/dist/cloud-client.js +62 -0
  13. package/dist/cloud-client.js.map +1 -0
  14. package/dist/editor.d.ts +77 -0
  15. package/dist/editor.d.ts.map +1 -0
  16. package/dist/editor.js +308 -0
  17. package/dist/editor.js.map +1 -0
  18. package/dist/emoji.d.ts +12 -0
  19. package/dist/emoji.d.ts.map +1 -0
  20. package/dist/emoji.js +73 -0
  21. package/dist/emoji.js.map +1 -0
  22. package/dist/flavors.d.ts +68 -0
  23. package/dist/flavors.d.ts.map +1 -0
  24. package/dist/flavors.js +223 -0
  25. package/dist/flavors.js.map +1 -0
  26. package/dist/index.d.ts +10 -5
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +7 -4
  29. package/dist/index.js.map +1 -1
  30. package/dist/markdown.d.ts +12 -3
  31. package/dist/markdown.d.ts.map +1 -1
  32. package/dist/markdown.js +424 -379
  33. package/dist/markdown.js.map +1 -1
  34. package/dist/mcp.d.ts +2 -0
  35. package/dist/mcp.d.ts.map +1 -0
  36. package/dist/mcp.js +301 -0
  37. package/dist/mcp.js.map +1 -0
  38. package/dist/print.d.ts +3 -3
  39. package/dist/print.d.ts.map +1 -1
  40. package/dist/print.js +8 -3
  41. package/dist/print.js.map +1 -1
  42. package/dist/roles.d.ts.map +1 -1
  43. package/dist/roles.js +17 -0
  44. package/dist/roles.js.map +1 -1
  45. package/dist/viewer.d.ts +5 -0
  46. package/dist/viewer.d.ts.map +1 -1
  47. package/dist/viewer.js +375 -60
  48. package/dist/viewer.js.map +1 -1
  49. package/package.json +18 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-cli.js","sourceRoot":"","sources":["../src/cloud-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface CloudConfig {
2
+ url: string;
3
+ token?: string;
4
+ }
5
+ export declare function cloudConfig(): CloudConfig;
6
+ export declare function saveCloudConfig(config: CloudConfig): void;
7
+ export declare function clearCloudConfig(): void;
8
+ export declare function cloudRequest<T = unknown>(path: string, method?: string, body?: unknown, config?: CloudConfig): Promise<T>;
9
+ export declare function cloudAction<T = unknown>(operation: string, args?: Record<string, unknown>, config?: CloudConfig): Promise<T>;
10
+ export declare function sharedLocation(value: string): {
11
+ token: string;
12
+ config: CloudConfig;
13
+ };
14
+ //# sourceMappingURL=cloud-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,wBAAgB,WAAW,IAAI,WAAW,CAoBzC;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,QAKlD;AACD,wBAAgB,gBAAgB,SAG/B;AACD,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,MAAM,EACZ,MAAM,SAAQ,EACd,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,cAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAcZ;AACD,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,MAAM,cAAgB,GACrB,OAAO,CAAC,CAAC,CAAC,CAMZ;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;CACrB,CAMA"}
@@ -0,0 +1,62 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, chmodSync, existsSync, unlinkSync, } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ const configDir = () => join(process.env.XDG_CONFIG_HOME || join(homedir(), ".config"), "readm3");
5
+ export function cloudConfig() {
6
+ let saved = {};
7
+ try {
8
+ saved = JSON.parse(readFileSync(join(configDir(), "cloud.json"), "utf8"));
9
+ }
10
+ catch {
11
+ /* Environment-only use is supported. */
12
+ }
13
+ const url = (process.env.READM3_URL ||
14
+ saved.url ||
15
+ "https://readm3.com").replace(/\/$/, "");
16
+ const parsed = new URL(url);
17
+ if (!["http:", "https:"].includes(parsed.protocol) ||
18
+ parsed.username ||
19
+ parsed.password)
20
+ throw new Error("READM3_URL must be an HTTP(S) origin.");
21
+ return { url: parsed.origin, token: process.env.READM3_TOKEN || saved.token };
22
+ }
23
+ export function saveCloudConfig(config) {
24
+ mkdirSync(configDir(), { recursive: true, mode: 0o700 });
25
+ const path = join(configDir(), "cloud.json");
26
+ writeFileSync(path, JSON.stringify(config) + "\n", { mode: 0o600 });
27
+ chmodSync(path, 0o600);
28
+ }
29
+ export function clearCloudConfig() {
30
+ const path = join(configDir(), "cloud.json");
31
+ if (existsSync(path))
32
+ unlinkSync(path);
33
+ }
34
+ export async function cloudRequest(path, method = "GET", body, config = cloudConfig()) {
35
+ const response = await fetch(`${config.url}/api/v1/${path}`, {
36
+ method,
37
+ headers: {
38
+ ...(config.token ? { authorization: `Bearer ${config.token}` } : {}),
39
+ ...(body === undefined ? {} : { "content-type": "application/json" }),
40
+ },
41
+ body: body === undefined ? undefined : JSON.stringify(body),
42
+ signal: AbortSignal.timeout(30000),
43
+ redirect: "error",
44
+ });
45
+ const value = (await response.json());
46
+ if (!response.ok)
47
+ throw new Error(value.error || `HTTP ${response.status}`);
48
+ return value;
49
+ }
50
+ export async function cloudAction(operation, args = {}, config = cloudConfig()) {
51
+ if (!config.token)
52
+ throw new Error("Sign in at readm3.com/admin, create an API token, and run readm3 login --token-stdin (or set READM3_TOKEN).");
53
+ return cloudRequest("actions", "POST", { operation, args }, config);
54
+ }
55
+ export function sharedLocation(value) {
56
+ const url = new URL(value);
57
+ const match = url.pathname.match(/^\/s\/([\w-]{43})$/);
58
+ if (!match || !["https:", "http:"].includes(url.protocol))
59
+ throw new Error("Use a readm3 shared document URL.");
60
+ return { token: match[1], config: { url: url.origin } };
61
+ }
62
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * The edit buffer: lines, a caret, and undo.
3
+ *
4
+ * Nothing here touches a terminal. The viewer owns the keys and the drawing;
5
+ * this owns what the text is, which is the part worth testing โ€” the same split
6
+ * `markdown.ts` makes between parsing and painting.
7
+ *
8
+ * Functions mutate the state they are given and return it. A buffer is a few
9
+ * thousand lines at most, but copying the array on every keystroke to look
10
+ * functional would buy nothing a snapshot in `undo` does not already give.
11
+ */
12
+ /** What the last edit was, so a run of typing collapses into one undo step. */
13
+ export type EditKind = "none" | "insert" | "delete" | "newline" | "other";
14
+ export interface Snapshot {
15
+ lines: string[];
16
+ row: number;
17
+ col: number;
18
+ }
19
+ export interface Editor {
20
+ lines: string[];
21
+ row: number;
22
+ col: number;
23
+ /** Column to aim for on vertical motion, so crossing a short line keeps place. */
24
+ goal: number;
25
+ dirty: boolean;
26
+ undo: Snapshot[];
27
+ redo: Snapshot[];
28
+ last: EditKind;
29
+ }
30
+ export declare function createEditor(source: string): Editor;
31
+ /** The buffer as one string. Round-trips whatever `createEditor` was given. */
32
+ export declare function text(ed: Editor): string;
33
+ export declare function lineAt(ed: Editor, row: number): string;
34
+ /** Break the current undo run, so the next edit starts a new step. */
35
+ export declare function breakRun(ed: Editor): Editor;
36
+ export declare function undo(ed: Editor): Editor;
37
+ export declare function redo(ed: Editor): Editor;
38
+ export declare function moveLeft(ed: Editor): Editor;
39
+ export declare function moveRight(ed: Editor): Editor;
40
+ /** Vertical motion aims at `goal`, so a short line in the way is passed over. */
41
+ export declare function moveVertical(ed: Editor, delta: number): Editor;
42
+ export declare const moveUp: (ed: Editor) => Editor;
43
+ export declare const moveDown: (ed: Editor) => Editor;
44
+ /** Home, but to the first non-blank first โ€” the second press goes to column 0. */
45
+ export declare function moveHome(ed: Editor): Editor;
46
+ export declare function moveEnd(ed: Editor): Editor;
47
+ export declare function moveDocStart(ed: Editor): Editor;
48
+ export declare function moveDocEnd(ed: Editor): Editor;
49
+ export declare function moveWordLeft(ed: Editor): Editor;
50
+ export declare function moveWordRight(ed: Editor): Editor;
51
+ /** Insert text at the caret. Newlines in it split lines, so paste works. */
52
+ export declare function insert(ed: Editor, str: string): Editor;
53
+ /**
54
+ * The prefix a new line should inherit: the indent, and the list marker when
55
+ * the caret is leaving one.
56
+ *
57
+ * Returns `null` for an item that has no content, which is the signal to clear
58
+ * it instead โ€” pressing enter twice is how a list ends.
59
+ */
60
+ export declare function continuation(line: string): {
61
+ prefix: string;
62
+ clear: boolean;
63
+ };
64
+ /** Split the line at the caret, carrying indentation and list markers over. */
65
+ export declare function newline(ed: Editor): Editor;
66
+ export declare function backspace(ed: Editor): Editor;
67
+ /** Delete forward. Joins the next line when the caret is at the end. */
68
+ export declare function del(ed: Editor): Editor;
69
+ /** Delete to the end of the line, or join the next when already there. */
70
+ export declare function killToLineEnd(ed: Editor): Editor;
71
+ /** Delete from the caret back to the start of the line's text. */
72
+ export declare function killToLineStart(ed: Editor): Editor;
73
+ /** Two spaces, the indent the renderer reads back as one list level. */
74
+ export declare function indent(ed: Editor): Editor;
75
+ /** Mark the buffer as matching what is on disk. */
76
+ export declare function markSaved(ed: Editor): Editor;
77
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
package/dist/editor.js ADDED
@@ -0,0 +1,308 @@
1
+ /**
2
+ * The edit buffer: lines, a caret, and undo.
3
+ *
4
+ * Nothing here touches a terminal. The viewer owns the keys and the drawing;
5
+ * this owns what the text is, which is the part worth testing โ€” the same split
6
+ * `markdown.ts` makes between parsing and painting.
7
+ *
8
+ * Functions mutate the state they are given and return it. A buffer is a few
9
+ * thousand lines at most, but copying the array on every keystroke to look
10
+ * functional would buy nothing a snapshot in `undo` does not already give.
11
+ */
12
+ /** Undo steps kept. Beyond this the oldest are dropped. */
13
+ const MAX_UNDO = 250;
14
+ /** A list item's shape, for continuing it on the next line. */
15
+ const ITEM = /^(\s*)(?:([-*+])|(\d+)([.)]))(\s+)(\[[ xX]\][ \t]+)?/;
16
+ const clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n));
17
+ export function createEditor(source) {
18
+ return {
19
+ lines: source.split("\n"),
20
+ row: 0,
21
+ col: 0,
22
+ goal: 0,
23
+ dirty: false,
24
+ undo: [],
25
+ redo: [],
26
+ last: "none",
27
+ };
28
+ }
29
+ /** The buffer as one string. Round-trips whatever `createEditor` was given. */
30
+ export function text(ed) {
31
+ return ed.lines.join("\n");
32
+ }
33
+ export function lineAt(ed, row) {
34
+ return ed.lines[row] ?? "";
35
+ }
36
+ function current(ed) {
37
+ return lineAt(ed, ed.row);
38
+ }
39
+ /** Put the caret somewhere legal, and remember the column it was aiming for. */
40
+ function settle(ed, keepGoal = false) {
41
+ ed.row = clamp(ed.row, 0, Math.max(0, ed.lines.length - 1));
42
+ ed.col = clamp(ed.col, 0, current(ed).length);
43
+ if (!keepGoal)
44
+ ed.goal = ed.col;
45
+ return ed;
46
+ }
47
+ /* ------------------------------------------------------------------ undo --- */
48
+ function snapshot(ed) {
49
+ return { lines: [...ed.lines], row: ed.row, col: ed.col };
50
+ }
51
+ /**
52
+ * Record the state before an edit.
53
+ *
54
+ * Consecutive edits of the same kind share one step, so undo walks back a word
55
+ * or a run of typing rather than a character.
56
+ */
57
+ function checkpoint(ed, kind) {
58
+ ed.redo.length = 0;
59
+ if (kind !== ed.last || kind === "newline" || kind === "other") {
60
+ ed.undo.push(snapshot(ed));
61
+ if (ed.undo.length > MAX_UNDO)
62
+ ed.undo.shift();
63
+ }
64
+ ed.last = kind;
65
+ ed.dirty = true;
66
+ }
67
+ /** Break the current undo run, so the next edit starts a new step. */
68
+ export function breakRun(ed) {
69
+ ed.last = "none";
70
+ return ed;
71
+ }
72
+ export function undo(ed) {
73
+ const step = ed.undo.pop();
74
+ if (!step)
75
+ return ed;
76
+ ed.redo.push(snapshot(ed));
77
+ ed.lines = step.lines;
78
+ ed.row = step.row;
79
+ ed.col = step.col;
80
+ ed.dirty = true;
81
+ ed.last = "none";
82
+ return settle(ed);
83
+ }
84
+ export function redo(ed) {
85
+ const step = ed.redo.pop();
86
+ if (!step)
87
+ return ed;
88
+ ed.undo.push(snapshot(ed));
89
+ ed.lines = step.lines;
90
+ ed.row = step.row;
91
+ ed.col = step.col;
92
+ ed.dirty = true;
93
+ ed.last = "none";
94
+ return settle(ed);
95
+ }
96
+ /* --------------------------------------------------------------- motions --- */
97
+ export function moveLeft(ed) {
98
+ if (ed.col > 0)
99
+ ed.col--;
100
+ else if (ed.row > 0) {
101
+ ed.row--;
102
+ ed.col = current(ed).length;
103
+ }
104
+ ed.last = "none";
105
+ return settle(ed);
106
+ }
107
+ export function moveRight(ed) {
108
+ if (ed.col < current(ed).length)
109
+ ed.col++;
110
+ else if (ed.row < ed.lines.length - 1) {
111
+ ed.row++;
112
+ ed.col = 0;
113
+ }
114
+ ed.last = "none";
115
+ return settle(ed);
116
+ }
117
+ /** Vertical motion aims at `goal`, so a short line in the way is passed over. */
118
+ export function moveVertical(ed, delta) {
119
+ ed.row = clamp(ed.row + delta, 0, Math.max(0, ed.lines.length - 1));
120
+ ed.col = Math.min(ed.goal, current(ed).length);
121
+ ed.last = "none";
122
+ return settle(ed, true);
123
+ }
124
+ export const moveUp = (ed) => moveVertical(ed, -1);
125
+ export const moveDown = (ed) => moveVertical(ed, 1);
126
+ /** Home, but to the first non-blank first โ€” the second press goes to column 0. */
127
+ export function moveHome(ed) {
128
+ const indent = current(ed).match(/^\s*/)?.[0].length ?? 0;
129
+ ed.col = ed.col === indent ? 0 : indent;
130
+ ed.last = "none";
131
+ return settle(ed);
132
+ }
133
+ export function moveEnd(ed) {
134
+ ed.col = current(ed).length;
135
+ ed.last = "none";
136
+ return settle(ed);
137
+ }
138
+ export function moveDocStart(ed) {
139
+ ed.row = 0;
140
+ ed.col = 0;
141
+ ed.last = "none";
142
+ return settle(ed);
143
+ }
144
+ export function moveDocEnd(ed) {
145
+ ed.row = Math.max(0, ed.lines.length - 1);
146
+ ed.col = current(ed).length;
147
+ ed.last = "none";
148
+ return settle(ed);
149
+ }
150
+ const WORD = /[\p{L}\p{N}_]/u;
151
+ export function moveWordLeft(ed) {
152
+ if (ed.col === 0)
153
+ return moveLeft(ed);
154
+ const line = current(ed);
155
+ let i = ed.col;
156
+ while (i > 0 && !WORD.test(line[i - 1]))
157
+ i--;
158
+ while (i > 0 && WORD.test(line[i - 1]))
159
+ i--;
160
+ ed.col = i;
161
+ ed.last = "none";
162
+ return settle(ed);
163
+ }
164
+ export function moveWordRight(ed) {
165
+ const line = current(ed);
166
+ if (ed.col >= line.length)
167
+ return moveRight(ed);
168
+ let i = ed.col;
169
+ while (i < line.length && WORD.test(line[i]))
170
+ i++;
171
+ while (i < line.length && !WORD.test(line[i]))
172
+ i++;
173
+ ed.col = i;
174
+ ed.last = "none";
175
+ return settle(ed);
176
+ }
177
+ /* ----------------------------------------------------------------- edits --- */
178
+ /** Insert text at the caret. Newlines in it split lines, so paste works. */
179
+ export function insert(ed, str) {
180
+ if (str === "")
181
+ return ed;
182
+ checkpoint(ed, str.includes("\n") ? "other" : "insert");
183
+ const line = current(ed);
184
+ const before = line.slice(0, ed.col);
185
+ const after = line.slice(ed.col);
186
+ const parts = str.replace(/\r\n?/g, "\n").split("\n");
187
+ if (parts.length === 1) {
188
+ ed.lines[ed.row] = before + str + after;
189
+ ed.col += str.length;
190
+ return settle(ed);
191
+ }
192
+ const first = `${before}${parts[0]}`;
193
+ const last = `${parts[parts.length - 1]}${after}`;
194
+ const middle = parts.slice(1, -1);
195
+ ed.lines.splice(ed.row, 1, first, ...middle, last);
196
+ ed.row += parts.length - 1;
197
+ ed.col = parts[parts.length - 1].length;
198
+ return settle(ed);
199
+ }
200
+ /**
201
+ * The prefix a new line should inherit: the indent, and the list marker when
202
+ * the caret is leaving one.
203
+ *
204
+ * Returns `null` for an item that has no content, which is the signal to clear
205
+ * it instead โ€” pressing enter twice is how a list ends.
206
+ */
207
+ export function continuation(line) {
208
+ const m = ITEM.exec(line);
209
+ if (!m)
210
+ return { prefix: line.match(/^[ \t]*/)?.[0] ?? "", clear: false };
211
+ const [marker, indent, bullet, digits, delim, gap, task] = [
212
+ m[0],
213
+ m[1],
214
+ m[2],
215
+ m[3],
216
+ m[4],
217
+ m[5],
218
+ m[6],
219
+ ];
220
+ // Nothing after the marker: the list is over.
221
+ if (line.slice(marker.length).trim() === "")
222
+ return { prefix: "", clear: true };
223
+ const next = bullet ?? `${Number.parseInt(digits, 10) + 1}${delim}`;
224
+ return { prefix: `${indent}${next}${gap}${task ? "[ ] " : ""}`, clear: false };
225
+ }
226
+ /** Split the line at the caret, carrying indentation and list markers over. */
227
+ export function newline(ed) {
228
+ checkpoint(ed, "newline");
229
+ const line = current(ed);
230
+ const before = line.slice(0, ed.col);
231
+ const after = line.slice(ed.col);
232
+ const { prefix, clear } = continuation(before);
233
+ if (clear) {
234
+ // Enter on an empty item empties it rather than making another.
235
+ ed.lines[ed.row] = after;
236
+ ed.lines.splice(ed.row, 0, "");
237
+ ed.row++;
238
+ ed.col = 0;
239
+ return settle(ed);
240
+ }
241
+ ed.lines[ed.row] = before;
242
+ ed.lines.splice(ed.row + 1, 0, prefix + after);
243
+ ed.row++;
244
+ ed.col = prefix.length;
245
+ return settle(ed);
246
+ }
247
+ export function backspace(ed) {
248
+ if (ed.col === 0 && ed.row === 0)
249
+ return ed;
250
+ checkpoint(ed, "delete");
251
+ if (ed.col > 0) {
252
+ const line = current(ed);
253
+ // An indent is removed a level at a time, not a space at a time.
254
+ const before = line.slice(0, ed.col);
255
+ const width = /^[ \t]+$/.test(before) && before.length % 2 === 0 ? 2 : 1;
256
+ ed.lines[ed.row] = line.slice(0, ed.col - width) + line.slice(ed.col);
257
+ ed.col -= width;
258
+ return settle(ed);
259
+ }
260
+ const line = current(ed);
261
+ const above = lineAt(ed, ed.row - 1);
262
+ ed.lines.splice(ed.row - 1, 2, above + line);
263
+ ed.row--;
264
+ ed.col = above.length;
265
+ return settle(ed);
266
+ }
267
+ /** Delete forward. Joins the next line when the caret is at the end. */
268
+ export function del(ed) {
269
+ const line = current(ed);
270
+ if (ed.col >= line.length && ed.row >= ed.lines.length - 1)
271
+ return ed;
272
+ checkpoint(ed, "delete");
273
+ if (ed.col < line.length) {
274
+ ed.lines[ed.row] = line.slice(0, ed.col) + line.slice(ed.col + 1);
275
+ return settle(ed);
276
+ }
277
+ ed.lines.splice(ed.row, 2, line + lineAt(ed, ed.row + 1));
278
+ return settle(ed);
279
+ }
280
+ /** Delete to the end of the line, or join the next when already there. */
281
+ export function killToLineEnd(ed) {
282
+ const line = current(ed);
283
+ if (ed.col >= line.length)
284
+ return del(ed);
285
+ checkpoint(ed, "other");
286
+ ed.lines[ed.row] = line.slice(0, ed.col);
287
+ return settle(ed);
288
+ }
289
+ /** Delete from the caret back to the start of the line's text. */
290
+ export function killToLineStart(ed) {
291
+ if (ed.col === 0)
292
+ return ed;
293
+ checkpoint(ed, "other");
294
+ ed.lines[ed.row] = current(ed).slice(ed.col);
295
+ ed.col = 0;
296
+ return settle(ed);
297
+ }
298
+ /** Two spaces, the indent the renderer reads back as one list level. */
299
+ export function indent(ed) {
300
+ return insert(ed, " ");
301
+ }
302
+ /** Mark the buffer as matching what is on disk. */
303
+ export function markSaved(ed) {
304
+ ed.dirty = false;
305
+ ed.last = "none";
306
+ return ed;
307
+ }
308
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../src/editor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `:shortcode:` to emoji, the GitHub spelling.
3
+ *
4
+ * A curated set rather than the full 1,800-entry gemoji table: this is a
5
+ * reader, the long tail is names nobody types, and the whole point of keeping
6
+ * readm3 to two dependencies is not shipping a data file to save a map.
7
+ * An unknown shortcode is left alone, which is also what GitHub does.
8
+ */
9
+ export declare const EMOJI: Readonly<Record<string, string>>;
10
+ /** The emoji for a shortcode, or `null` when it is not one we know. */
11
+ export declare function emojiFor(name: string): string | null;
12
+ //# sourceMappingURL=emoji.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji.d.ts","sourceRoot":"","sources":["../src/emoji.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA+DlD,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEpD"}
package/dist/emoji.js ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * `:shortcode:` to emoji, the GitHub spelling.
3
+ *
4
+ * A curated set rather than the full 1,800-entry gemoji table: this is a
5
+ * reader, the long tail is names nobody types, and the whole point of keeping
6
+ * readm3 to two dependencies is not shipping a data file to save a map.
7
+ * An unknown shortcode is left alone, which is also what GitHub does.
8
+ */
9
+ export const EMOJI = {
10
+ // reactions
11
+ "+1": "๐Ÿ‘", "-1": "๐Ÿ‘Ž", thumbsup: "๐Ÿ‘", thumbsdown: "๐Ÿ‘Ž",
12
+ smile: "๐Ÿ˜„", smiley: "๐Ÿ˜ƒ", grin: "๐Ÿ˜", laughing: "๐Ÿ˜†", joy: "๐Ÿ˜‚", rofl: "๐Ÿคฃ",
13
+ wink: "๐Ÿ˜‰", blush: "๐Ÿ˜Š", heart_eyes: "๐Ÿ˜", thinking: "๐Ÿค”", neutral_face: "๐Ÿ˜",
14
+ confused: "๐Ÿ˜•", cry: "๐Ÿ˜ข", sob: "๐Ÿ˜ญ", scream: "๐Ÿ˜ฑ", angry: "๐Ÿ˜ ", rage: "๐Ÿ˜ก",
15
+ sunglasses: "๐Ÿ˜Ž", nerd_face: "๐Ÿค“", shrug: "๐Ÿคท", facepalm: "๐Ÿคฆ", eyes: "๐Ÿ‘€",
16
+ wave: "๐Ÿ‘‹", clap: "๐Ÿ‘", pray: "๐Ÿ™", muscle: "๐Ÿ’ช", ok_hand: "๐Ÿ‘Œ", point_right: "๐Ÿ‘‰",
17
+ raised_hands: "๐Ÿ™Œ", handshake: "๐Ÿค", tada: "๐ŸŽ‰", confetti_ball: "๐ŸŽŠ", partying_face: "๐Ÿฅณ",
18
+ heart: "โค๏ธ", broken_heart: "๐Ÿ’”", sparkling_heart: "๐Ÿ’–", orange_heart: "๐Ÿงก",
19
+ yellow_heart: "๐Ÿ’›", green_heart: "๐Ÿ’š", blue_heart: "๐Ÿ’™", purple_heart: "๐Ÿ’œ",
20
+ // status and review
21
+ white_check_mark: "โœ…", heavy_check_mark: "โœ”๏ธ", ballot_box_with_check: "โ˜‘๏ธ",
22
+ x: "โŒ", negative_squared_cross_mark: "โŽ", heavy_multiplication_x: "โœ–๏ธ",
23
+ warning: "โš ๏ธ", exclamation: "โ—", question: "โ“", grey_question: "โ”",
24
+ bangbang: "โ€ผ๏ธ", no_entry: "โ›”", no_entry_sign: "๐Ÿšซ", construction: "๐Ÿšง",
25
+ rotating_light: "๐Ÿšจ", stop_sign: "๐Ÿ›‘", checkered_flag: "๐Ÿ", triangular_flag_on_post: "๐Ÿšฉ",
26
+ bulb: "๐Ÿ’ก", memo: "๐Ÿ“", pencil2: "โœ๏ธ", pushpin: "๐Ÿ“Œ", round_pushpin: "๐Ÿ“",
27
+ bookmark: "๐Ÿ”–", label: "๐Ÿท๏ธ", link: "๐Ÿ”—", paperclip: "๐Ÿ“Ž", scroll: "๐Ÿ“œ",
28
+ clipboard: "๐Ÿ“‹", card_index_dividers: "๐Ÿ—‚๏ธ", file_folder: "๐Ÿ“", open_file_folder: "๐Ÿ“‚",
29
+ page_facing_up: "๐Ÿ“„", books: "๐Ÿ“š", book: "๐Ÿ“–", closed_book: "๐Ÿ“•", green_book: "๐Ÿ“—",
30
+ blue_book: "๐Ÿ“˜", orange_book: "๐Ÿ“™", notebook: "๐Ÿ““", ledger: "๐Ÿ“’", newspaper: "๐Ÿ“ฐ",
31
+ // engineering
32
+ rocket: "๐Ÿš€", fire: "๐Ÿ”ฅ", boom: "๐Ÿ’ฅ", zap: "โšก", star: "โญ", star2: "๐ŸŒŸ",
33
+ sparkles: "โœจ", dizzy: "๐Ÿ’ซ", bug: "๐Ÿ›", ant: "๐Ÿœ", beetle: "๐Ÿชฒ", spider: "๐Ÿ•ท๏ธ",
34
+ wrench: "๐Ÿ”ง", hammer: "๐Ÿ”จ", hammer_and_wrench: "๐Ÿ› ๏ธ", nut_and_bolt: "๐Ÿ”ฉ",
35
+ gear: "โš™๏ธ", toolbox: "๐Ÿงฐ", microscope: "๐Ÿ”ฌ", telescope: "๐Ÿ”ญ", mag: "๐Ÿ”",
36
+ mag_right: "๐Ÿ”Ž", lock: "๐Ÿ”’", unlock: "๐Ÿ”“", closed_lock_with_key: "๐Ÿ”", key: "๐Ÿ”‘",
37
+ shield: "๐Ÿ›ก๏ธ", package: "๐Ÿ“ฆ", gift: "๐ŸŽ", inbox_tray: "๐Ÿ“ฅ", outbox_tray: "๐Ÿ“ค",
38
+ floppy_disk: "๐Ÿ’พ", cd: "๐Ÿ’ฟ", computer: "๐Ÿ’ป", desktop_computer: "๐Ÿ–ฅ๏ธ",
39
+ keyboard: "โŒจ๏ธ", printer: "๐Ÿ–จ๏ธ", satellite: "๐Ÿ›ฐ๏ธ", electric_plug: "๐Ÿ”Œ",
40
+ battery: "๐Ÿ”‹", bulb_off: "๐Ÿ’ก", robot: "๐Ÿค–", alien: "๐Ÿ‘พ", space_invader: "๐Ÿ‘พ",
41
+ test_tube: "๐Ÿงช", dna: "๐Ÿงฌ", petri_dish: "๐Ÿงซ", magnet: "๐Ÿงฒ", brain: "๐Ÿง ",
42
+ hourglass: "โŒ›", hourglass_flowing_sand: "โณ", stopwatch: "โฑ๏ธ", alarm_clock: "โฐ",
43
+ calendar: "๐Ÿ“…", date: "๐Ÿ“†", chart_with_upwards_trend: "๐Ÿ“ˆ",
44
+ chart_with_downwards_trend: "๐Ÿ“‰", bar_chart: "๐Ÿ“Š", abacus: "๐Ÿงฎ",
45
+ // arrows and shapes
46
+ arrow_right: "โžก๏ธ", arrow_left: "โฌ…๏ธ", arrow_up: "โฌ†๏ธ", arrow_down: "โฌ‡๏ธ",
47
+ arrows_counterclockwise: "๐Ÿ”„", recycle: "โ™ป๏ธ", repeat: "๐Ÿ”", back: "๐Ÿ”™",
48
+ small_blue_diamond: "๐Ÿ”น", small_orange_diamond: "๐Ÿ”ธ", large_blue_circle: "๐Ÿ”ต",
49
+ red_circle: "๐Ÿ”ด", white_circle: "โšช", black_circle: "โšซ", green_circle: "๐ŸŸข",
50
+ yellow_circle: "๐ŸŸก", orange_circle: "๐ŸŸ ", purple_circle: "๐ŸŸฃ", brown_circle: "๐ŸŸค",
51
+ // odds and ends that show up in READMEs
52
+ coffee: "โ˜•", beer: "๐Ÿบ", champagne: "๐Ÿพ", pizza: "๐Ÿ•", cookie: "๐Ÿช", cake: "๐Ÿฐ",
53
+ snowflake: "โ„๏ธ", sunny: "โ˜€๏ธ", cloud: "โ˜๏ธ", rainbow: "๐ŸŒˆ", earth_americas: "๐ŸŒŽ",
54
+ globe_with_meridians: "๐ŸŒ", moon: "๐ŸŒ™", crystal_ball: "๐Ÿ”ฎ", trophy: "๐Ÿ†",
55
+ medal_sports: "๐Ÿ…", first_place_medal: "๐Ÿฅ‡", dart: "๐ŸŽฏ", game_die: "๐ŸŽฒ",
56
+ video_game: "๐ŸŽฎ", art: "๐ŸŽจ", performing_arts: "๐ŸŽญ", clapper: "๐ŸŽฌ", camera: "๐Ÿ“ท",
57
+ movie_camera: "๐ŸŽฅ", loud_sound: "๐Ÿ”Š", mute: "๐Ÿ”‡", bell: "๐Ÿ””", no_bell: "๐Ÿ”•",
58
+ mega: "๐Ÿ“ฃ", loudspeaker: "๐Ÿ“ข", speech_balloon: "๐Ÿ’ฌ", thought_balloon: "๐Ÿ’ญ",
59
+ bust_in_silhouette: "๐Ÿ‘ค", busts_in_silhouette: "๐Ÿ‘ฅ", office: "๐Ÿข", house: "๐Ÿ ",
60
+ penguin: "๐Ÿง", whale: "๐Ÿณ", dolphin: "๐Ÿฌ", octopus: "๐Ÿ™", snake: "๐Ÿ",
61
+ turtle: "๐Ÿข", rabbit: "๐Ÿฐ", cat: "๐Ÿฑ", dog: "๐Ÿถ", unicorn: "๐Ÿฆ„", dragon: "๐Ÿ‰",
62
+ seedling: "๐ŸŒฑ", herb: "๐ŸŒฟ", four_leaf_clover: "๐Ÿ€", maple_leaf: "๐Ÿ",
63
+ tanabata_tree: "๐ŸŽ‹", christmas_tree: "๐ŸŽ„", jack_o_lantern: "๐ŸŽƒ", ghost: "๐Ÿ‘ป",
64
+ skull: "๐Ÿ’€", poop: "๐Ÿ’ฉ", salt: "๐Ÿง‚", sos: "๐Ÿ†˜", new: "๐Ÿ†•", free: "๐Ÿ†“",
65
+ cool: "๐Ÿ†’", ok: "๐Ÿ†—", up: "๐Ÿ†™", copyright: "ยฉ๏ธ", registered: "ยฎ๏ธ", tm: "โ„ข๏ธ",
66
+ infinity: "โ™พ๏ธ", heavy_plus_sign: "โž•", heavy_minus_sign: "โž–",
67
+ heavy_division_sign: "โž—", heavy_equals_sign: "๐ŸŸฐ",
68
+ };
69
+ /** The emoji for a shortcode, or `null` when it is not one we know. */
70
+ export function emojiFor(name) {
71
+ return Object.hasOwn(EMOJI, name) ? EMOJI[name] : null;
72
+ }
73
+ //# sourceMappingURL=emoji.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emoji.js","sourceRoot":"","sources":["../src/emoji.ts"],"names":[],"mappings":"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"}