package com.gmail.dpierron.calibre.datamodel;
/**
* Class for handling Noisewords at the beginning of a
* title or series name. This is highly language
* dependent so this class may be a bit simplistic.
*
* For languages where there are no list of noisewords
* available this class effectively does nothing.
*/
import com.gmail.dpierron.tools.Helper;
import java.util.*;
public class NoiseWord {
private Locale locale; // Local for this class instance
private List<String> noiseWords; // List of Noisewords for this class instance
private boolean removeWords; // true = remove words completely, false = move words to end
// CONSTRUCTORS
/**
* Construct a locale specific NoiseWord object
*
* @param locale // The locale for this instance
* @param noiseWords // The list of noise words for this locale
* // If not known provide either null ir an empty list
*/
public NoiseWord(Locale locale, List<String> noiseWords) {
this.locale = locale;
this.noiseWords = noiseWords;
removeWords = true;
}
// METHODS and PROPERTIES
/**
*
* @param b
*/
public void setRemovewords(boolean b) {
removeWords = b;
}
/**
* Remove leading noisewords from the start of the provided string.
* The primary purpose of this method is to allow for sorting titles
* and series via the 'library ordeer' which ignores leading nosie
* words.
*
* Whether the words are removed entirely or moved to the end receeded
* by a comma is controlled via the removeWords prperty (defaults to move)
*
* @param s // The String to be examined
* @return // Amended string.
*/
public String removeLeadingNoiseWords(String s) {
if (noiseWords == null || noiseWords.size() == 0) {
return s;
}
String result = s.toUpperCase(locale);
boolean found = true;
int startPos = 0;
while ( (startPos < s.length()) && found) {
found = false;
for (String noiseWord : noiseWords) {
if (result.substring(startPos).startsWith(noiseWord)) {
startPos += noiseWord.length();
found = true;
}
}
}
result = s.substring(startPos);
if (! removeWords && startPos > 0) {
// We want to ignore any trailing space on the noiseword(s)
if (s.charAt(startPos-1) == ' ') startPos--;
// Move noisewords to end
result += ", " + s.substring(0, startPos);
}
return result;
}
@Override
public String toString() {
return (locale == null ? "Unknown" : locale.getDisplayLanguage())
+ ": "
+ (Helper.isNullOrEmpty(noiseWords) ? "[]" : noiseWords.toString());
}
}