LanguageTool-Tutorial Teil III: Java-Regeln und falsche Freunde
Die match
-Funktion ist das Herz der Regel. Der Funktion wird immer ein Satz übergeben, der dann von der Regel auf Fehler untersucht wird.
final List<RuleMatch> ruleMatches = new ArrayList<RuleMatch>(); final AnalyzedTokenReadings[] tokens = text.getTokens();
Am Anfang der Funktion wird eine leere Liste ruleMatches
erstellt, in der die Regel später die gefunden Fehler speichert. Desweiteren werden die Tokens des übergebenen Textes in ein Array geladen, um einfach auf die einzelnen Tokens des Satzes zugreifen zu können.
boolean foundSpiegelt = false; boolean foundWieder = false; boolean foundWider = false; for (int i=0; i<tokens.length; i++) { final String token = tokens[i].getToken(); if (token.trim().equals("")) { // ignore
In einer for
-Schleife werden dann alle Tokens des Satzes durchgegangen. Der Token wird als erstes in einen normalen String umgewandelt. Falls der Token leer ist, wird er ignoriert.
} else { if (token.equalsIgnoreCase("spiegelt") || token.equalsIgnoreCase("spiegeln") || token.equalsIgnoreCase("spiegelte") || token.equalsIgnoreCase("spiegelten") || token.equalsIgnoreCase("spiegelst")) { foundSpiegelt = true; } else if (token.equalsIgnoreCase("wieder") && foundSpiegelt) { foundWieder = true; } else if (token.equalsIgnoreCase("wider") && foundSpiegelt) { foundWider = true; }
Sobald eine Form von »spiegeln« gefunden wird, wird die boolesche Variable foundSpiegelt
auf true
gesetzt.
Wenn ein »wieder« oder »wider« gefunden wird, nachdem bereits eine Form von »spiegeln« gefunden worden ist, nimmt die Variable foundWieder
bzw. foundWider
den Wert true
an.
if (foundSpiegelt && foundWieder && !foundWider && !(tokens.length > i + 2 && (tokens[i + 1].getToken().equals("wider") || tokens[i + 2].getToken().equals("wider")) ) ) { final String msg = "'wider' in 'widerspiegeln' wird mit 'i' statt mit 'ie' " + "geschrieben, z.B. 'Das spiegelt die Situation gut wider.'"; final int pos = tokens[i].getStartPos(); final RuleMatch ruleMatch = new RuleMatch(this, pos, pos + token.length(), msg); ruleMatch.setSuggestedReplacement("wider"); ruleMatches.add(ruleMatch); foundSpiegelt = false; foundWieder = false; foundWider = false; }
Sobald eine Form von »spiegeln« und »wieder«, aber nicht »wider« gefunden wurde, wird eine Fehlermeldung (ruleMatch
) generiert. Für diese wird zunächst der Meldungstext (msg
) generiert. Anschließend wird die Position des aktuellen Tokens (dies ist nach den Bedingungen das Wort »wieder«) mit der Methode getStartPos
ausgelesen.
Dann wird ein neues ruleMatch-Objekt erstellt, dem die Regel (this
), die Startposition des Fehlers, die Endposition (Startpostion + Länge des aktuellen Tokens) und die Nachricht übergeben werden; als fünfter Parameter könnte noch zusätzlich eine kürzere Meldung für das Kontextmenü in LibreOffice angegeben werden.
Danach wird mit setSuggestedReplacement
der Korrekturvorschlag gesetzt; alternativ kann auch wie in XML-Regeln im Meldungstext mit <suggestion>
gearbeitet werden. ruleMatch
wird danach in die Liste aller gefundenen Fehler (ruleMatches
) eingefügt. Zuletzt werden alle Variablen auf false
zurückgesetzt.
} } return toRuleMatchArray(ruleMatches); }
Die match
-Funktion gibt am Ende die ruleMatches
-Liste zurück.
@Override public void reset() { // nothing } }
Am Ende der Klasse ist eine reset-Funktion, die aufgerufen wird, wenn ein neuer Text geprüft wird. In dieser Funktion könnten z.B. Klassenvariablen zurückgesetzt werden, die dazu verwendet werden, den Zustand der Regel für die Prüfung von mehreren Sätzen zu speichern. Da diese Regel nicht satzübergreifend arbeitet, ist die Funktion leer.
Alle Java-Regeln für die deutsche Prüfung sind am Ende der Datei German.java unter src/main/java/org/languagetool/language
aufgeführt.
Um geänderte und neue Java-Regeln zu testen, muss LanguageTool neu kompiliert werden.
Dies geschieht zur Zeit (Stand: November 2012) einfach, indem im Verzeichnis languagetool
, in welchem sich die Datei build.xml
befindet, ant
ausgeführt wird. Das Ergebnis befindet sich dann im Unterverzeichnis dist
.