Example #1
0
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;
}
Example #2
0
///!
///! @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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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;
}