git-svn-id: https://subtitleedit.googlecode.com/svn/trunk@386 99eadd0c-20b8-1223-b5c4-2a2b2df33de2

This commit is contained in:
niksedk 2011-04-07 05:17:03 +00:00
parent b821058b74
commit 47cca73209
14 changed files with 732 additions and 389 deletions

View File

@ -3,7 +3,7 @@ Subtitle Edit Changelog
3.2 (net yet released)
* NEW:
* Subtitle formats: D-Cinema, Cavena890
* Subtitle formats: D-Cinema, Cavena890, Timed Text 1.0
* Most important shortcuts in Options -> Settings
* Command line conversion between subtitle formats (example: subtitleedit /convert *.srt microdvd)
* Subtitle preview font size (below video player) is now available in Options -> Settings
@ -12,8 +12,9 @@ Subtitle Edit Changelog
* Transscript importer...???
* Plug-ins...???
* IMPROVED:
* OCR unknown words highlighting now works better
* Merge short lines can now also merge lines ending with ".", "?", or "!" (optional)
* Can now read Adobe Encore files starting with line numbers
* Merge short lines can now also merge lines ending with ".", "?", or "!"
* FIXED:
* Adjust all times did not work for MicroDvd
* Remove empty white spaces from Google translate

View File

@ -340,6 +340,7 @@
this.contextMenuStripEmpty = new System.Windows.Forms.ContextMenuStrip(this.components);
this.insertLineToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.imageListPlayRate = new System.Windows.Forms.ImageList(this.components);
this.transcriptImporterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.statusStrip1.SuspendLayout();
this.toolStrip1.SuspendLayout();
this.menuStrip1.SuspendLayout();
@ -1336,7 +1337,8 @@
this.toolStripMenuItemAdjustAllTimes,
this.visualSyncToolStripMenuItem,
this.toolStripMenuItemPointSync,
this.toolStripMenuItemChangeFrameRate2});
this.toolStripMenuItemChangeFrameRate2,
this.transcriptImporterToolStripMenuItem});
this.toolStripMenuItemSyncronization.Name = "toolStripMenuItemSyncronization";
this.toolStripMenuItemSyncronization.Size = new System.Drawing.Size(97, 20);
this.toolStripMenuItemSyncronization.Text = "Syncronization";
@ -3378,6 +3380,13 @@
this.imageListPlayRate.Images.SetKeyName(0, "FastForward.png");
this.imageListPlayRate.Images.SetKeyName(1, "FastForwardHighLight.png");
//
// transcriptImporterToolStripMenuItem
//
this.transcriptImporterToolStripMenuItem.Name = "transcriptImporterToolStripMenuItem";
this.transcriptImporterToolStripMenuItem.Size = new System.Drawing.Size(336, 22);
this.transcriptImporterToolStripMenuItem.Text = "Transcript importer...";
this.transcriptImporterToolStripMenuItem.Click += new System.EventHandler(this.transcriptImporterToolStripMenuItem_Click);
//
// Main
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -3763,6 +3772,7 @@
private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemCopySourceText;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator21;
private System.Windows.Forms.ToolStripMenuItem editSelectAllToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem transcriptImporterToolStripMenuItem;
}
}

View File

@ -78,6 +78,7 @@ namespace Nikse.SubtitleEdit.Forms
NetworkChat _networkChat = null;
ShowEarlierLater _showEarlierOrLater = null;
TranscriptImporter _transcriptImporter = null;
bool _isVideoControlsUnDocked = false;
VideoPlayerUnDocked _videoPlayerUnDocked = null;
@ -6483,12 +6484,20 @@ namespace Nikse.SubtitleEdit.Forms
if (!string.IsNullOrEmpty(importText.VideoFileName))
OpenVideo(importText.VideoFileName);
var ti = new TranscriptImporter();
ti.Initialize(importText.FixedSubtitle, this);
ti.Top = this.Top + 100;
ti.Left = this.Left + (this.Width / 2) - (ti.Width / 3);
ti.Show(this);
if (_transcriptImporter != null && !_transcriptImporter.IsDisposed)
{
_transcriptImporter.WindowState = FormWindowState.Normal;
_transcriptImporter.Focus();
return;
}
_transcriptImporter = new TranscriptImporter();
_transcriptImporter.Initialize(importText.FixedSubtitle, this);
_transcriptImporter.Top = this.Top + 100;
_transcriptImporter.Left = this.Left + (this.Width / 2) - (_transcriptImporter.Width / 3);
_transcriptImporter.Show(this);
//SyncPointsSync syncPointSync = new SyncPointsSync();
//syncPointSync.Initialize(importText.FixedSubtitle, _fileName, importText.VideoFileName, _videoAudioTrackNumber);
@ -9735,5 +9744,22 @@ namespace Nikse.SubtitleEdit.Forms
SubtitleListview1.Items[i].Selected = true;
}
private void transcriptImporterToolStripMenuItem_Click(object sender, EventArgs e)
{
if (_transcriptImporter != null && !_transcriptImporter.IsDisposed)
{
_transcriptImporter.WindowState = FormWindowState.Normal;
_transcriptImporter.Focus();
return;
}
_transcriptImporter = new TranscriptImporter();
_transcriptImporter.Initialize(new Subtitle(), this);
_transcriptImporter.Top = this.Top + 100;
_transcriptImporter.Left = this.Left + (this.Width / 2) - (_transcriptImporter.Width / 3);
_transcriptImporter.Show(this);
}
}
}

View File

@ -580,6 +580,9 @@
<metadata name="toolStripWaveControls.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>208, 56</value>
</metadata>
<metadata name="toolStripWaveControls.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>208, 56</value>
</metadata>
<data name="toolStripButtonWaveFormZoomOut.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
@ -684,7 +687,7 @@
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAD2
CAAAAk1TRnQBSQFMAgEBAgEAATgBBAE4AQQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
CAAAAk1TRnQBSQFMAgEBAgEAAUABBAFAAQQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo
AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA
AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5
AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA

View File

@ -552,7 +552,7 @@ namespace Nikse.SubtitleEdit.Forms
List<string> suggestions = new List<string>();
if (_currentWord.Length > 4 || !_currentWord.Contains("'")) //TODO: get fixed nhunspell
if (_currentWord != "Lt'S" && _currentWord != "Sox's") //TODO: get fixed nhunspell
suggestions = _hunspell.Suggest(_currentWord); //TODO: 0.9.6 fails on "Lt'S"
if (AutoFixNames && _currentWord.Length > 1 && suggestions.Contains(_currentWord.Substring(0, 1).ToUpper() + _currentWord.Substring(1)))

View File

@ -36,6 +36,7 @@
this.buttonStartHalfASecondBack = new System.Windows.Forms.Button();
this.buttonPlayPause = new System.Windows.Forms.Button();
this.SubtitleListview1 = new Nikse.SubtitleEdit.Controls.SubtitleListView();
this.buttonOpenText = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// textBoxListViewText
@ -43,7 +44,7 @@
this.textBoxListViewText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.textBoxListViewText.Enabled = false;
this.textBoxListViewText.HideSelection = false;
this.textBoxListViewText.Location = new System.Drawing.Point(12, 294);
this.textBoxListViewText.Location = new System.Drawing.Point(12, 296);
this.textBoxListViewText.Multiline = true;
this.textBoxListViewText.Name = "textBoxListViewText";
this.textBoxListViewText.Size = new System.Drawing.Size(373, 56);
@ -53,7 +54,7 @@
//
this.labelText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelText.AutoSize = true;
this.labelText.Location = new System.Drawing.Point(12, 278);
this.labelText.Location = new System.Drawing.Point(12, 280);
this.labelText.Name = "labelText";
this.labelText.Size = new System.Drawing.Size(28, 13);
this.labelText.TabIndex = 8;
@ -62,7 +63,7 @@
// buttonInsert
//
this.buttonInsert.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonInsert.Location = new System.Drawing.Point(257, 362);
this.buttonInsert.Location = new System.Drawing.Point(257, 370);
this.buttonInsert.Name = "buttonInsert";
this.buttonInsert.Size = new System.Drawing.Size(189, 21);
this.buttonInsert.TabIndex = 9;
@ -75,7 +76,7 @@
this.labelTranslateTip.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelTranslateTip.AutoSize = true;
this.labelTranslateTip.ForeColor = System.Drawing.Color.Gray;
this.labelTranslateTip.Location = new System.Drawing.Point(452, 370);
this.labelTranslateTip.Location = new System.Drawing.Point(257, 355);
this.labelTranslateTip.Name = "labelTranslateTip";
this.labelTranslateTip.Size = new System.Drawing.Size(161, 13);
this.labelTranslateTip.TabIndex = 10;
@ -84,7 +85,7 @@
// buttonStartThreeSecondsBack
//
this.buttonStartThreeSecondsBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonStartThreeSecondsBack.Location = new System.Drawing.Point(15, 362);
this.buttonStartThreeSecondsBack.Location = new System.Drawing.Point(15, 370);
this.buttonStartThreeSecondsBack.Name = "buttonStartThreeSecondsBack";
this.buttonStartThreeSecondsBack.Size = new System.Drawing.Size(60, 21);
this.buttonStartThreeSecondsBack.TabIndex = 11;
@ -95,7 +96,7 @@
// buttonStartHalfASecondBack
//
this.buttonStartHalfASecondBack.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonStartHalfASecondBack.Location = new System.Drawing.Point(81, 362);
this.buttonStartHalfASecondBack.Location = new System.Drawing.Point(81, 370);
this.buttonStartHalfASecondBack.Name = "buttonStartHalfASecondBack";
this.buttonStartHalfASecondBack.Size = new System.Drawing.Size(60, 21);
this.buttonStartHalfASecondBack.TabIndex = 12;
@ -106,7 +107,7 @@
// buttonPlayPause
//
this.buttonPlayPause.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.buttonPlayPause.Location = new System.Drawing.Point(147, 362);
this.buttonPlayPause.Location = new System.Drawing.Point(147, 370);
this.buttonPlayPause.Name = "buttonPlayPause";
this.buttonPlayPause.Size = new System.Drawing.Size(104, 21);
this.buttonPlayPause.TabIndex = 13;
@ -125,18 +126,30 @@
this.SubtitleListview1.FullRowSelect = true;
this.SubtitleListview1.GridLines = true;
this.SubtitleListview1.HideSelection = false;
this.SubtitleListview1.Location = new System.Drawing.Point(12, 12);
this.SubtitleListview1.Location = new System.Drawing.Point(12, 32);
this.SubtitleListview1.Name = "SubtitleListview1";
this.SubtitleListview1.Size = new System.Drawing.Size(637, 258);
this.SubtitleListview1.Size = new System.Drawing.Size(637, 239);
this.SubtitleListview1.TabIndex = 6;
this.SubtitleListview1.UseCompatibleStateImageBehavior = false;
this.SubtitleListview1.View = System.Windows.Forms.View.Details;
this.SubtitleListview1.SelectedIndexChanged += new System.EventHandler(this.SubtitleListview1_SelectedIndexChanged);
//
// buttonOpenText
//
this.buttonOpenText.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.buttonOpenText.Location = new System.Drawing.Point(506, 5);
this.buttonOpenText.Name = "buttonOpenText";
this.buttonOpenText.Size = new System.Drawing.Size(143, 21);
this.buttonOpenText.TabIndex = 14;
this.buttonOpenText.Text = "Open transcript...";
this.buttonOpenText.UseVisualStyleBackColor = true;
//
// TranscriptImporter
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(661, 392);
this.ClientSize = new System.Drawing.Size(661, 398);
this.Controls.Add(this.buttonOpenText);
this.Controls.Add(this.buttonPlayPause);
this.Controls.Add(this.buttonStartThreeSecondsBack);
this.Controls.Add(this.buttonStartHalfASecondBack);
@ -165,5 +178,6 @@
private System.Windows.Forms.Button buttonStartThreeSecondsBack;
private System.Windows.Forms.Button buttonStartHalfASecondBack;
private System.Windows.Forms.Button buttonPlayPause;
private System.Windows.Forms.Button buttonOpenText;
}
}

View File

@ -76,5 +76,17 @@ namespace Nikse.SubtitleEdit.Forms
_main.GoBackSeconds(3.0);
}
private void SubtitleListview1_SelectedIndexChanged(object sender, EventArgs e)
{
Paragraph p = SubtitleListview1.GetSelectedParagraph(_subtitle);
if (p != null)
{
}
else
{
}
}
}
}

View File

@ -20,6 +20,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
Dictionary<string, string> _beginLineReplaceList;
Dictionary<string, string> _endLineReplaceList;
Dictionary<string, string> _wholeLineReplaceList;
Dictionary<string, string> _partialWordReplaceListAlways;
Dictionary<string, string> _partialWordReplaceList;
string _replaceListXmlFileName;
string _userWordListXmlFileName;
@ -70,6 +71,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
_beginLineReplaceList = new Dictionary<string, string>();
_endLineReplaceList = new Dictionary<string, string>();
_wholeLineReplaceList = new Dictionary<string, string>();
_partialWordReplaceListAlways = new Dictionary<string, string>();
_partialWordReplaceList = new Dictionary<string, string>();
_replaceListXmlFileName = Utilities.DictionaryFolder + languageId + "_OCRFixReplaceList.xml";
@ -79,6 +81,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
doc.Load(_replaceListXmlFileName);
_wordReplaceList = LoadReplaceList(doc, "WholeWords");
_partialWordReplaceList = LoadReplaceList(doc, "PartialWordsAlways");
_partialWordReplaceList = LoadReplaceList(doc, "PartialWords");
_partialLineReplaceList = LoadReplaceList(doc, "PartialLines");
_beginLineReplaceList = LoadReplaceList(doc, "BeginLines");
@ -315,6 +318,10 @@ namespace Nikse.SubtitleEdit.Logic.OCR
}
}
//always replace list
foreach (string letter in _partialWordReplaceListAlways.Keys)
word = word.Replace(letter,_partialWordReplaceListAlways[letter]);
string pre = string.Empty;
string post = string.Empty;
@ -706,15 +713,45 @@ namespace Nikse.SubtitleEdit.Logic.OCR
public string FixUnknownWordsViaGuessOrPrompt(out int wordsNotFound, string line, int index, Bitmap bitmap, bool autoFix, bool promptForFixingErrors, bool log, bool useAutoGuess)
{
List<string> localIgnoreWords = new List<string>();
wordsNotFound = 0;
if (_hunspell == null)
return line;
string[] words = line.Split((Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
string tempLine = line;
foreach (string name in _namesEtcList)
{
int start = tempLine.IndexOf(name);
if (start >= 0)
{
if (start == 0 || (Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").Contains(tempLine[start - 1].ToString()))
{
int end = start + name.Length;
if (end >= tempLine.Length || (Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").Contains(tempLine[end].ToString()))
tempLine = tempLine.Remove(start, name.Length);
}
}
}
foreach (string name in _namesEtcMultiWordList)
{
int start = tempLine.IndexOf(name);
if (start >= 0)
{
if (start == 0 || (Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").Contains(tempLine[start - 1].ToString()))
{
int end = start + name.Length;
if (end >= tempLine.Length || (Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").Contains(tempLine[end].ToString()))
tempLine = tempLine.Remove(start, name.Length);
}
}
}
string[] words = tempLine.Split((Environment.NewLine + " ,.!?:;()[]{}+-$£\"”“#&%…—").ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < words.Length; i++)
{
string word = words[i];
if (!IsWordKnownOrNumber(word, line))
if (!IsWordKnownOrNumber(word, line) && !localIgnoreWords.Contains(word))
{
bool correct = _hunspell.Spell(word);
if (!correct)
@ -771,7 +808,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
{
List<string> suggestions = new List<string>();
if (word.Length > 4 || !word.Contains("'")) //TODO: get fixed nhunspell
if (word != "Lt'S" && word != "Sox's") //TODO: get fixed nhunspell
suggestions = _hunspell.Suggest(word); // 0.9.6 fails on "Lt'S"
SpellcheckOcrTextResult res = SpellcheckOcrText(line, bitmap, words, i, word, suggestions);
@ -781,6 +818,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
}
if (res.Fixed)
{
localIgnoreWords.Add(word);
line = res.Line;
wordsNotFound--;
}
@ -861,7 +899,7 @@ namespace Nikse.SubtitleEdit.Logic.OCR
case OcrSpellCheck.Action.AllwaysUseSuggestion:
SaveWordToWordList(word);
result.Fixed = true;
result.Word = _spellCheck.Word;
result.Word = _spellCheck.Word;
break;
case OcrSpellCheck.Action.ChangeAndSave:
SaveWordToWordList(word);

View File

@ -89,246 +89,246 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
" </effect>" + Environment.NewLine +
"</generatoritem>";
string xmlTrackStructure2 =
@"<generatoritem id='Subtitle Edit'>
<name>edit 'B subtitle</name>
<duration>3000</duration>
<rate>
<ntsc>FALSE</ntsc>
<timebase>25</timebase>
</rate>
<in>1375</in>
<out>1383</out>
<start>0</start>
<end>8</end>
<enabled>TRUE</enabled>
<anamorphic>TRUE</anamorphic>
<alphatype>black</alphatype>
<logginginfo>
<scene>
</scene>
<shottake>
</shottake>
<lognote>
</lognote>
<good>FALSE</good>
</logginginfo>
<labels>
<label2>
</label2>
</labels>
<comments>
<mastercomment1>
</mastercomment1>
<mastercomment2>
</mastercomment2>
<mastercomment3>
</mastercomment3>
<mastercomment4>
</mastercomment4>
</comments>
<effect>
<name>edit 'B subtitle</name>
<effectid>edit 'B subtitle</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>part1</parameterid>
<name>Text Settings</name>
<value>0</value>
</parameter>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value></value>
</parameter>
<parameter>
<parameterid>fontname</parameterid>
<name>Font</name>
<value>Arial Narrow</value>
</parameter>
<parameter>
<parameterid>fontstyle</parameterid>
<name>Style</name>
<valuemin>1</valuemin>
<valuemax>4</valuemax>
<valuelist>
<valueentry>
<name>Plain</name>
<value>1</value>
</valueentry>
<valueentry>
<name>Bold</name>
<value>2</value>
</valueentry>
<valueentry>
<name>Italic</name>
<value>3</value>
</valueentry>
<valueentry>
<name>Bold/Italic</name>
<value>4</value>
</valueentry>
</valuelist>
<value>1</value>
</parameter>
<parameter>
<parameterid>fontalign</parameterid>
<name>Alignment</name>
<valuemin>1</valuemin>
<valuemax>3</valuemax>
<valuelist>
<valueentry>
<name>Left</name>
<value>1</value>
</valueentry>
<valueentry>
<name>Center</name>
<value>2</value>
</valueentry>
<valueentry>
<name>Right</name>
<value>3</value>
</valueentry>
</valuelist>
<value>2</value>
</parameter>
<parameter>
<parameterid>fontsize</parameterid>
<name>Size</name>
<valuemin>20</valuemin>
<valuemax>80</valuemax>
<value>28</value>
</parameter>
<parameter>
<parameterid>origin</parameterid>
<name>Origin</name>
<value>
<horiz>0</horiz>
<vert>0.3056</vert>
</value>
</parameter>
<parameter>
<parameterid>aspect</parameterid>
<name>Aspect</name>
<valuemin>0</valuemin>
<valuemax>2</valuemax>
<value>1</value>
</parameter>
<parameter>
<parameterid>textopacity</parameterid>
<name>Text Opacity</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>100</value>
</parameter>
<parameter>
<parameterid>textcolor</parameterid>
<name>Text Color</name>
<value>
<alpha>255</alpha>
<red>255</red>
<green>255</green>
<blue>255</blue>
</value>
</parameter>
<parameter>
<parameterid>fonttrack</parameterid>
<name>Tracking</name>
<valuemin>0</valuemin>
<valuemax>10</valuemax>
<value>1</value>
</parameter>
<parameter>
<parameterid>leading</parameterid>
<name>Leading</name>
<valuemin>-40</valuemin>
<valuemax>40</valuemax>
<value>-13</value>
</parameter>
<parameter>
<parameterid>autokern</parameterid>
<name>Auto Kerning</name>
<value>TRUE</value>
</parameter>
<parameter>
<parameterid>part2</parameterid>
<name>Outline Settings</name>
<value>0</value>
</parameter>
<parameter>
<parameterid>linewidth</parameterid>
<name>Width</name>
<valuemin>0</valuemin>
<valuemax>50</valuemax>
<value>8</value>
</parameter>
<parameter>
<parameterid>linesoft</parameterid>
<name>Soft</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>38</value>
</parameter>
<parameter>
<parameterid>linecolor</parameterid>
<name>Color</name>
<value>
<alpha>255</alpha>
<red>0</red>
<green>0</green>
<blue>0</blue>
</value>
</parameter>
<parameter>
<parameterid>part3</parameterid>
<name>Shadow Settings</name>
<value>0</value>
</parameter>
<parameter>
<parameterid>shadowoffsetx</parameterid>
<name>Offset X</name>
<valuemin>-20</valuemin>
<valuemax>20</valuemax>
<value>3</value>
</parameter>
<parameter>
<parameterid>shadowoffsety</parameterid>
<name>Offset y</name>
<valuemin>-20</valuemin>
<valuemax>20</valuemax>
<value>3</value>
</parameter>
<parameter>
<parameterid>shadowopacity</parameterid>
<name>Opacity</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>75</value>
</parameter>
<parameter>
<parameterid>shadowsoft</parameterid>
<name>Softness</name>
<valuemin>0</valuemin>
<valuemax>100</valuemax>
<value>2</value>
</parameter>
<parameter>
<parameterid>shadowcolor</parameterid>
<name>Color</name>
<value>
<alpha>255</alpha>
<red>0</red>
<green>0</green>
<blue>0</blue>
</value>
</parameter>
</effect>
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
</generatoritem>";
// string xmlTrackStructure2 =
// @"<generatoritem id='Subtitle Edit'>
// <name>edit 'B subtitle</name>
// <duration>3000</duration>
// <rate>
// <ntsc>FALSE</ntsc>
// <timebase>25</timebase>
// </rate>
// <in>1375</in>
// <out>1383</out>
// <start>0</start>
// <end>8</end>
// <enabled>TRUE</enabled>
// <anamorphic>TRUE</anamorphic>
// <alphatype>black</alphatype>
// <logginginfo>
// <scene>
// </scene>
// <shottake>
// </shottake>
// <lognote>
// </lognote>
// <good>FALSE</good>
// </logginginfo>
// <labels>
// <label2>
// </label2>
// </labels>
// <comments>
// <mastercomment1>
// </mastercomment1>
// <mastercomment2>
// </mastercomment2>
// <mastercomment3>
// </mastercomment3>
// <mastercomment4>
// </mastercomment4>
// </comments>
// <effect>
// <name>edit 'B subtitle</name>
// <effectid>edit 'B subtitle</effectid>
// <effectcategory>Text</effectcategory>
// <effecttype>generator</effecttype>
// <mediatype>video</mediatype>
// <parameter>
// <parameterid>part1</parameterid>
// <name>Text Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>str</parameterid>
// <name>Text</name>
// <value></value>
// </parameter>
// <parameter>
// <parameterid>fontname</parameterid>
// <name>Font</name>
// <value>Arial Narrow</value>
// </parameter>
// <parameter>
// <parameterid>fontstyle</parameterid>
// <name>Style</name>
// <valuemin>1</valuemin>
// <valuemax>4</valuemax>
// <valuelist>
// <valueentry>
// <name>Plain</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Bold</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Italic</name>
// <value>3</value>
// </valueentry>
// <valueentry>
// <name>Bold/Italic</name>
// <value>4</value>
// </valueentry>
// </valuelist>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>fontalign</parameterid>
// <name>Alignment</name>
// <valuemin>1</valuemin>
// <valuemax>3</valuemax>
// <valuelist>
// <valueentry>
// <name>Left</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Center</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Right</name>
// <value>3</value>
// </valueentry>
// </valuelist>
// <value>2</value>
// </parameter>
// <parameter>
// <parameterid>fontsize</parameterid>
// <name>Size</name>
// <valuemin>20</valuemin>
// <valuemax>80</valuemax>
// <value>28</value>
// </parameter>
// <parameter>
// <parameterid>origin</parameterid>
// <name>Origin</name>
// <value>
// <horiz>0</horiz>
// <vert>0.3056</vert>
// </value>
// </parameter>
// <parameter>
// <parameterid>aspect</parameterid>
// <name>Aspect</name>
// <valuemin>0</valuemin>
// <valuemax>2</valuemax>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>textopacity</parameterid>
// <name>Text Opacity</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>100</value>
// </parameter>
// <parameter>
// <parameterid>textcolor</parameterid>
// <name>Text Color</name>
// <value>
// <alpha>255</alpha>
// <red>255</red>
// <green>255</green>
// <blue>255</blue>
// </value>
// </parameter>
// <parameter>
// <parameterid>fonttrack</parameterid>
// <name>Tracking</name>
// <valuemin>0</valuemin>
// <valuemax>10</valuemax>
// <value>1</value>
// </parameter>
// <parameter>
// <parameterid>leading</parameterid>
// <name>Leading</name>
// <valuemin>-40</valuemin>
// <valuemax>40</valuemax>
// <value>-13</value>
// </parameter>
// <parameter>
// <parameterid>autokern</parameterid>
// <name>Auto Kerning</name>
// <value>TRUE</value>
// </parameter>
// <parameter>
// <parameterid>part2</parameterid>
// <name>Outline Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>linewidth</parameterid>
// <name>Width</name>
// <valuemin>0</valuemin>
// <valuemax>50</valuemax>
// <value>8</value>
// </parameter>
// <parameter>
// <parameterid>linesoft</parameterid>
// <name>Soft</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>38</value>
// </parameter>
// <parameter>
// <parameterid>linecolor</parameterid>
// <name>Color</name>
// <value>
// <alpha>255</alpha>
// <red>0</red>
// <green>0</green>
// <blue>0</blue>
// </value>
// </parameter>
// <parameter>
// <parameterid>part3</parameterid>
// <name>Shadow Settings</name>
// <value>0</value>
// </parameter>
// <parameter>
// <parameterid>shadowoffsetx</parameterid>
// <name>Offset X</name>
// <valuemin>-20</valuemin>
// <valuemax>20</valuemax>
// <value>3</value>
// </parameter>
// <parameter>
// <parameterid>shadowoffsety</parameterid>
// <name>Offset y</name>
// <valuemin>-20</valuemin>
// <valuemax>20</valuemax>
// <value>3</value>
// </parameter>
// <parameter>
// <parameterid>shadowopacity</parameterid>
// <name>Opacity</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>75</value>
// </parameter>
// <parameter>
// <parameterid>shadowsoft</parameterid>
// <name>Softness</name>
// <valuemin>0</valuemin>
// <valuemax>100</valuemax>
// <value>2</value>
// </parameter>
// <parameter>
// <parameterid>shadowcolor</parameterid>
// <name>Color</name>
// <value>
// <alpha>255</alpha>
// <red>0</red>
// <green>0</green>
// <blue>0</blue>
// </value>
// </parameter>
// </effect>
// <sourcetrack>
// <mediatype>video</mediatype>
// </sourcetrack>
// </generatoritem>";
string xmlTrackStructure3a =
@"<generatoritem>

View File

@ -330,130 +330,130 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
</sourcetrack>
</generatoritem>";
string xmlTrackStructure3a =
@"<generatoritem>
<name>Text</name>
<duration>3600</duration>
<rate>
<ntsc>TRUE</ntsc>
<timebase>30</timebase>
</rate>
<in>1650</in>
<out>1784</out>
<start>0</start>
<end>134</end>
<enabled>TRUE</enabled>
<anamorphic>FALSE</anamorphic>
<alphatype>black</alphatype>
<effect id = 'subtitle'>
<name>Text</name>
<effectid>Text</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value>If you look at the Lindy Hop&#13;you'll see a couple just moving</value>
</parameter>
<parameter>
<parameterid>fontname</parameterid>
<name>Font</name>
<value>Futura</value>
</parameter>
<parameter>
<parameterid>fontsize</parameterid>
<name>Size</name>
<valuemin>0</valuemin>
<valuemax>1000</valuemax>
<value>36</value></parameter>
<parameter>
<parameterid>fontstyle</parameterid>
<name>Style</name>
<valuemin>1</valuemin>
<valuemax>4</valuemax>
<valuelist>
<valueentry>
<name>Plain</name>
<value>1</value>
</valueentry>
<valueentry>
<name>Bold</name>
<value>2</value>
</valueentry>
<valueentry>
<name>Italic</name>
<value>3</value>
</valueentry>
<valueentry>
<name>Bold/Italic</name>
<value>4</value>
</valueentry>
</valuelist>
<value>3</value>
</parameter>
<parameter>
<parameterid>fontalign</parameterid>
<name>Alignment</name>
<valuemin>1</valuemin>
<valuemax>3</valuemax>
<valuelist>
<valueentry>
<name>Left</name>
<value>1</value>
</valueentry>
<valueentry>
<name>Center</name>
<value>2</value>
</valueentry>
<valueentry>
<name>Right</name>
<value>3</value>
</valueentry>
</valuelist>
<value>2</value>
</parameter>
<parameter>
<parameterid>fontcolor</parameterid>
<name>Font Color</name>
<value>
<alpha>255</alpha>
<red>255</red>
<green>255</green>
<blue>255</blue>
</value>
</parameter>
<parameter>
<parameterid>origin</parameterid>
<name>Origin</name>
<value>
<horiz>0</horiz>
<vert>0.34375</vert>
</value>
</parameter>
</effect>
<sourcetrack>
<mediatype>video</mediatype>
</sourcetrack>
</generatoritem>";
// string xmlTrackStructure3a =
//@"<generatoritem>
// <name>Text</name>
// <duration>3600</duration>
// <rate>
// <ntsc>TRUE</ntsc>
// <timebase>30</timebase>
// </rate>
// <in>1650</in>
// <out>1784</out>
// <start>0</start>
// <end>134</end>
// <enabled>TRUE</enabled>
// <anamorphic>FALSE</anamorphic>
// <alphatype>black</alphatype>
// <effect id = 'subtitle'>
// <name>Text</name>
// <effectid>Text</effectid>
// <effectcategory>Text</effectcategory>
// <effecttype>generator</effecttype>
// <mediatype>video</mediatype>
// <parameter>
// <parameterid>str</parameterid>
// <name>Text</name>
// <value>If you look at the Lindy Hop&#13;you'll see a couple just moving</value>
// </parameter>
// <parameter>
// <parameterid>fontname</parameterid>
// <name>Font</name>
// <value>Futura</value>
// </parameter>
// <parameter>
// <parameterid>fontsize</parameterid>
// <name>Size</name>
// <valuemin>0</valuemin>
// <valuemax>1000</valuemax>
// <value>36</value></parameter>
// <parameter>
// <parameterid>fontstyle</parameterid>
// <name>Style</name>
// <valuemin>1</valuemin>
// <valuemax>4</valuemax>
// <valuelist>
// <valueentry>
// <name>Plain</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Bold</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Italic</name>
// <value>3</value>
// </valueentry>
// <valueentry>
// <name>Bold/Italic</name>
// <value>4</value>
// </valueentry>
// </valuelist>
// <value>3</value>
// </parameter>
// <parameter>
// <parameterid>fontalign</parameterid>
// <name>Alignment</name>
// <valuemin>1</valuemin>
// <valuemax>3</valuemax>
// <valuelist>
// <valueentry>
// <name>Left</name>
// <value>1</value>
// </valueentry>
// <valueentry>
// <name>Center</name>
// <value>2</value>
// </valueentry>
// <valueentry>
// <name>Right</name>
// <value>3</value>
// </valueentry>
// </valuelist>
// <value>2</value>
// </parameter>
// <parameter>
// <parameterid>fontcolor</parameterid>
// <name>Font Color</name>
// <value>
// <alpha>255</alpha>
// <red>255</red>
// <green>255</green>
// <blue>255</blue>
// </value>
// </parameter>
// <parameter>
// <parameterid>origin</parameterid>
// <name>Origin</name>
// <value>
// <horiz>0</horiz>
// <vert>0.34375</vert>
// </value>
// </parameter>
// </effect>
// <sourcetrack>
// <mediatype>video</mediatype>
// </sourcetrack>
//</generatoritem>";
string xmlTrackStructure3b =
@"<generatoritem>
<start>135</start>
<end>219</end>
<effect id='subtitle'>
<name>Text</name>
<effectid>Text</effectid>
<effectcategory>Text</effectcategory>
<effecttype>generator</effecttype>
<mediatype>video</mediatype>
<parameter>
<parameterid>str</parameterid>
<name>Text</name>
<value></value>
</parameter>
</effect>
</generatoritem>";
//string xmlTrackStructure3b =
//@"<generatoritem>
// <start>135</start>
// <end>219</end>
// <effect id='subtitle'>
// <name>Text</name>
// <effectid>Text</effectid>
// <effectcategory>Text</effectcategory>
// <effecttype>generator</effecttype>
// <mediatype>video</mediatype>
// <parameter>
// <parameterid>str</parameterid>
// <name>Text</name>
// <value></value>
// </parameter>
// </effect>
//</generatoritem>";
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlStructure);

View File

@ -40,6 +40,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
new Spruce(),
new SubtitleEditorProject(),
new TimedText(),
new TimedText10(),
new TMPlayer(),
new YouTubeSbv(),
// new Idx(),

View File

@ -15,7 +15,7 @@ namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
public override string Name
{
get { return "Timed Text"; }
get { return "Timed Text draft"; }
}
public override bool HasLineNumber

View File

@ -0,0 +1,235 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Xml;
//http://www.w3.org/TR/ttaf1-dfxp/
//Timed Text Markup Language (TTML) 1.0
//W3C Recommendation 18 November 2010
namespace Nikse.SubtitleEdit.Logic.SubtitleFormats
{
class TimedText10 : SubtitleFormat
{
public override string Extension
{
get { return ".xml"; }
}
public override string Name
{
get { return "Timed Text 1.0"; }
}
public override bool HasLineNumber
{
get { return false; }
}
public override bool IsTimeBased
{
get { return true; }
}
public override bool IsMine(List<string> lines, string fileName)
{
StringBuilder sb = new StringBuilder();
lines.ForEach(line => sb.AppendLine(line));
string xmlAsString = sb.ToString().Trim();
if (xmlAsString.Contains("http://www.w3.org/ns/ttml"))
{
XmlDocument xml = new XmlDocument();
try
{
xml.LoadXml(xmlAsString);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml");
var nds = xml.DocumentElement.SelectSingleNode("ttml:body", nsmgr);
var paragraphs = nds.SelectNodes("//ttml:p", nsmgr);
return paragraphs.Count > 0;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
}
return false;
}
private static string ConvertToTimeString(TimeCode time)
{
return string.Format("{0:00}:{1:00}:{2:00}.{3:00}", time.Hours, time.Minutes, time.Seconds, time.Milliseconds);
}
public override string ToText(Subtitle subtitle, string title)
{
string xmlStructure =
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>" + Environment.NewLine +
"<tt xmlns=\"http://www.w3.org/ns/ttml\" xmlns:ttp=\"http://www.w3.org/ns/ttml#parameter\" ttp:timeBase=\"media\" xmlns:tts=\"http://www.w3.org/ns/ttml#style\" xml:lang=\"en\" xmlns:ttm=\"http://www.w3.org/ns/ttml#metadata\">" + Environment.NewLine +
" <head>" + Environment.NewLine +
" <metadata>" + Environment.NewLine +
" <ttm:title></ttm:title>" + Environment.NewLine +
" </metadata>" + Environment.NewLine +
" <styling>" + Environment.NewLine +
" <style id=\"s0\" tts:backgroundColor=\"black\" tts:fontStyle=\"normal\" tts:fontSize=\"16\" tts:fontFamily=\"sansSerif\" tts:color=\"white\" />" + Environment.NewLine +
" </styling>" + Environment.NewLine +
" </head>" + Environment.NewLine +
" <body style=\"s0\">" + Environment.NewLine +
" <div />" + Environment.NewLine +
" </body>" + Environment.NewLine +
"</tt>";
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlStructure);
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml");
nsmgr.AddNamespace("ttp", "http://www.w3.org/ns/10/ttml#parameter");
nsmgr.AddNamespace("tts", "http://www.w3.org/ns/10/ttml#style");
nsmgr.AddNamespace("ttm", "http://www.w3.org/ns/10/ttml#metadata");
XmlNode titleNode = xml.DocumentElement.SelectSingleNode("//ttml:head", nsmgr).FirstChild.FirstChild;
titleNode.InnerText = title;
XmlNode div = xml.DocumentElement.SelectSingleNode("//ttml:body", nsmgr).FirstChild;
int no = 0;
foreach (Paragraph p in subtitle.Paragraphs)
{
XmlNode paragraph = xml.CreateElement("p", "http://www.w3.org/ns/ttml");
string text = Utilities.RemoveHtmlTags(p.Text);
bool first = true;
foreach (string line in text.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries))
{
if (!first)
{
XmlNode br = xml.CreateElement("br", "http://www.w3.org/ns/ttml");
paragraph.AppendChild(br);
}
XmlNode textNode = xml.CreateTextNode(line);
paragraph.AppendChild(textNode);
first = false;
}
XmlAttribute start = xml.CreateAttribute("begin");
start.InnerText = ConvertToTimeString(p.StartTime);
paragraph.Attributes.Append(start);
XmlAttribute id = xml.CreateAttribute("id");
id.InnerText = "p" + no.ToString();
paragraph.Attributes.Append(id);
XmlAttribute end = xml.CreateAttribute("end");
end.InnerText = ConvertToTimeString(p.EndTime);
paragraph.Attributes.Append(end);
div.AppendChild(paragraph);
no++;
}
MemoryStream ms = new MemoryStream();
XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8);
writer.Formatting = Formatting.Indented;
xml.Save(writer);
return Encoding.UTF8.GetString(ms.ToArray()).Trim();
}
public override void LoadSubtitle(Subtitle subtitle, List<string> lines, string fileName)
{
_errorCount = 0;
double startSeconds = 0;
StringBuilder sb = new StringBuilder();
lines.ForEach(line => sb.AppendLine(line));
XmlDocument xml = new XmlDocument();
xml.LoadXml(sb.ToString());
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xml.NameTable);
nsmgr.AddNamespace("ttml", "http://www.w3.org/ns/ttml");
XmlNode body = xml.DocumentElement.SelectSingleNode("ttml:body", nsmgr);
foreach (XmlNode node in body.SelectNodes("//ttml:p", nsmgr))
{
try
{
StringBuilder pText = new StringBuilder();
foreach (XmlNode innerNode in node.ChildNodes)
{
switch (innerNode.Name.ToString())
{
case "br":
pText.AppendLine();
break;
default:
pText.Append(innerNode.InnerText.Trim());
break;
}
}
string start = string.Empty;
if (node.Attributes["begin"] != null)
{
start = node.Attributes["begin"].InnerText;
}
string end = string.Empty;
if (node.Attributes["end"] != null)
{
end = node.Attributes["end"].InnerText;
}
string dur = string.Empty;
if (node.Attributes["dur"] != null)
{
dur = node.Attributes["dur"].InnerText;
}
TimeCode startCode = new TimeCode(TimeSpan.FromSeconds(startSeconds));
if (start != string.Empty)
{
startCode = GetTimeCode(start);
}
TimeCode endCode;
if (end != string.Empty)
{
endCode = GetTimeCode(end);
}
else if (dur != string.Empty)
{
endCode = new TimeCode(TimeSpan.FromMilliseconds(GetTimeCode(dur).TotalMilliseconds + startCode.TotalMilliseconds));
}
else
{
endCode = new TimeCode(TimeSpan.FromMilliseconds(startCode.TotalMilliseconds + 3000));
}
subtitle.Paragraphs.Add(new Paragraph(startCode, endCode, pText.ToString()));
}
catch (Exception ex)
{
string s = ex.Message;
_errorCount++;
}
}
subtitle.Renumber(1);
}
private static TimeCode GetTimeCode(string s)
{
if (s.EndsWith("s"))
{
s = s.TrimEnd('s');
TimeSpan ts = TimeSpan.FromSeconds(double.Parse(s));
return new TimeCode(ts);
}
else
{
string[] parts = s.Split(new char[] { ':', '.', ',' });
TimeSpan ts = new TimeSpan(0, int.Parse(parts[0]), int.Parse(parts[1]), int.Parse(parts[2]), int.Parse(parts[3]));
return new TimeCode(ts);
}
}
}
}

View File

@ -532,6 +532,7 @@
<Compile Include="Logic\SubtitleFormats\SonyDVDArchitect.cs" />
<Compile Include="Logic\SubtitleFormats\Spruce.cs" />
<Compile Include="Logic\SubtitleFormats\SubtitleEditorProject.cs" />
<Compile Include="Logic\SubtitleFormats\TimedText10.cs" />
<Compile Include="Logic\SubtitleFormats\UleadSubtitleFormat.cs" />
<Compile Include="Logic\SubtitleFormats\UnknownSubtitle5.cs" />
<Compile Include="Logic\SubtitleFormats\OpenDvt.cs" />
@ -873,7 +874,9 @@
</ItemGroup>
<ItemGroup>
<Content Include="Resources\bg-BG.xml" />
<Content Include="Resources\fa-IR.xml" />
<Content Include="Resources\fa-IR.xml">
<SubType>Designer</SubType>
</Content>
<Content Include="Resources\ja-JP.xml" />
<Content Include="Resources\zh-CHS.xml" />
<None Include="Web References\SeNetworkService\SeService.disco" />