/* AbiSuite * Copyright (C) 2004 RŽmi Payette * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA * 02111-1307, USA. */ #include #include "appleSpell_checker.h" #include "glib.h" AppleSpellChecker::AppleSpellChecker() { NSLog(@"AppleSpellChecker::AppleSpellChecker"); pool = [[NSAutoreleasePool alloc]init]; m_checker=[[NSSpellChecker alloc]init]; m_tag=[NSSpellChecker uniqueSpellDocumentTag]; } AppleSpellChecker::~AppleSpellChecker() { NSAutoreleasePool *tmppool=[[NSAutoreleasePool alloc]init]; NSLog(@"AppleSpellChecker::~AppleSpellChecker"); /* I don't know why I have to use tmppool but it prevent a lot of warning messages on abiword exit */ [m_checker closeSpellDocumentWithTag: m_tag]; [m_checker release]; [pool release]; [tmppool release]; } bool AppleSpellChecker::checkWord (const char *word, size_t len, NSString *lang) { NSString *str; NSRange result; if ( !lang ) return false; str = [[NSString alloc] initWithBytes:word length:len encoding:NSUTF8StringEncoding]; NSLog(@"AppleSpellChecker::checkWord %@",str); //NSLog(@"AppleSpellChecker check : %@ in %@ (%d)",str,m_lang,this->m_tag); result=[m_checker checkSpellingOfString:str startingAt:0 language:lang wrap:NO inSpellDocumentWithTag:m_tag wordCount:nil]; [str release]; if ( ! result.length ) return false; return true; } char** AppleSpellChecker::suggestWord (const char* const word, size_t len, size_t *nsug) { char **sug; NSString *str; NSArray *result; unsigned int i; NSLog(@"AppleSpellChecker::suggestWord"); str = [[NSString alloc] initWithBytes:word length:len encoding:NSUTF8StringEncoding]; result = [m_checker guessesForWord: str]; [str release]; *nsug=[result count]; if ( *nsug == 0 ) return 0; sug = g_new0 (char *, *nsug + 1); for ( i = 0; i < *nsug; i++) { str=[result objectAtIndex:i]; sug[i]=g_strdup([str UTF8String]); } //NSLog(@"AppleSpellChecker::_suggest %d suggestions",pvSugg->getItemCount()); return sug; } bool AppleSpellChecker::requestDictionary (const char * szLang, NSString **lang) { /* Only the 2 char language code can be fed to set language : fr is ok, not fr-CA */ *lang=[[NSString alloc] initWithCString:szLang length:2]; NSLog(@"AppleSpellChecker::requestDictionary %@, %p",*lang, m_checker); if (![m_checker setLanguage:*lang]) { [*lang release]; *lang=0; return false; } return (true); } /* * Enchant */ static char **appleSpell_dict_suggest (EnchantDict * me, const char *const word, size_t len, size_t * out_n_suggs) { AppleSpellChecker * checker; struct dicodata *dd= (struct dicodata *)me->user_data; NSLog(@"appleSpell_dict_suggest lang=%@",dd->thelang); checker = dd->thechecker; [checker->m_checker setLanguage:dd->thelang]; return checker->suggestWord (word, len, out_n_suggs); } static int appleSpell_dict_check (EnchantDict * me, const char *const word, size_t len) { struct dicodata *dd= (struct dicodata *)me->user_data; NSLog(@"appleSpell_dict_check"); return dd->thechecker->checkWord(word, len, dd->thelang); } static void appleSpell_dict_free_suggestions (EnchantDict * me, char **str_list) { NSLog(@"appleSpell_dict_free_suggestions"); g_strfreev (str_list); } static EnchantDict *appleSpell_provider_request_dict(EnchantProvider * me, const char *const tag) { EnchantDict *dict; struct dicodata *mydata; NSLog(@"appleSpell_provider_request_dict"); mydata= g_new0(struct dicodata, 1); mydata->thechecker=(AppleSpellChecker *)me->user_data; if (!mydata->thechecker->requestDictionary(tag, &(mydata->thelang ))) { g_free ( mydata ); return NULL; } dict = g_new0(EnchantDict, 1); dict->user_data = (void *) mydata; dict->check = appleSpell_dict_check; dict->suggest = appleSpell_dict_suggest; dict->free_string_list = appleSpell_dict_free_suggestions; return dict; } static void appleSpell_provider_dispose_dict (EnchantProvider * me, EnchantDict * dict) { struct dicodata *dd= (struct dicodata *)dict->user_data; NSLog(@"appleSpell_provider_dispose_dict"); [dd->thelang release]; g_free (dd); g_free (dict); } static int appleSpell_provider_dictionary_exists (struct str_enchant_provider * me, const char *const tag) { NSString *lang; int result=0; NSLog(@"appleSpell_provider_dictionary_exists"); /* Only the 2 char language code can be fed to set language : fr is ok, not fr-CA */ lang=[[NSString alloc] initWithCString:tag length:2]; if ([[NSSpellChecker sharedSpellChecker] setLanguage:lang]) { result=1; } [lang release]; return (result); } static void appleSpell_provider_dispose (EnchantProvider * me) { AppleSpellChecker *checker; NSLog(@"appleSpell_provider_dispose"); checker = (AppleSpellChecker *) me->user_data; delete checker; g_free (me); } static char *appleSpell_provider_identify (EnchantProvider * me) { return "AppleSpell"; } static char *appleSpell_provider_describe (EnchantProvider * me) { return "AppleSpell Provider"; } extern "C" { ENCHANT_MODULE_EXPORT (EnchantProvider *) init_enchant_provider (void) { EnchantProvider *provider; AppleSpellChecker * checker; NSLog(@"init_enchant_provider"); provider = g_new0 (EnchantProvider, 1); provider->dispose = appleSpell_provider_dispose; provider->request_dict = appleSpell_provider_request_dict; provider->dispose_dict = appleSpell_provider_dispose_dict; provider->dictionary_exists = appleSpell_provider_dictionary_exists; provider->identify = appleSpell_provider_identify; provider->describe = appleSpell_provider_describe; checker = new AppleSpellChecker(); if (!checker) return NULL; provider->user_data=(void *)checker; return provider; } }