private static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) { try { var lines = new List<string>(); foreach (string s in subtitle.Header.SplitToLines()) lines.Add(s); var tt = new TimedText10(); var sub = new Subtitle(); tt.LoadSubtitle(sub, lines, string.Empty); var xml = new XmlDocument(); xml.LoadXml(subtitle.Header); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); int stylexmlCount = 0; var ttStyles = new StringBuilder(); foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) { string name = null; if (node.Attributes["xml:id"] != null) name = node.Attributes["xml:id"].Value; else if (node.Attributes["id"] != null) name = node.Attributes["id"].Value; if (name != null) { stylexmlCount++; string fontFamily = "Arial"; if (node.Attributes["tts:fontFamily"] != null) fontFamily = node.Attributes["tts:fontFamily"].Value; string fontWeight = "normal"; if (node.Attributes["tts:fontWeight"] != null) fontWeight = node.Attributes["tts:fontWeight"].Value; string fontStyle = "normal"; if (node.Attributes["tts:fontStyle"] != null) fontStyle = node.Attributes["tts:fontStyle"].Value; string color = "#ffffff"; if (node.Attributes["tts:color"] != null) color = node.Attributes["tts:color"].Value.Trim(); Color c = Color.White; try { if (color.StartsWith("rgb(", StringComparison.Ordinal)) { string[] arr = color.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(color); } } catch { } string fontSize = "20"; if (node.Attributes["tts:fontSize"] != null) fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); int fSize; if (!int.TryParse(fontSize, out fSize)) fSize = 20; string italic = "0"; if (fontStyle == "italic") italic = "1"; string bold = "0"; if (fontWeight == "bold") bold = "1"; const string styleFormat = "Style: {0},{1},{2},{3},&H0300FFFF,&H00000000,&H02000000,{4},{5},0,0,100,100,0,0,1,2,2,2,10,10,10,1"; ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, GetSsaColorString(c), bold, italic)); } } if (stylexmlCount > 0) { sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); subtitle.Header = sb.ToString(); } else { sb.AppendLine(string.Format(header, title)); } // Set correct style on paragraphs foreach (Paragraph p in subtitle.Paragraphs) { if (p.Extra != null && p.Extra.Contains('/')) { p.Extra = p.Extra.Split('/')[0].Trim(); } } } catch { sb.AppendLine(string.Format(header, title)); } }
private static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) { try { var lines = new List<string>(); foreach (string s in subtitle.Header.Replace(Environment.NewLine, "\n").Split('\n')) lines.Add(s); var tt = new TimedText10(); var sub = new Subtitle(); tt.LoadSubtitle(sub, lines, string.Empty); var xml = new XmlDocument(); xml.LoadXml(subtitle.Header); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); int stylexmlCount = 0; var ttStyles = new StringBuilder(); foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) { string name = null; if (node.Attributes["xml:id"] != null) name = node.Attributes["xml:id"].Value; else if (node.Attributes["id"] != null) name = node.Attributes["id"].Value; if (name != null) { stylexmlCount++; string fontFamily = "Arial"; if (node.Attributes["tts:fontFamily"] != null) fontFamily = node.Attributes["tts:fontFamily"].Value; string fontWeight = "normal"; if (node.Attributes["tts:fontWeight"] != null) fontWeight = node.Attributes["tts:fontWeight"].Value; string fontStyle = "normal"; if (node.Attributes["tts:fontStyle"] != null) fontStyle = node.Attributes["tts:fontStyle"].Value; string color = "#ffffff"; if (node.Attributes["tts:color"] != null) color = node.Attributes["tts:color"].Value.Trim(); var c = Color.White; try { if (color.StartsWith("rgb(", StringComparison.Ordinal)) { string[] arr = color.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(color); } } catch { } string fontSize = "20"; if (node.Attributes["tts:fontSize"] != null) fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); int fSize; if (!int.TryParse(fontSize, out fSize)) fSize = 20; const string styleFormat = "Style: {0},{1},{2},{3},65535,65535,-2147483640,-1,0,1,3,0,2,10,10,10,0,1"; ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, c.ToArgb())); } } if (stylexmlCount > 0) { sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); subtitle.Header = sb.ToString(); } else { sb.AppendLine(string.Format(header, title)); } } catch { sb.AppendLine(string.Format(header, title)); } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().Replace(" & ", " & ").Replace("Q&A", "Q&A").RemoveControlCharactersButWhiteSpace().Trim()); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); var div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).SelectSingleNode("ttaf1:div", nsmgr); if (div == null) { div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).FirstChild; } var styleDic = new Dictionary <string, string>(); foreach (XmlNode node in xml.DocumentElement.SelectNodes("//ttaf1:style", nsmgr)) { if (node.Attributes["tts:fontStyle"] != null && node.Attributes["xml:id"] != null) { styleDic.Add(node.Attributes["xml:id"].Value, node.Attributes["tts:fontStyle"].Value); } } bool couldBeFrames = true; bool couldBeMillisecondsWithMissingLastDigit = true; foreach (XmlNode node in div.ChildNodes) { try { var pText = new StringBuilder(); foreach (XmlNode innerNode in node.ChildNodes) { switch (innerNode.Name.Replace("tt:", string.Empty)) { case "br": pText.AppendLine(); break; case "span": bool italic = false; if (innerNode.Attributes["style"] != null && styleDic.ContainsKey(innerNode.Attributes["style"].Value)) { if (styleDic[innerNode.Attributes["style"].Value].Contains("italic")) { italic = true; pText.Append("<i>"); } } if (!italic && innerNode.Attributes != null) { var fs = innerNode.Attributes.GetNamedItem("tts:fontStyle"); if (fs != null && fs.Value == "italic") { italic = true; pText.Append("<i>"); } } if (innerNode.HasChildNodes) { foreach (XmlNode innerInnerNode in innerNode.ChildNodes) { if (innerInnerNode.Name == "br" || innerInnerNode.Name == "tt:br") { pText.AppendLine(); } else { pText.Append(innerInnerNode.InnerText); } } } else { pText.Append(innerNode.InnerText); } if (italic) { pText.Append("</i>"); } break; case "i": pText.Append("<i>" + innerNode.InnerText + "</i>"); break; case "b": pText.Append("<b>" + innerNode.InnerText + "</b>"); break; default: pText.Append(innerNode.InnerText); break; } } string start = null; string end = null; string dur = null; foreach (XmlAttribute attr in node.Attributes) { if (attr.Name.EndsWith("begin", StringComparison.Ordinal)) { start = attr.InnerText; } else if (attr.Name.EndsWith("end", StringComparison.Ordinal)) { end = attr.InnerText; } else if (attr.Name.EndsWith("duration", StringComparison.Ordinal)) { dur = attr.InnerText; } } string text = pText.ToString(); text = text.Replace(Environment.NewLine + "</i>", "</i>" + Environment.NewLine); text = text.Replace("<i></i>", string.Empty).Trim(); if (end != null) { if (end.Length != 11 || end.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (end.Length != 11 || start == null || start.Length != 11 || end.Substring(8, 1) != "." || start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } double dBegin, dEnd; if (!start.Contains(':') && Utilities.CountTagInText(start, '.') == 1 && !end.Contains(':') && Utilities.CountTagInText(end, '.') == 1 && double.TryParse(start, NumberStyles.Float, CultureInfo.InvariantCulture, out dBegin) && double.TryParse(end, NumberStyles.Float, CultureInfo.InvariantCulture, out dEnd)) { subtitle.Paragraphs.Add(new Paragraph(text, dBegin * TimeCode.BaseUnit, dEnd * TimeCode.BaseUnit)); } else { if (start.Length == 8 && start[2] == ':' && start[5] == ':' && end.Length == 8 && end[2] == ':' && end[5] == ':') { var p = new Paragraph(); var parts = start.Split(SplitCharColon); p.StartTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); parts = end.Split(SplitCharColon); p.EndTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); p.Text = text; subtitle.Paragraphs.Add(p); } else { subtitle.Paragraphs.Add(new Paragraph(TimedText10.GetTimeCode(start, false), TimedText10.GetTimeCode(end, false), text)); } } } else if (dur != null) { if (dur.Length != 11 || dur.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (dur.Length != 11 || start == null || start.Length != 11 || dur.Substring(8, 1) != "." || start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } TimeCode duration = TimedText10.GetTimeCode(dur, false); TimeCode startTime = TimedText10.GetTimeCode(start, false); var endTime = new TimeCode(startTime.TotalMilliseconds + duration.TotalMilliseconds); subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.RemoveEmptyLines(); if (couldBeFrames) { bool all30OrBelow = true; foreach (Paragraph p in subtitle.Paragraphs) { if (p.StartTime.Milliseconds > 30 || p.EndTime.Milliseconds > 30) { all30OrBelow = false; } } if (all30OrBelow) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds = SubtitleFormat.FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = SubtitleFormat.FramesToMillisecondsMax999(p.EndTime.Milliseconds); } } } else if (couldBeMillisecondsWithMissingLastDigit && Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource != "hh:mm:ss.ms-two-digits") { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds *= 10; p.EndTime.Milliseconds *= 10; } } subtitle.Renumber(); }
private static void LoadStylesFromTimedText10(Subtitle subtitle, string title, string header, string headerNoStyles, StringBuilder sb) { try { var lines = subtitle.Header.SplitToLines(); var tt = new TimedText10(); var sub = new Subtitle(); tt.LoadSubtitle(sub, lines, string.Empty); var xml = new XmlDocument(); xml.LoadXml(subtitle.Header); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); XmlNode head = xml.DocumentElement.SelectSingleNode("ttml:head", nsmgr); int stylexmlCount = 0; var ttStyles = new StringBuilder(); foreach (XmlNode node in head.SelectNodes("//ttml:style", nsmgr)) { string name = null; if (node.Attributes["xml:id"] != null) { name = node.Attributes["xml:id"].Value; } else if (node.Attributes["id"] != null) { name = node.Attributes["id"].Value; } if (name != null) { stylexmlCount++; string fontFamily = "Arial"; if (node.Attributes["tts:fontFamily"] != null) { fontFamily = node.Attributes["tts:fontFamily"].Value; } string fontWeight = "normal"; if (node.Attributes["tts:fontWeight"] != null) { fontWeight = node.Attributes["tts:fontWeight"].Value; } string fontStyle = "normal"; if (node.Attributes["tts:fontStyle"] != null) { fontStyle = node.Attributes["tts:fontStyle"].Value; } string color = "#ffffff"; if (node.Attributes["tts:color"] != null) { color = node.Attributes["tts:color"].Value.Trim(); } Color c; try { if (color.StartsWith("rgb(", StringComparison.Ordinal)) { string[] arr = color.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(color); } } catch { c = Color.White; } string fontSize = "20"; if (node.Attributes["tts:fontSize"] != null) { fontSize = node.Attributes["tts:fontSize"].Value.Replace("px", string.Empty).Replace("em", string.Empty); } if (!int.TryParse(fontSize, out var fSize)) { fSize = 20; } const string styleFormat = "Style: {0},{1},{2},{3},65535,65535,-2147483640,-1,0,1,3,0,2,10,10,10,0,1"; ttStyles.AppendLine(string.Format(styleFormat, name, fontFamily, fSize, c.ToArgb())); } } if (stylexmlCount > 0) { sb.AppendLine(string.Format(headerNoStyles, title, ttStyles)); subtitle.Header = sb.ToString(); } else { sb.AppendLine(string.Format(header, title)); } } catch { sb.AppendLine(string.Format(header, title)); } }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().RemoveControlCharactersButWhiteSpace().Trim()); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("tt", xml.DocumentElement.NamespaceURI); XmlNode body = xml.DocumentElement.SelectSingleNode("//tt:body", nsmgr); if (body == null) { body = xml.DocumentElement.SelectSingleNode("//tt:body", nsmgr); } bool couldBeFrames = true; bool couldBeMillisecondsWithMissingLastDigit = true; foreach (XmlNode node in body.ChildNodes) { try { var pText = new StringBuilder(); foreach (XmlNode innerNode in node.ChildNodes) { if (innerNode.Name == "image" || innerNode.Name.EndsWith(":image", StringComparison.Ordinal)) { var src = innerNode.Attributes["src"]; if (src != null) { pText.Append(src.InnerText); } break; } } string start = null; string end = null; string dur = null; foreach (XmlAttribute attr in node.Attributes) { if (attr.Name.EndsWith("begin", StringComparison.Ordinal)) { start = attr.InnerText; } else if (attr.Name.EndsWith("end", StringComparison.Ordinal)) { end = attr.InnerText; } else if (attr.Name.EndsWith("duration", StringComparison.Ordinal)) { dur = attr.InnerText; } } if (start == null) { continue; } string text = pText.ToString(); text = text.Replace(Environment.NewLine + "</i>", "</i>" + Environment.NewLine); text = text.Replace("<i></i>", string.Empty).Trim(); if (end != null) { if (end.Length != 11 || end.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (end.Length != 11 || start == null || start.Length != 11 || end.Substring(8, 1) != "." || start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } double dBegin, dEnd; if (!start.Contains(':') && Utilities.CountTagInText(start, '.') == 1 && !end.Contains(':') && Utilities.CountTagInText(end, '.') == 1 && double.TryParse(start, NumberStyles.Float, CultureInfo.InvariantCulture, out dBegin) && double.TryParse(end, NumberStyles.Float, CultureInfo.InvariantCulture, out dEnd)) { subtitle.Paragraphs.Add(new Paragraph(text, dBegin * TimeCode.BaseUnit, dEnd * TimeCode.BaseUnit)); } else { if (!couldBeFrames) { if (end.Length == 11 && end[8] == '.') // 00:05:36.92 { end += "0"; } else if (end.Length == 10 && end[8] == '.') // 00:05:36.9 { end += "00"; } if (start.Length == 11 && start[8] == '.') // 00:05:36.92 { start += "0"; } else if (start.Length == 10 && start[8] == '.') // 00:05:36.9 { start += "00"; } couldBeMillisecondsWithMissingLastDigit = false; } if (start.Length == 8 && start[2] == ':' && start[5] == ':' && end.Length == 8 && end[2] == ':' && end[5] == ':') { var p = new Paragraph(); var parts = start.Split(SplitCharColon); p.StartTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); parts = end.Split(SplitCharColon); p.EndTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); p.Text = text; subtitle.Paragraphs.Add(p); } else { subtitle.Paragraphs.Add(new Paragraph(TimedText10.GetTimeCode(start, false), TimedText10.GetTimeCode(end, false), text)); } } } else if (dur != null) { if (dur.Length != 11 || dur.Substring(8, 1) != ":" || start == null || start.Length != 11 || start.Substring(8, 1) != ":") { couldBeFrames = false; } if (couldBeMillisecondsWithMissingLastDigit && (dur.Length != 11 || start == null || start.Length != 11 || dur.Substring(8, 1) != "." || start.Substring(8, 1) != ".")) { couldBeMillisecondsWithMissingLastDigit = false; } TimeCode duration = TimedText10.GetTimeCode(dur, false); TimeCode startTime = TimedText10.GetTimeCode(start, false); var endTime = new TimeCode(startTime.TotalMilliseconds + duration.TotalMilliseconds); subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.RemoveEmptyLines(); if (couldBeFrames) { bool all30OrBelow = true; foreach (Paragraph p in subtitle.Paragraphs) { if (p.StartTime.Milliseconds > 30 || p.EndTime.Milliseconds > 30) { all30OrBelow = false; } } if (all30OrBelow) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds = FramesToMillisecondsMax999(p.StartTime.Milliseconds); p.EndTime.Milliseconds = FramesToMillisecondsMax999(p.EndTime.Milliseconds); } } } else if (couldBeMillisecondsWithMissingLastDigit) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds *= 10; p.EndTime.Milliseconds *= 10; } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().RemoveControlCharactersButWhiteSpace().Trim().Replace("http://www.w3.org/2006/04/ttaf1#styling\"xml:lang", "http://www.w3.org/2006/04/ttaf1#styling\" xml:lang")); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); foreach (XmlNode node in xml.DocumentElement.SelectNodes("//ttaf1:p", nsmgr)) { try { var pText = new StringBuilder(); foreach (XmlNode innerNode in node.ChildNodes) { switch (innerNode.Name) { case "br": pText.AppendLine(); break; case "span": bool italic = false; if (innerNode.Attributes != null) { var fs = innerNode.Attributes.GetNamedItem("tts:fontStyle"); if (fs != null && fs.Value == "italic") { italic = true; pText.Append("<i>"); } } if (innerNode.HasChildNodes) { foreach (XmlNode innerInnerNode in innerNode.ChildNodes) { if (innerInnerNode.Name == "br") { pText.AppendLine(); } else { pText.Append(innerInnerNode.InnerText); } } } else { pText.Append(innerNode.InnerText); } if (italic) { pText.Append("</i>"); } break; default: pText.Append(innerNode.InnerText); break; } } string start = node.Attributes["begin"].InnerText; string text = pText.ToString(); text = text.Replace(Environment.NewLine + "</i>", "</i>" + Environment.NewLine); text = text.Replace("<i></i>", string.Empty); if (node.Attributes["end"] != null) { string end = node.Attributes["end"].InnerText; subtitle.Paragraphs.Add(new Paragraph(TimedText10.GetTimeCode(start, false), TimedText10.GetTimeCode(end, false), text)); } else if (node.Attributes["dur"] != null) { TimeCode duration = TimedText10.GetTimeCode(node.Attributes["dur"].InnerText, false); TimeCode startTime = TimedText10.GetTimeCode(start, false); var endTime = new TimeCode(startTime.TotalMilliseconds + duration.TotalMilliseconds); subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } bool allBelow100 = true; foreach (Paragraph p in subtitle.Paragraphs) { p.Text = Utilities.RemoveUnneededSpaces(p.Text, null).Replace(Environment.NewLine + Environment.NewLine, Environment.NewLine); if (p.StartTime.Milliseconds >= 100 || p.EndTime.Milliseconds >= 100) { allBelow100 = false; } } if (allBelow100) { foreach (Paragraph p in subtitle.Paragraphs) { p.StartTime.Milliseconds *= 10; p.EndTime.Milliseconds *= 10; } } subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null }; xml.LoadXml(sb.ToString().RemoveControlCharactersButWhiteSpace().Trim()); var nsmgr = new XmlNamespaceManager(xml.NameTable); nsmgr.AddNamespace("ttaf1", xml.DocumentElement.NamespaceURI); XmlNode div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).SelectSingleNode("ttaf1:div", nsmgr); if (div == null) { div = xml.DocumentElement.SelectSingleNode("//ttaf1:body", nsmgr).FirstChild; } var styleDic = new Dictionary <string, string>(); foreach (XmlNode node in xml.DocumentElement.SelectNodes("//ttaf1:style", nsmgr)) { if (node.Attributes["tts:fontStyle"] != null && node.Attributes["xml:id"] != null) { styleDic.Add(node.Attributes["xml:id"].Value, node.Attributes["tts:fontStyle"].Value); } } foreach (XmlNode node in div.ChildNodes) { try { var pText = new StringBuilder(); foreach (XmlNode innerNode in node.ChildNodes) { switch (innerNode.Name) { case "br": pText.AppendLine(); break; case "span": bool italic = false; if (innerNode.Attributes["style"] != null && styleDic.ContainsKey(innerNode.Attributes["style"].Value)) { if (styleDic[innerNode.Attributes["style"].Value].Contains("italic")) { italic = true; pText.Append("<i>"); } } if (!italic && innerNode.Attributes != null) { var fs = innerNode.Attributes.GetNamedItem("tts:fontStyle"); if (fs != null && fs.Value == "italic") { italic = true; pText.Append("<i>"); } } if (innerNode.HasChildNodes) { foreach (XmlNode innerInnerNode in innerNode.ChildNodes) { if (innerInnerNode.Name == "br") { pText.AppendLine(); } else { pText.Append(innerInnerNode.InnerText); } } } else { pText.Append(innerNode.InnerText); } if (italic) { pText.Append("</i>"); } break; case "i": pText.Append("<i>" + innerNode.InnerText + "</i>"); break; case "b": pText.Append("<b>" + innerNode.InnerText + "</b>"); break; default: pText.Append(innerNode.InnerText); break; } } string start = null; // = node.Attributes["begin"].InnerText; string end = null; // = node.Attributes["begin"].InnerText; string dur = null; // = node.Attributes["begin"].InnerText; foreach (XmlAttribute attr in node.Attributes) { if (attr.Name.EndsWith("begin", StringComparison.Ordinal)) { start = attr.InnerText; } else if (attr.Name.EndsWith("end", StringComparison.Ordinal)) { end = attr.InnerText; } else if (attr.Name.EndsWith("duration", StringComparison.Ordinal)) { dur = attr.InnerText; } } //string start = node.Attributes["begin"].InnerText; string text = pText.ToString(); text = text.Replace(Environment.NewLine + "</i>", "</i>" + Environment.NewLine); text = text.Replace("<i></i>", string.Empty).Trim(); if (end != null) { //string end = node.Attributes["end"].InnerText; double dBegin, dEnd; if (!start.Contains(':') && Utilities.CountTagInText(start, '.') == 1 && !end.Contains(':') && Utilities.CountTagInText(end, '.') == 1 && double.TryParse(start, out dBegin) && double.TryParse(end, out dEnd)) { subtitle.Paragraphs.Add(new Paragraph(text, dBegin * TimeCode.BaseUnit, dEnd * TimeCode.BaseUnit)); } else { if (start.Length == 8 && start[2] == ':' && start[5] == ':' && end.Length == 8 && end[2] == ':' && end[5] == ':') { var p = new Paragraph(); var parts = start.Split(new[] { ':' }); p.StartTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); parts = end.Split(new[] { ':' }); p.EndTime = new TimeCode(int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), 0); p.Text = text; subtitle.Paragraphs.Add(p); } else { subtitle.Paragraphs.Add(new Paragraph(TimedText10.GetTimeCode(start, false), TimedText10.GetTimeCode(end, false), text)); } } } else if (dur != null) { TimeCode duration = TimedText10.GetTimeCode(dur, false); TimeCode startTime = TimedText10.GetTimeCode(start, false); var endTime = new TimeCode(startTime.TotalMilliseconds + duration.TotalMilliseconds); subtitle.Paragraphs.Add(new Paragraph(startTime, endTime, text)); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); _errorCount++; } } subtitle.RemoveEmptyLines(); subtitle.Renumber(); }
public override void LoadSubtitle(Subtitle subtitle, List <string> lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); lines.ForEach(line => sb.AppendLine(line)); var xml = new XmlDocument { XmlResolver = null, PreserveWhitespace = true }; try { xml.LoadXml(sb.ToString().RemoveControlCharactersButWhiteSpace().Trim()); } catch { xml.LoadXml(sb.ToString().Replace(" & ", " & ").Replace("Q&A", "Q&A").RemoveControlCharactersButWhiteSpace().Trim()); } var frameRateAttr = xml.DocumentElement.Attributes["ttp:frameRate"]; if (frameRateAttr != null) { if (double.TryParse(frameRateAttr.Value, out var fr)) { if (fr > 20 && fr < 100) { Configuration.Settings.General.CurrentFrameRate = fr; } var frameRateMultiplier = xml.DocumentElement.Attributes["ttp:frameRateMultiplier"]; if (frameRateMultiplier != null) { if (frameRateMultiplier.InnerText == "999 1000" && Math.Abs(fr - 30) < 0.01) { Configuration.Settings.General.CurrentFrameRate = 29.97; } else if (frameRateMultiplier.InnerText == "999 1000" && Math.Abs(fr - 24) < 0.01) { Configuration.Settings.General.CurrentFrameRate = 23.976; } else { var arr = frameRateMultiplier.InnerText.Split(); if (arr.Length == 2 && Utilities.IsInteger(arr[0]) && Utilities.IsInteger(arr[1]) && int.Parse(arr[1]) > 0) { fr = double.Parse(arr[0]) / double.Parse(arr[1]); if (fr > 20 && fr < 100) { Configuration.Settings.General.CurrentFrameRate = fr; } } } } } } if (BatchSourceFrameRate.HasValue) { Configuration.Settings.General.CurrentFrameRate = BatchSourceFrameRate.Value; } Configuration.Settings.SubtitleSettings.TimedText10TimeCodeFormatSource = null; subtitle.Header = sb.ToString(); var namespaceManager = new XmlNamespaceManager(xml.NameTable); namespaceManager.AddNamespace("ttml", "http://www.w3.org/ns/ttml"); var body = xml.DocumentElement.SelectSingleNode("ttml:body", namespaceManager); foreach (XmlNode node in body.SelectNodes("//ttml:p", namespaceManager)) { TimedText10.ExtractTimeCodes(node, subtitle, out var begin, out var end); var assStyle = string.Empty; var region = node.Attributes?["region"]; if (region != null) { assStyle = GetAssStyleFromRegion(region.InnerText); } var text = assStyle + ReadParagraph(node, xml); var p = new Paragraph(begin, end, text); subtitle.Paragraphs.Add(p); } subtitle.Renumber(); }
private static List <string> GetStyles() { return(TimedText10.GetStylesFromHeader(GetXmlStructure())); }