diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml index 93828fef592..4b5d71480cf 100644 --- a/config/checkstyle/checkstyle.xml +++ b/config/checkstyle/checkstyle.xml @@ -70,6 +70,17 @@ + + + + + + + + diff --git a/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java b/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java index 75c18152ed0..733e1908660 100644 --- a/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java +++ b/jabgui/src/main/java/org/jabref/gui/maintable/ExtractReferencesAction.java @@ -39,6 +39,8 @@ /// /// The mode is selected by the preferences whether to use Grobid or not. public class ExtractReferencesAction extends SimpleCommand { + private static final Pattern COMMENT_NUMBER_PATTERN = Pattern.compile("^\\[(\\d+)\\]"); + private final int FILES_LIMIT = 10; private final DialogService dialogService; @@ -182,8 +184,7 @@ private static String getCites(List entries, BibEntry currentEntry) { String newCitationKey; // Could happen if no author and no year is present // We use the number of the comment field (because there is no other way to get the number reliable) - Pattern pattern = Pattern.compile("^\\[(\\d+)\\]"); - Matcher matcher = pattern.matcher(importedEntry.getField(StandardField.COMMENT).orElse("")); + Matcher matcher = COMMENT_NUMBER_PATTERN.matcher(importedEntry.getField(StandardField.COMMENT).orElse("")); if (matcher.hasMatch()) { newCitationKey = sourceCitationKey + "-" + matcher.group(1); } else { diff --git a/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java b/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java index 7ed767d8653..62744721a39 100644 --- a/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java +++ b/jabgui/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java @@ -62,6 +62,9 @@ public class PreviewTabViewModel implements PreferenceTabViewModel { private static final Logger LOGGER = LoggerFactory.getLogger(PreviewTabViewModel.class); + private static final Pattern XML_TAG_PATTERN = Pattern.compile("(?(]*)(\\h*/?>))" + + "|(?)"); + private static final Pattern XML_ATTRIBUTES_PATTERN = Pattern.compile("(\\w+\\h*)(=)(\\h*\"[^\"]+\")"); private final BooleanProperty showAsExtraTabProperty = new SimpleBooleanProperty(false); private final BooleanProperty showPreviewInEntryTableTooltip = new SimpleBooleanProperty(false); @@ -330,10 +333,6 @@ public void resetDefaultLayout() { /// @param text to parse and highlight /// @return highlighted span for codeArea public StyleSpans> computeHighlighting(String text) { - final Pattern XML_TAG = Pattern.compile("(?(]*)(\\h*/?>))" - + "|(?)"); - final Pattern ATTRIBUTES = Pattern.compile("(\\w+\\h*)(=)(\\h*\"[^\"]+\")"); - final int GROUP_OPEN_BRACKET = 2; final int GROUP_ELEMENT_NAME = 3; final int GROUP_ATTRIBUTES_SECTION = 4; @@ -342,7 +341,7 @@ public StyleSpans> computeHighlighting(String text) { final int GROUP_EQUAL_SYMBOL = 2; final int GROUP_ATTRIBUTE_VALUE = 3; - Matcher matcher = XML_TAG.matcher(text); + Matcher matcher = XML_TAG_PATTERN.matcher(text); int lastKeywordEnd = 0; StyleSpansBuilder> spansBuilder = new StyleSpansBuilder<>(); while (matcher.find()) { @@ -359,7 +358,7 @@ public StyleSpans> computeHighlighting(String text) { if (!attributesText.isEmpty()) { lastKeywordEnd = 0; - Matcher attributesMatcher = ATTRIBUTES.matcher(attributesText); + Matcher attributesMatcher = XML_ATTRIBUTES_PATTERN.matcher(attributesText); while (attributesMatcher.find()) { spansBuilder.add(List.of(), attributesMatcher.start() - lastKeywordEnd); spansBuilder.add(Set.of("attribute"), attributesMatcher.end(GROUP_ATTRIBUTE_NAME) - attributesMatcher.start(GROUP_ATTRIBUTE_NAME)); diff --git a/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java b/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java index 3ed8d70ed07..5f119a962b2 100644 --- a/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java +++ b/jablib/src/main/java/org/jabref/logic/ai/chatting/FollowUpQuestionGenerator.java @@ -18,6 +18,7 @@ public class FollowUpQuestionGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(FollowUpQuestionGenerator.class); private static final int MIN_QUESTION_LENGTH = 5; private static final int MAX_QUESTION_LENGTH = 100; + private static final Pattern NUMBERED_PATTERN = Pattern.compile("^\\s*\\d+\\.\\s*(.+)$", Pattern.MULTILINE); private final ChatModel chatLanguageModel; private final AiTemplatesService aiTemplatesService; @@ -58,8 +59,7 @@ private String buildPrompt(String userMessage, String aiResponse) { private List parseQuestions(String response) { List questions = new ArrayList<>(); - Pattern numberedPattern = Pattern.compile("^\\s*\\d+\\.\\s*(.+)$", Pattern.MULTILINE); - Matcher matcher = numberedPattern.matcher(response); + Matcher matcher = NUMBERED_PATTERN.matcher(response); while (matcher.find() && questions.size() < aiPreferences.getFollowUpQuestionsCount()) { String question = matcher.group(1).trim(); diff --git a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java index 246a125feb2..0fad0f12609 100644 --- a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java +++ b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CoinsParser.java @@ -20,15 +20,15 @@ /// implemented by reverse-engineering the implementation by CiteSeerX public class CoinsParser implements Parser { - private final Pattern DOI = Pattern.compile("%3Fdoi%3D([^&]+)"); - private final Pattern TITLE = Pattern.compile("&rft.atitle=([^&]+)"); - private final Pattern JOURNAL = Pattern.compile("&rft.jtitle=([^&]+)"); - private final Pattern YEAR = Pattern.compile("&rft.date=([^&]+)"); - private final Pattern VOLUME = Pattern.compile("&rft.volume=([^&]+)"); - private final Pattern PAGES = Pattern.compile("&rft.pages=([^&]+)"); - private final Pattern ISSUE = Pattern.compile("&rft.issue=([^&]+)"); - private final Pattern TYPE = Pattern.compile("&rft.genre=([^&]+)"); - private final Pattern AUTHOR = Pattern.compile("&rft.au=([^&]+)"); + private static final Pattern DOI = Pattern.compile("%3Fdoi%3D([^&]+)"); + private static final Pattern TITLE = Pattern.compile("&rft.atitle=([^&]+)"); + private static final Pattern JOURNAL = Pattern.compile("&rft.jtitle=([^&]+)"); + private static final Pattern YEAR = Pattern.compile("&rft.date=([^&]+)"); + private static final Pattern VOLUME = Pattern.compile("&rft.volume=([^&]+)"); + private static final Pattern PAGES = Pattern.compile("&rft.pages=([^&]+)"); + private static final Pattern ISSUE = Pattern.compile("&rft.issue=([^&]+)"); + private static final Pattern TYPE = Pattern.compile("&rft.genre=([^&]+)"); + private static final Pattern AUTHOR = Pattern.compile("&rft.au=([^&]+)"); @Override public List parseEntries(InputStream inputStream) throws ParseException { diff --git a/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java b/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java index b96fba62a06..f39b9add3c2 100644 --- a/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java +++ b/jablib/src/main/java/org/jabref/logic/integrity/PagesChecker.java @@ -34,13 +34,16 @@ public class PagesChecker implements ValueChecker { + ")?" + "\\z"; // end String + private static final Predicate IS_VALID_PAGE_NUMBER_BIBTEX = Pattern.compile(PAGES_EXP_BIBTEX).asPredicate(); + private static final Predicate IS_VALID_PAGE_NUMBER_BIBLATEX = Pattern.compile(PAGES_EXP_BIBLATEX).asPredicate(); + private final Predicate isValidPageNumber; public PagesChecker(BibDatabaseContext databaseContext) { if (databaseContext.isBiblatexMode()) { - isValidPageNumber = Pattern.compile(PAGES_EXP_BIBLATEX).asPredicate(); + isValidPageNumber = IS_VALID_PAGE_NUMBER_BIBLATEX; } else { - isValidPageNumber = Pattern.compile(PAGES_EXP_BIBTEX).asPredicate(); + isValidPageNumber = IS_VALID_PAGE_NUMBER_BIBTEX; } } diff --git a/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java b/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java index 5da0cf99ef3..41df41774e5 100644 --- a/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java +++ b/jablib/src/main/java/org/jabref/logic/msbib/MSBibEntry.java @@ -26,6 +26,13 @@ /// @see ECMA Standard class MSBibEntry { + /// reduced subset, supports only "CITY , STATE, COUNTRY"
+ /// **\b(\w+)\s?[,]?\s?(\w+)\s?[,]?\s?(\w*)\b**
+ /// WORD SPACE , SPACE WORD SPACE (Can be zero or more) , SPACE WORD (Can be zero or more)
+ /// Matches both single locations (only city) like Berlin and full locations like Stroudsburg, PA, USA
+ /// tested using http://www.regexpal.com/ + private static final Pattern ADDRESS_PATTERN = Pattern.compile("\\b(\\w+)\\s?[,]?\\s?(\\w*)\\s?[,]?\\s?(\\w*)\\b"); + public Map fields = new HashMap<>(); public List authors; @@ -65,13 +72,6 @@ class MSBibEntry { private String bibtexEntryType; - /// reduced subset, supports only "CITY , STATE, COUNTRY"
- /// **\b(\w+)\s?[,]?\s?(\w+)\s?[,]?\s?(\w*)\b**
- /// WORD SPACE , SPACE WORD SPACE (Can be zero or more) , SPACE WORD (Can be zero or more)
- /// Matches both single locations (only city) like Berlin and full locations like Stroudsburg, PA, USA
- /// tested using http://www.regexpal.com/ - private final Pattern ADDRESS_PATTERN = Pattern.compile("\\b(\\w+)\\s?[,]?\\s?(\\w*)\\s?[,]?\\s?(\\w*)\\b"); - public MSBibEntry() { // empty } diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java index 606b71321c3..812f1537602 100644 --- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java +++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLCitationOOAdapter.java @@ -40,6 +40,7 @@ public class CSLCitationOOAdapter { private static final CitationStyleOutputFormat HTML_OUTPUT_FORMAT = CitationStyleOutputFormat.HTML; + private static final Pattern CITATION_NUMBER_PATTERN = Pattern.compile("(\\D*)(\\d+)(\\D*)"); private final XTextDocument document; private final CSLReferenceMarkManager markManager; @@ -259,8 +260,7 @@ private void insertReferences(XTextCursor cursor, List entries, OOText /// Transforms the numbers in the citation to globally-unique (and thus, reusable) numbers. private String updateSingleOrMultipleCitationNumbers(String citation, List entries) { - Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)"); - Matcher matcher = pattern.matcher(citation); + Matcher matcher = CITATION_NUMBER_PATTERN.matcher(citation); StringBuilder sb = new StringBuilder(); Iterator iterator = entries.iterator(); diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java index 02ab703b0c1..c5339f20bc5 100644 --- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java +++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLFormatUtils.java @@ -48,6 +48,7 @@ public final class CSLFormatUtils { private static final String DEFAULT_HANGING_INDENT_BIBLIOGRAPHY_BODY_FORMAT = "Hanging indent"; private static final Pattern YEAR_IN_CITATION_PATTERN = Pattern.compile("(.)(.*), (\\d{4}.*)"); + private static final Pattern BIBLIOGRAPHY_NUMBER_PATTERN = Pattern.compile("([\\[(])?(\\d+)([])])?(\\.)?\\s*"); private CSLFormatUtils() { // prevent instantiation @@ -168,8 +169,7 @@ public static String generateAlphanumericInTextCitation(BibEntry entry, BibDatab /// @param currentNumber the correct number to update the citation with. /// @return the bibliographic citation with resolved number. public static String updateSingleBibliographyNumber(String citation, int currentNumber) { - Pattern pattern = Pattern.compile("([\\[(])?(\\d+)([])])?(\\.)?\\s*"); - Matcher matcher = pattern.matcher(citation); + Matcher matcher = BIBLIOGRAPHY_NUMBER_PATTERN.matcher(citation); StringBuilder sb = new StringBuilder(); boolean numberReplaced = false; diff --git a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java index 3653f336d3e..92795227e30 100644 --- a/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java +++ b/jablib/src/main/java/org/jabref/logic/openoffice/oocsltext/CSLReferenceMarkManager.java @@ -40,6 +40,7 @@ /// Class for generation, insertion and management of all reference marks in the document. public class CSLReferenceMarkManager { private static final Logger LOGGER = LoggerFactory.getLogger(CSLReferenceMarkManager.class); + private static final Pattern CITATION_NUMBER_PATTERN = Pattern.compile("(\\D*)(\\d+)(\\D*)"); private final XTextDocument document; private final XMultiServiceFactory factory; @@ -227,8 +228,7 @@ private void updateAllCitationNumbers() throws Exception, CreationException { } private String getUpdatedCitationTextWithNewNumbers(String currentText, List newNumbers) { - Pattern pattern = Pattern.compile("(\\D*)(\\d+)(\\D*)"); - Matcher matcher = pattern.matcher(currentText); + Matcher matcher = CITATION_NUMBER_PATTERN.matcher(currentText); StringBuilder result = new StringBuilder(); int lastEnd = 0; int numberIndex = 0; diff --git a/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java b/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java index 1ccb290d343..db54a63652b 100644 --- a/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java +++ b/jablib/src/main/java/org/jabref/logic/util/strings/StringUtil.java @@ -49,6 +49,8 @@ public class StringUtil { private static final UnicodeToReadableCharMap UNICODE_CHAR_MAP = new UnicodeToReadableCharMap(); private static final String WRAPPED_LINE_PREFIX = ""; // If a line break is added, this prefix will be inserted at the beginning of the next line private static final String STRING_TABLE_DELIMITER = " : "; + // A sentence ends with a .?!;, but not in the case of "Mr.", "Ms.", "Mrs.", "Dr.", "st.", "jr.", "co.", "inc.", and "ltd." + private static final Pattern SPLIT_TEXT_PATTERN = Pattern.compile("(?<=[\\.!;\\?])(? getStringAsWords(String text) { /// Returns a list of sentences contained in the given text. public static List getStringAsSentences(String text) { - // A sentence ends with a .?!;, but not in the case of "Mr.", "Ms.", "Mrs.", "Dr.", "st.", "jr.", "co.", "inc.", and "ltd." - Pattern splitTextPattern = Pattern.compile("(?<=[\\.!;\\?])(?\\d{4}\\.\\d{4,5})(v(?\\d+))?\\s?(\\[(?\\S+)\\])?"); + private static final Pattern OLD_IDENTIFIER_PATTERN = Pattern.compile("(" + ARXIV_PREFIX + ")?\\s?:?\\s?(?(?[a-z\\-]+(\\.[A-Z]{2})?)/\\d{7})(v(?\\d+))?"); + private final String identifier; private final String classification; private final String version; @@ -45,8 +47,7 @@ public static Optional parse(String value) { return getArXivIdentifier(identifierMatcher); } - Pattern oldIdentifierPattern = Pattern.compile("(" + ARXIV_PREFIX + ")?\\s?:?\\s?(?(?[a-z\\-]+(\\.[A-Z]{2})?)/\\d{7})(v(?\\d+))?"); - Matcher oldIdentifierMatcher = oldIdentifierPattern.matcher(identifier); + Matcher oldIdentifierMatcher = OLD_IDENTIFIER_PATTERN.matcher(identifier); if (oldIdentifierMatcher.matches()) { return getArXivIdentifier(oldIdentifierMatcher); } diff --git a/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java b/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java index cf2e037d768..d86b35fbdd7 100644 --- a/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java +++ b/jablib/src/main/java/org/jabref/model/entry/identifier/IacrEprint.java @@ -18,16 +18,19 @@ @AllowedToUseLogic("Because URL utility is needed") public class IacrEprint implements Identifier { public static final URI RESOLVER = URLUtil.createUri("https://ia.cr"); + private static final Logger LOGGER = LoggerFactory.getLogger(IacrEprint.class); private static final String IACR_EPRINT_EXP = "\\d{4}\\/\\d{3,5}"; + private static final Pattern IACR_EPRINT_PATTERN = Pattern.compile(IACR_EPRINT_EXP); + private final String iacrEprint; IacrEprint(@NonNull String iacrEprint) { String trimmedId = iacrEprint.trim(); if (matchesExcepted(trimmedId)) { - Matcher matcher = Pattern.compile(IACR_EPRINT_EXP).matcher(trimmedId); + Matcher matcher = IACR_EPRINT_PATTERN.matcher(trimmedId); matcher.find(); this.iacrEprint = matcher.group(0); } else { diff --git a/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java b/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java index ac4a164da39..9c9bfb329e4 100644 --- a/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java +++ b/jablib/src/test/java/org/jabref/logic/importer/ImporterTest.java @@ -33,6 +33,8 @@ @ResourceLock("Localization.lang") public class ImporterTest { + private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s"); + @ParameterizedTest @MethodSource("instancesToTest") void getFormatterNameDoesNotReturnNull(Importer format) { @@ -54,8 +56,7 @@ void getIdDoesNotReturnNull(Importer format) { @ParameterizedTest @MethodSource("instancesToTest") void getIdDoesNotContainWhitespace(Importer format) { - Pattern whitespacePattern = Pattern.compile("\\s"); - assertFalse(whitespacePattern.matcher(format.getId()).find()); + assertFalse(WHITESPACE_PATTERN.matcher(format.getId()).find()); } @ParameterizedTest diff --git a/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java b/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java index 9571156fbdf..3e6121caeed 100644 --- a/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java +++ b/jabls/src/main/java/org/jabref/languageserver/util/definition/MarkdownDefinitionProvider.java @@ -6,9 +6,12 @@ public class MarkdownDefinitionProvider extends DefinitionProvider { + private static final Pattern CITATION_COMMAND_PATTERN = Pattern.compile("(?\\[[^\\]]*@[^\\]]*\\]|@[a-z0-9_.+:-]+(?:\\s*;\\s*@[a-z0-9_.+:-]+)*)", Pattern.CASE_INSENSITIVE); + private static final Pattern CITATION_KEY_INSIDE_PATTERN = Pattern.compile("@(?[a-z0-9_.+:-]+)", Pattern.CASE_INSENSITIVE); + public MarkdownDefinitionProvider(LspParserHandler parserHandler) { super(parserHandler); - this.citationCommandPattern = Pattern.compile("(?\\[[^\\]]*@[^\\]]*\\]|@[a-z0-9_.+:-]+(?:\\s*;\\s*@[a-z0-9_.+:-]+)*)", Pattern.CASE_INSENSITIVE); - this.citationKeyInsidePattern = Pattern.compile("@(?[a-z0-9_.+:-]+)", Pattern.CASE_INSENSITIVE); + this.citationCommandPattern = CITATION_COMMAND_PATTERN; + this.citationKeyInsidePattern = CITATION_KEY_INSIDE_PATTERN; } }