Made hunspell into a pluggable factory. This MIGHT cause issues with mythes if hunspell is not available...

Originally committed to SVN as r1108.
This commit is contained in:
Rodrigo Braz Monteiro 2007-04-22 02:03:40 +00:00
parent b2f2cf2d7f
commit 4f1dc2c59d
14 changed files with 108 additions and 199 deletions

View file

@ -40,7 +40,6 @@
#include "dialog_about.h" #include "dialog_about.h"
#include "version.h" #include "version.h"
#include "options.h" #include "options.h"
#include "setup.h"
/////////////// ///////////////
@ -62,21 +61,11 @@ AboutScreen::AboutScreen(wxWindow *parent)
libString += _T("wxWidgets - Copyright (c) 1998-2006 Julian Smart, Robert Roebling et al;\n"); libString += _T("wxWidgets - Copyright (c) 1998-2006 Julian Smart, Robert Roebling et al;\n");
libString += _T("wxStyledTextCtrl - Copyright (c) 2004 wxCode;\n"); libString += _T("wxStyledTextCtrl - Copyright (c) 2004 wxCode;\n");
libString += _T("Lua - Copyright (c) 1994-2006 Lua.org, PUC-Rio;\n"); libString += _T("Lua - Copyright (c) 1994-2006 Lua.org, PUC-Rio;\n");
#if USE_HUNSPELL == 1
libString += _T("Hunspell - Copyright (c) Kevin Hendricks;\n"); libString += _T("Hunspell - Copyright (c) Kevin Hendricks;\n");
#endif
#if USE_PORTAUDIO == 1
libString += _T("PortAudio - Copyright (c) 1999-2000 Ross Bencina, Phil Burk;\n"); libString += _T("PortAudio - Copyright (c) 1999-2000 Ross Bencina, Phil Burk;\n");
#endif libString += _T("FFmpeg - Copyright (c) 2001 Fabrice Bellard,;\n");
#if USE_LAVC == 1 libString += _T("libass - Copyright (c) 2006-2007, Evgeniy Stepanov;\n");
libString += _T("FFmpeg - Copyright (c) ??;\n");
#endif
#if USE_LIBASS == 1
libString += _T("libass - Copyright (c) 2006, Evgeniy Stepanov;\n");
#endif
#if USE_ASA == 1
libString += _T("asa - Copyright (c) 2004-2007, David Lamparter;\n"); libString += _T("asa - Copyright (c) 2004-2007, David Lamparter;\n");
#endif
libString += _T("MyThes - Copyright (c) 2003 Kevin B. Hendricks, Stratford, Ontario, Canada\n"); libString += _T("MyThes - Copyright (c) 2003 Kevin B. Hendricks, Stratford, Ontario, Canada\n");
libString += _T("Matroska Parser and VideoSink - Copyright (c) 2004-2007 Mike Matsnev\n"); libString += _T("Matroska Parser and VideoSink - Copyright (c) 2004-2007 Mike Matsnev\n");

View file

@ -66,7 +66,7 @@ DialogSpellChecker::DialogSpellChecker(wxFrame *parent)
: wxDialog(parent, -1, _("Spell Checker"), wxDefaultPosition, wxDefaultSize) : wxDialog(parent, -1, _("Spell Checker"), wxDefaultPosition, wxDefaultSize)
{ {
// Get spell checker // Get spell checker
spellchecker = SpellChecker::GetSpellChecker(); spellchecker = SpellCheckerFactory::GetSpellChecker();
if (!spellchecker) { if (!spellchecker) {
wxMessageBox(_T("No spellchecker available."),_T("Error"),wxICON_ERROR); wxMessageBox(_T("No spellchecker available."),_T("Error"),wxICON_ERROR);
Destroy(); Destroy();

View file

@ -234,9 +234,7 @@ void FrameMain::InitToolbar () {
Toolbar->AddTool(Menu_Tools_Fonts_Collector,_("Fonts Collector"),wxBITMAP(font_collector_button),_("Open Fonts Collector")); Toolbar->AddTool(Menu_Tools_Fonts_Collector,_("Fonts Collector"),wxBITMAP(font_collector_button),_("Open Fonts Collector"));
Toolbar->AddTool(Menu_Tools_Resample,_("Resample"),wxBITMAP(resample_toolbutton),_("Resample Script Resolution")); Toolbar->AddTool(Menu_Tools_Resample,_("Resample"),wxBITMAP(resample_toolbutton),_("Resample Script Resolution"));
Toolbar->AddTool(Menu_Tools_Timing_Processor,_("Timing Post-Processor"),wxBITMAP(timing_processor_toolbutton),_("Open Timing Post-processor dialog")); Toolbar->AddTool(Menu_Tools_Timing_Processor,_("Timing Post-Processor"),wxBITMAP(timing_processor_toolbutton),_("Open Timing Post-processor dialog"));
#if USE_HUNSPELL == 1
Toolbar->AddTool(Menu_Tools_SpellCheck,_("Spell Checker"),wxBITMAP(spellcheck_toolbutton),_("Open Spell checker")); Toolbar->AddTool(Menu_Tools_SpellCheck,_("Spell Checker"),wxBITMAP(spellcheck_toolbutton),_("Open Spell checker"));
#endif
Toolbar->AddSeparator(); Toolbar->AddSeparator();
// Options // Options
@ -332,9 +330,7 @@ void FrameMain::InitMenu() {
AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Translation, _("&Translation Assistant..."),_("Open translation assistant"), wxBITMAP(translation_toolbutton)); AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Translation, _("&Translation Assistant..."),_("Open translation assistant"), wxBITMAP(translation_toolbutton));
AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Resample,_("Resample resolution..."), _("Changes resolution and modifies subtitles to conform to change"), wxBITMAP(resample_toolbutton)); AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Resample,_("Resample resolution..."), _("Changes resolution and modifies subtitles to conform to change"), wxBITMAP(resample_toolbutton));
AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Fonts_Collector, _("&Fonts Collector..."),_("Open fonts collector"), wxBITMAP(font_collector_button)); AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_Fonts_Collector, _("&Fonts Collector..."),_("Open fonts collector"), wxBITMAP(font_collector_button));
#if USE_HUNSPELL == 1
AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_SpellCheck, _("Spe&ll Checker..."),_("Open spell checker"), wxBITMAP(spellcheck_toolbutton)); AppendBitmapMenuItem (subtitlesMenu,Menu_Tools_SpellCheck, _("Spe&ll Checker..."),_("Open spell checker"), wxBITMAP(spellcheck_toolbutton));
#endif
MenuBar->Append(subtitlesMenu, _("&Subtitles")); MenuBar->Append(subtitlesMenu, _("&Subtitles"));
// Create timing menu // Create timing menu

View file

@ -38,12 +38,11 @@
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>
#include "setup.h"
#include "mythes.hxx" #include "mythes.hxx"
// some basic utility routines // some basic utility routines
#if USE_HUNSPELL == 0 #if 0
// string duplication routine // string duplication routine
char * mystrdup(const char * p) char * mystrdup(const char * p)
{ {
@ -56,7 +55,17 @@ char * mystrdup(const char * p)
} }
return NULL; return NULL;
} }
// remove cross-platform text line end characters
void mychomp(char * s)
{
int k = strlen(s);
if ((k > 0) && ((*(s+k-1)=='\r') || (*(s+k-1)=='\n'))) *(s+k-1) = '\0';
if ((k > 1) && (*(s+k-2) == '\r')) *(s+k-2) = '\0';
}
#endif #endif
char * mystrdup(const char * p);
void mychomp(char * s);
// return index of char in string // return index of char in string
@ -68,17 +77,6 @@ int mystr_indexOfChar(const char * d, int c)
} }
// remove cross-platform text line end characters
#if USE_HUNSPELL == 0
void mychomp(char * s)
{
int k = strlen(s);
if ((k > 0) && ((*(s+k-1)=='\r') || (*(s+k-1)=='\n'))) *(s+k-1) = '\0';
if ((k > 1) && (*(s+k-2) == '\r')) *(s+k-2) = '\0';
}
#endif
MyThes::MyThes(const char* idxpath, const char * datpath) MyThes::MyThes(const char* idxpath, const char * datpath)
{ {
nw = 0; nw = 0;

View file

@ -108,6 +108,7 @@ void OptionsManager::LoadDefaults(bool onlyDefaults) {
// Edit Box // Edit Box
SetText(_T("Dictionaries path"),_T("dictionaries")); SetText(_T("Dictionaries path"),_T("dictionaries"));
SetText(_T("Spell Checker"),_T("hunspell"));
SetBool(_T("Link time boxes commit"),true); SetBool(_T("Link time boxes commit"),true);
SetModificationType(MOD_EDIT_BOX); SetModificationType(MOD_EDIT_BOX);
SetBool(_T("Call tips enabled"),true); SetBool(_T("Call tips enabled"),true);

View file

@ -93,15 +93,4 @@
#pragma comment(lib, "wsock32.lib") #pragma comment(lib, "wsock32.lib")
////////////
// Hunspell
#if USE_HUNSPELL == 1
#ifdef __WXDEBUG__
#pragma comment(lib,"hunspelld.lib")
#else
#pragma comment(lib,"hunspell.lib")
#endif
#endif
#endif // VisualC #endif // VisualC

View file

@ -42,36 +42,6 @@
// //
////////////////////////////////////
// Enable DirectShow Video Provider
// Requires: Win32, DirectX SDK
#define USE_DIRECTSHOW 0
///////////////////////////////////
// Enable DirectSound Audio Player
// Requires: Win32, DirectX SDK
#define USE_DIRECTSOUND 1
/////////////////////////////////
// Enable PortAudio Audio Player
// Requires: PortAudio library
#define USE_PORTAUDIO 0
////////////////////////////////
// Enable Hunspell spellchecker
#define USE_HUNSPELL 0
//////////////////////////////
// Enable LAVC video provider
// Requires: FFMPEG library
#define USE_LAVC 0
//////////////////////// ////////////////////////
// Enable PRS Exporting // Enable PRS Exporting
// Requires: wxPNG library // Requires: wxPNG library
@ -84,17 +54,7 @@
#define USE_FEXTRACKER 1 #define USE_FEXTRACKER 1
// The following two are Linux-specific, so it would involve changing the makefiles
// Therefore, I haven't changed the code to make them work, yet
///////////////// /////////////////
// Enable LibASS // Enable LibASS
// Requires: libass library, GNU? // Requires: libass library
#define USE_LIBASS 0 #define USE_LIBASS 0
//////////////
// Enable ASA
// Requires: asa library
#define USE_ASA 0

View file

@ -38,22 +38,35 @@
// Headers // Headers
#include "setup.h" #include "setup.h"
#include "spellchecker.h" #include "spellchecker.h"
#if USE_HUNSPELL == 1 #include "options.h"
#include "spellchecker_hunspell.h"
#endif
///////////////////// /////////////////////
// Get spell checker // Get spell checker
SpellChecker *SpellChecker::GetSpellChecker() { SpellChecker *SpellCheckerFactory::GetSpellChecker() {
// Initialize // List of providers
SpellChecker *check = NULL; wxArrayString list = GetFactoryList(Options.AsText(_T("Spell Checker")));
// Try hunspell // None available
#if USE_HUNSPELL == 1 if (list.Count() == 0) throw _T("No spell checkers are available.");
check = new HunspellSpellChecker();
#endif
// Return // Get provider
return check; wxString error;
for (unsigned int i=0;i<list.Count();i++) {
try {
SpellChecker *checker = GetFactory(list[i])->CreateSpellChecker();
if (checker) return checker;
}
catch (wxString err) { error += list[i] + _T(" factory: ") + err + _T("\n"); }
catch (const wxChar *err) { error += list[i] + _T(" factory: ") + wxString(err) + _T("\n"); }
catch (...) { error += list[i] + _T(" factory: Unknown error\n"); }
}
// Failed
throw error;
} }
//////////
// Static
template <class SpellCheckerFactory> std::map<wxString,SpellCheckerFactory*>* AegisubFactory<SpellCheckerFactory>::factories=NULL;

View file

@ -40,14 +40,13 @@
/////////// ///////////
// Headers // Headers
#include <wx/wxprec.h> #include <wx/wxprec.h>
#include "factory.h"
/////////////////////////// ///////////////////////////
// Spellchecking interface // Spellchecking interface
class SpellChecker { class SpellChecker {
public: public:
static SpellChecker *GetSpellChecker();
SpellChecker() {} SpellChecker() {}
virtual ~SpellChecker() {} virtual ~SpellChecker() {}
@ -60,3 +59,16 @@ public:
virtual wxArrayString GetLanguageList()=0; virtual wxArrayString GetLanguageList()=0;
virtual void SetLanguage(wxString language)=0; virtual void SetLanguage(wxString language)=0;
}; };
///////////
// Factory
class SpellCheckerFactory : public AegisubFactory<SpellCheckerFactory> {
protected:
virtual SpellChecker *CreateSpellChecker()=0;
SpellCheckerFactory(wxString name) { RegisterFactory(name); }
public:
virtual ~SpellCheckerFactory() {}
static SpellChecker *GetSpellChecker();
};

View file

@ -36,18 +36,63 @@
/////////// ///////////
// Headers // Headers
#include "setup.h" #include "spellchecker.h"
#if USE_HUNSPELL == 1 #include "main.h"
#include "utils.h"
#include "options.h"
#include <hunspell/hunspell.hxx> #include <hunspell/hunspell.hxx>
#include <wx/wxprec.h> #include <wx/wxprec.h>
#include <wx/wxprec.h>
#include <wx/dir.h> #include <wx/dir.h>
#include <wx/filename.h> #include <wx/filename.h>
#include <wx/wfstream.h> #include <wx/wfstream.h>
#include <wx/txtstrm.h> #include <wx/txtstrm.h>
#include "spellchecker_hunspell.h"
#include "main.h"
#include "utils.h" /////////////
#include "options.h" // Libraries
#if __VISUALC__ >= 1200
#ifdef __WXDEBUG__
#pragma comment(lib,"hunspelld.lib")
#else
#pragma comment(lib,"hunspell.lib")
#endif
#endif
//////////////////
// Hunspell class
class HunspellSpellChecker : public SpellChecker {
private:
Hunspell *hunspell;
wxCSConv *conv;
wxString affpath;
wxString dicpath;
void Reset();
public:
HunspellSpellChecker();
~HunspellSpellChecker();
void AddWord(wxString word);
bool CanAddWord(wxString word);
bool CheckWord(wxString word);
wxArrayString GetSuggestions(wxString word);
wxArrayString GetLanguageList();
void SetLanguage(wxString language);
};
///////////
// Factory
class HunspellSpellCheckerFactory : public SpellCheckerFactory {
public:
SpellChecker *CreateSpellChecker() { return new HunspellSpellChecker(); }
HunspellSpellCheckerFactory() : SpellCheckerFactory(_T("hunspell")) {}
} registerHunspell;
/////////////// ///////////////
@ -234,5 +279,3 @@ void HunspellSpellChecker::SetLanguage(wxString language) {
conv = NULL; conv = NULL;
if (hunspell) conv = new wxCSConv(wxString(hunspell->get_dic_encoding(),wxConvUTF8)); if (hunspell) conv = new wxCSConv(wxString(hunspell->get_dic_encoding(),wxConvUTF8));
} }
#endif

View file

@ -1,76 +0,0 @@
// Copyright (c) 2006, 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 "setup.h"
#if USE_HUNSPELL == 1
#include "spellchecker.h"
#include <wx/wxprec.h>
//////////////
// Prototypes
class Hunspell;
//////////////////
// Hunspell class
class HunspellSpellChecker : public SpellChecker {
private:
Hunspell *hunspell;
wxCSConv *conv;
wxString affpath;
wxString dicpath;
void Reset();
public:
HunspellSpellChecker();
~HunspellSpellChecker();
void AddWord(wxString word);
bool CanAddWord(wxString word);
bool CheckWord(wxString word);
wxArrayString GetSuggestions(wxString word);
wxArrayString GetLanguageList();
void SetLanguage(wxString language);
};
#endif

View file

@ -79,7 +79,6 @@
#include <wx/event.h> #include <wx/event.h>
#include <wx/stc/stc.h> #include <wx/stc/stc.h>
#include <wx/string.h> #include <wx/string.h>
//#include <GL/glew.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glu.h> #include <GL/glu.h>
#include <wx/glcanvas.h> #include <wx/glcanvas.h>
@ -92,18 +91,4 @@
#include <map> #include <map>
///////////////
// DirectSound
#if USE_DIRECTSOUND == 1
//#include <dsound.h>
#endif
////////////
// Hunspell
#if USE_HUNSPELL == 1
#include <hunspell/hunspell.hxx>
#endif
#endif // C++ #endif // C++

View file

@ -69,7 +69,7 @@ SubsTextEditCtrl::SubsTextEditCtrl(wxWindow* parent, wxWindowID id, const wxStri
CmdKeyClear('U',wxSTC_SCMOD_CTRL); CmdKeyClear('U',wxSTC_SCMOD_CTRL);
// Set spellchecker // Set spellchecker
spellchecker = SpellChecker::GetSpellChecker(); spellchecker = SpellCheckerFactory::GetSpellChecker();
// Set thesaurus // Set thesaurus
thesaurus = Thesaurus::GetThesaurus(); thesaurus = Thesaurus::GetThesaurus();

View file

@ -185,7 +185,7 @@ void TextFileReader::SetEncodingConfiguration() {
wxString TextFileReader::ReadLineFromFile() { wxString TextFileReader::ReadLineFromFile() {
Open(); Open();
wxString wxbuffer; wxString wxbuffer;
int bufAlloc = 1024; size_t bufAlloc = 1024;
wxbuffer.Alloc(bufAlloc); wxbuffer.Alloc(bufAlloc);
#ifdef TEXT_READER_USE_STDIO #ifdef TEXT_READER_USE_STDIO
char buffer[512]; char buffer[512];
@ -199,7 +199,6 @@ wxString TextFileReader::ReadLineFromFile() {
char charbuffer[3]; char charbuffer[3];
charbuffer[2] = 0; charbuffer[2] = 0;
wchar_t ch = 0; wchar_t ch = 0;
int n = 0;
size_t len = 0; size_t len = 0;
#ifdef TEXT_READER_USE_STDIO #ifdef TEXT_READER_USE_STDIO
while (ch != L'\n' && !feof(file)) { while (ch != L'\n' && !feof(file)) {