Override CanSave in the SRT format to allow supported override tags

Originally committed to SVN as r6627.
This commit is contained in:
Thomas Goyne 2012-03-28 23:59:01 +00:00
parent d49e59653f
commit a76fb7c432
2 changed files with 44 additions and 1 deletions

View File

@ -36,17 +36,20 @@
#include "config.h"
#include "subtitle_format_srt.h"
#ifndef AGI_PRE
#include <wx/regex.h>
#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<AssEntry*>::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<const AssStyle*>(*cur)) {
if (curstyle->GetEntryData() != defstyle.GetEntryData())
return false;
}
// Check for attachments, if any is found, return false
if (dynamic_cast<const AssAttachment*>(*cur)) return false;
// Check dialogue
if (const AssDialogue *curdiag = dynamic_cast<const AssDialogue*>(*cur)) {
std::vector<AssDialogueBlock*> blocks = curdiag->ParseTags();
for (size_t i = 0; i < blocks.size(); ++i) {
AssDialogueBlockOverride *ovr = dynamic_cast<AssDialogueBlockOverride*>(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<char, bool> tag_states;

View File

@ -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;
};