/* Jazzy - a Java library for Spell Checking Copyright (C) 2001 Mindaugas Idzelis Full text of license can be found in LICENSE.txt This library 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 2.1 of the License, or (at your option) any later version. This library 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 this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ package com.swabunga.spell.event; /** * A basic word finder, which searches text for sequences of letters. * * @author Anthony Roy (ajr@antroy.co.uk) */ public class DefaultWordFinder extends AbstractWordFinder { // ~ Instance/static variables ............................................... // ~ Constructors ............................................................ /** * Creates a new DefaultWordFinder object. * * @param inText * the String to search */ public DefaultWordFinder(String inText) { super(inText); } public DefaultWordFinder() { super(); } // ~ Methods ................................................................. /** * This method scans the text from the end of the last word, and returns a new Word object corresponding to the next word. * * @return the next word. * @throws WordNotFoundException * search string contains no more words. */ @Override public Word next() { if (nextWord == null) { throw new WordNotFoundException("No more words found."); } currentWord.copy(nextWord); setSentenceIterator(currentWord); int i = currentWord.getEnd(); boolean finished = false; while (i < text.length() && !finished) { if (isWordChar(i)) { nextWord.setStart(i); int end = getNextWordEnd(text, i); nextWord.setText(text.substring(i, end)); finished = true; } i++; } if (!finished) { nextWord = null; } return currentWord; } /** * Returns the position in the string <em>after</em> the end of the next word. Note that this return value should not be used as an * index into the string without checking first that it is in range, since it is possible for the value <code>text.length()</code> to be * returned by this method. */ private int getNextWordEnd(String text, int startPos) { // If we're dealing with a possible 'internet word' we need to provide // some special handling if (SpellChecker.isINETWord(text.substring(startPos))) { for (int i = startPos; i < text.length(); i++) { char ch = text.charAt(i); if (Character.isLetterOrDigit(ch)) { continue; } if (ch == '\r' || ch == '\n') { return i; } // Chop off any characters that might be enclosing the 'internet word'. eg ',",),] if (Character.isSpaceChar(ch)) { if (i > 0 && Character.isLetterOrDigit(text.charAt(i - 1))) { return i; } else { return i - 1; } } } return text.length(); } else { for (int i = startPos; i < text.length(); i++) { if (!isWordChar(i)) { return i; } } return text.length(); } } }