mirror of
https://github.com/SubtitleEdit/subtitleedit.git
synced 2024-10-27 22:42:38 +01:00
Add some support for ASSA inline color in bdsup export - thx Adam :)
This commit is contained in:
parent
ffc754d4e9
commit
fea8b4c83d
@ -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)
|
||||||
|
@ -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());
|
||||||
|
Loading…
Reference in New Issue
Block a user