2017-11-21 18:24:50 +01:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2017-12-09 08:39:31 +01:00
|
|
|
|
using System.Linq;
|
2017-11-21 18:24:50 +01:00
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Xml;
|
|
|
|
|
|
|
|
|
|
namespace Nikse.SubtitleEdit.Core.SubtitleFormats
|
|
|
|
|
{
|
|
|
|
|
public class FinalDraftTemplate2 : SubtitleFormat
|
|
|
|
|
{
|
|
|
|
|
public override string Extension => ".fdx";
|
|
|
|
|
|
|
|
|
|
public override string Name => "Final Draft Template 2";
|
|
|
|
|
|
2017-12-09 08:39:31 +01:00
|
|
|
|
private List<string> _paragraphTypes;
|
|
|
|
|
|
|
|
|
|
public List<string> GetParagraphTypes(List<string> lines)
|
|
|
|
|
{
|
|
|
|
|
LoadSubtitle(new Subtitle(), lines, null);
|
|
|
|
|
return _paragraphTypes;
|
|
|
|
|
}
|
|
|
|
|
public List<string> ActiveParagraphTypes { get; set; } = new List<string> { "Dialogue", "Parenthetical" };
|
|
|
|
|
|
2017-11-21 18:24:50 +01:00
|
|
|
|
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
|
|
|
|
|
{
|
2017-12-09 08:39:31 +01:00
|
|
|
|
var lowercaseChosencategories = ActiveParagraphTypes.Select(p => p.ToLowerInvariant()).ToList();
|
|
|
|
|
_paragraphTypes = new List<string>();
|
2017-11-21 18:24:50 +01:00
|
|
|
|
_errorCount = 0;
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
var actor = string.Empty;
|
|
|
|
|
lines.ForEach(line => sb.AppendLine(line));
|
|
|
|
|
var xml = new XmlDocument { XmlResolver = null };
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
xml.LoadXml(sb.ToString().Trim());
|
|
|
|
|
foreach (XmlNode node in xml.SelectNodes("FinalDraft/Content/Paragraph"))
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var paragraphType = node.Attributes["Type"];
|
2017-12-09 08:39:31 +01:00
|
|
|
|
if (paragraphType != null)
|
2017-11-21 18:24:50 +01:00
|
|
|
|
{
|
2017-12-09 08:39:31 +01:00
|
|
|
|
if (paragraphType != null && !_paragraphTypes.Contains(paragraphType.InnerText))
|
2019-01-19 14:40:37 +01:00
|
|
|
|
{
|
2017-12-09 08:39:31 +01:00
|
|
|
|
_paragraphTypes.Add(paragraphType.InnerText);
|
2019-01-19 14:40:37 +01:00
|
|
|
|
}
|
2017-11-21 18:24:50 +01:00
|
|
|
|
|
2017-12-09 08:39:31 +01:00
|
|
|
|
sb.Clear();
|
|
|
|
|
foreach (XmlNode text in node.SelectNodes("Text"))
|
|
|
|
|
{
|
|
|
|
|
sb.AppendLine(text.InnerText);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (paragraphType != null && paragraphType.InnerText.Equals("Character", StringComparison.OrdinalIgnoreCase))
|
|
|
|
|
{
|
|
|
|
|
actor = sb.ToString().Replace(Environment.NewLine, " ").Trim();
|
|
|
|
|
actor = actor.Replace("( CONT'D )", string.Empty).Trim();
|
|
|
|
|
actor = actor.Replace("( CONT’D )", string.Empty).Trim();
|
|
|
|
|
actor = actor.Replace("(CONT'D)", string.Empty).Trim();
|
|
|
|
|
actor = actor.Replace("(CONT’D)", string.Empty).Trim();
|
2019-01-21 09:53:15 +01:00
|
|
|
|
actor = actor.ToUpperInvariant();
|
2017-12-09 08:39:31 +01:00
|
|
|
|
}
|
|
|
|
|
else if (paragraphType != null && lowercaseChosencategories.Contains(paragraphType.InnerText.ToLowerInvariant()))
|
|
|
|
|
{
|
|
|
|
|
var p = new Paragraph(Utilities.AutoBreakLine(sb.ToString().Trim()), 0, 0);
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(actor))
|
2019-01-19 14:40:37 +01:00
|
|
|
|
{
|
2017-12-09 08:39:31 +01:00
|
|
|
|
p.Actor = actor;
|
2019-01-19 14:40:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-09 08:39:31 +01:00
|
|
|
|
subtitle.Paragraphs.Add(p);
|
|
|
|
|
}
|
2017-11-21 18:24:50 +01:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
_errorCount++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
subtitle.Renumber();
|
|
|
|
|
}
|
|
|
|
|
catch
|
|
|
|
|
{
|
|
|
|
|
_errorCount = 1;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string ToText(Subtitle subtitle, string title)
|
|
|
|
|
{
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
|
|
foreach (var p in subtitle.Paragraphs)
|
|
|
|
|
{
|
|
|
|
|
sb.AppendLine(p.Text);
|
|
|
|
|
sb.AppendLine();
|
|
|
|
|
}
|
|
|
|
|
return sb.ToString().Trim();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|