This is an automated email from the git hooks/post-receive script. rene pushed a commit to branch master in repository hunspell.
commit 0593209d0c0ed0f846a80f9bfd4e927ac7fb5a98 Author: Rene Engelhard <[email protected]> Date: Thu Apr 21 14:45:18 2016 +0200 Imported Upstream version 1.2.2~b2~20080401 --- BUGS | 4 +- ChangeLog | 55 ++- NEWS | 6 +- configure | 20 +- configure.ac | 4 +- man/hu/hunspell.4 | 847 +++++++++++++++++++++++++---------------- man/hunspell.1 | 12 +- man/hunspell.4 | 26 +- po/hu.gmo | Bin 7564 -> 7563 bytes po/hu.po | 2 +- src/hunspell/Makefile.am | 2 +- src/hunspell/Makefile.in | 2 +- src/hunspell/affentry.cxx | 107 +++--- src/hunspell/affixmgr.cxx | 41 +- src/hunspell/affixmgr.hxx | 2 + src/hunspell/atypes.hxx | 14 +- src/hunspell/csutil.cxx | 12 +- src/hunspell/csutil.hxx | 16 +- src/hunspell/hashmgr.cxx | 2 +- src/hunspell/htypes.hxx | 4 - src/hunspell/hunspell.cxx | 12 +- src/hunspell/hunspell.h | 35 +- src/hunspell/hunspell.hxx | 5 +- src/hunspell/hunzip.cxx | 17 +- src/hunspell/phonet.cxx | 2 +- src/hunspell/phonet.hxx | 4 +- src/hunspell/suggestmgr.cxx | 3 +- src/hunspell/w_char.hxx | 19 + src/tools/affixcompress | 13 +- src/tools/analyze.cxx | 2 +- src/tools/chmorph.cxx | 14 +- src/tools/hunspell.cxx | 223 ++++++++--- src/tools/makealias | 34 +- src/win_api/Hunspell.rc | 10 +- src/win_api/config.h | 4 +- src/win_api/libhunspell.vcproj | 20 + tests/circumfix.morph | 4 +- tests/rep.aff | 3 +- 38 files changed, 1038 insertions(+), 564 deletions(-) diff --git a/BUGS b/BUGS index 98558e1..cb0ea7f 100644 --- a/BUGS +++ b/BUGS @@ -1,7 +1,5 @@ -* Interactive interface has some visualisation problem with UTF-8 characters +* Interactive interface has some visualization problem with long lines * -U, -u options doesn't support Unicode. * Compound handling is not thread safe in Hungarian specific code - -* stemming is experimental and incomplete diff --git a/ChangeLog b/ChangeLog index 46d1473..3216f5b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,58 @@ -2007-11-16 Németh László <nemeth at OOo>: +* src/hunspell.h: add DLL macro for Flemming Frandsen + +- add per mille to LANG hu_HU section + +új makealias +ivóvíz tiltási probléma!!! +- több szótár:: +hu_HU_geo +hu_HU_politics +hu_HU_ +NAME magyar geológiai szakszótár + +- időkorlát a generáláshoz??? +- valami optimalizálás kell + + +- DEBUG mode: -m +- m: analyze or flag debug mode +- s: stems + +- hunzip.cxx: explicit binary read for Windows (fopen(,"rb")) + +- szinonimaszótár elkészítése, + +- javított javaslattevés??? +ötlet: +- nagyon eltérőt ne javasoljon!!! +- gyorsítás, optimalizálás??? (egy betűs eltérés jav.???) +- + +Hunspell ui: refresh() for better reaction time!!! +- fix tabulators +- fix different encoding of dic and input, and suggestions +- long lines: problems + +timeless warnings Mozilla (Ryan) +hunspell.cxx-ben config.h??? + * man/hunspell.4: fix formatting problem (missing header) + +2008-01-30 1882105 Mark McClain: OS X fix on PPC platform + + +- manual!! +- chmorph vissza!!!! +HENTRY_DATA át, kitöröl a htypes hiv., máshonnan +két konstruktor +* phonet.cxx ->HASHs +csutill a htypes-hoz +Ryan: MOZILLA_CLIENT a hunzipba + +* tests/rep.aff: fix REP count + +2008-01-30 Németh László <nemeth at OOo>: - ZWSP, REP, tabulator problems: need for the final release? + * Bug 1851246 IDB_Winshell Visual C, hunspell.cxx, csutil.cxx, hunspelldll.c diff --git a/NEWS b/NEWS index a68e581..c514e10 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,6 @@ -2008-01-16: Hunspell 1.2.2 release: +2008-03-03: Hunspell 1.2.2 release: - multiple dictionary (dic file) support to use extra (medical, - geographical etc.) dictionaries + geographical etc.) dictionaries (tools/example) - optional compressed dictionary format "hzip" for aff and dic files @@ -8,7 +8,7 @@ other commercial programs - new affix compression tool "affixcompress" - + - bug fixes 2007-11-01: Hunspell 1.2.1 release: diff --git a/configure b/configure index f2d6276..48880d9 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.59 for hunspell 1.2.2b. +# Generated by GNU Autoconf 2.59 for hunspell 1.2.2. # # Report bugs to <[email protected]>. # @@ -423,8 +423,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='hunspell' PACKAGE_TARNAME='hunspell' -PACKAGE_VERSION='1.2.2b' -PACKAGE_STRING='hunspell 1.2.2b' +PACKAGE_VERSION='1.2.2' +PACKAGE_STRING='hunspell 1.2.2' PACKAGE_BUGREPORT='[email protected]' ac_unique_file="config.h.in" @@ -954,7 +954,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures hunspell 1.2.2b to adapt to many kinds of systems. +\`configure' configures hunspell 1.2.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1021,7 +1021,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of hunspell 1.2.2b:";; + short | recursive ) echo "Configuration of hunspell 1.2.2:";; esac cat <<\_ACEOF @@ -1171,7 +1171,7 @@ fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF -hunspell configure 1.2.2b +hunspell configure 1.2.2 generated by GNU Autoconf 2.59 Copyright (C) 2003 Free Software Foundation, Inc. @@ -1185,7 +1185,7 @@ cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by hunspell $as_me 1.2.2b, which was +It was created by hunspell $as_me 1.2.2, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ @@ -1913,7 +1913,7 @@ fi # Define the identity of the package. PACKAGE=hunspell - VERSION=1.2.2b + VERSION=1.2.2 cat >>confdefs.h <<_ACEOF @@ -23881,7 +23881,7 @@ _ASBOX } >&5 cat >&5 <<_CSEOF -This file was extended by hunspell $as_me 1.2.2b, which was +This file was extended by hunspell $as_me 1.2.2, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -23944,7 +23944,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ -hunspell config.status 1.2.2b +hunspell config.status 1.2.2 configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" diff --git a/configure.ac b/configure.ac index 19ec498..0e580d0 100644 --- a/configure.ac +++ b/configure.ac @@ -4,12 +4,12 @@ m4_pattern_allow AC_PREREQ(2.59) -AC_INIT([hunspell],[1.2.2b],[[email protected]]) +AC_INIT([hunspell],[1.2.2],[[email protected]]) AC_CANONICAL_SYSTEM AC_SUBST(XFAILED) -AM_INIT_AUTOMAKE(hunspell, 1.2.2b) +AM_INIT_AUTOMAKE(hunspell, 1.2.2) HUNSPELL_VERSION_MAJOR=`echo $VERSION | cut -d"." -f1` HUNSPELL_VERSION_MINOR=`echo $VERSION | cut -d"." -f2` AC_SUBST(HUNSPELL_VERSION_MAJOR) diff --git a/man/hu/hunspell.4 b/man/hu/hunspell.4 index 904bb0e..8932c4b 100644 --- a/man/hu/hunspell.4 +++ b/man/hu/hunspell.4 @@ -1,28 +1,28 @@ .hla hu -.TH hunspell 4 "2005. m�jus 13." +.TH hunspell 4 "2005. május 13." .LO 1 -.SH N�V -hunspell \- a Hunspell �llom�nyainak form�tuma -.SH LE�R�S +.SH NÉV +hunspell \- a Hunspell állományainak formátuma +.SH LEÍRÁS A .IR Hunspell (1) -k�t �llom�nyt ig�nyel egy adott nyelven t�rt�n� helyes�r�s\-ellen�rz�shez. -Az els� �llom�ny egy sz�t�r�llom�ny, ami az adott nyelv szavait, �s -ezek kapcsol�it (attrib�tumait) tartalmazza. A m�sodik �llom�ny -egy ragoz�si (affixum) �llom�ny, ami meghat�rozza az eml�tett -kapcsol�k jelent�s�t. A \fIhunspell\fR, ellent�tben az \fIispell\fR\-lel, -k�zvetlen�l haszn�lja fel ezeket az �llom�nyokat, teh�t nem -k�pez bel�l�k bin�ris (.hash kiterjeszt�s�) �llom�nyt (l. -.IR ispell "(4))." -.SH SZ�T�R�LLOM�NY +két állományt igényel egy adott nyelven történő helyesírás\-ellenőrzéshez. +Az első állomány egy szótárállomány, ami az adott nyelv szavait, és +ezek kapcsolóit (attribútumait) tartalmazza. A második állomány +egy ragozási (affixum) állomány, ami meghatározza az említett +kapcsolók jelentését. + +.SH SZÓTÁRÁLLOMÁNY Egy hunspell -.B sz�t�r�llom�ny -els� sora a sz�t�r�llom�nyban -l�v� szavak sz�m�t tartalmazza. A t�bbi sor soronk�nt egy -sz�t tartalmaz. Minden sz� ut�n nem k�telez�en egy -perjel, �s egy, vagy t�bb kapcsol� k�vetkezhet. A -kapcsol�k egybet�sek, �s meghat�rozz�k, hogy milyen -toldal�kokat kaphat a t�sz�. P�ld�ul a +.B szótárállomány +(*.dic) első sora a szótárállományban +lévő szavak közelítő számát tartalmazza (az optimális méretű +memóriaterület lefoglalásához). A többi sor soronként egy +szót tartalmaz. Minden szó után nem kötelezően egy +perjel, és egy, vagy több kapcsoló következhet. A +kapcsolók egybetűsek, és meghatározzák, hogy milyen +toldalékokat kaphat a tőszó, illetve milyen egyéb speciális +tulajdonságokkal rendelkezik. Például a .PP .RS .nf @@ -31,47 +31,66 @@ hunspellezik/EeX .fi .RE .PP -sz�t�r egy sz�t tartalmaz (hunspell), ami a magyar ragoz�si -�llom�ny alapj�n alanyi �s t�rgyas igeragoz�st is -vonz (E �s e kapcsol�k), valamint igek�t� prefixumokat is -kaphat. A p�lda sz�t�r�llom�ny �s a magyar ragoz�si -�llom�ny alapj�n a \fImeghunspellezt�tek\fR helyes sz�k�nt -ker�lne felismer�sre. -.PP -Morfol�giai le�r�st adhatunk meg a tabul�torjellel -elv�lasztott m�sodik mez�ben: +szótár egy szót tartalmaz (hunspell), ami a magyar ragozási +állomány alapján alanyi és tárgyas igeragozást is +vonz (E és e kapcsolók), valamint igekötő prefixumokat is +kaphat. A példa szótárállomány és a magyar ragozási +állomány alapján a \fImeghunspelleztétek\fR helyes szóként +kerülne felismerésre. + +A szótári szavak perjelet is tartalmazhatnak, ha +az fordított perjellel van bevezetve: "\/". A kapcsolók +alapértelmezésként egy karakteresek, de ha több ragozási +osztályt szeretnénk használni, ez több karakteresre vagy számra is +módosítható. + +A Hunspell szótárállományok sorai kiegészítő adatmezőket is tartalmazhatnak, +amelyek szóközökkel vagy tabulátorokkal vannak elválasztva (l. kiegészítő +adatmezők). + +A személyes szótárak egyszerű szólisták. Megadhatunk +perjellel elválasztott példaszavakat is a toldalékolás engedélyezésére: + .PP .RS .nf -1 -hunspellezik/EeX [IGE] +Obama/Tamara .fi .RE .PP -.SH RAGOZ�SI �LLOM�NY + +A példában a Tamara szó toldalékolását a személyes szótár +Obama szavára is alkalmazza az ellenőrző, elfogadva az Obamáról, +Obamáékat stb. alakokat is. + +.SH RAGOZÁSI ÁLLOMÁNY A -.B "ragoz�si �llom�ny" -rendszerint kisebb m�ret�, �s k�l�nf�le defin�ci�k mellett -a ragoz�si szab�lyokat adja meg. +.B "ragozási állomány" +rendszerint kisebb méretű. Különféle definíciókat és +ragozási szabályokat ad meg meghatározott kulcsszóival. Például a +.B SET +a karakterkódolás, a +.B TRY +javaslattevésnél módosítot betűk, a +.B REP +a javaslattevésnél módosított szórészletek, a +.B PFX +és az +.B SFX +pedig a szó elejére és végére illesztendő toldalékok megadására szolgál. + +A következő példa egy UTF\-8-as kódolású szótár affixumállományának +definíciója. A TRY felsorolja a magyar betűket gyakorisági sorrendjükben, +a LANG beállítja a magyar nyelvet, a WORDCHARS megadja azokat a karaktereket, +amelyeket a parancssori Hunspell a szavak részeként fog kezelni. + .PP .RS .nf -SET ISO8859\-2 -TRY ������taeslz�norhgki�dmy�pv�bucfj��xwqTAESLZ�NORHGKI�DMY�PV�BUCFJ��XWQ\-. +SET UTF\-8 +TRY íóúÍÓÚtaeslzánorhgkiédmyőpvöbucfjüűxwqTAESLZÁNORHGKIÉDMYŐPVÖBUCFJÜŰXWQ\-. LANG hu_HU -COMPOUNDMIN 2 -COMPOUNDFLAG Y -COMPOUNDWORDMAX 2 -COMPOUNDROOT y -COMPOUNDSYLLABLE 6 a�e�i�o���u��� -SYLLABLENUM klmc -COMPOUNDBEGIN v -COMPOUNDEND x -FORBIDDENWORD w -PSEUDOROOT u -ACCENT ��������� aeiooouuu -WORDCHARS \-.�%�0123456789 -LEMMA_PRESENT ( +WORDCHARS \-.§%‰°0123456789 REP 2 REP j ly @@ -79,303 +98,483 @@ REP ly j PFX X Y 3 PFX X 0 meg . -PFX X 0 r� . -PFX X 0 �ssze . +PFX X 0 rá . +PFX X 0 össze . SFX e Y 6 -SFX e ik t�k e[dz]ik -SFX e ik t�tek e[dz]ik -SFX e ik t�k e[dz]ik -SFX e 0 t�k e[dzt] -SFX e 0 t�tek e[dzt] -SFX e 0 t�k e[dzt] +SFX e ik tük e[dz]ik +SFX e ik tétek e[dz]ik +SFX e ik ték e[dz]ik +SFX e 0 tük e[dzt] +SFX e 0 tétek e[dzt] +SFX e 0 ték e[dzt] SFX f Y 2 -SFX f ik het/e e[dz]ik [hAt] -SFX f ik tet/e e[dz]ik [tAt] +SFX f ik het/e e[dz]ik +SFX f ik tet/e e[dz]ik +.fi +.RE +.PP + +A REP a j és ly felcserélése esetén ad jó és elöl rangsorolt +javaslatokat. A PFX-ek pár igekötőt definiálnak, az SFX-ek +pedig pár igeragot. Ezek nagyobb részénél a szó végi ik is levágásra +kerül a toldalék illesztése előtt. Itt az illesztés feltétele, hogy az +igék -edik vagy -ezik karaktersorozatra végződjenek, különben pedig +az -ed, -ez vagy -et betűkre. Az f jelű toldalékolási osztály +érdekessége, hogy a -het és -tet illesztése után még folytatódhat +a toldalékolás az e jelű toldalékolási osztállyal (ezt a het/e +ls tet/e határozza meg), így kaphat -hettük, -hettétek, -hették, +-tettük, -tettétek, -tették toldalékokat a szótárban szereplő +levelezik szó: + +.PP +.RS +.nf +1 +levelezik/e +.fi +.RE +.PP + +.SH "ÁLTALÁNOS PARAMÉTEREK" +.IP "SET karakterkód" +A szótár és affixumállomány karakterkódolásának beállítása. +A lehetséges értékek: UTF-8, ISO8859\-1-től ISO8859\-10-ig, +ISO8859\-13\-ISO8859\-15, KOI8-R, KOI8-U, microsoft-cp1251, ISCII-DEVANAGARI. +.IP "FLAG érték" +A kapcsolók 1 karakteres alapbeállításának módosítása. +(A ragozási osztályokat és egyéb tulajdonságokat jelölik a kapcsolók, +amelyek alapértelmezés szerint 1 karakteresek, a pékdákban +legtöbbször nagybetűvel szerepelnek). Az `UTF-8' értékkel +Unicode karaktereket használhatunk kapcsolóként (UTF-8 kódolással és +maximum 65 ezres karakterkódig), a `long' értékkel két karakteres +kapcsolókat (több kapcsoló esetén sincs elválasztójel, a `num' +értékkel vesszővel elválasztott decimális számokat 1-től +65 ezerig. +.IP "COMPLEXPREFIXES" +Kétszeres prefixumillesztést állít be (de csak egyszeres szuffixumokat +az alapértelmezett kettő helyett.) Jobbról balra író ragasztó nyelveknél hasznos. +.IP "LANG nyelvkód" +Nyelv megadása (nyelvfüggő programrészek bekapcsolásához) az +ISO nyelv- és régiókóddal (pl. hu_HU). +.IP "IGNORE karakterek" +A felsorolt karaktereket törli a szótári szavakból és toldalékokból, +valamint a bemeneti szavakból. Hasznos az opcionális írásjelek, mint +az arab vagy a héber mellékjelek kezelésére. +.IP "AF a_következő_AF_sorok_száma" +.IP "AF kapcsolók" +A Hunspell program képes a kapcsolóhalmazokat egy természetes +számmal helyettesíteni a szótárállományban +és a többszörös toldalékásnál az affixumállományban (alias tömörítés), +felgyorsítva ezzel a szótár betöltődését és csökkentve a program +memóriaigényét. Egy rövid példa: +.PP +.RS +.nf +3 +hello +try/1 +work/2 +.fi +.RE +.PP +És a kapcsolódó AF definíciók az affixumállományban: +.PP +.RS +.nf +SET UTF-8 +TRY esianrtolcdugmphbyfvkwzESIANRTOLCDUGMPHBYFVKWZ' +AF 2 +AF A +AF AB +... +.fi +.RE +.PP + +Ami megfelel a következő szótárállománynak: + +.PP +.RS +.nf +3 +hello +try/A +work/AB +.fi +.RE +.PP +Lásd még a tests/alias* példát a forrásban. + +Megjegyzés: az AF sorok nem előzhetik meg a FLAG paramétert. +Alias tömörítésre szolgál a Hunspell makealias segédprogramja. + +.IP "AM a_következő_AM_sorok_száma" +.IP "AM morfológiai_és_egyéb_adatmezők" +A Hunspell program képes a kiegészítő adatmezőket +egy természetes számmal helyettesíteni, az AF paraméterhez hasonlóan. +Lásd még a tests/alias* példát a forrásban. + +.SH "JAVÍTÁSI PARAMÉTEREK" +Az alapértelmezett n-gram, illetve betűcserén és -törlésen +alapuló javaslatokat kiegészíthetjük a javítási paraméterekkel. +A REP segít a tipikus hibák és javításuk megadásában. +A PHONE a kiejtést kevésbé követő írásrendszereknél nyújt segítséget. +.IP "KEY szomszédos_karakterek_opcionálisan_függőleges_vonallal_elválasztva" +A nyelv alapértelmezett billentyűzetkiosztását adhatjuk meg a KEY +paraméterrel, hogy a javaslatoknál a szomszédos betűk elütését +felismerje a program. A nem szomszédos betűket függőleges vonallal +választhatjuk el: +.PP +.RS +.nf +KEY öüó|qwertzuiopőú|asdfghjkléáű|íyxcvbnm .fi .RE .PP -A kulcsszavak jelent�se: -.IP "SET karakterk�d" -A sz�t�r �s affixum�llom�ny karakterk�dol�s�nak be�ll�t�sa. -A lehets�ges �rt�kek: UTF-8, ISO8859\-1-t�l ISO8859\-10-ig, -ISO8859\-14, KOI8-R, KOI8-U, microsoft-cp1251, ISCII-DEVANAGARI. .IP "TRY karakterek" -A javaslattev�sn�l az 1 karakteres pr�b�lkoz�sokn�l az itt felsorolt -karakterekre cser�l, illetve b�v�t. -.IP "NOSPLITSUGS" -Nem javasol sz�felbont�st a Hunspell ezzel a be�ll�t�ssal. +A javaslattevésnél az 1 karakteres próbálkozásoknál az itt felsorolt +karakterekre cserél, illetve bővít. A paraméternél a kis- és nagybetűket +külön kell megadni. +.IP "NOSUGGEST kapcsoló" +Az itt definiált kapcsolóval jelölt szavakat a program nem javasolja +a hibajavításnál. Vulgáris és obszcén szavak esetében hasznos. .IP "MAXNGRAMSUGS" -Az ngram javaslatok maxim�lis sz�m�nak be�ll�t�sa. Alap�rtelmezetten -3. A 0 �rt�k kikapcsolja az ngram javaslatokat. +Az n-gram (n hosszú szórészletek megegyezősége alapján súlyozott) +javaslatok maximális számának beállítása. Alapértelmezetten +5. A 0 érték kikapcsolja az n-gram javaslatokat. +.IP "NOSPLITSUGS" +Nem javasol szófelbontást a Hunspell ezzel a beállítással. +Hiányzó összetettszó-kezelés esetén hasznos a hibás különírási +javaslatok tiltására. .IP "SUGSWITHDOTS" -Ha a hib�s sz� pont(ok)ra v�gz�dik, ezeket a javaslatok eset�ben is -felt�nteti. Az OpenOffice.org sz�t�rak sz�m�ra nem sz�ks�ges ez a -be�ll�t�s. -.IP "LANG nyelvk�d" -Nyelv megad�sa (Morphbase kieg�sz�t�s, ami a nyelvf�gg� -programr�szek bekapcsol�s�t v�gzi). �j nyelv hozz�ad�sa a langnum.hxx -�s a csutil.cxx �llom�nyon kereszt�l lehets�ges a forr�sk�dban. -.IP "COMPLEXPREFIXES" -K�tszeres prefixum lev�g�s be�ll�t�sa (de ezzel a k�tszeres szuffixum -lev�g�s lehet�s�ge megsz�nik). -.IP "COMPOUNDMIN sz�m" -A legkisebb sz�hossz, ami m�g �sszetett sz�ban szerepelhet. -Alap�rtelmez�s szerint 3 karakter. -.IP "COMPOUNDFLAG kapcsol�" -Itt adhat� meg a sz��sszet�telben val� szerepl�st enged�lyez� -kapcsol�. -.IP "COMPOUNDBEGIN kapcsol�" -A kapcsol� az �sszetett szavak els� tagjak�nt enged�lyezi -a megjel�lt szavakat. -.IP "COMPOUNDLAST kapcsol�" -A kapcsol� az �sszetett szavak utols� tagjak�nt enged�lyezi -a megjel�lt szavakat. Kombin�lhat� az el�z� kapcsol�val. -.IP "COMPOUNDMIDDLE kapcsol�" -A kapcsol� az �sszetett szavak k�zbens� tagjak�nt enged�lyezi -a megjel�lt szavakat. Kombin�lhat� a k�t el�z� kapcsol�val. -.IP "ONLYINCOMPOUND kapcsol�" -Csak az �sszetett szavakban megjelen� ragoz�s jel�l�s�re szolg�l� -kapcsol� (germ�n nyelvek eset�ben tipikus). -.IP "CIRCUMFIX kapcsol�" -Ezzel a kapcsol�val jel�lt szuffixum csak ugyanilyen kapcsol�val -jel�lt prefixummal jelenhet meg egy t�v�n. (Pl. leg-�des-ebb). -.IP "COMPOUNDPERMITFLAG kapcsol�" -Alap�etelmez�s szerint a prefixumok �s szuffixumok nem fordulhatnak -el� az �sszetett szavak belsej�ben. A COMPOUNDPERMITFLAG -kapcsol�val rendelkez� affixumok viszont itt is megjelenhetnek. -.IP "COMPOUNDFORBIDFLAG kapcsol�" -Toldal�kolt szavak sz��sszet�telben val� szerepl�s�t tilt� -kapcsol�. A tilt�shoz az adott SFX szab�ly folytat�si -oszt�lyak�nt (l. k�s�bb) adjuk meg ezt a kapcsol�t. -.IP "COMPOUNDROOT kapcsol�" -A sz�t�rba k�zvetlen�l felvett �sszetett szavakat -jel�l� kapcsol�. A COMPOUNDWORDMAX, �s �gy a magyar eset�ben -a 6-3-as szab�ly m�k�d�s�t befoly�solja azzal, hogy a COMPOUNDROOT -kapcsol�val �sszetettnek jel�lt -szavak k�t sz�nak sz�m�tanak. -.IP "COMPOUNDWORDMAX sz�m" -A sz��sszet�telekben szerepl� egyszer� t�vek maxim�lis sz�ma. -A magyar eset�ben 2 az �rt�k, e f�l�tti sz�sz�mn�l m�r �letbe l�p -a 6-3-as szab�ly. -.IP "COMPOUNDSYLLABLE sz�m karakterek" -K�t param�tert v�r. Az els� megadja az �sszetett szavak t�v�nek -maxim�lis sz�tagsz�m�t, ami a magyar helyes�r�s 6-3-as szab�lya szerint 6. -A m�sodik mez� felsorolja a mag�nhangz�kat, -ami a sz�tagsz�m meg�llap�t�s�hoz sz�ks�ges. -Ha hi�nyzik ez a defin�ci�, akkor nincsen -korl�toz�s az �sszetett szavak t�v�nek sz�tagsz�m�ra -vonatkoz�an. -.IP "SYLLABLENUM kapcsol�k" -Egy param�tert v�r. A param�terben megadhat�ak azok a ragoz�si -oszt�lyok, amelyek ragoz�s eset�n eggyel n�velik az �sszetett -szavak t�v�n�l kisz�m�tott sz�tagsz�mot. A magyarban ezek -a mell�kn�vk�pz�k: ker�kp�rjav�t�sainkr�l, de ker�kp�r\-jav�t�si. +Ha a hibás szó pont(ok)ra végződik, ezeket a javaslatok esetében is +feltünteti. Az OpenOffice.org szótárak számára nem szükséges ez a +beállítás. +.IP "REP szám" +.IP "REP mit mire" +A javítási cseretáblázat megadására szolgáló definíciók. +Az első REP után adjuk meg a többi REP sor számát. +Ezek a sorok már két paramétert várnak: először +megadjuk a felismerendő mintát (hibás szórészletet), +utána pedig azt a karaktersorozatot, amire a felismert +mintát javítani szeretnénk. A helyesírás\-ellenőrző +a cseretáblázat révén tud helyes javaslatot tenni +többkarakteres eltérés (pl. j-ly) esetén. + +A szóköz aláhúzásjellel helyettesítendő a javaslatokban: + +.PP +.RS +.nf +REP 1 +REP végülis végül_is +.fi +.RE +.PP + +A szervíz, szintű és a hasonló hibás összetett szavak +letiltásában szintén a REP táblázat segít a CHECKCOMPOUNDREP +megadásával (l. ott). + +.IP "MAP a_MAP_definíciók_száma" +.IP "MAP karakterek" +Rokon karaktereket adhatunk meg több sorban. A javaslattevésnél +több rokon karakter cseréje is lehetséges, így például ékezet +nélküli szavakat is képes ékezetesíteni a Hunspell a következő +definíció mellett: + +.PP +.RS +.nf +MAP 5 +MAP aá +MAP eé +MAP ií +MAP oóöő +MAP uúüű +.fi +.RE +.PP +.IP "PHONE a_PHONE_definíciók_száma" +.IP "PHONE karakterek" +A PHONE egy táblázattal megadható fonetikus átírási algoritmust +használ a kiejtési hasonlóság kiszámítására. Különösen +hasznos azoknál a nyelveknél, ahol az írás nem tükrözi a kiejtést. +A részletes dokumentáció az Aspell helyesírás-ellenőrző oldalán +érhető el angol nyelven: http://aspell.net/man-html/Phonetic-Code.html. + +Megjegyzés: a szabályokban szereplő kapcsos zárójelek nem +tartalmazhatnak még több byte-os UTF-8 karaktereket, ahogy +a kötőjeles kifejezések is byte-ot jelölnek, nem karaktert Unicode +szótár esetén is. +.SH "SZÓ-ÖSSZETÉTELEZÉSI PARAMÉTEREK" +.IP "BREAK a_BREAK_definíciók_száma" +.IP "BREAK karakter_vagy_karaktersorozat" +Ha a keresett szó nincs a szótárban, a felsorolt karaktereknél vagy +karaktersorozatoknál felbontja és részenként ellenőrzi. Hasznos +például a kis- és nagykötőjeles szavaknál a magyarban. +.IP "COMPOUNDRULE" +xxxxxxx + +.IP "COMPOUNDMIN szám" +A legkisebb szóhossz, ami még összetett szóban szerepelhet. +Alapértelmezés szerint 3 karakter. +.IP "COMPOUNDFLAG kapcsoló" +Itt adható meg a szóösszetételben való szereplést engedélyező +kapcsoló. +.IP "COMPOUNDBEGIN kapcsoló" +A kapcsoló az összetett szavak első tagjaként engedélyezi +a megjelölt szavakat. +.IP "COMPOUNDLAST kapcsoló" +A kapcsoló az összetett szavak utolsó tagjaként engedélyezi +a megjelölt szavakat. Kombinálható az előző kapcsolóval. +.IP "COMPOUNDMIDDLE kapcsoló" +A kapcsoló az összetett szavak közbenső tagjaként engedélyezi +a megjelölt szavakat. Kombinálható a két előző kapcsolóval. +.IP "ONLYINCOMPOUND kapcsoló" +Csak az összetett szavakban megjelenő ragozás jelölésére szolgáló +kapcsoló (germán nyelvek esetében tipikus). +.IP "CIRCUMFIX kapcsoló" +Ezzel a kapcsolóval jelölt szuffixum csak ugyanilyen kapcsolóval +jelölt prefixummal jelenhet meg egy tövön. (Pl. leg-édes-ebb). +.IP "COMPOUNDPERMITFLAG kapcsoló" +Alapéetelmezés szerint a prefixumok és szuffixumok nem fordulhatnak +elő az összetett szavak belsejében. A COMPOUNDPERMITFLAG +kapcsolóval rendelkező affixumok viszont itt is megjelenhetnek. +.IP "COMPOUNDFORBIDFLAG kapcsoló" +Toldalékolt szavak szóösszetételben való szereplését tiltó +kapcsoló. A tiltáshoz az adott SFX szabály folytatási +osztályaként (l. később) adjuk meg ezt a kapcsolót. +.IP "COMPOUNDROOT kapcsoló" +A szótárba közvetlenül felvett összetett szavakat +jelölő kapcsoló. A COMPOUNDWORDMAX, és így a magyar esetében +a 6-3-as szabály működését befolyásolja azzal, hogy a COMPOUNDROOT +kapcsolóval összetettnek jelölt +szavak két szónak számítanak. +.IP "COMPOUNDWORDMAX szám" +A szóösszetételekben szereplő egyszerű tövek maximális száma. +A magyar esetében 2 az érték, e fölötti szószámnál már életbe lép +a 6-3-as szabály. +.IP "COMPOUNDSYLLABLE szám karakterek" +Két paramétert vár. Az első megadja az összetett szavak tövének +maximális szótagszámát, ami a magyar helyesírás 6-3-as szabálya szerint 6. +A második mező felsorolja a magánhangzókat, +ami a szótagszám megállapításához szükséges. +Ha hiányzik ez a definíció, akkor nincsen +korlátozás az összetett szavak tövének szótagszámára +vonatkozóan. +.IP "SYLLABLENUM kapcsolók" +Egy paramétert vár. A paraméterben megadhatóak azok a ragozási +osztályok, amelyek ragozás esetén eggyel növelik az összetett +szavak tövénél kiszámított szótagszámot. A magyarban ezek +a melléknévképzők: kerékpárjavításainkról, de kerékpár\-javítási. A -.IP "FORBIDDENWORD kapcsol�" -A tiltott szavakat jel�l� kapcsol�. A tiltott sz�t�vek -toldal�kolt alakjai is letilt�sra ker�lnek. A tiltott -szavak ak�r toldal�kol�si, vagy sz��sszet�teli szinonimak�nt -sem ker�lnek elfogad�sra. -.IP "PSEUDOROOT kapcsol�" -A kapcsol�val jel�lt szavak toldal�kolt alakjai ker�lnek -csak elfogad�sra. Fikt�v t�vek megad�s�ra szolg�l� -kapcsol�. A t� lehet m�g helyes sz�, ha -�rv�nyes szinonimak�nt el��ll vagy szerepel a sz�t�rban. -.IP "ACCENT �kezetes_bet�k ugyanaz_�kezet_n�lk�l" -Az �kezetes�t�shez sz�ks�ges bet�ket k�t param�terrel -adhatjuk meg itt. Az els� param�terben -az �kezetes karaktereket, a m�sodikban az azoknak -megfelel� �kezet n�lk�li bet�ket adjuk meg. +.IP "FORBIDDENWORD kapcsoló" +A tiltott szavakat jelölő kapcsoló. A tiltott szótövek +toldalékolt alakjai is letiltásra kerülnek. A tiltott +szavak akár toldalékolási, vagy szóösszetételi szinonimaként +sem kerülnek elfogadásra. +.IP "PSEUDOROOT kapcsoló" +A kapcsolóval jelölt szavak toldalékolt alakjai kerülnek +csak elfogadásra. Fiktív tövek megadására szolgáló +kapcsoló. A tő lehet még helyes szó, ha +érvényes szinonimaként előáll vagy szerepel a szótárban. .IP "WORDCHARS karakterek" -Param�tere azok a karakterek, amelyek a be�ll�tott k�dol�s (pl. -a magyar eset�ben az ISO-8859-2) bet�i mellett m�g az adott -nyelv szavaiban el�fordulhatnak. Ilyen p�ld�ul a magyarban -a k�t�jel, pont, sz�zal�kjel, fokjel, paragrafusjel �s a -nagyk�t�jel. Az ut�bbi csak UTF-8, vagy microsoft-cp1250 -karakterk�szlet mellett lesz haszn�lhat� a magyar sz�t�rban. -.IP "LEMMA_PRESENT kapcsol�" -A morfol�giai le�r�s elej�n megadhatunk m�s t�veket is a -t�sz�t�rban az alap�rtelmezett helyett. A LEMMA_PRESENT -kapcsol�val jel�lt t�vek eset�ben az elemz� nem teszi a -kimenetbe a lemm�t (mivel az m�r szerepel a morfol�giai -le�r�sban). �gy adhatunk meg fikt�v vagy nem sz�t�ri -t�vekhez val�di t�veket. -.IP "REP sz�m" -.IP "REP mit mire" -A jav�t�si cseret�bl�zat megad�s�ra szolg�l� defin�ci�k. -Az els� REP ut�n adjuk meg a t�bbi REP sor sz�m�t. -Ezek a sorok m�r k�t param�tert v�rnak: el�sz�r -megadjuk a felismerend� mint�t (hib�s sz�r�szletet), -ut�na pedig azt a karaktersorozatot, amire a felismert -mint�t jav�tani szeretn�nk. A helyes�r�s\-ellen�rz� -a cseret�bl�zat r�v�n tud helyes javaslatot tenni -t�bbkarakteres elt�r�s (pl. j/ly) eset�n. -A Magyar Ispellben megl�v� keresztellen�rz�s miatt -egy karakteres cser�k (i/�) is szerepelnek -a REP t�bl�zatban. Ennek k�sz�nhet�, hogy az am�gy -helyes nem sz�t�ri sz��sszet�telek nem ker�lnek -elfogad�sra, ha a cseret�bl�zat egyik cser�j�vel -el��ll�that�k egy sz�t�ri sz�b�l (p�ld�ul: -a ,,sz�nt�'' sz� hib�s �sszetett sz� lesz, mert az -i\->� cser�vel el��ll�that� a szint� sz�b�l). -.IP "PFX kapcsol� keresztkombin�l�d�s sz�m" -.IP "PFX kapcsol� lev�g�s prefixum felt�tel morfol�gia" -Prefixum megad�s�ra szolg�l� defin�ci�k. -A prefixumok egykarakteres n�vvel jel�lt oszt�lyokba -vannak sorolva. A p�ld�ban az X oszt�ly -defin�ci�ja l�that�. Az egyes oszt�lyokra -vonatkoz� PFX fejl�c tartalmazza a k�vetkez�ket: - -(1) az oszt�ly bet�jel�t (a p�ld�ban X) - -(2) a keresztbe val� kombin�l�s enged�lyez�se, illetve -tilt�sa (Y/N). Enged�lyez�s eset�n az adott prefixum akkor is -alkalmazhat�, ha a t�sz� toldal�kolt alakban fordul el�. -Ehhez az is sz�ks�ges, hogy a toldal�k (affixum) ragoz�si -oszt�ly�ban is legyen enged�lyezve a kombin�l�s. - -(3) az oszt�lyba tartoz� bejegyz�sek sz�m�t - -A PFX fejl�cet k�vet� sorokban a PFX param�terek jelent�se -a k�vetkez�: - -(1) az oszt�ly bet�jele - -(2) a ragoz�sn�l a sz� elej�r�l lev�lasztand� karaktersorozat. -Ha nem kell lev�lasztani, akkor 0. - -(3) a prefixum (p�ld�ul igek�t�, vagy a leg\-, legesleg\- -a mell�knevekn�l). Perjellel elv�lasztva kapcsol�kat -is megadhatunk (l. t�bbsz�r�s toldal�kol�s). - -(4) a minta, ami ha illeszkedik, alkalmazhat� a szab�ly. -P�ld�ul ha itt kutya szerepelne, akkor csak a kutya -kezdet� szavak el� lehetne tenni az ebben a sorban -megadott prefixumot. A minta megad�s�n�l a pont (.) -speci�lis jelent�ssel b�r: minden karakterre illeszkedik. -Megadhatunk csak bizonyos karakterekre illeszked� mint�t -is sz�gletes z�r�jelek seg�ts�g�vel. P�ld�ul az [abcd] illeszkedik +Paramétere azok a karakterek, amelyek a beállított kódolás (pl. +a magyar esetében az ISO-8859-2) betűi mellett még az adott +nyelv szavaiban előfordulhatnak. Ilyen például a magyarban +a kötőjel, pont, százalékjel, fokjel, paragrafusjel és a +nagykötőjel. Az utóbbi csak UTF-8, vagy microsoft-cp1250 +karakterkészlet mellett lesz használható a magyar szótárban. +.IP "LEMMA_PRESENT kapcsoló" +A morfológiai leírás elején megadhatunk más töveket is a +tőszótárban az alapértelmezett helyett. A LEMMA_PRESENT +kapcsolóval jelölt tövek esetében az elemző nem teszi a +kimenetbe a lemmát (mivel az már szerepel a morfológiai +leírásban). Így adhatunk meg fiktív vagy nem szótári +tövekhez valódi töveket. +.IP "PFX kapcsoló keresztkombinálódás szám" +.IP "PFX kapcsoló levágás prefixum feltétel morfológia" +Prefixum megadására szolgáló definíciók. +A prefixumok egykarakteres névvel jelölt osztályokba +vannak sorolva. A példában az X osztály +definíciója látható. Az egyes osztályokra +vonatkozó PFX fejléc tartalmazza a következőket: + +(1) az osztály betűjelét (a példában X) + +(2) a keresztbe való kombinálás engedélyezése, illetve +tiltása (Y/N). Engedélyezés esetén az adott prefixum akkor is +alkalmazható, ha a tőszó toldalékolt alakban fordul elő. +Ehhez az is szükséges, hogy a toldalék (affixum) ragozási +osztályában is legyen engedélyezve a kombinálás. + +(3) az osztályba tartozó bejegyzések számát + +A PFX fejlécet követő sorokban a PFX paraméterek jelentése +a következő: + +(1) az osztály betűjele + +(2) a ragozásnál a szó elejéről leválasztandó karaktersorozat. +Ha nem kell leválasztani, akkor 0. + +(3) a prefixum (például igekötő, vagy a leg\-, legesleg\- +a mellékneveknél). Perjellel elválasztva kapcsolókat +is megadhatunk (l. többszörös toldalékolás). + +(4) a minta, ami ha illeszkedik, alkalmazható a szabály. +Például ha itt kutya szerepelne, akkor csak a kutya +kezdetű szavak elé lehetne tenni az ebben a sorban +megadott prefixumot. A minta megadásánál a pont (.) +speciális jelentéssel bír: minden karakterre illeszkedik. +Megadhatunk csak bizonyos karakterekre illeszkedő mintát +is szögletes zárójelek segítségével. Például az [abcd] illeszkedik az a, b, c, illetve d karakterekre is. -Ellent�tben az Ispell\-lel, a k�t�jel -szerepe a sz�gletes z�r�jelek k�z�tt nem speci�lis, -vagyis k�t�jelet jelent, �s nem karaktertartom�nyt. -Ha a nyit� sz�gletes z�r�jel ut�n kalap (^) karakter -tal�lhat�, a karaktertartom�ny komplementer�re -illeszkedik a minta, hasonl�an a regul�ris -kifejez�sekhez (l. +Ellentétben az Ispell\-lel, a kötőjel +szerepe a szögletes zárójelek között nem speciális, +vagyis kötőjelet jelent, és nem karaktertartományt. +Ha a nyitó szögletes zárójel után kalap (^) karakter +található, a karaktertartomány komplementerére +illeszkedik a minta, hasonlóan a reguláris +kifejezésekhez (l. .IR regex "(7))." -(5) Morfol�giai le�r�s. Sz�k�z�n �s sz�k�z �rt�k� -karaktereken k�v�l tetsz�leges karakterekb�l �ll� le�r�s. -A morfol�giai elemz�s sor�n a program �sszef�zi az -itt tal�lhat� le�r�st, tartalm�val nem foglalkozik. -Kiv�ve a { �s } k�z� z�rt le�r�sokat, amelyek a -sor v�gi z�r�jelezett r�sz kiv�tel�vel elt�nnek az elemz�sb�l. -Ezen a m�don a z�r� morf�m�hoz kapcsol�d� elemz�st adhatjuk +(5) Morfológiai leírás. Szóközön és szóköz értékű +karaktereken kívül tetszőleges karakterekből álló leírás. +A morfológiai elemzés során a program összefűzi az +itt található leírást, tartalmával nem foglalkozik. +Kivéve a { és } közé zárt leírásokat, amelyek a +sor végi zárójelezett rész kivételével eltűnnek az elemzésből. +Ezen a módon a zéró morfémához kapcsolódó elemzést adhatjuk meg. -.IP "SFX kapcsol� keresztkombin�l�d�s sz�m" -.IP "SFX kapcsol� szuffixum felt�tel mofol�giai_le�r�s" -A PFX\-szel megegyez� param�tereket kap, csak nem -a sz� eleji, hanem a sz� v�gi toldal�kok le�r�s�ra -szolg�l. A p�ld�ban szerepl� defin�ci�k jelent�se: -az \-edik, vagy \-ezik v�g� szavakra alkalmazhat� -a h�rom szab�ly. A rag illeszt�s�n�l levessz�k -a sz� v�gi \-ik karaktersorozatot, �s szab�lyt�l f�gg�en -illesztj�k a \-t�k, \-t�tek, \-t�k toldal�kokat, -v�geredm�nyben \-edt�k, \-edt�tek, \-edt�k, illetve --ezt�k, \-ezt�tek, \-ezt�k v�g� szavakat kapva. -.IP "T�bbsz�r�s toldal�kol�s" -A PFX �s az SFX szab�lyokban a toldal�k perjellel elv�lasztva kapcsol�kat is -kaphat, hasonl�an a sz�t�r�llom�ny t�veihez. A kapcsol�k a -k�vetkez�ek lehetnek: - -(1) SFX szab�lyban az SFX folytat�s jelent�se, hogy a toldal�k m�g tov�bb -ragoz�dhat a megadott kapcsol�kkal (t�bbsz�r�s affixumlev�laszt�s). -A Hunspell eset�ben csak a k�tszeres affixumlev�laszt�s lett megval�s�tva, -teh�t a folytat�si oszt�ly folytat�s�t m�r nem veszi figyelembe a program. - -(2) SFX szab�lyban a PFX folytat�s jelent�se, hogy az adott prefixum is -hozz�j�rulhat a t�h�z, felt�ve, ha az SFX szab�ly is �l. - -(3) PFX szab�lyban az SFX szab�ly jelent�se, hogy a megjel�lt SFX -szab�ly a t�h�z j�rulhat, ha a PFX szab�ly is �l. - -(4) ONLYINCOMPOUND kapcsol� megad�s�val az adott PFX vagy SFX toldal�k csak -sz��sszet�telben jelentkezhet. - -(5) CIRCUMFIX kapcsol� megad�s�val az adott SFX csak az ugyanilyen -toldal�kot kap� PFX-szel egy�tt fordulhat csak el�. - -(6) Az �sszet�teli kapcsol�k megad�s�val enged�lyezhetj�k -vagy letilthatjuk (COMPOUNDFORBIDFLAG) az �sszet�telben val� -szerepl�st. A �sszetett szavak utols� tagja alap�rtelmez�s szerint -minden affixumot felvehet. A k�zbens� szavakn�l viszont -explixit m�don enged�lyezni kell ezt. +.IP "SFX kapcsoló keresztkombinálódás szám" +.IP "SFX kapcsoló szuffixum feltétel mofológiai_leírás" +A PFX\-szel megegyező paramétereket kap, csak nem +a szó eleji, hanem a szó végi toldalékok leírására +szolgál. A példában szereplő definíciók jelentése: +az \-edik, vagy \-ezik végű szavakra alkalmazható +a három szabály. A rag illesztésénél levesszük +a szó végi \-ik karaktersorozatot, és szabálytól függően +illesztjük a \-tük, \-tétek, \-ték toldalékokat, +végeredményben \-edtük, \-edtétek, \-edték, illetve +-eztük, \-eztétek, \-ezték végű szavakat kapva. +.IP "Többszörös toldalékolás" +A PFX és az SFX szabályokban a toldalék perjellel elválasztva kapcsolókat is +kaphat, hasonlóan a szótárállomány töveihez. A kapcsolók a +következőek lehetnek: + +(1) SFX szabályban az SFX folytatás jelentése, hogy a toldalék még tovább +ragozódhat a megadott kapcsolókkal (többszörös affixumleválasztás). +A Hunspell esetében csak a kétszeres affixumleválasztás lett megvalósítva, +tehát a folytatási osztály folytatását már nem veszi figyelembe a program. + +(2) SFX szabályban a PFX folytatás jelentése, hogy az adott prefixum is +hozzájárulhat a tőhöz, feltéve, ha az SFX szabály is él. + +(3) PFX szabályban az SFX szabály jelentése, hogy a megjelölt SFX +szabály a tőhöz járulhat, ha a PFX szabály is él. + +(4) ONLYINCOMPOUND kapcsoló megadásával az adott PFX vagy SFX toldalék csak +szóösszetételben jelentkezhet. + +(5) CIRCUMFIX kapcsoló megadásával az adott SFX csak az ugyanilyen +toldalékot kapó PFX-szel együtt fordulhat csak elő. + +(6) Az összetételi kapcsolók megadásával engedélyezhetjük +vagy letilthatjuk (COMPOUNDFORBIDFLAG) az összetételben való +szereplést. A összetett szavak utolsó tagja alapértelmezés szerint +minden affixumot felvehet. A közbenső szavaknál viszont +explixit módon engedélyezni kell ezt. .PP -A ragoz�si �llom�ny ezeken k�v�l m�g megjegyz�seket is tartalmazhat, ez�rt az adott -sz�t�r v�ltozat�t, szerz�j�t, felhaszn�l�si enged�lyeit itt -keress�k. -.SH SAJ�T SZ�T�R -A saj�t sz�t�r form�tuma k�zel megegyezik a sz�t�r�llom�ny -form�tum�val. A k�l�nbs�gek a k�vetkez�ek: - -(1) Nem kell megadni az els� sorban az �llom�nyban l�v� szavak -m�ret�t. (Ne is adjuk meg!) - -(2) A sorban a kapcsol�k helyett megadhatunk k�t -perjellel elv�lasztva egy mintasz�t is, -aminek a kapcsol�it �r�kli a k�s�bbiekben a saj�t -sz�t�rba felvett sz�. P�ld�ul a Patyomkin//�d�m sor -jelent�se, hogy a Patyomkin sz�t az �d�m�val megegyez� -ragoz�ssal is el kell fogadni. - -(3) Az �llom�ny k�zzel m�dos�that�, �s ezt id�nk�nt -javasolt is megtenni, ha esetleg hib�san vett�nk fel szavakat. -.SH L�SD M�G -.B angol nyelv� hunspell (4), +A ragozási állomány ezeken kívül még megjegyzéseket is tartalmazhat, ezért az adott +szótár változatát, szerzőjét, felhasználási engedélyeit itt +keressük. +.SH SAJÁT SZÓTÁR +A saját szótár formátuma közel megegyezik a szótárállomány +formátumával. A különbségek a következőek: + +(1) Nem kell megadni az első sorban az állományban lévő szavak +méretét. (Ne is adjuk meg!) + +(2) A sorban a kapcsolók helyett megadhatunk két +perjellel elválasztva egy mintaszót is, +aminek a kapcsolóit örökli a későbbiekben a saját +szótárba felvett szó. Például a Patyomkin//Ádám sor +jelentése, hogy a Patyomkin szót az Ádáméval megegyező +ragozással is el kell fogadni. + +(3) Az állomány kézzel módosítható, és ezt időnként +javasolt is megtenni, ha esetleg hibásan vettünk fel szavakat. +.SH LÁSD MÉG +.B angol nyelvű hunspell (4), .B hunspell (1), .B ispell (1), .B ispell (4), -Magyar Ispell dokument�ci�. -.SH T�RT�NET -A MySpell sz�t�r\-, illetve ragoz�si �llom�ny�nak form�tum�t -Kevin Hendricks k�sz�tette olyan c�llal, hogy lehet�v� -tegye ezen �llom�nyok gyors, fut�s idej� feldolgoz�s�t. - -A COMPOUNDFLAG �s a Hunspell form�tumb�v�t�st, valamint -a REP t�bbkarakteres cseret�bl�zatot N�meth L�szl� -k�sz�tette els�sorban a jobb magyar -nyelv� helyes�r�s\-ellen�rz�s c�lj�b�l. A minim�lis -�sszetettsz�\-kezel�st lehet�v� tev� COMPOUNDMIN, COMPOUNDFLAG, -�s a REP t�bbkarakteres cseret�bl�zat r�sze a hivatalos -MySpell f�ggv�nyk�nyvt�rnak is. - -A Hunspell sz�t�r�llom�ny�nak form�tuma megegyezik -a MySpell f�ggv�nyk�nyvt�r�val, a ragoz�si t�bl�zat pedig -a fentiekben felsorolt b�v�t�seket tartalmazza. -A b�v�tett form�tum� affixum �llom�ny gond n�lk�l -egy�ttm�k�dik az eredeti MySpell f�ggv�nyk�nyvt�rral is, -de a b�v�t�sek nem fognak m�k�dni. S�t, mivel a -hivatalos MySpell egy megenged�bb �sszetettsz�\-kezel�st -val�s�t meg, mint a magyar v�ltozat, az -�sszetett szavakon bel�li toldal�kolt alakok is elfogad�sra -ker�lnek (ez k�l�n�sen sok hib�s �sszet�tel -elfogad�s�t eredm�nyezi a magyar nyelv eset�ben). - -Ebb�l fakad, hogy a hivatalos Magyar +Magyar Ispell dokumentáció. +.SH TÖRTÉNET +A MySpell szótár\-, illetve ragozási állományának formátumát +Kevin Hendricks készítette olyan céllal, hogy lehetővé +tegye ezen állományok gyors, futás idejű feldolgozását. + +A COMPOUNDFLAG és a Hunspell formátumbővítést, valamint +a REP többkarakteres cseretáblázatot Németh László +készítette elsősorban a jobb magyar +nyelvű helyesírás\-ellenőrzés céljából. A minimális +összetettszó\-kezelést lehetővé tevő COMPOUNDMIN, COMPOUNDFLAG, +és a REP többkarakteres cseretáblázat része a hivatalos +MySpell függvénykönyvtárnak is. + +A Hunspell szótárállományának formátuma megegyezik +a MySpell függvénykönyvtáréval, a ragozási táblázat pedig +a fentiekben felsorolt bővítéseket tartalmazza. +A bővített formátumú affixum állomány gond nélkül +együttműködik az eredeti MySpell függvénykönyvtárral is, +de a bővítések nem fognak működni. Sőt, mivel a +hivatalos MySpell egy megengedőbb összetettszó\-kezelést +valósít meg, mint a magyar változat, az +összetett szavakon belüli toldalékolt alakok is elfogadásra +kerülnek (ez különösen sok hibás összetétel +elfogadását eredményezi a magyar nyelv esetében). + +Ebből fakad, hogy a hivatalos Magyar OpenOffice.org (http://office.fsf.hu) \- mivel a Magyar -MySpell f�ggv�nyk�nyvt�rat tartalmazza \- jobban t�mogatja -a magyar nyelvet, mint m�s v�ltozatok. Egyszer�en -meggy�z�dhet�nk arr�l, hogy melyik v�ltozattal van dolgunk: -�rjuk be, hogy -.I helyes�r�sellen�rz� -az OOo sz�vegszerkeszt�j�be. -Ha hib�snak jelzi, �s -.I helyes�r�s\-ellen�rz�t +MySpell függvénykönyvtárat tartalmazza \- jobban támogatja +a magyar nyelvet, mint más változatok. Egyszerűen +meggyőződhetünk arról, hogy melyik változattal van dolgunk: +írjuk be, hogy +.I helyesírásellenőrző +az OOo szövegszerkesztőjébe. +Ha hibásnak jelzi, és +.I helyesírás\-ellenőrzőt javasol helyette, a Hunspell\-lel van dolgunk. Ha helyesnek fogadja el, akkor pedig az eredeti MySpell\-lel. + + + +A Magyar Ispellben meglévő keresztellenőrzés miatt +egy karakteres cserék (i-í) is szerepelnek +a REP táblázatban. Ennek köszönhető, hogy az amúgy +helyes nem szótári szóösszetételek nem kerülnek +elfogadásra, ha a cseretáblázat egyik cseréjével +előállíthatók egy szótári szóból (például: +a ,,színtű'' szó hibás összetett szó lesz, mert az +i\->í cserével előállítható a szintű szóból). + + +COMPOUNDMIN 2 +COMPOUNDFLAG Y +COMPOUNDWORDMAX 2 +COMPOUNDROOT y +COMPOUNDSYLLABLE 6 aáeéiíoóöőuúüű +SYLLABLENUM klmc +COMPOUNDBEGIN v +COMPOUNDEND x +FORBIDDENWORD w +PSEUDOROOT u +ACCENT áéíóöőúüű aeiooouuu diff --git a/man/hunspell.1 b/man/hunspell.1 index 2f358be..6459ff6 100644 --- a/man/hunspell.1 +++ b/man/hunspell.1 @@ -1,5 +1,5 @@ .hla hu -.TH hunspell 1 "2007-06-18" +.TH hunspell 1 "2008-03-03" .LO 1 .SH NAME hunspell \- spell checker, stemmer and morphological analyzer @@ -276,9 +276,16 @@ Print lines with misspelled words. The "list" option is used to produce a list of misspelled words from the standard input. +.IP \fB\-m\fR +Analyze the words of the input text (see also hunspell(4) about +morphological analysis). + .IP \fB\-n\fR The input file is in nroff/troff format. +.IP \fB\-P\ password\fR +Set password for encrypted dictionaries. + .IP \fB\-p\ dict\fR Set path of personal dictionary. Default is $HOME/.hunspell_default. @@ -289,6 +296,9 @@ or the environmental variable, personal dictionary will be .BR $HOME/.hunspell_dicname +.IP \fB\-s\fR +Stem the words of the input text (see also hunspell(4) about +stemming). .IP \fB\-t\fR The input file is in TeX or LaTeX format. diff --git a/man/hunspell.4 b/man/hunspell.4 index dc9d883..986ac01 100644 --- a/man/hunspell.4 +++ b/man/hunspell.4 @@ -1,3 +1,4 @@ +.TH hunspell 4 "2008-03-03" .LO 1 .SH NAME hunspell \- format of Hunspell dictionaries and affix files @@ -107,7 +108,7 @@ Set flag type. Default type is the extended ASCII (8-bit) character. `UTF-8' parameter sets UTF-8 encoded Unicode character flags. The `long' value sets the double extended ASCII character flag type, the `num' sets the decimal number flag type. Decimal flags numbered from 1 to -65535, and in flag fields are separated by comma. +65000, and in flag fields are separated by comma. BUG: UTF-8 flag type doesn't work on ARM platform. .IP "COMPLEXPREFIXES" Set twofold prefix stripping (but single suffix stripping) for agglutinative @@ -122,8 +123,8 @@ Useful for optional characters, as Arabic diacritical marks (Harakat). .IP "AF number_of_flag_vector_aliases" .IP "AF flag_vector" Hunspell can substitute affix flag sets with -ordinal numbers in affix rules (alias compression). First example with -alias compression: +ordinal numbers in affix rules (alias compression, see makealias +tool). First example with alias compression: .PP .RS .nf @@ -147,7 +148,20 @@ AF AB .fi .RE .PP -See also tests/alias* examples. + +It is equivalent of the following dic file: +.PP +.RS +.nf +3 +hello +try/A +work/AB +.fi +.RE +.PP + +See also tests/alias* examples of the source distribution. Note: If affix file contains the FLAG parameter, define it before the AF definitions. @@ -655,8 +669,8 @@ SFX D 0 ed . is:past_2 .RE .PP -Typical example of terminal suffix is nominative of languages -with case suffixes. +Typical example of the terminal suffix is the zero morpheme +of the nominative case. .IP "sp:" Surface prefix. Temporary solution for adding prefixes to the diff --git a/po/hu.gmo b/po/hu.gmo index 10d4fdb..a004fec 100644 Binary files a/po/hu.gmo and b/po/hu.gmo differ diff --git a/po/hu.po b/po/hu.po index 037f6a2..f136223 100644 --- a/po/hu.po +++ b/po/hu.po @@ -311,7 +311,7 @@ msgstr "" #: src/hunspell/hunspell.cxx:1008 #, c-format msgid " hunspell -l file.txt # print misspelled words\n" -msgstr " hunspell -l f�jl.txt # ki�rja a hib�s szavakat\n" +msgstr " hunspell -l f�jl.txt # ki�rja a hib�s szavakat\n" #: src/hunspell/hunspell.cxx:1009 #, c-format diff --git a/src/hunspell/Makefile.am b/src/hunspell/Makefile.am index f83b0a9..bbb720d 100644 --- a/src/hunspell/Makefile.am +++ b/src/hunspell/Makefile.am @@ -10,6 +10,6 @@ libhunspell_1_2_la_SOURCES=affentry.cxx affixmgr.cxx csutil.cxx \ libhunspell_1_2_include_HEADERS=affentry.hxx htypes.hxx affixmgr.hxx \ csutil.hxx hunspell.hxx atypes.hxx dictmgr.hxx hunspell.h \ suggestmgr.hxx baseaffix.hxx hashmgr.hxx langnum.hxx \ - phonet.hxx filemgr.hxx hunzip.hxx + phonet.hxx filemgr.hxx hunzip.hxx w_char.hxx EXTRA_DIST=hunspell.dsp makefile.mk README diff --git a/src/hunspell/Makefile.in b/src/hunspell/Makefile.in index 8e6f837..dc19d78 100644 --- a/src/hunspell/Makefile.in +++ b/src/hunspell/Makefile.in @@ -227,7 +227,7 @@ libhunspell_1_2_la_SOURCES = affentry.cxx affixmgr.cxx csutil.cxx \ libhunspell_1_2_include_HEADERS = affentry.hxx htypes.hxx affixmgr.hxx \ csutil.hxx hunspell.hxx atypes.hxx dictmgr.hxx hunspell.h \ suggestmgr.hxx baseaffix.hxx hashmgr.hxx langnum.hxx \ - phonet.hxx filemgr.hxx hunzip.hxx + phonet.hxx filemgr.hxx hunzip.hxx w_char.hxx EXTRA_DIST = hunspell.dsp makefile.mk README all: all-am diff --git a/src/hunspell/affentry.cxx b/src/hunspell/affentry.cxx index fd737e0..2436fbb 100644 --- a/src/hunspell/affentry.cxx +++ b/src/hunspell/affentry.cxx @@ -7,9 +7,9 @@ #include <cctype> #include <cstdio> #else -#include <stdlib.h> +#include <stdlib.h> #include <string.h> -#include <stdio.h> +#include <stdio.h> #include <ctype.h> #endif @@ -17,7 +17,7 @@ #include "csutil.hxx" #ifndef MOZILLA_CLIENT -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif @@ -29,8 +29,8 @@ PfxEntry::PfxEntry(AffixMgr* pmgr, affentry* dp) pmyMgr = pmgr; // set up its intial values - - aflag = dp->aflag; // flag + + aflag = dp->aflag; // flag strip = dp->strip; // string to strip appnd = dp->appnd; // string to append stripl = dp->stripl; // length of strip string @@ -70,7 +70,7 @@ char * PfxEntry::add(const char * word, int len) char tword[MAXWORDUTF8LEN + 4]; if ((len > stripl) && (len >= numconds) && test_condition(word) && - (!stripl || (strncmp(word, strip, stripl) == 0)) && + (!stripl || (strncmp(word, strip, stripl) == 0)) && ((MAXWORDUTF8LEN + 4) > (len + appndl - stripl))) { /* we have a match so add prefix */ char * pp = tword; @@ -81,7 +81,7 @@ char * PfxEntry::add(const char * word, int len) strcpy(pp, (word + stripl)); return mystrdup(tword); } - return NULL; + return NULL; } inline char * PfxEntry::nextchar(char * p) { @@ -149,7 +149,7 @@ inline int PfxEntry::test_condition(const char * st) } } -// check if this prefix entry matches +// check if this prefix entry matches struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword @@ -171,7 +171,7 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound if (stripl) strcpy (tmpword, strip); strcpy ((tmpword + stripl), (word + appndl)); - + // now make sure all of the conditions on characters // are met. Please see the appendix at the end of // this file for more info on exactly what is being @@ -194,14 +194,14 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound he = he->next_homonym; // check homonyms } while (he); } - - // prefix matched but no root word was found - // if aeXPRODUCT is allowed, try again but now + + // prefix matched but no root word was found + // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix //if ((opts & aeXPRODUCT) && in_compound) { if ((opts & aeXPRODUCT)) { - he = pmyMgr->suffix_check(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, NULL, + he = pmyMgr->suffix_check(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, NULL, 0, NULL, FLAG_NULL, needflag, in_compound); if (he) return he; } @@ -210,7 +210,7 @@ struct hentry * PfxEntry::checkword(const char * word, int len, char in_compound return NULL; } -// check if this prefix entry matches +// check if this prefix entry matches struct hentry * PfxEntry::check_twosfx(const char * word, int len, char in_compound, const FLAG needflag) { @@ -245,8 +245,8 @@ struct hentry * PfxEntry::check_twosfx(const char * word, int len, if (test_condition(tmpword)) { tmpl += stripl; - // prefix matched but no root word was found - // if aeXPRODUCT is allowed, try again but now + // prefix matched but no root word was found + // if aeXPRODUCT is allowed, try again but now // cross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { @@ -258,7 +258,7 @@ struct hentry * PfxEntry::check_twosfx(const char * word, int len, return NULL; } -// check if this prefix entry matches +// check if this prefix entry matches char * PfxEntry::check_twosfx_morph(const char * word, int len, char in_compound, const FLAG needflag) { @@ -292,8 +292,8 @@ char * PfxEntry::check_twosfx_morph(const char * word, int len, if (test_condition(tmpword)) { tmpl += stripl; - // prefix matched but no root word was found - // if aeXPRODUCT is allowed, try again but now + // prefix matched but no root word was found + // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { @@ -305,7 +305,7 @@ char * PfxEntry::check_twosfx_morph(const char * word, int len, return NULL; } -// check if this prefix entry matches +// check if this prefix entry matches char * PfxEntry::check_morph(const char * word, int len, char in_compound, const FLAG needflag) { int tmpl; // length of tmpword @@ -313,7 +313,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const char tmpword[MAXWORDUTF8LEN + 4]; char result[MAXLNLEN]; char * st; - + *result = '\0'; // on entry prefix is 0 length or already matches the beginning of the word. @@ -349,7 +349,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const ! TESTAFF(contclass, pmyMgr->get_needaffix(), contclasslen) && // needflag ((!needflag) || TESTAFF(he->astr, needflag, he->alen) || - (contclass && TESTAFF(contclass, needflag, contclasslen)))) { + (contclass && TESTAFF(contclass, needflag, contclasslen)))) { if (morphcode) { strcat(result, " "); strcat(result, morphcode); @@ -364,6 +364,13 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const if (HENTRY_DATA(he)) { strcat(result, " "); strcat(result,HENTRY_DATA(he)); + } else { + // return with debug information + char * flag = pmyMgr->encode_flag(getFlag()); + strcat(result, " "); + strcat(result, MORPH_FLAG); + strcat(result, flag); + free(flag); } strcat(result, "\n"); } @@ -371,12 +378,12 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const } while (he); } - // prefix matched but no root word was found - // if aeXPRODUCT is allowed, try again but now + // prefix matched but no root word was found + // if aeXPRODUCT is allowed, try again but now // ross checked combined with a suffix if ((opts & aeXPRODUCT) && (in_compound != IN_CPD_BEGIN)) { - st = pmyMgr->suffix_check_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, + st = pmyMgr->suffix_check_morph(tmpword, tmpl, aeXPRODUCT, (AffEntry *)this, FLAG_NULL, needflag); if (st) { strcat(result, st); @@ -385,7 +392,7 @@ char * PfxEntry::check_morph(const char * word, int len, char in_compound, const } } } - + if (*result) return mystrdup(result); return NULL; } @@ -396,7 +403,7 @@ SfxEntry::SfxEntry(AffixMgr * pmgr, affentry* dp) pmyMgr = pmgr; // set up its intial values - aflag = dp->aflag; // char flag + aflag = dp->aflag; // char flag strip = dp->strip; // string to strip appnd = dp->appnd; // string to append stripl = dp->stripl; // length of strip string @@ -425,7 +432,7 @@ SfxEntry::~SfxEntry() if (strip) free(strip); pmyMgr = NULL; appnd = NULL; - strip = NULL; + strip = NULL; if (opts & aeLONGCOND) free(c.l.conds2); if (morphcode && !(opts & aeALIASM)) free(morphcode); if (contclass && !(opts & aeALIASF)) free(contclass); @@ -521,7 +528,7 @@ inline int SfxEntry::test_condition(const char * st, const char * beg) if (p && *p != '\0') p = nextchar(p); } else if (pos) { if (neg) return 0; - else if (i == numconds) return 1; + else if (i == numconds) return 1; ingroup = true; } if (!pos) { @@ -538,12 +545,12 @@ inline int SfxEntry::test_condition(const char * st, const char * beg) } } -// see if this suffix is present in the word +// see if this suffix is present in the word struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, AffEntry* ppfx, char ** wlst, int maxSug, int * ns, const FLAG cclass, const FLAG needflag, const FLAG badflag) { - int tmpl; // length of tmpword + int tmpl; // length of tmpword struct hentry * he; // hash entry pointer unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; @@ -563,7 +570,7 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, tmpl = len - appndl; // the second condition is not enough for UTF-8 strings // it checked in test_condition() - + if ((tmpl > 0) && (tmpl + stripl >= numconds)) { // if (tmpl > 0) { @@ -596,21 +603,21 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, do { // check conditional suffix (enabled by prefix) if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && - TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && - (((optflags & aeXPRODUCT) == 0) || + TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && + (((optflags & aeXPRODUCT) == 0) || TESTAFF(he->astr, ep->getFlag(), he->alen) || // enabled by prefix ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) ) && // handle cont. class - ((!cclass) || + ((!cclass) || ((contclass) && TESTAFF(contclass, cclass, contclasslen)) ) && // check only in compound homonyms (bad flags) (!badflag || !TESTAFF(he->astr, badflag, he->alen) - ) && + ) && // handle required flag - ((!needflag) || + ((!needflag) || (TESTAFF(he->astr, needflag, he->alen) || ((contclass) && TESTAFF(contclass, needflag, contclasslen))) ) @@ -618,12 +625,12 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, he = he->next_homonym; // check homonyms } while (he); - // obsolote stemming code (used only by the + // obsolote stemming code (used only by the // experimental SuffixMgr:suggest_pos_stems) // store resulting root in wlst } else if (wlst && (*ns < maxSug)) { int cwrd = 1; - for (int k=0; k < *ns; k++) + for (int k=0; k < *ns; k++) if (strcmp(tmpword, wlst[k]) == 0) cwrd = 0; if (cwrd) { wlst[*ns] = mystrdup(tmpword); @@ -640,11 +647,11 @@ struct hentry * SfxEntry::checkword(const char * word, int len, int optflags, return NULL; } -// see if two-level suffix is present in the word +// see if two-level suffix is present in the word struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag) { - int tmpl; // length of tmpword + int tmpl; // length of tmpword struct hentry * he; // hash entry pointer unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; @@ -689,7 +696,7 @@ struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags, if (test_condition((char *) cp, (char *) tmpword)) { if (ppfx) { // handle conditional suffix - if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) + if ((contclass) && TESTAFF(contclass, ep->getFlag(), contclasslen)) he = pmyMgr->suffix_check(tmpword, tmpl, 0, NULL, NULL, 0, NULL, (FLAG) aflag, needflag); else he = pmyMgr->suffix_check(tmpword, tmpl, optflags, ppfx, NULL, 0, NULL, (FLAG) aflag, needflag); @@ -702,18 +709,18 @@ struct hentry * SfxEntry::check_twosfx(const char * word, int len, int optflags, return NULL; } -// see if two-level suffix is present in the word +// see if two-level suffix is present in the word char * SfxEntry::check_twosfx_morph(const char * word, int len, int optflags, AffEntry* ppfx, const FLAG needflag) { - int tmpl; // length of tmpword + int tmpl; // length of tmpword unsigned char * cp; char tmpword[MAXWORDUTF8LEN + 4]; PfxEntry* ep = (PfxEntry *) ppfx; char * st; char result[MAXLNLEN]; - + *result = '\0'; // if this suffix is being cross checked with a prefix @@ -788,7 +795,7 @@ char * SfxEntry::check_twosfx_morph(const char * word, int len, int optflags, } // get next homonym with same affix -struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, AffEntry* ppfx, +struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, AffEntry* ppfx, const FLAG cclass, const FLAG needflag) { PfxEntry* ep = (PfxEntry *) ppfx; @@ -796,18 +803,18 @@ struct hentry * SfxEntry::get_next_homonym(struct hentry * he, int optflags, Aff while (he->next_homonym) { he = he->next_homonym; - if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && - ((optflags & aeXPRODUCT) == 0 || + if ((TESTAFF(he->astr, aflag, he->alen) || (ep && ep->getCont() && TESTAFF(ep->getCont(), aflag, ep->getContLen()))) && + ((optflags & aeXPRODUCT) == 0 || TESTAFF(he->astr, eFlag, he->alen) || // handle conditional suffix ((contclass) && TESTAFF(contclass, eFlag, contclasslen)) ) && // handle cont. class - ((!cclass) || + ((!cclass) || ((contclass) && TESTAFF(contclass, cclass, contclasslen)) ) && // handle required flag - ((!needflag) || + ((!needflag) || (TESTAFF(he->astr, needflag, he->alen) || ((contclass) && TESTAFF(contclass, needflag, contclasslen))) ) diff --git a/src/hunspell/affixmgr.cxx b/src/hunspell/affixmgr.cxx index 251d7ae..3fe51b6 100644 --- a/src/hunspell/affixmgr.cxx +++ b/src/hunspell/affixmgr.cxx @@ -20,7 +20,7 @@ #include "csutil.hxx" #ifndef MOZILLA_CLIENT -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif @@ -946,6 +946,15 @@ int AffixMgr::process_sfx_order() return 0; } +// add flags to the result for dictionary debugging +void AffixMgr::debugflag(char * result, unsigned short flag) { + char * st = encode_flag(flag); + strcat(result, " "); + strcat(result, MORPH_FLAG); + strcat(result, st); + free(st); +} + // calculate the character length of the condition int AffixMgr::condlen(char * st) { @@ -2411,14 +2420,14 @@ char * AffixMgr::suffix_check_twosfx_morph(const char * word, int len, if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); - } + } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } strcat(result, st); free(st); if (se->getMorph()) { strcat(result, " "); strcat(result, se->getMorph()); - } + } else debugflag(result, se->getFlag()); strcat(result, "\n"); } } @@ -2453,7 +2462,7 @@ char * AffixMgr::suffix_check_twosfx_morph(const char * word, int len, if (sptr->getMorph()) { strcat(result3, " "); strcat(result3, sptr->getMorph()); - } + } else debugflag(result3, sptr->getFlag()); strlinecat(result2, result3); strcat(result2, "\n"); strcat(result, result2); @@ -2513,7 +2522,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len, if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); - } + } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA(rv)); if (! HENTRY_FIND(rv, MORPH_STEM)) { @@ -2525,13 +2534,13 @@ char * AffixMgr::suffix_check_morph(const char * word, int len, // sprintf(result + strlen(result), " %s%p", MORPH_HENTRY, rv); if (!complexprefixes && HENTRY_DATA(rv)) { - strcat(result, " "); - strcat(result, HENTRY_DATA(rv)); + strcat(result, " "); + strcat(result, HENTRY_DATA(rv)); } if (se->getMorph()) { strcat(result, " "); strcat(result, se->getMorph()); - } + } else debugflag(result, se->getFlag()); strcat(result, "\n"); rv = se->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag); } @@ -2571,7 +2580,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len, if (((PfxEntry *) ppfx)->getMorph()) { strcat(result, ((PfxEntry *) ppfx)->getMorph()); strcat(result, " "); - } + } else debugflag(result, ((PfxEntry *) ppfx)->getFlag()); } if (complexprefixes && HENTRY_DATA(rv)) strcat(result, HENTRY_DATA(rv)); if (! HENTRY_FIND(rv, MORPH_STEM)) { @@ -2599,7 +2608,7 @@ char * AffixMgr::suffix_check_morph(const char * word, int len, if (sptr->getMorph()) { strcat(result, " "); strcat(result, sptr->getMorph()); - } + } else debugflag(result, sptr->getFlag()); strcat(result, "\n"); rv = sptr->get_next_homonym(rv, sfxopts, ppfx, cclass, needflag); } @@ -2965,6 +2974,12 @@ int AffixMgr::get_checksharps() return checksharps; } +char * AffixMgr::encode_flag(unsigned short aflag) +{ + return pHMgr->encode_flag(aflag); +} + + // return the preferred ignore string for suggestions char * AffixMgr::get_ignore() { @@ -3745,7 +3760,7 @@ int AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf struct affentry * nptr= NULL; char * tp = line; - char * nl; + char * nl = NULL; char * piece; int i = 0; @@ -3773,7 +3788,7 @@ int AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf HUNSPELL_WARNING(stderr, "error: duplicate affix flag %s in line %s\n", piece, nl); // return 1; XXX permissive mode for bad dictionaries } - dupflags[aflag] += ((at == 'S') ? dupSFX : dupPFX); + dupflags[aflag] += (char) ((at == 'S') ? dupSFX : dupPFX); break; } // piece 3 - is cross product indicator @@ -3835,7 +3850,7 @@ int AffixMgr::parse_affix(char * line, const char at, FileMgr * af, char * dupf case 0: { np++; if (nptr != ptr) nptr->opts = ptr->opts & - (aeXPRODUCT + aeUTF8 + aeALIASF + aeALIASM); + (char) (aeXPRODUCT + aeUTF8 + aeALIASF + aeALIASM); break; } diff --git a/src/hunspell/affixmgr.hxx b/src/hunspell/affixmgr.hxx index 969780d..f045b87 100644 --- a/src/hunspell/affixmgr.hxx +++ b/src/hunspell/affixmgr.hxx @@ -193,6 +193,7 @@ public: int get_sugswithdots(void); FLAG get_keepcase(void); int get_checksharps(void); + char * encode_flag(unsigned short aflag); private: int parse_file(const char * affpath, const char * key); @@ -208,6 +209,7 @@ private: int parse_affix(char * line, const char at, FileMgr * af, char * dupflags); void reverse_condition(char *); + void debugflag(char * result, unsigned short flag); int condlen(char *); int encodeit(struct affentry * ptr, char * cs); int build_pfxtree(AffEntry* pfxptr); diff --git a/src/hunspell/atypes.hxx b/src/hunspell/atypes.hxx index 0afb345..0d4db14 100644 --- a/src/hunspell/atypes.hxx +++ b/src/hunspell/atypes.hxx @@ -13,8 +13,8 @@ static inline void HUNSPELL_WARNING(FILE *, const char *, ...) {} // HUNSTEM def. #define HUNSTEM -#include "csutil.hxx" #include "hashmgr.hxx" +#include "w_char.hxx" #define SETSIZE 256 #define CONTSIZE 65536 @@ -70,6 +70,12 @@ struct affentry char * morphcode; }; +struct guessword { + char * word; + bool allow; + char * orig; +}; + struct mapentry { char * set; w_char * set_utf16; @@ -81,10 +87,4 @@ struct flagentry { int len; }; -struct guessword { - char * word; - bool allow; - char * orig; -}; - #endif diff --git a/src/hunspell/csutil.cxx b/src/hunspell/csutil.cxx index 784ffa9..008e19f 100644 --- a/src/hunspell/csutil.cxx +++ b/src/hunspell/csutil.cxx @@ -45,7 +45,7 @@ static NS_DEFINE_CID(kUnicharUtilCID, NS_UNICHARUTIL_CID); using namespace std; #endif #else -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif @@ -350,9 +350,10 @@ char * line_uniq_app(char ** text, char breakchar) { } char ** lines; + int i; int linenum = line_tok(*text, &lines, breakchar); int dup = 0; - for (int i = 0; i < linenum; i++) { + for (i = 0; i < linenum; i++) { for (int j = 0; j < (i - 1); j++) { if (strcmp(lines[i], lines[j]) == 0) { *(lines[i]) = '\0'; @@ -375,7 +376,7 @@ char * line_uniq_app(char ** text, char breakchar) { return *text; } strcpy(*text," ( "); - for (int i = 0; i < linenum; i++) if (*(lines[i])) { + for (i = 0; i < linenum; i++) if (*(lines[i])) { sprintf(*text + strlen(*text), "%s%s", lines[i], " | "); } (*text)[strlen(*text) - 2] = ')'; // " ) " @@ -579,8 +580,9 @@ char * mystrrep(char * word, const char * pat, const char * rep) { } int uniqlist(char ** list, int n) { + int i; if (n < 2) return n; - for (int i = 0; i < n; i++) { + for (i = 0; i < n; i++) { for (int j = 0; j < i; j++) { if (list[j] && list[i] && (strcmp(list[j], list[i]) == 0)) { free(list[i]); @@ -590,7 +592,7 @@ char * mystrrep(char * word, const char * pat, const char * rep) { } } int m = 1; - for (int i = 1; i < n; i++) if (list[i]) { + for (i = 1; i < n; i++) if (list[i]) { list[m] = list[i]; m++; } diff --git a/src/hunspell/csutil.hxx b/src/hunspell/csutil.hxx index 442cac2..fbed083 100644 --- a/src/hunspell/csutil.hxx +++ b/src/hunspell/csutil.hxx @@ -3,6 +3,8 @@ // First some base level utility routines +#include "w_char.hxx" + #define NOCAP 0 #define INITCAP 1 #define ALLCAP 2 @@ -23,6 +25,7 @@ #define MORPH_PHON "ph:" #define MORPH_HYPH "hy:" #define MORPH_PART "pa:" +#define MORPH_FLAG "fl:" #define MORPH_HENTRY "_H:" #define MORPH_TAG_LEN strlen(MORPH_STEM) @@ -35,10 +38,9 @@ #define FORBIDDENWORD 65510 #define ONLYUPCASEFLAG 65511 -typedef struct __attribute__ ((packed)) { - unsigned char l; - unsigned char h; -} w_char; +#define HENTRY_DATA(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \ + get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : NULL) +#define HENTRY_FIND(h,p) (HENTRY_DATA(h) ? strstr(HENTRY_DATA(h), p) : NULL) #define w_char_eq(a,b) (((a).l == (b).l) && ((a).h == (b).h)) @@ -103,12 +105,6 @@ struct cs_info { unsigned char cupper; }; -// two character arrays -struct replentry { - char * pattern; - char * pattern2; -}; - // Unicode character encoding information struct unicode_info { unsigned short c; diff --git a/src/hunspell/hashmgr.cxx b/src/hunspell/hashmgr.cxx index 5f0b169..48cbb25 100644 --- a/src/hunspell/hashmgr.cxx +++ b/src/hunspell/hashmgr.cxx @@ -22,7 +22,7 @@ using namespace std; #endif #else -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif diff --git a/src/hunspell/htypes.hxx b/src/hunspell/htypes.hxx index 718a0f8..33fe91b 100644 --- a/src/hunspell/htypes.hxx +++ b/src/hunspell/htypes.hxx @@ -12,10 +12,6 @@ #define H_OPT_PHON (1 << 2) #define HENTRY_WORD(h) &(h->word) -#define HENTRY_DATA(h) (h->var ? ((h->var & H_OPT_ALIASM) ? \ - get_stored_pointer(&(h->word) + h->blen + 1) : &(h->word) + h->blen + 1) : NULL) -// *((char **) (&(h->word) + h->blen + 1)) : &(h->word) + h->blen + 1) : NULL) -#define HENTRY_FIND(h,p) (HENTRY_DATA(h) ? strstr(HENTRY_DATA(h), p) : NULL) // approx. number of user defined words #define USERWORD 1000 diff --git a/src/hunspell/hunspell.cxx b/src/hunspell/hunspell.cxx index f2f7536..0acf7bd 100644 --- a/src/hunspell/hunspell.cxx +++ b/src/hunspell/hunspell.cxx @@ -14,9 +14,10 @@ #include "hunspell.hxx" #include "hunspell.h" #include "config.h" +#include "csutil.hxx" #ifndef MOZILLA_CLIENT -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif @@ -51,7 +52,6 @@ Hunspell::Hunspell(const char * affpath, const char * dpath, const char * key) /* and finally set up the suggestion manager */ pSMgr = new SuggestMgr(try_string, MAXSUGGESTION, pAMgr); if (try_string) free(try_string); - } Hunspell::~Hunspell() @@ -62,7 +62,6 @@ Hunspell::~Hunspell() maxdic = 0; pSMgr = NULL; pAMgr = NULL; - pHMgr[0] = NULL; #ifdef MOZILLA_CLIENT free(csconv); #endif @@ -369,7 +368,8 @@ int Hunspell::spell(const char * word, int * info, char ** root) // LANG_hu section: number(s) + (percent or degree) with suffixes if (langnum == LANG_hu) { if ((nstate == NNUM) && ((cw[i] == '%') || ((!utf8 && (cw[i] == '\xB0')) || - (utf8 && (strncmp(cw + i, "\xC2\xB0", 2)==0)))) + (utf8 && (strncmp(cw + i, "\xC2\xB0", 2)==0 || // UTF-8 degree + strncmp(cw + i, "\xE2\x80\xB0", 3)==0)))) // UTF-8 per mille && checkword(cw + i, info, root)) return 1; } // END of LANG_hu section @@ -1098,7 +1098,9 @@ int Hunspell::stem(char*** slst, char ** desc, int n) } freelist(&pl, pln); } - return uniqlist(*slst, line_tok(result2, slst, MSEP_REC)); + int sln = line_tok(result2, slst, MSEP_REC); + return uniqlist(*slst, sln); + } int Hunspell::stem(char*** slst, const char * word) diff --git a/src/hunspell/hunspell.h b/src/hunspell/hunspell.h index dc8d501..63c0c29 100644 --- a/src/hunspell/hunspell.h +++ b/src/hunspell/hunspell.h @@ -7,19 +7,25 @@ extern "C" { typedef struct Hunhandle Hunhandle; -Hunhandle *Hunspell_create(const char * affpath, const char * dpath); +#ifdef _MSC_VER +#define DLL __declspec ( dllexport ) +#else +#define DLL +#endif + +DLL Hunhandle *Hunspell_create(const char * affpath, const char * dpath); -Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath, +DLL Hunhandle *Hunspell_create_key(const char * affpath, const char * dpath, const char * key); -void Hunspell_destroy(Hunhandle *pHunspell); +DLL void Hunspell_destroy(Hunhandle *pHunspell); /* spell(word) - spellcheck word * output: 0 = bad word, not 0 = good word */ -int Hunspell_spell(Hunhandle *pHunspell, const char *); +DLL int Hunspell_spell(Hunhandle *pHunspell, const char *); -char *Hunspell_get_dic_encoding(Hunhandle *pHunspell); +DLL char *Hunspell_get_dic_encoding(Hunhandle *pHunspell); /* suggest(suggestions, word) - search suggestions * input: pointer to an array of strings pointer and the (bad) word @@ -28,17 +34,17 @@ char *Hunspell_get_dic_encoding(Hunhandle *pHunspell); * a newly allocated array of strings (*slts will be NULL when number * of suggestion equals 0.) */ -int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word); +DLL int Hunspell_suggest(Hunhandle *pHunspell, char*** slst, const char * word); /* morphological functions */ /* analyze(result, word) - morphological analysis of the word */ -int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word); +DLL int Hunspell_analyze(Hunhandle *pHunspell, char*** slst, const char * word); /* stem(result, word) - stemmer function */ -int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word); +DLL int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word); /* stem(result, analysis, n) - get stems from a morph. analysis * example: @@ -47,11 +53,11 @@ int Hunspell_stem(Hunhandle *pHunspell, char*** slst, const char * word); * int n2 = Hunspell_stem2(result2, result, n1); */ -int Hunspell_stem2(Hunhandle *pHunspell, char*** slst, char** desc, int n); +DLL int Hunspell_stem2(Hunhandle *pHunspell, char*** slst, char** desc, int n); /* generate(result, word, word2) - morphological generation by example(s) */ -int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, +DLL int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, const char * word2); /* generate(result, word, desc, n) - generation by morph. description(s) @@ -62,27 +68,26 @@ int Hunspell_generate(Hunhandle *pHunspell, char*** slst, const char * word, * for (int i = 0; i < n; i++) printf("%s\n", result[i]); */ -int Hunspell_generate2(Hunhandle *pHunspell, char*** slst, const char * word, +DLL int Hunspell_generate2(Hunhandle *pHunspell, char*** slst, const char * word, char** desc, int n); /* functions for run-time modification of the dictionary */ /* add word to the run-time dictionary */ -int Hunspell_add(Hunhandle *pHunspell, const char * word); +DLL int Hunspell_add(Hunhandle *pHunspell, const char * word); /* add word to the run-time dictionary with affix flags of * the example (a dictionary word): Hunspell will recognize * affixed forms of the new word, too. */ -int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example); +DLL int Hunspell_add_with_affix(Hunhandle *pHunspell, const char * word, const char * example); /* remove word from the run-time dictionary */ /* NOTE: not implemented yet */ -int Hunspell_remove(Hunhandle *pHunspell, const char * word); - +DLL int Hunspell_remove(Hunhandle *pHunspell, const char * word); #ifdef __cplusplus } diff --git a/src/hunspell/hunspell.hxx b/src/hunspell/hunspell.hxx index 8461b54..c083f20 100644 --- a/src/hunspell/hunspell.hxx +++ b/src/hunspell/hunspell.hxx @@ -1,7 +1,6 @@ #include "hashmgr.hxx" #include "affixmgr.hxx" #include "suggestmgr.hxx" -#include "csutil.hxx" #include "langnum.hxx" #define SPELL_COMPOUND (1 << 0) @@ -27,7 +26,7 @@ #endif #endif -#ifdef W32 +#ifdef WIN32 class DLLEXPORT Hunspell #else class Hunspell @@ -51,7 +50,7 @@ public: /* Hunspell(aff, dic) - constructor of Hunspell class * input: path of affix file and dictionary file */ - + Hunspell(const char * affpath, const char * dpath, const char * key = NULL); ~Hunspell(); diff --git a/src/hunspell/hunzip.cxx b/src/hunspell/hunzip.cxx index 93912df..f9091b8 100644 --- a/src/hunspell/hunzip.cxx +++ b/src/hunspell/hunzip.cxx @@ -1,6 +1,12 @@ -#include <stdio.h> -#include <stdlib.h> +#ifndef MOZILLA_CLIENT +#include <cstdlib> +#include <cstring> +#include <cstdio> +#else +#include <stdlib.h> #include <string.h> +#include <stdio.h> +#endif #include "hunzip.hxx" @@ -31,11 +37,11 @@ Hunzip::Hunzip(const char * file, const char * key) { int Hunzip::getcode(const char * key) { unsigned char c[2]; - int i, j, n, o, p; + int i, j, n, p; int allocatedbit = BASEBITREC; const char * enc = key; - fin = fopen(filename, "r"); + fin = fopen(filename, "rb"); if (!fin) return -1; // read magic number @@ -85,7 +91,7 @@ int Hunzip::getcode(const char * key) { if (*(++enc) == '\0') enc = key; l ^= *enc; } - if (fread(in, 1, l/8+1, fin) < l/8+1) return fail(MSG_FORMAT, filename); + if (fread(in, 1, l/8+1, fin) < (size_t) l/8+1) return fail(MSG_FORMAT, filename); if (key) for (j = 0; j <= l/8; j++) { if (*(++enc) == '\0') enc = key; in[j] ^= *enc; @@ -151,7 +157,6 @@ int Hunzip::getbuf() { const char * Hunzip::getline() { char linebuf[BUFSIZE]; int l = 0, eol = 0, left = 0, right = 0; - char end; if (bufsiz == -1) return NULL; while (l < bufsiz && !eol) { linebuf[l++] = out[outc]; diff --git a/src/hunspell/phonet.cxx b/src/hunspell/phonet.cxx index e4ad5a0..91dc419 100644 --- a/src/hunspell/phonet.cxx +++ b/src/hunspell/phonet.cxx @@ -46,7 +46,7 @@ void init_phonet_hash(phonetable & parms) { int i, k; - for (i = 0; i < parms.hash_size; i++) { + for (i = 0; i < HASHSIZE; i++) { parms.hash[i] = -1; } diff --git a/src/hunspell/phonet.hxx b/src/hunspell/phonet.hxx index 471ff84..d1cf995 100644 --- a/src/hunspell/phonet.hxx +++ b/src/hunspell/phonet.hxx @@ -30,6 +30,7 @@ #ifndef __PHONETHXX__ #define __PHONETHXX__ +#define HASHSIZE 256 #define MAXPHONETLEN 256 #define MAXPHONETUTF8LEN (MAXPHONETLEN * 4) @@ -38,8 +39,7 @@ struct phonetable { cs_info * lang; int num; char * * rules; - static const int hash_size = 256; - int hash[hash_size]; + int hash[HASHSIZE]; }; void init_phonet_hash(phonetable & parms); diff --git a/src/hunspell/suggestmgr.cxx b/src/hunspell/suggestmgr.cxx index ce54f57..c19ba08 100644 --- a/src/hunspell/suggestmgr.cxx +++ b/src/hunspell/suggestmgr.cxx @@ -15,9 +15,10 @@ #include "suggestmgr.hxx" #include "htypes.hxx" +#include "csutil.hxx" #ifndef MOZILLA_CLIENT -#ifndef W32 +#ifndef WIN32 using namespace std; #endif #endif diff --git a/src/hunspell/w_char.hxx b/src/hunspell/w_char.hxx new file mode 100644 index 0000000..a3d11c3 --- /dev/null +++ b/src/hunspell/w_char.hxx @@ -0,0 +1,19 @@ +#ifndef __WCHARHXX__ +#define __WCHARHXX__ + +#ifdef WIN32 +typedef struct { +#else +typedef struct __attribute__ ((packed)) { +#endif + unsigned char l; + unsigned char h; +} w_char; + +// two character arrays +struct replentry { + char * pattern; + char * pattern2; +}; + +#endif diff --git a/src/tools/affixcompress b/src/tools/affixcompress index a2b9508..c2e174b 100755 --- a/src/tools/affixcompress +++ b/src/tools/affixcompress @@ -1,21 +1,22 @@ #!/bin/sh # affix compressor utility for Hunspell -# 2007 (c) László Németh, version 0.2 -# usage: affixcompress sorted_word_list_file +# 2008 (c) László Németh, version 0.3 +# usage: affixcompress sorted_word_list_file [max_affix_rules] case $# in 0) echo \ "affixcompress - compress a huge sorted word list to Hunspell aff and dic file -Usage: affixcompress sorted_word_list_file +Usage: affixcompress sorted_word_list_file [max_affix_rules] Note: output may need manually added affix parameters (SET character_encoding, TRY suggestion_characters etc., see man(4) hunspell)" exit 0;; esac +MAXAFFIX=${2:-5000} + # profiling #AWK="pgawk --profile" AWK="gawk" -export LC_ALL=C rm -f $1.aff $1.dic cat $1 | $AWK ' { @@ -33,6 +34,7 @@ cat $1 | $AWK ' delete A delete B print "Deleted roots: ", prev > "/dev/stderr" + A[$1] = 1 } prev = r } @@ -50,7 +52,8 @@ END { for (i in sfy) print i, sfy[i] } ' | tr '\034' ' ' >affixcompress0.tmp -sort -rnk 3 affixcompress0.tmp | $AWK '$3 > 20{print $0}' | head -20000 >affixcompress1.tmp +sort -rnk 3 affixcompress0.tmp | $AWK '$3 >= 1{print $0}' | +head -$MAXAFFIX >affixcompress1.tmp cat affixcompress1.tmp | $AWK ' function potential_roots() { diff --git a/src/tools/analyze.cxx b/src/tools/analyze.cxx index 9b2fa91..e6ac5c2 100644 --- a/src/tools/analyze.cxx +++ b/src/tools/analyze.cxx @@ -5,7 +5,7 @@ #include "hunspell.hxx" -#ifndef W32 +#ifndef WIN32 using namespace std; #endif diff --git a/src/tools/chmorph.cxx b/src/tools/chmorph.cxx index c2f372e..c2bd113 100644 --- a/src/tools/chmorph.cxx +++ b/src/tools/chmorph.cxx @@ -5,12 +5,20 @@ #include "hunspell.hxx" #include "textparser.hxx" -#ifndef W32 +#ifndef WIN32 using namespace std; #endif -int -main(int argc, char** argv) +void freelist(char *** list, int n) { + if (list && (n > 0)) { + for (int i = 0; i < n; i++) if ((*list)[i]) free((*list)[i]); + free(*list); + *list = NULL; + } +} + + +int main(int argc, char** argv) { FILE * f; diff --git a/src/tools/hunspell.cxx b/src/tools/hunspell.cxx index 96d17fd..c699c2c 100644 --- a/src/tools/hunspell.cxx +++ b/src/tools/hunspell.cxx @@ -7,9 +7,9 @@ #include <cstdlib> #include <cstdio> - #include "config.h" #include "hunspell.hxx" +#include "csutil.hxx" #ifndef HUNSPELL_EXTRA #define suggest_auto suggest @@ -26,12 +26,14 @@ #define DEFAULTDICNAME "default" -#ifdef W32 +#ifdef WIN32 #define gettext #define LIBDIR "C:\\Hunspell\\" #define USEROOODIR "Application Data\\OpenOffice.org 2\\user\\wordbook" -#define OOODIR "C:\\Program files\\OpenOffice.org 2.3\\share\\dict\\ooo\\;" \ +#define OOODIR \ + "C:\\Program files\\OpenOffice.org 2.4\\share\\dict\\ooo\\;" \ + "C:\\Program files\\OpenOffice.org 2.3\\share\\dict\\ooo\\;" \ "C:\\Program files\\OpenOffice.org 2.2\\share\\dict\\ooo\\;" \ "C:\\Program files\\OpenOffice.org 2.1\\share\\dict\\ooo\\;" \ "C:\\Program files\\OpenOffice.org 2.0\\share\\dict\\ooo\\" @@ -51,7 +53,8 @@ #else // Not Windows - +#include <sys/types.h> +#include <dirent.h> #include <unistd.h> #include "textparser.hxx" #include "htmlparser.hxx" @@ -59,9 +62,16 @@ #include "manparser.hxx" #include "firstparser.hxx" -#define LIBDIR "/usr/share/hunspell:/usr/share/myspell" -#define USEROOODIR ".openoffice.org2/user/wordbook" -#define OOODIR "/opt/openoffice.org2.3/share/dict/ooo:" \ +#define LIBDIR \ + "/usr/share/hunspell:" \ + "/usr/share/myspell" +#define USEROOODIR \ + ".openoffice.org2/user/wordbook:" \ + ".openoffice.org2.0/user/wordbook" +#define OOODIR \ + "/opt/openoffice.org2.4/share/dict/ooo:" \ + "/usr/lib/openoffice.org2.4/share/dict/ooo:" \ + "/opt/openoffice.org2.3/share/dict/ooo:" \ "/usr/lib/openoffice.org2.3/share/dict/ooo:" \ "/opt/openoffice.org2.2/share/dict/ooo:" \ "/usr/lib/openoffice.org2.2/share/dict/ooo:" \ @@ -143,6 +153,8 @@ enum { NORMAL, BADWORD, // print only bad words WORDFILTER, // print only bad words from 1 word/line input BADLINE, // print only lines with bad words + STEM, // stem input words + ANALYZE, // analyze input words PIPE, // print only stars for LyX compatibility AUTO0, // search typical error (based on SuggestMgr::suggest_auto()) AUTO, // automatic spelling to standard output @@ -516,7 +528,7 @@ nextline: while(fgets(buf, MAXLNLEN, fileid)) { fprintf(stderr, gettext("error - missing HOME variable")); continue; } -#ifndef W32 +#ifndef WIN32 strcat(buf,"/"); #endif buf2 = buf+strlen(buf); @@ -608,6 +620,46 @@ if (pos >= 0) { continue; } + case STEM: { + char ** result; + int n = pMS->stem(&result, token); + for (int i = 0; i < n; i++) { + fprintf(stdout, "%s %s\n", token, result[i]); + free(result[i]); + } + if (n == 0 && token[strlen(token) - 1] == '.') { + token[strlen(token) - 1] = '\0'; + n = pMS->stem(&result, token); + for (int i = 0; i < n; i++) { + fprintf(stdout, "%s %s\n", token, result[i]); + free(result[i]); + } + } + if (n == 0) fprintf(stdout, "%s\n", token); else free(result); + free(token); + continue; + } + + case ANALYZE: { + char ** result; + int n = pMS->analyze(&result, token); + for (int i = 0; i < n; i++) { + fprintf(stdout, "%s %s\n", token, result[i]); + free(result[i]); + } + if (n == 0 && token[strlen(token) - 1] == '.') { + token[strlen(token) - 1] = '\0'; + n = pMS->analyze(&result, token); + for (int i = 0; i < n; i++) { + fprintf(stdout, "%s %s\n", token, result[i]); + free(result[i]); + } + } + if (n == 0) fprintf(stdout, "%s\n", token); else free(result); + free(token); + continue; + } + case PIPE: { int info; char * root = NULL; @@ -703,7 +755,7 @@ if (parser) delete(parser); } // pipe_interface -#ifndef W32 +#ifndef WIN32 #ifdef HAVE_CURSES_H #ifdef HAVE_READLINE @@ -730,32 +782,50 @@ static int rl_escape (int count, int key) } #endif -void expand_tab(char * dest, char * src, int limit) { +int expand_tab(char * dest, char * src, int limit) { int i = 0; + int u8 = strcmp(ui_enc, "UTF-8") == 0 ? 1 : 0; + int chpos = 0; for(int j = 0; (i < limit) && (src[j] != '\0') && (src[j] != '\r'); j++) { dest[i] = src[j]; if (src[j] == '\t') { - int end = 8 - (i % 8); + int end = 8 - (chpos % 8); for(int k = 0; k < end; k++) { dest[i] = ' '; i++; + chpos++; } - } else i++; + } else { + i++; + if (!u8 || (src[j] & 0xc0) != 0x80) chpos++; + } } dest[i] = '\0'; + return chpos; } -int pos_tab(char * s, int pos) { - int expand = 0; - for(int i = 0; i < pos; i++) { - expand += (s[i] == '\t') ? 8 - (expand % 8) : 1; - } - return expand; +// UTF-8 version of strncpy (but output is always null terminated) +char * strncpyu8(char * dest, const char * src, int begin, size_t n) { + int u8 = strcmp(ui_enc, "UTF-8") == 0 ? 1 : 0; + for (int i = 0; i <= begin + n;) { + if (!u8 || (*src & 0xc0) != 0x80) i++; + if (i >= begin && i <= begin + n) { + if (*src) { + *dest = *src; + src++; + } else *dest = '\0'; + dest++; + } + } + if (n) *(dest - 1) = '\0'; else *dest = '\0'; + return dest; } void dialogscreen(TextParser * parser, char * token, char * filename, int forbidden, char ** wlst, int ns) { int x, y; + char line[MAXLNLEN]; + char line2[MAXLNLEN]; getmaxyx(stdscr,y,x); clear(); @@ -767,55 +837,49 @@ void dialogscreen(TextParser * parser, char * token, char lines[MAXPREVLINE][MAXLNLEN]; for (int i = 0; i < MAXPREVLINE; i++) { - expand_tab(lines[i], parser->get_prevline(i), MAXLNLEN); + expand_tab(lines[i], chenc(parser->get_prevline(i), io_enc, ui_enc), MAXLNLEN); } int prevline = 0; - int rowindex = pos_tab(parser->get_prevline(0), parser->get_tokenpos() + strlen(token)) / x; - int beginrow = rowindex - pos_tab(parser->get_prevline(0), parser->get_tokenpos()) / x; + + strncpy(line, parser->get_prevline(0), parser->get_tokenpos()); + line[parser->get_tokenpos()] = '\0'; + int tokenbeg = expand_tab(line2, chenc(line, io_enc, ui_enc), MAXLNLEN); + + strncpy(line, parser->get_prevline(0), parser->get_tokenpos() + strlen(token)); + line[parser->get_tokenpos() + strlen(token)] = '\0'; + int tokenend = expand_tab(line2, chenc(line, io_enc, ui_enc), MAXLNLEN); + + int rowindex = tokenend / x; + int beginrow = rowindex - tokenbeg / x; if (beginrow >= MAXPREVLINE) beginrow = MAXPREVLINE - 1; -/* for (int i = 0; i < MAXPREVLINE; i++) { - char * line = (char *) calloc(1, x + 1); - strncpy(line, lines[prevline] + x * rowindex, x); - mvprintw(MAXPREVLINE + 1 - i, 0, "%s", chenc(line, io_enc, ui_enc)); + strncpyu8(line, lines[prevline], x * rowindex, x); + mvprintw(MAXPREVLINE + 1 - i, 0, "%s", line); rowindex--; if (rowindex == -1) { prevline++; rowindex = strlen(lines[prevline]) / x; } - free(line); } -*/ - char * line = (char *) calloc(1, x + 1); - int poslen; - strncpy(line, lines[0] + x * rowindex, parser->get_tokenpos() % x); -// fprintf(stderr, "%s\n", line); -// exit(1); - chenc(line, io_enc, ui_enc); - if (strcmp(ui_enc, "UTF-8")==0) { - char * p; - w_char dest_utf[BUFSIZ]; - poslen = u8_u16(dest_utf, BUFSIZ, line); -// for (p = line; *p; p++) if (*p == '\t') exit(1); - } else poslen = strlen(line); -// mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", chenc(line, io_enc, ui_enc)); + + strncpyu8(line, lines[0], x * rowindex, (tokenbeg + 1) % x); + fprintf(stderr, "LIBA: |%s| (%s) %d %d\n", line, token, tokenbeg, tokenend); + mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", line); attron(A_REVERSE); -// mvprintw(MAXPREVLINE + 1 - beginrow, 0, "%s", chenc(line, io_enc, ui_enc)); - mvprintw(MAXPREVLINE + 1 - beginrow, poslen, "%s", chenc(token, io_enc, ui_enc)); + printw("%s", chenc(token, io_enc, ui_enc)); attroff(A_REVERSE); - free(line); - -// mvprintw(MAXPREVLINE + 2, 0, "\n"); -/* for (int i = 0; i < ns; i++) { + + mvprintw(MAXPREVLINE + 2, 0, "\n"); + for (int i = 0; i < ns; i++) { if ((ns > 10) && (i < 10)) { - printw(" 0%d: %s\n", i, chenc(wlst[i], dic_enc, ui_enc)); + printw(" 0%d: %s\n", i, chenc(wlst[i], io_enc, ui_enc)); } else { - printw(" %d: %s\n", i, chenc(wlst[i], dic_enc, ui_enc)); + printw(" %d: %s\n", i, chenc(wlst[i], io_enc, ui_enc)); } } -*/ + mvprintw(y-3, 0, "%s\n", gettext("\n[SP] <number> R)epl A)ccept I)nsert L)ookup U)ncap Q)uit e(X)it or ? for help\n")); } @@ -940,7 +1004,7 @@ printw(gettext("\n-- Type space to continue -- \n")); fprintf(stderr, gettext("error - missing HOME variable")); break; } -#ifndef W32 +#ifndef WIN32 strcat(buf,"/"); #endif buf2 = buf+strlen(buf); @@ -1070,7 +1134,7 @@ printw(gettext("\n-- Type space to continue -- \n")); fprintf(stderr, gettext("error - missing HOME variable")); continue; } -#ifndef W32 +#ifndef WIN32 strcat(buf,"/"); #endif buf2 = buf + strlen(buf); @@ -1123,11 +1187,18 @@ int interactive_line(TextParser * parser, Hunspell * pMS, char * filename, FILE while ((token=parser->next_token())) { if (! pMS->spell(chenc(token, io_enc, dic_enc), &info, NULL)) { dialogscreen(parser, token, filename, (info & SPELL_FORBIDDEN), NULL, 0); // preview + refresh(); char ** wlst = NULL; int ns = pMS->suggest(&wlst, chenc(token, io_enc, dic_enc)); if (ns==0) { dialogexit = dialog(parser, pMS, token, filename, wlst, ns, (info & SPELL_FORBIDDEN)); } else { + for (int j = 0; j < ns; j++) { + char d2io[MAXLNLEN]; + strcpy(d2io, chenc(wlst[j], dic_enc, io_enc)); + wlst[j] = (char *) realloc(wlst[j], strlen(d2io) + 1); + strcpy(wlst[j], d2io); + } dialogexit = dialog(parser, pMS, token, filename, wlst, ns, (info & SPELL_FORBIDDEN)); } for (int j = 0; j < ns; j++) { @@ -1233,12 +1304,43 @@ char * exist2(char * dir, int len, char * name, char * ext) { return NULL; } +#ifndef WIN32 +int listdicpath(char * dir, int len) { + char buf[MAXLNLEN]; + const char * sep = (len == 0) ? "": DIRSEP; + strncpy(buf, dir, len); + strcpy(buf + len, sep); + DIR *d = opendir(buf); + if (!d) return 0; + struct dirent * de; + while ((de = readdir(d))) { + int len = strlen(de->d_name); + if ((len > 4 && strcmp(de->d_name + len - 4, ".aff") == 0) || + (len > 7 && strcmp(de->d_name + len - 7, ".aff.hz") == 0)) { + char * s = mystrdup(de->d_name); + s[len - ((s[len - 1] == 'z') ? 7 : 4)] = '\0'; + fprintf(stderr, "%s%s\n", buf, s); + free(s); + } + } + closedir(d); + return 1; +} +#endif + // search existing path for file "name + ext" char * search(char * begin, char * name, char * ext) { char * end = begin; while (1) { while (!((*end == *PATHSEP) || (*end == '\0'))) end++; - char * res = exist2(begin, end - begin, name, ext); + char * res = NULL; + if (name) { + res = exist2(begin, end - begin, name, ext); + } else { +#ifndef WIN32 + listdicpath(begin, end - begin); +#endif + } if ((*end == '\0') || res) return res; end++; begin = end; @@ -1313,9 +1415,11 @@ int main(int argc, char** argv) fprintf(stderr,gettext(" -i enc\tinput encoding\n")); fprintf(stderr,gettext(" -l\t\tprint mispelled words\n")); fprintf(stderr,gettext(" -L\t\tprint lines with mispelled words\n")); + fprintf(stderr,gettext(" -m \t\tanalyze the words of the input text\n")); fprintf(stderr,gettext(" -n\t\tnroff/troff input file format\n")); fprintf(stderr,gettext(" -p dict\tset dict custom dictionary\n")); fprintf(stderr,gettext(" -P password\tset password for encrypted dictionaries\n")); + fprintf(stderr,gettext(" -s \t\tstem the words of the input text\n")); fprintf(stderr,gettext(" -t\t\tTeX/LaTeX input file format\n")); // experimental functions: missing Unicode support // fprintf(stderr,gettext(" -u\t\tshow typical misspellings\n")); @@ -1348,6 +1452,10 @@ int main(int argc, char** argv) exit(0); } else if ((strcmp(argv[i],"-a")==0)) { filter_mode = PIPE; + } else if ((strcmp(argv[i],"-m")==0)) { + filter_mode = ANALYZE; + } else if ((strcmp(argv[i],"-s")==0)) { + filter_mode = STEM; } else if ((strcmp(argv[i],"-t")==0)) { format = FMT_LATEX; } else if ((strcmp(argv[i],"-n")==0)) { @@ -1415,7 +1523,12 @@ int main(int argc, char** argv) char * aff = search(path, dicname, ".aff"); char * dic = search(path, dicname, ".dic"); if (aff && dic) { - if (showpath) fprintf(stderr, "%s\n%s\n", aff, dic); + if (showpath) { + fprintf(stderr, gettext("SEARCH PATH:\n%s\n"), path); + fprintf(stderr, gettext("AVAILABLE DICTIONARIES (full path is not mandatory for -d):\n"), path); + search(path, NULL, NULL); + fprintf(stderr, gettext("LOADED DICTIONARY:\n%s\n%s\n"), aff, dic); + } pMS = new Hunspell(aff, dic, key); } else { fprintf(stderr,gettext("Can't open affix or dictionary files.\n")); @@ -1425,7 +1538,7 @@ int main(int argc, char** argv) /* open the private dictionaries */ if (HOME) { strcpy(buf,HOME); -#ifndef W32 +#ifndef WIN32 strcat(buf,"/"); #endif if (!privdicname) { @@ -1446,7 +1559,7 @@ int main(int argc, char** argv) if (arg_files==-1) { pipe_interface(pMS, format, stdin); } else { -#ifndef W32 +#ifndef WIN32 #ifdef HAVE_CURSES_H if (filter_mode == NORMAL) { initscr(); diff --git a/src/tools/makealias b/src/tools/makealias index 7b0f4ab..60d93b6 100755 --- a/src/tools/makealias +++ b/src/tools/makealias @@ -57,7 +57,7 @@ FILENAME ~ /.dic$/ && NF > 1 { next } FILENAME ~ /.dic$/ { print cutslash($1) } -FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^ ]/) && NF > 5 { +FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^ ]/) && NF > 4 { split($4,t,"/") if(!a[t[2]]){ a[t[2]]=n @@ -65,32 +65,38 @@ FILENAME ~ /.aff$/ && /^[PS]FX/ && ($4 ~ /\/[^ ]/) && NF > 5 { n++ } begin = $1 " " $2 " " $3 " " (t[1]"/"a[t[2]]) " " $5 + if ($6!="") ok = 1; else ok = 0; $1 = "" $2 = "" $3 = "" $4 = "" $5 = "" - if($0 && !a2[$0]){ - a2[$0]=m - c[m]=$0 - m++ - } - print begin " " a2[$0] >>"/dev/stderr" + if(ok){ + if(!a2[$0]){ + a2[$0]=m + c[m]=$0 + m++ + } + print begin " " a2[$0] >>"/dev/stderr" + } else print begin >>"/dev/stderr" next } -FILENAME ~ /.aff$/ && /^[PS]FX/ && NF > 5 { +FILENAME ~ /.aff$/ && /^[PS]FX/ && NF > 4 { begin = $1 " " $2 " " $3 " " cutslash($4) " " $5 + if ($6!="") ok = 1; else ok = 0; $1 = "" $2 = "" $3 = "" $4 = "" $5 = "" - if($0 && !a2[$0]){ - a2[$0]=m - c[m]=$0 - m++ - } - print begin " " a2[$0] >>"/dev/stderr" + if(ok) { + if (!a2[$0]){ + a2[$0]=m + c[m]=$0 + m++ + } + print begin " " a2[$0] >>"/dev/stderr" + } else print begin >>"/dev/stderr" next } FILENAME ~ /.aff$/ { print $0 >>"/dev/stderr" } diff --git a/src/win_api/Hunspell.rc b/src/win_api/Hunspell.rc index 57b8387..d855de8 100644 --- a/src/win_api/Hunspell.rc +++ b/src/win_api/Hunspell.rc @@ -2,8 +2,8 @@ #include <windows.h> VS_VERSION_INFO VERSIONINFO -FILEVERSION 1,2,1,0 -PRODUCTVERSION 1,2,1,0 +FILEVERSION 1,2,2,0 +PRODUCTVERSION 1,2,2,0 FILEFLAGSMASK 0x17L FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 @@ -21,12 +21,12 @@ BEGIN VALUE "Comments", "Hunspell (http://hunspell.sourceforge.net/) by L�szl� N�meth" VALUE "CompanyName", "http://hunspell.sourceforge.net/" VALUE "FileDescription", "libhunspell" - VALUE "FileVersion", "1.2.1" + VALUE "FileVersion", "1.2.2" VALUE "InternalName", "libhunspell" - VALUE "LegalCopyright", "Copyright (c) 2007" + VALUE "LegalCopyright", "Copyright (c) 2007-2008" VALUE "OriginalFilename", "libhunspell.dll" VALUE "ProductName", "Hunspell Dynamic Link Library" - VALUE "ProductVersion", "1.2.1" + VALUE "ProductVersion", "1.2.2" END END END diff --git a/src/win_api/config.h b/src/win_api/config.h index 59d57f7..25a31e1 100644 --- a/src/win_api/config.h +++ b/src/win_api/config.h @@ -211,5 +211,5 @@ #define PACKAGE_TARNAME /* Define to the version of this package. */ -#define PACKAGE_VERSION "1.1.11" -#define VERSION "1.1.11" +#define PACKAGE_VERSION "1.2.2" +#define VERSION "1.2.2" diff --git a/src/win_api/libhunspell.vcproj b/src/win_api/libhunspell.vcproj index 0fb9934..a594474 100644 --- a/src/win_api/libhunspell.vcproj +++ b/src/win_api/libhunspell.vcproj @@ -416,6 +416,14 @@ > </File> <File + RelativePath="..\hunspell\filemgr.cxx" + > + </File> + <File + RelativePath="..\hunspell\filemgr.hxx" + > + </File> + <File RelativePath="..\hunspell\hashmgr.cxx" > </File> @@ -440,6 +448,14 @@ > </File> <File + RelativePath="..\hunspell\hunzip.cxx" + > + </File> + <File + RelativePath="..\hunspell\hunzip.hxx" + > + </File> + <File RelativePath="..\hunspell\langnum.hxx" > </File> @@ -463,6 +479,10 @@ RelativePath="..\hunspell\utf_info.cxx" > </File> + <File + RelativePath="..\hunspell\w_char.hxx" + > + </File> </Filter> </Files> <Globals> diff --git a/tests/circumfix.morph b/tests/circumfix.morph index 250ed11..62e6c53 100644 --- a/tests/circumfix.morph +++ b/tests/circumfix.morph @@ -5,8 +5,8 @@ stem(nagy) = nagy analyze(nagyobb) = st:nagy po:adj is:COMPARATIVE stem(nagyobb) = nagy > legnagyobb -analyze(legnagyobb) = st:nagy po:adj is:SUPERLATIVE +analyze(legnagyobb) = fl:A st:nagy po:adj is:SUPERLATIVE stem(legnagyobb) = nagy > legeslegnagyobb -analyze(legeslegnagyobb) = st:nagy po:adj is:SUPERSUPERLATIVE +analyze(legeslegnagyobb) = fl:B st:nagy po:adj is:SUPERSUPERLATIVE stem(legeslegnagyobb) = nagy diff --git a/tests/rep.aff b/tests/rep.aff index 0e0cbc0..66365e5 100644 --- a/tests/rep.aff +++ b/tests/rep.aff @@ -3,9 +3,10 @@ # switch off ngram suggestion for testing MAXNGRAMSUGS 0 -REP 5 +REP 6 REP f ph REP ph f +REP ph f REP shun tion REP alot a_lot # add the highest priority for "a lot" suggestion to "alot" REP ' _ # "un'alunno" -> "un alunno" -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-openoffice/hunspell.git

