// This file is part of AceWiki.
// Copyright 2008-2013, AceWiki developers.
//
// AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
// even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
// not, see http://www.gnu.org/licenses/.
package ch.uzh.ifi.attempto.acewiki.aceowl;
import java.util.ArrayList;
import java.util.List;
import ch.uzh.ifi.attempto.acewiki.core.EditorController;
import ch.uzh.ifi.attempto.acewiki.core.MonolingualHandler;
import ch.uzh.ifi.attempto.acewiki.core.Ontology;
import ch.uzh.ifi.attempto.acewiki.core.Sentence;
import ch.uzh.ifi.attempto.acewiki.core.SentenceSuggestion;
import ch.uzh.ifi.attempto.base.PredictiveParser;
import ch.uzh.ifi.attempto.base.TextContainer;
import ch.uzh.ifi.attempto.base.TextElement;
import ch.uzh.ifi.attempto.base.TextOperator;
import ch.uzh.ifi.attempto.chartparser.ChartParser;
import ch.uzh.ifi.attempto.chartparser.ParseTree;
/**
* This is a language handler implementation for ACE.
*
* @author Tobias Kuhn
*/
public class ACEHandler extends MonolingualHandler {
private TextOperator textOperator;
private EditorController editContr = new EditorController();
private ACEOWLLexicon lexicon = new ACEOWLLexicon();
/**
* Creates a new language handler for ACE.
*/
public ACEHandler() {
setLexiconChanger("propername", new ProperNameChanger());
setLexiconChanger("noun", new NounChanger());
setLexiconChanger("nounof", new NounOfChanger());
setLexiconChanger("trverb", new VerbChanger());
setLexiconChanger("tradj", new TrAdjChanger());
editContr.setDefaultMenuGroup("function word");
// menu group color shift
editContr.addMenuGroup("function word", 0);
editContr.addMenuGroup("proper name", 60);
editContr.addMenuGroup("noun", 100);
editContr.addMenuGroup("plural noun", 120);
editContr.addMenuGroup("of-construct", 140);
editContr.addMenuGroup("transitive adjective", 180);
editContr.addMenuGroup("verb", 210);
editContr.addMenuGroup("passive verb", 210);
editContr.addMenuGroup("new variable", 320);
editContr.addMenuGroup("reference", 320);
// category menu group word type / number
editContr.addExtensibleCategory("propername", "proper name", "propername", 0);
editContr.addExtensibleCategory("noun", "noun", "noun", 0);
editContr.addExtensibleCategory("nounpl", "plural noun", "noun", 1);
editContr.addExtensibleCategory("nounof", "of-construct", "nounof", 0);
editContr.addExtensibleCategory("verbsg", "verb", "trverb", 0);
editContr.addExtensibleCategory("verbinf", "verb", "trverb", 1);
editContr.addExtensibleCategory("pverb", "passive verb", "trverb", 2);
editContr.addExtensibleCategory("tradj", "transitive adjective", "tradj", 0);
// category menu group
editContr.addPlainCategory("defnoun", "reference");
editContr.addPlainCategory("variable", "new variable");
editContr.addPlainCategory("reference", "reference");
editContr.setAutocompleteTokens(".", "?");
}
public void init(Ontology ontology) {
lexicon.init(ontology);
textOperator = new ACETextOperator(ontology);
}
public TextOperator getTextOperator() {
return textOperator;
}
public List<Sentence> extractSentences(TextContainer tc, PredictiveParser pp) {
List<Sentence> l = new ArrayList<Sentence>();
ChartParser parser = (ChartParser) pp;
List<ParseTree> subTrees = parser.getParseTree().getSubTrees("complete_sentence");
for (ParseTree pt : subTrees) {
TextContainer c = tc.getSubTextContainer(pt.getStartPos(), pt.getEndPos());
int s = c.getTextElementsCount();
if (s > 0) {
if (c.getTextElement(s-1).getOriginalText().equals("?")) {
l.add(new ACEQuestion(c));
} else {
l.add(new ACEDeclaration(c));
}
}
}
return l;
}
public EditorController getEditorController() {
return editContr;
}
public PredictiveParser getPredictiveParser() {
ChartParser cp = new ChartParser(ACEGrammar.grammar, "text");
cp.setDynamicLexicon(lexicon);
return cp;
}
public SentenceSuggestion getSuggestion(Sentence sentence) {
ACESentence s = (ACESentence) sentence;
List<TextElement> t = s.getTextElements();
String t0 = t.get(0).getText();
String t1 = t.get(1).getText();
String l = t.get(t.size()-1).getText();
if (t0.matches("(A|a)n?") && !t1.matches(".* of") && l.equals(".")) {
return new AToEverySuggestion(s);
}
return null;
}
}