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 EditionChecker implements ValueChecker { private static final Predicate<String> FIRST_LETTER_CAPITALIZED = Pattern.compile("^[A-Z]").asPredicate(); private static final Predicate<String> ONLY_NUMERALS_OR_LITERALS = Pattern.compile("^([0-9]+|[^0-9].+)$") .asPredicate(); private final BibDatabaseContext bibDatabaseContextEdition; public EditionChecker(BibDatabaseContext bibDatabaseContext) { this.bibDatabaseContextEdition = Objects.requireNonNull(bibDatabaseContext); } /** * Checks, if field contains only an integer or a literal (biblatex mode) * Checks, if the first letter is capitalized (BibTeX mode) * biblatex package documentation: * The edition of a printed publication. This must be an integer, not an ordinal. * It is also possible to give the edition as a literal string, for example "Third, revised and expanded edition". * Official BibTeX specification: * The edition of a book-for example, "Second". * This should be an ordinal, and should have the first letter capitalized. */ @Override public Optional<String> checkValue(String value) { //biblatex if (bibDatabaseContextEdition.isBiblatexMode() && !ONLY_NUMERALS_OR_LITERALS.test(value.trim())) { return Optional.of(Localization.lang("should contain an integer or a literal")); } //BibTeX if (!bibDatabaseContextEdition.isBiblatexMode() && !FIRST_LETTER_CAPITALIZED.test(value.trim())) { return Optional.of(Localization.lang("should have the first letter capitalized")); } return Optional.empty(); } }