package org.jabref.logic.integrity;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabaseContext;
public class TitleChecker implements ValueChecker {
private static final Pattern INSIDE_CURLY_BRAKETS = Pattern.compile("\\{[^}\\{]*\\}");
private static final Predicate<String> HAS_CAPITAL_LETTERS = Pattern.compile("[\\p{Lu}\\p{Lt}]").asPredicate();
private final BibDatabaseContext databaseContext;
public TitleChecker(BibDatabaseContext databaseContext) {
this.databaseContext = databaseContext;
}
/**
* Algorithm:
* - remove trailing whitespaces
* - ignore first letter as this can always be written in caps
* - remove everything that is in brackets
* - check if at least one capital letter is in the title
*/
@Override
public Optional<String> checkValue(String value) {
if (databaseContext.isBiblatexMode()) {
return Optional.empty();
}
String valueTrimmed = value.trim();
String valueIgnoringFirstLetter = valueTrimmed.startsWith("{") ? valueTrimmed : valueTrimmed.substring(1);
String valueOnlySpacesWithinCurlyBraces = valueIgnoringFirstLetter;
while (true) {
Matcher matcher = INSIDE_CURLY_BRAKETS.matcher(valueOnlySpacesWithinCurlyBraces);
if (!matcher.find()) {
break;
}
valueOnlySpacesWithinCurlyBraces = matcher.replaceAll("");
}
boolean hasCapitalLettersThatBibtexWillConvertToSmallerOnes = HAS_CAPITAL_LETTERS
.test(valueOnlySpacesWithinCurlyBraces);
if (hasCapitalLettersThatBibtexWillConvertToSmallerOnes) {
return Optional.of(Localization.lang("capital letters are not masked using curly brackets {}"));
}
return Optional.empty();
}
}