[gnome-text-editor] spellcheck: add group property to language info



commit 48b9ec78cfa80fcf4b29e7353935da5299a903e0
Author: Christian Hergert <chergert redhat com>
Date:   Fri Jun 24 13:24:29 2022 -0700

    spellcheck: add group property to language info
    
    This can be used in a future commit to group selections by language name.

 src/editor-spell-language-info.c            | 30 ++++++++++++++-
 src/editor-spell-language-info.h            | 10 +++--
 src/enchant/editor-enchant-spell-provider.c | 60 ++++++++++++++++++++++-------
 3 files changed, 81 insertions(+), 19 deletions(-)
---
diff --git a/src/editor-spell-language-info.c b/src/editor-spell-language-info.c
index 8bc4ceb..7d4095c 100644
--- a/src/editor-spell-language-info.c
+++ b/src/editor-spell-language-info.c
@@ -27,6 +27,7 @@ struct _EditorSpellLanguageInfo
   GObject parent_instance;
   char *name;
   char *code;
+  char *group;
 };
 
 G_DEFINE_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, G_TYPE_OBJECT)
@@ -34,6 +35,7 @@ G_DEFINE_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, G_TYPE_OBJEC
 enum {
   PROP_0,
   PROP_CODE,
+  PROP_GROUP,
   PROP_NAME,
   N_PROPS
 };
@@ -49,11 +51,13 @@ static GParamSpec *properties [N_PROPS];
  */
 EditorSpellLanguageInfo *
 editor_spell_language_info_new (const char *name,
-                                const char *code)
+                                const char *code,
+                                const char *group)
 {
   return g_object_new (EDITOR_TYPE_SPELL_LANGUAGE_INFO,
                        "name", name,
                        "code", code,
+                       "group", group,
                        NULL);
 }
 
@@ -64,6 +68,7 @@ editor_spell_language_info_finalize (GObject *object)
 
   g_clear_pointer (&self->name, g_free);
   g_clear_pointer (&self->code, g_free);
+  g_clear_pointer (&self->group, g_free);
 
   G_OBJECT_CLASS (editor_spell_language_info_parent_class)->finalize (object);
 }
@@ -86,6 +91,10 @@ editor_spell_language_info_get_property (GObject    *object,
       g_value_set_string (value, editor_spell_language_info_get_code (self));
       break;
 
+    case PROP_GROUP:
+      g_value_set_string (value, editor_spell_language_info_get_group (self));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -109,6 +118,10 @@ editor_spell_language_info_set_property (GObject      *object,
       self->code = g_value_dup_string (value);
       break;
 
+    case PROP_GROUP:
+      self->group = g_value_dup_string (value);
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
     }
@@ -137,6 +150,13 @@ editor_spell_language_info_class_init (EditorSpellLanguageInfoClass *klass)
                          NULL,
                          (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  properties [PROP_GROUP] =
+    g_param_spec_string ("group",
+                         "Group",
+                         "A group for sorting, usually the country name",
+                         NULL,
+                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_properties (object_class, N_PROPS, properties);
 }
 
@@ -160,3 +180,11 @@ editor_spell_language_info_get_code (EditorSpellLanguageInfo *self)
 
   return self->code;
 }
+
+const char *
+editor_spell_language_info_get_group (EditorSpellLanguageInfo *self)
+{
+  g_return_val_if_fail (EDITOR_IS_SPELL_LANGUAGE_INFO (self), NULL);
+
+  return self->group;
+}
diff --git a/src/editor-spell-language-info.h b/src/editor-spell-language-info.h
index a844261..ede69b8 100644
--- a/src/editor-spell-language-info.h
+++ b/src/editor-spell-language-info.h
@@ -28,9 +28,11 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (EditorSpellLanguageInfo, editor_spell_language_info, EDITOR, SPELL_LANGUAGE_INFO, 
GObject)
 
-EditorSpellLanguageInfo *editor_spell_language_info_new      (const char              *name,
-                                                              const char              *code);
-const char              *editor_spell_language_info_get_name (EditorSpellLanguageInfo *self);
-const char              *editor_spell_language_info_get_code (EditorSpellLanguageInfo *self);
+EditorSpellLanguageInfo *editor_spell_language_info_new       (const char              *name,
+                                                               const char              *code,
+                                                               const char              *group);
+const char              *editor_spell_language_info_get_group (EditorSpellLanguageInfo *self);
+const char              *editor_spell_language_info_get_name  (EditorSpellLanguageInfo *self);
+const char              *editor_spell_language_info_get_code  (EditorSpellLanguageInfo *self);
 
 G_END_DECLS
diff --git a/src/enchant/editor-enchant-spell-provider.c b/src/enchant/editor-enchant-spell-provider.c
index fb722c5..1949013 100644
--- a/src/enchant/editor-enchant-spell-provider.c
+++ b/src/enchant/editor-enchant-spell-provider.c
@@ -50,6 +50,31 @@ get_broker (void)
   return broker;
 }
 
+static char *
+_icu_uchar_to_char (const UChar *input,
+                    gsize        max_input_len)
+{
+  GString *str;
+
+  g_assert (input != NULL);
+  g_assert (max_input_len > 0);
+
+  if (input[0] == 0)
+    return NULL;
+
+  str = g_string_new (NULL);
+
+  for (gsize i = 0; i < max_input_len; i++)
+    {
+      if (input[i] == 0)
+        break;
+
+      g_string_append_unichar (str, input[i]);
+    }
+
+  return g_string_free (str, FALSE);
+}
+
 static char *
 get_display_name (const char *code)
 {
@@ -59,20 +84,26 @@ get_display_name (const char *code)
     {
       UChar ret[256];
       UErrorCode status = U_ZERO_ERROR;
-
-      ret[0] = 0;
       uloc_getDisplayName (code, names[i], ret, G_N_ELEMENTS (ret), &status);
-      ret[G_N_ELEMENTS (ret)-1] = 0;
+      if (status == U_ZERO_ERROR)
+        return _icu_uchar_to_char (ret, G_N_ELEMENTS (ret));
+    }
 
-      if (status == U_ZERO_ERROR && ret[0] != 0)
-        {
-          GString *str = g_string_new (NULL);
+  return NULL;
+}
 
-          for (guint j = 0; ret[j]; j++)
-            g_string_append_unichar (str, ret[j]);
+static char *
+get_display_language (const char *code)
+{
+  const char * const *names = g_get_language_names ();
 
-          return g_string_free (str, FALSE);
-        }
+  for (guint i = 0; names[i]; i++)
+    {
+      UChar ret[256];
+      UErrorCode status = U_ZERO_ERROR;
+      uloc_getDisplayLanguage (code, names[i], ret, G_N_ELEMENTS (ret), &status);
+      if (status == U_ZERO_ERROR)
+        return _icu_uchar_to_char (ret, G_N_ELEMENTS (ret));
     }
 
   return NULL;
@@ -112,12 +143,13 @@ list_languages_cb (const char * const  lang_tag,
 {
   GPtrArray *ar = user_data;
   char *name = get_display_name (lang_tag);
+  char *group = get_display_language (lang_tag);
 
   if (name != NULL)
-    {
-      g_ptr_array_add (ar, editor_spell_language_info_new (name, lang_tag));
-      g_free (name);
-    }
+    g_ptr_array_add (ar, editor_spell_language_info_new (name, lang_tag, group));
+
+  g_free (name);
+  g_free (group);
 }
 
 static GPtrArray *


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]