package com.gettingmobile.text;
import static java.lang.Character.UnicodeBlock.*;
public final class Teaser {
private static boolean isHierographic(char c) {
final Character.UnicodeBlock block = java.lang.Character.UnicodeBlock.of(c);
return CJK_UNIFIED_IDEOGRAPHS.equals(block) ||
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A.equals(block) ||
CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B.equals(block) ||
HIRAGANA.equals(block) ||
KATAKANA.equals(block);
}
private static boolean isWordCharacter(char c) {
return Character.isLetter(c) || Character.isDigit(c) || c == '-' || c == '_';
}
private static boolean isWordEnd(CharSequence text, int index) {
final char currentChar = text.charAt(index);
final char nextChar = (index + 1 < text.length()) ? text.charAt(index + 1) : ' ';
return isWordCharacter(currentChar) &&
(!isWordCharacter(nextChar) || isHierographic(nextChar) || isHierographic(currentChar));
}
private static int skipNextWord(String text, int startIndex) {
final int length = text.length();
int i = startIndex;
while (i < length && !isWordEnd(text, i))
++i;
return i < length ? i + 1 : length;
}
public static String tease(String text, int startChar, int maxWords) {
int index = startChar;
for (int words = 0; index < text.length() && words < maxWords; ++words)
index = skipNextWord(text, index);
return text.substring(startChar, index);
}
public static String tease(String text, int startChar, int maxWords, String ellipsis) {
final String teaser = tease(text, startChar, maxWords);
return (teaser.length() + startChar) < text.length() ? teaser + ellipsis : teaser;
}
}