Subject: mailing-list for TeXmacs Users
List archive
From : François Poulain <address@hidden>- To: address@hidden
- Subject: Re: [TeXmacs] spell check
- Date: Mon, 2 Apr 2012 18:55:37 +0200
Le Mon, 2 Apr 2012 21:39:08 +0700 (NOVT),
"Andrey G. Grozin" <address@hidden> a écrit :
> On Mon, 2 Apr 2012, François Poulain wrote:
> > Anyway, is there *any* reason to use ispell nowaday ?
> No. It should be deprecated in favour of aspell.
Ok. Here is a patch for this, which should handle correctly (in a
aspell way) the internationalization.
I also have to add support for unicode langages (asiatics and, russian
in the future.)
Also, I guess "english" is language for "default value" ... in that
case, I do not pass language setting to aspell, which will then use
the locale configuration.
> A crasy idea: maybe it's better to use the enchant library
> (http://www.abisource.com/projects/enchant/)? It's an abstraction
> level over aspell, ispell, and some other spell checkers currently
> used by AbiWord (maybe by some other projects too, I'm not sure).
> Then there will be no need to start an aspell process and communicate
> with it, just call some enchant functions.
No idea about this. :)
François
--
François Poulain <address@hidden>
diff --git a/src/Data/String/analyze.hpp b/src/Data/String/analyze.hpp
index e326a62..0b9c484 100644
--- a/src/Data/String/analyze.hpp
+++ b/src/Data/String/analyze.hpp
@@ -38,6 +38,10 @@ string upcase_all (string s);
string locase_all (string s);
string string_union (string s1, string s2);
string string_minus (string s1, string s2);
+string utf8_to_t2a (string s);
+string t2a_to_utf8 (string s);
+string utf8_to_cork (string s);
+string cork_to_utf8 (string s);
string iso_to_koi8 (string s);
string koi8_to_iso (string s);
string iso_to_koi8uk (string s);
diff --git a/src/Data/String/converter.cpp b/src/Data/String/converter.cpp
index d4328b8..9e15780 100644
--- a/src/Data/String/converter.cpp
+++ b/src/Data/String/converter.cpp
@@ -209,6 +209,23 @@ cork_to_utf8 (string input) {
}
string
+utf8_to_t2a (string input) {
+ converter conv= load_converter ("UTF-8", "T2A");
+ int start, i, n= N(input);
+ string output;
+ for (i=0; i<n; ) {
+ start= i;
+ unsigned int code= decode_from_utf8 (input, i);
+ string s= input (start, i);
+ string r= apply (conv, s);
+ if (r == s && code >= 256)
+ r= "<#" * as_hexadecimal (code) * ">";
+ output << r;
+ }
+ return output;
+}
+
+string
t2a_to_utf8 (string input) {
converter conv= load_converter ("T2A", "UTF-8");
int start= 0, i, n= N(input);
diff --git a/src/Plugins/Ispell/ispell.cpp b/src/Plugins/Ispell/ispell.cpp
index eb5d21c..0712227 100644
--- a/src/Plugins/Ispell/ispell.cpp
+++ b/src/Plugins/Ispell/ispell.cpp
@@ -15,10 +15,11 @@
#include "tm_link.hpp"
#include "convert.hpp"
-string ispell_dictionary (string lang);
-string ispell_extra_args (string lang);
+// string ispell_dictionary (string lang);
+// string ispell_extra_args (string lang);
string ispell_encode (string lan, string s);
string ispell_decode (string lan, string s);
+string ietf_languages_code (string s);
/******************************************************************************
* The connection resource
@@ -58,27 +59,29 @@ ispeller_rep::start () {
cmd= "\"C:\\Program Files\\Aspell\\bin\\aspell.exe\"";
else
#endif
- cmd= "ispell";
- cmd << " -a -d " * ispell_dictionary (lan) * ispell_extra_args (lan);
+ return "Error: Aspell is not installed";
+ cmd << " -a --encoding=utf-8 ";
+ if (ietf_languages_code (lan) != "")
+ cmd << "-l " << ietf_languages_code (lan);
#endif
ln= make_pipe_link (cmd);
}
if (ln->alive) return "ok";
string message= ln->start ();
- if (DEBUG_IO) cout << "Ispell] Received " << message << "\n";
+ if (DEBUG_IO) cout << "Aspell] Received " << message << "\n";
if (starts (message, "Error: ")) {
if (ln->alive) ln->stop ();
return message;
}
message= retrieve ();
- if (DEBUG_IO) cout << "Ispell] Received " << message << "\n";
+ if (DEBUG_IO) cout << "Aspell] Received " << message << "\n";
#ifdef OS_WIN32
if (search_forwards (message, 0, "@(#)")) return "ok";
#else
if (starts (message, "@(#)")) return "ok";
#endif
if (ln->alive) ln->stop ();
- return "Error: no dictionary for#" * lan;
+ return "Error: no dictionary for " * lan;
}
string
@@ -114,6 +117,7 @@ ispeller_rep::send (string cmd) {
* Ispell dictionaries
******************************************************************************/
+/*
static hashmap<string,string> the_dict ("");
static void
@@ -124,8 +128,39 @@ init_dictionary (string lang, string dict) {
exists ("/usr/lib/aspell/" * dict * ".multi"))
the_dict (lang)= dict;
}
+*/
string
+ietf_languages_code (string lang) {
+ if (lang == "british") return "en_GB";
+ if (lang == "bulgarian") return "bg_BG";
+ if (lang == "chinese") return "zh_CN";
+ if (lang == "czech") return "cs_CZ";
+ if (lang == "danish") return "da_DK";
+ if (lang == "dutch") return "de_DE";
+ if (lang == "finnish") return "fi_FI";
+ if (lang == "french") return "fr_FR";
+ if (lang == "german") return "de_DE";
+ if (lang == "hungarian") return "hu_HU";
+ if (lang == "italian") return "it_IT";
+ if (lang == "japanese") return "ja_JP";
+ if (lang == "korean") return "ko_KR";
+ if (lang == "polish") return "pl_PL";
+ if (lang == "portuguese") return "pt_PT";
+ if (lang == "romanian") return "ro_RO";
+ if (lang == "russian") return "ru_RU";
+ if (lang == "slovene") return "sl_SI";
+ if (lang == "spanish") return "es_ES";
+ if (lang == "swedish") return "sv_SE";
+ if (lang == "taiwanese") return "th_TH";
+ if (lang == "ukrainian") return "uk_UA";
+ // seems to be the "default value" --> use locale
+ if (lang == "english") return "";
+ return "";
+}
+
+/*
+string
ispell_dictionary (string lang) {
if (N(the_dict) == 0) {
init_dictionary ("english", "english");
@@ -158,18 +193,23 @@ ispell_dictionary (string lang) {
if (the_dict->contains (lang)) return the_dict [lang];
return lang;
}
+*/
/******************************************************************************
* Language dependent arguments to ispell
******************************************************************************/
+/*
string
ispell_extra_args (string lan) {
if (lan == "german")
- return " -T latin1";
+ return " -T latin1 ";
+ else if (lan == "italian")
+ return " --encoding=iso-8859-1 ";
else
return "";
}
+*/
/******************************************************************************
* Internationalization
@@ -177,34 +217,18 @@ ispell_extra_args (string lan) {
string
ispell_encode (string lan, string s) {
- if ((lan == "czech") || (lan == "hungarian") ||
- (lan == "polish") || (lan == "slovene"))
- return cork_to_il2 (s);
- else if ((lan == "bulgarian") || (lan == "russian"))
- return koi8_to_iso (s);
- else if (lan == "ukrainian")
- return koi8uk_to_iso (s);
- else if (lan == "spanish")
- return spanish_to_ispanish (s);
- else if (lan == "german")
- return german_to_igerman (s);
- else return s;
+ // TODO: write tm_unicode to utf8 converter
+ if (lan == "bulgarian" || lan == "russian" || lan == "ukrainian")
+ return t2a_to_utf8 (s);
+ else return cork_to_utf8 (s);
}
string
ispell_decode (string lan, string s) {
- if ((lan == "czech") || (lan == "hungarian") ||
- (lan == "polish") || (lan == "slovene"))
- return il2_to_cork (s);
- else if ((lan == "bulgarian") || (lan == "russian"))
- return iso_to_koi8 (s);
- else if (lan == "ukrainian")
- return iso_to_koi8uk (s);
- else if (lan == "spanish")
- return ispanish_to_spanish (s);
- else if (lan == "german")
- return igerman_to_german (s);
- else return s;
+ // TODO: write utf8 to tm_unicode converter
+ if (lan == "bulgarian" || lan == "russian" || lan == "ukrainian")
+ return utf8_to_t2a (s);
+ return utf8_to_cork (s);
}
/******************************************************************************
@@ -262,7 +286,7 @@ ispell_eval (string lan, string s) {
string
ispell_start (string lan) {
- if (DEBUG_IO) cout << "Ispell] Start " << lan << "\n";
+ if (DEBUG_IO) cout << "Aspell] Start " << lan << "\n";
ispeller sc= ispeller (lan);
if (is_nil (sc)) sc= tm_new<ispeller_rep> (lan);
return sc->start ();
@@ -270,7 +294,7 @@ ispell_start (string lan) {
tree
ispell_check (string lan, string s) {
- if (DEBUG_IO) cout << "Ispell] Check " << s << "\n";
+ if (DEBUG_IO) cout << "Aspell] Check " << s << "\n";
ispeller sc= ispeller (lan);
if (is_nil (sc) || (!sc->ln->alive)) {
string message= ispell_start (lan);
@@ -283,18 +307,18 @@ ispell_check (string lan, string s) {
void
ispell_accept (string lan, string s) {
- if (DEBUG_IO) cout << "Ispell] Accept " << s << "\n";
+ if (DEBUG_IO) cout << "Aspell] Accept " << s << "\n";
ispell_send (lan, "@" * s);
}
void
ispell_insert (string lan, string s) {
- if (DEBUG_IO) cout << "Ispell] Insert " << s << "\n";
+ if (DEBUG_IO) cout << "Aspell] Insert " << s << "\n";
ispell_send (lan, "*" * s);
}
void
ispell_done (string lan) {
- if (DEBUG_IO) cout << "Ispell] End " << lan << "\n";
+ if (DEBUG_IO) cout << "Aspell] End " << lan << "\n";
ispell_send (lan, "#");
}
- Re: [TeXmacs] spell check, François Poulain, 04/02/2012
- Re: [TeXmacs] spell check, François Poulain, 04/02/2012
- Re: [TeXmacs] spell check, Philippe Joyez, 04/02/2012
- Re: [TeXmacs] spell check, François Poulain, 04/02/2012
- Re: [TeXmacs] spell check, Andrey G. Grozin, 04/02/2012
- Re: [TeXmacs] spell check, Kostas Oikonomou, 04/02/2012
- Re: [TeXmacs] spell check, François Poulain, 04/02/2012
- Re: [TeXmacs] spell check, François Poulain, 04/03/2012
- Re: [TeXmacs] spell check, Andrey G. Grozin, 04/06/2012
- Re: [TeXmacs] spell check, François Poulain, 04/10/2012
- Re: [TeXmacs] spell check, Kemal Ilgar Eroglu, 04/06/2012
- [TeXmacs] professor, El.Douwen, 04/09/2012
- Re: [TeXmacs] spell check, Andrey G. Grozin, 04/06/2012
- Re: [TeXmacs] spell check, Philippe Joyez, 04/02/2012
- Re: [TeXmacs] spell check, François Poulain, 04/02/2012
Archive powered by MHonArc 2.6.19.