Fix alignment tags in .stl text formats - thx Shas2509 :)

Work on #2755
This commit is contained in:
Nikolaj Olsson 2018-02-09 21:08:39 +01:00
parent 7d7b22bcb3
commit e9e3228b7f
6 changed files with 184 additions and 107 deletions

View File

@ -33,35 +33,65 @@ $FadeOut = 0
$HorzAlign = Center
";
var lastVerticalAlign = "$VertAlign=Bottom";
var lastHorizontalcalAlign = "$HorzAlign=Center";
var sb = new StringBuilder();
sb.AppendLine(header);
var verticalAlign = "$VertAlign=Bottom";
var lastVerticalAlign = verticalAlign;
foreach (Paragraph p in subtitle.Paragraphs)
{
string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds));
string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds));
bool topAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
verticalAlign = topAlign ? "$VertAlign=Top" : "$VertAlign=Bottom";
if (lastVerticalAlign != verticalAlign)
{
sb.AppendLine(verticalAlign);
}
sb = ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendFormat(paragraphWriteFormat, startTime, endTime, EncodeStyles(p.Text));
lastVerticalAlign = verticalAlign;
}
return sb.ToString().Trim();
}
internal static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign)
{
string verticalAlign;
string horizontalAlign;
bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an6}", StringComparison.Ordinal);
if (verticalTopAlign)
verticalAlign = "$VertAlign=Top";
else if (verticalCenterAlign)
verticalAlign = "$VertAlign=Center";
else
verticalAlign = "$VertAlign=Bottom";
if (lastVerticalAlign != verticalAlign)
sb.AppendLine(verticalAlign);
bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an7}", StringComparison.Ordinal);
bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
if (horizontalLeftAlign)
horizontalAlign = "$HorzAlign=Left";
else if (horizontalRightAlign)
horizontalAlign = "$HorzAlign=Right";
else
horizontalAlign = "$HorzAlign=Center";
if (lastHorizontalAlign != horizontalAlign)
sb.AppendLine(horizontalAlign);
lastVerticalAlign = verticalAlign;
lastHorizontalAlign = horizontalAlign;
return sb;
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
_errorCount = 0;
int number = 0;
bool alignTop = false;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
foreach (string line in lines)
{
if (!string.IsNullOrWhiteSpace(line) && line[0] != '$')
@ -78,8 +108,7 @@ $HorzAlign = Center
p.Number = number;
p.Text = threePart[2].TrimEnd().Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine);
p.Text = DecodeStyles(p.Text);
if (alignTop)
p.Text = "{\\an8}" + p.Text;
p.Text = GetAlignment(verticalAlign, horizontalAlign) + p.Text;
subtitle.Paragraphs.Add(p);
}
}
@ -90,19 +119,42 @@ $HorzAlign = Center
}
else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
var s = line.RemoveChar(' ').RemoveChar('\t');
if (s.Equals("$VertAlign=Bottom", StringComparison.OrdinalIgnoreCase))
{
alignTop = false;
}
else if (s.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase))
{
alignTop = true;
}
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
}
}
internal static string GetAlignment(string verticalAlign, string horizontalAlign)
{
if (verticalAlign.Equals("$VertAlign=Top"))
{
if (horizontalAlign.Equals("$HorzAlign=Left"))
return "{\\an7}";
if (horizontalAlign.Equals("$HorzAlign=Right"))
return "{\\an9}";
return "{\\an8}";
}
if (verticalAlign.Equals("$VertAlign=Center"))
{
if (horizontalAlign.Equals("$HorzAlign=Left"))
return "{\\an4}";
if (horizontalAlign.Equals("$HorzAlign=Right"))
return "{\\an6}";
return "{\\an5}";
}
if (horizontalAlign.Equals("$HorzAlign=Left"))
return "{\\an1}";
if (horizontalAlign.Equals("$HorzAlign=Right"))
return "{\\an3}";
return string.Empty;
}
internal static string DecodeStyles(string text)
{
var sb = new StringBuilder();

View File

@ -33,26 +33,16 @@ $FadeOut = 0
$HorzAlign = Center
";
var verticalAlign = "$VertAlign=Bottom";
var lastVerticalAlign = verticalAlign;
var lastVerticalAlign = "$VertAlign=Bottom";
var lastHorizontalcalAlign = "$HorzAlign=Center";
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (Paragraph p in subtitle.Paragraphs)
{
string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds));
string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds));
bool topAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
verticalAlign = topAlign ? "$VertAlign=Top" : "$VertAlign=Bottom";
if (lastVerticalAlign != verticalAlign)
{
sb.AppendLine(verticalAlign);
}
DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text));
lastVerticalAlign = verticalAlign;
}
return sb.ToString().Trim();
}
@ -61,7 +51,8 @@ $HorzAlign = Center
{
_errorCount = 0;
int number = 0;
bool alignTop = false;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
foreach (string line in lines)
{
if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal))
@ -79,8 +70,7 @@ $HorzAlign = Center
string text = line.Substring(27).Trim();
p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine);
p.Text = DvdStudioPro.DecodeStyles(p.Text);
if (alignTop)
p.Text = "{\\an8}" + p.Text;
p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text;
subtitle.Paragraphs.Add(p);
}
}
@ -91,15 +81,11 @@ $HorzAlign = Center
}
else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
var s = line.RemoveChar(' ').RemoveChar('\t');
if (s.Equals("$VertAlign=Bottom", StringComparison.OrdinalIgnoreCase))
{
alignTop = false;
}
else if (s.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase))
{
alignTop = true;
}
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
}
}

View File

@ -33,26 +33,16 @@ $FadeOut = 0
$HorzAlign = Center
";
var verticalAlign = "$VertAlign=Bottom";
var lastVerticalAlign = verticalAlign;
var lastVerticalAlign = "$VertAlign=Bottom";
var lastHorizontalcalAlign = "$HorzAlign=Center";
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (Paragraph p in subtitle.Paragraphs)
{
string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds));
string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds));
bool topAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
verticalAlign = topAlign ? "$VertAlign=Top" : "$VertAlign=Bottom";
if (lastVerticalAlign != verticalAlign)
{
sb.AppendLine(verticalAlign);
}
DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text));
lastVerticalAlign = verticalAlign;
}
return sb.ToString().Trim();
}
@ -66,7 +56,8 @@ $HorzAlign = Center
{
_errorCount = 0;
int number = 0;
bool alignTop = false;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
foreach (string line in lines)
{
if (!string.IsNullOrWhiteSpace(line) && line[0] != '$' && !line.StartsWith("//", StringComparison.Ordinal))
@ -84,8 +75,7 @@ $HorzAlign = Center
string text = line.Substring(25).Trim();
p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine);
p.Text = DvdStudioPro.DecodeStyles(p.Text);
if (alignTop)
p.Text = "{\\an8}" + p.Text;
p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text;
subtitle.Paragraphs.Add(p);
}
}
@ -96,15 +86,11 @@ $HorzAlign = Center
}
else if (line != null && line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
var s = line.RemoveChar(' ').RemoveChar('\t');
if (s.Equals("$VertAlign=Bottom", StringComparison.OrdinalIgnoreCase))
{
alignTop = false;
}
else if (s.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase))
{
alignTop = true;
}
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line != null && line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
}
}

View File

@ -33,26 +33,16 @@ $FadeOut = 0
$HorzAlign = Center
";
var verticalAlign = "$VertAlign=Bottom";
var lastVerticalAlign = verticalAlign;
var lastVerticalAlign = "$VertAlign=Bottom";
var lastHorizontalcalAlign = "$HorzAlign=Center";
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (Paragraph p in subtitle.Paragraphs)
{
string startTime = string.Format(timeFormat, p.StartTime.Hours, p.StartTime.Minutes, p.StartTime.Seconds, MillisecondsToFramesMaxFrameRate(p.StartTime.Milliseconds));
string endTime = string.Format(timeFormat, p.EndTime.Hours, p.EndTime.Minutes, p.EndTime.Seconds, MillisecondsToFramesMaxFrameRate(p.EndTime.Milliseconds));
bool topAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
verticalAlign = topAlign ? "$VertAlign=Top" : "$VertAlign=Bottom";
if (lastVerticalAlign != verticalAlign)
{
sb.AppendLine(verticalAlign);
}
DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendFormat(paragraphWriteFormat, startTime, endTime, DvdStudioPro.EncodeStyles(p.Text));
lastVerticalAlign = verticalAlign;
}
return sb.ToString().Trim();
}
@ -62,7 +52,8 @@ $HorzAlign = Center
_errorCount = 0;
int number = 0;
bool italicOn = false;
bool alignTop = false;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
foreach (string line in lines)
{
if (string.IsNullOrWhiteSpace(line))
@ -84,13 +75,8 @@ $HorzAlign = Center
p.Text = text.Replace(" | ", Environment.NewLine).Replace("|", Environment.NewLine);
p.Text = DvdStudioPro.DecodeStyles(p.Text);
if (italicOn && !p.Text.Contains("<i>"))
{
p.Text = "<i>" + p.Text + "</i>";
}
if (alignTop)
{
p.Text = "{\\an8}" + p.Text;
}
p.Text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + p.Text;
subtitle.Paragraphs.Add(p);
}
}
@ -117,15 +103,11 @@ $HorzAlign = Center
}
else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
var s = line.RemoveChar(' ').RemoveChar('\t');
if (s.Equals("$VertAlign=Bottom", StringComparison.OrdinalIgnoreCase))
{
alignTop = false;
}
else if (s.Equals("$VertAlign=Top", StringComparison.OrdinalIgnoreCase))
{
alignTop = true;
}
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
}
}

View File

@ -57,10 +57,14 @@ $ColorIndex3 = 2
$ColorIndex4 = 3
//Subtitles";
var lastVerticalAlign = "$VertAlign=Bottom";
var lastHorizontalcalAlign = "$HorzAlign=Center";
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (Paragraph p in subtitle.Paragraphs)
{
DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendLine($"{EncodeTimeCode(p.StartTime)},{EncodeTimeCode(p.EndTime)},{EncodeText(p.Text)}");
}
return sb.ToString();
@ -76,6 +80,7 @@ $ColorIndex4 = 3
text = text.Replace("</i>", Italic);
text = text.Replace("<u>", Underline);
text = text.Replace("</u>", Underline);
text = HtmlUtil.RemoveHtmlTags(text, true);
if (allItalic)
return text.Replace(Environment.NewLine, "|^I");
return text.Replace(Environment.NewLine, "|");
@ -99,6 +104,8 @@ $ColorIndex4 = 3
if (fileName != null && fileName.EndsWith(".stl", StringComparison.OrdinalIgnoreCase)) // allow empty text if extension is ".stl"...
timeCodeRegex = RegexTimeCodes2;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
foreach (string line in lines)
{
if (line.IndexOf(':') == 2 && timeCodeRegex.IsMatch(line))
@ -108,7 +115,9 @@ $ColorIndex4 = 3
try
{
Paragraph p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), DecodeText(line.Substring(24)));
var text = DecodeText(line.Substring(24));
text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text;
Paragraph p = new Paragraph(DecodeTimeCode(start), DecodeTimeCode(end), text);
subtitle.Paragraphs.Add(p);
}
catch
@ -116,6 +125,14 @@ $ColorIndex4 = 3
_errorCount++;
}
}
else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$'))
{
_errorCount++;

View File

@ -43,15 +43,56 @@ $TapeOffset = FALSE
\\Colour 6 = Cyan
\\Colour 7 = White
";
var lastVerticalAlign = "$VertAlign = Bottom";
var lastHorizontalcalAlign = "$HorzAlign = Center";
var sb = new StringBuilder();
sb.AppendLine(header);
foreach (Paragraph p in subtitle.Paragraphs)
{
sb.AppendLine($"$HorzAlign = Center\r\n{EncodeTimeCode(p.StartTime)}, {EncodeTimeCode(p.EndTime)}, {EncodeText(p.Text)}");
DvdStudioPro.ToTextAlignment(p, sb, ref lastVerticalAlign, ref lastHorizontalcalAlign);
sb.AppendLine($"{EncodeTimeCode(p.StartTime)}, {EncodeTimeCode(p.EndTime)}, {EncodeText(p.Text)}");
}
return sb.ToString();
}
private static StringBuilder ToTextAlignment(Paragraph p, StringBuilder sb, ref string lastVerticalAlign, ref string lastHorizontalAlign)
{
string verticalAlign;
string horizontalAlign;
bool verticalTopAlign = p.Text.StartsWith("{\\an7}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an8}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
bool verticalCenterAlign = p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an5}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an6}", StringComparison.Ordinal);
if (verticalTopAlign)
verticalAlign = "$VertAlign = Top";
else if (verticalCenterAlign)
verticalAlign = "$VertAlign = Center";
else
verticalAlign = "$VertAlign = Bottom";
if (lastVerticalAlign != verticalAlign)
sb.AppendLine(verticalAlign);
bool horizontalLeftAlign = p.Text.StartsWith("{\\an1}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an4}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an7}", StringComparison.Ordinal);
bool horizontalRightAlign = p.Text.StartsWith("{\\an3}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an6}", StringComparison.Ordinal) ||
p.Text.StartsWith("{\\an9}", StringComparison.Ordinal);
if (horizontalLeftAlign)
horizontalAlign = "$HorzAlign = Left";
else if (horizontalRightAlign)
horizontalAlign = "$HorzAlign = Right";
else
horizontalAlign = "$HorzAlign = Center";
sb.AppendLine(horizontalAlign);
lastVerticalAlign = verticalAlign;
return sb;
}
private static string EncodeText(string text)
{
text = text.Replace("<b>", "^B");
@ -60,6 +101,7 @@ $TapeOffset = FALSE
text = text.Replace("</i>", string.Empty);
text = text.Replace("<u>", "^U");
text = text.Replace("</u>", string.Empty);
text = HtmlUtil.RemoveHtmlTags(text, true);
return text.Replace(Environment.NewLine, "|");
}
@ -73,6 +115,8 @@ $TapeOffset = FALSE
{
//00:01:54:19,00:01:56:17,We should be thankful|they accepted our offer.
_errorCount = 0;
var verticalAlign = "$VertAlign=Bottom";
var horizontalAlign = "$HorzAlign=Center";
subtitle.Paragraphs.Clear();
foreach (string line in lines)
{
@ -83,9 +127,11 @@ $TapeOffset = FALSE
try
{
var text = DecodeText(line.Substring(25).Trim());
text = DvdStudioPro.GetAlignment(verticalAlign, horizontalAlign) + text;
var startTime = DecodeTimeCodeFramesFourParts(start.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries));
var endTime = DecodeTimeCodeFramesFourParts(end.Split(SplitCharColon, StringSplitOptions.RemoveEmptyEntries));
var p = new Paragraph(startTime, endTime, DecodeText(line.Substring(25).Trim()));
var p = new Paragraph(startTime, endTime, text);
subtitle.Paragraphs.Add(p);
}
catch
@ -93,6 +139,14 @@ $TapeOffset = FALSE
_errorCount++;
}
}
else if (line.TrimStart().StartsWith("$VertAlign", StringComparison.OrdinalIgnoreCase))
{
verticalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (line.TrimStart().StartsWith("$HorzAlign", StringComparison.OrdinalIgnoreCase))
{
horizontalAlign = line.RemoveChar(' ').RemoveChar('\t');
}
else if (!string.IsNullOrWhiteSpace(line) && !line.StartsWith("//", StringComparison.Ordinal) && !line.StartsWith('$'))
{
_errorCount++;