@@ -19,18 +19,18 @@ import { getRangeConnective } from "./getRangeConnective";
1919import { SpokenFormMap } from "../SpokenFormMap" ;
2020import { PrimitiveTargetSpokenFormGenerator } from "./primitiveTargetToSpokenForm" ;
2121import {
22- GeneratorSpokenFormMap ,
23- SpokenFormComponent ,
24- getGeneratorSpokenForms ,
25- } from "./GeneratorSpokenFormMap " ;
22+ SpokenFormComponentMap ,
23+ getSpokenFormComponentMap ,
24+ } from "./getSpokenFormComponentMap" ;
25+ import { SpokenFormComponent } from "./SpokenFormComponent " ;
2626import { SpokenForm } from "@cursorless/common" ;
2727
2828export class SpokenFormGenerator {
2929 private primitiveGenerator : PrimitiveTargetSpokenFormGenerator ;
30- private spokenFormMap : GeneratorSpokenFormMap ;
30+ private spokenFormMap : SpokenFormComponentMap ;
3131
3232 constructor ( spokenFormMap : SpokenFormMap ) {
33- this . spokenFormMap = getGeneratorSpokenForms ( spokenFormMap ) ;
33+ this . spokenFormMap = getSpokenFormComponentMap ( spokenFormMap ) ;
3434
3535 this . primitiveGenerator = new PrimitiveTargetSpokenFormGenerator (
3636 this . spokenFormMap ,
@@ -40,25 +40,41 @@ export class SpokenFormGenerator {
4040 /**
4141 * Given a command, generates its spoken form.
4242 * @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
4544 */
46- command ( command : CommandComplete ) : SpokenForm {
45+ processCommand ( command : CommandComplete ) : SpokenForm {
4746 return this . componentsToSpokenForm ( ( ) => this . handleAction ( command . action ) ) ;
4847 }
4948
5049 /**
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
5553 */
56- scopeType ( scopeType : ScopeType ) : SpokenForm {
54+ processScopeType ( scopeType : ScopeType ) : SpokenForm {
5755 return this . componentsToSpokenForm ( ( ) => [
5856 this . primitiveGenerator . handleScopeType ( scopeType ) ,
5957 ] ) ;
6058 }
6159
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+ */
6278 private componentsToSpokenForm (
6379 getComponents : ( ) => SpokenFormComponent ,
6480 ) : SpokenForm {
@@ -256,9 +272,11 @@ function constructSpokenForms(component: SpokenFormComponent): string[] {
256272 const componentInfo = `${ camelCaseToAllDown (
257273 component . spokenFormType ,
258274 ) } with id ${ component . id } `;
259- const helpInfo = component . spokenForms . isSecret
260- ? "this is a secret spoken form currently only for internal experimentation"
275+
276+ const helpInfo = component . spokenForms . isPrivate
277+ ? "this is a private spoken form currently only for internal experimentation"
261278 : "please see https://www.cursorless.org/docs/user/customization/ for more information" ;
279+
262280 throw new NoSpokenFormError (
263281 `${ componentInfo } ; ${ helpInfo } ` ,
264282 component . spokenForms . requiresTalonUpdate ,
0 commit comments