diff --git a/SubtitleEdit.sln.DotSettings b/SubtitleEdit.sln.DotSettings index 5ea2ab6fd..b878fbaf2 100644 --- a/SubtitleEdit.sln.DotSettings +++ b/SubtitleEdit.sln.DotSettings @@ -41,6 +41,7 @@ True True True + True True True True diff --git a/src/libse/Common/Utilities.cs b/src/libse/Common/Utilities.cs index 404b529e4..16eaf2515 100644 --- a/src/libse/Common/Utilities.cs +++ b/src/libse/Common/Utilities.cs @@ -856,7 +856,7 @@ namespace Nikse.SubtitleEdit.Core.Common var excludes = new HashSet(); var languages = Configuration.Settings.General.DefaultLanguages ?? string.Empty; - var languageList = useFilter ? languages.Split(new []{ ';' }, StringSplitOptions.RemoveEmptyEntries) : Array.Empty(); + var languageList = useFilter ? languages.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries) : Array.Empty(); foreach (var ci in CultureInfo.GetCultures(CultureTypes.NeutralCultures)) { @@ -1048,9 +1048,9 @@ namespace Nikse.SubtitleEdit.Core.Common if (word.Length > 0) { var userWordsXmlFileName = DictionaryFolder + languageName + "_user.xml"; - if (!File.Exists(userWordsXmlFileName) && languageName != null && languageName.Length> 2) + if (!File.Exists(userWordsXmlFileName) && languageName != null && languageName.Length > 2) { - var newFileName = DictionaryFolder + languageName.Substring(0,2).ToLowerInvariant() + "_user.xml"; + var newFileName = DictionaryFolder + languageName.Substring(0, 2).ToLowerInvariant() + "_user.xml"; if (File.Exists(newFileName)) { userWordsXmlFileName = newFileName; @@ -1831,7 +1831,7 @@ namespace Nikse.SubtitleEdit.Core.Common var color = text.Substring(start, end - start).TrimStart('\\').TrimStart('1').TrimStart('c'); color = color.RemoveChar('&').TrimStart('H'); color = color.PadLeft(6, '0'); - var c= AdvancedSubStationAlpha.GetSsaColor("h" + color, defaultColor); + var c = AdvancedSubStationAlpha.GetSsaColor("h" + color, defaultColor); // alpha @@ -2971,7 +2971,7 @@ namespace Nikse.SubtitleEdit.Core.Common return true; } - var isLineContinuation = s.EndsWith("...", StringComparison.Ordinal) || + var isLineContinuation = s.EndsWith("...", StringComparison.Ordinal) || (AllLetters + "…,-$%").Contains(s.Substring(s.Length - 1)) || CalcCjk.IsCjk(s[s.Length - 1]); @@ -3124,7 +3124,55 @@ namespace Nikse.SubtitleEdit.Core.Common } } - public static string ToggleSymbols(string tag, string text, string endTag = null) + public static string ToggleSymbols(string tag, string text, string endTag, out bool added) + { + var pre = string.Empty; + var post = string.Empty; + text = SplitStartTags(text, ref pre); + text = SplitEndTags(text, ref post); + + if (!string.IsNullOrEmpty(tag) && text.Contains(tag) || string.IsNullOrEmpty(tag) && !string.IsNullOrEmpty(endTag) && text.Contains(endTag)) + { + if (!string.IsNullOrEmpty(endTag) && !string.IsNullOrEmpty(tag)) + { + text = pre + text.Replace(tag, string.Empty).Replace(endTag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; + } + else if (string.IsNullOrEmpty(endTag) && !string.IsNullOrEmpty(tag)) + { + text = pre + text.Replace(tag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; + } + else if (!string.IsNullOrEmpty(endTag)) + { + text = pre + text.Replace(endTag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; + } + + added = false; + } + else + { + if (tag == Configuration.Settings.Tools.MusicSymbol) + { + if (Configuration.Settings.Tools.MusicSymbolStyle.Equals("single", StringComparison.OrdinalIgnoreCase)) + { + text = string.Format("{0}{1} {2}{3}", pre, tag, text.Replace(Environment.NewLine, Environment.NewLine + tag + " "), post); + } + else + { + text = string.Format("{0}{1} {2} {1}{3}", pre, tag, text.Replace(Environment.NewLine, " " + tag + Environment.NewLine + tag + " "), post); + } + } + else + { + text = string.Format("{0}{1}{2}{3}{4}", pre, tag, text, endTag ?? tag, post); + } + + added = true; + } + + return text; + } + + public static string RemoveSymbols(string tag, string text, string endTag) { var pre = string.Empty; var post = string.Empty; @@ -3146,24 +3194,35 @@ namespace Nikse.SubtitleEdit.Core.Common text = pre + text.Replace(endTag, string.Empty).Replace(Environment.NewLine + " ", Environment.NewLine).Replace(" " + Environment.NewLine, Environment.NewLine).Trim() + post; } } - else + + return text; + } + + + public static string AddSymbols(string tag, string text, string endTag) + { + text = RemoveSymbols(tag, text, endTag); + + var pre = string.Empty; + var post = string.Empty; + text = SplitStartTags(text, ref pre); + text = SplitEndTags(text, ref post); + + if (tag == Configuration.Settings.Tools.MusicSymbol) { - if (tag == Configuration.Settings.Tools.MusicSymbol) + if (Configuration.Settings.Tools.MusicSymbolStyle.Equals("single", StringComparison.OrdinalIgnoreCase)) { - if (Configuration.Settings.Tools.MusicSymbolStyle.Equals("single", StringComparison.OrdinalIgnoreCase)) - { - text = string.Format("{0}{1} {2}{3}", pre, tag, text.Replace(Environment.NewLine, Environment.NewLine + tag + " "), post); - } - else - { - text = string.Format("{0}{1} {2} {1}{3}", pre, tag, text.Replace(Environment.NewLine, " " + tag + Environment.NewLine + tag + " "), post); - } + text = string.Format("{0}{1} {2}{3}", pre, tag, text.Replace(Environment.NewLine, Environment.NewLine + tag + " "), post); } else { - text = string.Format("{0}{1}{2}{3}{4}", pre, tag, text, endTag ?? tag, post); + text = string.Format("{0}{1} {2} {1}{3}", pre, tag, text.Replace(Environment.NewLine, " " + tag + Environment.NewLine + tag + " "), post); } } + else + { + text = string.Format("{0}{1}{2}{3}{4}", pre, tag, text, endTag ?? tag, post); + } return text; } diff --git a/src/ui/Forms/Main.cs b/src/ui/Forms/Main.cs index 37b9df4f1..c6331de4b 100644 --- a/src/ui/Forms/Main.cs +++ b/src/ui/Forms/Main.cs @@ -16625,7 +16625,7 @@ namespace Nikse.SubtitleEdit.Forms // do not check for shortcuts if text is being entered and a textbox is focused var textBoxTypes = new List { "AdvancedTextBox", "SimpleTextBox", "SETextBox", "TextBox", "RichTextBox" }; if (textBoxTypes.Contains(typeName) && - ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || + ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) || (e.KeyCode >= Keys.OemSemicolon && e.KeyCode <= Keys.OemBackslash) || e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9 || e.KeyCode == Keys.Multiply || @@ -31230,7 +31230,7 @@ namespace Nikse.SubtitleEdit.Forms } int selectionStart = tb.SelectionStart; - text = Utilities.ToggleSymbols(tag, text, endTag); + text = Utilities.ToggleSymbols(tag, text, endTag, out var _); tb.SelectedText = text; tb.SelectionStart = selectionStart; tb.SelectionLength = text.Length; @@ -31254,20 +31254,46 @@ namespace Nikse.SubtitleEdit.Forms } SubtitleListview1.BeginUpdate(); + var first = true; + var addTags = true; foreach (int i in indices) { + if (first) + { + _subtitle.Paragraphs[i].Text = Utilities.ToggleSymbols(tag, _subtitle.Paragraphs[i].Text, endTag, out var added); + addTags = added; + first = false; + } + + + if (addTags) + { + _subtitle.Paragraphs[i].Text = Utilities.AddSymbols(tag, _subtitle.Paragraphs[i].Text, endTag); + } + else + { + _subtitle.Paragraphs[i].Text = Utilities.RemoveSymbols(tag, _subtitle.Paragraphs[i].Text, endTag); + } + + SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); + if (IsOriginalEditable) { var original = Utilities.GetOriginalParagraph(i, _subtitle.Paragraphs[i], _subtitleOriginal.Paragraphs); if (original != null) { - original.Text = Utilities.ToggleSymbols(tag, original.Text, endTag); + if (addTags) + { + original.Text = Utilities.AddSymbols(tag, original.Text, endTag); + } + else + { + original.Text = Utilities.RemoveSymbols(tag, original.Text, endTag); + } + SubtitleListview1.SetOriginalText(i, original.Text); } } - - _subtitle.Paragraphs[i].Text = Utilities.ToggleSymbols(tag, _subtitle.Paragraphs[i].Text, endTag); - SubtitleListview1.SetText(i, _subtitle.Paragraphs[i].Text); } SubtitleListview1.EndUpdate();