gboolean gw_spellcheck_update (GwSpellcheck *spellcheck) { //Sanity checks g_return_val_if_fail (spellcheck != NULL, FALSE); //Declarations GwSpellcheckPrivate *priv = NULL; gboolean should_check = FALSE; gboolean should_redraw = FALSE; const gchar *query = NULL; gchar **iter = NULL; LwMorphologyEngine *morphologyengine = NULL; //Initializations priv = spellcheck->priv; morphologyengine = gw_application_get_morphologyengine (priv->application); if (priv->timeoutid[GW_SPELLCHECK_TIMEOUTID_UPDATE] == 0) { return FALSE; } else if (priv->timeout < priv->threshold) { priv->timeout++; return TRUE; } should_check = gw_spellcheck_should_check (spellcheck); should_redraw = gw_spellcheck_clear (spellcheck); //Make sure the memory is freed if (should_check) { query = gtk_entry_get_text (priv->entry); priv->tokens = g_strsplit (query, " ", -1); for (iter = priv->tokens; *iter != NULL; iter++) { if (**iter != '\0' && gw_spellcheck_is_common_script (*iter)) { LwMorphologyList *morphologylist = lw_morphologyengine_analyze (morphologyengine, *iter, TRUE); if (morphologylist != NULL) { LwMorphology *morphology = lw_morphologylist_read (morphologylist); if (morphology != NULL && morphology->spellcheck != NULL) priv->misspelled = g_list_append (priv->misspelled, *iter); lw_morphologylist_free (morphologylist); morphologylist = NULL; } } } } if (should_redraw) gtk_widget_queue_draw (GTK_WIDGET (priv->entry)); priv->timeoutid[GW_SPELLCHECK_TIMEOUTID_UPDATE] = 0; priv->timeout = 0; return FALSE; }
///! ///! @brief Only to be used when creating the index ///! static void _lw_index_create_add_string (LwIndex *index, const gchar *TEXT, LwOffset offset) { //Sanity checks g_return_if_fail (index != NULL); g_return_if_fail (TEXT != NULL); g_return_if_fail (index->morphologyengine != NULL); g_return_if_fail (index->checksum == NULL); //You cannot add a string if the checksum has already been created //Declarations LwMorphology *morphology = NULL; LwMorphologyList *list = NULL; gchar *key = NULL; list = lw_morphologyengine_analyze (index->morphologyengine, TEXT, FALSE); while ((morphology = lw_morphologylist_read (list)) != NULL) { if (morphology->word != NULL && strlen(morphology->word) > 2) { key = morphology->word; //Steals key _lw_index_create_append_data_offset (index, LW_INDEX_TABLE_RAW, key, offset); morphology->word = NULL; } if (morphology->normalized != NULL && strlen(morphology->normalized) > 2) { key = morphology->normalized; //Steals key _lw_index_create_append_data_offset (index, LW_INDEX_TABLE_NORMALIZED, key, offset); morphology->normalized = NULL; } if (morphology->stem != NULL && strlen(morphology->stem) > 2) { key = morphology->stem; //Steals key _lw_index_create_append_data_offset (index, LW_INDEX_TABLE_STEM, key, offset); morphology->stem = NULL; } if (morphology->canonical != NULL && strlen(morphology->canonical) > 2) { key = morphology->canonical; //Steals key _lw_index_create_append_data_offset (index, LW_INDEX_TABLE_CANONICAL, key, offset); morphology->canonical = NULL; } } lw_morphologylist_free (list); list = NULL; }
static gchar* lw_query_tokenlist_build_kanji_supplimentary (LwQuery *query, const gchar *TOKEN, LwQueryType *new_type) { //Sanity checks g_return_val_if_fail (query != NULL, NULL); g_return_val_if_fail (TOKEN != NULL, NULL); g_return_val_if_fail (new_type != NULL, NULL); gchar *supplimentary; gchar *temp; *new_type = LW_QUERY_TYPE_KANJI; supplimentary = g_strdup (TOKEN); #ifdef WITH_MECAB { LwMorphologyEngine *engine; LwMorphology *morphology; GList *resultlist; GList *resultlink; engine = lw_morphologyengine_get_default (); resultlink = resultlist = lw_morphologyengine_analyze (engine, TOKEN); while (resultlink != NULL) { morphology = LW_MORPHOLOGY (resultlink->data); resultlink = resultlink->next; if (morphology->base_form != NULL && g_utf8_strlen (morphology->base_form, -1) > 1 && strcmp(TOKEN, morphology->base_form) != 0) { temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, morphology->base_form, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } } if (resultlist != NULL) lw_morphologylist_free (resultlist); resultlist = NULL; } #endif return supplimentary; }
void gw_spellcheck_populate_popup (GwSpellcheck *spellcheck, GtkMenu *menu) { //Sanity checks g_return_if_fail (spellcheck != NULL); g_return_if_fail (menu != NULL); //Declarations GwSpellcheckPrivate *priv = NULL; GtkWidget *menuitem = NULL, *spellmenuitem = NULL; GtkWidget *spellmenu = NULL; gint index; gint xoffset, yoffset, x, y; gint start_offset, end_offset; gint i; gchar **iter = NULL; LwMorphologyEngine *morphologyengine = NULL; //Initializations priv = spellcheck->priv; if (priv->tokens == NULL) return; morphologyengine = gw_application_get_morphologyengine (priv->application); g_return_if_fail (morphologyengine != NULL); xoffset = gw_spellcheck_get_layout_x_offset (spellcheck); yoffset = gw_spellcheck_get_layout_y_offset (spellcheck); x = priv->x - xoffset; y = priv->y - yoffset; //Since a GtkEntry is single line, we want the y to always be in the area index = _get_string_index (priv->entry, x, y); start_offset = 0; iter = priv->tokens; while (*iter != NULL && start_offset + strlen(*iter) < index) { start_offset += strlen(*iter) + 1; iter++; } if (*iter == NULL) return; end_offset = start_offset + strlen(*iter); LwMorphologyList *morphologylist = NULL; LwMorphology *morphology = NULL; gchar **suggestions = NULL; morphologylist = lw_morphologyengine_analyze (morphologyengine, *iter, TRUE); if (morphologylist == NULL) goto errored; morphology = lw_morphologylist_read (morphologylist); if (morphology == NULL) goto errored; if (morphology->spellcheck != NULL) { suggestions = g_strsplit (morphology->spellcheck, LW_MORPHOLOGY_SPELLCHECK_DELIMITOR, -1); gsize total_suggestions = g_strv_length (suggestions); if (total_suggestions > 0 && suggestions != NULL) { menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), menuitem); gtk_widget_show (menuitem); spellmenu = gtk_menu_new (); spellmenuitem = gtk_menu_item_new_with_label (gettext("_Spellcheck")); gtk_menu_item_set_submenu (GTK_MENU_ITEM (spellmenuitem), spellmenu); gtk_menu_shell_prepend (GTK_MENU_SHELL (menu), spellmenuitem); gtk_widget_show (spellmenuitem); gchar *text = g_strdup_printf (gettext("Add \"%s\" to the dictionary"), *iter); if (text != NULL) { GtkWidget *image = gtk_image_new_from_icon_name ("gtk-add", GTK_ICON_SIZE_MENU); menuitem = gtk_menu_item_new_with_label (text); g_object_set_data_full (G_OBJECT (menuitem), "word", g_strdup (*iter), g_free); g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (gw_spellcheck_add_menuitem_activated_cb), spellcheck); gtk_menu_shell_append (GTK_MENU_SHELL (spellmenu), menuitem); g_free (text); text = NULL; gtk_widget_show (menuitem); } menuitem = gtk_separator_menu_item_new (); gtk_menu_shell_append (GTK_MENU_SHELL (spellmenu), menuitem); gtk_widget_show (menuitem); //Menuitems for (i = 0; i < total_suggestions; i++) { menuitem = gtk_menu_item_new_with_label (suggestions[i]); g_object_set_data (G_OBJECT (menuitem), "start-offset", GINT_TO_POINTER (start_offset)); g_object_set_data (G_OBJECT (menuitem), "end-offset", GINT_TO_POINTER (end_offset)); g_signal_connect (G_OBJECT (menuitem), "activate", G_CALLBACK (gw_spellcheck_menuitem_activated_cb), spellcheck); gtk_widget_show (GTK_WIDGET (menuitem)); gtk_menu_shell_append (GTK_MENU_SHELL (spellmenu), menuitem); } } } errored: if (suggestions != NULL) g_strfreev (suggestions); suggestions = NULL; if (morphologylist != NULL) lw_morphologylist_free (morphologylist); morphologylist = NULL; }
static gchar* lw_query_tokenlist_build_romaji_supplimentary (LwQuery *query, const gchar *TOKEN, LwQueryType *new_type) { //Sanity checks g_return_val_if_fail (query != NULL, NULL); g_return_val_if_fail (TOKEN != NULL, NULL); g_return_val_if_fail (new_type != NULL, NULL); //Declarations gboolean romaji_to_furigana; gboolean hiragana_to_katakana; gboolean is_romaji; gchar *supplimentary; const gint LENGTH = 100; gchar buffer[LENGTH]; gchar *temp; gboolean convertable; //Initializations romaji_to_furigana = query->flags & LW_QUERY_FLAG_ROMAJI_TO_FURIGANA; hiragana_to_katakana = query->flags & LW_QUERY_FLAG_HIRAGANA_TO_KATAKANA; is_romaji = lw_util_is_romaji_str (TOKEN); supplimentary = g_strdup (TOKEN); buffer[0] = '\0'; *new_type = LW_QUERY_TYPE_ROMAJI; convertable = lw_util_str_roma_to_hira (TOKEN, buffer, LENGTH); if (romaji_to_furigana && is_romaji && convertable) { *new_type = LW_QUERY_TYPE_MIX; temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, buffer, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; #ifdef WITH_MECAB { LwMorphologyEngine *engine; LwMorphology *morphology; GList *resultlist; GList *resultlink; engine = lw_morphologyengine_get_default (); resultlink = resultlist = lw_morphologyengine_analyze (engine, TOKEN); while (resultlink != NULL) { morphology = LW_MORPHOLOGY (resultlink->data); resultlink = resultlink->next; if (morphology->base_form != NULL && g_utf8_strlen (morphology->base_form, -1) > 1 && strcmp(TOKEN, morphology->base_form) != 0) { temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, morphology->base_form, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } } if (resultlist != NULL) lw_morphologylist_free (resultlist); resultlist = NULL; } #endif } else { buffer[0] = '\0'; } if (hiragana_to_katakana && buffer[0] != '\0' && lw_util_is_hiragana_str (buffer)) { lw_util_str_shift_hira_to_kata (buffer); temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, buffer, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } return supplimentary; }
static gchar* lw_query_tokenlist_build_furigana_supplimentary (LwQuery *query, const gchar *TOKEN, LwQueryType *new_type) { //Sanity checks g_return_val_if_fail (query != NULL, NULL); g_return_val_if_fail (TOKEN != NULL, NULL); g_return_val_if_fail (new_type != NULL, NULL); //Declarations gboolean hiragana_to_katakana; gboolean katakana_to_hiragana; gboolean is_hiragana; gboolean is_katakana; gchar *supplimentary; gchar buffer[100]; gchar *temp; //Initializations hiragana_to_katakana = query->flags & LW_QUERY_FLAG_HIRAGANA_TO_KATAKANA; katakana_to_hiragana = query->flags & LW_QUERY_FLAG_KATAKANA_TO_HIRAGANA; is_hiragana = lw_util_is_hiragana_str (TOKEN); is_katakana = lw_util_is_katakana_str (TOKEN); supplimentary = g_strdup (TOKEN); *new_type = LW_QUERY_TYPE_FURIGANA; #ifdef WITH_MECAB { LwMorphologyEngine *engine; LwMorphology *morphology; GList *resultlist; GList *resultlink; engine = lw_morphologyengine_get_default (); resultlink = resultlist = lw_morphologyengine_analyze (engine, TOKEN); while (resultlink != NULL) { morphology = LW_MORPHOLOGY (resultlink->data); resultlink = resultlink->next; if (morphology->base_form != NULL && g_utf8_strlen (morphology->base_form, -1) > 1 && strcmp(TOKEN, morphology->base_form) != 0) { temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, morphology->base_form, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } } if (resultlist != NULL) lw_morphologylist_free (resultlist); resultlist = NULL; } #endif if (hiragana_to_katakana && is_hiragana) { strcpy (buffer, TOKEN); lw_util_str_shift_hira_to_kata (buffer); temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, buffer, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } else if (katakana_to_hiragana && is_katakana) { strcpy (buffer, TOKEN); lw_util_str_shift_kata_to_hira (buffer); temp = g_strjoin (LW_QUERY_DELIMITOR_SUPPLIMENTARY_STRING, supplimentary, buffer, NULL); g_free (supplimentary); supplimentary = temp; temp = NULL; } return supplimentary; }