feat: add spoken formatting and 1.6.9 fixes - #848
Conversation
…wline) Commit 808a08d changed the manual-entry validation from trimming .whitespaces to .whitespacesAndNewlines, so a replacement consisting of a single pasted newline now trims to empty and the "Add Replacement" button stays disabled. The replacement engine itself handles such entries fine (escapedTemplate inserts them verbatim), so this was purely a UI regression. Introduce CustomDictionaryManualEntry.sanitizedReplacement: trim surrounding whitespace as before, but keep a replacement that is *entirely* whitespace verbatim — pasting a newline, space, or tab is a deliberate payload, not accidental padding. Use it in the manual composer and the edit sheet (which still used the pre-808a08d .whitespaces trim, inconsistently). Whitespace-only replacements render as blank text, so display them as symbols (⏎ ␣ ⇥) in the composer preview, edit-sheet preview, and dictionary entry rows via replacementDisplayText. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The PR Policy check is blocking this PR because required template information is missing. Please update the PR description with:
Visual files detected:
Screenshots or video are required for UI, UX, settings, onboarding, overlay, menu bar, or visual behavior changes. If this PR has no visual changes, check the no-visual-change box in the template. If this remains incomplete for 48 hours after opening, the PR may be closed. |
Greptile SummaryAdds configurable spoken-formatting actions alongside punctuation rules and restores whitespace-only custom-dictionary replacements. It also persists the new settings, updates dictionary import/API paths and UI, and refines microphone alerts and wired-microphone selection in clamshell mode.
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 46dd7c84a5
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| else { | ||
| return Self.defaultSpokenFormattingActionRules |
There was a problem hiding this comment.
Normalize default action aliases against punctuation rules
For existing installations without SpokenFormattingActionRules data, this fallback returns the defaults before applying removingDuplicateSpokenFormattingAliases. If a user already has a custom punctuation alias such as new line, next line, tab, or space, the formatter receives two rules for the same phrase and may execute either the existing punctuation rule or the new formatting action. Apply the same collision normalization to the fallback defaults so upgrades preserve customized punctuation behavior.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
there's no way for users to add a newline etc before this update. so very rare or not possible for this to happen.
FluidVoice PR build readyDownload FluidVoice-PR-848-46dd7c84a5ba The artifact contains the ad-hoc-signed app ZIP, Xcode archive, build manifest, and installation instructions. It expires 5 days after the build. Install the app
This build has its own app identity, so its permissions are separate from the release version of FluidVoice. |
Description
Adds a unified Spoken Formatting editor to Custom Dictionary with a shared start word, customizable action phrases, punctuation rules, and fixed actions for new lines, paragraphs, tabs, and spaces.
Also restores whitespace-only dictionary replacements from #842, groups existing text-formatting settings, and includes the microphone alert and clamshell wired-microphone fixes intended for 1.6.9.
Type of Change
Related Issue or Discussion
Closes #841.
Builds on #842. The original whitespace-replacement fix and authorship from @nsutcliffe are preserved in the branch history.
Testing
swiftlint --strict --config .swiftlint.yml Sourcesswiftformat --config .swiftformat SourcesScreenshots / Video
Notes