From 2d7b2527a704ac85523be59a6801b65ce034a058 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Fri, 18 Jul 2008 01:36:20 +0000 Subject: [PATCH] OMFG AMZ IS ALIVE! Partial TranStation export support (SMPTE drop-frames seem to be broken, and line merging isn't working) Originally committed to SVN as r2266. --- aegisub/Makefile.am | 1 + aegisub/ass_time.cpp | 9 ++ aegisub/ass_time.h | 1 + aegisub/subtitle_format.cpp | 2 + aegisub/subtitle_format_encore.cpp | 8 +- aegisub/subtitle_format_transtation.cpp | 119 ++++++++++++++++++++++++ aegisub/subtitle_format_transtation.h | 53 +++++++++++ aegisub/subtitle_format_txt.cpp | 2 +- 8 files changed, 187 insertions(+), 8 deletions(-) create mode 100644 aegisub/subtitle_format_transtation.cpp create mode 100644 aegisub/subtitle_format_transtation.h diff --git a/aegisub/Makefile.am b/aegisub/Makefile.am index 62348ebe0..8bf688980 100644 --- a/aegisub/Makefile.am +++ b/aegisub/Makefile.am @@ -277,6 +277,7 @@ aegisub_SOURCES = \ subtitle_format_microdvd.cpp \ subtitle_format_mkv.cpp \ subtitle_format_srt.cpp \ + subtitle_format_transtation.cpp \ subtitle_format_ttxt.cpp \ subtitle_format_txt.cpp \ text_file_writer.cpp \ diff --git a/aegisub/ass_time.cpp b/aegisub/ass_time.cpp index 862bdad44..d63819eff 100644 --- a/aegisub/ass_time.cpp +++ b/aegisub/ass_time.cpp @@ -242,6 +242,15 @@ wxString AssTime::GetSRTFormated () { } +/////////////////// +// SMPTE formatted +wxString AssTime::GetSMPTE(double fps) +{ + int f = int(GetTimeMiliseconds() * fps / 1000.0 + 0.5); + return wxString::Format(_T("%02i:%02i:%02i:%02i"),GetTimeHours(),GetTimeMinutes(),GetTimeSeconds(),f); +} + + ////////////////////// // AssTime comparison bool operator < (AssTime &t1, AssTime &t2) { diff --git a/aegisub/ass_time.h b/aegisub/ass_time.h index baaa82a82..9f44d1f8d 100644 --- a/aegisub/ass_time.h +++ b/aegisub/ass_time.h @@ -66,6 +66,7 @@ public: void ParseSRT(const wxString text); // Sets value to text-form time, in SRT format wxString GetASSFormated(bool ms=false); // Returns the ASS representation of time wxString GetSRTFormated(); // Returns the SRT representation of time + wxString GetSMPTE(double fps); // Returns the SMPTE timecodes for the given frame rate }; // Comparison operators diff --git a/aegisub/subtitle_format.cpp b/aegisub/subtitle_format.cpp index 3581a0a3f..f13d074b4 100644 --- a/aegisub/subtitle_format.cpp +++ b/aegisub/subtitle_format.cpp @@ -46,6 +46,7 @@ #include "subtitle_format_mkv.h" #include "subtitle_format_microdvd.h" #include "subtitle_format_encore.h" +#include "subtitle_format_transtation.h" #include "subtitle_format_dvd.h" #include "ass_file.h" #include "vfr.h" @@ -134,6 +135,7 @@ void SubtitleFormat::LoadFormats () { new MicroDVDSubtitleFormat(); new MKVSubtitleFormat(); new EncoreSubtitleFormat(); + new TranStationSubtitleFormat(); #ifdef __WXDEBUG__ new DVDSubtitleFormat(); #endif diff --git a/aegisub/subtitle_format_encore.cpp b/aegisub/subtitle_format_encore.cpp index a0a270261..f1a58e8ed 100644 --- a/aegisub/subtitle_format_encore.cpp +++ b/aegisub/subtitle_format_encore.cpp @@ -87,13 +87,7 @@ void EncoreSubtitleFormat::WriteFile(wxString _filename,wxString encoding) { AssDialogue *current = AssEntry::GetAsDialogue(*cur); if (current && !current->Comment) { // Time stamps - i++; - AssTime time = current->Start; - int f = int(time.GetTimeMiliseconds() * fps / 1000.0 + 0.5); - wxString timeStamps = wxString::Format(_T("%i %02i:%02i:%02i:%02i "),i,time.GetTimeHours(),time.GetTimeMinutes(),time.GetTimeSeconds(),f); - time = current->End; - f = int(time.GetTimeMiliseconds() * fps / 1000.0 + 0.5); - timeStamps += wxString::Format(_T("%02i:%02i:%02i:%02i "),time.GetTimeHours(),time.GetTimeMinutes(),time.GetTimeSeconds(),f); + wxString timeStamps = wxString::Format(_T("%i "),++i) + current->Start.GetSMPTE(fps) + _T(" ") + current->End.GetSMPTE(fps); // Convert : to ; if it's NTSC if (fps > 26.0) timeStamps.Replace(_T(":"),_T(";")); diff --git a/aegisub/subtitle_format_transtation.cpp b/aegisub/subtitle_format_transtation.cpp new file mode 100644 index 000000000..5676d8da7 --- /dev/null +++ b/aegisub/subtitle_format_transtation.cpp @@ -0,0 +1,119 @@ +// Copyright (c) 2007, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +/////////// +// Headers +#include "ass_dialogue.h" +#include "ass_file.h" +#include "ass_style.h" +#include "subtitle_format_transtation.h" +#include "text_file_writer.h" + + +//////// +// Name +wxString TranStationSubtitleFormat::GetName() { + return _T("TranStation"); +} + + +///////////// +// Wildcards +wxArrayString TranStationSubtitleFormat::GetWriteWildcards() { + wxArrayString formats; + formats.Add(_T("transtation.txt")); + return formats; +} + + +/////////////////// +// Can write file? +bool TranStationSubtitleFormat::CanWriteFile(wxString filename) { + return (filename.Right(16).Lower() == _T(".transtation.txt")); +} + + +////////////// +// Write file +void TranStationSubtitleFormat::WriteFile(wxString _filename,wxString encoding) { + // Get FPS + double fps = AskForFPS(true); + if (fps <= 0.0) return; + + // Open file + TextFileWriter file(_filename,encoding); + + // Convert to TranStation + CreateCopy(); + SortLines(); + Merge(true,true,true,false); + + // Write lines + using std::list; + for (list::iterator cur=Line->begin();cur!=Line->end();cur++) { + AssDialogue *current = AssEntry::GetAsDialogue(*cur); + if (current && !current->Comment) { + // Get line data + AssStyle *style = GetAssFile()->GetStyle(current->Style); + int align = 0; + wxString type = _T("N"); + if (style) { + if (style->alignment >= 4) align = 4; + if (style->alignment >= 7) align = 9; + if (style->italic) type = _T("I"); + } + + // Write header + wxString header = wxString::Format(_T("SUB [%i %s "),align,type.c_str()) + current->Start.GetSMPTE(fps) + _T(">") + current->End.GetSMPTE(fps) + _T("]"); + file.WriteLineToFile(header); + + // Process text + wxString lineEnd = _T("\r\n"); + current->StripTags(); + current->Text.Replace(_T("\\h"),_T(" "),true); + current->Text.Replace(_T("\\n"),lineEnd,true); + current->Text.Replace(_T("\\N"),lineEnd,true); + while (current->Text.Replace(lineEnd+lineEnd,lineEnd,true)); + + // Write text + file.WriteLineToFile(current->Text); + file.WriteLineToFile(_T("")); + } + } + + // Clean up + ClearCopy(); +} diff --git a/aegisub/subtitle_format_transtation.h b/aegisub/subtitle_format_transtation.h new file mode 100644 index 000000000..9eccc04a5 --- /dev/null +++ b/aegisub/subtitle_format_transtation.h @@ -0,0 +1,53 @@ +// Copyright (c) 2008, Rodrigo Braz Monteiro +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Aegisub Group nor the names of its contributors +// may be used to endorse or promote products derived from this software +// without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. +// +// ----------------------------------------------------------------------------- +// +// AEGISUB +// +// Website: http://aegisub.cellosoft.com +// Contact: mailto:zeratul@cellosoft.com +// + + +#pragma once + + +/////////// +// Headers +#include "subtitle_format.h" + + +////////////////////// +// TranStation writer +class TranStationSubtitleFormat : public SubtitleFormat { +public: + wxString GetName(); + wxArrayString GetWriteWildcards(); + bool CanWriteFile(wxString filename); + void WriteFile(wxString filename,wxString encoding); +}; diff --git a/aegisub/subtitle_format_txt.cpp b/aegisub/subtitle_format_txt.cpp index 3605d3881..9890572cc 100644 --- a/aegisub/subtitle_format_txt.cpp +++ b/aegisub/subtitle_format_txt.cpp @@ -55,7 +55,7 @@ bool TXTSubtitleFormat::CanReadFile(wxString filename) { ////////////// // Can write? bool TXTSubtitleFormat::CanWriteFile(wxString filename) { - return (filename.Right(4).Lower() == _T(".txt") && filename.Right(11).Lower() != _T(".encore.txt")); + return (filename.Right(4).Lower() == _T(".txt") && filename.Right(11).Lower() != _T(".encore.txt") && filename.Right(16).Lower() != _T(".transtation.txt")); }