libs-gui/Tools/GSspell.m
Wolfgang Lux 75f908ff62 Initialize language configuration variable used by the aspell checker.
This prevents a crash of the spelling server during its initialization.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gui/trunk@27818 72102866-910b-0410-8b05-ffd578937521
2009-02-08 21:32:25 +00:00

202 lines
5.3 KiB
Objective-C

/*
GSspell.m
GNUstep spell checker facility.
Copyright (C) 2001 Free Software Foundation, Inc.
Author: Gregory John Casamento <greg_casamento@yahoo.com>
Date: May 2001
This file is part of the GNUstep Project
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 3
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 library; see the file COPYING.
If not, see <http://www.gnu.org/licenses/> or write to the
Free Software Foundation, 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
// get the configuration.
#include "config.h"
#include <AppKit/AppKit.h>
#include <Foundation/Foundation.h>
#ifdef HAVE_ASPELL_H
#include <aspell.h>
#endif
// A minor category for NSData so that we can convert NSStrings
// into data.
@interface NSData (MethodsForSpellChecker)
+ (id)dataWithString: (NSString *)string;
@end
@implementation NSData (MethodsForSpellChecker)
+ (id)dataWithString: (NSString *)string
{
NSData *data = [NSData dataWithBytes: (char *)[string cString]
length: [string length]];
return data;
}
@end
@interface GNUSpellChecker : NSObject
{
#ifdef HAVE_ASPELL_H
AspellConfig *config;
AspellSpeller *speller;
AspellDocumentChecker *checker;
#endif
}
@end
@implementation GNUSpellChecker
- (NSRange)spellServer:(NSSpellServer *)sender
findMisspelledWordInString:(NSString *)stringToCheck
language:(NSString *)language
wordCount:(int *)wordCount
countOnly:(BOOL)countOnly
{
NSRange r = NSMakeRange(0,0);
#ifdef HAVE_ASPELL_H
if (countOnly)
{
NSScanner *inputScanner = [NSScanner scannerWithString: stringToCheck];
[inputScanner setCharactersToBeSkipped: [NSCharacterSet whitespaceAndNewlineCharacterSet]];
while (![inputScanner isAtEnd])
{
[inputScanner scanUpToCharactersFromSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]
intoString: NULL];
(*wordCount)++;
}
}
else
{
const char *p = [stringToCheck UTF8String];
AspellToken token;
int length = strlen(p);
aspell_document_checker_process(checker, p, length);
token = aspell_document_checker_next_misspelling(checker);
r = NSMakeRange(token.offset,token.len);
}
#else
NSLog(@"spellServer:findMisspelledWordInString:... invoked, spell server not configured.");
#endif
return r;
}
- (NSArray *)spellServer:(NSSpellServer *)sender
suggestGuessesForWord:(NSString *)word
inLanguage:(NSString *)language
{
NSMutableArray *array = [NSMutableArray array];
#ifdef HAVE_ASPELL_H
{
const char *p = [word UTF8String];
int len = strlen(p);
int words = 0;
const struct AspellWordList *list = aspell_speller_suggest(speller, p, len);
AspellStringEnumeration *en;
words = aspell_word_list_size(list);
en = aspell_word_list_elements(list);
// add them to the array.
while (!aspell_string_enumeration_at_end(en))
{
const char *string = aspell_string_enumeration_next(en);
NSString *word = [NSString stringWithUTF8String: string];
[array addObject: word];
}
// cleanup.
delete_aspell_string_enumeration(en);
}
#else
NSLog(@"spellServer:suggestGuessesForWord:... invoked, spell server not configured");
#endif
return array;
}
- (void)spellServer:(NSSpellServer *)sender
didLearnWord:(NSString *)word
inLanguage:(NSString *)language
{
#ifdef HAVE_ASPELL_H
{
const char *aword = [word UTF8String];
aspell_speller_add_to_personal(speller, aword, strlen(aword));
NSLog(@"Not implemented");
}
#else
NSLog(@"spellServer:didLearnWord:inLanguage: invoked, spell server not configured");
#endif
}
- (void)spellServer:(NSSpellServer *)sender
didForgetWord:(NSString *)word
inLanguage:(NSString *)language
{
#ifdef HAVE_ASPELL_H
NSLog(@"Not implemented");
#else
NSLog(@"spellServer:didForgetWord:inLanguage: invoked, spell server not configured");
#endif
}
- init
{
self = [super init];
if (self != nil)
{
#ifdef HAVE_ASPELL_H
// initialization...
config = new_aspell_config();
aspell_config_replace(config, "lang", "en_US");
speller = to_aspell_speller(new_aspell_speller(config));
checker = to_aspell_document_checker(new_aspell_document_checker(speller));
#endif
}
return self;
}
@end
#ifdef GNUSTEP
int main(int argc, char** argv, char **env)
#else
int main(int argc, char** argv)
#endif
{
CREATE_AUTORELEASE_POOL (_pool);
NSSpellServer *aServer = [[NSSpellServer alloc] init];
if ([aServer registerLanguage: @"AmericanEnglish" byVendor: @"GNU"]) //&&
{
[aServer setDelegate: [[GNUSpellChecker alloc] init]];
NSLog(@"Spell server started and waiting.");
[aServer run];
NSLog(@"Unexpected death of spell checker");
}
else
{
NSLog(@"Cannot create spell checker instance");
}
RELEASE(_pool);
return 0;
}