package org.jabref.logic.integrity;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.regex.Pattern;
import org.jabref.logic.l10n.Localization;
import org.jabref.model.database.BibDatabaseContext;
public class MonthChecker implements ValueChecker {
private static final Predicate<String> ONLY_AN_INTEGER = Pattern.compile("[1-9]|10|11|12")
.asPredicate();
private static final Predicate<String> MONTH_NORMALIZED = Pattern
.compile("#jan#|#feb#|#mar#|#apr#|#may#|#jun#|#jul#|#aug#|#sep#|#oct#|#nov#|#dec#")
.asPredicate();
private final BibDatabaseContext bibDatabaseContextMonth;
public MonthChecker(BibDatabaseContext bibDatabaseContext) {
this.bibDatabaseContextMonth = Objects.requireNonNull(bibDatabaseContext);
}
/**
* biblatex package documentation (Section 2.3.9):
* The month field is an integer field.
* The bibliography style converts the month to a language-dependent string as required.
* For backwards compatibility, you may also use the following three-letter abbreviations in the month field:
* jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec.
* Note that these abbreviations are BibTeX strings which must be given without any braces or quotes.
*/
@Override
public Optional<String> checkValue(String value) {
//biblatex
if (bibDatabaseContextMonth.isBiblatexMode()
&& !(ONLY_AN_INTEGER.test(value.trim()) || MONTH_NORMALIZED.test(value.trim()))) {
return Optional.of(Localization.lang("should be an integer or normalized"));
}
//BibTeX
if (!bibDatabaseContextMonth.isBiblatexMode() && !MONTH_NORMALIZED.test(value.trim())) {
return Optional.of(Localization.lang("should be normalized"));
}
return Optional.empty();
}
}