using System; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Xml; namespace Nikse.SubtitleEdit.Core.SubtitleFormats { public class EZTSubtitlesProject : SubtitleFormat { public override string Extension => ".eztxml"; public override string Name => "EZT XML"; public override bool IsMine(List lines, string fileName) { if (fileName != null && !fileName.EndsWith(Extension, StringComparison.OrdinalIgnoreCase)) { return false; } return base.IsMine(lines, fileName); } public override string ToText(Subtitle subtitle, string title) { var xml = new XmlDocument(); var template = @" open native None HD1080 23.976 fps 16x9 none 30drop ".Replace("'", "\"").Replace("[SUBTITLE_COUNT]", subtitle.Paragraphs.Count.ToString(CultureInfo.InvariantCulture)); template = template.Replace("23.976", Configuration.Settings.General.CurrentFrameRate.ToString(CultureInfo.InvariantCulture)); if (Configuration.Settings.General.CurrentFrameRate % 1.0 < 0.001) { template = template.Replace("30drop", Configuration.Settings.General.CurrentFrameRate.ToString(CultureInfo.InvariantCulture)); } else { template = template.Replace("30drop", ((int)Math.Round(Configuration.Settings.General.CurrentFrameRate)).ToString(CultureInfo.InvariantCulture) + "drop"); } xml.LoadXml(template); var subtitlesNode = xml.DocumentElement.SelectSingleNode("Subtitles"); for (int i = 0; i < subtitle.Paragraphs.Count; i++) { Paragraph p = subtitle.Paragraphs[i]; var subNode = MakeSubNode(xml, p, i + 1); subtitlesNode.AppendChild(subNode); } return ToUtf8XmlString(xml); } private static XmlNode MakeSubNode(XmlDocument xml, Paragraph p, int index) { XmlNode subtitle = xml.CreateElement("Subtitle"); var attrId = xml.CreateAttribute("id"); attrId.Value = "sub" + index; subtitle.Attributes.Append(attrId); var attrNumber = xml.CreateAttribute("number"); attrNumber.Value = index.ToString(CultureInfo.InvariantCulture); subtitle.Attributes.Append(attrNumber); var attrInCue = xml.CreateAttribute("incue"); attrInCue.Value = p.StartTime.ToHHMMSSFF(); subtitle.Attributes.Append(attrInCue); var attrOutCue = xml.CreateAttribute("outcue"); attrOutCue.Value = p.EndTime.ToHHMMSSFF(); subtitle.Attributes.Append(attrOutCue); XmlNode rows = xml.CreateElement("Rows"); foreach (var line in HtmlUtil.RemoveHtmlTags(p.Text, true).SplitToLines()) { XmlNode row = xml.CreateElement("Row"); XmlNode text = xml.CreateElement("Text"); text.InnerText = line; row.AppendChild(text); rows.AppendChild(row); } subtitle.AppendChild(rows); return subtitle; } public override void LoadSubtitle(Subtitle subtitle, List lines, string fileName) { _errorCount = 0; var sb = new StringBuilder(); foreach (string line in lines) { sb.AppendLine(line); } string xml = sb.ToString(); if (!xml.Contains("