diff -Naur gnome-spell-1.0.7.orig/README gnome-spell-1.0.7/README --- gnome-spell-1.0.7.orig/README 2001-10-08 18:57:45.000000000 +0000 +++ gnome-spell-1.0.7/README 2006-03-22 09:39:08.000000000 +0000 @@ -3,7 +3,7 @@ Gnome Spell is GNOME/Bonobo component for spell checking. In current 0.1 version it contains GNOME::Spell::Dictionary object, which provides spell checking dictionary -(see Spell.idl for exact API definition). It's based on pspell package, which is required +(see Spell.idl for exact API definition). It's based on Enchant package, which is required to build gnome-spell. Dictionary object could be used for live spell checking. Look in test-spell.c or @@ -12,19 +12,18 @@ In future it will be expanded by implementation of GNOME::Spell::Checker object (see also Spell.idl) and also by spell checking dialog control with appropriate interface. -Pspell build +Enchant build ------------ -From my experience with pspell I recommend you to build pspell/aspell this way: +From my experience with Enchant I recommend you to build it this way: - 1) build and install pspell - 2) build and install aspell + 1) build and install Pspell, Aspell + 2) build and install Enchant 4) build and install GNOME Spell -You could get Pspell and Aspell from: +You could get Enchant from: - http://pspell.sourceforge.net/ - http://aspell.sourceforge.net/ + http://www.abisource.com/enchant/ End --- diff -Naur gnome-spell-1.0.7.orig/configure.in gnome-spell-1.0.7/configure.in --- gnome-spell-1.0.7.orig/configure.in 2006-02-10 11:46:32.000000000 +0000 +++ gnome-spell-1.0.7/configure.in 2006-03-22 09:39:04.000000000 +0000 @@ -68,34 +68,6 @@ AC_SUBST(API_VERSION) dnl -dnl aspell -dnl - -AC_ARG_WITH(aspell-prefix, [ --with-aspell-prefix=DIR - specify under which prefix aspell is installed.], with_aspell_prefix="$withval", ) - -if test "x$with_aspell_prefix" != "x"; then - saved_LDFLAGS=$LDFLAGS - LDFLAGS="-L$with_aspell_prefix/lib "$LDFLAGS - ASPELL_INC="-I$with_aspell_prefix/include" - ASPELL_LIBS="-L$with_aspell_prefix/lib -laspell" - ASPELL_DATA="$with_aspell_prefix/lib/aspell" -else - LDFLAGS="-L`aspell config prefix`/lib "$LDFLAGS - ASPELL_INC="-I`aspell config prefix`/include" - ASPELL_LIBS="-L`aspell config prefix`/lib -laspell" - ASPELL_DICT="`aspell config dict-dir`" -fi -AC_CHECK_LIB(aspell,new_aspell_config,,AC_MSG_ERROR([gnome-spell cannot be built without aspell library]),) -if test "x$with_aspell_prefix" != "x"; then - LDFLAGS=$saved_LDFLAGS -fi - -AC_SUBST(ASPELL_DICT) -AC_SUBST(ASPELL_INC) -AC_SUBST(ASPELL_LIBS) - -dnl dnl flags dnl @@ -104,7 +76,7 @@ AC_SUBST(CPPFLAGS) AC_SUBST(LDFLAGS) -GNOME_SPELL_MODULES="libgnomeui-2.0 >= 1.112.1 libbonoboui-2.0 >= 1.112.1 libglade-2.0 >= 1.99.9" +GNOME_SPELL_MODULES="libgnomeui-2.0 >= 1.112.1 libbonoboui-2.0 >= 1.112.1 libglade-2.0 >= 1.99.9 enchant >= 1.2.2" PKG_CHECK_MODULES(GNOME_SPELL, $GNOME_SPELL_MODULES) AC_SUBST(GNOME_SPELL_CFLAGS) AC_SUBST(GNOME_SPELL_LIBS) diff -Naur gnome-spell-1.0.7.orig/gnome-spell/Makefile.am gnome-spell-1.0.7/gnome-spell/Makefile.am --- gnome-spell-1.0.7.orig/gnome-spell/Makefile.am 2006-01-19 23:37:50.000000000 +0000 +++ gnome-spell-1.0.7/gnome-spell/Makefile.am 2006-03-22 09:39:04.000000000 +0000 @@ -7,13 +7,11 @@ INCLUDES = \ -I$(srcdir) \ - $(ASPELL_INC) \ -DPREFIX=\""$(prefix)"\" \ -DGNOMEDATADIR=\""$(datadir)"\" \ -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ -DGLADE_DATADIR=\"$(gladedir)\" \ -DPLUGIN_DIR=\""$(PLUGIN_DIR)"\" \ - -DASPELL_DICT=\""$(ASPELL_DICT)"\" \ $(GNOME_SPELL_CFLAGS) \ $(END) @@ -55,7 +53,6 @@ libgnome_spell_component_la_LDFLAGS = -release $(API_VERSION) $(NO_UNDEFINED) libgnome_spell_component_la_LIBADD = \ libgnome-spell-idl.la \ - $(ASPELL_LIBS) \ $(GNOME_SPELL_LIBS) \ $(END) @@ -69,7 +66,6 @@ test_gnome_spell_component_LDADD = \ libgnome-spell-idl.la \ - $(ASPELL_LIBS) \ $(GNOME_SPELL_LIBS) \ $(END) diff -Naur gnome-spell-1.0.7.orig/gnome-spell/dictionary.c gnome-spell-1.0.7/gnome-spell/dictionary.c --- gnome-spell-1.0.7.orig/gnome-spell/dictionary.c 2006-02-05 21:31:09.000000000 +0000 +++ gnome-spell-1.0.7/gnome-spell/dictionary.c 2006-03-22 09:39:04.000000000 +0000 @@ -36,6 +36,13 @@ #include "Spell.h" #include "dictionary.h" +#include + +typedef struct { + EnchantBroker * config; + EnchantDict * speller; +} SpellEngine; + static BonoboObjectClass *dictionary_parent_class; #define DICT_DEBUG(x) @@ -72,12 +79,24 @@ { GNOMESpellDictionary *dict = GNOME_SPELL_DICTIONARY (object); - dict->changed = TRUE; dict->engines = NULL; dict->languages = g_hash_table_new (g_str_hash, g_str_equal); dict->engines_ht = g_hash_table_new (NULL, NULL); } +static char ** +dup_string_list (char ** str_list, size_t list_len) +{ + char ** new_str_list; + size_t i; + + new_str_list = g_new0 (char *, list_len + 1); + for (i = 0; i < list_len; i++) + new_str_list [i] = g_strdup (str_list [i]); + + return new_str_list; +} + static void dictionary_finalize (GObject *object) { @@ -93,15 +112,16 @@ } static SpellEngine * -new_engine (const gchar *language) +new_engine (const gchar *language, CORBA_Environment *ev) { SpellEngine *se; se = g_new0 (SpellEngine, 1); - se->config = new_aspell_config (); - aspell_config_replace (se->config, "language-tag", language); - aspell_config_replace (se->config, "encoding", "utf-8"); - se->changed = TRUE; + se->config = enchant_broker_init (); + se->speller = enchant_broker_request_dict (se->config, language); + + if(se->speller == NULL) + raise_error (ev, enchant_broker_get_error (se->config)); return se; } @@ -129,9 +149,9 @@ SpellEngine *se = dict->engines->data; if (se->speller) - delete_aspell_speller (se->speller); + enchant_broker_free_dict (se->config, se->speller); if (se->config) - delete_aspell_config (se->config); + enchant_broker_free (se->config); g_free (se); dict->engines = g_slist_remove (dict->engines, se); } @@ -140,7 +160,6 @@ g_hash_table_foreach_remove (dict->languages, remove_engine_ht, NULL); dict->engines = NULL; - dict->changed = TRUE; } static LangInfo known_languages [] = { @@ -355,28 +374,27 @@ get_languages_real (gint *ln) { GSList *langs; - AspellCanHaveError *err; - AspellConfig *config; - AspellSpeller *speller; + EnchantBroker *broker; gint i; DICT_DEBUG (printf ("get_languages_real\n")); + /* todo: this could probably be better done by enchant_broker_list_dicts(), but let's keep + the initial code change to a minimum */ + + broker = enchant_broker_init (); langs = NULL; *ln = 0; for (i=0; i < G_N_ELEMENTS (known_languages); i++) { - config = new_aspell_config (); - aspell_config_replace (config, "language-tag", known_languages [i].abbreviation); - err = new_aspell_speller (config); - if (aspell_error_number (err) == 0) { - speller = to_aspell_speller (err); + if (enchant_broker_dict_exists (broker, known_languages [i].abbreviation)) { DICT_DEBUG (printf ("Language: %s\n", known_languages [i].name)); - delete_aspell_speller (speller); langs = g_slist_prepend (langs, GINT_TO_POINTER (i)); (*ln) ++; } } + enchant_broker_free (broker); + return langs; } @@ -405,16 +423,13 @@ { GSList *langs, *l; GConfClient *gc; - time_t mtime; - struct stat buf; gint i, kl; gc = gconf_client_get_default (); - mtime = gconf_client_get_int (gc, GNOME_SPELL_GCONF_DIR "/mtime", NULL); kl = gconf_client_get_int (gc, GNOME_SPELL_GCONF_DIR "/known_languages", NULL); - if (stat (ASPELL_DICT, &buf) || buf.st_mtime != mtime || kl != G_N_ELEMENTS(known_languages)) { + if (kl != G_N_ELEMENTS(known_languages)) { GString *str; langs = get_languages_real (ln); @@ -425,7 +440,7 @@ gconf_client_set_int (gc, str->str, GPOINTER_TO_INT (l->data), NULL); l = l->next; } - gconf_client_set_int (gc, GNOME_SPELL_GCONF_DIR "/mtime", buf.st_mtime, NULL); + gconf_client_set_int (gc, GNOME_SPELL_GCONF_DIR "/known_languages", G_N_ELEMENTS(known_languages), NULL); g_string_free (str, TRUE); gnome_config_sync (); @@ -504,51 +519,11 @@ SpellEngine *se; one_language = g_strndup (begin, len); - se = new_engine (one_language); + se = new_engine (one_language, ev); dict->engines = g_slist_prepend (dict->engines, se); g_hash_table_insert (dict->languages, one_language, se); g_hash_table_insert (dict->engines_ht, se, g_strdup (one_language)); - - dict->changed = TRUE; - } - } -} - -static void -update_engine (SpellEngine *se, CORBA_Environment * ev) -{ - AspellCanHaveError *err; - - DICT_DEBUG (printf ("Dictionary: creating new aspell speller\n")); - - if (se->changed) { - if (se->speller) - delete_aspell_speller (se->speller); - err = new_aspell_speller (se->config); - if (aspell_error_number (err) != 0) { - g_warning ("aspell error: %s\n", aspell_error_message (err)); - se->speller = NULL; - raise_error (ev, aspell_error_message (err)); - } else { - se->speller = to_aspell_speller (err); - se->changed = FALSE; - } - } -} - -static void -update_engines (GNOMESpellDictionary *dict, CORBA_Environment * ev) -{ - g_return_if_fail (IS_GNOME_SPELL_DICTIONARY (dict)); - - if (dict->changed) { - GSList *l; - - for (l = dict->engines; l; l = l->next) { - update_engine ((SpellEngine *) l->data, ev); } - - dict->changed = FALSE; } } @@ -556,7 +531,7 @@ engine_check_word (SpellEngine *se, const gchar *word, CORBA_Environment *ev) { CORBA_boolean result = CORBA_TRUE; - gint aspell_result; + gint enchant_result; #ifndef G_DISABLE_CHECKS g_return_val_if_fail (se->speller, CORBA_TRUE); @@ -564,12 +539,12 @@ if (!se->speller) return CORBA_TRUE; #endif - aspell_result = aspell_speller_check (se->speller, word, strlen (word)); - if (aspell_result == 0) + enchant_result = enchant_dict_check (se->speller, word, strlen (word)); + if (enchant_result == 0) result = CORBA_FALSE; - if (aspell_result == -1) { - g_warning ("aspell error: %s\n", aspell_speller_error_message (se->speller)); - raise_error (ev, aspell_speller_error_message (se->speller)); + if (enchant_result == -1) { + g_warning ("enchant error: %s\n", enchant_dict_get_error (se->speller)); + raise_error (ev, enchant_dict_get_error (se->speller)); } return result; @@ -592,7 +567,6 @@ if (!strcmp (word, "Ximian")) return CORBA_TRUE; - update_engines (dict, ev); for (l = dict->engines; l; l = l->next) { if (((SpellEngine *) l->data)->speller) { valid_speller = TRUE; @@ -621,11 +595,10 @@ if (!word) return; #endif - update_engines (dict, ev); DICT_DEBUG (printf ("Dictionary add_word_to_session: %s\n", word)); for (l = dict->engines; l; l = l->next) { if (((SpellEngine *) l->data)->speller) - aspell_speller_add_to_session (((SpellEngine *) l->data)->speller, word, strlen (word)); + enchant_dict_add_to_session (((SpellEngine *) l->data)->speller, word, strlen (word)); } } @@ -642,7 +615,6 @@ if (!word || !language) return; #endif - update_engines (dict, ev); DICT_DEBUG (printf ("Dictionary add_word_to_personal: %s (%s)\n", word, language)); se = (SpellEngine *) g_hash_table_lookup (dict->languages, language); @@ -666,7 +638,6 @@ if (!word || !replacement) return; #endif - update_engines (dict, ev); DICT_DEBUG (printf ("Dictionary correction: %s <-- %s\n", word, replacement)); se = (SpellEngine *) g_hash_table_lookup (dict->languages, language); @@ -683,8 +654,8 @@ const CORBA_char *word, CORBA_Environment *ev) { GNOMESpellDictionary *dict = GNOME_SPELL_DICTIONARY (bonobo_object_from_servant (servant)); - const AspellWordList *suggestions; - AspellStringEnumeration *elements; + char **suggestions; + size_t number_of_suggestions; GNOME_Spell_StringSeq *seq = NULL; GSList *l, *suggestion_list = NULL; gint i, len, pos; @@ -696,17 +667,19 @@ return NULL; #endif DICT_DEBUG (printf ("Dictionary correction: %s\n", word)); - update_engines (dict, ev); len = 0; for (l = dict->engines; l; l = l->next) { SpellEngine *se = (SpellEngine *) l->data; if (se->speller) { - suggestions = aspell_speller_suggest (se->speller, word, strlen (word)); - suggestion_list = g_slist_prepend (suggestion_list, (gpointer) suggestions); - len += 2*aspell_word_list_size (suggestions); + suggestions = enchant_dict_suggest (se->speller, word, strlen (word), &number_of_suggestions); + suggestion_list = g_slist_prepend (suggestion_list, + (gpointer) dup_string_list (suggestions, number_of_suggestions)); + len += 2*number_of_suggestions; suggestion_list = g_slist_prepend (suggestion_list, engine_to_language (dict, se)); + suggestion_list = g_slist_prepend (suggestion_list, GINT_TO_POINTER (number_of_suggestions)); + enchant_dict_free_string_list (se->speller, suggestions); } } @@ -723,17 +696,18 @@ gint list_len; gchar *language; + list_len = GPOINTER_TO_INT (l->data); + l = l->next; language = (gchar *) l->data; l = l->next; - suggestions = (const AspellWordList *) l->data; - elements = aspell_word_list_elements (suggestions); - list_len = aspell_word_list_size (suggestions); + suggestions = (char **) l->data; for (i = 0; i < list_len; i ++, pos ++) { - seq->_buffer [pos] = CORBA_string_dup (aspell_string_enumeration_next (elements)); + seq->_buffer [pos] = CORBA_string_dup (suggestions [i]); pos ++; seq->_buffer [pos] = CORBA_string_dup (language); } - delete_aspell_string_enumeration (elements); + + g_strfreev (suggestions); } CORBA_sequence_set_release (seq, CORBA_TRUE); g_slist_free (suggestion_list); diff -Naur gnome-spell-1.0.7.orig/gnome-spell/dictionary.h gnome-spell-1.0.7/gnome-spell/dictionary.h --- gnome-spell-1.0.7.orig/gnome-spell/dictionary.h 2006-02-05 21:31:09.000000000 +0000 +++ gnome-spell-1.0.7/gnome-spell/dictionary.h 2006-03-22 09:39:04.000000000 +0000 @@ -26,7 +26,6 @@ G_BEGIN_DECLS #include -#include #define GNOME_SPELL_DICTIONARY_TYPE (gnome_spell_dictionary_get_type ()) #define GNOME_SPELL_DICTIONARY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), \ @@ -37,12 +36,6 @@ #define IS_GNOME_SPELL_DICTIONARY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GNOME_SPELL_DICTIONARY_TYPE)) typedef struct { - AspellConfig *config; - AspellSpeller *speller; - gboolean changed; -} SpellEngine; - -typedef struct { gchar *abbreviation; gchar *name; } LangInfo; @@ -50,7 +43,6 @@ typedef struct { BonoboObject parent; - gboolean changed; GSList *engines; GHashTable *languages; GHashTable *engines_ht; diff -Naur gnome-spell-1.0.7.orig/gnome-spell.spec.in gnome-spell-1.0.7/gnome-spell.spec.in --- gnome-spell-1.0.7.orig/gnome-spell.spec.in 2001-11-01 22:19:22.000000000 +0000 +++ gnome-spell-1.0.7/gnome-spell.spec.in 2006-03-22 09:39:08.000000000 +0000 @@ -7,12 +7,10 @@ Source: ftp://ftp.gnome.org/pub/GNOME/unstable/sources/%{name}/%{name}-%{version}.tar.gz Summary: The spelling component for bonobo Group: System Environment/Libraries -Requires: aspell >= 0.28 -Requires: pspell >= 0.12 +Requires: enchant >= 0.3.0 Requires: bonobo >= 0.28 Requires: gal >= 0.7.99.5 -BuildRequires: aspell-devel >= 0.28 -BuildRequires: pspell-devel >= 0.12 +BuildRequires: enchant-devel >= 0.3.0 BuildRequires: bonobo-devel >= 0.28 BuildRequires: libglade-devel BuildRequires: gal-devel >= 0.7.99.5