Example #1
0
        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();
        }
Example #2
0
        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();
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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();
        }
Example #7
0
        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;
            }
        }
Example #8
0
        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();
        }
Example #13
0
        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;
            }
        }
Example #16
0
        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;
            }
        }
Example #17
0
        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();
        }
Example #18
0
        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;
            }
        }
Example #19
0
        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();
        }
Example #21
0
        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;
            }
        }
Example #22
0
        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;
            }
        }
Example #24
0
        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;
            }
        }
Example #25
0
 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;
     }
 }
Example #26
0
        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;
            }
        }
Example #27
0
        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;
            }
        }
Example #28
0
        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();
        }
Example #30
0
        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");
            }
        }
Example #31
0
        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();
        }
 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;
     }
 }
Example #33
0
        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();
        }
Example #34
0
        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");
            }
        }
Example #35
0
        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);
        }
Example #37
0
        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();
        }
Example #38
0
        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();
        }
Example #39
0
        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;
            }
        }
Example #41
0
        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;
            }
        }
Example #43
0
        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();
        }
Example #44
0
 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;
     }
 }