Fix the issue with leading trigger word not being removed in case of the trigger word available at both leading and trailing position.

This commit is contained in:
Beingpax 2025-09-18 13:21:22 +05:45
parent 2157a9c2f7
commit b55fa981bd

View File

@ -20,9 +20,9 @@ class PromptDetectionService {
let originalEnhancementState = enhancementService.isEnhancementEnabled
let originalPromptId = enhancementService.selectedPromptId
for prompt in enhancementService.allPrompts {
for prompt in enhancementService.allPrompts {
if !prompt.triggerWords.isEmpty {
if let (detectedWord, processedText) = findMatchingTriggerWord(from: text, triggerWords: prompt.triggerWords) {
if let (detectedWord, processedText) = detectAndStripTriggerWord(from: text, triggerWords: prompt.triggerWords) {
return PromptDetectionResult(
shouldEnableAI: true,
selectedPromptId: prompt.id,
@ -75,7 +75,7 @@ class PromptDetectionService {
}
}
private func removeTriggerWord(from text: String, triggerWord: String) -> String? {
private func stripLeadingTriggerWord(from text: String, triggerWord: String) -> String? {
let trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines)
let lowerText = trimmedText.lowercased()
let lowerTrigger = triggerWord.lowercased()
@ -84,6 +84,13 @@ class PromptDetectionService {
let triggerEndIndex = trimmedText.index(trimmedText.startIndex, offsetBy: triggerWord.count)
if triggerEndIndex < trimmedText.endIndex {
let charAfterTrigger = trimmedText[triggerEndIndex]
if charAfterTrigger.isLetter || charAfterTrigger.isNumber {
return nil
}
}
if triggerEndIndex >= trimmedText.endIndex {
return ""
}
@ -105,7 +112,7 @@ class PromptDetectionService {
return remainingText
}
private func removeTrailingTriggerWord(from text: String, triggerWord: String) -> String? {
private func stripTrailingTriggerWord(from text: String, triggerWord: String) -> String? {
var trimmedText = text.trimmingCharacters(in: .whitespacesAndNewlines)
let punctuationSet = CharacterSet(charactersIn: ",.!?;:")
@ -142,24 +149,30 @@ class PromptDetectionService {
return remainingText
}
private func findMatchingTriggerWord(from text: String, triggerWords: [String]) -> (String, String)? {
private func detectAndStripTriggerWord(from text: String, triggerWords: [String]) -> (String, String)? {
let trimmedWords = triggerWords.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
// 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)
}
}
return nil
for triggerWord in sortedTriggerWords {
if let afterTrailing = stripTrailingTriggerWord(from: text, triggerWord: triggerWord) {
if let afterBoth = stripLeadingTriggerWord(from: afterTrailing, triggerWord: triggerWord) {
return (triggerWord, afterBoth)
}
return (triggerWord, afterTrailing)
}
}
for triggerWord in sortedTriggerWords {
if let afterLeading = stripLeadingTriggerWord(from: text, triggerWord: triggerWord) {
if let afterBoth = stripTrailingTriggerWord(from: afterLeading, triggerWord: triggerWord) {
return (triggerWord, afterBoth)
}
return (triggerWord, afterLeading)
}
}
return nil
}
}