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,75 +1870,80 @@ 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)
{
return defaultColor;
}
var f = s.Substring(start, end - start);
if (!f.Contains(" color=", StringComparison.OrdinalIgnoreCase))
{
return defaultColor;
}
var colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase);
if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0)
{
end = s.IndexOf('"', colorStart + " color=".Length + 1);
}
s = s.Substring(colorStart, end - colorStart);
s = s.Replace(" color=", string.Empty);
s = s.Trim('\'').Trim('"').Trim('\'');
try
{
if (s.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase))
{ {
string f = s.Substring(start, end - start); var arr = s.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (f.Contains(" color=", StringComparison.OrdinalIgnoreCase)) return Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
}
if (s.StartsWith("rgba(", StringComparison.OrdinalIgnoreCase))
{
var arr = s
.RemoveChar(' ')
.Remove(0, 5)
.TrimEnd(')')
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var alpha = byte.MaxValue;
if (arr.Length == 4 && float.TryParse(arr[3], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f2))
{ {
int colorStart = f.IndexOf(" color=", StringComparison.OrdinalIgnoreCase); if (f2 >= 0 && f2 < 1)
if (s.IndexOf('"', colorStart + " color=".Length + 1) > 0)
{ {
end = s.IndexOf('"', colorStart + " color=".Length + 1); alpha = (byte)(f2 * byte.MaxValue);
}
s = s.Substring(colorStart, end - colorStart);
s = s.Replace(" color=", string.Empty);
s = s.Trim('\'').Trim('"').Trim('\'');
try
{
if (s.StartsWith("rgb(", StringComparison.OrdinalIgnoreCase))
{
var arr = s.Remove(0, 4).TrimEnd(')').Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
return Color.FromArgb(int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
}
if (s.StartsWith("rgba(", StringComparison.OrdinalIgnoreCase))
{
var arr = s
.RemoveChar(' ')
.Remove(0, 5)
.TrimEnd(')')
.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var alpha = byte.MaxValue;
if (arr.Length == 4 && float.TryParse(arr[3], NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out var f2))
{
if (f2 >= 0 && f2 < 1)
{
alpha = (byte)(f2 * byte.MaxValue);
}
}
return Color.FromArgb(alpha, int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
}
if (s.Length == 9 && s.StartsWith("#"))
{
if (!int.TryParse(s.Substring(7, 2), NumberStyles.HexNumber, null, out var alpha))
{
alpha = 255; // full solid color
}
s = s.Substring(1, 6);
var c = ColorTranslator.FromHtml("#" + s);
return Color.FromArgb(alpha, c);
}
return ColorTranslator.FromHtml(s);
}
catch
{
return defaultColor;
} }
} }
return Color.FromArgb(alpha, int.Parse(arr[0]), int.Parse(arr[1]), int.Parse(arr[2]));
} }
if (s.Length == 9 && s.StartsWith("#"))
{
if (!int.TryParse(s.Substring(7, 2), NumberStyles.HexNumber, null, out var alpha))
{
alpha = 255; // full solid color
}
s = s.Substring(1, 6);
var c = ColorTranslator.FromHtml("#" + s);
return Color.FromArgb(alpha, c);
}
return ColorTranslator.FromHtml(s);
}
catch
{
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());