001 // This file is part of the Attempto Java Packages.
002 // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003 //
004 // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005 // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006 // either version 3 of the License, or (at your option) any later version.
007 //
008 // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010 // PURPOSE. See the GNU Lesser General Public License for more details.
011 //
012 // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013 // Java Packages. If not, see http://www.gnu.org/licenses/.
014
015 package ch.uzh.ifi.attempto.preditor.text;
016
017 import ch.uzh.ifi.attempto.chartparser.Terminal;
018
019 /**
020 * This is a general purpose implementation of a text element.
021 *
022 * @author Tobias Kuhn
023 */
024 public class BasicTextElement implements TextElement {
025
026 private final String originalText;
027 private String text, category;
028 private boolean capitalize;
029
030 /**
031 * Creates a new basic text element.
032 *
033 * @param text The text.
034 * @param category The category.
035 * @param capitalize true if the word should be capitalized in sentence-initial position.
036 */
037 public BasicTextElement(String text, String category, boolean capitalize) {
038 this.text = text;
039 this.originalText = text;
040 this.category = category;
041 this.capitalize = capitalize;
042 }
043
044 /**
045 * Creates a new basic text element. It is capitalized in sentence-initial position.
046 *
047 * @param text The text.
048 * @param category The category.
049 */
050 public BasicTextElement(String text, String category) {
051 this(text, category, true);
052 }
053
054 /**
055 * Creates a new basic text element containing a number. The text element is capitalized in
056 * sentence-initial position.
057 *
058 * @param number The number.
059 * @param category The category.
060 */
061 public BasicTextElement(int number, String category) {
062 this(number + "", category, true);
063 }
064
065 /**
066 * Creates a new basic text element where the text is the name of the category.
067 *
068 * @param category The category which is the same as the text.
069 * @param capitalize true if the word should be capitalized in sentence-initial position.
070 */
071 public BasicTextElement(String category, boolean capitalize) {
072 this(category, category, capitalize);
073 }
074
075 /**
076 * Creates a new basic text element where the text is the name of the category.
077 * The text element is capitalized in sentence-initial position.
078 *
079 * @param category The category which is the same as the text.
080 */
081 public BasicTextElement(String category) {
082 this(category, category, true);
083 }
084
085 /**
086 * Creates a new basic text element containing a number which is also the name of the category.
087 * The text element is capitalized in sentence-initial position.
088 *
089 * @param number The number.
090 */
091 public BasicTextElement(int number) {
092 this(number + "", number + "", true);
093 }
094
095 /**
096 * Creates a new basic text element on the basis of a terminal category object. The text is the
097 * same as the category name.
098 *
099 * @param terminal The terminal category object.
100 * @param capitalize true if the word should be capitalized in sentence-initial position.
101 */
102 public BasicTextElement(Terminal terminal, boolean capitalize) {
103 this(terminal.getName(), terminal.getName(), capitalize);
104 }
105
106 /**
107 * Creates a new basic text element on the basis of a terminal category object. The text is the
108 * same as the category name. The text element is capitalized in sentence-initial position.
109 *
110 * @param terminal The terminal category object.
111 */
112 public BasicTextElement(Terminal terminal) {
113 this(terminal.getName(), terminal.getName(), true);
114 }
115
116 public String getCategory() {
117 return category;
118 }
119
120 public String getText() {
121 return text;
122 }
123
124 public void checkNeighborTextElements(TextElement precedingTextElement, TextElement nextTextElement) {
125 if ((precedingTextElement == null || precedingTextElement.getText().matches("(\\.|\\?|\\!)")) && capitalize) {
126 String f = originalText.substring(0, 1);
127 text = f.toUpperCase() + originalText.substring(1);
128 } else {
129 text = originalText;
130 }
131
132 if (nextTextElement != null && text.matches("(A|a)n?")) {
133 String nt = nextTextElement.getText().toLowerCase();
134 boolean an = false;
135 if (nt.matches("[aeiou].*")) an = true;
136 if (nt.matches("[fhlmnrsx]")) an = true;
137 if (nt.matches("[fhlmnrsx]-.*")) an = true;
138 if (nt.equals("u")) an = false;
139 if (nt.matches("u-.*")) an = false;
140 if (nt.matches("u[rtn]i.*")) an = false;
141 if (nt.matches("use.*")) an = false;
142 if (nt.matches("uk.*")) an = false;
143
144 if (an) {
145 text = text.substring(0, 1) + "n";
146 } else {
147 text = text.substring(0, 1);
148 }
149 }
150 }
151
152 public boolean equals(Object obj) {
153 if (obj instanceof BasicTextElement) {
154 BasicTextElement other = (BasicTextElement) obj;
155 return (this.text.equals(other.text) && this.category.equals(other.category));
156 }
157 return false;
158 }
159
160 }