Сегодня я обнаружил эту Java-реализацию алгоритма переноса слов Фрэнка Ляна с шаблоном для английского или немецкого языка, которая работает довольно хорошо и доступна в Maven Central.
Cave: важно удалить последние строки файлов шаблонов .tex
, поскольку в противном случае эти файлы не могут быть загружены с текущей версией в Maven Central.
Чтобы загрузить и использовать hyphenator
, вы можете использовать следующий фрагмент кода Java. texTable
- это имя файла .tex
, содержащего необходимые шаблоны. Эти файлы доступны на сайте github проекта.
private Hyphenator createHyphenator(String texTable) {
Hyphenator hyphenator = new Hyphenator();
hyphenator.setErrorHandler(new ErrorHandler() {
public void debug(String guard, String s) {
logger.debug("{},{}", guard, s);
}
public void info(String s) {
logger.info(s);
}
public void warning(String s) {
logger.warn("WARNING: " + s);
}
public void error(String s) {
logger.error("ERROR: " + s);
}
public void exception(String s, Exception e) {
logger.error("EXCEPTION: " + s, e);
}
public boolean isDebugged(String guard) {
return false;
}
});
BufferedReader table = null;
try {
table = new BufferedReader(new InputStreamReader(Thread.currentThread().getContextClassLoader()
.getResourceAsStream((texTable)), Charset.forName("UTF-8")));
hyphenator.loadTable(table);
} catch (Utf8TexParser.TexParserException e) {
logger.error("error loading hyphenation table: {}", e.getLocalizedMessage(), e);
throw new RuntimeException("Failed to load hyphenation table", e);
} finally {
if (table != null) {
try {
table.close();
} catch (IOException e) {
logger.error("Closing hyphenation table failed", e);
}
}
}
return hyphenator;
}
После этого Hyphenator
готов к использованию. Для обнаружения слогов основная идея состоит в том, чтобы разделить термин на предоставленные дефисы.
String hyphenedTerm = hyphenator.hyphenate(term);
String hyphens[] = hyphenedTerm.split("\u00AD");
int syllables = hyphens.length;
Вам нужно разделить на "\u00AD
", поскольку API не возвращает нормальный "-"
.
Этот подход превосходит ответ Джо Басирико, поскольку он поддерживает множество различных языков и более точно определяет перенос слов в немецком языке.