Я хочу выделить различия текста между двумя строками.Первая строка - правильная строка, вторая - введенная пользователем строка.Он показывает орфографические и грамматические ошибки между ними.Пример ниже
У меня есть решение, которое проверяет каждое слово, затем каждую букву, оно работает в некоторой степени, но не в каждом случае.Есть ли лучший способ сделать это?
Еще один пример, когда он не работает должным образом.
"The" долженбыть полностью красным, у солдат просто «я» и «с» должны быть красным.Все "в" должно быть красным.
func colorTextDiff(correctStr:String, answerText:String) -> NSAttributedString {
var hintTextIndex = 0
let attribute = NSMutableAttributedString.init(string: correctStr)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.black , range: NSRange.init(location: 0, length: correctStr.count))
attribute.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize:14.0), range: NSRange.init(location: 0, length: correctStr.count))
let correctWords = correctStr.split(separator: " ")
var answerWords = answerText.split(separator: " ")
var answerWordIndex = 0
//match on words, when a word doesnt match test the word's character
for correctWord in correctWords {
if answerWordIndex>=answerWords.count { break}
let answerWord = answerWords[answerWordIndex]
var wrongChar = 0, answerCharIndex = 0
print("words ", correctWord, " ", answerWord)
if correctWord.lowercased() != answerWord.lowercased() {
for c in correctWord {
if answerCharIndex>=answerWord.count {
let len = correctWord.count-answerCharIndex
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: NSRange.init(location: hintTextIndex, length: len))
hintTextIndex += len+1
break
}
let correctChar = String(c)
let answerChar = String(answerWord)[answerCharIndex..<answerCharIndex+1]
print("chars ", correctChar, " ", answerChar)
if correctChar.lowercased() != answerChar.lowercased() {
print("hint index: ", hintTextIndex)
attribute.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red , range: NSRange.init(location: hintTextIndex+1, length: 1))
wrongChar+=1
}
answerCharIndex+=1
hintTextIndex+=1
}
} else {
hintTextIndex += correctWord.count+1
}
if(wrongChar<correctWord.count) {answerWordIndex+=1 } //probably a missed word not missed typed word
}
hintTextIndex+=1
return attribute
}