mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 14:32:35 +01:00
Fix crash in spell check - thx Omair :)
This commit is contained in:
parent
25a5d7c1e7
commit
6ad3984c7b
@ -8538,74 +8538,76 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
|
|
||||||
public void CorrectWord(string changeWord, Paragraph p, string oldWord, ref bool firstChange, int wordIndex)
|
public void CorrectWord(string changeWord, Paragraph p, string oldWord, ref bool firstChange, int wordIndex)
|
||||||
{
|
{
|
||||||
if (oldWord != changeWord)
|
if (oldWord == changeWord)
|
||||||
{
|
{
|
||||||
if (firstChange)
|
return;
|
||||||
{
|
}
|
||||||
MakeHistoryForUndo(_language.BeforeSpellCheck);
|
|
||||||
firstChange = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
int startIndex = p.Text.IndexOf(oldWord, StringComparison.Ordinal);
|
if (firstChange)
|
||||||
if (wordIndex >= 0)
|
{
|
||||||
{
|
MakeHistoryForUndo(_language.BeforeSpellCheck);
|
||||||
startIndex = p.Text.IndexOf(oldWord, GetPositionFromWordIndex(p.Text, wordIndex), StringComparison.Ordinal);
|
firstChange = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (startIndex >= 0 && startIndex < p.Text.Length && p.Text.Substring(startIndex).Contains(oldWord))
|
int startIndex = p.Text.IndexOf(oldWord, StringComparison.Ordinal);
|
||||||
|
if (wordIndex >= 0)
|
||||||
|
{
|
||||||
|
startIndex = p.Text.IndexOf(oldWord, GetPositionFromWordIndex(p.Text, wordIndex), StringComparison.Ordinal);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (startIndex >= 0 && startIndex < p.Text.Length && p.Text.Substring(startIndex).Contains(oldWord))
|
||||||
|
{
|
||||||
|
bool startOk = startIndex == 0 ||
|
||||||
|
"«»“” <>-—+/'\"[](){}¿¡….,;:!?%&$£\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00A0\u200B\uFEFF".Contains(p.Text[startIndex - 1]) ||
|
||||||
|
char.IsPunctuation(p.Text[startIndex - 1]) ||
|
||||||
|
startIndex == p.Text.Length - oldWord.Length;
|
||||||
|
if (startOk)
|
||||||
{
|
{
|
||||||
bool startOk = startIndex == 0 ||
|
int end = startIndex + oldWord.Length;
|
||||||
"«»“” <>-—+/'\"[](){}¿¡….,;:!?%&$£\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00A0\u200B\uFEFF".Contains(p.Text[startIndex - 1]) ||
|
if (end == p.Text.Length ||
|
||||||
char.IsPunctuation(p.Text[startIndex - 1]) ||
|
"«»“” ,.!?:;'()<>\"-—+/[]{}%&$£…\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00A0\u200B\uFEFF".Contains(p.Text[end]) ||
|
||||||
startIndex == p.Text.Length - oldWord.Length;
|
char.IsPunctuation(p.Text[end]))
|
||||||
if (startOk)
|
|
||||||
{
|
{
|
||||||
int end = startIndex + oldWord.Length;
|
var endOk = true;
|
||||||
if (end == p.Text.Length ||
|
|
||||||
"«»“” ,.!?:;'()<>\"-—+/[]{}%&$£…\r\n؛،؟\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u00A0\u200B\uFEFF".Contains(p.Text[end]) ||
|
if (changeWord.EndsWith('\'') && end < p.Text.Length && p.Text[end] == '\'')
|
||||||
char.IsPunctuation(p.Text[end]))
|
|
||||||
{
|
{
|
||||||
var endOk = true;
|
endOk = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (changeWord.EndsWith('\'') && p.Text[end] == '\'')
|
if (endOk)
|
||||||
|
{
|
||||||
|
var lengthBefore = p.Text.Length;
|
||||||
|
p.Text = p.Text.Remove(startIndex, oldWord.Length).Insert(startIndex, changeWord);
|
||||||
|
var lengthAfter = p.Text.Length;
|
||||||
|
if (lengthAfter > lengthBefore)
|
||||||
{
|
{
|
||||||
endOk = false;
|
startIndex += (lengthAfter - lengthBefore);
|
||||||
}
|
|
||||||
|
|
||||||
if (endOk)
|
|
||||||
{
|
|
||||||
var lengthBefore = p.Text.Length;
|
|
||||||
p.Text = p.Text.Remove(startIndex, oldWord.Length).Insert(startIndex, changeWord);
|
|
||||||
var lengthAfter = p.Text.Length;
|
|
||||||
if (lengthAfter > lengthBefore)
|
|
||||||
{
|
|
||||||
startIndex += (lengthAfter - lengthBefore);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startIndex + 2 >= p.Text.Length)
|
|
||||||
{
|
|
||||||
startIndex = -1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
startIndex = p.Text.IndexOf(oldWord, startIndex + 2, StringComparison.Ordinal);
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop if using index
|
|
||||||
if (wordIndex >= 0)
|
|
||||||
{
|
|
||||||
startIndex = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowStatus(string.Format(_language.SpellCheckChangedXToY, oldWord, changeWord));
|
if (startIndex + 2 >= p.Text.Length)
|
||||||
SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text);
|
{
|
||||||
UpdateSourceView();
|
startIndex = -1;
|
||||||
RefreshSelectedParagraph();
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
startIndex = p.Text.IndexOf(oldWord, startIndex + 2, StringComparison.Ordinal);
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop if using index
|
||||||
|
if (wordIndex >= 0)
|
||||||
|
{
|
||||||
|
startIndex = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ShowStatus(string.Format(_language.SpellCheckChangedXToY, oldWord, changeWord));
|
||||||
|
SubtitleListview1.SetText(_subtitle.GetIndex(p), p.Text);
|
||||||
|
UpdateSourceView();
|
||||||
|
RefreshSelectedParagraph();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GetDictionariesToolStripMenuItem_Click(object sender, EventArgs e)
|
private void GetDictionariesToolStripMenuItem_Click(object sender, EventArgs e)
|
||||||
|
Loading…
Reference in New Issue
Block a user