// Return a list of suggestions to a word virtual Suggestions suggest(const TCHAR * word) { Suggestions ret = {0}; load(); if (loaded != LANGUAGE_LOADED) return ret; char hunspell_word[1024]; toHunspell(hunspell_word, word, MAX_REGS(hunspell_word)); char ** words = NULL; ret.count = hunspell->suggest(&words, hunspell_word); if (ret.count > 0) { // Oki, lets make our array ret.words = (TCHAR **) malloc(ret.count * sizeof(TCHAR *)); for (unsigned i = 0; i < ret.count; i++) { ret.words[i] = fromHunspell(words[i]); free(words[i]); } } if (words != NULL) free(words); return ret; }
void loadCustomDict() { TCHAR filename[1024]; mir_sntprintf(filename, MAX_REGS(filename), _T("%s\\%s.cdic"), userPath, language); FILE *file = _tfopen(filename, _T("rb")); if (file != NULL) { char tmp[1024]; char c; int pos = 0; while((c = fgetc(file)) != EOF) { if (c == '\n' || c == '\r' || pos >= MAX_REGS(tmp) - 1) { if (pos > 0) { tmp[pos] = '\0'; hunspell->add(tmp); } pos = 0; } else { tmp[pos] = c; pos ++; } } fclose(file); } }
// Return a list of auto suggestions to a word virtual Suggestions autoSuggest(const TCHAR * word) { Suggestions ret = {0}; load(); if (loaded != LANGUAGE_LOADED) return ret; char hunspell_word[1024]; toHunspell(hunspell_word, word, MAX_REGS(hunspell_word)); char ** words; int count = hunspell->suggest_auto(&words, hunspell_word); if (count <= 0) return ret; // Oki, lets make our array ret.count = count; ret.words = (TCHAR **) malloc(ret.count * sizeof(TCHAR *)); for (int i = 0; i < count; i++) { ret.words[i] = fromHunspell(words[i]); free(words[i]); } free(words); return ret; }
virtual void addWordInternal(const TCHAR * word) { if (loaded != LANGUAGE_LOADED) return; char hunspell_word[1024]; toHunspell(hunspell_word, word, MAX_REGS(hunspell_word)); hunspell->add(hunspell_word); }
// Return TRUE if the word is correct virtual BOOL spell(const TCHAR *word) { load(); if (loaded != LANGUAGE_LOADED) return TRUE; // TODO Check if it was generated by auto-replacement char hunspell_word[1024]; toHunspell(hunspell_word, word, MAX_REGS(hunspell_word)); return hunspell->spell(hunspell_word); }
//! \brief SpellCheckerPrivate::addUserDictionary adds the users custom words to the dictionary //! \param user_dictionary filename of the user's dictionary void SpellCheckerPrivate::addUserDictionary(const QString &user_dictionary) { if (not hunspell) return; if (not user_dictionary.isEmpty() and QFile::exists(user_dictionary)) { QFile file(user_dictionary); if (file.open(QFile::ReadOnly)) { QTextStream stream(&file); while (!stream.atEnd()) { hunspell->add(codec->fromUnicode(stream.readLine())); } } } }
bool MySpellChecker::checkWord(const char *utf8Word, size_t len) { if (len > MAXWORDLEN || !g_iconv_is_valid(m_translate_in)) return false; // the 8bit encodings use precomposed forms char *normalizedWord = g_utf8_normalize (utf8Word, len, G_NORMALIZE_NFC); char *in = normalizedWord; char word8[MAXWORDLEN + 1]; char *out = word8; size_t len_in = strlen(in); size_t len_out = sizeof( word8 ) - 1; size_t result = g_iconv(m_translate_in, &in, &len_in, &out, &len_out); g_free(normalizedWord); if ((size_t)-1 == result) return false; *out = '\0'; if (myspell->spell(word8)) return true; else return false; }
// Return a list of auto suggestions to a word // You have to free the list AND each item virtual TCHAR * autoSuggestOne(const TCHAR * word) { load(); if (loaded != LANGUAGE_LOADED) return NULL; char hunspell_word[1024]; toHunspell(hunspell_word, word, MAX_REGS(hunspell_word)); char ** words; int count = hunspell->suggest_auto(&words, hunspell_word); if (count <= 0) return NULL; TCHAR *ret = fromHunspell(words[0]); // Oki, lets make our array for (int i = 0; i < count; i++) free(words[i]); free(words); return ret; }
void loadThread() { char dic[1024]; char aff[1024]; #ifdef UNICODE mir_snprintf(dic, MAX_REGS(dic), "%S.dic", fileWithoutExtension); mir_snprintf(aff, MAX_REGS(aff), "%S.aff", fileWithoutExtension); #else mir_snprintf(dic, MAX_REGS(dic), "%s.dic", fileWithoutExtension); mir_snprintf(aff, MAX_REGS(aff), "%s.aff", fileWithoutExtension); #endif hunspell = new Hunspell(aff, dic); // Get codepage const char *dic_enc = hunspell->get_dic_encoding(); TCHAR *hwordchars; if (strcmp(dic_enc, "UTF-8") == 0) { codePage = CP_UTF8; #ifdef UNICODE int wcs_len; hwordchars = fromHunspell((char *) hunspell->get_wordchars_utf16(&wcs_len)); #else // No option hwordchars = NULL; #endif } else { for (int i = 0; i < MAX_REGS(codepages); i++) { if (_strcmpi(codepages[i].name, dic_enc) == 0) { if (IsValidCodePage(codepages[i].codepage)) codePage = codepages[i].codepage; break; } } hwordchars = fromHunspell(hunspell->get_wordchars()); } TCHAR *casechars = fromHunspellAndFree(get_casechars(dic_enc)); TCHAR *try_string = fromHunspellAndFree(hunspell->get_try_string()); wordChars = merge(merge(casechars, hwordchars), try_string); // Make a suggestion to load hunspell internalls char ** words = NULL; int count = hunspell->suggest(&words, "asdf"); for (int i = 0; i < count; i++) free(words[i]); if (words != NULL) free(words); loadCustomDict(); loaded = LANGUAGE_LOADED; }