]> git.lyx.org Git - lyx.git/blob - src/support/AppleSpeller.m
6530e53dd42f920b55398e1f2e41bca84d1ca7e2
[lyx.git] / src / support / AppleSpeller.m
1 /**
2  * \file AppleSpeller.m
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author Stephan Witt
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <Carbon/Carbon.h>
12 #include <Cocoa/Cocoa.h>
13
14 #include "support/AppleSpeller.h"
15
16 typedef struct AppleSpellerRec {
17         NSSpellChecker * checker;
18 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
19         NSInteger doctag;
20 #else
21         int doctag;
22 #endif
23         char ** suggestions;
24         size_t numsug;
25 } AppleSpellerRec ;
26
27
28 static void freeSuggestionsAppleSpeller(AppleSpeller speller)
29 {
30         if (speller->suggestions) {
31                 while (speller->numsug--) {
32                         free(speller->suggestions[speller->numsug]);
33                 }
34                 free(speller->suggestions);
35                 speller->suggestions = 0;
36         }
37 }
38
39
40 AppleSpeller newAppleSpeller(void)
41 {
42         AppleSpeller speller = calloc(1, sizeof(AppleSpellerRec));
43         speller->checker = [NSSpellChecker sharedSpellChecker];
44         speller->suggestions = 0;
45         speller->doctag = [NSSpellChecker uniqueSpellDocumentTag];
46         return speller;
47 }
48
49
50 void freeAppleSpeller(AppleSpeller speller)
51 {
52         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
53
54         freeSuggestionsAppleSpeller(speller);
55         [speller->checker closeSpellDocumentWithTag:speller->doctag];
56
57         [pool release];
58
59         free(speller);
60 }
61
62
63 static NSString * toString(AppleSpeller speller, const char * word)
64 {
65         return [[NSString alloc] initWithBytes:word length:strlen(word) encoding:NSUTF8StringEncoding];
66 }
67
68
69 int checkAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
70 {
71         if (!speller->checker || !lang || !word)
72                 return 0;
73
74         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
75 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
76         NSInteger wordcount;
77 #else
78         int wordcount;
79 #endif
80         NSString * word_ = toString(speller, word);
81         NSString * lang_ = toString(speller, lang);
82
83         NSRange result = [speller->checker
84                 checkSpellingOfString:word_
85                 startingAt:0
86                 language:lang_
87                 wrap:(BOOL)NO
88                 inSpellDocumentWithTag:speller->doctag
89                 wordCount:&wordcount];
90
91         [word_ release];
92         [lang_ release];
93         [pool release];
94
95         return (result.length ? 0 : 1);
96 }
97
98
99 void ignoreAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
100 {
101         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
102         NSString * word_ = toString(speller, word);
103
104         [speller->checker ignoreWord:word_ inSpellDocumentWithTag:(speller->doctag)];
105
106         [word_ release];
107         [pool release];
108 }
109
110
111 size_t makeSuggestionAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
112 {
113         if (!speller->checker || !word || !lang)
114                 return 0;
115
116         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
117         NSString * word_ = toString(speller, word);
118         NSString * lang_ = toString(speller, lang);
119
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
125                 inString:word_
126                 language:lang_
127                 inSpellDocumentWithTag:speller->doctag];
128 #else
129         [speller->checker setLanguage:lang_];
130         NSArray * result = [speller->checker guessesForWord:word_];
131 #endif
132
133         [word_ release];
134         [lang_ release];
135
136         freeSuggestionsAppleSpeller(speller);
137
138         speller->numsug = [result count];
139         if (speller->numsug) {
140                 speller->suggestions = calloc(speller->numsug + 1, sizeof(char *));
141                 if (speller->suggestions) {
142                         size_t i;
143                         for (i = 0; i < speller->numsug; i++) {
144                                 NSString * str = [result objectAtIndex:i];
145                                 speller->suggestions[i] = strdup([str UTF8String]);
146                         }
147                         speller->suggestions[speller->numsug] = 0;
148                 }
149         }
150         [pool release];
151         return speller->numsug;
152 }
153
154
155 const char * getSuggestionAppleSpeller(AppleSpeller speller, size_t pos)
156 {
157         const char * result = 0;
158         if (pos < speller->numsug && speller->suggestions) {
159                 result = speller->suggestions[pos] ;
160         }
161         return result;
162 }
163
164
165 void learnAppleSpeller(AppleSpeller speller, const char * word, const char * lang)
166 {
167 #if defined(LYX_PLATFORM_DARWIN10) && (LYX_PLATFORM_DARWIN10 >= 5)
168         NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
169         NSString * word_ = toString(speller, word);
170
171         [speller->checker learnWord:word_];
172         
173         [word_ release];
174         [pool release];
175 #endif
176 }
177
178
179 int hasLanguageAppleSpeller(AppleSpeller speller, const char * lang)
180 {
181         BOOL result = NO;
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];
186
187         for (NSString *element in languages) {
188             result = [element isEqualToString:lang_] || [lang_ hasPrefix:element];
189                 if (result) break;
190         }
191
192         [lang_ release];
193         [pool release];
194 #endif
195
196         return result ? 1 : 0;
197 }