001 // This file is part of AceWiki.
002 // Copyright 2008-2012, AceWiki developers.
003 //
004 // AceWiki is free software: you can redistribute it and/or modify it under the terms of the GNU
005 // Lesser General Public License as published by the Free Software Foundation, either version 3 of
006 // the License, or (at your option) any later version.
007 //
008 // AceWiki is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
009 // even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
010 // Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with AceWiki. If
013 // not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.acewiki.aceowl;
016
017 import java.util.ArrayList;
018 import java.util.List;
019
020 import ch.uzh.ifi.attempto.acewiki.core.EditorController;
021 import ch.uzh.ifi.attempto.acewiki.core.MonolingualHandler;
022 import ch.uzh.ifi.attempto.acewiki.core.Ontology;
023 import ch.uzh.ifi.attempto.acewiki.core.Sentence;
024 import ch.uzh.ifi.attempto.acewiki.core.SentenceSuggestion;
025 import ch.uzh.ifi.attempto.base.PredictiveParser;
026 import ch.uzh.ifi.attempto.base.TextContainer;
027 import ch.uzh.ifi.attempto.base.TextElement;
028 import ch.uzh.ifi.attempto.base.TextOperator;
029 import ch.uzh.ifi.attempto.chartparser.ChartParser;
030 import ch.uzh.ifi.attempto.chartparser.ParseTree;
031
032 /**
033 * This is a language handler implementation for ACE.
034 *
035 * @author Tobias Kuhn
036 */
037 public class ACEHandler extends MonolingualHandler {
038
039 private TextOperator textOperator;
040 private EditorController editContr = new EditorController();
041 private ACEOWLLexicon lexicon = new ACEOWLLexicon();
042
043 /**
044 * Creates a new language handler for ACE.
045 */
046 public ACEHandler() {
047 setLexiconChanger("propername", new ProperNameChanger());
048 setLexiconChanger("noun", new NounChanger());
049 setLexiconChanger("nounof", new NounOfChanger());
050 setLexiconChanger("trverb", new VerbChanger());
051 setLexiconChanger("tradj", new TrAdjChanger());
052
053 editContr.setDefaultMenuGroup("function word");
054
055 // menu group color shift
056 editContr.addMenuGroup("function word", 0);
057 editContr.addMenuGroup("proper name", 60);
058 editContr.addMenuGroup("noun", 100);
059 editContr.addMenuGroup("plural noun", 120);
060 editContr.addMenuGroup("of-construct", 140);
061 editContr.addMenuGroup("transitive adjective", 180);
062 editContr.addMenuGroup("verb", 210);
063 editContr.addMenuGroup("passive verb", 210);
064 editContr.addMenuGroup("new variable", 320);
065 editContr.addMenuGroup("reference", 320);
066
067 // category menu group word type / number
068 editContr.addExtensibleCategory("propername", "proper name", "propername", 0);
069 editContr.addExtensibleCategory("noun", "noun", "noun", 0);
070 editContr.addExtensibleCategory("nounpl", "plural noun", "noun", 1);
071 editContr.addExtensibleCategory("nounof", "of-construct", "nounof", 0);
072 editContr.addExtensibleCategory("verbsg", "verb", "trverb", 0);
073 editContr.addExtensibleCategory("verbinf", "verb", "trverb", 1);
074 editContr.addExtensibleCategory("pverb", "passive verb", "trverb", 2);
075 editContr.addExtensibleCategory("tradj", "transitive adjective", "tradj", 0);
076
077 // category menu group
078 editContr.addPlainCategory("defnoun", "reference");
079 editContr.addPlainCategory("variable", "new variable");
080 editContr.addPlainCategory("reference", "reference");
081
082 editContr.setAutocompleteTokens(".", "?");
083 }
084
085 public void init(Ontology ontology) {
086 lexicon.init(ontology);
087 textOperator = new ACETextOperator(ontology);
088 }
089
090 public TextOperator getTextOperator() {
091 return textOperator;
092 }
093
094 public List<Sentence> extractSentences(TextContainer tc, PredictiveParser pp) {
095 List<Sentence> l = new ArrayList<Sentence>();
096 ChartParser parser = (ChartParser) pp;
097 List<ParseTree> subTrees = parser.getParseTree().getSubTrees("complete_sentence");
098 for (ParseTree pt : subTrees) {
099 TextContainer c = tc.getSubTextContainer(pt.getStartPos(), pt.getEndPos());
100 int s = c.getTextElementsCount();
101 if (s > 0) {
102 if (c.getTextElement(s-1).getOriginalText().equals("?")) {
103 l.add(new ACEQuestion(c));
104 } else {
105 l.add(new ACEDeclaration(c));
106 }
107 }
108 }
109 return l;
110 }
111
112 public EditorController getEditorController() {
113 return editContr;
114 }
115
116 public PredictiveParser getPredictiveParser() {
117 ChartParser cp = new ChartParser(ACEGrammar.grammar, "text");
118 cp.setDynamicLexicon(lexicon);
119 return cp;
120 }
121
122 public SentenceSuggestion getSuggestion(Sentence sentence) {
123 ACESentence s = (ACESentence) sentence;
124 List<TextElement> t = s.getTextElements();
125 String t0 = t.get(0).getText();
126 String t1 = t.get(1).getText();
127 String l = t.get(t.size()-1).getText();
128 if (t0.matches("(A|a)n?") && !t1.matches(".* of") && l.equals(".")) {
129 return new AToEverySuggestion(s);
130 }
131 return null;
132 }
133
134 }