SubtitleEdit/libse/SubtitleFormats/UnknownSubtitle97.cs
2020-04-12 18:10:18 +02:00

98 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Nikse.SubtitleEdit.Core.Forms.FixCommonErrors;
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace Nikse.SubtitleEdit.Core.SubtitleFormats
{
public class UnknownSubtitle97 : SubtitleFormat
{
private static readonly Regex RegexTimeCode = new Regex(@"^\d\d:\d\d:\d\d\s+.+", RegexOptions.Compiled);
public override string Extension => ".txt";
public override string Name => "Unknown 97";
public override string ToText(Subtitle subtitle, string title)
{
//00:00:20 I think weve heard enough.
//
//00:00:22 - Wait, hes the one that…
//\t\t-ENOUGH!
const string writeFormat = "{0:00}:{1:00}:{2:00} {3}";
var sb = new StringBuilder();
foreach (var p in subtitle.Paragraphs)
{
var textBuilder = new StringBuilder();
var list = p.Text.SplitToLines();
for (var index = 0; index < list.Count; index++)
{
var line = list[index];
if (index > 0)
{
textBuilder.Append("\t\t");
}
textBuilder.AppendLine(line);
}
sb.AppendLine(string.Format(writeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, textBuilder));
}
return sb.ToString().Trim() + Environment.NewLine;
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
Paragraph paragraph = null;
_errorCount = 0;
subtitle.Paragraphs.Clear();
foreach (var line in lines)
{
var s = line.Trim();
if (string.IsNullOrEmpty(s))
{
// ignore
}
else
{
var match = RegexTimeCode.Match(s);
if (match.Success)
{
var arr = match.Value.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (arr.Length >= 2)
{
var start = GetTimeCode(arr[0].Trim());
var text = s.Remove(0, 8).Trim();
paragraph = new Paragraph(start, new TimeCode(), text);
paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text);
subtitle.Paragraphs.Add(paragraph);
}
}
else if (paragraph != null)
{
paragraph.Text = (paragraph.Text + Environment.NewLine + s).Trim();
paragraph.EndTime.TotalMilliseconds = paragraph.StartTime.TotalMilliseconds + Utilities.GetOptimalDisplayMilliseconds(paragraph.Text);
}
else
{
_errorCount++;
}
}
}
new FixOverlappingDisplayTimes().Fix(subtitle, new EmptyFixCallback());
subtitle.Renumber();
}
private static TimeCode GetTimeCode(string code)
{
var arr = code.Split(':');
if (arr.Length == 3 && int.TryParse(arr[0], out int hours) && int.TryParse(arr[1], out int minutes) && int.TryParse(arr[2], out int seconds))
{
return new TimeCode(hours, minutes, seconds, 0);
}
return new TimeCode();
}
}
}