content: // 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 ch.uzh.ifi.attempto.acewiki.core.Ontology;
  import ch.uzh.ifi.attempto.acewiki.core.OntologyElement;
  import ch.uzh.ifi.attempto.acewiki.core.OntologyTextElement;
  import ch.uzh.ifi.attempto.ape.ACEUtils;
  import ch.uzh.ifi.attempto.base.DefaultTextOperator;
  import ch.uzh.ifi.attempto.base.TextElement;
  
  /**
   * This is the text operator used for the ACE/OWL language engine for AceWiki.
   * 
   * @author Tobias Kuhn
   */
  public class ACETextOperator extends DefaultTextOperator {
  	
  	private Ontology ontology;
  	
  	/**
  	 * Creates a new text operator.
  	 * 
  	 * @param ontology The ontology object.
  	 */
  	public ACETextOperator(Ontology ontology) {
  		this.ontology = ontology;
  	}
  	
  	public TextElement createTextElement(String text) {
  		OntologyTextElement ote;
  		if (ACEGrammar.grammar.containsTerminalSymbol(text)) {
  			return new TextElement(text);
  		}
  		if (ACEGrammar.grammar.containsTerminalSymbol(text.toLowerCase())) {
  			return new TextElement(text.toLowerCase());
  		}
  		String t = text.replaceAll("[ _]+", "_");
  		ote = createOntologyTextElement(t);
  		if (ote != null) return ote;
  		if (t.toLowerCase().startsWith("the_")) {
  			ote = createOntologyTextElement("the " + t.substring(4));
  			if (ote != null) {
  				return ote;
  			}
  			ote = createOntologyTextElement(t.substring(4));
  			if (ote != null) {
  				ote.setPreText("the ");
  				return ote;
  			}
  		}
  		if (t.toLowerCase().endsWith("_by")) {
  			ote = createOntologyTextElement(t.replaceFirst("_by$", " by"));
  			if (ote != null) return ote;
  		}
  		if (t.toLowerCase().endsWith("_of")) {
  			ote = createOntologyTextElement(t.replaceFirst("_of$", " of"));
  			if (ote != null) return ote;
  		}
  		return new TextElement(text);
  	}
  	
  	private OntologyTextElement createOntologyTextElement(String text) {
  		OntologyElement oe = ontology.getElement(text);
  		if (oe != null) {
  			int wn = -1;
  			String[] words = oe.getWords();
  			for (int i = 0 ; i < words.length ; i++) {
  				if (text.equals(words[i])) wn = i;
  			}
  			if (wn > -1) {
  				return new OntologyTextElement(oe, wn);
  			}
  		}
  		return null;
  	}
  	
  	public String getTextInContext(TextElement textElement, String preceding, String following) {
  		String text = textElement.getOriginalText();
  		String t;
  		if (textElement instanceof OntologyTextElement) {
  			OntologyElement oe = ((OntologyTextElement) textElement).getOntologyElement();
  			boolean capitalize = false;
  			if (preceding == null || preceding.matches("[.?!]")) {
  				ProperNameIndividual i = null;
  				if (oe instanceof ProperNameIndividual) {
  					i = (ProperNameIndividual) oe;
  				}
  				if (oe == null) {
  					capitalize = true;
  				} else if (i != null && i.hasDefiniteArticle()) {
  					capitalize = true;
  				} else {
  					capitalize = false;
  				}
  			}
  			if (capitalize && text.length() > 0) {
  				String f = text.substring(0, 1);
  				t = f.toUpperCase() + text.substring(1);
  			} else {
  				t = text;
  			}
  		} else {
  			boolean capitalize = false;
  			if (preceding == null || preceding.matches("[.?!]")) {
  				capitalize = true;
  			}
  			if (capitalize && text.length() > 0) {
  				String f = text.substring(0, 1);
  				t = f.toUpperCase() + text.substring(1);
  			} else {
  				t = text;
  			}
  			
  			if (following != null && t.matches("(A|a)n?")) {
  				if (ACEUtils.useIndefiniteArticleAn(following)) {
  					t = t.substring(0, 1) + "n";
  				} else {
  					t = t.substring(0, 1);
  				}
  			}
  		}
  		return t;
  	}
  
  }
  