diff --git a/internal/presentation/presentation.go b/internal/presentation/presentation.go index 88a6d95..1a27e84 100644 --- a/internal/presentation/presentation.go +++ b/internal/presentation/presentation.go @@ -166,7 +166,7 @@ func FocusSpeechWithOptions(snapshot atspi.Snapshot, options Options) Speech { fields = append(fields, fmt.Sprintf("%d of %d", snapshot.PositionInSet, snapshot.SetSize)) } if reading.EnableMnemonicSpeaking && snapshot.Mnemonic != "" { - fields = append(fields, snapshot.Mnemonic) + fields = append(fields, spokenMnemonic(snapshot.Mnemonic)) } if reading.EnableTutorialMessages { fields = append(fields, control_tutorial(snapshot)) @@ -185,6 +185,12 @@ func FocusSpeechWithOptions(snapshot atspi.Snapshot, options Options) Speech { return SpeechWithOptions(parts, options) } +func spokenMnemonic(value string) string { + value = strings.ReplaceAll(value, "<", "") + value = strings.ReplaceAll(value, ">", " ") + return strings.Join(strings.Fields(value), " ") +} + func removeReplacedState(states []string) []string { for index, state := range states { switch state { diff --git a/internal/presentation/reading_test.go b/internal/presentation/reading_test.go index 03d7953..abb37da 100644 --- a/internal/presentation/reading_test.go +++ b/internal/presentation/reading_test.go @@ -48,6 +48,20 @@ func TestReadingPreferencesChangeControlOutput(t *testing.T) { } } +func TestMnemonicSpeechFiltersAngleBracketsWithoutChangingNames(t *testing.T) { + settings := config.DefaultSettings() + settings.Reading.EnableMnemonicSpeaking = true + options := DefaultOptions() + options.Reading = &settings.Reading + snapshot := atspi.Snapshot{Name: "o", Role: "button", Mnemonic: "o"} + want := "o, button, Alt o" + for settings.VerbalizePunctuationStyle = 0; settings.VerbalizePunctuationStyle <= 3; settings.VerbalizePunctuationStyle++ { + if got := FocusTextWithOptions(snapshot, options); got != want { + t.Fatalf("punctuation style %d = %q, want %q", settings.VerbalizePunctuationStyle, got, want) + } + } +} + func TestDocumentAndSpreadsheetFullRowsUseIndependentFlags(t *testing.T) { reading := config.DefaultSettings().Reading options := DefaultOptions()