public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { bool doRenum = false; _errors = new StringBuilder(); _lineNumber = 0; _isMsFrames = true; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { _lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) next = lines[i + 1]; string nextNext = string.Empty; if (i + 2 < lines.Count) nextNext = lines[i + 2]; // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && Utilities.IsInteger(line) && RegexTimeCodes.IsMatch(lines[i + 1])) { ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && RegexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; doRenum = true; } ReadLine(subtitle, line, next, nextNext); } if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > _paragraph.StartTime.TotalMilliseconds) subtitle.Paragraphs.Add(_paragraph); if (doRenum) subtitle.Renumber(); if (_isMsFrames) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); } } Errors = _errors.ToString(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { bool doRenum = false; _errors = new StringBuilder(); _lineNumber = 0; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i=0; i<lines.Count; i++) { _lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim(Convert.ToChar(127)); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) next = lines[i + 1]; string nextNext = string.Empty; if (i + 2 < lines.Count) nextNext = lines[i + 2]; // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && Utilities.IsInteger(line) && _regexTimeCodes.IsMatch(lines[i+1])) { ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && _regexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; doRenum = true; } ReadLine(subtitle, line, next, nextNext); } if (_paragraph.Text.Trim().Length > 0) subtitle.Paragraphs.Add(_paragraph); foreach (Paragraph p in subtitle.Paragraphs) p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); if (doRenum) subtitle.Renumber(1); Errors = _errors.ToString(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { ReadLine(subtitle, line); } if (!string.IsNullOrWhiteSpace(_paragraph.Text)) subtitle.Paragraphs.Add(_paragraph); subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { ReadLine(subtitle, line); } if (_paragraph.Text.Trim().Length > 0) subtitle.Paragraphs.Add(_paragraph); subtitle.Renumber(1); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { //0:00:07.500,0:00:13.500 //In den Bergen über Musanze in Ruanda feiert die Trustbank (Kreditnehmer-Gruppe) "Trususanze" ihren Erfolg. //0:00:14.000,0:00:17.000 //Indem sie ihre Zukunft einander anvertraut haben, haben sie sich _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { string line = lines[i].TrimEnd(); string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && RegexTimeCodes.IsMatch(lines[i])) { ReadLine(subtitle, string.Empty, string.Empty); } ReadLine(subtitle, line, next); } if (_paragraph.Text.Trim().Length > 0) { subtitle.Paragraphs.Add(_paragraph); } foreach (Paragraph p in subtitle.Paragraphs) { p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } subtitle.Renumber(1); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { string line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } string nextNext = string.Empty; if (i + 2 < lines.Count) { nextNext = lines[i + 2]; } // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && Utilities.IsInteger(line.TrimEnd('.')) && RegexTimeCodes.IsMatch(lines[i + 1])) { ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && RegexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; } ReadLine(subtitle, line, next, nextNext); } if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > _paragraph.StartTime.TotalMilliseconds) { subtitle.Paragraphs.Add(_paragraph); } subtitle.Renumber(); }
private void ReadLine(Subtitle subtitle, string line, string next) { switch (_expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { _errorCount++; } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd(); } else if (IsText(next)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd(); } else { subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; } break; } }
private void ReadLine(Subtitle subtitle, string line) { switch (_expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _text = new StringBuilder(); _expecting = ExpectingLine.BlankBeforeText; } else if (line.Trim().Length > 0) { _errorCount++; } break; case ExpectingLine.BlankBeforeText: if (line.Trim().Length == 0) { _text = new StringBuilder(); _expecting = ExpectingLine.Text; } else { _errorCount++; _expecting = ExpectingLine.Text; // lets go to next paragraph } break; case ExpectingLine.Text: if (line.Trim().Length > 0) { _text.AppendLine(line.TrimEnd()); } else { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { ReadLine(subtitle, line); } if (!string.IsNullOrWhiteSpace(_text.ToString())) { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { // 0:00:07.500,0:00:13.500 // In den Bergen über Musanze in Ruanda feiert die Trustbank (Kreditnehmer-Gruppe) "Trususanze" ihren Erfolg. // 0:00:14.000,0:00:17.000 // Indem sie ihre Zukunft einander anvertraut haben, haben sie sich this._paragraph = new Paragraph(); this._expecting = ExpectingLine.TimeCodes; this._errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { string line = lines[i].TrimEnd(); string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } // A new line is missing between two paragraphs (buggy srt file) if (this._expecting == ExpectingLine.Text && i + 1 < lines.Count && this._paragraph != null && !string.IsNullOrEmpty(this._paragraph.Text) && RegexTimeCodes.IsMatch(lines[i])) { this.ReadLine(subtitle, string.Empty, string.Empty); } this.ReadLine(subtitle, line, next); } if (!string.IsNullOrWhiteSpace(this._paragraph.Text)) { subtitle.Paragraphs.Add(this._paragraph); } foreach (Paragraph p in subtitle.Paragraphs) { p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { this._paragraph = new Paragraph(); this._expecting = ExpectingLine.TimeCodes; this._errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { this.ReadLine(subtitle, line); } if (!string.IsNullOrWhiteSpace(this._text.ToString())) { this._paragraph.Text = this._text.ToString().Trim(); subtitle.Paragraphs.Add(this._paragraph); } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { ReadLine(subtitle, line); if (_text.Length > 1000) return; } if (_text != null && _text.ToString().TrimStart().Length > 0) { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); } subtitle.Renumber(); }
public void LoadSubtitle(Subtitle subtitle, IList <string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; if (subtitle?.Paragraphs?.Count > 0) { subtitle.Paragraphs.Clear(); } for (int i = 0; i < lines.Count; i++) { var line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // Strip DEL ASCII var next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && StringUtils.IsInteger(line) && RegexTimeCodes.IsMatch(lines[i + 1])) { ReadLine(subtitle, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && RegexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; } ReadLine(subtitle, line, next); } if (!string.IsNullOrWhiteSpace(_paragraph.Text)) { subtitle.Paragraphs.Add(_paragraph); } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { ReadLine(subtitle, line); if (_text.Length > 1000) { return; } } if (_text != null && _text.ToString().TrimStart().Length > 0) { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); } subtitle.Renumber(); }
private void ReadLine(Subtitle subtitle, string line) { switch (_expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _text = new StringBuilder(); _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { _errorCount++; _expecting = ExpectingLine.Text; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { _text.AppendLine(line.TrimEnd()); } else if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0) { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; } else { _errorCount++; } break; } }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext) { const string lineNumberXExpectedNumberFromSourceLineY = "Line {0} - expected subtitle number: {1}"; switch (_expecting) { case ExpectingLine.Number: int number; if (int.TryParse(line, out number)) { _paragraph.Number = number; _expecting = ExpectingLine.TimeCodes; } else if (!string.IsNullOrWhiteSpace(line)) { if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) { _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(lineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); } _errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(lineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); } _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (IsText(next)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || RegexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { string s = line.Trim(); if (RegexTimeCodes.IsMatch(s)) { if (!string.IsNullOrEmpty(paragraph.Text)) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); string[] parts = s.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) { try { paragraph.StartTime.TotalMilliseconds = long.Parse(parts[0]) * 10; paragraph.EndTime.TotalMilliseconds = long.Parse(parts[1]) * 10; expecting = ExpectingLine.BeforeText; } catch { expecting = ExpectingLine.TimeCodes; } } } else if (RegexBeforeText.IsMatch(s)) { expecting = ExpectingLine.Text; } else { if (expecting == ExpectingLine.Text) { if (s.Length > 0) { if (!string.IsNullOrEmpty(paragraph.Text)) { paragraph.Text += Environment.NewLine + s; } else { paragraph.Text = s; } } } } } if (!string.IsNullOrEmpty(paragraph.Text)) { subtitle.Paragraphs.Add(paragraph); } subtitle.Renumber(); }
private void ReadLine(Subtitle subtitle, string line, string next) { switch (_expecting) { case ExpectingLine.Number: if (Utilities.IsInteger(line)) { _paragraph.Number = int.Parse(line); _expecting = ExpectingLine.TimeCodes; } else if (line.Trim().Length > 0) { _errorCount++; } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (line.Trim().Length > 0) { _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (line.Trim().Length > 0) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (IsText(next)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || RegexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext) { switch (_expecting) { case ExpectingLine.Number: int number; if (int.TryParse(line, out number)) { _paragraph.Number = number; _expecting = ExpectingLine.TimeCodes; } else if (!string.IsNullOrWhiteSpace(line)) { if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) { _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); } _errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); } _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line) || IsText(next)) { if (_isWsrt && !string.IsNullOrEmpty(line)) { for (int i = 30; i < 40; i++) { line = line.Replace("<" + i + ">", "<i>"); line = line.Replace("</" + i + ">", "</i>"); } } if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || RegexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { ExpectingLine expecting = ExpectingLine.TimeCodes; Paragraph p = new Paragraph(); expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { string line = lines[i]; if (expecting == ExpectingLine.TimeCodes && RegexTimeCodes.IsMatch(line)) { if (p.Text.Length > 0 || p.EndTime.TotalMilliseconds > 0.1) { subtitle.Paragraphs.Add(p); p = new Paragraph(); } if (TryReadTimeCodesLine(line, p)) { expecting = ExpectingLine.Text1; } else { _errorCount++; } } else if (expecting == ExpectingLine.Text1) { if (p.Text.Length > 500) { _errorCount += 100; return; } else { if (line.StartsWith("||")) { line = "<i>" + line.Replace("||", string.Empty) + "</i>"; } p.Text = line.Trim(); expecting = ExpectingLine.Text2; } } else if (expecting == ExpectingLine.Text2) { if (p.Text.Length > 500) { _errorCount += 100; return; } else { if (line.StartsWith("||")) { line = "<i>" + line.Replace("||", string.Empty) + "</i>"; } p.Text = (p.Text + Environment.NewLine + line).Trim(); expecting = ExpectingLine.TimeCodes; } } } if (!string.IsNullOrWhiteSpace(p.Text)) { subtitle.Paragraphs.Add(p); } subtitle.Renumber(); }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext, string nextNextNext) { switch (_expecting) { case ExpectingLine.Number: if (int.TryParse(line, out var number)) { _paragraph.Number = number; _expecting = ExpectingLine.TimeCodes; } else if (!string.IsNullOrWhiteSpace(line)) { if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) { _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); } _errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph, true)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); } _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (Utilities.IsInteger(line) && (TryReadTimeCodesLine(next, null, false) || string.IsNullOrEmpty(next) && TryReadTimeCodesLine(nextNext, null, false))) { // line is integer and time code follows - could loose a number from text... subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; if (int.TryParse(line, out var n)) { _paragraph.Number = n; } if (_errors.Length < 2000 && line.Trim() != GetLastNumber(_paragraph)) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedEmptyLine, _lineNumber, line)); } } else if (TryReadTimeCodesLine(line, null, false)) { if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > 0 || _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text)) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; } _paragraph = new Paragraph(); TryReadTimeCodesLine(line, _paragraph, false); _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line) || IsText(next) || IsText(nextNext) || nextNextNext == GetLastNumber(_paragraph)) { if (_isWsrt && !string.IsNullOrEmpty(line)) { for (int i = 30; i < 40; i++) { line = line.Replace("<" + i + ">", "<i>"); line = line.Replace("</" + i + ">", "</i>"); } } if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd(); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || TryReadTimeCodesLine(next, null, false))) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(next)) { _paragraph.Text += Environment.NewLine + RemoveBadChars(line).TrimEnd(); } else { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { Paragraph paragraph = null; ExpectingLine expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { if (RegexNumber.IsMatch(line)) { if (paragraph != null) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } else if (paragraph != null && expecting == ExpectingLine.TimeStart && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.StartTime = tc; expecting = ExpectingLine.TimeEnd; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else if (paragraph != null && expecting == ExpectingLine.TimeEnd && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; expecting = ExpectingLine.Text; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else { if (paragraph != null && expecting == ExpectingLine.Text) { if (line.Length > 0) { string s = line; if (line.ToLower().StartsWith("[i]")) { s = "<i>" + s.Remove(0, 3); if (s.ToLower().EndsWith("[/i]")) { s = s.Remove(s.Length - 4, 4); } s += "</i>"; } s = s.Replace("[I]", "<i>"); s = s.Replace("[/I]", "</i>"); s = s.Replace("[P]", string.Empty); s = s.Replace("[/P]", string.Empty); paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } } } if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) { paragraph.Text = paragraph.Text.Replace("[/BODY]", string.Empty).Trim(); subtitle.Paragraphs.Add(paragraph); } subtitle.Renumber(1); }
/// <summary> /// The read line. /// </summary> /// <param name="subtitle"> /// The subtitle. /// </param> /// <param name="line"> /// The line. /// </param> /// <param name="next"> /// The next. /// </param> private void ReadLine(Subtitle subtitle, string line, string next) { switch (this._expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, this._paragraph)) { this._paragraph.Text = string.Empty; this._expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { this._errorCount++; } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { if (this._paragraph.Text.Length > 0) { this._paragraph.Text += Environment.NewLine; } this._paragraph.Text += RemoveBadChars(line).TrimEnd(); } else if (IsText(next)) { if (this._paragraph.Text.Length > 0) { this._paragraph.Text += Environment.NewLine; } this._paragraph.Text += RemoveBadChars(line).TrimEnd(); } else { subtitle.Paragraphs.Add(this._paragraph); this._paragraph = new Paragraph(); this._expecting = ExpectingLine.TimeCodes; } break; } }
private void ReadLine(Subtitle subtitle, string line) { //Subtitle number: 1 //Start time (or frames): 00:00:48,862:0000001222 //End time (or frames): 00:00:50,786:0000001270 //Subtitle text: In preajma lacului Razel, switch (_expecting) { case ExpectingLine.Number: if (line.StartsWith("Subtitle number: ")) { _expecting = ExpectingLine.StartTime; } break; case ExpectingLine.StartTime: if (line.StartsWith("Start time (or frames): ")) { TryReadTimeCodesLine(line.Substring(23), _paragraph, true); _expecting = ExpectingLine.EndTime; } break; case ExpectingLine.EndTime: if (line.StartsWith("End time (or frames): ")) { TryReadTimeCodesLine(line.Substring(21), _paragraph, false); _expecting = ExpectingLine.Text; } break; case ExpectingLine.Text: if (line.StartsWith("Subtitle text: ")) { string text = line.Substring(14).Trim(); text = text.Replace("|", Environment.NewLine); _paragraph.Text = text; subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
private void ReadLine(Subtitle subtitle, string line, string next) { switch (_expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (line.Trim().Length > 0) { _errorCount++; _expecting = ExpectingLine.TimeCodes; // lets go to next paragraph } break; case ExpectingLine.Text: if (line.Trim().Length > 0) { if (_paragraph.Text.Length > 0) _paragraph.Text += Environment.NewLine; _paragraph.Text += RemoveBadChars(line).TrimEnd(); } else if (IsText(next)) { if (_paragraph.Text.Length > 0) _paragraph.Text += Environment.NewLine; _paragraph.Text += RemoveBadChars(line).TrimEnd(); } else { subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; } break; } }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext) { switch (_expecting) { case ExpectingLine.Number: if (Utilities.IsInteger(line)) { _paragraph.Number = int.Parse(line); _expecting = ExpectingLine.TimeCodes; } else if (line.Trim().Length > 0) { if (_lastParagraph != null && nextNext != null && string.Compare((_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture), nextNext, StringComparison.Ordinal) == 0) { _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, _lineNumber, line)); } _errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; _expecting = ExpectingLine.Text; } else if (line.Trim().Length > 0) { if (_errors.Length < 2000) { _errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, _lineNumber, line)); } _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (line.Trim().Length > 0) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (IsText(next)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || _regexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext) { switch (_expecting) { case ExpectingLine.Number: if (int.TryParse(line.TrimEnd('.'), out var number)) { _paragraph.Number = number; _expecting = ExpectingLine.TimeCodes; } else if (!string.IsNullOrWhiteSpace(line)) { if (_lastParagraph != null && nextNext != null && (_lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) { _lastParagraph.Text = (_lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { _errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _paragraph.Text = string.Empty; var match = RegexTimeCodes.Match(line); if (match.Success) { var rest = line.Remove(0, match.Length).Trim(); if (rest.StartsWith("0 ")) { rest = rest.Remove(0, 2); } if (rest.Length > 0 && rest != "0" && rest != ":") { _paragraph.Text = rest; } } _expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { _errorCount++; _expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line) || IsText(next)) { if (_paragraph.Text.Length > 0) { _paragraph.Text += Environment.NewLine; } _paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(_paragraph.Text)) { _paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next.TrimEnd('.')) || RegexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { bool doRenum = false; _errors = new StringBuilder(); _lineNumber = 0; _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { _lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim(Convert.ToChar(127)); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } string nextNext = string.Empty; if (i + 2 < lines.Count) { nextNext = lines[i + 2]; } // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && Utilities.IsInteger(line) && _regexTimeCodes.IsMatch(lines[i + 1])) { ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && _regexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; doRenum = true; } ReadLine(subtitle, line, next, nextNext); } if (_paragraph.EndTime.TotalMilliseconds > _paragraph.StartTime.TotalMilliseconds) { subtitle.Paragraphs.Add(_paragraph); } foreach (Paragraph p in subtitle.Paragraphs) { p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } if (doRenum) { subtitle.Renumber(1); } Errors = _errors.ToString(); }
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName) { bool doRenum = false; this._errors = new StringBuilder(); this._lineNumber = 0; this._paragraph = new Paragraph(); this._expecting = ExpectingLine.Number; this._errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { this._lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } string nextNext = string.Empty; if (i + 2 < lines.Count) { nextNext = lines[i + 2]; } // A new line is missing between two paragraphs (buggy srt file) if (this._expecting == ExpectingLine.Text && i + 1 < lines.Count && this._paragraph != null && !string.IsNullOrEmpty(this._paragraph.Text) && Utilities.IsInteger(line) && _regexTimeCodes.IsMatch(lines[i + 1])) { this.ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (this._expecting == ExpectingLine.Number && _regexTimeCodes.IsMatch(line)) { this._expecting = ExpectingLine.TimeCodes; doRenum = true; } this.ReadLine(subtitle, line, next, nextNext); } if (this._paragraph.EndTime.TotalMilliseconds > this._paragraph.StartTime.TotalMilliseconds) { subtitle.Paragraphs.Add(this._paragraph); } foreach (Paragraph p in subtitle.Paragraphs) { p.Text = p.Text.Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } if (doRenum) { subtitle.Renumber(); } this.Errors = this._errors.ToString(); }
public List <SubtitleItem> ParseStream(Stream stream, Encoding encoding) { stream.Position = 0; List <SubtitleItem> items = new List <SubtitleItem>(); Regex regexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d.\d+,\d\d:\d\d:\d\d.\d+$"); StreamReader st = new StreamReader(stream, encoding, true); string reshte = st.ReadToEnd(); List <string> lines = new List <string>(reshte.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)); var sb = new StringBuilder(); SubtitleItem paragraph = new SubtitleItem(); ExpectingLine expecting = ExpectingLine.TimeCodes; foreach (string line in lines) { if (regexTimeCodes.IsMatch(line)) { string[] parts = line.Split(new[] { ':', ',', '.' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 8) { try { int startHours = int.Parse(parts[0]); int startMinutes = int.Parse(parts[1]); int startSeconds = int.Parse(parts[2]); int startMilliseconds = int.Parse(parts[3]); int endHours = int.Parse(parts[4]); int endMinutes = int.Parse(parts[5]); int endSeconds = int.Parse(parts[6]); int endMilliseconds = int.Parse(parts[7]); paragraph.StartTime = int.Parse(new TimeSpan(0, startHours, startMinutes, startSeconds, startMilliseconds).TotalMilliseconds.ToString()); paragraph.EndTime = int.Parse(new TimeSpan(0, endHours, endMinutes, endSeconds, endMilliseconds).TotalMilliseconds.ToString()); expecting = ExpectingLine.Text; } catch { expecting = ExpectingLine.TimeCodes; } } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("[br]", Environment.NewLine); text = text.Replace("{\\i1}", "<i>"); text = text.Replace("{\\i0}", "</i>"); text = text.Replace("{\\i}", "</i>"); text = text.Replace("{\\b1}", "<b>'"); text = text.Replace("{\\b0}", "</b>"); text = text.Replace("{\\b}", "</b>"); text = text.Replace("{\\u1}", "<u>"); text = text.Replace("{\\u0}", "</u>"); text = text.Replace("{\\u}", "</u>"); //<font color="">... آنچه گذشت</font>[br]{\i1}Ramtin{\b1}'Jokar{\b0}{\i0}[br]{\i1}SalAM{\i0} text = text.Replace("[br]", Environment.NewLine); paragraph.Lines = new List <string>() { text }; items.Add(paragraph); paragraph = new SubtitleItem(); expecting = ExpectingLine.TimeCodes; } } } } if (items.Any()) { return(items); } else { throw new ArgumentException("Stream is not in a valid 'SubViewer 2.0' Subtitle format"); } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { Paragraph paragraph = null; ExpectingLine expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { if (line.Length < 6 && Utilities.IsInteger(line)) { if (paragraph != null) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } else if (paragraph != null && expecting == ExpectingLine.TimeStart && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.StartTime = tc; expecting = ExpectingLine.TimeEnd; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else if (paragraph != null && expecting == ExpectingLine.TimeEnd && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; expecting = ExpectingLine.Text; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else { if (paragraph != null && expecting == ExpectingLine.Text) { if (line.Length > 0) { string s = line; paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } else { _errorCount++; } } } if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) { subtitle.Paragraphs.Add(paragraph); } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { Paragraph paragraph = null; ExpectingLine expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); char[] splitChar = { ',' }; foreach (string line in lines) { if (line.EndsWith('.') && Utilities.IsInteger(line.TrimEnd('.'))) { if (!string.IsNullOrEmpty(paragraph?.Text)) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } else if (paragraph != null && expecting == ExpectingLine.TimeStart && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) { try { var tc = DecodeTimeCode(parts); paragraph.StartTime = tc; expecting = ExpectingLine.TimeEnd; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else if (paragraph != null && expecting == ExpectingLine.TimeEnd && RegexTimeCode.IsMatch(line)) { string[] parts = line.Split(splitChar, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 2) { try { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; expecting = ExpectingLine.Text; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else { if (paragraph != null && expecting == ExpectingLine.Text) { if (line.Length > 0) { string s = line.Trim(); if (s.StartsWith('#')) { s = "<i>" + s.Remove(0, 1) + "</i>"; } paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); paragraph.Text = paragraph.Text.Replace("</i>" + Environment.NewLine + "<i>", Environment.NewLine); if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } } } if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) { subtitle.Paragraphs.Add(paragraph); } subtitle.Renumber(); }
public List <SubtitleItem> ParseStream(Stream stream, Encoding encoding) { stream.Position = 0; List <SubtitleItem> items = new List <SubtitleItem>(); Regex regexTimeCodes = new Regex(@"^\[\d\d:\d\d:\d\d\]$"); StreamReader st = new StreamReader(stream, encoding, true); string reshte = st.ReadToEnd(); List <string> lines = new List <string>(reshte.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)); var sb = new StringBuilder(); SubtitleItem paragraph = new SubtitleItem(); ExpectingLine expecting = ExpectingLine.TimeStart; int _errorCount = 0; foreach (string line in lines) { if (line.StartsWith("[") && regexTimeCodes.IsMatch(line)) { string[] parts = line.Split(new[] { ':', ']', '[', ' ' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 3) { try { int startHours = int.Parse(parts[0]); int startMinutes = int.Parse(parts[1]); int startSeconds = int.Parse(parts[2]); var tc = int.Parse(new TimeSpan(0, startHours, startMinutes, startSeconds, 0).TotalMilliseconds.ToString()); if (expecting == ExpectingLine.TimeStart) { paragraph = new SubtitleItem(); paragraph.StartTime = tc; expecting = ExpectingLine.Text; } else if (expecting == ExpectingLine.TimeEnd) { paragraph.EndTime = tc; expecting = ExpectingLine.TimeStart; items.Add(paragraph); paragraph = new SubtitleItem(); } } catch { _errorCount++; expecting = ExpectingLine.TimeStart; } } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("|", Environment.NewLine); paragraph.Lines = new List <string>() { text }; expecting = ExpectingLine.TimeEnd; } } } } if (items.Any()) { return(items); } else { throw new ArgumentException("Stream is not in a valid 'SubViewer 1.0' Subtitle format"); } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { var regexTimeCodes = new Regex(@"^\d\d:\d\d:\d\d.\d+,\d\d:\d\d:\d\d.\d+$", RegexOptions.Compiled); var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeCodes; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { if (regexTimeCodes.IsMatch(line)) { string[] parts = line.Split(new[] { ':', ',', '.' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 8) { try { int startHours = int.Parse(parts[0]); int startMinutes = int.Parse(parts[1]); int startSeconds = int.Parse(parts[2]); int startMilliseconds = int.Parse(parts[3]); int endHours = int.Parse(parts[4]); int endMinutes = int.Parse(parts[5]); int endSeconds = int.Parse(parts[6]); int endMilliseconds = int.Parse(parts[7]); paragraph.StartTime = new TimeCode(startHours, startMinutes, startSeconds, startMilliseconds); paragraph.EndTime = new TimeCode(endHours, endMinutes, endSeconds, endMilliseconds); expecting = ExpectingLine.Text; } catch { expecting = ExpectingLine.TimeCodes; } } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("[br]", Environment.NewLine); text = text.Replace("{\\i1}", "<i>"); text = text.Replace("{\\i0}", "</i>"); text = text.Replace("{\\i}", "</i>"); text = text.Replace("{\\b1}", "<b>'"); text = text.Replace("{\\b0}", "</b>"); text = text.Replace("{\\b}", "</b>"); text = text.Replace("{\\u1}", "<u>"); text = text.Replace("{\\u0}", "</u>"); text = text.Replace("{\\u}", "</u>"); paragraph.Text = text; subtitle.Paragraphs.Add(paragraph); paragraph = new Paragraph(); expecting = ExpectingLine.TimeCodes; } } } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { Paragraph paragraph = null; ExpectingLine expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { if (expecting == ExpectingLine.Number && (RegexTimeCode.IsMatch(line) || RegexTimeCode2.IsMatch(line.Trim()))) { _errorCount++; if (paragraph != null) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } if (line.TrimEnd().EndsWith(".", StringComparison.Ordinal) && Utilities.IsInteger(RemoveSpaces(line.Trim().TrimEnd('.').Trim()))) { if (paragraph != null) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } else if (paragraph != null && expecting == ExpectingLine.TimeStart && (RegexTimeCode.IsMatch(line) || RegexTimeCode2.IsMatch(line.Trim()))) { string[] parts = RemoveSpaces(line.Trim()).Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.StartTime = tc; expecting = ExpectingLine.TimeEnd; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else if (paragraph != null && expecting == ExpectingLine.TimeEnd && (RegexTimeCode.IsMatch(line) || RegexTimeCode2.IsMatch(line.Trim()))) { string[] parts = RemoveSpaces(line.Trim()).Split(":".ToCharArray(), StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; expecting = ExpectingLine.Text; } catch { _errorCount++; expecting = ExpectingLine.Number; } } } else { if (line == " " || line.Trim() == @"...........\...........") { } else if (line == "*END*") { _errorCount++; if (paragraph != null) { subtitle.Paragraphs.Add(paragraph); } paragraph = new Paragraph(); expecting = ExpectingLine.Number; } else if (paragraph != null && expecting == ExpectingLine.Text) { if (line.Length > 0) { string s = RemoveSpaces(line); paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim(); if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } else if (line.Length > 1) { _errorCount++; } } } if (paragraph != null && !string.IsNullOrEmpty(paragraph.Text)) { subtitle.Paragraphs.Add(paragraph); } subtitle.Renumber(1); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { bool doRenumber = false; _errors = new StringBuilder(); _lineNumber = 0; _isMsFrames = true; _isWsrt = fileName != null && fileName.EndsWith(".wsrt", StringComparison.OrdinalIgnoreCase); _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { _lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // 127=delete ascii string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } string nextNext = string.Empty; if (i + 2 < lines.Count) { nextNext = lines[i + 2]; } string nextNextNext = string.Empty; if (i + 3 < lines.Count) { nextNextNext = lines[i + 3]; } // A new line is missing between two paragraphs or no line number (buggy file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && !string.IsNullOrEmpty(_paragraph?.Text) && Utilities.IsInteger(line) && TryReadTimeCodesLine(line.Trim(), null, false)) { if (!string.IsNullOrEmpty(_paragraph.Text)) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); } _expecting = ExpectingLine.Number; } if (_expecting == ExpectingLine.Number && TryReadTimeCodesLine(line.Trim(), null, false)) { _expecting = ExpectingLine.TimeCodes; doRenumber = true; } else if (!string.IsNullOrEmpty(_paragraph?.Text) && _expecting == ExpectingLine.Text && TryReadTimeCodesLine(line.Trim(), null, false)) { subtitle.Paragraphs.Add(_paragraph); _lastParagraph = _paragraph; _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; doRenumber = true; } ReadLine(subtitle, line, next, nextNext, nextNextNext); } if (_paragraph?.IsDefault == false) { subtitle.Paragraphs.Add(_paragraph); } if (doRenumber) { subtitle.Renumber(); } foreach (var p in subtitle.Paragraphs) { if (_isMsFrames) { p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); } p.Text = p.Text.TrimEnd(); } Errors = _errors.ToString(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { var regexTimeCode = new Regex(@"^\d\d:\d\d:\d\d:\d\d ", RegexOptions.Compiled); var regexTimeCodeEnd = new Regex(@"^\d\d:\d\d:\d\d:\d\d\t$", RegexOptions.Compiled); var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeStart; _errorCount = 0; subtitle.Paragraphs.Clear(); int count = 0; foreach (string line in lines) { count++; if (regexTimeCode.IsMatch(line)) { string[] parts = line.Substring(0, 11).Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); if (expecting == ExpectingLine.TimeStart) { paragraph = new Paragraph(); paragraph.StartTime = tc; expecting = ExpectingLine.Text; if (line.Length > 12) { paragraph.Text = line.Substring(12).Trim(); } } } catch { _errorCount++; expecting = ExpectingLine.TimeStart; } } } else if (regexTimeCodeEnd.IsMatch(line) || (count == lines.Count && regexTimeCodeEnd.IsMatch(line + "\t"))) { string[] parts = line.Substring(0, 11).Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; subtitle.Paragraphs.Add(paragraph); paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("|", Environment.NewLine); paragraph.Text += Environment.NewLine + text; expecting = ExpectingLine.TimeEndOrText; if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } else { _errorCount++; } } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeStart; _errorCount = 0; subtitle.Paragraphs.Clear(); foreach (string line in lines) { if (line.StartsWith("-->> ")) { string timePart = line.Substring(4).Trim(); if (timePart.Length > 0) { try { var tc = DecodeTimeCode(timePart); if (expecting == ExpectingLine.TimeStart) { paragraph = new Paragraph(); paragraph.StartFrame = int.Parse(timePart); paragraph.StartTime = tc; expecting = ExpectingLine.Text; } else if (expecting == ExpectingLine.TimeEndOrText) { paragraph.EndFrame = int.Parse(timePart); paragraph.EndTime = tc; subtitle.Paragraphs.Add(paragraph); paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } } catch { _errorCount++; expecting = ExpectingLine.TimeStart; } } } else { if (expecting == ExpectingLine.Text || expecting == ExpectingLine.TimeEndOrText) { if (line.Length > 0) { string text = line.Replace("|", Environment.NewLine); if (string.IsNullOrEmpty(paragraph.Text)) { paragraph.Text = text.Trim(); } else { paragraph.Text += Environment.NewLine + text; } if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } expecting = ExpectingLine.TimeEndOrText; } else if (expecting == ExpectingLine.TimeStart && !string.IsNullOrWhiteSpace(line)) { int ms = (int)paragraph.EndTime.TotalMilliseconds; int frames = paragraph.EndFrame; paragraph = new Paragraph(); paragraph.StartTime.TotalMilliseconds = ms; paragraph.StartFrame = frames; paragraph.Text = line.Trim(); expecting = ExpectingLine.TimeEndOrText; } } } subtitle.Renumber(1); }
/// <summary> /// The read line. /// </summary> /// <param name="subtitle"> /// The subtitle. /// </param> /// <param name="line"> /// The line. /// </param> private void ReadLine(Subtitle subtitle, string line) { switch (this._expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, this._paragraph)) { this._text = new StringBuilder(); this._expecting = ExpectingLine.BlankBeforeText; } else if (!string.IsNullOrWhiteSpace(line)) { this._errorCount++; } break; case ExpectingLine.BlankBeforeText: if (string.IsNullOrWhiteSpace(line)) { this._text = new StringBuilder(); this._expecting = ExpectingLine.Text; } else { this._errorCount++; this._expecting = ExpectingLine.Text; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { this._text.AppendLine(line.TrimEnd()); } else { this._paragraph.Text = this._text.ToString().Trim(); subtitle.Paragraphs.Add(this._paragraph); this._paragraph = new Paragraph(); this._expecting = ExpectingLine.TimeCodes; this._text = new StringBuilder(); } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { bool doRenum = false; _errors = new StringBuilder(); _lineNumber = 0; _isMsFrames = true; _isWsrt = fileName != null && fileName.EndsWith(".wsrt", StringComparison.OrdinalIgnoreCase); _paragraph = new Paragraph(); _expecting = ExpectingLine.Number; _errorCount = 0; subtitle.Paragraphs.Clear(); for (int i = 0; i < lines.Count; i++) { _lineNumber++; string line = lines[i].TrimEnd(); line = line.Trim('\u007F'); // 127=delete acscii string next = string.Empty; if (i + 1 < lines.Count) { next = lines[i + 1]; } string nextNext = string.Empty; if (i + 2 < lines.Count) { nextNext = lines[i + 2]; } // A new line is missing between two paragraphs (buggy srt file) if (_expecting == ExpectingLine.Text && i + 1 < lines.Count && _paragraph != null && !string.IsNullOrEmpty(_paragraph.Text) && Utilities.IsInteger(line) && RegexTimeCodes.IsMatch(lines[i + 1])) { ReadLine(subtitle, string.Empty, string.Empty, string.Empty); } if (_expecting == ExpectingLine.Number && RegexTimeCodes.IsMatch(line)) { _expecting = ExpectingLine.TimeCodes; doRenum = true; } ReadLine(subtitle, line, next, nextNext); } if (_paragraph != null && _paragraph.EndTime.TotalMilliseconds > _paragraph.StartTime.TotalMilliseconds) { subtitle.Paragraphs.Add(_paragraph); } if (doRenum) { subtitle.Renumber(); } if (_isMsFrames) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); } } Errors = _errors.ToString(); }
private void ReadLine(Subtitle subtitle, string line, string next, string nextNext) { switch (this._expecting) { case ExpectingLine.Number: int number; if (int.TryParse(line, out number)) { this._paragraph.Number = number; this._expecting = ExpectingLine.TimeCodes; } else if (!string.IsNullOrWhiteSpace(line)) { if (this._lastParagraph != null && nextNext != null && (this._lastParagraph.Number + 1).ToString(CultureInfo.InvariantCulture) == nextNext) { this._lastParagraph.Text = (this._lastParagraph.Text + Environment.NewLine + line.Trim()).Trim(); } else { if (this._errors.Length < 2000) { this._errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXExpectedNumberFromSourceLineY, this._lineNumber, line)); } this._errorCount++; } } break; case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, this._paragraph)) { this._paragraph.Text = string.Empty; this._expecting = ExpectingLine.Text; } else if (!string.IsNullOrWhiteSpace(line)) { if (this._errors.Length < 2000) { this._errors.AppendLine(string.Format(Configuration.Settings.Language.Main.LineNumberXErrorReadingTimeCodeFromSourceLineY, this._lineNumber, line)); } this._errorCount++; this._expecting = ExpectingLine.Number; // lets go to next paragraph } break; case ExpectingLine.Text: if (!string.IsNullOrWhiteSpace(line)) { if (this._paragraph.Text.Length > 0) { this._paragraph.Text += Environment.NewLine; } this._paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (IsText(next)) { if (this._paragraph.Text.Length > 0) { this._paragraph.Text += Environment.NewLine; } this._paragraph.Text += RemoveBadChars(line).TrimEnd().Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); } else if (string.IsNullOrEmpty(line) && string.IsNullOrEmpty(this._paragraph.Text)) { this._paragraph.Text = string.Empty; if (!string.IsNullOrEmpty(next) && (Utilities.IsInteger(next) || _regexTimeCodes.IsMatch(next))) { subtitle.Paragraphs.Add(this._paragraph); this._lastParagraph = this._paragraph; this._paragraph = new Paragraph(); this._expecting = ExpectingLine.Number; } } else { subtitle.Paragraphs.Add(this._paragraph); this._lastParagraph = this._paragraph; this._paragraph = new Paragraph(); this._expecting = ExpectingLine.Number; } break; } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { var paragraph = new Paragraph(); ExpectingLine expecting = ExpectingLine.TimeStart; _errorCount = 0; subtitle.Paragraphs.Clear(); char[] splitChar = { ':' }; foreach (string line in lines) { if (RegexTimeCode.IsMatch(line)) { string[] parts = line.Substring(0, 11).Split(splitChar, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { try { var tc = DecodeTimeCode(parts); if (expecting == ExpectingLine.TimeStart) { paragraph = new Paragraph(); paragraph.StartTime = tc; expecting = ExpectingLine.Text; if (line.Length > 12) { paragraph.Text = line.Substring(12).Trim().Replace("//", Environment.NewLine); } } } catch { _errorCount++; expecting = ExpectingLine.TimeStart; } } } else if (RegexTimeCodeEnd.IsMatch(line)) { string[] parts = line.Substring(0, 11).Split(splitChar, StringSplitOptions.RemoveEmptyEntries); if (parts.Length == 4) { var tc = DecodeTimeCode(parts); paragraph.EndTime = tc; subtitle.Paragraphs.Add(paragraph); if (paragraph.StartTime.TotalMilliseconds < 0.001) { _errorCount++; } paragraph = new Paragraph(); expecting = ExpectingLine.TimeStart; } } else { if (expecting == ExpectingLine.Text) { if (line.Length > 0) { string text = line.Replace("//", Environment.NewLine); paragraph.Text += Environment.NewLine + text; expecting = ExpectingLine.TimeEndOrText; if (paragraph.Text.Length > 2000) { _errorCount += 100; return; } } } else if (!string.IsNullOrWhiteSpace(line) && line != "#PE2 Format file") { _errorCount++; } } } subtitle.Renumber(); }
private void ReadLine(Subtitle subtitle, string line) { switch (_expecting) { case ExpectingLine.TimeCodes: if (TryReadTimeCodesLine(line, _paragraph)) { _text = new StringBuilder(); _expecting = ExpectingLine.BlankBeforeText; } else if (line.Trim().Length > 0) { _errorCount++; } break; case ExpectingLine.BlankBeforeText: if (line.Trim().Length == 0) { _text = new StringBuilder(); _expecting = ExpectingLine.Text; } else { _errorCount++; _expecting = ExpectingLine.Text; // lets go to next paragraph } break; case ExpectingLine.Text: if (line.Trim().Length > 0) { _text.AppendLine(line.TrimEnd()); } else { _paragraph.Text = _text.ToString().Trim(); subtitle.Paragraphs.Add(_paragraph); _paragraph = new Paragraph(); _expecting = ExpectingLine.TimeCodes; _text = new StringBuilder(); } break; } }