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 ch.uzh.ifi.attempto.acewiki.core.Ontology;
018 import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
019 import ch.uzh.ifi.attempto.acewiki.core.OntologyTextElement;
020 import ch.uzh.ifi.attempto.ape.ACEUtils;
021 import ch.uzh.ifi.attempto.base.DefaultTextOperator;
022 import ch.uzh.ifi.attempto.base.TextElement;
023
024 /**
025 * This is the text operator used for the ACE/OWL language engine for AceWiki.
026 *
027 * @author Tobias Kuhn
028 */
029 public class ACETextOperator extends DefaultTextOperator {
030
031 private Ontology ontology;
032
033 /**
034 * Creates a new text operator.
035 *
036 * @param ontology The ontology object.
037 */
038 public ACETextOperator(Ontology ontology) {
039 this.ontology = ontology;
040 }
041
042 public TextElement createTextElement(String text) {
043 OntologyTextElement ote;
044 if (ACEGrammar.grammar.containsTerminalSymbol(text)) {
045 return new TextElement(text);
046 }
047 if (ACEGrammar.grammar.containsTerminalSymbol(text.toLowerCase())) {
048 return new TextElement(text.toLowerCase());
049 }
050 String t = text.replaceAll("[ _]+", "_");
051 ote = createOntologyTextElement(t);
052 if (ote != null) return ote;
053 if (t.toLowerCase().startsWith("the_")) {
054 ote = createOntologyTextElement("the " + t.substring(4));
055 if (ote != null) {
056 return ote;
057 }
058 ote = createOntologyTextElement(t.substring(4));
059 if (ote != null) {
060 ote.setPreText("the ");
061 return ote;
062 }
063 }
064 if (t.toLowerCase().endsWith("_by")) {
065 ote = createOntologyTextElement(t.replaceFirst("_by$", " by"));
066 if (ote != null) return ote;
067 }
068 if (t.toLowerCase().endsWith("_of")) {
069 ote = createOntologyTextElement(t.replaceFirst("_of$", " of"));
070 if (ote != null) return ote;
071 }
072 return new TextElement(text);
073 }
074
075 private OntologyTextElement createOntologyTextElement(String text) {
076 OntologyElement oe = ontology.getElement(text);
077 if (oe != null) {
078 int wn = -1;
079 String[] words = oe.getWords();
080 for (int i = 0 ; i < words.length ; i++) {
081 if (text.equals(words[i])) wn = i;
082 }
083 if (wn > -1) {
084 return new OntologyTextElement(oe, wn);
085 }
086 }
087 return null;
088 }
089
090 public String getTextInContext(TextElement textElement, String preceding, String following) {
091 String text = textElement.getOriginalText();
092 String t;
093 if (textElement instanceof OntologyTextElement) {
094 OntologyElement oe = ((OntologyTextElement) textElement).getOntologyElement();
095 boolean capitalize = false;
096 if (preceding == null || preceding.matches("[.?!]")) {
097 ProperNameIndividual i = null;
098 if (oe instanceof ProperNameIndividual) {
099 i = (ProperNameIndividual) oe;
100 }
101 if (oe == null) {
102 capitalize = true;
103 } else if (i != null && i.hasDefiniteArticle()) {
104 capitalize = true;
105 } else {
106 capitalize = false;
107 }
108 }
109 if (capitalize && text.length() > 0) {
110 String f = text.substring(0, 1);
111 t = f.toUpperCase() + text.substring(1);
112 } else {
113 t = text;
114 }
115 } else {
116 boolean capitalize = false;
117 if (preceding == null || preceding.matches("[.?!]")) {
118 capitalize = true;
119 }
120 if (capitalize && text.length() > 0) {
121 String f = text.substring(0, 1);
122 t = f.toUpperCase() + text.substring(1);
123 } else {
124 t = text;
125 }
126
127 if (following != null && t.matches("(A|a)n?")) {
128 if (ACEUtils.useIndefiniteArticleAn(following)) {
129 t = t.substring(0, 1) + "n";
130 } else {
131 t = t.substring(0, 1);
132 }
133 }
134 }
135 return t;
136 }
137
138 }