@pinecall/dot 0.11.23 → 0.11.25
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 +145 -63
- package/dist/agent/index.d.ts +3 -2
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/tutor.d.ts +12 -10
- package/dist/agent/tutor.d.ts.map +1 -1
- package/dist/agent/tutor.js +81 -68
- package/dist/agent/tutor.js.map +1 -1
- package/dist/agent/walks.d.ts +19 -0
- package/dist/agent/walks.d.ts.map +1 -0
- package/dist/agent/walks.js +89 -0
- package/dist/agent/walks.js.map +1 -0
- package/dist/page/page.d.ts +2 -2
- package/dist/page/page.d.ts.map +1 -1
- package/dist/page/page.js +5 -5
- package/dist/page/page.js.map +1 -1
- package/dist/page/roles.d.ts +2 -0
- package/dist/page/roles.d.ts.map +1 -1
- package/dist/page/roles.js +21 -2
- package/dist/page/roles.js.map +1 -1
- package/dist/pointer/asking.d.ts +25 -0
- package/dist/pointer/asking.d.ts.map +1 -0
- package/dist/pointer/asking.js +82 -0
- package/dist/pointer/asking.js.map +1 -0
- package/dist/pointer/flight.d.ts +40 -4
- package/dist/pointer/flight.d.ts.map +1 -1
- package/dist/pointer/flight.js +139 -17
- package/dist/pointer/flight.js.map +1 -1
- package/dist/pointer/frames.d.ts +28 -0
- package/dist/pointer/frames.d.ts.map +1 -0
- package/dist/pointer/frames.js +66 -0
- package/dist/pointer/frames.js.map +1 -0
- package/dist/pointer/icons.d.ts +8 -0
- package/dist/pointer/icons.d.ts.map +1 -0
- package/dist/pointer/icons.js +15 -0
- package/dist/pointer/icons.js.map +1 -0
- package/dist/pointer/menu.d.ts +5 -4
- package/dist/pointer/menu.d.ts.map +1 -1
- package/dist/pointer/menu.js +56 -47
- package/dist/pointer/menu.js.map +1 -1
- package/dist/pointer/person.d.ts +13 -2
- package/dist/pointer/person.d.ts.map +1 -1
- package/dist/pointer/person.js +47 -41
- package/dist/pointer/person.js.map +1 -1
- package/dist/pointer/pressing.d.ts +6 -0
- package/dist/pointer/pressing.d.ts.map +1 -0
- package/dist/pointer/pressing.js +32 -0
- package/dist/pointer/pressing.js.map +1 -0
- package/dist/pointer/sections.d.ts +4 -7
- package/dist/pointer/sections.d.ts.map +1 -1
- package/dist/pointer/sections.js +11 -17
- package/dist/pointer/sections.js.map +1 -1
- package/dist/pointer/typing.d.ts +5 -3
- package/dist/pointer/typing.d.ts.map +1 -1
- package/dist/pointer/typing.js +46 -15
- package/dist/pointer/typing.js.map +1 -1
- package/dist/server/index.d.ts +34 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +108 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/questions.d.ts +30 -0
- package/dist/server/questions.d.ts.map +1 -0
- package/dist/server/questions.js +136 -0
- package/dist/server/questions.js.map +1 -0
- package/dist/server/saying.d.ts +31 -0
- package/dist/server/saying.d.ts.map +1 -0
- package/dist/server/saying.js +124 -0
- package/dist/server/saying.js.map +1 -0
- package/dist/tutor/acting.d.ts +42 -0
- package/dist/tutor/acting.d.ts.map +1 -0
- package/dist/tutor/acting.js +180 -0
- package/dist/tutor/acting.js.map +1 -0
- package/dist/tutor/aloud.d.ts +50 -0
- package/dist/tutor/aloud.d.ts.map +1 -0
- package/dist/tutor/aloud.js +288 -0
- package/dist/tutor/aloud.js.map +1 -0
- package/dist/tutor/ask.d.ts +49 -0
- package/dist/tutor/ask.d.ts.map +1 -0
- package/dist/tutor/ask.js +47 -0
- package/dist/tutor/ask.js.map +1 -0
- package/dist/tutor/listening.d.ts +17 -0
- package/dist/tutor/listening.d.ts.map +1 -0
- package/dist/tutor/listening.js +66 -0
- package/dist/tutor/listening.js.map +1 -0
- package/dist/tutor/options.d.ts +37 -1
- package/dist/tutor/options.d.ts.map +1 -1
- package/dist/tutor/options.js +1 -1
- package/dist/tutor/options.js.map +1 -1
- package/dist/tutor/reading.d.ts +58 -0
- package/dist/tutor/reading.d.ts.map +1 -0
- package/dist/tutor/reading.js +193 -0
- package/dist/tutor/reading.js.map +1 -0
- package/dist/tutor/text.d.ts +16 -0
- package/dist/tutor/text.d.ts.map +1 -0
- package/dist/tutor/text.js +119 -0
- package/dist/tutor/text.js.map +1 -0
- package/dist/tutor/tutor.d.ts +2 -9
- package/dist/tutor/tutor.d.ts.map +1 -1
- package/dist/tutor/tutor.js +110 -87
- package/dist/tutor/tutor.js.map +1 -1
- package/dist/tutor/walking.d.ts +26 -8
- package/dist/tutor/walking.d.ts.map +1 -1
- package/dist/tutor/walking.js +145 -30
- package/dist/tutor/walking.js.map +1 -1
- package/dist/tutor/walks.d.ts +33 -0
- package/dist/tutor/walks.d.ts.map +1 -1
- package/dist/tutor/walks.js +121 -13
- package/dist/tutor/walks.js.map +1 -1
- package/dist/wire/acts.d.ts +60 -0
- package/dist/wire/acts.d.ts.map +1 -0
- package/dist/wire/acts.js +120 -0
- package/dist/wire/acts.js.map +1 -0
- package/dist/wire/ask.d.ts +132 -0
- package/dist/wire/ask.d.ts.map +1 -0
- package/dist/wire/ask.js +102 -0
- package/dist/wire/ask.js.map +1 -0
- package/dist/wire/index.d.ts +38 -8
- package/dist/wire/index.d.ts.map +1 -1
- package/dist/wire/index.js +86 -12
- package/dist/wire/index.js.map +1 -1
- package/docs/macros.md +216 -0
- package/docs/write-a-tutor.md +247 -0
- package/package.json +11 -6
package/dist/tutor/walking.js
CHANGED
|
@@ -3,40 +3,80 @@
|
|
|
3
3
|
// One audio element plays every sentence in turn: Safari lets an element the visitor's click
|
|
4
4
|
// started go on to its next source, where a new element would need another click. Each frame
|
|
5
5
|
// reads where the audio is, so the words and the pointer follow the sound, whatever the network.
|
|
6
|
-
|
|
6
|
+
// A walk called with values fills its slots: a step that acts (fill, press, wait, read) is done by
|
|
7
|
+
// the page between two sentences, and a sentence with slots is recorded when it is reached. A step
|
|
8
|
+
// a slot of which nothing filled, or whose `if` or `unless` says so, is left out.
|
|
9
|
+
import { filled, isAct, taken, walksDocument, walksOf } from "../wire/index.js";
|
|
7
10
|
import { Player } from "./macro.js";
|
|
8
|
-
/**
|
|
9
|
-
|
|
10
|
-
if (url === "")
|
|
11
|
-
return [];
|
|
11
|
+
/** A document's walks, read with no key; null where it is not there or cannot be read. */
|
|
12
|
+
async function readWalks(url) {
|
|
12
13
|
try {
|
|
13
14
|
const answer = await fetch(url);
|
|
14
|
-
return answer.ok ? walksOf(await answer.json()) :
|
|
15
|
+
return answer.ok ? walksOf(await answer.json()) : null;
|
|
15
16
|
}
|
|
16
17
|
catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The walks an agent published for the page at `path`, read with no key; none where the page cannot read them.
|
|
23
|
+
* `url` is the agent's `walks` document, the home's: a page of its own has `walks-<page>` beside it, and is
|
|
24
|
+
* read from there, or from `url` when the agent published none for it (the walks that name no page).
|
|
25
|
+
*/
|
|
26
|
+
export async function publishedWalks(url, path = "") {
|
|
27
|
+
if (url === "")
|
|
17
28
|
return [];
|
|
29
|
+
const own = walksDocument(path);
|
|
30
|
+
const [base, query = ""] = url.split("?");
|
|
31
|
+
if (own !== "walks" && base !== undefined && base.endsWith("/walks")) {
|
|
32
|
+
const found = await readWalks(`${base.slice(0, -"walks".length)}${own}${query === "" ? "" : `?${query}`}`);
|
|
33
|
+
if (found !== null)
|
|
34
|
+
return found;
|
|
18
35
|
}
|
|
36
|
+
return (await readWalks(url)) ?? [];
|
|
19
37
|
}
|
|
20
|
-
/** A walk's length, in ms. */
|
|
38
|
+
/** A walk's length, in ms: its recorded sentences'. */
|
|
21
39
|
export function lengthOf(walk) {
|
|
22
|
-
return walk.steps.reduce((total, step) => total + step.durationMs, 0);
|
|
40
|
+
return walk.steps.reduce((total, step) => total + ("durationMs" in step ? step.durationMs : 0), 0);
|
|
41
|
+
}
|
|
42
|
+
const NO_HOOKS = { act: async () => ({}), voice: async () => null };
|
|
43
|
+
// An audio element is the visitor's to start: one that played inside their click goes on playing
|
|
44
|
+
// sources after it, so a walk that starts after a wait (a door asked, a search) plays this first.
|
|
45
|
+
const SILENCE = "data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEARKwAAIhYAQACABAAZGF0YQAAAAA=";
|
|
46
|
+
/** A step's beats with the slots of what they find filled: `["row", "{hit}"]`. A beat whose slot nothing filled is left out. */
|
|
47
|
+
function beatsFilled(beats, values) {
|
|
48
|
+
return beats.flatMap((beat) => {
|
|
49
|
+
if (beat.find === undefined)
|
|
50
|
+
return [beat];
|
|
51
|
+
const name = filled(beat.find[1], values);
|
|
52
|
+
return name === null ? [] : [{ ...beat, find: [beat.find[0], name] }];
|
|
53
|
+
});
|
|
23
54
|
}
|
|
24
55
|
export class Walking {
|
|
25
56
|
audio;
|
|
26
57
|
#ended;
|
|
27
58
|
#shows;
|
|
28
59
|
#player = new Player();
|
|
60
|
+
#hooks;
|
|
29
61
|
#walk = null;
|
|
30
62
|
#step = 0;
|
|
31
63
|
#paused = false;
|
|
64
|
+
#values = {};
|
|
65
|
+
/** The sentence playing; null while a step acts or is recorded. */
|
|
66
|
+
#current = null;
|
|
67
|
+
/** A sentence ready while the walk was paused, played on resume. */
|
|
68
|
+
#held = null;
|
|
69
|
+
/** Which run of the walk is on: a stop or a new start ends the one before, mid-act. */
|
|
70
|
+
#run = 0;
|
|
32
71
|
/**
|
|
33
72
|
* Play through `audio`; `ended` hears a walk that played to its end, or failed to play; `shows`
|
|
34
|
-
* hears each sentence as it starts, for what it shows beside the page, and null as the walk stops.
|
|
73
|
+
* hears each sentence as it starts (and which step it is), for what it shows beside the page, and null as the walk stops.
|
|
35
74
|
*/
|
|
36
|
-
constructor(audio, ended, shows = () => undefined) {
|
|
75
|
+
constructor(audio, ended, shows = () => undefined, hooks = NO_HOOKS) {
|
|
37
76
|
this.audio = audio;
|
|
38
77
|
this.#ended = ended;
|
|
39
78
|
this.#shows = shows;
|
|
79
|
+
this.#hooks = hooks;
|
|
40
80
|
// The ear reads the audio through Web Audio, which hears silence from a source fetched without CORS.
|
|
41
81
|
audio.crossOrigin = "anonymous";
|
|
42
82
|
audio.preload = "auto";
|
|
@@ -63,24 +103,64 @@ export class Walking {
|
|
|
63
103
|
if (this.#walk === null || !this.#paused)
|
|
64
104
|
return;
|
|
65
105
|
this.#paused = false;
|
|
66
|
-
|
|
106
|
+
const held = this.#held;
|
|
107
|
+
this.#held = null;
|
|
108
|
+
if (held !== null)
|
|
109
|
+
this.#play(held);
|
|
110
|
+
else if (this.#current !== null)
|
|
111
|
+
this.audio.play().catch(() => this.#finish(false));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The next sentence, or the one before (`delta` 1 or -1): going on, a step that acts is done on the way;
|
|
115
|
+
* going back, it is passed over, never done twice. Call it from the visitor's click.
|
|
116
|
+
*/
|
|
117
|
+
skip(delta) {
|
|
118
|
+
const walk = this.#walk;
|
|
119
|
+
if (walk === null)
|
|
120
|
+
return;
|
|
121
|
+
let at = this.#step + delta;
|
|
122
|
+
const acts = (index) => {
|
|
123
|
+
const step = walk.steps[index];
|
|
124
|
+
return step !== undefined && isAct(step);
|
|
125
|
+
};
|
|
126
|
+
while (delta < 0 && at > 0 && acts(at))
|
|
127
|
+
at -= 1;
|
|
128
|
+
this.#step = Math.max(0, at);
|
|
129
|
+
this.#paused = false;
|
|
130
|
+
this.#held = null;
|
|
131
|
+
this.#current = null;
|
|
132
|
+
this.#player.drop();
|
|
133
|
+
this.audio.pause();
|
|
134
|
+
void this.#go();
|
|
135
|
+
}
|
|
136
|
+
/** Let this element play later, from the visitor's click: a walk that starts after a wait. */
|
|
137
|
+
unlock() {
|
|
138
|
+
if (this.#walk !== null)
|
|
139
|
+
return;
|
|
140
|
+
this.audio.src = SILENCE;
|
|
141
|
+
this.audio.play().catch(() => undefined);
|
|
67
142
|
}
|
|
68
|
-
/** Play a walk from its first sentence
|
|
69
|
-
start(walk) {
|
|
143
|
+
/** Play a walk from its first sentence, its slots filled from `values`. Call it from the visitor's click, or after `unlock`. */
|
|
144
|
+
start(walk, values = {}) {
|
|
70
145
|
this.#walk = walk;
|
|
71
146
|
this.#step = 0;
|
|
72
|
-
this.#
|
|
147
|
+
this.#values = { ...values };
|
|
148
|
+
void this.#go();
|
|
73
149
|
}
|
|
74
150
|
/** Where the walk is now; null while none plays. */
|
|
75
151
|
frame() {
|
|
76
152
|
const walk = this.#walk;
|
|
77
|
-
|
|
78
|
-
if (walk === null || step === undefined)
|
|
153
|
+
if (walk === null)
|
|
79
154
|
return null;
|
|
155
|
+
const step = this.#current;
|
|
156
|
+
const before = walk.steps.slice(0, this.#step).reduce((total, one) => total + ("durationMs" in one ? one.durationMs : 0), 0);
|
|
157
|
+
const fraction = Math.min(1, before / Math.max(1, lengthOf(walk)));
|
|
158
|
+
// Between two sentences, a step acting or being recorded: no words, the bar where it stands.
|
|
159
|
+
if (step === null)
|
|
160
|
+
return { lit: "", coming: "", beats: [], fraction };
|
|
80
161
|
const now = this.audio.currentTime * 1000;
|
|
81
162
|
const lit = step.words.filter((word) => word.startMs <= now).map((word) => word.text).join(" ");
|
|
82
163
|
const rest = step.words.filter((word) => word.startMs > now).map((word) => word.text).join(" ");
|
|
83
|
-
const before = walk.steps.slice(0, this.#step).reduce((total, one) => total + one.durationMs, 0);
|
|
84
164
|
return {
|
|
85
165
|
lit,
|
|
86
166
|
coming: lit !== "" && rest !== "" ? ` ${rest}` : rest,
|
|
@@ -97,27 +177,58 @@ export class Walking {
|
|
|
97
177
|
this.#reset();
|
|
98
178
|
return walked;
|
|
99
179
|
}
|
|
100
|
-
|
|
180
|
+
/** From the step it stands on: acts done and sentences left out in turn, until a sentence plays or the walk ends. */
|
|
181
|
+
async #go() {
|
|
182
|
+
const walk = this.#walk;
|
|
183
|
+
const run = ++this.#run;
|
|
184
|
+
while (walk !== null && run === this.#run) {
|
|
185
|
+
const step = walk.steps[this.#step];
|
|
186
|
+
if (step === undefined)
|
|
187
|
+
return this.#finish(true);
|
|
188
|
+
if (!taken(step, this.#values)) {
|
|
189
|
+
this.#step += 1;
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
this.#current = null;
|
|
193
|
+
this.#player.drop();
|
|
194
|
+
if (isAct(step)) {
|
|
195
|
+
const read = await this.#hooks.act(step, this.#values, this.#step).catch(() => ({}));
|
|
196
|
+
if (run !== this.#run)
|
|
197
|
+
return;
|
|
198
|
+
Object.assign(this.#values, read);
|
|
199
|
+
this.#step += 1;
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
const recorded = "live" in step ? await this.#hooks.voice(walk, this.#step, this.#values).catch(() => null) : step;
|
|
203
|
+
if (run !== this.#run)
|
|
204
|
+
return;
|
|
205
|
+
if (recorded === null) {
|
|
206
|
+
this.#step += 1;
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
return this.#play({ ...recorded, beats: beatsFilled(recorded.beats, this.#values) });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
#play(step) {
|
|
101
213
|
const walk = this.#walk;
|
|
102
|
-
|
|
103
|
-
|
|
214
|
+
if (walk === null)
|
|
215
|
+
return;
|
|
216
|
+
if (this.#paused) {
|
|
217
|
+
this.#held = step;
|
|
104
218
|
return;
|
|
219
|
+
}
|
|
220
|
+
this.#current = step;
|
|
105
221
|
const asStep = { type: "macro.step", macro: walk.name, step: this.#step, say: step.say, beats: step.beats };
|
|
106
222
|
this.#player.arm(asStep, null);
|
|
107
|
-
this.#shows(step);
|
|
223
|
+
this.#shows(step, this.#step);
|
|
108
224
|
this.audio.src = step.audio;
|
|
109
225
|
this.audio.play().catch(() => this.#finish(false));
|
|
110
226
|
}
|
|
111
227
|
#next() {
|
|
112
|
-
|
|
113
|
-
if (walk === null)
|
|
114
|
-
return;
|
|
115
|
-
if (this.#step + 1 < walk.steps.length) {
|
|
116
|
-
this.#step += 1;
|
|
117
|
-
this.#play();
|
|
228
|
+
if (this.#walk === null || this.#current === null)
|
|
118
229
|
return;
|
|
119
|
-
|
|
120
|
-
this.#
|
|
230
|
+
this.#step += 1;
|
|
231
|
+
void this.#go();
|
|
121
232
|
}
|
|
122
233
|
#finish(done) {
|
|
123
234
|
const walk = this.#walk;
|
|
@@ -129,9 +240,13 @@ export class Walking {
|
|
|
129
240
|
}
|
|
130
241
|
#reset() {
|
|
131
242
|
this.#walk = null;
|
|
243
|
+
this.#run += 1;
|
|
244
|
+
this.#current = null;
|
|
245
|
+
this.#held = null;
|
|
246
|
+
this.#values = {};
|
|
132
247
|
this.#paused = false;
|
|
133
248
|
this.#player.drop();
|
|
134
|
-
this.#shows(null);
|
|
249
|
+
this.#shows(null, -1);
|
|
135
250
|
this.audio.pause();
|
|
136
251
|
}
|
|
137
252
|
// The player binds a step to a "speech": a sentence of the walk is its own.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walking.js","sourceRoot":"","sources":["../../src/tutor/walking.ts"],"names":[],"mappings":"AAAA,8IAA8I;AAC9I,EAAE;AACF,6FAA6F;AAC7F,6FAA6F;AAC7F,iGAAiG;
|
|
1
|
+
{"version":3,"file":"walking.js","sourceRoot":"","sources":["../../src/tutor/walking.ts"],"names":[],"mappings":"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"}
|
package/dist/tutor/walks.d.ts
CHANGED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
import type { Face } from "../face/index.js";
|
|
3
3
|
import { CodeWindow } from "../pointer/code.js";
|
|
4
4
|
import type { Person } from "../pointer/person.js";
|
|
5
|
+
import type { AskRequest } from "../wire/ask.js";
|
|
6
|
+
import { type ActStep, type RecordedStep, type RecordedWalk, type Values, type WalkStep } from "../wire/index.js";
|
|
7
|
+
import { type ReadingOptions } from "./aloud.js";
|
|
5
8
|
import { type WalkFrame, type Walked } from "./walking.js";
|
|
6
9
|
export interface WalksOptions {
|
|
7
10
|
dock: "right" | "left";
|
|
@@ -21,6 +24,19 @@ export interface WalksOptions {
|
|
|
21
24
|
point: (element: Element) => void;
|
|
22
25
|
/** Reduced motion: the code is written in at once. */
|
|
23
26
|
still: boolean;
|
|
27
|
+
/** The field for what the visitor wants shown: its placeholder, and what was typed. None, no field. */
|
|
28
|
+
ask?: {
|
|
29
|
+
placeholder: string;
|
|
30
|
+
onAsk: (text: string) => void;
|
|
31
|
+
} | undefined;
|
|
32
|
+
/** A walk's act done on the page, with what the visitor typed: the values it read. */
|
|
33
|
+
act?: ((step: ActStep, values: Values, message: string) => Promise<Values>) | undefined;
|
|
34
|
+
/** A walk's sentence with slots, recorded now. */
|
|
35
|
+
voice?: ((walk: RecordedWalk, at: number, values: Values) => Promise<RecordedStep | null>) | undefined;
|
|
36
|
+
/** The page read aloud, first in the menu under `title`, where the site marks `data-pinecall-read`. None, it is not offered. */
|
|
37
|
+
reading?: ({
|
|
38
|
+
title: string;
|
|
39
|
+
} & ReadingOptions) | undefined;
|
|
24
40
|
}
|
|
25
41
|
export declare class Walks {
|
|
26
42
|
#private;
|
|
@@ -31,10 +47,25 @@ export declare class Walks {
|
|
|
31
47
|
frame(): WalkFrame | null;
|
|
32
48
|
get playing(): boolean;
|
|
33
49
|
get paused(): boolean;
|
|
50
|
+
/** The walk's next sentence, or the one before: the visitor's buttons. */
|
|
51
|
+
skip(delta: 1 | -1): void;
|
|
34
52
|
/** Hold the walk playing, or go on with it: the visitor's pause button. */
|
|
35
53
|
pause(): void;
|
|
36
54
|
/** The section scrolled to offers its walk, and the site's own buttons show, while no call is on and no walk plays. Called every frame. */
|
|
37
55
|
place(): void;
|
|
56
|
+
/** The walks of this page, as the field asks about them, with what each takes. */
|
|
57
|
+
listed(): AskRequest["walks"];
|
|
58
|
+
/** Play a walk of this page, by its name, called with `values`: from what the visitor typed (`message`). */
|
|
59
|
+
playNamed(name: string, values?: Values, message?: string): void;
|
|
60
|
+
/** Read the page aloud, as it is now: what it marks `data-pinecall-read`. Call it from the visitor's click. */
|
|
61
|
+
read(): void;
|
|
62
|
+
/** Let a walk play after a wait: from the visitor's submit, before the door answers. */
|
|
63
|
+
unlock(): void;
|
|
64
|
+
/** Open the menu with a line under the field about what was asked, and a button to take it on. */
|
|
65
|
+
offer(text: string, action?: {
|
|
66
|
+
label: string;
|
|
67
|
+
onClick: () => void;
|
|
68
|
+
}): void;
|
|
38
69
|
/** Stop the walk playing, if one is: the visitor clicked the face, or a call began. */
|
|
39
70
|
stop(): void;
|
|
40
71
|
/** Whether the button may show: not during a call, nor while a walk plays. */
|
|
@@ -43,4 +74,6 @@ export declare class Walks {
|
|
|
43
74
|
taken(): Walked | null;
|
|
44
75
|
close(): void;
|
|
45
76
|
}
|
|
77
|
+
/** Every part a reading says, asked of the door before it is read, `AHEAD_AT_ONCE` at a time; a part it fails is left for the reading. */
|
|
78
|
+
export declare function recordAhead(steps: readonly WalkStep[], record: (text: string) => Promise<unknown>): Promise<number>;
|
|
46
79
|
//# sourceMappingURL=walks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walks.d.ts","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"AAAA,+JAA+J;AAE/J,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"walks.d.ts","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"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"}
|
package/dist/tutor/walks.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
/** The walks beside the resting face, with no call: the button and its pills, the player, the code a step shows, and what the next call is told was played. */
|
|
2
|
+
import { Asking } from "../pointer/asking.js";
|
|
2
3
|
import { CodeWindow } from "../pointer/code.js";
|
|
3
4
|
import { Sections } from "../pointer/sections.js";
|
|
4
5
|
import { Menu } from "../pointer/menu.js";
|
|
6
|
+
import { onPage } from "../wire/index.js";
|
|
7
|
+
import { ReadAloud } from "./aloud.js";
|
|
8
|
+
import { fromHere, readingOf } from "./reading.js";
|
|
5
9
|
import { Walking, lengthOf, publishedWalks } from "./walking.js";
|
|
6
10
|
export class Walks {
|
|
7
11
|
/** The window of code a step opens; a call's macro steps open it too. */
|
|
@@ -9,40 +13,81 @@ export class Walks {
|
|
|
9
13
|
#walking;
|
|
10
14
|
#menu;
|
|
11
15
|
#sections;
|
|
16
|
+
#asking;
|
|
12
17
|
#drawn;
|
|
13
18
|
#person;
|
|
14
19
|
#options;
|
|
20
|
+
#document;
|
|
15
21
|
#list = [];
|
|
22
|
+
/** The walks the menu and the sections offer: those that take no params, which are asked for. */
|
|
23
|
+
#picked = [];
|
|
16
24
|
#played = null;
|
|
25
|
+
/** What the visitor typed for the walk playing; none for one picked. */
|
|
26
|
+
#message = "";
|
|
27
|
+
/** The page being read aloud, while it is. */
|
|
28
|
+
#aloud = null;
|
|
29
|
+
/** Whether the menu offers reading the page, first. */
|
|
30
|
+
#readable = false;
|
|
17
31
|
constructor(document, person, drawn, options) {
|
|
18
32
|
this.#person = person;
|
|
33
|
+
this.#document = document;
|
|
19
34
|
this.#drawn = drawn;
|
|
20
35
|
this.#options = options;
|
|
21
36
|
this.code = new CodeWindow(document, (part) => person.add(part), options.still);
|
|
22
|
-
this.#walking = new Walking(document.createElement("audio"), (walked) => this.#ended(walked), (step) => {
|
|
37
|
+
this.#walking = new Walking(document.createElement("audio"), (walked) => this.#ended(walked), (step, at) => {
|
|
38
|
+
if (this.#aloud !== null)
|
|
39
|
+
return this.#aloud.shows(step === null ? -1 : at);
|
|
23
40
|
// A step that names no code keeps the window as it is; the walk's end closes it.
|
|
24
41
|
if (step === null)
|
|
25
42
|
return this.code.hide();
|
|
26
43
|
const lit = this.code.show(step.code, step.lines);
|
|
27
44
|
if (lit !== null)
|
|
28
45
|
options.point(lit);
|
|
46
|
+
}, {
|
|
47
|
+
act: async (step, values, at) => {
|
|
48
|
+
if (this.#aloud !== null)
|
|
49
|
+
return this.#aloud.act(at).then(() => ({}));
|
|
50
|
+
return options.act?.(step, values, this.#message) ?? {};
|
|
51
|
+
},
|
|
52
|
+
voice: (walk, at, values) => (this.#aloud !== null ? this.#aloud.voice(at) : options.voice?.(walk, at, values) ?? Promise.resolve(null)),
|
|
53
|
+
});
|
|
54
|
+
const named = (name) => this.#picked.findIndex((walk) => walk.name === name);
|
|
55
|
+
// What was typed folds the menu away; a line about it opens it again (`offer`).
|
|
56
|
+
const ask = options.ask;
|
|
57
|
+
this.#asking = ask === undefined ? undefined : new Asking(document, (part) => person.add(part), {
|
|
58
|
+
placeholder: ask.placeholder,
|
|
59
|
+
onAsk: (text) => {
|
|
60
|
+
this.#menu.toggle(false);
|
|
61
|
+
ask.onAsk(text);
|
|
62
|
+
},
|
|
29
63
|
});
|
|
30
64
|
this.#menu = new Menu(document, (part) => person.add(part), {
|
|
65
|
+
ask: this.#asking,
|
|
31
66
|
dock: options.dock,
|
|
32
67
|
label: options.label,
|
|
33
68
|
more: options.more,
|
|
34
69
|
face: () => ({ at: person.dock(), radius: person.radius }),
|
|
35
|
-
onPick: (index) => this.#play(index),
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
onPlay: (name) => this.#play(named(name)),
|
|
70
|
+
onPick: (index) => (this.#readable && index === 0 ? this.read() : this.#play(this.#picked[index - this.#offset])),
|
|
71
|
+
current: () => {
|
|
72
|
+
const at = named(this.#sections.current() ?? "");
|
|
73
|
+
return at === -1 ? -1 : at + this.#offset;
|
|
74
|
+
},
|
|
41
75
|
});
|
|
42
|
-
|
|
76
|
+
this.#sections = new Sections(document, { onPlay: (name) => this.#play(this.#picked[named(name)]) });
|
|
77
|
+
const path = document.defaultView?.location.pathname ?? "";
|
|
78
|
+
void publishedWalks(options.url ?? "", path).then((all) => {
|
|
79
|
+
// Only the walks for the page the visitor is on: one that names other pages stays out of the menu.
|
|
80
|
+
const found = all.filter((walk) => onPage(walk.pages, path));
|
|
43
81
|
this.#list = found;
|
|
44
|
-
this.#
|
|
45
|
-
|
|
82
|
+
this.#picked = found.filter((walk) => walk.params === undefined);
|
|
83
|
+
const reading = options.reading;
|
|
84
|
+
const readable = reading === undefined ? null : readingOf(document, reading.title);
|
|
85
|
+
this.#readable = readable !== null;
|
|
86
|
+
// Every part recorded ahead, a few at a time: the door keeps each, so a reading started later starts at once.
|
|
87
|
+
if (readable !== null && reading !== undefined)
|
|
88
|
+
void recordAhead(readable.walk.steps, reading.record);
|
|
89
|
+
this.#menu.offer([...(this.#readable && reading !== undefined ? [{ title: reading.title, ms: 0 }] : []), ...this.#picked.map((walk) => ({ title: walk.title, ms: lengthOf(walk) }))]);
|
|
90
|
+
this.#sections.offer(this.#picked.map((walk) => walk.name));
|
|
46
91
|
this.#menu.available(!options.inCall());
|
|
47
92
|
});
|
|
48
93
|
}
|
|
@@ -56,6 +101,10 @@ export class Walks {
|
|
|
56
101
|
get paused() {
|
|
57
102
|
return this.#walking.paused;
|
|
58
103
|
}
|
|
104
|
+
/** The walk's next sentence, or the one before: the visitor's buttons. */
|
|
105
|
+
skip(delta) {
|
|
106
|
+
this.#walking.skip(delta);
|
|
107
|
+
}
|
|
59
108
|
/** Hold the walk playing, or go on with it: the visitor's pause button. */
|
|
60
109
|
pause() {
|
|
61
110
|
if (this.#walking.paused)
|
|
@@ -67,6 +116,42 @@ export class Walks {
|
|
|
67
116
|
place() {
|
|
68
117
|
this.#sections.place(!this.#options.inCall() && !this.playing);
|
|
69
118
|
}
|
|
119
|
+
/** The walks of this page, as the field asks about them, with what each takes. */
|
|
120
|
+
listed() {
|
|
121
|
+
return this.#list.map((walk) => ({
|
|
122
|
+
name: walk.name,
|
|
123
|
+
title: walk.title,
|
|
124
|
+
...(walk.when === undefined ? {} : { when: walk.when }),
|
|
125
|
+
...(walk.params === undefined ? {} : { params: walk.params }),
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
/** Play a walk of this page, by its name, called with `values`: from what the visitor typed (`message`). */
|
|
129
|
+
playNamed(name, values = {}, message = "") {
|
|
130
|
+
this.#play(this.#list.find((walk) => walk.name === name), values, message);
|
|
131
|
+
}
|
|
132
|
+
/** Read the page aloud, as it is now: what it marks `data-pinecall-read`. Call it from the visitor's click. */
|
|
133
|
+
read() {
|
|
134
|
+
const reading = this.#options.reading;
|
|
135
|
+
const found = reading === undefined ? null : readingOf(this.#document, reading.title);
|
|
136
|
+
if (reading === undefined || found === null || this.#options.inCall())
|
|
137
|
+
return;
|
|
138
|
+
this.stop();
|
|
139
|
+
// Its first sentence comes from the door after this click: the audio is let play inside it.
|
|
140
|
+
this.#walking.unlock();
|
|
141
|
+
// From where the page is scrolled to: what was read, or scrolled past, is not read again.
|
|
142
|
+
const here = fromHere(found);
|
|
143
|
+
this.#aloud = new ReadAloud(here, reading);
|
|
144
|
+
this.#play(here.walk);
|
|
145
|
+
}
|
|
146
|
+
/** Let a walk play after a wait: from the visitor's submit, before the door answers. */
|
|
147
|
+
unlock() {
|
|
148
|
+
this.#walking.unlock();
|
|
149
|
+
}
|
|
150
|
+
/** Open the menu with a line under the field about what was asked, and a button to take it on. */
|
|
151
|
+
offer(text, action) {
|
|
152
|
+
this.#menu.toggle(true);
|
|
153
|
+
this.#asking?.hint(text, action);
|
|
154
|
+
}
|
|
70
155
|
/** Stop the walk playing, if one is: the visitor clicked the face, or a call began. */
|
|
71
156
|
stop() {
|
|
72
157
|
const walked = this.#walking.stop();
|
|
@@ -87,19 +172,25 @@ export class Walks {
|
|
|
87
172
|
this.#walking.stop();
|
|
88
173
|
this.#menu.close();
|
|
89
174
|
this.#sections.close();
|
|
175
|
+
this.#asking?.close();
|
|
90
176
|
this.code.close();
|
|
91
177
|
}
|
|
92
|
-
#play(
|
|
93
|
-
const walk = this.#list[index];
|
|
178
|
+
#play(walk, values = {}, message = "") {
|
|
94
179
|
if (walk === undefined || this.#options.inCall())
|
|
95
180
|
return;
|
|
181
|
+
this.#message = message;
|
|
96
182
|
this.#drawn.wake();
|
|
97
183
|
this.#drawn.listen(this.#walking.audio);
|
|
98
184
|
this.#menu.available(false);
|
|
99
|
-
this.#walking.start(walk);
|
|
185
|
+
this.#walking.start(walk, values);
|
|
100
186
|
this.#options.onWalk?.({ walk: walk.name, step: 1, of: walk.steps.length, done: false });
|
|
101
187
|
}
|
|
188
|
+
/** How many pills stand before the walks': the page read aloud, when it is offered. */
|
|
189
|
+
get #offset() {
|
|
190
|
+
return this.#readable ? 1 : 0;
|
|
191
|
+
}
|
|
102
192
|
#ended(walked) {
|
|
193
|
+
this.#aloud = null;
|
|
103
194
|
this.#played = walked;
|
|
104
195
|
this.#drawn.listen(null);
|
|
105
196
|
this.#person.progress(null);
|
|
@@ -109,4 +200,21 @@ export class Walks {
|
|
|
109
200
|
this.#options.onWalk?.(walked);
|
|
110
201
|
}
|
|
111
202
|
}
|
|
203
|
+
/** How many parts of a page are asked of the door at once while it is recorded ahead. */
|
|
204
|
+
const AHEAD_AT_ONCE = 3;
|
|
205
|
+
/** Every part a reading says, asked of the door before it is read, `AHEAD_AT_ONCE` at a time; a part it fails is left for the reading. */
|
|
206
|
+
export async function recordAhead(steps, record) {
|
|
207
|
+
const texts = [...new Set(steps.flatMap((step) => ("live" in step ? [step.say] : [])))];
|
|
208
|
+
let next = 0;
|
|
209
|
+
let done = 0;
|
|
210
|
+
const one = async () => {
|
|
211
|
+
while (next < texts.length) {
|
|
212
|
+
const text = texts[next++];
|
|
213
|
+
if ((await record(text).catch(() => null)) !== null)
|
|
214
|
+
done += 1;
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
await Promise.all(Array.from({ length: AHEAD_AT_ONCE }, one));
|
|
218
|
+
return done;
|
|
219
|
+
}
|
|
112
220
|
//# sourceMappingURL=walks.js.map
|
package/dist/tutor/walks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"walks.js","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"AAAA,+JAA+J;AAG/J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAG1C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAA+B,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"walks.js","sourceRoot":"","sources":["../../src/tutor/walks.ts"],"names":[],"mappings":"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"}
|