From 03e1f7383e36eb0761642daa2c71aef1bdbb303c Mon Sep 17 00:00:00 2001 From: Beingpax Date: Tue, 17 Jun 2025 21:20:27 +0545 Subject: [PATCH] feat: Add support for trailing trigger words --- .../Services/PromptDetectionService.swift | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/VoiceInk/Services/PromptDetectionService.swift b/VoiceInk/Services/PromptDetectionService.swift index 779bfe0..66b7ca3 100644 --- a/VoiceInk/Services/PromptDetectionService.swift +++ b/VoiceInk/Services/PromptDetectionService.swift @@ -105,6 +105,43 @@ class PromptDetectionService { return remainingText } + private func removeTrailingTriggerWord(from text: String, triggerWord: String) -> String? { + var trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines) + + let punctuationSet = CharacterSet(charactersIn: ",.!?;:") + while let scalar = trimmedText.unicodeScalars.last, punctuationSet.contains(scalar) { + trimmedText.removeLast() + } + + let lowerText = trimmedText.lowercased() + let lowerTrigger = triggerWord.lowercased().trimmingCharacters(in: .whitespacesAndNewlines) + + guard lowerText.hasSuffix(lowerTrigger) else { return nil } + + let triggerStartIndex = trimmedText.index(trimmedText.endIndex, offsetBy: -triggerWord.count) + if triggerStartIndex > trimmedText.startIndex { + let charBeforeTrigger = trimmedText[trimmedText.index(before: triggerStartIndex)] + if charBeforeTrigger.isLetter || charBeforeTrigger.isNumber { + return nil + } + } + + var remainingText = String(trimmedText[.. (String, String)? { let trimmedWords = triggerWords.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) } .filter { !$0.isEmpty } @@ -112,6 +149,12 @@ class PromptDetectionService { // Sort by length (longest first) to match the most specific trigger word let sortedTriggerWords = trimmedWords.sorted { $0.count > $1.count } + for triggerWord in sortedTriggerWords { + if let processedText = removeTrailingTriggerWord(from: text, triggerWord: triggerWord) { + return (triggerWord, processedText) + } + } + for triggerWord in sortedTriggerWords { if let processedText = removeTriggerWord(from: text, triggerWord: triggerWord) { return (triggerWord, processedText)