package org.jabref.logic.formatter.casechanger; import java.util.LinkedList; import java.util.List; import java.util.Optional; /** * Parses a title to a list of words. */ public final class TitleParser { private StringBuffer buffer; private int wordStart; public List<Word> parse(String title) { List<Word> words = new LinkedList<>(); boolean[] isProtected = determineProtectedChars(title); reset(); int index = 0; for (char c : title.toCharArray()) { if (Character.isWhitespace(c)) { createWord(isProtected).ifPresent(words::add); } else { if (wordStart == -1) { wordStart = index; } buffer.append(c); } index++; } createWord(isProtected).ifPresent(words::add); return words; } private Optional<Word> createWord(boolean[] isProtected) { if (buffer.length() <= 0) { return Optional.empty(); } char[] chars = buffer.toString().toCharArray(); boolean[] protectedChars = new boolean[chars.length]; System.arraycopy(isProtected, wordStart, protectedChars, 0, chars.length); reset(); return Optional.of(new Word(chars, protectedChars)); } private void reset() { wordStart = -1; buffer = new StringBuffer(); } private static boolean[] determineProtectedChars(String title) { boolean[] isProtected = new boolean[title.length()]; char[] chars = title.toCharArray(); int brackets = 0; for (int i = 0; i < title.length(); i++) { if (chars[i] == '{') { brackets++; } else if (chars[i] == '}') { brackets--; } else { isProtected[i] = brackets > 0; } } return isProtected; } }