    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    }