Example #1
0
gboolean
gbp_spell_utils_skip_no_spell_check (GtkTextTag        *no_spell_check_tag,
                                     GtkTextIter       *start,
                                     const GtkTextIter *end)
{
  g_return_val_if_fail (start != NULL, FALSE);
  g_return_val_if_fail (end != NULL, FALSE);

  if (no_spell_check_tag == NULL)
    return TRUE;

  g_return_val_if_fail (GTK_IS_TEXT_TAG (no_spell_check_tag), FALSE);

  while (gtk_text_iter_has_tag (start, no_spell_check_tag))
    {
      GtkTextIter last = *start;

      if (!gtk_text_iter_forward_to_tag_toggle (start, no_spell_check_tag))
        return FALSE;

      if (gtk_text_iter_compare (start, &last) <= 0)
        return FALSE;

      gbp_spell_utils_text_iter_forward_word_end (start);
      gbp_spell_utils_text_iter_backward_word_start (start);

      if (gtk_text_iter_compare (start, &last) <= 0)
        return FALSE;

      if (gtk_text_iter_compare (start, end) >= 0)
        return FALSE;
  }

  return TRUE;
}
Example #2
0
static void
init_boundaries (GbpSpellNavigator *self)
{
  GtkTextIter start;
  GtkTextIter end;

  g_assert (GBP_IS_SPELL_NAVIGATOR (self));
  g_assert (self->start_boundary == NULL);
  g_assert (self->end_boundary == NULL);

  if (!gtk_text_buffer_get_selection_bounds (self->buffer, &start, &end))
    gtk_text_buffer_get_bounds (self->buffer, &start, &end);

  if (gbp_spell_utils_text_iter_inside_word (&start) &&
      !gbp_spell_utils_text_iter_starts_word (&start))
    gbp_spell_utils_text_iter_backward_word_start (&start);

  if (gbp_spell_utils_text_iter_inside_word (&end))
    gbp_spell_utils_text_iter_forward_word_end (&end);

  self->start_boundary = gtk_text_buffer_create_mark (self->buffer, NULL, &start, TRUE);
  self->end_boundary = gtk_text_buffer_create_mark (self->buffer, NULL, &end, FALSE);
}
Example #3
0
static gboolean
gbp_spell_navigator_goto_next (GspellNavigator  *navigator,
                               gchar           **word_p,
                               GspellChecker   **spell_checker_p,
                               GError          **error_p)
{
  GbpSpellNavigator *self = (GbpSpellNavigator *)navigator;
  GspellTextBuffer *gspell_buffer;
  GspellChecker *spell_checker;
  GtkTextIter word_start;
  GtkTextIter end;
  GtkTextTag *no_spell_check_tag;

  g_assert (GBP_IS_SPELL_NAVIGATOR (self));
  g_assert ((self->word_start == NULL && self->word_end == NULL) ||
            (self->word_start != NULL && self->word_end != NULL));

  gspell_buffer = gspell_text_buffer_get_from_gtk_text_buffer (self->buffer);
  spell_checker = gspell_text_buffer_get_spell_checker (gspell_buffer);

  if (spell_checker == NULL)
    return FALSE;

  if (gspell_checker_get_language (spell_checker) == NULL)
    {
      if (spell_checker_p != NULL)
        *spell_checker_p = g_object_ref (spell_checker);

      g_set_error (error_p,
                   GSPELL_CHECKER_ERROR,
                   GSPELL_CHECKER_ERROR_NO_LANGUAGE_SET,
                   "%s",
                   _("No language set. Check your dictionary installation."));

      return FALSE;
    }

  gtk_text_buffer_get_iter_at_mark (self->buffer, &end, self->end_boundary);

  if (self->word_start == NULL)
    {
      GtkTextIter start;

      gtk_text_buffer_get_iter_at_mark (self->buffer, &start, self->start_boundary);

      self->word_start = gtk_text_buffer_create_mark (self->buffer, NULL, &start, TRUE);
      self->word_end = gtk_text_buffer_create_mark (self->buffer, NULL, &start, FALSE);

      word_start = start;
    }
  else
    {
      GtkTextIter word_end;

      gtk_text_buffer_get_iter_at_mark (self->buffer, &word_end, self->word_end);

      if (gtk_text_iter_compare (&end, &word_end) <= 0)
        return FALSE;

      word_start = word_end;
    }

  no_spell_check_tag = gbp_spell_utils_get_no_spell_check_tag (self->buffer);

  while (TRUE)
    {
      GtkTextIter word_end;
      g_autofree gchar *word = NULL;
      gboolean correctly_spelled;
      GError *error = NULL;

      if (!gbp_spell_utils_text_iter_starts_word (&word_start))
        {
          GtkTextIter iter;

          iter = word_start;
          gbp_spell_utils_text_iter_forward_word_end (&word_start);

          if (gtk_text_iter_equal (&iter, &word_start))
            return FALSE;

          gbp_spell_utils_text_iter_backward_word_start (&word_start);
        }

        if (!gbp_spell_utils_skip_no_spell_check (no_spell_check_tag, &word_start, &end))
          return FALSE;

        g_return_val_if_fail (gbp_spell_utils_text_iter_starts_word (&word_start), FALSE);

        word_end = word_start;
        gbp_spell_utils_text_iter_forward_word_end (&word_end);

        if (gtk_text_iter_compare (&end, &word_end) < 0)
          return FALSE;

        word = gtk_text_buffer_get_text (self->buffer, &word_start, &word_end, FALSE);
        correctly_spelled = gspell_checker_check_word (spell_checker, word, -1, &error);

        if (error != NULL)
          {
            g_propagate_error (error_p, error);
            return FALSE;
          }

        if (!correctly_spelled)
          {
            /* Found! */
            gtk_text_buffer_move_mark (self->buffer, self->word_start, &word_start);
            gtk_text_buffer_move_mark (self->buffer, self->word_end, &word_end);
            gbp_spell_navigator_select_misspelled_word (self);

            if (spell_checker_p != NULL)
              *spell_checker_p = g_object_ref (spell_checker);

            if (word_p != NULL)
              *word_p = g_steal_pointer (&word);

            return TRUE;
         }

        word_start = word_end;
    }

  return FALSE;
}
Example #4
0
static gboolean
gbp_spell_navigator_words_count_cb (WordsCountState *state)
{
  GbpSpellNavigator *self = state->navigator;
  GtkTextTag *no_spell_check_tag;
  GtkTextIter begin;
  GtkTextIter end;
  GtkTextIter word_start;
  GtkTextIter word_end;
  gchar *word;
  guint count;

  g_assert (GBP_IS_SPELL_NAVIGATOR (self));

  no_spell_check_tag = gbp_spell_utils_get_no_spell_check_tag (self->buffer);

  if (gtk_source_region_iter_get_subregion (&state->iter, &begin, &end))
    {
      word_start = word_end = begin;

      while (TRUE)
        {
          if (!gbp_spell_utils_text_iter_starts_word (&word_start))
            {
              GtkTextIter iter;

              iter = word_start;
              gbp_spell_utils_text_iter_forward_word_end (&word_start);
              if (gtk_text_iter_equal (&iter, &word_start))
                break;

              gbp_spell_utils_text_iter_backward_word_start (&word_start);
            }

          if (!gbp_spell_utils_skip_no_spell_check (no_spell_check_tag, &word_start, &end))
            break;

          word_end = word_start;
          gbp_spell_utils_text_iter_forward_word_end (&word_end);
          if (gtk_text_iter_compare (&word_end, &end) >= 0)
            break;

          word = gtk_text_buffer_get_text (self->buffer, &word_start, &word_end, FALSE);

          count = GPOINTER_TO_UINT (g_hash_table_lookup (self->words_count, word));
          count++;

          g_hash_table_insert (self->words_count, word, GUINT_TO_POINTER (count));

          word_start = word_end;
        }

      if (gtk_source_region_iter_next (&state->iter))
        return G_SOURCE_CONTINUE;
    }

  self->words_counted = TRUE;

  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_WORDS_COUNTED]);

  return G_SOURCE_REMOVE;
}