Some more work on the subs library.

Originally committed to SVN as r1968.
This commit is contained in:
Rodrigo Braz Monteiro 2008-03-08 07:14:14 +00:00
parent 6246c3998d
commit 5e16567e81
12 changed files with 435 additions and 30 deletions

View file

@ -183,6 +183,14 @@
RelativePath=".\include\aegilib\format.h" RelativePath=".\include\aegilib\format.h"
> >
</File> </File>
<File
RelativePath=".\include\aegilib\format_handler.h"
>
</File>
<File
RelativePath=".\include\aegilib\format_manager.h"
>
</File>
<File <File
RelativePath=".\include\aegilib\manipulator.h" RelativePath=".\include\aegilib\manipulator.h"
> >
@ -235,6 +243,10 @@
RelativePath=".\src\exception.cpp" RelativePath=".\src\exception.cpp"
> >
</File> </File>
<File
RelativePath=".\src\format_manager.cpp"
>
</File>
<File <File
RelativePath=".\src\prec.cpp" RelativePath=".\src\prec.cpp"
> >
@ -261,6 +273,18 @@
> >
</File> </File>
</Filter> </Filter>
<Filter
Name="Formats"
>
<File
RelativePath=".\src\formats\format_ass.cpp"
>
</File>
<File
RelativePath=".\src\formats\format_ass.h"
>
</File>
</Filter>
</Files> </Files>
<Globals> <Globals>
</Globals> </Globals>

View file

@ -40,5 +40,7 @@
#include "notification.h" #include "notification.h"
#include "aegistring.h" #include "aegistring.h"
#include "format.h" #include "format.h"
#include "format_handler.h"
#include "format_manager.h"
#include "manipulator.h" #include "manipulator.h"
#include "exception.h" #include "exception.h"

View file

@ -35,9 +35,12 @@
#pragma once #pragma once
#include <wx/string.h>
namespace Aegilib { namespace Aegilib {
// Define the string type used throughout this library // Define the string type used throughout this library
typedef std::basic_string<wchar_t> String; //typedef std::basic_string<wchar_t> String;
typedef wxString String;
}; };

View file

@ -39,15 +39,16 @@
namespace Aegilib { namespace Aegilib {
// Prototypes // Prototypes
class FormatHandler; class FormatHandler;
class Model;
// Format interface // Format interface
class Format { class Format {
public: public:
virtual ~Format(); virtual ~Format() {}
virtual String GetName() const = 0; virtual String GetName() const = 0;
virtual String GetExtensionWildcard() const = 0; virtual String GetExtension() const = 0;
virtual const FormatHandler& GetHandler() const = 0; virtual FormatHandler* GetHandler(const Model &model) const = 0;
virtual bool CanStoreText() const { return false; } virtual bool CanStoreText() const { return false; }
virtual bool CanStoreImages() const { return false; } virtual bool CanStoreImages() const { return false; }

View file

@ -0,0 +1,49 @@
// 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/AEGILIB
//
// Website: http://www.aegisub.net
// Contact: mailto:amz@aegisub.net
//
#pragma once
#include "aegistring.h"
namespace Aegilib {
// Format handler interface
class FormatHandler {
public:
virtual ~FormatHandler() {}
virtual void Load(wxInputStream &file,const String encoding) = 0;
};
};

View file

@ -0,0 +1,58 @@
// 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/AEGILIB
//
// Website: http://www.aegisub.net
// Contact: mailto:amz@aegisub.net
//
#pragma once
#include "format.h"
namespace Aegilib {
// Format manager class
class FormatManager {
private:
static std::vector<const Format*> formats;
FormatManager() {}
public:
static void AddFormat(const Format *format);
static void InitializeFormats();
static void ClearFormats();
static int GetFormatCount();
static const Format* GetFormatByIndex(const int index);
static const Format* GetFormatFromFilename(const String &filename);
static const Format* GetFormatFromName(const String &name);
};
};

View file

@ -35,6 +35,7 @@
#pragma once #pragma once
#include <list> #include <list>
#include <wx/stream.h>
#include "manipulator.h" #include "manipulator.h"
#include "file.h" #include "file.h"
@ -65,13 +66,13 @@ namespace Aegilib {
const Format& GetFormat() const; const Format& GetFormat() const;
void AddListener(View *listener); void AddListener(View *listener);
void LoadFile(FileReader &file,Format *format=NULL); void LoadFile(wxInputStream &input,const Format *format=NULL,const String encoding=L"");
void SaveFile(FileWriter &file,Format *format=NULL); void SaveFile(wxOutputStream &output,const Format *format=NULL,const String encoding=L"UTF-8");
bool CanUndo(String owner=L"") const; bool CanUndo(const String owner=L"") const;
bool CanRedo(String owner=L"") const; bool CanRedo(const String owner=L"") const;
bool Undo(String owner=L""); bool Undo(const String owner=L"");
bool Redo(String owner=L""); bool Redo(const String owner=L"");
}; };
}; };

View file

@ -0,0 +1,114 @@
// 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/AEGILIB
//
// Website: http://www.aegisub.net
// Contact: mailto:amz@aegisub.net
//
#include "format_manager.h"
#include "formats/format_ass.h"
#include <wx/string.h>
using namespace Aegilib;
////////
// List
std::vector<const Format*> FormatManager::formats;
////////////////
// Add a format
void FormatManager::AddFormat(const Format *format)
{
formats.push_back(format);
}
///////////////////////////////////
// Initialzie all built-in formats
void FormatManager::InitializeFormats()
{
formats.push_back(new FormatASS);
}
///////////////////////
// Removes all formats
void FormatManager::ClearFormats()
{
formats.clear();
}
/////////////////////
// Number of formats
int FormatManager::GetFormatCount()
{
return (int) formats.size();
}
////////////
// By index
const Format* FormatManager::GetFormatByIndex(const int index)
{
try {
return formats.at(index);
}
catch (...) {
return NULL;
}
}
///////////////
// By filename
const Format* FormatManager::GetFormatFromFilename(const String &filename)
{
size_t len = formats.size();
for (size_t i=0;i<len;i++) {
if (filename.EndsWith(formats[i]->GetExtension())) return formats[i];
}
return NULL;
}
//////////////////
// By format name
const Format* FormatManager::GetFormatFromName(const String &name)
{
size_t len = formats.size();
for (size_t i=0;i<len;i++) {
if (name == formats[i]->GetName()) return formats[i];
}
return NULL;
}

View file

@ -0,0 +1,62 @@
// 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/AEGILIB
//
// Website: http://www.aegisub.net
// Contact: mailto:amz@aegisub.net
//
#include "model.h"
#include "format_ass.h"
using namespace Aegilib;
///////////////
// Constructor
FormatHandlerASS::FormatHandlerASS(const Model &model)
{
(void) model;
}
//////////////
// Destructor
FormatHandlerASS::~FormatHandlerASS()
{
}
///////////////
// Load a file
void FormatHandlerASS::Load(wxInputStream &file,const String encoding)
{
(void) file;
(void) encoding;
}

View file

@ -0,0 +1,69 @@
// 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/AEGILIB
//
// Website: http://www.aegisub.net
// Contact: mailto:amz@aegisub.net
//
#pragma once
#include "format.h"
#include "format_handler.h"
namespace Aegilib {
// Prototypes
class Model;
// Advanced Substation Alpha format handler
class FormatHandlerASS : public FormatHandler {
public:
FormatHandlerASS(const Model &model);
~FormatHandlerASS();
void Load(wxInputStream &file,const String encoding);
};
// Advanced Substation Alpha format
class FormatASS : public Format {
public:
String GetName() const { return L"Advanced Substation Alpha"; }
String GetExtension() const { return L".ass"; }
FormatHandler* GetHandler(const Model &model) const { return new FormatHandlerASS(model); }
bool CanStoreText() const { return true; }
bool CanUseTime() const { return true; }
bool HasStyles() const { return true; }
bool HasMargins() const { return true; }
bool HasActors() const { return true; }
};
};

View file

@ -86,26 +86,34 @@ Manipulator Model::CreateAntiManipulator(const Manipulator &src)
/////////////// ///////////////
// Load a file // Load a file
void Model::LoadFile(FileReader &file,Format *format) void Model::LoadFile(wxInputStream &input,const Format *format,const String encoding)
{ {
// Detect format // Autodetect format
if (format == NULL) { if (format == NULL) {
// TODO // TODO
// No format found
throw Exception(Exception::No_Format_Handler);
} }
// No format found // Get handler
throw Exception(Exception::No_Format_Handler); FormatHandler *handler = format->GetHandler(*this);
if (!handler) throw Exception(Exception::No_Format_Handler);
// Load // Load
(void) file; handler->Load(input,encoding);
// Clean up
delete handler;
} }
////////////////// //////////////////
// Save to a file // Save to a file
void Model::SaveFile(FileWriter &file,Format *format) void Model::SaveFile(wxOutputStream &output,const Format *format,const String encoding)
{ {
(void) file; (void) output;
(void) format; (void) format;
(void) encoding;
// TODO // TODO
} }

View file

@ -34,6 +34,7 @@
// //
#include <aegilib/aegilib.h> #include <aegilib/aegilib.h>
#include <wx/wfstream.h>
#include <iostream> #include <iostream>
#include "text_file_reader.h" #include "text_file_reader.h"
#include "text_file_writer.h" #include "text_file_writer.h"
@ -44,20 +45,33 @@ int main () {
cout << "Aegilib test program by amz.\n\n"; cout << "Aegilib test program by amz.\n\n";
// Subtitles model try {
Model subs; // Set up the lib
FormatManager::InitializeFormats();
// Load subtitles // Subtitles model
cout << "Loading file... "; Model subs;
subs.LoadFile(TextFileReader(L"subs_in.ass"));
cout << "Done.\n";
// Modify subtitles // Load subtitles
cout << "Modifying file..."; cout << "Loading file... ";
cout << "Done.\n"; String filename = L"subs_in.ass";
const Format *handler = FormatManager::GetFormatFromFilename(filename);
subs.LoadFile(wxFileInputStream(filename),handler);
cout << "Done.\n";
// Save subtitles // Modify subtitles
cout << "Saving file... "; cout << "Modifying file...";
subs.SaveFile(TextFileWriter(L"subs_out.ass")); cout << "Done.\n";
cout << "Done.\n";
// Save subtitles
cout << "Saving file... ";
filename = L"subs_out.ass";
handler = FormatManager::GetFormatFromFilename(filename);
subs.SaveFile(wxFileOutputStream(filename),handler);
cout << "Done.\n";
}
catch (Exception &e) {
cout << "\n\nException: " << e.GetMessage().mb_str(wxConvUTF8) << endl << endl;
}
} }