From a76fb7c4328738f7ff5ae59f851199c08a60933a Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Wed, 28 Mar 2012 23:59:01 +0000 Subject: [PATCH] Override CanSave in the SRT format to allow supported override tags Originally committed to SVN as r6627. --- aegisub/src/subtitle_format_srt.cpp | 41 ++++++++++++++++++++++++++++- aegisub/src/subtitle_format_srt.h | 4 +++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/aegisub/src/subtitle_format_srt.cpp b/aegisub/src/subtitle_format_srt.cpp index d4ff55a1a..6ec65b457 100644 --- a/aegisub/src/subtitle_format_srt.cpp +++ b/aegisub/src/subtitle_format_srt.cpp @@ -36,17 +36,20 @@ #include "config.h" +#include "subtitle_format_srt.h" + #ifndef AGI_PRE #include #endif +#include "ass_attachment.h" #include "ass_dialogue.h" #include "ass_file.h" #include "ass_override.h" #include "ass_style.h" #include "colorspace.h" #include "compat.h" -#include "subtitle_format_srt.h" +#include "utils.h" #include "text_file_reader.h" #include "text_file_writer.h" @@ -516,6 +519,42 @@ void SRTSubtitleFormat::WriteFile(const AssFile *src, wxString const& filename, } } +bool SRTSubtitleFormat::CanSave(const AssFile *file) const { + wxString supported_tags[] = { "\\b", "\\i", "\\s", "\\u" }; + + AssStyle defstyle; + for (std::list::const_iterator cur = file->Line.begin(); cur != file->Line.end(); ++cur) { + // Check style, if anything non-default is found, return false + if (const AssStyle *curstyle = dynamic_cast(*cur)) { + if (curstyle->GetEntryData() != defstyle.GetEntryData()) + return false; + } + + // Check for attachments, if any is found, return false + if (dynamic_cast(*cur)) return false; + + // Check dialogue + if (const AssDialogue *curdiag = dynamic_cast(*cur)) { + std::vector blocks = curdiag->ParseTags(); + for (size_t i = 0; i < blocks.size(); ++i) { + AssDialogueBlockOverride *ovr = dynamic_cast(blocks[i]); + if (!ovr) continue; + + // Verify that all overrides used are supported + for (size_t j = 0; j < ovr->Tags.size(); ++j) { + if (!std::binary_search(supported_tags, supported_tags + 4, ovr->Tags[j]->Name)) { + delete_clear(blocks); + return false; + } + } + } + delete_clear(blocks); + } + } + + return true; +} + wxString SRTSubtitleFormat::ConvertTags(AssDialogue *diag) const { wxString final; std::map tag_states; diff --git a/aegisub/src/subtitle_format_srt.h b/aegisub/src/subtitle_format_srt.h index dc6254cbe..86b0c4e68 100644 --- a/aegisub/src/subtitle_format_srt.h +++ b/aegisub/src/subtitle_format_srt.h @@ -36,6 +36,8 @@ #include "subtitle_format.h" +class AssDialogue; + /// DOCME /// @class SRTSubtitleFormat /// @brief DOCME @@ -48,6 +50,8 @@ public: wxArrayString GetReadWildcards() const; wxArrayString GetWriteWildcards() const; + bool CanSave(const AssFile *file) const; + void ReadFile(AssFile *target, wxString const& filename, wxString const& forceEncoding) const; void WriteFile(const AssFile *src, wxString const& filename, wxString const& encoding) const; };