Simplify the import logic for dictionary

This commit is contained in:
Beingpax 2025-11-14 11:12:41 +05:45
parent 7d12c50fcb
commit fb69db2fe9

View File

@ -110,48 +110,45 @@ class DictionaryImportExportService {
}
var existingReplacements = UserDefaults.standard.dictionary(forKey: self.wordReplacementsKey) as? [String: String] ?? [:]
var addedCount = 0
var updatedCount = 0
var replacementToOriginals: [String: Set<String>] = [:]
for (importedKey, importedReplacement) in importedData.wordReplacements {
let normalizedImportedKey = self.normalizeReplacementKey(importedKey)
let importedWords = self.extractWords(from: normalizedImportedKey)
for (originals, replacement) in existingReplacements {
let replacementLower = replacement.lowercased()
let words = originals.split(separator: ",").map { $0.trimmingCharacters(in: .whitespaces) }
replacementToOriginals[replacementLower, default: []].formUnion(words)
}
var modifiedExisting: [String: String] = [:]
for (existingKey, existingReplacement) in existingReplacements {
var existingWords = self.extractWords(from: existingKey)
var modified = false
for (originals, replacement) in importedData.wordReplacements {
let replacementLower = replacement.lowercased()
let words = originals.split(separator: ",").map { $0.trimmingCharacters(in: .whitespaces) }
replacementToOriginals[replacementLower, default: []].formUnion(words)
}
var mergedReplacements: [String: String] = [:]
for (replacementLower, originals) in replacementToOriginals {
var uniqueOriginals: [String] = []
var seenLower = Set<String>()
for original in originals {
let originalLower = original.lowercased()
if !seenLower.contains(originalLower) {
uniqueOriginals.append(original)
seenLower.insert(originalLower)
for importedWord in importedWords {
if let index = existingWords.firstIndex(where: { $0.lowercased() == importedWord.lowercased() }) {
existingWords.remove(at: index)
modified = true
}
}
let mergedKey = uniqueOriginals.sorted().joined(separator: ", ")
let replacement = existingReplacements.first(where: { $0.value.lowercased() == replacementLower })?.value
?? importedData.wordReplacements.first(where: { $0.value.lowercased() == replacementLower })?.value
?? replacementLower
mergedReplacements[mergedKey] = replacement
if !existingWords.isEmpty {
let newKey = existingWords.joined(separator: ", ")
modifiedExisting[newKey] = existingReplacement
}
UserDefaults.standard.set(mergedReplacements, forKey: self.wordReplacementsKey)
if modified {
updatedCount += 1
}
}
existingReplacements = modifiedExisting
existingReplacements[normalizedImportedKey] = importedReplacement
addedCount += 1
}
UserDefaults.standard.set(existingReplacements, forKey: self.wordReplacementsKey)
var message = "Dictionary data imported successfully from \(url.lastPathComponent).\n\n"
message += "Dictionary Items: \(newWordsAdded) added, \(originalExistingCount) kept\n"
message += "Word Replacements: Merged into \(mergedReplacements.count) total rules"
message += "Word Replacements: \(addedCount) added, \(updatedCount) updated"
self.showAlert(title: "Import Successful", message: message)
@ -164,6 +161,18 @@ class DictionaryImportExportService {
}
}
private func normalizeReplacementKey(_ key: String) -> String {
let words = extractWords(from: key)
return words.joined(separator: ", ")
}
private func extractWords(from key: String) -> [String] {
return key
.split(separator: ",")
.map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
.filter { !$0.isEmpty }
}
private func showAlert(title: String, message: String) {
DispatchQueue.main.async {
let alert = NSAlert()