3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
11 #include <Carbon/Carbon.h>
12 #include <Cocoa/Cocoa.h>
14 #include "support/AppleSpeller.h"
16 typedef struct AppleSpellerRec {
17 NSSpellChecker * checker;
18 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
28 static void freeSuggestionsAppleSpeller(AppleSpeller speller)
30 if (speller->suggestions) {
31 while (speller->numsug--) {
32 free(speller->suggestions[speller->numsug]);
34 free(speller->suggestions);
35 speller->suggestions = 0;
40 AppleSpeller newAppleSpeller(void)
42 AppleSpeller speller = calloc(1, sizeof(AppleSpellerRec));
43 speller->checker = [NSSpellChecker sharedSpellChecker];
44 speller->suggestions = 0;
45 speller->doctag = [NSSpellChecker uniqueSpellDocumentTag];
50 void freeAppleSpeller(AppleSpeller speller)
52 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
54 freeSuggestionsAppleSpeller(speller);
55 [speller->checker closeSpellDocumentWithTag:speller->doctag];
63 static NSString * toString(AppleSpeller speller, const char * word)
65 return [[NSString alloc] initWithBytes:word length:strlen(word) encoding:NSUTF8StringEncoding];
69 int checkAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
71 if (!speller->checker || !lang || !word)
74 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
75 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
80 NSString * word_ = toString(speller, word);
81 NSString * lang_ = toString(speller, lang);
83 NSRange result = [speller->checker
84 checkSpellingOfString:word_
88 inSpellDocumentWithTag:speller->doctag
89 wordCount:&wordcount];
95 return (result.length ? 0 : 1);
99 void ignoreAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
101 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
102 NSString * word_ = toString(speller, word);
104 [speller->checker ignoreWord:word_ inSpellDocumentWithTag:(speller->doctag)];
111 size_t makeSuggestionAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
113 if (!speller->checker || !word || !lang)
116 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
117 NSString * word_ = toString(speller, word);
118 NSString * lang_ = toString(speller, lang);
120 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 6)
121 // Mac OS X 10.6 only
122 NSInteger slen = [word_ length];
123 NSRange range = { 0, slen };
124 NSArray * result = [speller->checker guessesForWordRange:range
127 inSpellDocumentWithTag:speller->doctag];
129 [speller->checker setLanguage:lang_];
130 NSArray * result = [speller->checker guessesForWord:word_];
136 freeSuggestionsAppleSpeller(speller);
138 speller->numsug = [result count];
139 if (speller->numsug) {
140 speller->suggestions = calloc(speller->numsug + 1, sizeof(char *));
141 if (speller->suggestions) {
143 for (i = 0; i < speller->numsug; i++) {
144 NSString * str = [result objectAtIndex:i];
145 speller->suggestions[i] = strdup([str UTF8String]);
147 speller->suggestions[speller->numsug] = 0;
151 return speller->numsug;
155 const char * getSuggestionAppleSpeller(AppleSpeller speller, size_t pos)
157 const char * result = 0;
158 if (pos < speller->numsug && speller->suggestions) {
159 result = speller->suggestions[pos] ;
165 void learnAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
167 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
168 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
169 NSString * word_ = toString(speller, word);
171 [speller->checker learnWord:word_];
179 int hasLanguageAppleSpeller(AppleSpeller speller, const char * lang)
182 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
183 NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
184 NSString * lang_ = toString(speller, lang);
185 NSArray * languages = [speller->checker availableLanguages];
187 for (NSString *element in languages) {
188 result = [element isEqualToString:lang_] || [lang_ hasPrefix:element];
196 return result ? 1 : 0;