mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 22:42:38 +01:00
Fix common errors improved a bit - thx Trottel :)
git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@1040 99eadd0c-20b8-1223-b5c4-2a2b2df33de2
This commit is contained in:
parent
fc97234f1c
commit
c965a03544
@ -2,6 +2,7 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
@ -51,21 +52,21 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
readonly LanguageStructure.General _languageGeneral;
|
readonly LanguageStructure.General _languageGeneral;
|
||||||
private bool _hasFixesBeenMade;
|
private bool _hasFixesBeenMade;
|
||||||
|
|
||||||
static Regex fixMissingSpacesReComma = new Regex(@"[^\s\d],[^\s]", RegexOptions.Compiled);
|
static readonly Regex fixMissingSpacesReComma = new Regex(@"[^\s\d],[^\s]", RegexOptions.Compiled);
|
||||||
static Regex fixMissingSpacesRePeriod = new Regex(@"[a-z][.][a-zA-Z]", RegexOptions.Compiled);
|
static readonly Regex fixMissingSpacesRePeriod = new Regex(@"[a-z][.][a-zA-Z]", RegexOptions.Compiled);
|
||||||
static Regex fixMissingSpacesReQuestionMark = new Regex(@"[^\s\d]\?[a-zA-Z]", RegexOptions.Compiled);
|
static readonly Regex fixMissingSpacesReQuestionMark = new Regex(@"[^\s\d]\?[a-zA-Z]", RegexOptions.Compiled);
|
||||||
static Regex fixMissingSpacesReExclamation = new Regex(@"[^\s\d]\![a-zA-Z]", RegexOptions.Compiled);
|
static readonly Regex fixMissingSpacesReExclamation = new Regex(@"[^\s\d]\![a-zA-Z]", RegexOptions.Compiled);
|
||||||
static Regex fixMissingSpacesReColon = new Regex(@"[^\s\d]\:[a-zA-Z]", RegexOptions.Compiled);
|
static readonly Regex fixMissingSpacesReColon = new Regex(@"[^\s\d]\:[a-zA-Z]", RegexOptions.Compiled);
|
||||||
static Regex urlCom = new Regex(@"\w\.com\b", RegexOptions.Compiled);
|
static readonly Regex urlCom = new Regex(@"\w\.com\b", RegexOptions.Compiled);
|
||||||
static Regex urlNet = new Regex(@"\w\.net\b", RegexOptions.Compiled);
|
static readonly Regex urlNet = new Regex(@"\w\.net\b", RegexOptions.Compiled);
|
||||||
static Regex urlOrg = new Regex(@"\w\.org\b", RegexOptions.Compiled);
|
static readonly Regex urlOrg = new Regex(@"\w\.org\b", RegexOptions.Compiled);
|
||||||
|
|
||||||
static Regex reAfterLowercaseLetter = new Regex(@"[a-zæøåäöé]I", RegexOptions.Compiled);
|
static readonly Regex reAfterLowercaseLetter = new Regex(@"[a-zæøåäöé]I", RegexOptions.Compiled);
|
||||||
static Regex reBeforeLowercaseLetter = new Regex(@"I[a-zæøåäöé]", RegexOptions.Compiled);
|
static readonly Regex reBeforeLowercaseLetter = new Regex(@"I[a-zæøåäöé]", RegexOptions.Compiled);
|
||||||
|
|
||||||
static Regex removeSpaceBetweenNumbersRegEx = new Regex(@"\d \d", RegexOptions.Compiled);
|
static readonly Regex removeSpaceBetweenNumbersRegEx = new Regex(@"\d \d", RegexOptions.Compiled);
|
||||||
|
|
||||||
static Regex fixAloneLowercaseIToUppercaseIRE = new Regex(@"\bi\b", RegexOptions.Compiled);
|
static readonly Regex fixAloneLowercaseIToUppercaseIRE = new Regex(@"\bi\b", RegexOptions.Compiled);
|
||||||
|
|
||||||
|
|
||||||
class FixItem
|
class FixItem
|
||||||
@ -242,8 +243,8 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
|
|
||||||
if (Screen.PrimaryScreen.WorkingArea.Width <= 124)
|
if (Screen.PrimaryScreen.WorkingArea.Width <= 124)
|
||||||
{
|
{
|
||||||
this.Width = this.MinimumSize.Width;
|
Width = MinimumSize.Width;
|
||||||
this.Height = this.MinimumSize.Height;
|
Height = MinimumSize.Height;
|
||||||
}
|
}
|
||||||
TopMost = true;
|
TopMost = true;
|
||||||
BringToFront();
|
BringToFront();
|
||||||
@ -311,11 +312,11 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
|
|
||||||
private void AddFixActionItemToListView(FixItem fi)
|
private void AddFixActionItemToListView(FixItem fi)
|
||||||
{
|
{
|
||||||
ListViewItem item = new ListViewItem(string.Empty);
|
var item = new ListViewItem(string.Empty);
|
||||||
item.Tag = fi;
|
item.Tag = fi;
|
||||||
item.Checked = fi.DefaultChecked;
|
item.Checked = fi.DefaultChecked;
|
||||||
|
|
||||||
ListViewItem.ListViewSubItem subItem = new ListViewItem.ListViewSubItem(item, fi.Name);
|
var subItem = new ListViewItem.ListViewSubItem(item, fi.Name);
|
||||||
item.SubItems.Add(subItem);
|
item.SubItems.Add(subItem);
|
||||||
subItem = new ListViewItem.ListViewSubItem(item, fi.Example);
|
subItem = new ListViewItem.ListViewSubItem(item, fi.Example);
|
||||||
item.SubItems.Add(subItem);
|
item.SubItems.Add(subItem);
|
||||||
@ -1241,15 +1242,22 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
if (!quote.Contains(Environment.NewLine))
|
if (!quote.Contains(Environment.NewLine))
|
||||||
{
|
{
|
||||||
string newText = p.Text;
|
string newText = p.Text;
|
||||||
|
int indexOfFontTag = newText.ToLower().IndexOf("<font ");
|
||||||
if (start > 0 && !(Environment.NewLine + " >[(♪♫").Contains(p.Text[start - 1].ToString()))
|
if (start > 0 && !(Environment.NewLine + " >[(♪♫").Contains(p.Text[start - 1].ToString()))
|
||||||
|
{
|
||||||
|
if (indexOfFontTag == -1 || start > newText.IndexOf('>', indexOfFontTag)) // font tags can contain "
|
||||||
{
|
{
|
||||||
newText = newText.Insert(start, " ");
|
newText = newText.Insert(start, " ");
|
||||||
end++;
|
end++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (end < newText.Length - 2 && !(Environment.NewLine + " <,.!?:;])♪♫").Contains(p.Text[end + 1].ToString()))
|
if (end < newText.Length - 2 && !(Environment.NewLine + " <,.!?:;])♪♫").Contains(p.Text[end + 1].ToString()))
|
||||||
|
{
|
||||||
|
if (indexOfFontTag == -1 || end > newText.IndexOf('>', indexOfFontTag)) // font tags can contain "
|
||||||
{
|
{
|
||||||
newText = newText.Insert(end + 1, " ");
|
newText = newText.Insert(end + 1, " ");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (newText != p.Text && AllowFix(p, fixAction))
|
if (newText != p.Text && AllowFix(p, fixAction))
|
||||||
{
|
{
|
||||||
_totalFixes++;
|
_totalFixes++;
|
||||||
@ -1714,7 +1722,7 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
Paragraph next = _subtitle.GetParagraphOrDefault(i + 1);
|
Paragraph next = _subtitle.GetParagraphOrDefault(i + 1);
|
||||||
string nextText = string.Empty;
|
string nextText = string.Empty;
|
||||||
if (next != null)
|
if (next != null)
|
||||||
nextText = Utilities.RemoveHtmlTags(next.Text).TrimStart('-').TrimStart();
|
nextText = Utilities.RemoveHtmlTags(next.Text).TrimStart('-').TrimStart('"').TrimStart('„').TrimStart();
|
||||||
string tempNoHtml = Utilities.RemoveHtmlTags(p.Text).TrimEnd();
|
string tempNoHtml = Utilities.RemoveHtmlTags(p.Text).TrimEnd();
|
||||||
|
|
||||||
|
|
||||||
@ -1726,9 +1734,10 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
next.Text.Length > 0 &&
|
next.Text.Length > 0 &&
|
||||||
Utilities.UppercaseLetters.Contains(nextText[0].ToString()) &&
|
Utilities.UppercaseLetters.Contains(nextText[0].ToString()) &&
|
||||||
tempNoHtml.Length > 0 &&
|
tempNoHtml.Length > 0 &&
|
||||||
(!"\",.!?:;>-])♪♫".Contains(tempNoHtml[tempNoHtml.Length - 1].ToString())))
|
(!",.!?:;>-])♪♫".Contains(tempNoHtml[tempNoHtml.Length - 1].ToString())))
|
||||||
{
|
{
|
||||||
if (!tempNoHtml.EndsWith(")") && !tempNoHtml.EndsWith("]") && !tempNoHtml.EndsWith("*") && !tempNoHtml.EndsWith("#") && !tempNoHtml.EndsWith("¶")) // hear impaired
|
if (!tempNoHtml.EndsWith(")") && !tempNoHtml.EndsWith("]") && !tempNoHtml.EndsWith("*") && !tempNoHtml.EndsWith("#") && !tempNoHtml.EndsWith("¶") && // hear impaired
|
||||||
|
!tempNoHtml.EndsWith(".\"") && !tempNoHtml.EndsWith(".“"))
|
||||||
{
|
{
|
||||||
if (p.Text != p.Text.ToUpper())
|
if (p.Text != p.Text.ToUpper())
|
||||||
{
|
{
|
||||||
@ -1749,6 +1758,11 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (p.Text.EndsWith("“") && tempNoHtml.StartsWith("„"))
|
||||||
|
p.Text = p.Text.Trim('“') + ".“";
|
||||||
|
else if (p.Text.EndsWith("\"") && tempNoHtml.StartsWith("\""))
|
||||||
|
p.Text = p.Text.Trim('"') + ".\"";
|
||||||
|
else
|
||||||
p.Text += ".";
|
p.Text += ".";
|
||||||
}
|
}
|
||||||
if (p.Text != oldText)
|
if (p.Text != oldText)
|
||||||
@ -2467,13 +2481,18 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
string oldText = p.Text;
|
string oldText = p.Text;
|
||||||
|
|
||||||
string newText = p.Text;
|
string newText = p.Text;
|
||||||
|
string noTagsText = Utilities.RemoveHtmlTags(newText);
|
||||||
foreach (string musicSymbol in musicSymbols)
|
foreach (string musicSymbol in musicSymbols)
|
||||||
{
|
{
|
||||||
newText = newText.Replace(musicSymbol, Configuration.Settings.Tools.MusicSymbol);
|
newText = newText.Replace(musicSymbol, Configuration.Settings.Tools.MusicSymbol);
|
||||||
newText = newText.Replace(musicSymbol.ToUpper(), Configuration.Settings.Tools.MusicSymbol);
|
newText = newText.Replace(musicSymbol.ToUpper(), Configuration.Settings.Tools.MusicSymbol);
|
||||||
|
noTagsText = noTagsText.Replace(musicSymbol, Configuration.Settings.Tools.MusicSymbol);
|
||||||
|
noTagsText = noTagsText.Replace(musicSymbol.ToUpper(), Configuration.Settings.Tools.MusicSymbol);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!newText.Equals(oldText))
|
if (!newText.Equals(oldText))
|
||||||
|
{
|
||||||
|
if (!noTagsText.Equals(Utilities.RemoveHtmlFontTag(oldText)))
|
||||||
{
|
{
|
||||||
if (AllowFix(p, fixAction))
|
if (AllowFix(p, fixAction))
|
||||||
{
|
{
|
||||||
@ -2484,6 +2503,7 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (fixCount > 0)
|
if (fixCount > 0)
|
||||||
LogStatus(_language.FixMusicNotation, string.Format(_language.XFixMusicNotation, fixCount));
|
LogStatus(_language.FixMusicNotation, string.Format(_language.XFixMusicNotation, fixCount));
|
||||||
}
|
}
|
||||||
@ -3611,6 +3631,178 @@ namespace Nikse.SubtitleEdit.Forms
|
|||||||
Utilities.ShowHelp("#fixcommonerrors");
|
Utilities.ShowHelp("#fixcommonerrors");
|
||||||
else if (e.KeyCode == Keys.Enter && buttonNextFinish.Text == _language.Next)
|
else if (e.KeyCode == Keys.Enter && buttonNextFinish.Text == _language.Next)
|
||||||
ButtonFixClick(null, null);
|
ButtonFixClick(null, null);
|
||||||
|
else if (e.Modifiers == Keys.Control && e.KeyCode == Keys.P && listViewFixes.Items.Count > 0)
|
||||||
|
GenerateDiff();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GenerateDiff()
|
||||||
|
{
|
||||||
|
string htmlFileName = Path.GetTempFileName() + ".html";
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.Append("<html><head><meta charset='utf-8'><title>Subtitle Edit - Fix common errors preview</title><style>body,p,td {font-size:90%; font-family:Tahoma;} td {border:1px solid black;padding:5px} table {border-collapse: collapse;}</style></head><body><table><tbody>");
|
||||||
|
sb.AppendLine(string.Format("<tr><td style='font-weight:bold'>{0}</td><td style='font-weight:bold'>{1}</td><td style='font-weight:bold'>{2}</td><td style='font-weight:bold'>{3}</td></tr>", _language.LineNumber, _language.Function, _language.Before, _language.After));
|
||||||
|
foreach (ListViewItem item in listViewFixes.Items)
|
||||||
|
{
|
||||||
|
if (item.Checked)
|
||||||
|
{
|
||||||
|
var p = (Paragraph) item.Tag;
|
||||||
|
string what = item.SubItems[2].Text;
|
||||||
|
string before = item.SubItems[3].Text;
|
||||||
|
string after = item.SubItems[4].Text;
|
||||||
|
var arr = MakeDiffHtml(before, after);
|
||||||
|
sb.AppendLine(string.Format("<tr><td>{0}</td><td>{1}</td><td><pre>{2}</pre></td><td><pre>{3}</pre></td></tr>", p.Number, what, arr[0], arr[1]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.Append("</table></body></html>");
|
||||||
|
File.WriteAllText(htmlFileName, sb.ToString());
|
||||||
|
System.Diagnostics.Process.Start(htmlFileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string[] MakeDiffHtml(string before, string after)
|
||||||
|
{
|
||||||
|
|
||||||
|
before = before.Replace("<br />", "↲");
|
||||||
|
after = after.Replace("<br />", "↲");
|
||||||
|
before = before.Replace(Environment.NewLine, "↲");
|
||||||
|
after = after.Replace(Environment.NewLine, "↲");
|
||||||
|
|
||||||
|
var beforeColors = new Dictionary<int, Color>();
|
||||||
|
var beforeBackgroundColors = new Dictionary<int, Color>();
|
||||||
|
var afterColors = new Dictionary<int, Color>();
|
||||||
|
var afterBackgroundColors = new Dictionary<int, Color>();
|
||||||
|
|
||||||
|
// from start
|
||||||
|
int minLength = Math.Min(before.Length, after.Length);
|
||||||
|
int startCharactersOk = 0;
|
||||||
|
for (int i=0; i < minLength; i++)
|
||||||
|
{
|
||||||
|
if (before[i] == after[i])
|
||||||
|
{
|
||||||
|
startCharactersOk++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (before.Length > i + 4 && after.Length > i + 4 &&
|
||||||
|
before[i + 1] == after[i + 1] &&
|
||||||
|
before[i + 2] == after[i + 2] &&
|
||||||
|
before[i + 3] == after[i + 3] &&
|
||||||
|
before[i + 4] == after[i + 4])
|
||||||
|
{
|
||||||
|
startCharactersOk++;
|
||||||
|
|
||||||
|
if (before.Substring(i, 1).Trim().Length == 0)
|
||||||
|
beforeBackgroundColors.Add(i, Color.Red);
|
||||||
|
else
|
||||||
|
beforeColors.Add(i, Color.Red);
|
||||||
|
|
||||||
|
if (after.Substring(i, 1).Trim().Length == 0)
|
||||||
|
afterBackgroundColors.Add(i, Color.Red);
|
||||||
|
else
|
||||||
|
afterColors.Add(i, Color.Red);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int maxLength = Math.Max(before.Length, after.Length);
|
||||||
|
for (int i = startCharactersOk; i <= maxLength; i++)
|
||||||
|
{
|
||||||
|
if (i < before.Length)
|
||||||
|
{
|
||||||
|
if (before.Substring(i, 1).Trim().Length == 0)
|
||||||
|
beforeBackgroundColors.Add(i, Color.Red);
|
||||||
|
else
|
||||||
|
beforeColors.Add(i, Color.Red);
|
||||||
|
}
|
||||||
|
if (i < after.Length)
|
||||||
|
{
|
||||||
|
if (after.Substring(i, 1).Trim().Length == 0)
|
||||||
|
afterBackgroundColors.Add(i, Color.Red);
|
||||||
|
else
|
||||||
|
afterColors.Add(i, Color.Red);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// from end
|
||||||
|
for (int i = 1; i < minLength; i++)
|
||||||
|
{
|
||||||
|
int bLength = before.Length - i;
|
||||||
|
int aLength = after.Length - i;
|
||||||
|
if (before[bLength] == after[aLength])
|
||||||
|
{
|
||||||
|
if (beforeColors.ContainsKey(bLength))
|
||||||
|
beforeColors.Remove(bLength);
|
||||||
|
if (beforeBackgroundColors.ContainsKey(bLength))
|
||||||
|
beforeBackgroundColors.Remove(bLength);
|
||||||
|
|
||||||
|
if (afterColors.ContainsKey(aLength))
|
||||||
|
afterColors.Remove(aLength);
|
||||||
|
if (afterBackgroundColors.ContainsKey(aLength))
|
||||||
|
afterBackgroundColors.Remove(aLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (i == 0 && i > 4 &&
|
||||||
|
before[before.Length - (i + 1)] == after[after.Length - (i + 1)] &&
|
||||||
|
before[before.Length - (i + 2)] == after[after.Length - (i + 2)] &&
|
||||||
|
before[before.Length - (i + 3)] == after[after.Length - (i + 3)] &&
|
||||||
|
before[before.Length - (i + 4)] == after[after.Length - (i + 4)])
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
for (int i=0; i<before.Length; i++)
|
||||||
|
{
|
||||||
|
string s = before.Substring(i, 1);
|
||||||
|
if (beforeColors.ContainsKey(i) && beforeBackgroundColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb.Append(string.Format("<span style=\"color:{0}; background-color: {1}\">{2}</span>", ColorTranslator.ToHtml(beforeColors[i]), ColorTranslator.ToHtml(beforeBackgroundColors[i]), s));
|
||||||
|
}
|
||||||
|
else if (beforeColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb.Append(string.Format("<span style=\"color:{0}; \">{1}</span>", ColorTranslator.ToHtml(beforeColors[i]), s));
|
||||||
|
}
|
||||||
|
else if (beforeBackgroundColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb.Append(string.Format("<span style=\"background-color: {0}\">{1}</span>", ColorTranslator.ToHtml(beforeBackgroundColors[i]), s));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb.Append(before.Substring(i, 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var sb2 = new StringBuilder();
|
||||||
|
for (int i=0; i<after.Length; i++)
|
||||||
|
{
|
||||||
|
string s = after.Substring(i, 1);
|
||||||
|
if (afterColors.ContainsKey(i) && afterBackgroundColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb2.Append(string.Format("<span style=\"color:{0}; background-color: {1}\">{2}</span>", ColorTranslator.ToHtml(afterColors[i]), ColorTranslator.ToHtml(afterBackgroundColors[i]), s));
|
||||||
|
}
|
||||||
|
else if (afterColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb2.Append(string.Format("<span style=\"color:{0}; \">{1}</span>", ColorTranslator.ToHtml(afterColors[i]), s));
|
||||||
|
}
|
||||||
|
else if (afterBackgroundColors.ContainsKey(i))
|
||||||
|
{
|
||||||
|
sb2.Append(string.Format("<span style=\"background-color: {0}\">{1}</span>", ColorTranslator.ToHtml(afterBackgroundColors[i]), s));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sb2.Append(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new string[] { sb.ToString(), sb2.ToString()};
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SaveConfiguration()
|
private void SaveConfiguration()
|
||||||
|
Loading…
Reference in New Issue
Block a user