Externes Lingustik Addin-HOWTO

( Ispell-HOWTO )

Dieses HOWTO zeigt, wie man 'Externe Linguistik' in StarOffice unter Linux und Windows realisieren kann. Am Beispiel der Linux-Rechtschreibprüfung ispell wird gezeigt, wie ein Addin programmiert und unter StarOffice eingebunden wird. Das Addin ist eine Shared Library (DLL), die von StarOffice zur Laufzeit nachgeladen werden kann und zusätzliche Funktionen bereitstellt.

  1. Voraussetzung:
    Man benötigt das entsprechende Addin und die ispell-Wörterbücher der Zielsprache(n). Die Installation des ispell-Programms ist für StarOffice nicht nötig. Das Addin besitzt alle nötigen Fähigkeiten; gebraucht werden nur die Wörterbücher. Die Voraussetzungen zur Compilierung usw. sind im Anhang beschrieben.


  2. Beschreibung:
    Ab sofort stehen in StarOffice (SO) sämtliche ispell-Wörterbücher einschließlich der privaten ispell-Wortlisten zur Verfügung. Die Verwaltung der privaten Wortlisten wird ebenfalls von StarOffice übernommen.

    Das ist von großem Vorteil, weil man jetzt nicht mehr verschiedene Wörterbücher und Wortlisten für SO und den Rest der Linux-Welt anlegen und warten muss, sondern eine einheitliche Rechtschreibprüfung besitzt. Private Wörterbücher, die man z.B. im Emacs erzeugt hat, werden nun auch von SO erkannt und umgekehrt.

    Ein weiterer Vorteil ist, dass man sich nun »richtige« Wörterbücher (nicht nur stupide Wortlisten) mit den ispell-Tools selbst herstellen kann. Man ist nicht mehr von irgendwelchen Lieferanten abhängig. So gab es z.B. für die SO-Versionen 5.0 und 5.1 keine Prüfung für die neue deutsche Rechtschreibung - von Fachwörterbüchern ganz zu schweigen (später wird man vielleicht die alte Rechtschreibung vermissen). Das ändert sich von nun an: Für das Addin-Paket gibt es die neue deutsche Rechtschreibung und eine Interimsversion mit den neuen und alten Regeln (SO 5.2 kann wahlweise auf eines von beiden eingestellt werden).

    Neu in die privaten Wortlisten aufgenommene Wörter werden jeweils nach Sprachen und Benutzern getrennt in eigenen Dateien verwaltet. Da es sich hierbei um einfache Textdateien handelt, ist eine Manipulation mit jedem Editor möglich. Umfangreiche Wortlisten lassen sich später auch den Wörterbüchern hinzufügen.

    Windows:
    Unter Windows liegen die privaten Wortlisten im gleichen Verzeichnis, wie die ispell-Wörterbücher: C:\ispell . Die StarOffice-Version 5.2 hat allerdings einen Fehler und kann keine neuen Wörter aufnehmen oder genauer: SO stürzt nach einer solchen Aktion ab :-)


  3. Installation:
    Die Integration der Rechtschreibprüfung ispell in StarOffice ist recht einfach.

    Linux:
    Man erzeugt ein Unterverzeichnis ~/Office5?/wordbook/addin bzw. ~/office52/user/wordbook/german/addin (falls dieses noch nicht vorhanden sein sollte) und kopiert das Addin libspell.so hinein - fertig. Die StarOffice-Hilfe gibt unter dem Stichwort 'Linguistik' genaue Auskunft über weitere mögliche Verzeichnisse.
    Die ispell-Wörterbücher werden wie üblich im Verzeichnis /usr/lib/ispell erwartet. Zusätzliche Installationsoptionen sind weiter unten beschrieben.

    Windows:
    Man erzeugt ein Unterverzeichnis ?:\Office5?\wordbook\addin bzw. ?:\Office52\share\wordbook\german\addin (falls dieses noch nicht vorhanden sein sollte) und kopiert das Addin ispell.dll hinein - fertig. Die StarOffice-Hilfe gibt unter dem Stichwort 'Linguistik' genaue Auskunft über weitere mögliche Verzeichnisse.
    Die ispell-Wörterbücher werden im Verzeichnis C:\ispell erwartet. Zusätzliche Installationsoptionen sind weiter unten beschrieben.

    Jetzt muss man nur noch ein paar Einstellungen vornehmen.


  4. Konfiguration:
    Es wird im Menü unter Extras | Optionen...->Allgemein->Externe_Linguistik eine Menütafel: Externe Linguistik aufgerufen.

    Hier kann das Addin aktiviert und deaktiviert werden.

    Zusätzlich lässt sich einstellen, ob die Rechtschreibprüfung zuerst durch das Standardmodul von StarOffice oder nur durch das Addin erfolgen soll.
    Wenn man das Feld markiert, wird jedes Wort zunächst in der Standard-Linguistik von StarOffice überprüft, und nur hier unbekannte Wörter werden an das Addin weitergereicht.



    Unter Windows ist dort der Name 'SO-Linguistik' eingetragen.

    Man sollten diese Funktion für Speziallinguistiken verwenden, die z.B. nur Fachbegriffe enthalten, aber nicht den normalen Wortschatz. Wenn man die Prüfung nach den alten und neuen Rechtschreibregeln durchführen will und das Addin nur die neuen Regeln beherrscht, sollte man das Feld ebenfalls markieren.
    ---
    In älteren Versionen von StarOffice befindet sich im Menü unter Extras | Optionen...->Allgemein->Linguistik eine neu hinzugekommene Schaltfläche: <Extern...>. Daneben wird der Name des Addins angezeigt: libspell.so oder SO-Linguistik



    Wählt man <Extern...> an, dann erscheint dieselbe Menütafel wie bei SO ab Version 5.2.

    Während der Rechtschreibprüfung kommt man hier übrigens auch an diese Menütafel heran: Unter Zusätze->Optionen... bekommt man ebenfalls eine Menütafel mit der neuen <Extern...> Schaltfläche angeboten.




  5. Benutzung:
    Die Rechtschreibprüfung läuft wie immer ab, hier hat sich nichts geändert.

    Bei der Aufnahme von neuen Wörtern in die Benutzerwörterbücher hat sich bei älteren Versionen (vor 5.2) ein Fehler eingeschlichen. Dem Benutzer wird zwar ein Menü zur Aufnahme des unbekannten Wortes in eines der SO-Benutzerwörterbücher angeboten, es funktioniert aber nicht; alle unbekannten Wörter werden an das Addin weitergereicht. Das ist aber nicht weiter tragisch, weil sie hier vom Addin in die privaten ispell-Wortlisten eingetragen werden - und da hinein sollten sie ohnehin gelangen.
    (Bei der Windows-Version 5.2 gibt es allerdings einen üblen Fehler, beim Versuch ein neues Wort aufzunehmen. Nach einer solchen Aktion - die noch erfolgreich durchgeführt wird - beendet sich SO umgehend per Crash).


  6. Installationsoptionen:
    Das Suchverzeichnis für Linguistik-Addins lässt sich unter Extras | Optionen...->Allgemein ->Pfade ->Wörterbücher einstellen. Hier wird im Unterverzeichnis addin nach den Addins gesucht.

    Normalerweise wird für jede Sprache ein eigenes Wörterbuch verwendet. Man kann das Addin jedoch zwingen, immer ein bestimmtes Wörterbuch zu verwenden.

    Linux:
    Dazu wird folgende Umgebungsvariable in die Datei ~/.bashrc eingetragen:

    export STAR_DICTIONARY=Name_des_Wörterbuchs

    wobei Name_des_Wörterbuchs der Name des Wörterbuchs ist, z.B.: deutsch.hash

    Möchte man ein bestimmtes Wörterbuch vorgeben, das benutzt werden soll, wenn kein entsprechendes Wörterbuch gefunden wird, so kann man folgende Umgebungsvariable setzten:

    export DICTIONARY=Name_des_default_Wörterbuchs

    Diese Option wirkt sich dann allerdings auf alle ispell-Klienten aus!

    Windows:
    Hier wird die Umgebungsvariable in die AUTOEXEC.BAT eingetragen:

    SET STAR_DICTIONARY=Name_des_Wörterbuchs

    wobei Name_des_Wörterbuchs der Name des Wörterbuchs ist, z.B.: deutsch.hash

    Analog gilt dies auch für die Umgebungsvariable DICTIONARY .

    Die folgenden Wörterbücher werden vom Addin im Verzeichnis /usr/lib/ispell bzw. C:\ispell gesucht:

Sprache

Name des Wörterbuchs

[Keine]

english.hash

Deutsch

deutsch.hash

Deutsch (CH)

deutsch.hash

Englisch (UK)

british.hash

Englisch (US)

american.hash

Finnisch

suomi.hash

Französisch

francais.hash

Italienisch

italian.hash

Niederländisch

nederlands.hash

Norwegisch Bokmal

norsk.hash

Norwegisch Nynorsk

norsk.hash

Portugiesisch

portugues.hash

Schwedisch

svenska.hash

Spanisch

espanol.hash



Anhang

Compilierung

Um das Addin komplett aus dem Quellcode zu erzeugen, wird unter Linux neben dem GNU C-compiler gcc und dem Programm make auch ein lexikalischer Analysator und Parser-Generator benötigt, der C-Code generieren kann. Das ist entweder yacc oder bison (Linux-Standard). Unter Windows wurde der Borland C++ Compiler 5.5 verwendet, den es im Internet als Download gibt.
Das Addin wird erzeugt, indem man im Verzeichnis mit dem Quellcode den Befehl <make> mit dem jeweiligen Makefile aufruft. Im Emacs wird die Compilation durch die Tastenkombination <F9> <C> <Enter> angestoßen.

Technische Details

Die folgende Beschreibung der Addin-Schnittstelle stammt aus der StarOffice-Hilfe und eigenen Versuchen ;-).
Die technischen Einzelheiten sind in der C-Headerdatei soling.h in Compiler-verständlicher Form zusammengefasst.

StarOffice sucht in dem persönlichen Wörterbuchpfad (welcher unter Extras | Optionen... -> Allgemein -> Pfade -> Wörterbücher eingestellt ist) nach einem Unterverzeichnis addin und untersucht dieses nach einer geeigneten Shared Library bzw. DLL. Diese Shared Library kann Funktionen zur Rechtschreibung, zum Thesaurus und zur Silbentrennung enthalten, welche von StarOffice unterstützt werden.

Auf Plattformen, die Versions-Resourcen unterstützen (Windows), wird die externe Linguistik-DLL von StarOffice nur dann erkannt, wenn der interne Name der DLL (Internal Name) SO-Linguistik lautet. Andernfalls wird die DLL von StarOffice nicht als Fremdlinguistik akzeptiert. Eigene Versuche ergaben, dass auch der Produkt-Name (ProductName) so lauten muss. Der entsprechende Resourcen-Code ist in der Datei version.rc enthalten.

Wichtig: Die an StarOffice exportierten Funktionen des selbst programmierten Linguistik-Moduls müssen unter Windows die Calling Convention _stdcall einhalten (ältere Versionen auch _cdecl). Dieser Aufruf unterscheidet sich etwas von der Addin-Schnittstelle für StarCalc.

Im folgenden findet sich eine Auflistung der Funktionen, die von StarOffice aufgerufen werden.

Allgemeine Verwaltung des Moduls

Get_Version

Liefert die Versionsnummer der zu StarOffice benutzten Schnittstelle.

short int Get_Version(void)

Rückgabewert ist immer 1, solange die Funktionen gemäß der hier vorliegenden Schnittstellendefinition arbeiten.

Available

Liefert einen Rückgabewert, der angibt, welche Funktionalität unterstützt wird (Rechtschreibung, Thesaurus, Trennung) und ob es einen Optionsdialog für spezielle Einstellungen gibt.

char Available(void)

Rückgabewerte:
1 = Rechtschreibprüfung
2 = Thesaurus
4 = Trennung
8 = Optionsdialog vorhanden
Bei Kombination mehrerer Funktionen, wird der entsprechende Rückgabewert aus einer ODER-Verknüpfung der einzelnen Werte gebildet, also 7 wenn alle Funktionen unterstützt werden und 15 wenn zusätzlich ein Optionsdialog existiert.

OptionDlg

Bringt einen Dialog zur Anzeige, an dem man für die Fremdlinguistik relevante Einstellungen vornehmen kann.

char OptionDlg(void* pParent)

Übergeben wird unter Windows und OS/2 der WindowHandler der Applikation, wenn dieser vorhanden ist. Es kann aber auch ein Null-Pointer übergeben werden, unter anderen Plattformen ist dies sogar immer der Fall.

Rückgabewerte:
0 = Dialogende durch ESC
1 = Dialogende durch OK

SetLanguage

Damit kann man die gewünschte Sprache einstellen. Es wird nur in den gleichsprachigen Wörterbüchern nachgeschlagen und in Wörterbüchern, die für alle Sprachen gedacht sind.

char SetLanguage(short int nLanguage)

Übergeben wird die gewünschte Sprache (siehe StarCalc-Addin-Header xlang.h), z.B.
0x0407 für Deutsch,
0x0409 für Englisch (US)
0x0809 für Englisch (UK)

Rückgabewerte:
0 = Sprache nicht verfügbar
1 = Sprache ist eingestellt

FreeAlloc

Gibt durch Funktionen wie z.B. SpellWord, LookUp und Synonym zugeteilten Speicher wieder frei.

short int FreeAlloc(void)

Rechtschreibung

SpellQuick

Wird mit einem String übergeben und liefert TRUE, wenn das Wort bekannt ist, andernfalls FALSE.

char SpellQuick(char *)

Übergeben wird das zu überprüfende Wort.

Rückgabewerte:
0 = Wort ist unbekannt bzw. falsch
1 = Wort ist richtig geschrieben

SpellWord

Wie SpellQuick, füllt zusätzlich bei unbekannten Worten eine Liste mit Vorschlägen, welches Wort gemeint sein könnte.

char SpellWord(char*, char**)

Übergeben wird als erstes das zu überprüfende Wort.

Der zweite Pointer zeigt auf einen Speicherbereich, in den als Ergebnis ein char-Pointer eingetragen wird, der bei einem falsch geschriebenen Wort auf eine Liste von Strings (Vorschlägen) zeigt. (Die Shared Library bzw. DLL teilt den für diesen String benötigten Speicher zu und darf ihn nicht vor dem nächsten Funktionsaufruf wieder freigeben. Zur Freigabe kann auch explizit FreeAlloc aufgerufen werden.) Ein String der Länge 0 dient als Endmarkierung.
Bsp.: "Haus\0Hans\0Hals\0Hais\0\0" als Vorschläge für "Haxs"

Rückgabewerte:
0 = Wort ist unbekannt bzw. falsch
1 = Wort ist richtig geschrieben

AddWord

Fügt dem aktiven persönlichen Wörterbuch ein Wort hinzu.

char AddWord(char*)

Übergeben wird das Wort, welches in das zur Zeit aktive Wörterbuch aufgenommen werden soll.

Rückgabewerte:
0 = Wort konnte nicht aufgenommen werden
1 = Wort wurde übernommen

Thesaurus

LookUp

Wird mit einem String übergeben und liefert TRUE, wenn das Wort bekannt ist, andernfalls FALSE. Es wird eine Liste mit Bedeutungen gefüllt, und der Synonymaufruf wird vorbereitet.

char LookUp(char*, char**)

Übergeben wird als erstes das nachzuschlagende Wort, als zweites ein Speicherbereich, der mit einem char-Pointer auf eine Liste von Bedeutungen (siehe oben) zeigt, z.B. wenn "Bank" nachgeschlagen wird:

"Sitzbank\0Geldinstitut\0Sandbank\0\0"

Nachfolgende Aufrufe der Funktion Synonyme beziehen sich immer auf diese LookUp-Liste, bis ein weiterer LookUp-Aufruf oder ein FreeAlloc erfolgt.

Rückgabewerte:
0 = Wort ist unbekannt
1 = Wort gefunden

Synonym

Bekommt die Position der Bedeutung in der obigen Liste und füllt eine Liste mit Synonymen.

char Synonyme(short int, char**)

Übergeben wird die Position innerhalb der Bedeutungsliste (beginnend mit Position 0) und ein Speicherbereich, in den der char-Pointer auf die Liste mit Synonymen dieser Bedeutung eingetragen wird. Im obigen Beispiel erhält man zu Position 1 (Geldinstitut) z.B. "Geldinstitut\0Bank\0Sparkasse\0Darlehenskasse\0\0"

Rückgabewerte:
0 = keine Synonyme
1 = Synonyme gefunden

Silbentrennung

LastHyph

Wird mit einem String, einer MinHeader- und einer MinTrailzahl übergeben und liefert die Trennstelle. Bei einer alternativen Trennstelle wird auch das Alternativwort zurückgegeben (z.B. Bäkker oder Schifffahrt).

unsigned short int LastHyph(char*, short int, short int, char **)

Übergeben wird das Wort, die minimale Anzahl der Zeichen vor und die minimale Anzahl der Zeichen hinter der Trennstelle.
Als Rückgabewert wird die Position der Trennstelle erwartet: 0, wenn es keine geeignete gibt, 1, wenn hinter dem ersten Zeichen getrennt werden soll etc.
Wenn mit der Trennung Änderungen im Wort notwendig werden, z.B. Zucker => Zukker, Schiffahrt => Schifffahrt, so wird in den char-Pointer-Pointer ein char-Pointer auf das geänderte Wort, ansonsten ein Null-Pointer eingetragen.

AllHyph

Wird mit einem String, einer MinHeader- und einer MinTrailzahl übergeben und liefert einen String mit sämtlichen Trennstellen (z.B. Do=nau=dampf=schiff=fahrt).

char AllHyph(char*, short int, short int, char**)

Ähnlich wie LastHyph, nur als Rückgabewert wird lediglich 0 für "keine Trennstelle gefunden" oder 1 für "Trennstelle gefunden" zurückgegeben.
Wenn Trennstellen gefunden werden, wird in den char-Pointer-Pointer ein char-Pointer auf einen String mit sämtlichen akzeptablen Trennstellen zurückgeliefert, z.B.
"Donau=dampf=schiff=fahrt" beim Aufruf von AllHyph("Donaudampfschiffahrt", 3, 3, &pWord)



Zur TEAM StarOffice-Homepage

-mdhs (23.05.01)