@@ -19,18 +19,18 @@ import { getRangeConnective } from "./getRangeConnective";
19
19
import { SpokenFormMap } from "../SpokenFormMap" ;
20
20
import { PrimitiveTargetSpokenFormGenerator } from "./primitiveTargetToSpokenForm" ;
21
21
import {
22
- GeneratorSpokenFormMap ,
23
- SpokenFormComponent ,
24
- getGeneratorSpokenForms ,
25
- } from "./GeneratorSpokenFormMap " ;
22
+ SpokenFormComponentMap ,
23
+ getSpokenFormComponentMap ,
24
+ } from "./getSpokenFormComponentMap" ;
25
+ import { SpokenFormComponent } from "./SpokenFormComponent " ;
26
26
import { SpokenForm } from "@cursorless/common" ;
27
27
28
28
export class SpokenFormGenerator {
29
29
private primitiveGenerator : PrimitiveTargetSpokenFormGenerator ;
30
- private spokenFormMap : GeneratorSpokenFormMap ;
30
+ private spokenFormMap : SpokenFormComponentMap ;
31
31
32
32
constructor ( spokenFormMap : SpokenFormMap ) {
33
- this . spokenFormMap = getGeneratorSpokenForms ( spokenFormMap ) ;
33
+ this . spokenFormMap = getSpokenFormComponentMap ( spokenFormMap ) ;
34
34
35
35
this . primitiveGenerator = new PrimitiveTargetSpokenFormGenerator (
36
36
this . spokenFormMap ,
@@ -40,25 +40,41 @@ export class SpokenFormGenerator {
40
40
/**
41
41
* Given a command, generates its spoken form.
42
42
* @param command The command to generate a spoken form for
43
- * @returns The spoken form of the command, or null if the command has no spoken
44
- * form
43
+ * @returns The spoken form of the command
45
44
*/
46
- command ( command : CommandComplete ) : SpokenForm {
45
+ processCommand ( command : CommandComplete ) : SpokenForm {
47
46
return this . componentsToSpokenForm ( ( ) => this . handleAction ( command . action ) ) ;
48
47
}
49
48
50
49
/**
51
- * Given a command, generates its spoken form.
52
- * @param command The command to generate a spoken form for
53
- * @returns The spoken form of the command, or null if the command has no spoken
54
- * form
50
+ * Given a scope type, generates its spoken form.
51
+ * @param scopeType The scope type to generate a spoken form for
52
+ * @returns The spoken form of the scope type
55
53
*/
56
- scopeType ( scopeType : ScopeType ) : SpokenForm {
54
+ processScopeType ( scopeType : ScopeType ) : SpokenForm {
57
55
return this . componentsToSpokenForm ( ( ) => [
58
56
this . primitiveGenerator . handleScopeType ( scopeType ) ,
59
57
] ) ;
60
58
}
61
59
60
+ /**
61
+ * Given a function that returns a spoken form component, generates a spoken
62
+ * form for that component by flattening the component and performing a
63
+ * cartesian product over any elements that have multiple ways to be spoken.
64
+ * Note that this spoken form object can correspond to multiple actual spoken
65
+ * forms, consisting of a preferred spoken form and a list of alternative
66
+ * spoken forms.
67
+ *
68
+ * Note that today, we arbitrarily choose the first spoken form as the
69
+ * preferred spoken form, and the rest as alternative spoken forms.
70
+ *
71
+ * If the function throws a {@link NoSpokenFormError}, returns an error spoken
72
+ * form object instead.
73
+ *
74
+ * @param getComponents A function that returns the components to generate a
75
+ * spoken form for
76
+ * @returns A spoken form for the given components
77
+ */
62
78
private componentsToSpokenForm (
63
79
getComponents : ( ) => SpokenFormComponent ,
64
80
) : SpokenForm {
@@ -256,9 +272,11 @@ function constructSpokenForms(component: SpokenFormComponent): string[] {
256
272
const componentInfo = `${ camelCaseToAllDown (
257
273
component . spokenFormType ,
258
274
) } with id ${ component . id } `;
275
+
259
276
const helpInfo = component . spokenForms . isSecret
260
277
? "this is a secret spoken form currently only for internal experimentation"
261
278
: "please see https://www.cursorless.org/docs/user/customization/ for more information" ;
279
+
262
280
throw new NoSpokenFormError (
263
281
`${ componentInfo } ; ${ helpInfo } ` ,
264
282
component . spokenForms . requiresTalonUpdate ,
0 commit comments