Add some support for ASSA inline color in bdsup export - thx Adam :)

This commit is contained in:
niksedk 2023-11-05 17:48:15 +01:00
parent ffc754d4e9
commit fea8b4c83d
2 changed files with 81 additions and 84 deletions

View File

@ -1870,17 +1870,26 @@ namespace Nikse.SubtitleEdit.Core.Common
public static Color GetColorFromFontString(string text, Color defaultColor) public static Color GetColorFromFontString(string text, Color defaultColor)
{ {
string s = text.TrimEnd(); var s = text.TrimEnd();
int start = s.IndexOf("<font ", StringComparison.OrdinalIgnoreCase); var start = s.IndexOf("<font ", StringComparison.OrdinalIgnoreCase);
if (start >= 0 && s.EndsWith("</font>", StringComparison.OrdinalIgnoreCase)) if (start < 0 || !s.EndsWith("</font>", StringComparison.OrdinalIgnoreCase))
{ {
int end = s.IndexOf('>', start); return defaultColor;
if (end > 0) }
var end = s.IndexOf('>', start);
if (end <= 0)
{ {
string f = s.Substring(start, end - start); return defaultColor;
if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) }
var f = s.Substring(start, end - start);
if (!f.Contains(" color=", StringComparison.OrdinalIgnoreCase))
{ {
int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); return defaultColor;
}
var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase);
if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0) if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0)
{ {
end = s.IndexOf('"', colorStart + " color=".Length + 1); end = s.IndexOf('"', colorStart + " color=".Length + 1);
@ -1936,10 +1945,6 @@ namespace Nikse.SubtitleEdit.Core.Common
return defaultColor; return defaultColor;
} }
} }
}
}
return defaultColor;
}
public static string[] SplitForChangedCalc(string s, bool ignoreLineBreaks, bool ignoreFormatting, bool breakToLetters) public static string[] SplitForChangedCalc(string s, bool ignoreLineBreaks, bool ignoreFormatting, bool breakToLetters)
{ {

View File

@ -2758,15 +2758,7 @@ $DROP=[DROPVALUE]" + Environment.NewLine + Environment.NewLine +
try try
{ {
colorStack.Push(c); // save old color colorStack.Push(c); // save old color
if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) c = Settings.FromHtml(fontColor);
{
arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
}
else
{
c = ColorTranslator.FromHtml(fontColor);
}
} }
catch catch
{ {
@ -3592,15 +3584,7 @@ $DROP=[DROPVALUE]" + Environment.NewLine + Environment.NewLine +
try try
{ {
colorStack.Push(c); // save old color colorStack.Push(c); // save old color
if (fontColor.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase)) c = Settings.FromHtml(fontColor);
{
arr = fontColor.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
c = Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
}
else
{
c = ColorTranslator.FromHtml(fontColor);
}
} }
catch catch
{ {
@ -3987,24 +3971,32 @@ $DROP=[DROPVALUE]" + Environment.NewLine + Environment.NewLine +
var assTags = s.Substring(k + 1, l - k - 1).Split('\\'); var assTags = s.Substring(k + 1, l - k - 1).Split('\\');
var sb = new StringBuilder(); var sb = new StringBuilder();
foreach (var assTag in assTags) foreach (var assaTag in assTags)
{ {
if (assTag == "i1") if (assaTag == "i1")
{ {
sb.Append("<i>"); sb.Append("<i>");
} }
else if (assTag == "i" || assTag == "i0") else if (assaTag == "i" || assaTag == "i0")
{ {
sb.Append("</i>"); sb.Append("</i>");
} }
else if (assTag == "b1" || assTag == "b2" || assTag == "b3" || assTag == "b4") else if (assaTag == "b1" || assaTag == "b2" || assaTag == "b3" || assaTag == "b4")
{ {
sb.Append("<b>"); sb.Append("<b>");
} }
else if (assTag == "b" || assTag == "b0") else if (assaTag == "b" || assaTag == "b0")
{ {
sb.Append("</b>"); sb.Append("</b>");
} }
else if (assaTag.StartsWith("c&H", StringComparison.OrdinalIgnoreCase) && assaTag.EndsWith('&'))
{
var color = AdvancedSubStationAlpha.GetSsaColor(assaTag.TrimStart('c'), Color.Transparent);
if (color != Color.Transparent)
{
sb.Append($"<font color={Utilities.ColorToHexWithTransparency(color)}>");
}
}
} }
s = s.Remove(k, l - k + 1); s = s.Remove(k, l - k + 1);
s = s.Insert(k, sb.ToString()); s = s.Insert(k, sb.ToString());