Work on TTML IMSC 1.1

This commit is contained in:
Nikolaj Olsson 2024-03-20 21:05:44 +01:00
parent 3db3f275ea
commit 0333813033

View File

@ -16,29 +16,19 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
private static string GetXmlStructure() private static string GetXmlStructure()
{ {
return @"<?xml version='1.0' encoding='UTF-8' standalone='no'?> return @"<?xml version='1.0' encoding='UTF-8'?>
<tt xml:lang='en' xmlns='http://www.w3.org/ns/ttml' ttp:contentProfiles='http://www.w3.org/ns/ttml/profile/imsc1.1/text' xmlns:tts='http://www.w3.org/ns/ttml#styling' xmlns:ttm='http://www.w3.org/ns/ttml#metadata' xmlns:ttp='http://www.w3.org/ns/ttml#parameter' ttp:timeBase='media' ttp:frameRate='24' ttp:frameRateMultiplier='1000 1001' ttp:tickRate='10000000' xmlns:ebutts='urn:ebu:tt:style' xmlns:itts='http://www.w3.org/ns/ttml/profile/imsc1#styling' xmlns:ittp='http://www.w3.org/ns/ttml/profile/imsc1#parameter' xmlns:ittm='http://www.w3.org/ns/ttml/profile/imsc1#metadata' ittp:aspectRatio='16 9'> <tt xml:lang='en' xmlns='http://www.w3.org/ns/ttml' xmlns:ttm='http://www.w3.org/ns/ttml#metadata' xmlns:tts='http://www.w3.org/ns/ttml#styling' xmlns:ttp='http://www.w3.org/ns/ttml#parameter' xmlns:ittp='http://www.w3.org/ns/ttml/profile/imsc1#parameter' xmlns:itts='http://www.w3.org/ns/ttml/profile/imsc1#styling' ttp:profile='http://www.w3.org/ns/ttml/profile/imsc1/text' ttp:frameRate='[framerate]' ttp:timeBase='media'>
<head> <head>
<styling> <styling>
<style xml:id='style.center' tts:backgroundColor='transparent' tts:color='white' tts:fontFamily='Arial' tts:fontSize='100%' tts:textAlign='center' tts:textOutline='black 2px' /> <style xml:id='style.center' tts:color='#ffffff' tts:opacity='1' tts:fontSize='100%' tts:fontFamily='default' tts:textAlign='center'/>
<style xml:id='style.italic' tts:shear='16.6667%' tts:backgroundColor='transparent' tts:color='white' tts:fontFamily='Arial' tts:fontSize='100%' tts:textAlign='center' tts:textOutline='black 2px' /> <style xml:id='italic' tts:shear='16.6667%' tts:opacity='1' tts:fontSize='100%' tts:fontFamily='default' tts:textAlign='center'/>
</styling> </styling>
<layout> <layout>
<region xml:id='region.topLeft' tts:extent='80% 40%' tts:origin='10% 10%' tts:displayAlign='before' tts:textAlign='start' /> <region xml:id='region.bottomCenter' tts:origin='17.583% 73.414%' tts:extent='64.844% 16.667%' tts:displayAlign='after'/>
<region xml:id='region.centerLeft' tts:extent='80% 40%' tts:origin='10% 30%' tts:displayAlign='center' tts:textAlign='start' />
<region xml:id='region.bottomLeft' tts:extent='80% 40%' tts:origin='10% 50%' tts:displayAlign='after' tts:textAlign='start' />
<region xml:id='region.topCenter' tts:extent='80% 40%' tts:origin='10% 10%' tts:displayAlign='before' tts:textAlign='center' />
<region xml:id='region.centerCenter' tts:extent='80% 40%' tts:origin='10% 30%' tts:displayAlign='center' tts:textAlign='center' />
<region xml:id='region.bottomCenter' tts:extent='80% 40%' tts:origin='10% 50%' tts:displayAlign='after' tts:textAlign='center' />
<region xml:id='region.topRight' tts:extent='80% 40%' tts:origin='10% 10%' tts:displayAlign='before' tts:textAlign='end' />
<region xml:id='region.centerRight' tts:extent='80% 40%' tts:origin='10% 30%' tts:displayAlign='center' tts:textAlign='end' />
<region xml:id='region.bottomRight' tts:extent='80% 40%' tts:origin='10% 50%' tts:displayAlign='after' tts:textAlign='end' />
</layout> </layout>
</head> </head>
<body> <body>
<div> <div xml:id='d0' style='style.center'>
</div> </div>
</body> </body>
</tt> </tt>
@ -69,6 +59,8 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
{ {
var xml = new XmlDocument { XmlResolver = null }; var xml = new XmlDocument { XmlResolver = null };
var xmlStructure = GetXmlStructure(); var xmlStructure = GetXmlStructure();
xmlStructure = xmlStructure.Replace("[framerate]", ((int)Math.Round(Configuration.Settings.General.CurrentFrameRate, MidpointRounding.AwayFromZero)).ToString());
var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle); var language = LanguageAutoDetect.AutoDetectGoogleLanguage(subtitle);
xmlStructure = xmlStructure.Replace("lang=\"en\"", $"lang=\"{language}\""); xmlStructure = xmlStructure.Replace("lang=\"en\"", $"lang=\"{language}\"");
xml.LoadXml(xmlStructure); xml.LoadXml(xmlStructure);
@ -101,9 +93,9 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
start.InnerText = TimedText10.ConvertToTimeString(p.StartTime, timeCodeFormat); start.InnerText = TimedText10.ConvertToTimeString(p.StartTime, timeCodeFormat);
paragraph.Attributes.Append(start); paragraph.Attributes.Append(start);
XmlAttribute dur = xml.CreateAttribute("dur"); XmlAttribute end = xml.CreateAttribute("end");
dur.InnerText = TimedText10.ConvertToTimeString(p.Duration, timeCodeFormat); end.InnerText = TimedText10.ConvertToTimeString(p.EndTime, timeCodeFormat);
paragraph.Attributes.Append(dur); paragraph.Attributes.Append(end);
XmlAttribute region = xml.CreateAttribute("region"); XmlAttribute region = xml.CreateAttribute("region");
region.InnerText = GetRegionFromText(p.Text); region.InnerText = GetRegionFromText(p.Text);
@ -161,47 +153,47 @@ namespace Nikse.SubtitleEdit.Core.SubtitleFormats
private static string GetRegionFromText(string text) private static string GetRegionFromText(string text)
{ {
if (text.StartsWith(@"{\an7", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an7", StringComparison.Ordinal))
{ //{
return "region.topLeft"; // return "region.topLeft";
} //}
if (text.StartsWith(@"{\an8", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an8", StringComparison.Ordinal))
{ //{
return "region.topCenter"; // return "region.topCenter";
} //}
if (text.StartsWith(@"{\an9", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an9", StringComparison.Ordinal))
{ //{
return "region.topRight"; // return "region.topRight";
} //}
if (text.StartsWith(@"{\an4", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an4", StringComparison.Ordinal))
{ //{
return "region.centerLeft"; // return "region.centerLeft";
} //}
if (text.StartsWith(@"{\an5", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an5", StringComparison.Ordinal))
{ //{
return "region.centerCenter"; // return "region.centerCenter";
} //}
if (text.StartsWith(@"{\an6", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an6", StringComparison.Ordinal))
{ //{
return "region.centerRight"; // return "region.centerRight";
} //}
if (text.StartsWith(@"{\an1", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an1", StringComparison.Ordinal))
{ //{
return "region.bottomLeft"; // return "region.bottomLeft";
} //}
if (text.StartsWith(@"{\an3", StringComparison.Ordinal)) //if (text.StartsWith(@"{\an3", StringComparison.Ordinal))
{ //{
return "region.bottomRight"; // return "region.bottomRight";
} //}
return "region.bottomCenter"; return "region.bottomCenter";
} }