From fd405cf1600bb2fb4225c3fef34cfd3580b04e75 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 11:06:51 -0400 Subject: [PATCH 01/61] Fix Pattern.compile for frequently used regexes --- .../logic/bibtexkeypattern/BracketedPattern.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 316de3b4dc3..b32ea47910b 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -43,7 +43,14 @@ public class BracketedPattern { private static final String STARTING_CAPITAL_PATTERN = "[^A-Z]"; private static final int CHARS_OF_FIRST = 5; + private static final Pattern REGEX_PATTERN = Pattern.compile(".*\\(\\{([A-Z]+)\\}\\).*"); + /** Matches with "uni", case insensitive */ + private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); + /** Matches with "tech", case insensitive */ + private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); + /** Matches with "dep"/"dip"/"lab", case insensitive */ + private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); private final String pattern; @@ -1325,16 +1332,16 @@ private static String generateInstitutionKey(String content) { // Deciding about a part type... for (String k : part) { - if (k.matches("^[Uu][Nn][Ii].*")) { // Starts with "uni" case and locale independent + if (UNIVERSITY_PATTERN.matcher(k).matches()) { isUniversity = true; } - if (k.matches("^[Tt][Ee][Cc][Hh].*")) { // Starts with "tech" case and locale independent + if (TECHNOLOGY_PATTERN.matcher(k).matches()) { isTechnology = true; } if (StandardField.SCHOOL.getName().equalsIgnoreCase(k)) { isSchool = true; } - if (k.matches("^[Dd][EeIi][Pp].*") || k.matches("^[Ll][Aa][Bb].*")) { // Starts with "dep"/"dip"/"lab", case and locale independent + if (DEPARTMENT_PATTERN.matcher(k).matches()) { isDepartment = true; } } @@ -1350,7 +1357,7 @@ private static String generateInstitutionKey(String content) { StringBuilder universitySB = new StringBuilder(); universitySB.append("Uni"); for (String k : part) { - if (!k.matches("^[Uu][Nn][Ii].*")) { + if (!UNIVERSITY_PATTERN.matcher(k).matches()) { universitySB.append(k); } } From a6354e39e96938e731f59e166c876d9fe32432a6 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:07:16 -0400 Subject: [PATCH 02/61] Fix one additional Pattern.compile --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index b32ea47910b..0d54dc81ef5 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -50,7 +50,9 @@ public class BracketedPattern { /** Matches with "tech", case insensitive */ private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); /** Matches with "dep"/"dip"/"lab", case insensitive */ - private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); + private static final Pattern DEPARTMENT_OR_LAB_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); + /** Matches with "dep"/"dip", case insensitive */ + private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); private final String pattern; @@ -1341,7 +1343,7 @@ private static String generateInstitutionKey(String content) { if (StandardField.SCHOOL.getName().equalsIgnoreCase(k)) { isSchool = true; } - if (DEPARTMENT_PATTERN.matcher(k).matches()) { + if (DEPARTMENT_OR_LAB_PATTERN.matcher(k).matches()) { isDepartment = true; } } From 149ed4f18e55d451b6335f6740e9a70b84cf221b Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:09:49 -0400 Subject: [PATCH 03/61] Fix style and unnecessary escape sequences --- .../jabref/logic/bibtexkeypattern/BracketedPattern.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 0d54dc81ef5..cae737f818b 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -70,8 +70,7 @@ public String toString() { } public String expand(BibEntry bibentry) { - BibDatabase null_database = null; - return expand(bibentry, null_database); + return expand(bibentry, null); } /** @@ -1297,7 +1296,7 @@ private static String generateInstitutionKey(String content) { String result = content; result = unifyDiacritics(result); - result = result.replaceAll("^\\{", "").replaceAll("\\}$", ""); + result = result.replaceAll("^\\{", "").replaceAll("}$", ""); Matcher matcher = REGEX_PATTERN.matcher(result); if (matcher.matches()) { return matcher.group(1); @@ -1317,7 +1316,7 @@ private static String generateInstitutionKey(String content) { List part = new ArrayList<>(); // Cleanup: remove unnecessary words. - for (String k : parts[index].replaceAll("\\{[A-Z]+\\}", "").split("[ \\-_]")) { + for (String k : parts[index].replaceAll("\\{[A-Z]+}", "").split("[ \\-_]")) { if ((!(k.isEmpty()) // remove empty && !ignore.contains(k.toLowerCase(Locale.ENGLISH)) // remove ignored words && (k.charAt(k.length() - 1) != '.') @@ -1419,6 +1418,6 @@ private static String generateInstitutionKey(String content) { return (university == null ? rest : university) + (school == null ? "" : school) + ((department == null) - || ((school != null) && department.equals(school)) ? "" : department); + || department.equals(school) ? "" : department); } } From b57f1b2e970fc30f41cd6e307863f10d93e4e1f8 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:13:16 -0400 Subject: [PATCH 04/61] Fix invalid index in call to substring The original condition is evaluated to false. The substring is shorter than "uni". --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index cae737f818b..b73391a86a6 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1321,7 +1321,7 @@ private static String generateInstitutionKey(String content) { && !ignore.contains(k.toLowerCase(Locale.ENGLISH)) // remove ignored words && (k.charAt(k.length() - 1) != '.') && (String.valueOf(k.charAt(0))).matches("[A-Z]")) - || ((k.length() >= 3) && "uni".equalsIgnoreCase(k.substring(0, 2)))) { + || ((k.length() >= 3) && "uni".equalsIgnoreCase(k.substring(0, 3)))) { part.add(k); } } From fae093bb05f79ea69ffca36abf96cc237aa1931e Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:34:21 -0400 Subject: [PATCH 05/61] Refactor name and javadoc of a regex --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index b73391a86a6..aa09e1cceb1 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -44,7 +44,8 @@ public class BracketedPattern { private static final String STARTING_CAPITAL_PATTERN = "[^A-Z]"; private static final int CHARS_OF_FIRST = 5; - private static final Pattern REGEX_PATTERN = Pattern.compile(".*\\(\\{([A-Z]+)\\}\\).*"); + /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ + private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); /** Matches with "uni", case insensitive */ private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); /** Matches with "tech", case insensitive */ @@ -1297,7 +1298,7 @@ private static String generateInstitutionKey(String content) { String result = content; result = unifyDiacritics(result); result = result.replaceAll("^\\{", "").replaceAll("}$", ""); - Matcher matcher = REGEX_PATTERN.matcher(result); + Matcher matcher = ABBREVIATION_PATTERN.matcher(result); if (matcher.matches()) { return matcher.group(1); } From 5a23a9a09c485f5beefbb8607d3bcb86d3d659a3 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:35:52 -0400 Subject: [PATCH 06/61] Fix use of compiled regex for matching department --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index aa09e1cceb1..792e482bf21 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1377,7 +1377,7 @@ private static String generateInstitutionKey(String content) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); for (String k : part) { - if (!k.matches("^[Dd][EeIi][Pp].*") && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) + if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) && !(k.replaceAll(STARTING_CAPITAL_PATTERN, "").isEmpty())) { if (isSchool) { From 6af8c7e3549eca925967476c737e919a990d4f01 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 13:38:41 -0400 Subject: [PATCH 07/61] Fix check for uppercase letter Perhaps the assumption should be that the letters are ASCII. If all letters are ASCII checking 'A' <= k.charAt(0) <= 'Z' might make more sense. I am not convinced about doing this with a regex. --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 792e482bf21..4eecfed728c 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1321,7 +1321,7 @@ private static String generateInstitutionKey(String content) { if ((!(k.isEmpty()) // remove empty && !ignore.contains(k.toLowerCase(Locale.ENGLISH)) // remove ignored words && (k.charAt(k.length() - 1) != '.') - && (String.valueOf(k.charAt(0))).matches("[A-Z]")) + && Character.isUpperCase(k.charAt(0))) || ((k.length() >= 3) && "uni".equalsIgnoreCase(k.substring(0, 3)))) { part.add(k); } From 716f885e97a49433853aeb0c73064e7d25a4faae Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 15:06:24 -0400 Subject: [PATCH 08/61] Fix usage of uncompiled regex --- .../jabref/logic/bibtexkeypattern/BracketedPattern.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 4eecfed728c..3192522474f 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -41,9 +41,10 @@ public class BracketedPattern { private static final Logger LOGGER = LoggerFactory.getLogger(BracketedPattern.class); - private static final String STARTING_CAPITAL_PATTERN = "[^A-Z]"; private static final int CHARS_OF_FIRST = 5; + /** Matches everything that is not an uppercase ASCII letter */ + private static final Pattern STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); /** Matches with "uni", case insensitive */ @@ -1379,12 +1380,12 @@ private static String generateInstitutionKey(String content) { for (String k : part) { if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) - && !(k.replaceAll(STARTING_CAPITAL_PATTERN, "").isEmpty())) { + && !STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { if (isSchool) { - schoolSB.append(k.replaceAll(STARTING_CAPITAL_PATTERN, "")); + schoolSB.append(STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } if (isDepartment) { - departmentSB.append(k.replaceAll(STARTING_CAPITAL_PATTERN, "")); + departmentSB.append(STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } } } From cdfd56a1b2f50f9b781e7129e45dc3d9e61c1967 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 16:44:59 -0400 Subject: [PATCH 09/61] Fix readability? --- .../bibtexkeypattern/BracketedPattern.java | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 3192522474f..0b5ee139d13 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -10,8 +10,10 @@ import java.util.Scanner; import java.util.StringJoiner; import java.util.StringTokenizer; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; import org.jabref.logic.formatter.Formatters; import org.jabref.logic.formatter.casechanger.Word; @@ -1395,24 +1397,18 @@ private static String generateInstitutionKey(String content) { if (isDepartment) { department = departmentSB.toString(); } - // A part not matching university, department nor school. } else if (rest == null) { - StringBuilder restSB = new StringBuilder(); - // Less than 3 parts -> concatenate those + // A part not matching university, department nor school. if (part.size() < 3) { - for (String k : part) { - restSB.append(k); - // More than 3 parts -> use 1st letter abbreviation - } + // Less than 3 parts -> concatenate those + rest = String.join("", part); } else { - for (String k : part) { - k = k.replaceAll(STARTING_CAPITAL_PATTERN, ""); - if (!(k.isEmpty())) { - restSB.append(k); - } - } + // More than 3 parts -> use 1st letter abbreviation + rest = part.stream() + .filter(Predicate.not(String::isBlank)) + .map((word) -> Character.toString(word.charAt(0))) + .collect(Collectors.joining()); } - rest = restSB.toString(); } } From b227edb72040f1e3b5184d35faa9bea24dd4429e Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 17:25:52 -0400 Subject: [PATCH 10/61] Add test cases Both test cases involves an author name containing department or school without university or institute of technology. --- .../BibtexKeyGeneratorTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 6d42a9d7ac6..998cea10326 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -386,6 +386,26 @@ void testSchool() throws ParseException { new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } + @Test + void generateKeyAbbreviateCorporateAuthorDepartmentWithoutAcademicInstitute() throws ParseException { + Optional entry = BibtexParser.singleFromString( + "@ARTICLE{null, author={{Department of Localhost Nullgenerators}}}", + importFormatPreferences, fileMonitor); + assertEquals("LN", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); + } + + @Test + void generateKeyAbbreviateCorporateAuthorSchoolWithoutAcademicInstitute() throws ParseException { + Optional entry = BibtexParser.singleFromString( + "@ARTICLE{null, author={{The School of Null}}}", + importFormatPreferences, fileMonitor); + assertEquals("N", + BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); + } + @Test void testcrossrefSchool() throws Exception { BibDatabase database = new BibDatabase(); From ef7f9798339d53f28e64c7801dab0eb0b6099724 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 13 May 2020 17:29:12 -0400 Subject: [PATCH 11/61] Fix `null` appearing as part of author name Corporate authors without university/institute of technology --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 0b5ee139d13..c7cc3609228 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1413,7 +1413,7 @@ private static String generateInstitutionKey(String content) { } // Putting parts together. - return (university == null ? rest : university) + return (university == null ? Objects.toString(rest, "") : university) + (school == null ? "" : school) + ((department == null) || department.equals(school) ? "" : department); From 9ac3993cb84e814ef3318ab12bf79461a6c1a84b Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 14 May 2020 08:57:07 -0400 Subject: [PATCH 12/61] Refactor name of capital regex pattern --- .../jabref/logic/bibtexkeypattern/BracketedPattern.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index c7cc3609228..72f32bb3465 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -46,7 +46,7 @@ public class BracketedPattern { private static final int CHARS_OF_FIRST = 5; /** Matches everything that is not an uppercase ASCII letter */ - private static final Pattern STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); + private static final Pattern NOT_STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); /** Matches with "uni", case insensitive */ @@ -1382,12 +1382,12 @@ private static String generateInstitutionKey(String content) { for (String k : part) { if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) - && !STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { + && !NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { if (isSchool) { - schoolSB.append(STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); + schoolSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } if (isDepartment) { - departmentSB.append(STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); + departmentSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } } } From 6ded410cdfc14fd4100080face795204a07e25bd Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 15 May 2020 14:50:20 -0400 Subject: [PATCH 13/61] Add debug output for reordering of names in fields --- .../gui/maintable/BibEntryTableViewModel.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java index fd011a8cfdf..0c34bf731cf 100644 --- a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java +++ b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java @@ -13,6 +13,7 @@ import javafx.beans.value.ObservableValue; import org.jabref.gui.specialfields.SpecialFieldValueViewModel; +import org.jabref.logic.layout.format.LatexToUnicodeFormatter; import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -28,8 +29,11 @@ import com.tobiasdiez.easybind.EasyBind; import com.tobiasdiez.easybind.EasyBinding; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class BibEntryTableViewModel { + static private final Logger LOGGER = LoggerFactory.getLogger(BibEntryTableViewModel.class); private final BibEntry entry; private final BibDatabase database; private final MainTableNameFormatter nameFormatter; @@ -119,9 +123,11 @@ public ObservableValue getFields(OrFields fields) { boolean isName = false; Optional content = Optional.empty(); + Field anEntry = null; for (Field field : fields) { content = entry.getResolvedFieldOrAliasLatexFree(field, database); if (content.isPresent()) { + anEntry = field; isName = field.getProperties().contains(FieldProperty.PERSON_NAMES); break; } @@ -129,7 +135,18 @@ public ObservableValue getFields(OrFields fields) { String result = content.orElse(null); if (isName) { - return nameFormatter.formatName(result); + String latexFreeBeforeNameFormatter = nameFormatter.formatName(result); + + String unformattedName = entry.getResolvedFieldOrAlias(anEntry, database).orElse(null); + String formattedName = nameFormatter.formatName(unformattedName); + String latexFreeAfterNameFormatter = new LatexToUnicodeFormatter().format(formattedName); + + if (!latexFreeAfterNameFormatter.equals(latexFreeBeforeNameFormatter)) { + LOGGER.info("latexFreeBeforeNameFormatter = " + latexFreeBeforeNameFormatter); + LOGGER.info("latexFreeAfterNameFormatter = " + latexFreeAfterNameFormatter); + } + + return latexFreeAfterNameFormatter; } else { return result; } From 72eb1fe361426bf5d46679ccea1330487ad49b9d Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 18 May 2020 15:33:11 -0400 Subject: [PATCH 14/61] Add helper methods --- .../bibtexkeypattern/BracketedPattern.java | 120 ++++++++++-------- 1 file changed, 67 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 4ba108cd957..388060947b8 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import java.util.Locale; import java.util.Objects; @@ -49,7 +50,7 @@ public class BracketedPattern { private static final Pattern NOT_STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); - /** Matches with "uni", case insensitive */ + /** Matches "uni" at the start of a string or after a space, case insensitive */ private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); /** Matches with "tech", case insensitive */ private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); @@ -57,6 +58,12 @@ public class BracketedPattern { private static final Pattern DEPARTMENT_OR_LAB_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); /** Matches with "dep"/"dip", case insensitive */ private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); + private enum INSTITUTION { + SCHOOL, + DEPARTMENT, + UNIVERSITY, + TECHNOLOGY; + } private final String pattern; @@ -1288,7 +1295,7 @@ private static String generateInstitutionKey(String content) { } result = removeDiacritics(result); - String[] parts = result.split(","); + String[] institutionName = result.split(","); // Key parts String university = null; @@ -1296,60 +1303,26 @@ private static String generateInstitutionKey(String content) { String school = null; String rest = null; - List ignore = Arrays.asList("press", "the"); - for (int index = 0; index < parts.length; index++) { - List part = new ArrayList<>(); - - // Cleanup: remove unnecessary words. - for (String k : parts[index].replaceAll("\\{[A-Z]+}", "").split("[ \\-_]")) { - if ((!(k.isEmpty()) // remove empty - && !ignore.contains(k.toLowerCase(Locale.ENGLISH)) // remove ignored words - && (k.charAt(k.length() - 1) != '.') - && Character.isUpperCase(k.charAt(0))) - || ((k.length() >= 3) && "uni".equalsIgnoreCase(k.substring(0, 3)))) { - part.add(k); - } - } - - boolean isUniversity = false; // university - boolean isTechnology = false; // technology institute - boolean isDepartment = false; // departments - boolean isSchool = false; // schools - - // Deciding about a part type... - for (String k : part) { - if (UNIVERSITY_PATTERN.matcher(k).matches()) { - isUniversity = true; - } - if (TECHNOLOGY_PATTERN.matcher(k).matches()) { - isTechnology = true; - } - if (StandardField.SCHOOL.getName().equalsIgnoreCase(k)) { - isSchool = true; - } - if (DEPARTMENT_OR_LAB_PATTERN.matcher(k).matches()) { - isDepartment = true; - } - } - if (isTechnology) { - isUniversity = false; // technology institute isn't university :-) - } + for (int index = 0; index < institutionName.length; index++) { + List nameParts = removeUnnecessaryInstitutionWords(institutionName[index]); + EnumSet nameTypes = institutionNameTypes(nameParts); // University part looks like: Uni[NameOfTheUniversity] // // If university is detected than the previous part is suggested // as department - if (isUniversity) { + if (nameTypes.contains(INSTITUTION.UNIVERSITY)) { StringBuilder universitySB = new StringBuilder(); universitySB.append("Uni"); - for (String k : part) { - if (!UNIVERSITY_PATTERN.matcher(k).matches()) { + for (String k : nameParts) { + if ("uni".regionMatches(true, 0, k, 0, 3)) { + // if (!UNIVERSITY_PATTERN.matcher(k).matches()) { universitySB.append(k); } } university = universitySB.toString(); if ((index > 0) && (department == null)) { - department = parts[index - 1]; + department = institutionName[index - 1]; } // School is an abbreviation of all the words beginning with a @@ -1357,35 +1330,37 @@ private static String generateInstitutionKey(String content) { // // Explicitly defined department part is build the same way as // school - } else if (isSchool || isDepartment) { + // } else if (isSchool || isDepartment) { + } else if (nameTypes.contains(INSTITUTION.SCHOOL) + || nameTypes.contains(INSTITUTION.DEPARTMENT)) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); - for (String k : part) { + for (String k : nameParts) { if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) && !NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { - if (isSchool) { + if (nameTypes.contains(INSTITUTION.SCHOOL)) { schoolSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } - if (isDepartment) { + if (nameTypes.contains(INSTITUTION.DEPARTMENT)) { departmentSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } } } - if (isSchool) { + if (nameTypes.contains(INSTITUTION.SCHOOL)) { school = schoolSB.toString(); } - if (isDepartment) { + if (nameTypes.contains(INSTITUTION.DEPARTMENT)) { department = departmentSB.toString(); } } else if (rest == null) { // A part not matching university, department nor school. - if (part.size() < 3) { + if (nameParts.size() < 3) { // Less than 3 parts -> concatenate those - rest = String.join("", part); + rest = String.join("", nameParts); } else { // More than 3 parts -> use 1st letter abbreviation - rest = part.stream() + rest = nameParts.stream() .filter(Predicate.not(String::isBlank)) .map((word) -> Character.toString(word.charAt(0))) .collect(Collectors.joining()); @@ -1399,4 +1374,43 @@ private static String generateInstitutionKey(String content) { + ((department == null) || ((school != null) && department.equals(school)) ? "" : department); } + + private static EnumSet institutionNameTypes(List nameParts) { + EnumSet parts = EnumSet.noneOf(INSTITUTION.class); + // Deciding about a part type... + for (String namePart : nameParts) { + if (UNIVERSITY_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.UNIVERSITY); + } else if (TECHNOLOGY_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.TECHNOLOGY); + } else if (StandardField.SCHOOL.getName().equalsIgnoreCase(namePart)) { + parts.add(INSTITUTION.SCHOOL); + } else if (DEPARTMENT_OR_LAB_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.DEPARTMENT); + } + } + + if (parts.contains(INSTITUTION.TECHNOLOGY)) { + parts.remove(INSTITUTION.UNIVERSITY); // technology institute isn't university :-) + } + + return parts; + } + + private static List removeUnnecessaryInstitutionWords(String name) { + List nameParts = new ArrayList<>(); + List ignore = Arrays.asList("press", "the"); + + // Cleanup: remove unnecessary words. + for (String part : name.replaceAll("\\{[A-Z]+}", "").split("[ \\-_]")) { + if ((!(part.isEmpty()) // remove empty + && !ignore.contains(part.toLowerCase(Locale.ENGLISH)) // remove ignored words + && (part.charAt(part.length() - 1) != '.') + && Character.isUpperCase(part.charAt(0))) + || ((part.length() >= 3) && "uni".equalsIgnoreCase(part.substring(0, 3)))) { + nameParts.add(part); + } + } + return nameParts; + } } From 2eee8dd9768091649c7ca815beed10b161f6c6e5 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 18 May 2020 16:31:10 -0400 Subject: [PATCH 15/61] Fix missing negation in "uni" matching --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 388060947b8..63cc4a36f63 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1315,7 +1315,7 @@ private static String generateInstitutionKey(String content) { StringBuilder universitySB = new StringBuilder(); universitySB.append("Uni"); for (String k : nameParts) { - if ("uni".regionMatches(true, 0, k, 0, 3)) { + if (!"uni".regionMatches(true, 0, k, 0, 3)) { // if (!UNIVERSITY_PATTERN.matcher(k).matches()) { universitySB.append(k); } From cc540298ab5ddceb0ed3b85599817ff3cd862a2f Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Mon, 18 May 2020 16:33:54 -0400 Subject: [PATCH 16/61] Fix test cases for corporate authors --- .../logic/bibtexkeypattern/BibtexKeyGeneratorTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 998cea10326..691bb3bb68d 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -389,9 +389,9 @@ void testSchool() throws ParseException { @Test void generateKeyAbbreviateCorporateAuthorDepartmentWithoutAcademicInstitute() throws ParseException { Optional entry = BibtexParser.singleFromString( - "@ARTICLE{null, author={{Department of Localhost Nullgenerators}}}", + "@ARTICLE{null, author={{Department of Localhost NullGenerators}}}", importFormatPreferences, fileMonitor); - assertEquals("LN", + assertEquals("DLNG", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @@ -401,7 +401,7 @@ void generateKeyAbbreviateCorporateAuthorSchoolWithoutAcademicInstitute() throws Optional entry = BibtexParser.singleFromString( "@ARTICLE{null, author={{The School of Null}}}", importFormatPreferences, fileMonitor); - assertEquals("N", + assertEquals("SN", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } From 1063ae1c721def7edcf845a942c97575f825eb1e Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 09:56:29 -0400 Subject: [PATCH 17/61] Fix to keep all uppercase letters in abbreviation --- .../logic/bibtexkeypattern/BracketedPattern.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 63cc4a36f63..a7d5e257743 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -11,10 +11,8 @@ import java.util.Scanner; import java.util.StringJoiner; import java.util.StringTokenizer; -import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; -import java.util.stream.Collectors; import org.jabref.logic.formatter.Formatters; import org.jabref.logic.formatter.casechanger.Word; @@ -1355,15 +1353,11 @@ private static String generateInstitutionKey(String content) { } } else if (rest == null) { // A part not matching university, department nor school. - if (nameParts.size() < 3) { - // Less than 3 parts -> concatenate those - rest = String.join("", nameParts); - } else { - // More than 3 parts -> use 1st letter abbreviation - rest = nameParts.stream() - .filter(Predicate.not(String::isBlank)) - .map((word) -> Character.toString(word.charAt(0))) - .collect(Collectors.joining()); + rest = String.join("", nameParts); + if (nameParts.size() >= 3) { + // If there are more than 3 parts, only keep uppercase characters + final int[] codePoints = rest.chars().filter(Character::isUpperCase).toArray(); + rest = new String(codePoints, 0, codePoints.length); } } } From ef94758a932e3dd171530352aa48551dbaa107cf Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 10:06:52 -0400 Subject: [PATCH 18/61] Fix commented out code --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index a7d5e257743..fa98edbf233 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1314,7 +1314,6 @@ private static String generateInstitutionKey(String content) { universitySB.append("Uni"); for (String k : nameParts) { if (!"uni".regionMatches(true, 0, k, 0, 3)) { - // if (!UNIVERSITY_PATTERN.matcher(k).matches()) { universitySB.append(k); } } @@ -1328,7 +1327,6 @@ private static String generateInstitutionKey(String content) { // // Explicitly defined department part is build the same way as // school - // } else if (isSchool || isDepartment) { } else if (nameTypes.contains(INSTITUTION.SCHOOL) || nameTypes.contains(INSTITUTION.DEPARTMENT)) { StringBuilder schoolSB = new StringBuilder(); From e80bd8be5e8dd9f5d3f60a189b862ea7579047bb Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 10:54:30 -0400 Subject: [PATCH 19/61] Fix key for institution's name containing keyword If the name of an institution can't be split, assume that "School"/"Department" is part of the name. --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index fa98edbf233..f21acf2679a 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1327,8 +1327,9 @@ private static String generateInstitutionKey(String content) { // // Explicitly defined department part is build the same way as // school - } else if (nameTypes.contains(INSTITUTION.SCHOOL) - || nameTypes.contains(INSTITUTION.DEPARTMENT)) { + } else if ((nameTypes.contains(INSTITUTION.SCHOOL) + || nameTypes.contains(INSTITUTION.DEPARTMENT)) + && institutionName.length > 1) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); for (String k : nameParts) { From a0ed455bd7d164fd37d30dcbcbd9abfe0d4f02eb Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 11:10:15 -0400 Subject: [PATCH 20/61] Fix test case for short institution name --- .../jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 691bb3bb68d..5c61f9c1936 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -401,7 +401,7 @@ void generateKeyAbbreviateCorporateAuthorSchoolWithoutAcademicInstitute() throws Optional entry = BibtexParser.singleFromString( "@ARTICLE{null, author={{The School of Null}}}", importFormatPreferences, fileMonitor); - assertEquals("SN", + assertEquals("SchoolNull", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } From 4db082435d021941ada53c8091de5786dac38480 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 11:11:35 -0400 Subject: [PATCH 21/61] Refactor check for institution types --- .../bibtexkeypattern/BracketedPattern.java | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index f21acf2679a..f6043a1cd5a 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -61,6 +61,33 @@ private enum INSTITUTION { DEPARTMENT, UNIVERSITY, TECHNOLOGY; + + /** + * Finds which types of institutions have words in common with the given name parts. + * @param nameParts a list of words that constitute parts of an institution's name. + * @return + */ + public static EnumSet findTypes(List nameParts) { + EnumSet parts = EnumSet.noneOf(INSTITUTION.class); + // Deciding about a part type… + for (String namePart : nameParts) { + if (UNIVERSITY_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.UNIVERSITY); + } else if (TECHNOLOGY_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.TECHNOLOGY); + } else if (StandardField.SCHOOL.getName().equalsIgnoreCase(namePart)) { + parts.add(INSTITUTION.SCHOOL); + } else if (DEPARTMENT_OR_LAB_PATTERN.matcher(namePart).matches()) { + parts.add(INSTITUTION.DEPARTMENT); + } + } + + if (parts.contains(INSTITUTION.TECHNOLOGY)) { + parts.remove(INSTITUTION.UNIVERSITY); // technology institute isn't university :-) + } + + return parts; + } } private final String pattern; @@ -1303,7 +1330,7 @@ private static String generateInstitutionKey(String content) { for (int index = 0; index < institutionName.length; index++) { List nameParts = removeUnnecessaryInstitutionWords(institutionName[index]); - EnumSet nameTypes = institutionNameTypes(nameParts); + EnumSet nameTypes = INSTITUTION.findTypes(nameParts); // University part looks like: Uni[NameOfTheUniversity] // @@ -1368,28 +1395,6 @@ private static String generateInstitutionKey(String content) { || ((school != null) && department.equals(school)) ? "" : department); } - private static EnumSet institutionNameTypes(List nameParts) { - EnumSet parts = EnumSet.noneOf(INSTITUTION.class); - // Deciding about a part type... - for (String namePart : nameParts) { - if (UNIVERSITY_PATTERN.matcher(namePart).matches()) { - parts.add(INSTITUTION.UNIVERSITY); - } else if (TECHNOLOGY_PATTERN.matcher(namePart).matches()) { - parts.add(INSTITUTION.TECHNOLOGY); - } else if (StandardField.SCHOOL.getName().equalsIgnoreCase(namePart)) { - parts.add(INSTITUTION.SCHOOL); - } else if (DEPARTMENT_OR_LAB_PATTERN.matcher(namePart).matches()) { - parts.add(INSTITUTION.DEPARTMENT); - } - } - - if (parts.contains(INSTITUTION.TECHNOLOGY)) { - parts.remove(INSTITUTION.UNIVERSITY); // technology institute isn't university :-) - } - - return parts; - } - private static List removeUnnecessaryInstitutionWords(String name) { List nameParts = new ArrayList<>(); List ignore = Arrays.asList("press", "the"); From 383fc14680a90c8d77e8739e60ce9f6294895812 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 11:28:13 -0400 Subject: [PATCH 22/61] Refactor comments and names improving readability? --- .../bibtexkeypattern/BracketedPattern.java | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index f6043a1cd5a..8986030f033 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1320,7 +1320,7 @@ private static String generateInstitutionKey(String content) { } result = removeDiacritics(result); - String[] institutionName = result.split(","); + String[] institutionNameTokens = result.split(","); // Key parts String university = null; @@ -1328,59 +1328,55 @@ private static String generateInstitutionKey(String content) { String school = null; String rest = null; - for (int index = 0; index < institutionName.length; index++) { - List nameParts = removeUnnecessaryInstitutionWords(institutionName[index]); - EnumSet nameTypes = INSTITUTION.findTypes(nameParts); + for (int index = 0; index < institutionNameTokens.length; index++) { + List tokenParts = getValidInstitutionNameParts(institutionNameTokens[index]); + EnumSet tokenTypes = INSTITUTION.findTypes(tokenParts); - // University part looks like: Uni[NameOfTheUniversity] - // - // If university is detected than the previous part is suggested - // as department - if (nameTypes.contains(INSTITUTION.UNIVERSITY)) { + if (tokenTypes.contains(INSTITUTION.UNIVERSITY)) { StringBuilder universitySB = new StringBuilder(); + // University part looks like: Uni[NameOfTheUniversity] universitySB.append("Uni"); - for (String k : nameParts) { + for (String k : tokenParts) { if (!"uni".regionMatches(true, 0, k, 0, 3)) { universitySB.append(k); } } university = universitySB.toString(); + // If university is detected than the previous part is suggested + // as department if ((index > 0) && (department == null)) { - department = institutionName[index - 1]; + department = institutionNameTokens[index - 1]; } - + } else if ((tokenTypes.contains(INSTITUTION.SCHOOL) + || tokenTypes.contains(INSTITUTION.DEPARTMENT)) + && institutionNameTokens.length > 1) { // School is an abbreviation of all the words beginning with a // capital letter excluding: department, school and faculty words. - // - // Explicitly defined department part is build the same way as - // school - } else if ((nameTypes.contains(INSTITUTION.SCHOOL) - || nameTypes.contains(INSTITUTION.DEPARTMENT)) - && institutionName.length > 1) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); - for (String k : nameParts) { + for (String k : tokenParts) { if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) && !NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { - if (nameTypes.contains(INSTITUTION.SCHOOL)) { + if (tokenTypes.contains(INSTITUTION.SCHOOL)) { schoolSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } - if (nameTypes.contains(INSTITUTION.DEPARTMENT)) { + // Explicitly defined department part is build the same way as school + if (tokenTypes.contains(INSTITUTION.DEPARTMENT)) { departmentSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } } } - if (nameTypes.contains(INSTITUTION.SCHOOL)) { + if (tokenTypes.contains(INSTITUTION.SCHOOL)) { school = schoolSB.toString(); } - if (nameTypes.contains(INSTITUTION.DEPARTMENT)) { + if (tokenTypes.contains(INSTITUTION.DEPARTMENT)) { department = departmentSB.toString(); } } else if (rest == null) { // A part not matching university, department nor school. - rest = String.join("", nameParts); - if (nameParts.size() >= 3) { + rest = String.join("", tokenParts); + if (tokenParts.size() >= 3) { // If there are more than 3 parts, only keep uppercase characters final int[] codePoints = rest.chars().filter(Character::isUpperCase).toArray(); rest = new String(codePoints, 0, codePoints.length); @@ -1395,7 +1391,7 @@ private static String generateInstitutionKey(String content) { || ((school != null) && department.equals(school)) ? "" : department); } - private static List removeUnnecessaryInstitutionWords(String name) { + private static List getValidInstitutionNameParts(String name) { List nameParts = new ArrayList<>(); List ignore = Arrays.asList("press", "the"); From c3e5f097f843288a4aa38d833062c8384c2880f1 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 11:39:37 -0400 Subject: [PATCH 23/61] Refactor to improve readability and closure --- .../bibtexkeypattern/BracketedPattern.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 8986030f033..c9cd13ecc47 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -48,12 +48,6 @@ public class BracketedPattern { private static final Pattern NOT_STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); - /** Matches "uni" at the start of a string or after a space, case insensitive */ - private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); - /** Matches with "tech", case insensitive */ - private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); - /** Matches with "dep"/"dip"/"lab", case insensitive */ - private static final Pattern DEPARTMENT_OR_LAB_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); /** Matches with "dep"/"dip", case insensitive */ private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); private enum INSTITUTION { @@ -62,10 +56,17 @@ private enum INSTITUTION { UNIVERSITY, TECHNOLOGY; + /** Matches "uni" at the start of a string or after a space, case insensitive */ + private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); + /** Matches with "tech", case insensitive */ + private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); + /** Matches with "dep"/"dip"/"lab", case insensitive */ + private static final Pattern DEPARTMENT_OR_LAB_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); + /** - * Finds which types of institutions have words in common with the given name parts. + * Find which types of institutions have words in common with the given name parts. * @param nameParts a list of words that constitute parts of an institution's name. - * @return + * @return set containing all types that matches */ public static EnumSet findTypes(List nameParts) { EnumSet parts = EnumSet.noneOf(INSTITUTION.class); @@ -1355,7 +1356,8 @@ private static String generateInstitutionKey(String content) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); for (String k : tokenParts) { - if (!DEPARTMENT_PATTERN.matcher(k).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) + if (!DEPARTMENT_PATTERN.matcher(k).matches() + && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) && !"faculty".equalsIgnoreCase(k) && !NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { if (tokenTypes.contains(INSTITUTION.SCHOOL)) { From 5990c2a248f63283cd676449c4f89f63968baf2a Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 12:00:04 -0400 Subject: [PATCH 24/61] Fix JavaDoc Minor typos and the "rest" part is now created differently. --- .../bibtexkeypattern/BracketedPattern.java | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index c9cd13ecc47..58db3d2f206 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1246,8 +1246,8 @@ private static boolean isInstitution(String author) { * *

* An institution name should be inside {} brackets. If the - * institution name also includes its abbreviation this abbreviation should - * be also in {} brackets. For the previous example the value + * institution name includes its abbreviation this abbreviation should + * be in {} brackets. For the previous example the value * should look like: * {The Attributed Graph Grammar System ({AGG})}. *

@@ -1259,15 +1259,15 @@ private static boolean isInstitution(String author) { * *

* If an institution does not include its abbreviation the key should be - * generated form its name in the following way: + * generated from its name in the following way: *

* *

* The institution value can contain: institution name, part of the - * institution, address, etc. Those information should be separated by - * comma. Name of the institution and possible part of the institution - * should be on the beginning, while address and secondary information - * should be on the end. + * institution, address, etc. These values should be comma separated. + * Institution name and possible part of the institution + * should be in the beginning, while address and secondary information + * should be in the end. *

* * Each part is examined separately: @@ -1275,17 +1275,18 @@ private static boolean isInstitution(String author) { *
  • We remove all tokens of a part which are one of the defined ignore * words (the, press), which end with a dot (ltd., co., ...) and which first * character is lowercase (of, on, di, ...).
  • - *
  • We detect a type of the part: university, technology institute, + *
  • We detect the types of the part: university, technology institute, * department, school, rest *
      *
    • University: "Uni[NameOfTheUniversity]"
    • - *
    • Department: will be an abbreviation of all words beginning with the + *
    • Department: If the instituion value contains more than one comma + * separated part, it will be an abbreviation of all words beginning with the * uppercase letter except of words: d[ei]p.*, school, * faculty
    • *
    • School: same as department
    • *
    • Rest: If there are less than 3 tokens in such part than the result - * will be by concatenating those tokens, otherwise the result will be build - * from the first letters of words starting with and uppercase letter.
    • + * is a concatenation of those tokens. Otherwise the result will be built + * from all uppercase letters in the concatenation. *
    * *

    From 0df3cdbdf6730ae2d82c8fb2c0d9e7ca3e3cd683 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 12:02:15 -0400 Subject: [PATCH 25/61] Fix JavaDoc typos --- .../jabref/logic/bibtexkeypattern/BracketedPattern.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 58db3d2f206..36142baf4ed 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1279,10 +1279,10 @@ private static boolean isInstitution(String author) { * department, school, rest *

      *
    • University: "Uni[NameOfTheUniversity]"
    • - *
    • Department: If the instituion value contains more than one comma - * separated part, it will be an abbreviation of all words beginning with the - * uppercase letter except of words: d[ei]p.*, school, - * faculty
    • + *
    • Department: If the institution value contains more than one comma + * separated part, the department will be an abbreviation of all words + * beginning with the uppercase letter except of words: + * d[ei]p.*, school, faculty
    • *
    • School: same as department
    • *
    • Rest: If there are less than 3 tokens in such part than the result * is a concatenation of those tokens. Otherwise the result will be built From f0d9601b9d479a7ec2fb72e4df5ba638f3260fb5 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 17:04:26 -0400 Subject: [PATCH 26/61] Fix preliminary order for authors -> latexfree --- .../gui/maintable/BibEntryTableViewModel.java | 54 ++++++++----------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java index 0c34bf731cf..8491274029b 100644 --- a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java +++ b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java @@ -34,6 +34,7 @@ public class BibEntryTableViewModel { static private final Logger LOGGER = LoggerFactory.getLogger(BibEntryTableViewModel.class); + static private final LatexToUnicodeFormatter LATEXFORMATTER = new LatexToUnicodeFormatter(); private final BibEntry entry; private final BibDatabase database; private final MainTableNameFormatter nameFormatter; @@ -118,41 +119,28 @@ public ObservableValue getFields(OrFields fields) { ObservableValue value = fieldValues.get(fields); if (value != null) { return value; - } else { - value = Bindings.createStringBinding(() -> { - boolean isName = false; - - Optional content = Optional.empty(); - Field anEntry = null; - for (Field field : fields) { - content = entry.getResolvedFieldOrAliasLatexFree(field, database); - if (content.isPresent()) { - anEntry = field; - isName = field.getProperties().contains(FieldProperty.PERSON_NAMES); - break; - } - } - - String result = content.orElse(null); - if (isName) { - String latexFreeBeforeNameFormatter = nameFormatter.formatName(result); - - String unformattedName = entry.getResolvedFieldOrAlias(anEntry, database).orElse(null); - String formattedName = nameFormatter.formatName(unformattedName); - String latexFreeAfterNameFormatter = new LatexToUnicodeFormatter().format(formattedName); + } - if (!latexFreeAfterNameFormatter.equals(latexFreeBeforeNameFormatter)) { - LOGGER.info("latexFreeBeforeNameFormatter = " + latexFreeBeforeNameFormatter); - LOGGER.info("latexFreeAfterNameFormatter = " + latexFreeAfterNameFormatter); - } + value = Bindings.createStringBinding(() -> { + boolean isName = false; - return latexFreeAfterNameFormatter; - } else { - return result; + Optional content = Optional.empty(); + for (Field field : fields) { + content = entry.getResolvedFieldOrAlias(field, database); + if (content.isPresent()) { + isName = field.getProperties().contains(FieldProperty.PERSON_NAMES); + break; } - }, entry.getObservables()); - fieldValues.put(fields, value); - return value; - } + } + + String result = content.orElse(""); + if (isName) { + result = nameFormatter.formatName(result); + result = LATEXFORMATTER.format(result); + } + return result; + }, entry.getObservables()); + fieldValues.put(fields, value); + return value; } } From 6f26a736129aeb2002290cbaa1d65470b314c964 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 19 May 2020 17:12:39 -0400 Subject: [PATCH 27/61] Drop logger --- .../java/org/jabref/gui/maintable/BibEntryTableViewModel.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java index 8491274029b..d643618d7d3 100644 --- a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java +++ b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java @@ -29,11 +29,8 @@ import com.tobiasdiez.easybind.EasyBind; import com.tobiasdiez.easybind.EasyBinding; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class BibEntryTableViewModel { - static private final Logger LOGGER = LoggerFactory.getLogger(BibEntryTableViewModel.class); static private final LatexToUnicodeFormatter LATEXFORMATTER = new LatexToUnicodeFormatter(); private final BibEntry entry; private final BibDatabase database; From 9b717c5b448bb18f26c872bc42207a142d491453 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 20 May 2020 09:45:07 -0400 Subject: [PATCH 28/61] Add convenience methods for cached latexfree names --- .../org/jabref/model/entry/AuthorList.java | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/src/main/java/org/jabref/model/entry/AuthorList.java b/src/main/java/org/jabref/model/entry/AuthorList.java index 6acc67deabb..caa6d5aa36d 100644 --- a/src/main/java/org/jabref/model/entry/AuthorList.java +++ b/src/main/java/org/jabref/model/entry/AuthorList.java @@ -11,6 +11,8 @@ import java.util.WeakHashMap; import java.util.stream.Collectors; +import org.jabref.model.strings.LatexToUnicodeAdapter; + /** * This is an immutable class representing information of either author * or editor field in bibtex record. @@ -125,14 +127,18 @@ public class AuthorList { private final static Collection AVOID_TERMS_IN_LOWER_CASE = Arrays.asList("jr", "sr", "jnr", "snr", "von", "zu", "van", "der"); private final List authors; private final String[] authorsFirstFirst = new String[4]; + private final String[] authorsFirstFirstLatexFree = new String[4]; private final String[] authorsLastOnly = new String[2]; + private final String[] authorsLastOnlyLatexFree = new String[2]; private final String[] authorLastFirstAnds = new String[2]; private final String[] authorsLastFirst = new String[4]; + private final String[] authorsLastFirstLatexFree = new String[4]; private final String[] authorsLastFirstFirstLast = new String[2]; // Variables for storing computed strings, so they only need to be created once: private String authorsNatbib; private String authorsFirstFirstAnds; private String authorsAlph; + private String authorsNatbibLatexFree; /** * Creates a new list of authors. @@ -227,6 +233,15 @@ public static String fixAuthorFirstNameFirstCommas(String authors, boolean abbr, return AuthorList.parse(authors).getAsFirstLastNames(abbr, oxfordComma); } + /** + * This is a convenience method for getAuthorsFirstFirstLatexFree() + * + * @see AuthorList#getAsFirstLastNames + */ + public static String fixAuthorFirstNameFirstCommasLatexFree(String authors, boolean abbr, boolean oxfordComma) { + return AuthorList.parse(authors).getAsFirstLastNamesLatexFree(abbr, oxfordComma); + } + /** * This is a convenience method for getAuthorsFirstFirstAnds() * @@ -245,6 +260,15 @@ public static String fixAuthorLastNameFirstCommas(String authors, boolean abbr, return AuthorList.parse(authors).getAsLastFirstNames(abbr, oxfordComma); } + /** + * This is a convenience method for getAuthorsLastFirstLatexFree() + * + * @see AuthorList#getAsLastFirstNames + */ + public static String fixAuthorLastNameFirstCommasLatexFree(String authors, boolean abbr, boolean oxfordComma) { + return AuthorList.parse(authors).getAsLastFirstNamesLatexFree(abbr, oxfordComma); + } + /** * This is a convenience method for getAuthorsLastFirstAnds(true) * @@ -272,6 +296,15 @@ public static String fixAuthorLastNameOnlyCommas(String authors, boolean oxfordC return AuthorList.parse(authors).getAsLastNames(oxfordComma); } + /** + * This is a convenience method for getAuthorsLastOnlyLatexFree() + * + * @see AuthorList#getAsLastNames + */ + public static String fixAuthorLastNameOnlyCommasLatexFree(String authors, boolean oxfordComma) { + return AuthorList.parse(authors).getAsLastNamesLatexFree(oxfordComma); + } + /** * This is a convenience method for getAuthorsForAlphabetization() * @@ -290,6 +323,15 @@ public static String fixAuthorNatbib(String authors) { return AuthorList.parse(authors).getAsNatbib(); } + /** + * This is a convenience method for getAuthorsNatbibLatexFree() + * + * @see AuthorList#getAsNatbib + */ + public static String fixAuthorNatbibLatexFree(String authors) { + return AuthorList.parse(authors).getAsNatbibLatexFree(); + } + /** * Builds a new array of strings with stringbuilder. * Regarding to the name affixes. @@ -390,6 +432,15 @@ public String getAsNatbib() { return authorsNatbib; } + public String getAsNatbibLatexFree() { + // Check if we've computed this before: + if (authorsNatbibLatexFree != null) { + return authorsNatbibLatexFree; + } + authorsNatbibLatexFree = LatexToUnicodeAdapter.format(getAsNatbib()); + return authorsNatbibLatexFree; + } + /** * Returns the list of authors separated by commas with last name only; If * the list consists of two or more authors, "and" is inserted before the @@ -437,6 +488,17 @@ public String getAsLastNames(boolean oxfordComma) { return authorsLastOnly[abbrInt]; } + public String getAsLastNamesLatexFree(boolean oxfordComma) { + int abbrInt = oxfordComma ? 0 : 1; + + // Check if we've computed this before: + if (authorsLastOnlyLatexFree[abbrInt] != null) { + return authorsLastOnlyLatexFree[abbrInt]; + } + authorsLastOnlyLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsLastNames(oxfordComma)); + return authorsLastOnlyLatexFree[abbrInt]; + } + /** * Returns the list of authors separated by commas with first names after * last name; first names are abbreviated or not depending on parameter. If @@ -489,6 +551,19 @@ public String getAsLastFirstNames(boolean abbreviate, boolean oxfordComma) { return authorsLastFirst[abbrInt]; } + public String getAsLastFirstNamesLatexFree(boolean abbreviate, boolean oxfordComma) { + int abbrInt = abbreviate ? 0 : 1; + abbrInt += oxfordComma ? 0 : 2; + + // Check if we've computed this before: + if (authorsLastFirstLatexFree[abbrInt] != null) { + return authorsLastFirstLatexFree[abbrInt]; + } + + authorsLastFirstLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsLastFirstNames(abbreviate, oxfordComma)); + return authorsLastFirstLatexFree[abbrInt]; + } + @Override public String toString() { return authors.toString(); @@ -592,6 +667,19 @@ public String getAsFirstLastNames(boolean abbr, boolean oxfordComma) { return authorsFirstFirst[abbrInt]; } + public String getAsFirstLastNamesLatexFree(boolean abbr, boolean oxfordComma) { + int abbrInt = abbr ? 0 : 1; + abbrInt += oxfordComma ? 0 : 2; + + // Check if we've computed this before: + if (authorsFirstFirstLatexFree[abbrInt] != null) { + return authorsFirstFirstLatexFree[abbrInt]; + } + + authorsFirstFirstLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsFirstLastNames(abbr, oxfordComma)); + return authorsFirstFirstLatexFree[abbrInt]; + } + /** * Compare this object with the given one. *

      From 5ed9c54abbac1b632d7500e78cda8649268e6b6f Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 20 May 2020 09:48:04 -0400 Subject: [PATCH 29/61] Add name format method for names containing latex --- .../gui/maintable/MainTableNameFormatter.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java index 741c0027c66..43b5f8900ae 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java @@ -19,6 +19,31 @@ public class MainTableNameFormatter { abbrAuthorNames = preferences.getBoolean(JabRefPreferences.ABBR_AUTHOR_NAMES); } + /** + * Format a name field for the table, according to user preferences and with latex expressions translated if + * possible. + * + * @param nameToFormat The contents of the name field. + * @return The formatted name field. + */ + public String formatNameLatexFree(final String nameToFormat) { + if (nameToFormat == null) { + return null; + } + + if (namesAsIs) { + return nameToFormat; + } else if (namesNatbib) { + return AuthorList.fixAuthorNatbibLatexFree(nameToFormat); + } else if (namesLastOnly) { + return AuthorList.fixAuthorLastNameOnlyCommasLatexFree(nameToFormat, false); + } else if (namesFf) { + return AuthorList.fixAuthorFirstNameFirstCommasLatexFree(nameToFormat, abbrAuthorNames, false); + } else { + return AuthorList.fixAuthorLastNameFirstCommasLatexFree(nameToFormat, abbrAuthorNames, false); + } + } + /** * Format a name field for the table, according to user preferences. * From d6e9e7035c198199a0ca4ac7b7adf9d8679ecece Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 20 May 2020 09:51:22 -0400 Subject: [PATCH 30/61] Add call to formatNameLatexFree --- .../org/jabref/gui/maintable/BibEntryTableViewModel.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java index d643618d7d3..be50b59c849 100644 --- a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java +++ b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java @@ -13,7 +13,6 @@ import javafx.beans.value.ObservableValue; import org.jabref.gui.specialfields.SpecialFieldValueViewModel; -import org.jabref.logic.layout.format.LatexToUnicodeFormatter; import org.jabref.model.database.BibDatabase; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -31,7 +30,6 @@ import com.tobiasdiez.easybind.EasyBinding; public class BibEntryTableViewModel { - static private final LatexToUnicodeFormatter LATEXFORMATTER = new LatexToUnicodeFormatter(); private final BibEntry entry; private final BibDatabase database; private final MainTableNameFormatter nameFormatter; @@ -132,8 +130,7 @@ public ObservableValue getFields(OrFields fields) { String result = content.orElse(""); if (isName) { - result = nameFormatter.formatName(result); - result = LATEXFORMATTER.format(result); + result = nameFormatter.formatNameLatexFree(result); } return result; }, entry.getObservables()); From 2dc664de4522dd58c0e427a3c03172a9ebb22134 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 20 May 2020 10:42:58 -0400 Subject: [PATCH 31/61] Fix unclear statement in JavaDoc --- .../org/jabref/logic/bibtexkeypattern/BracketedPattern.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 36142baf4ed..da639e7efdd 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1285,8 +1285,8 @@ private static boolean isInstitution(String author) { * d[ei]p.*, school, faculty

    • *
    • School: same as department
    • *
    • Rest: If there are less than 3 tokens in such part than the result - * is a concatenation of those tokens. Otherwise the result will be built - * from all uppercase letters in the concatenation.
    • + * is a concatenation of those tokens. Otherwise, the result will be built + * from all uppercase letters in the concatenated string. *
    * *

    From f0fd4f1cb84007b0cb7e490313d68b5db217519f Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 20 May 2020 13:47:10 -0400 Subject: [PATCH 32/61] Fix to only keep the first character of each word There are some examples that will turn out wrong if only capital letters are kept, e.g., "iOS Developer University Program". The original problem with "The School of Life" becoming too short is avoided by only removing school/department for names containing two or more ',' separated strings. This will still produce an unexpected result if the address of the institution is part of the authors field --- .../logic/bibtexkeypattern/BracketedPattern.java | 13 +++++++++---- .../bibtexkeypattern/BibtexKeyGeneratorTest.java | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index da639e7efdd..4baed900742 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -11,6 +11,7 @@ import java.util.Scanner; import java.util.StringJoiner; import java.util.StringTokenizer; +import java.util.function.Predicate; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -1377,12 +1378,16 @@ private static String generateInstitutionKey(String content) { department = departmentSB.toString(); } } else if (rest == null) { - // A part not matching university, department nor school. - rest = String.join("", tokenParts); + // A part not matching university, department nor school if (tokenParts.size() >= 3) { - // If there are more than 3 parts, only keep uppercase characters - final int[] codePoints = rest.chars().filter(Character::isUpperCase).toArray(); + // If there are more than 3 parts, only keep the first character of each word + final int[] codePoints = tokenParts.stream() + .filter(Predicate.not(String::isBlank)) + .mapToInt((s) -> s.codePointAt(0)) + .toArray(); rest = new String(codePoints, 0, codePoints.length); + } else { + rest = String.join("", tokenParts); } } } diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 5c61f9c1936..f299a1129ef 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -391,7 +391,7 @@ void generateKeyAbbreviateCorporateAuthorDepartmentWithoutAcademicInstitute() th Optional entry = BibtexParser.singleFromString( "@ARTICLE{null, author={{Department of Localhost NullGenerators}}}", importFormatPreferences, fileMonitor); - assertEquals("DLNG", + assertEquals("DLN", BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } From feebf8152671d0d212c1fbdf0e744fbaefe3f1e9 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 21 May 2020 18:14:36 -0400 Subject: [PATCH 33/61] Add latexfree Natbib test cases --- .../jabref/model/entry/AuthorListTest.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 77bb79b5b7d..0d4c70b62c2 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -7,11 +7,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; public class AuthorListTest { + /* + Examples are similar to page 4 in + [BibTeXing by Oren Patashnik](https://ctan.org/tex-archive/biblio/bibtex/contrib/doc/) + */ + private static final String MUHAMMAD_ALKHWARIZMI = "Mu{\\d{h}}ammad al-Khw{\\={a}}rizm{\\={i}}"; + private static final String CORRADO_BOHM = "Corrado B{\\\"o}hm"; + private static final String KURT_GODEL = "Kurt G{\\\"{o}}del"; + private static final String BANU_MOSA = "{The Ban\\={u} M\\={u}s\\={a} brothers}"; + public static int size(String bibtex) { return AuthorList.parse(bibtex).getNumberOfAuthors(); } @@ -31,6 +41,70 @@ public void testFixAuthorNatbib() { .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter"))); } + @Test + public void fixAuthorNatbibLatexNullAuthorStringThrowsException() { + assertThrows(NullPointerException.class, () -> AuthorList.fixAuthorNatbibLatexFree(null)); + } + + @Test + public void fixAuthorNatbibLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", AuthorList.fixAuthorNatbibLatexFree("")); + } + + @Test + public void fixAuthorNatbibLatexCachesLatexFreeString() { + String cachedString = AuthorList + .fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI); + assertSame(cachedString, AuthorList + .fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeOneAuthorNameFromLatex() { + assertEquals("al-Khwārizmī", + AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeTwoAuthorNamesFromLatex() { + assertEquals("al-Khwārizmī and Böhm", + AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeAuthorEtAlFromLatex() { + assertEquals("al-Khwārizmī et al.", + AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeOneInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeTwoInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA + + " and " + BANU_MOSA)); + } + + @Test + public void fixAuthorNatbibLatexUnicodeMixedAuthorsFromLatex() { + assertEquals("The Banū Mūsā brothers and Böhm", + AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM)); + } + + @Test + public void fixAuthorNatbibLatexOneInstitutionWithParanthesisAtStart() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Micha\\l{}}")); + } + @Test public void testGetAuthorList() { // Test caching in authorCache. From d4c2ce38c48e8af98ecf2a0e70dd763d540a3352 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 21 May 2020 18:17:39 -0400 Subject: [PATCH 34/61] Fix typo in latex-free test cases --- .../org/jabref/model/entry/AuthorListTest.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 0d4c70b62c2..0638842c147 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -42,7 +42,7 @@ public void testFixAuthorNatbib() { } @Test - public void fixAuthorNatbibLatexNullAuthorStringThrowsException() { + public void fixAuthorNatbibLatexFreeNullAuthorStringThrowsException() { assertThrows(NullPointerException.class, () -> AuthorList.fixAuthorNatbibLatexFree(null)); } @@ -52,7 +52,7 @@ public void fixAuthorNatbibLatexFreeEmptyAuthorStringForEmptyInput() { } @Test - public void fixAuthorNatbibLatexCachesLatexFreeString() { + public void fixAuthorNatbibLatexFreeCachesLatexFreeString() { String cachedString = AuthorList .fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI); assertSame(cachedString, AuthorList @@ -60,47 +60,47 @@ public void fixAuthorNatbibLatexCachesLatexFreeString() { } @Test - public void fixAuthorNatbibLatexUnicodeOneAuthorNameFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeOneAuthorNameFromLatex() { assertEquals("al-Khwārizmī", AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI)); } @Test - public void fixAuthorNatbibLatexUnicodeTwoAuthorNamesFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeTwoAuthorNamesFromLatex() { assertEquals("al-Khwārizmī and Böhm", AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI + " and " + CORRADO_BOHM)); } @Test - public void fixAuthorNatbibLatexUnicodeAuthorEtAlFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeAuthorEtAlFromLatex() { assertEquals("al-Khwārizmī et al.", AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI + " and " + CORRADO_BOHM + " and " + KURT_GODEL)); } @Test - public void fixAuthorNatbibLatexUnicodeOneInsitutionNameFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeOneInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers", AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA)); } @Test - public void fixAuthorNatbibLatexUnicodeTwoInsitutionNameFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeTwoInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA + " and " + BANU_MOSA)); } @Test - public void fixAuthorNatbibLatexUnicodeMixedAuthorsFromLatex() { + public void fixAuthorNatbibLatexFreeUnicodeMixedAuthorsFromLatex() { assertEquals("The Banū Mūsā brothers and Böhm", AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA + " and " + CORRADO_BOHM)); } @Test - public void fixAuthorNatbibLatexOneInstitutionWithParanthesisAtStart() { + public void fixAuthorNatbibLatexFreeOneInstitutionWithParanthesisAtStart() { assertEquals("Łukasz Michał", AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Micha\\l{}}")); } From 04abe5e45fa5d01edb2f4c358907759326fa1e14 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 09:08:46 -0400 Subject: [PATCH 35/61] Add Natbib test with escaped brackets --- src/test/java/org/jabref/model/entry/AuthorListTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 0638842c147..536d2a5e19b 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -105,6 +105,12 @@ public void fixAuthorNatbibLatexFreeOneInstitutionWithParanthesisAtStart() { AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Micha\\l{}}")); } + @Test + public void fixAuthorNatbibLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Mic}h{ał", + AuthorList.fixAuthorNatbibLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}")); + } + @Test public void testGetAuthorList() { // Test caching in authorCache. From 3f3ef6270fb4461a92a9cd3de0dc2ddfe4196e11 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 09:26:26 -0400 Subject: [PATCH 36/61] Add Natbib institution test with escaped brackets --- src/test/java/org/jabref/model/entry/AuthorListTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 536d2a5e19b..d90781f15c0 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -111,6 +111,12 @@ public void fixAuthorNatbibLatexFreeAuthorWithEscapedBrackets() { AuthorList.fixAuthorNatbibLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}")); } + @Test + public void fixAuthorNatbibLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}")); + } + @Test public void testGetAuthorList() { // Test caching in authorCache. From f4fbec134bc6de3e3dad7756df021b1b0f49e54d Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 09:43:08 -0400 Subject: [PATCH 37/61] Add test for latex-free comma separated lastnames --- .../jabref/model/entry/AuthorListTest.java | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index d90781f15c0..e083ef7db65 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -366,6 +366,83 @@ public void testFixAuthorLastNameOnlyCommas() { "John von Neumann and John Smith and Black Brown, Peter", true)); } + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeNullAuthorStringThrowsException() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorLastNameOnlyCommasLatexFree(null, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", AuthorList.fixAuthorLastNameOnlyCommasLatexFree("", false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeCachesLatexFreeString() { + String cachedString = AuthorList + .fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false); + assertSame(cachedString, AuthorList + .fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeOneAuthorNameFromLatex() { + assertEquals("al-Khwārizmī", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { + assertEquals("al-Khwārizmī and Böhm", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeThreeUnicodeAuthorsFromLatex() { + assertEquals("al-Khwārizmī, Böhm and Gödel", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + assertEquals("The Banū Mūsā brothers and Böhm", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Mic}h{ał", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", false)); + } + + @Test + public void fixAuthorLastNameOnlyCommasLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", false)); + } + @Test public void testFixAuthorForAlphabetization() { assertEquals("Smith, J.", AuthorList.fixAuthorForAlphabetization("John Smith")); From a256fa810abc0ae03d1175a03b769c9e579fb466 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 10:08:06 -0400 Subject: [PATCH 38/61] Add test for latex-free comma separated first name First name first and abbreviated first name first --- .../jabref/model/entry/AuthorListTest.java | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index e083ef7db65..c737d668b98 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -192,6 +192,166 @@ public void testFixAuthorFirstNameFirstCommas() { "John Peter von Neumann", true, true)); } + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbr() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorFirstNameFirstCommasLatexFree(null, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbr() { + assertEquals("", AuthorList.fixAuthorFirstNameFirstCommasLatexFree("", true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeCachesLatexFreeStringAbbr() { + String cachedString = AuthorList + .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false); + assertSame(cachedString, AuthorList + .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { + assertEquals("M. al-Khwārizmī", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { + assertEquals("M. al-Khwārizmī and C. Böhm", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { + assertEquals("M. al-Khwārizmī, C. Böhm and K. Gödel", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers and C. Böhm", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbr() { + assertEquals("Ł. Mic}h{ał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + true, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeNullAuthorStringThrowsException() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorFirstNameFirstCommasLatexFree(null, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", AuthorList.fixAuthorFirstNameFirstCommasLatexFree("", false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeCachesLatexFreeString() { + String cachedString = AuthorList + .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false); + assertSame(cachedString, AuthorList + .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatex() { + assertEquals("Muḥammad al-Khwārizmī", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { + assertEquals("Muḥammad al-Khwārizmī and Corrado Böhm", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatex() { + assertEquals("Muḥammad al-Khwārizmī, Corrado Böhm and Kurt Gödel", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + assertEquals("The Banū Mūsā brothers and Corrado Böhm", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + false, false)); + } + + @Test + public void fixAuthorFirstNameFirstCommasLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + false, false)); + } + @Test public void testFixAuthorFirstNameFirst() { assertEquals("John Smith", AuthorList.fixAuthorFirstNameFirst("John Smith")); From 4961c534e9feae10a213f82a1a4a1f1c4b058078 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 10:21:17 -0400 Subject: [PATCH 39/61] Add test for latex-free comma separated last name Last name first and abbreviated first names --- .../jabref/model/entry/AuthorListTest.java | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index c737d668b98..4f22289eb21 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -438,6 +438,166 @@ public void testFixAuthorLastNameFirstCommasOxfordComma() { "John Peter von Neumann", true, true)); } + @Test + public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbr() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbr() { + assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringAbbr() { + String cachedString = AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false); + assertSame(cachedString, AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { + assertEquals("al-Khwārizmī, M.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { + assertEquals("al-Khwārizmī, M. and Böhm, C.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { + assertEquals("al-Khwārizmī, M., Böhm, C. and Gödel, K.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers and Böhm, C.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbr() { + assertEquals("Mic}h{ał, Ł.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + true, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsException() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeString() { + String cachedString = AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false); + assertSame(cachedString, AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatex() { + assertEquals("al-Khwārizmī, Muḥammad", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { + assertEquals("al-Khwārizmī, Muḥammad and Böhm, Corrado", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatex() { + assertEquals("al-Khwārizmī, Muḥammad, Böhm, Corrado and Gödel, Kurt", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + assertEquals("The Banū Mūsā brothers and Böhm, Corrado", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Mic}h{ał, Łukasz", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + false, false)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + false, false)); + } + @Test public void testFixAuthorLastNameFirst() { From a443db07282ee198365dc080fdbd3faaca603b1c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 10:46:55 -0400 Subject: [PATCH 40/61] Fix adherence to JavaDoc and readability(?) --- .../bibtexkeypattern/BracketedPattern.java | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 4baed900742..7ead3eba5ae 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -1287,7 +1287,7 @@ private static boolean isInstitution(String author) { *

  • School: same as department
  • *
  • Rest: If there are less than 3 tokens in such part than the result * is a concatenation of those tokens. Otherwise, the result will be built - * from all uppercase letters in the concatenated string.
  • + * from the first letter in each token. * * *

    @@ -1310,8 +1310,11 @@ private static boolean isInstitution(String author) { * */ private static String generateInstitutionKey(String content) { - if (content.isEmpty()) { - return content; + if (content == null) { + return null; + } + if (content.isBlank()) { + return ""; } String result = content; @@ -1358,10 +1361,7 @@ private static String generateInstitutionKey(String content) { StringBuilder schoolSB = new StringBuilder(); StringBuilder departmentSB = new StringBuilder(); for (String k : tokenParts) { - if (!DEPARTMENT_PATTERN.matcher(k).matches() - && !StandardField.SCHOOL.getName().equalsIgnoreCase(k) - && !"faculty".equalsIgnoreCase(k) - && !NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("").isEmpty()) { + if (noOtherInstitutionKeyWord(k)) { if (tokenTypes.contains(INSTITUTION.SCHOOL)) { schoolSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); } @@ -1399,6 +1399,18 @@ private static String generateInstitutionKey(String content) { || ((school != null) && department.equals(school)) ? "" : department); } + /** + * Checks that this is not an institution keyword and has an uppercase first letter, except univ/tech key word. + * @param word to check + * @return + */ + private static boolean noOtherInstitutionKeyWord(String word) { + return !DEPARTMENT_PATTERN.matcher(word).matches() + && !StandardField.SCHOOL.getName().equalsIgnoreCase(word) + && !"faculty".equalsIgnoreCase(word) + && !NOT_STARTING_CAPITAL_PATTERN.matcher(word).replaceAll("").isEmpty(); + } + private static List getValidInstitutionNameParts(String name) { List nameParts = new ArrayList<>(); List ignore = Arrays.asList("press", "the"); From dd492e61922a89717f984e9f00d585d980ab7617 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 14:01:33 -0400 Subject: [PATCH 41/61] Fix readability(?) --- .../bibtexkeypattern/BracketedPattern.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index 7ead3eba5ae..a8b164d0428 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -46,11 +46,11 @@ public class BracketedPattern { private static final int CHARS_OF_FIRST = 5; /** Matches everything that is not an uppercase ASCII letter */ - private static final Pattern NOT_STARTING_CAPITAL_PATTERN = Pattern.compile("[^A-Z]"); + private static final Pattern NOT_CAPITAL_FIRST_CHARACTER = Pattern.compile("[^A-Z]"); /** Matches with "({[A-Z]}+)", which should be used to abbreviate the name of an institution */ - private static final Pattern ABBREVIATION_PATTERN = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); + private static final Pattern ABBREVIATIONS = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); /** Matches with "dep"/"dip", case insensitive */ - private static final Pattern DEPARTMENT_PATTERN = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); + private static final Pattern DEPARTMENTS = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); private enum INSTITUTION { SCHOOL, DEPARTMENT, @@ -58,11 +58,11 @@ private enum INSTITUTION { TECHNOLOGY; /** Matches "uni" at the start of a string or after a space, case insensitive */ - private static final Pattern UNIVERSITY_PATTERN = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); + private static final Pattern UNIVERSITIES = Pattern.compile("^uni.*", Pattern.CASE_INSENSITIVE); /** Matches with "tech", case insensitive */ - private static final Pattern TECHNOLOGY_PATTERN = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); + private static final Pattern TECHNOLOGICAL_INSTITUTES = Pattern.compile("^tech.*", Pattern.CASE_INSENSITIVE); /** Matches with "dep"/"dip"/"lab", case insensitive */ - private static final Pattern DEPARTMENT_OR_LAB_PATTERN = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); + private static final Pattern DEPARTMENTS_OR_LABS = Pattern.compile("^(d[ei]p|lab).*", Pattern.CASE_INSENSITIVE); /** * Find which types of institutions have words in common with the given name parts. @@ -73,13 +73,13 @@ public static EnumSet findTypes(List nameParts) { EnumSet parts = EnumSet.noneOf(INSTITUTION.class); // Deciding about a part type… for (String namePart : nameParts) { - if (UNIVERSITY_PATTERN.matcher(namePart).matches()) { + if (UNIVERSITIES.matcher(namePart).matches()) { parts.add(INSTITUTION.UNIVERSITY); - } else if (TECHNOLOGY_PATTERN.matcher(namePart).matches()) { + } else if (TECHNOLOGICAL_INSTITUTES.matcher(namePart).matches()) { parts.add(INSTITUTION.TECHNOLOGY); } else if (StandardField.SCHOOL.getName().equalsIgnoreCase(namePart)) { parts.add(INSTITUTION.SCHOOL); - } else if (DEPARTMENT_OR_LAB_PATTERN.matcher(namePart).matches()) { + } else if (DEPARTMENTS_OR_LABS.matcher(namePart).matches()) { parts.add(INSTITUTION.DEPARTMENT); } } @@ -1320,7 +1320,7 @@ private static String generateInstitutionKey(String content) { String result = content; result = unifyDiacritics(result); result = result.replaceAll("^\\{", "").replaceAll("}$", ""); - Matcher matcher = ABBREVIATION_PATTERN.matcher(result); + Matcher matcher = ABBREVIATIONS.matcher(result); if (matcher.matches()) { return matcher.group(1); } @@ -1363,11 +1363,11 @@ private static String generateInstitutionKey(String content) { for (String k : tokenParts) { if (noOtherInstitutionKeyWord(k)) { if (tokenTypes.contains(INSTITUTION.SCHOOL)) { - schoolSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); + schoolSB.append(NOT_CAPITAL_FIRST_CHARACTER.matcher(k).replaceAll("")); } // Explicitly defined department part is build the same way as school if (tokenTypes.contains(INSTITUTION.DEPARTMENT)) { - departmentSB.append(NOT_STARTING_CAPITAL_PATTERN.matcher(k).replaceAll("")); + departmentSB.append(NOT_CAPITAL_FIRST_CHARACTER.matcher(k).replaceAll("")); } } } @@ -1405,10 +1405,10 @@ private static String generateInstitutionKey(String content) { * @return */ private static boolean noOtherInstitutionKeyWord(String word) { - return !DEPARTMENT_PATTERN.matcher(word).matches() + return !DEPARTMENTS.matcher(word).matches() && !StandardField.SCHOOL.getName().equalsIgnoreCase(word) && !"faculty".equalsIgnoreCase(word) - && !NOT_STARTING_CAPITAL_PATTERN.matcher(word).replaceAll("").isEmpty(); + && !NOT_CAPITAL_FIRST_CHARACTER.matcher(word).replaceAll("").isEmpty(); } private static List getValidInstitutionNameParts(String name) { From 71e45d48e9b2d4c0ffd997044fc6873094cce19d Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 16:12:33 -0400 Subject: [PATCH 42/61] Fix CheckStyle issues The deprecated static methods BibtexKeyGenerator.generateKey are moved to the test file as a similar convenience method is required for the test cases. Suppress warning has been added for some methods. --- .../BibtexKeyGeneratorTest.java | 180 ++++++++++-------- 1 file changed, 98 insertions(+), 82 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index f299a1129ef..84000073263 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -1,10 +1,12 @@ package org.jabref.logic.bibtexkeypattern; +import java.util.Collections; import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.BibtexParser; +import org.jabref.model.bibtexkeypattern.GlobalBibtexKeyPattern; import org.jabref.model.database.BibDatabase; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -52,17 +54,28 @@ void setUp() { importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); } + static String generateKey(BibEntry entry, String pattern) { + return generateKey(entry, pattern, new BibDatabase()); + } + + static String generateKey(BibEntry entry, String pattern, BibDatabase database) { + GlobalBibtexKeyPattern keyPattern = new GlobalBibtexKeyPattern(Collections.emptyList()); + keyPattern.setDefaultValue("[" + pattern + "]"); + return new BibtexKeyGenerator(keyPattern, database, new BibtexKeyPatternPreferences("", "", false, true, keyPattern, ',', false, DEFAULT_UNWANTED_CHARACTERS)) + .generateKey(entry); + } + @Test void testAndInAuthorName() throws ParseException { Optional entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Simon Holland}}", importFormatPreferences, fileMonitor); assertEquals("Holland", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testCrossrefAndInAuthorNames() throws Exception { + void testCrossrefAndInAuthorNames() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -73,7 +86,7 @@ void testCrossrefAndInAuthorNames() throws Exception { database.insertEntry(entry2); assertEquals("Holland", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "auth", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -82,12 +95,12 @@ void testAndAuthorNames() throws ParseException { String bibtexString = "@ARTICLE{whatevery, author={Mari D. Herland and Mona-Iren Hauge and Ingeborg M. Helgeland}}"; Optional entry = BibtexParser.singleFromString(bibtexString, importFormatPreferences, fileMonitor); assertEquals("HerlandHaugeHelgeland", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "authors3", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "authors3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testCrossrefAndAuthorNames() throws Exception { + void testCrossrefAndAuthorNames() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -98,7 +111,7 @@ void testCrossrefAndAuthorNames() throws Exception { database.insertEntry(entry2); assertEquals("HerlandHaugeHelgeland", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "authors3", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "authors3", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -107,7 +120,7 @@ void testSpecialLatexCharacterInAuthorName() throws ParseException { Optional entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Simon Popovi\\v{c}ov\\'{a}}}", importFormatPreferences, fileMonitor); assertEquals("Popovicova", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @@ -121,73 +134,73 @@ void testMakeLabelAndCheckLegalKeys() throws ParseException { Optional entry0 = BibtexParser.singleFromString( "@ARTICLE{kohn, author={Andreas Köning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Koe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Áöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Aoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Éöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Eoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Íöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Ioe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ĺöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Loe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ńöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Noe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Óöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Ooe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ŕöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Roe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Śöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Soe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Úöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Uoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ýöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Yoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Źöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Zoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @@ -199,57 +212,56 @@ void testMakeLabelAndCheckLegalKeysAccentGrave() throws ParseException { Optional entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Àöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Aoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Èöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Eoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ìöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Ioe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Òöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Ooe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andreas Ùöning}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Uoe", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Oraib Al-Ketan}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("AlK", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés D'Alessandro}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("DAl", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); entry0 = BibtexParser.singleFromString("@ARTICLE{kohn, author={Andrés Aʹrnold}, year={2000}}", importFormatPreferences, fileMonitor); assertEquals("Arn", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry0.get(), "auth3", + BibtexKeyGenerator.cleanKey(generateKey(entry0.orElse(null), "auth3", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } /** - * Tests if checkLegalKey replaces Non-ASCII chars. There are quite a few chars that should be replaced. Perhaps + * Tests if cleanKey replaces Non-ASCII chars. There are quite a few chars that should be replaced. Perhaps * there is a better method than the current. - * - * @see BibtexKeyGenerator#checkLegalKey(String) + * @see BibtexKeyGenerator#cleanKey(String, String) */ @Test void testCheckLegalKey() { @@ -330,12 +342,12 @@ void testUniversity() throws ParseException { Optional entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University}}}", importFormatPreferences, fileMonitor); assertEquals("UniLinkoeping", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testcrossrefUniversity() throws Exception { + void testcrossrefUniversity() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -346,7 +358,7 @@ void testcrossrefUniversity() throws Exception { database.insertEntry(entry2); assertEquals("UniLinkoeping", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "auth", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -356,12 +368,12 @@ void testDepartment() throws ParseException { "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University, Department of Electrical Engineering}}}", importFormatPreferences, fileMonitor); assertEquals("UniLinkoepingEE", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testcrossrefDepartment() throws Exception { + void testcrossrefDepartment() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -372,7 +384,7 @@ void testcrossrefDepartment() throws Exception { database.insertEntry(entry2); assertEquals("UniLinkoepingEE", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "auth", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -382,7 +394,7 @@ void testSchool() throws ParseException { "@ARTICLE{kohn, author={{Link{\\\"{o}}ping University, School of Computer Engineering}}}", importFormatPreferences, fileMonitor); assertEquals("UniLinkoepingCE", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @@ -392,7 +404,7 @@ void generateKeyAbbreviateCorporateAuthorDepartmentWithoutAcademicInstitute() th "@ARTICLE{null, author={{Department of Localhost NullGenerators}}}", importFormatPreferences, fileMonitor); assertEquals("DLN", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @@ -402,12 +414,12 @@ void generateKeyAbbreviateCorporateAuthorSchoolWithoutAcademicInstitute() throws "@ARTICLE{null, author={{The School of Null}}}", importFormatPreferences, fileMonitor); assertEquals("SchoolNull", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testcrossrefSchool() throws Exception { + void testcrossrefSchool() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -418,7 +430,7 @@ void testcrossrefSchool() throws Exception { database.insertEntry(entry2); assertEquals("UniLinkoepingCE", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "auth", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -427,12 +439,12 @@ void testInstituteOfTechnology() throws ParseException { Optional entry = BibtexParser.singleFromString( "@ARTICLE{kohn, author={{Massachusetts Institute of Technology}}}", importFormatPreferences, fileMonitor); assertEquals("MIT", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry.get(), "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry.orElse(null), "auth", new BibDatabase()), DEFAULT_UNWANTED_CHARACTERS)); } @Test - void testcrossrefInstituteOfTechnology() throws Exception { + void testcrossrefInstituteOfTechnology() { BibDatabase database = new BibDatabase(); BibEntry entry1 = new BibEntry(); entry1.setField(StandardField.CROSSREF, "entry2"); @@ -443,7 +455,7 @@ void testcrossrefInstituteOfTechnology() throws Exception { database.insertEntry(entry2); assertEquals("MIT", - BibtexKeyGenerator.cleanKey(BibtexKeyGenerator.generateKey(entry1, "auth", + BibtexKeyGenerator.cleanKey(generateKey(entry1, "auth", database), DEFAULT_UNWANTED_CHARACTERS)); } @@ -729,6 +741,8 @@ void testFirstPage() { assertEquals("43", BibtexKeyGenerator.firstPage("43+")); } + @SuppressWarnings("ConstantConditions") + @Test void testFirstPageNull() { assertThrows(NullPointerException.class, () -> BibtexKeyGenerator.firstPage(null)); } @@ -751,6 +765,7 @@ void testPagePrefix() { assertEquals("", BibtexKeyGenerator.pagePrefix("43+")); } + @SuppressWarnings("ConstantConditions") @Test void testPagePrefixNull() { assertThrows(NullPointerException.class, () -> BibtexKeyGenerator.pagePrefix(null)); @@ -768,6 +783,7 @@ void testLastPage() { assertEquals("43", BibtexKeyGenerator.lastPage("43+")); } + @SuppressWarnings("ConstantConditions") @Test void testLastPageNull() { assertThrows(NullPointerException.class, () -> BibtexKeyGenerator.lastPage(null)); @@ -899,15 +915,15 @@ void keywordNKeywordsSeparatedBySpace() { BibEntry entry = new BibEntry(); entry.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = BibtexKeyGenerator.generateKey(entry, "keyword1"); + String result = generateKey(entry, "keyword1"); assertEquals("w1", result); // check keywords with space - result = BibtexKeyGenerator.generateKey(entry, "keyword2"); + result = generateKey(entry, "keyword2"); assertEquals("w2aw2b", result); // check out of range - result = BibtexKeyGenerator.generateKey(entry, "keyword4"); + result = generateKey(entry, "keyword4"); assertEquals("", result); } @@ -922,7 +938,7 @@ void crossrefkeywordNKeywordsSeparatedBySpace() { database.insertEntry(entry1); entry2.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = BibtexKeyGenerator.generateKey(entry1, "keyword1", database); + String result = generateKey(entry1, "keyword1", database); assertEquals("w1", result); } @@ -933,15 +949,15 @@ void keywordsNKeywordsSeparatedBySpace() { entry.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); // all keywords - String result = BibtexKeyGenerator.generateKey(entry, "keywords"); + String result = generateKey(entry, "keywords"); assertEquals("w1w2aw2bw3", result); // check keywords with space - result = BibtexKeyGenerator.generateKey(entry, "keywords2"); + result = generateKey(entry, "keywords2"); assertEquals("w1w2aw2b", result); // check out of range - result = BibtexKeyGenerator.generateKey(entry, "keywords55"); + result = generateKey(entry, "keywords55"); assertEquals("w1w2aw2bw3", result); } @@ -956,7 +972,7 @@ void crossrefkeywordsNKeywordsSeparatedBySpace() { database.insertEntry(entry1); entry2.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = BibtexKeyGenerator.generateKey(entry1, "keywords", database); + String result = generateKey(entry1, "keywords", database); assertEquals("w1w2aw2bw3", result); } @@ -985,8 +1001,8 @@ void testCheckLegalNullInNullOut() { void testApplyModifiers() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "Green Scheduling of Whatever"); - assertEquals("GSo", BibtexKeyGenerator.generateKey(entry, "shorttitleINI")); - assertEquals("GreenSchedulingWhatever", BibtexKeyGenerator.generateKey(entry, "shorttitle", + assertEquals("GSo", generateKey(entry, "shorttitleINI")); + assertEquals("GreenSchedulingWhatever", generateKey(entry, "shorttitle", new BibDatabase())); } @@ -1001,7 +1017,7 @@ void testcrossrefShorttitle() { database.insertEntry(entry1); entry2.setField(StandardField.TITLE, "Green Scheduling of Whatever"); - assertEquals("GreenSchedulingWhatever", BibtexKeyGenerator.generateKey(entry1, "shorttitle", + assertEquals("GreenSchedulingWhatever", generateKey(entry1, "shorttitle", database)); } @@ -1016,105 +1032,105 @@ void testcrossrefShorttitleInitials() { database.insertEntry(entry1); entry2.setField(StandardField.TITLE, "Green Scheduling of Whatever"); - assertEquals("GSo", BibtexKeyGenerator.generateKey(entry1, "shorttitleINI", database)); + assertEquals("GSo", generateKey(entry1, "shorttitleINI", database)); } @Test - void generateKeyStripsColonFromTitle() throws Exception { + void generateKeyStripsColonFromTitle() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "Green Scheduling of: Whatever"); - assertEquals("GreenSchedulingOfWhatever", BibtexKeyGenerator.generateKey(entry, "title")); + assertEquals("GreenSchedulingOfWhatever", generateKey(entry, "title")); } @Test - void generateKeyStripsApostropheFromTitle() throws Exception { + void generateKeyStripsApostropheFromTitle() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "Green Scheduling of `Whatever`"); - assertEquals("GreenSchedulingofWhatever", BibtexKeyGenerator.generateKey(entry, "title")); + assertEquals("GreenSchedulingofWhatever", generateKey(entry, "title")); } @Test - void generateKeyWithOneModifier() throws Exception { + void generateKeyWithOneModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("theinterestingtitle", BibtexKeyGenerator.generateKey(entry, "title:lower")); + assertEquals("theinterestingtitle", generateKey(entry, "title:lower")); } @Test - void generateKeyWithTwoModifiers() throws Exception { + void generateKeyWithTwoModifiers() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "The Interesting Title"); - assertEquals("theinterestingtitle", BibtexKeyGenerator.generateKey(entry, "title:lower:(_)")); + assertEquals("theinterestingtitle", generateKey(entry, "title:lower:(_)")); } @Test - void generateKeyWithTitleCapitalizeModifier() throws Exception { + void generateKeyWithTitleCapitalizeModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "the InTeresting title longer than THREE words"); - assertEquals("TheInterestingTitleLongerThanThreeWords", BibtexKeyGenerator.generateKey(entry, "title:capitalize")); + assertEquals("TheInterestingTitleLongerThanThreeWords", generateKey(entry, "title:capitalize")); } @Test - void generateKeyWithShortTitleCapitalizeModifier() throws Exception { + void generateKeyWithShortTitleCapitalizeModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "the InTeresting title longer than THREE words"); - assertEquals("InterestingTitleLonger", BibtexKeyGenerator.generateKey(entry, "shorttitle:capitalize")); + assertEquals("InterestingTitleLonger", generateKey(entry, "shorttitle:capitalize")); } @Test - void generateKeyWithTitleTitleCaseModifier() throws Exception { + void generateKeyWithTitleTitleCaseModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "A title WITH some of The key words"); - assertEquals("ATitlewithSomeoftheKeyWords", BibtexKeyGenerator.generateKey(entry, "title:titlecase")); + assertEquals("ATitlewithSomeoftheKeyWords", generateKey(entry, "title:titlecase")); } @Test - void generateKeyWithShortTitleTitleCaseModifier() throws Exception { + void generateKeyWithShortTitleTitleCaseModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "the InTeresting title longer than THREE words"); - assertEquals("InterestingTitleLonger", BibtexKeyGenerator.generateKey(entry, "shorttitle:titlecase")); + assertEquals("InterestingTitleLonger", generateKey(entry, "shorttitle:titlecase")); } @Test - void generateKeyWithTitleSentenceCaseModifier() throws Exception { + void generateKeyWithTitleSentenceCaseModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.TITLE, "A title WITH some of The key words"); - assertEquals("Atitlewithsomeofthekeywords", BibtexKeyGenerator.generateKey(entry, "title:sentencecase")); + assertEquals("Atitlewithsomeofthekeywords", generateKey(entry, "title:sentencecase")); } @Test - void generateKeyWithAuthUpperYearShortTitleCapitalizeModifier() throws Exception { + void generateKeyWithAuthUpperYearShortTitleCapitalizeModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.AUTHOR, AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1); entry.setField(StandardField.YEAR, "2019"); entry.setField(StandardField.TITLE, "the InTeresting title longer than THREE words"); - assertEquals("NEWTON2019InterestingTitleLonger", BibtexKeyGenerator.generateKey(entry, "[auth:upper][year][shorttitle:capitalize]")); + assertEquals("NEWTON2019InterestingTitleLonger", generateKey(entry, "[auth:upper][year][shorttitle:capitalize]")); } @Test - void generateKeyWithYearAuthUpperTitleSentenceCaseModifier() throws Exception { + void generateKeyWithYearAuthUpperTitleSentenceCaseModifier() { BibEntry entry = new BibEntry(); entry.setField(StandardField.AUTHOR, AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_3); entry.setField(StandardField.YEAR, "2019"); entry.setField(StandardField.TITLE, "the InTeresting title longer than THREE words"); - assertEquals("NewtonMaxwellEtAl_2019_TheInterestingTitleLongerThanThreeWords", BibtexKeyGenerator.generateKey(entry, "[authors2]_[year]_[title:capitalize]")); + assertEquals("NewtonMaxwellEtAl_2019_TheInterestingTitleLongerThanThreeWords", generateKey(entry, "[authors2]_[year]_[title:capitalize]")); } @Test - void generateKeyWithMinusInCitationStyleOutsideAField() throws Exception { + void generateKeyWithMinusInCitationStyleOutsideAField() { BibEntry entry = new BibEntry(); entry.setField(StandardField.AUTHOR, AUTHOR_STRING_FIRSTNAME_FULL_LASTNAME_FULL_COUNT_1); entry.setField(StandardField.YEAR, "2019"); - assertEquals("Newton-2019", BibtexKeyGenerator.generateKey(entry, "[auth]-[year]")); + assertEquals("Newton-2019", generateKey(entry, "[auth]-[year]")); } @Test - void generateKeyWithWithFirstNCharacters() throws Exception { + void generateKeyWithWithFirstNCharacters() { BibEntry entry = new BibEntry(); entry.setField(StandardField.AUTHOR, "Newton, Isaac"); entry.setField(StandardField.YEAR, "2019"); - assertEquals("newt-2019", BibtexKeyGenerator.generateKey(entry, "[auth4:lower]-[year]")); + assertEquals("newt-2019", generateKey(entry, "[auth4:lower]-[year]")); } } From 3b0dda3af6bd2d3ea90dad99f73c0377d1af603c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 16:29:55 -0400 Subject: [PATCH 43/61] Fix CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 48e1767b555..21ec09e3464 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -71,6 +71,8 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We fixed an issue where brackets in regular expressions were not working. [6469](https://github.com/JabRef/jabref/pull/6469) - We fixed an issue where LaTeX citations for specific commands (\autocites) of biblatex-mla were not recognized. [#6476](https://github.com/JabRef/jabref/issues/6476) - We fixed an issue where drag and drop was not working on empty database. [#6487](https://github.com/JabRef/jabref/issues/6487) +- We fixed an issue where "null" appeared in generated bibtex keys. [#6459](https://github.com/JabRef/jabref/issues/6459) +- We fixed an issue where authors' name were incorrectly displayed in the authors column when they were bracketed. [#6465](https://github.com/JabRef/jabref/issues/6465) [#6459](https://github.com/JabRef/jabref/issues/6459) ### Removed From 78b66f7d9206224c7b48f70baee1219eeed7e6d4 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Fri, 22 May 2020 16:45:20 -0400 Subject: [PATCH 44/61] Fix mistake in BibtexKeyGeneratorTest generateKey was not copy-pasted properly. --- .../bibtexkeypattern/BibtexKeyGeneratorTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 84000073263..02fe88f2a07 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -61,8 +61,18 @@ static String generateKey(BibEntry entry, String pattern) { static String generateKey(BibEntry entry, String pattern, BibDatabase database) { GlobalBibtexKeyPattern keyPattern = new GlobalBibtexKeyPattern(Collections.emptyList()); keyPattern.setDefaultValue("[" + pattern + "]"); - return new BibtexKeyGenerator(keyPattern, database, new BibtexKeyPatternPreferences("", "", false, true, keyPattern, ',', false, DEFAULT_UNWANTED_CHARACTERS)) - .generateKey(entry); + BibtexKeyPatternPreferences patternPreferences = new BibtexKeyPatternPreferences( + false, + false, + false, + BibtexKeyPatternPreferences.KeySuffix.SECOND_WITH_A, + "", + "", + DEFAULT_UNWANTED_CHARACTERS, + keyPattern, + ','); + + return new BibtexKeyGenerator(keyPattern, database, patternPreferences).generateKey(entry); } @Test From 55ef8e7bede442fe2de7ab5c453d067205e0befc Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Sun, 24 May 2020 10:40:59 -0400 Subject: [PATCH 45/61] Add test for oxford comma --- .../jabref/model/entry/AuthorListTest.java | 160 ++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 4f22289eb21..7941b0c84df 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -598,6 +598,166 @@ public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBrack false, false)); } + @Test + public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbrOxfordComma() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbrOxfordComma() { + assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringAbbrOxfordComma() { + String cachedString = AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true); + assertSame(cachedString, AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbrOxfordComma() { + assertEquals("al-Khwārizmī, M.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbrOxfordComma() { + assertEquals("al-Khwārizmī, M. and Böhm, C.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbrOxfordComma() { + assertEquals("al-Khwārizmī, M., Böhm, C., and Gödel, K.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbrOxfordComma() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbrOxfordComma() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbrOxfordComma() { + assertEquals("The Banū Mūsā brothers and Böhm, C.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbrOxfordComma() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbrOxfordComma() { + assertEquals("Mic}h{ał, Ł.", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbrOxfordComma() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + true, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionOxfordComma() { + assertThrows(NullPointerException.class, + () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputOxfordComma() { + assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringOxfordComma() { + String cachedString = AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true); + assertSame(cachedString, AuthorList + .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexOxfordComma() { + assertEquals("al-Khwārizmī, Muḥammad", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexOxfordComma() { + assertEquals("al-Khwārizmī, Muḥammad and Böhm, Corrado", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexOxfordComma() { + assertEquals("al-Khwārizmī, Muḥammad, Böhm, Corrado, and Gödel, Kurt", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI + + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexOxfordComma() { + assertEquals("The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexOxfordComma() { + assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + BANU_MOSA, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexOxfordComma() { + assertEquals("The Banū Mūsā brothers and Böhm, Corrado", + AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA + + " and " + CORRADO_BOHM, false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartOxfordComma() { + assertEquals("Łukasz Michał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", + false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsOxfordComma() { + assertEquals("Mic}h{ał, Łukasz", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", + false, true)); + } + + @Test + public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsOxfordComma() { + assertEquals("Łukasz Mic}h{ał", + AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", + false, true)); + } + @Test public void testFixAuthorLastNameFirst() { From 78fade6b39a45e537932f6ab029795193db7435d Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 09:15:06 -0400 Subject: [PATCH 46/61] Fix miss-capitalization of enum --- .../bibtexkeypattern/BracketedPattern.java | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java index a8b164d0428..d5ca948d037 100644 --- a/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java +++ b/src/main/java/org/jabref/logic/bibtexkeypattern/BracketedPattern.java @@ -51,7 +51,7 @@ public class BracketedPattern { private static final Pattern ABBREVIATIONS = Pattern.compile(".*\\(\\{[A-Z]+}\\).*"); /** Matches with "dep"/"dip", case insensitive */ private static final Pattern DEPARTMENTS = Pattern.compile("^d[ei]p.*", Pattern.CASE_INSENSITIVE); - private enum INSTITUTION { + private enum Institution { SCHOOL, DEPARTMENT, UNIVERSITY, @@ -69,23 +69,23 @@ private enum INSTITUTION { * @param nameParts a list of words that constitute parts of an institution's name. * @return set containing all types that matches */ - public static EnumSet findTypes(List nameParts) { - EnumSet parts = EnumSet.noneOf(INSTITUTION.class); + public static EnumSet findTypes(List nameParts) { + EnumSet parts = EnumSet.noneOf(Institution.class); // Deciding about a part type… for (String namePart : nameParts) { if (UNIVERSITIES.matcher(namePart).matches()) { - parts.add(INSTITUTION.UNIVERSITY); + parts.add(Institution.UNIVERSITY); } else if (TECHNOLOGICAL_INSTITUTES.matcher(namePart).matches()) { - parts.add(INSTITUTION.TECHNOLOGY); + parts.add(Institution.TECHNOLOGY); } else if (StandardField.SCHOOL.getName().equalsIgnoreCase(namePart)) { - parts.add(INSTITUTION.SCHOOL); + parts.add(Institution.SCHOOL); } else if (DEPARTMENTS_OR_LABS.matcher(namePart).matches()) { - parts.add(INSTITUTION.DEPARTMENT); + parts.add(Institution.DEPARTMENT); } } - if (parts.contains(INSTITUTION.TECHNOLOGY)) { - parts.remove(INSTITUTION.UNIVERSITY); // technology institute isn't university :-) + if (parts.contains(Institution.TECHNOLOGY)) { + parts.remove(Institution.UNIVERSITY); // technology institute isn't university :-) } return parts; @@ -1336,9 +1336,9 @@ private static String generateInstitutionKey(String content) { for (int index = 0; index < institutionNameTokens.length; index++) { List tokenParts = getValidInstitutionNameParts(institutionNameTokens[index]); - EnumSet tokenTypes = INSTITUTION.findTypes(tokenParts); + EnumSet tokenTypes = Institution.findTypes(tokenParts); - if (tokenTypes.contains(INSTITUTION.UNIVERSITY)) { + if (tokenTypes.contains(Institution.UNIVERSITY)) { StringBuilder universitySB = new StringBuilder(); // University part looks like: Uni[NameOfTheUniversity] universitySB.append("Uni"); @@ -1353,8 +1353,8 @@ private static String generateInstitutionKey(String content) { if ((index > 0) && (department == null)) { department = institutionNameTokens[index - 1]; } - } else if ((tokenTypes.contains(INSTITUTION.SCHOOL) - || tokenTypes.contains(INSTITUTION.DEPARTMENT)) + } else if ((tokenTypes.contains(Institution.SCHOOL) + || tokenTypes.contains(Institution.DEPARTMENT)) && institutionNameTokens.length > 1) { // School is an abbreviation of all the words beginning with a // capital letter excluding: department, school and faculty words. @@ -1362,19 +1362,19 @@ private static String generateInstitutionKey(String content) { StringBuilder departmentSB = new StringBuilder(); for (String k : tokenParts) { if (noOtherInstitutionKeyWord(k)) { - if (tokenTypes.contains(INSTITUTION.SCHOOL)) { + if (tokenTypes.contains(Institution.SCHOOL)) { schoolSB.append(NOT_CAPITAL_FIRST_CHARACTER.matcher(k).replaceAll("")); } // Explicitly defined department part is build the same way as school - if (tokenTypes.contains(INSTITUTION.DEPARTMENT)) { + if (tokenTypes.contains(Institution.DEPARTMENT)) { departmentSB.append(NOT_CAPITAL_FIRST_CHARACTER.matcher(k).replaceAll("")); } } } - if (tokenTypes.contains(INSTITUTION.SCHOOL)) { + if (tokenTypes.contains(Institution.SCHOOL)) { school = schoolSB.toString(); } - if (tokenTypes.contains(INSTITUTION.DEPARTMENT)) { + if (tokenTypes.contains(Institution.DEPARTMENT)) { department = departmentSB.toString(); } } else if (rest == null) { From 3de984dcfe2956ef77060f47946a1f007cbee3f5 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 14:53:45 -0400 Subject: [PATCH 47/61] Fix fields not displayed latex-free --- .../gui/maintable/BibEntryTableViewModel.java | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java index c4ce59c0a48..91da602cdf7 100644 --- a/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java +++ b/src/main/java/org/jabref/gui/maintable/BibEntryTableViewModel.java @@ -118,22 +118,22 @@ public ObservableValue getFields(OrFields fields) { } value = Bindings.createStringBinding(() -> { - boolean isName = false; - - Optional content = Optional.empty(); for (Field field : fields) { - content = entry.getResolvedFieldOrAlias(field, database); - if (content.isPresent()) { - isName = field.getProperties().contains(FieldProperty.PERSON_NAMES); - break; + if (field.getProperties().contains(FieldProperty.PERSON_NAMES)) { + Optional name = entry.getResolvedFieldOrAlias(field, database); + + if (name.isPresent()) { + return nameFormatter.formatNameLatexFree(name.get()); + } + } else { + Optional content = entry.getResolvedFieldOrAliasLatexFree(field, database); + + if (content.isPresent()) { + return content.get(); + } } } - - String result = content.orElse(""); - if (isName) { - result = nameFormatter.formatNameLatexFree(result); - } - return result; + return ""; }, entry.getObservables()); fieldValues.put(fields, value); return value; From ecac6732788879ed2d2898e48af081fa7397bbfc Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 15:04:30 -0400 Subject: [PATCH 48/61] Fix in-line methods in MainTableNameFormatter --- .../org/jabref/gui/maintable/MainTableNameFormatter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java index 43b5f8900ae..fb0fb985e4a 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java @@ -34,13 +34,13 @@ public String formatNameLatexFree(final String nameToFormat) { if (namesAsIs) { return nameToFormat; } else if (namesNatbib) { - return AuthorList.fixAuthorNatbibLatexFree(nameToFormat); + return AuthorList.parse(nameToFormat).getAsNatbibLatexFree(); } else if (namesLastOnly) { - return AuthorList.fixAuthorLastNameOnlyCommasLatexFree(nameToFormat, false); + return AuthorList.parse(nameToFormat).getAsLastNamesLatexFree(false); } else if (namesFf) { - return AuthorList.fixAuthorFirstNameFirstCommasLatexFree(nameToFormat, abbrAuthorNames, false); + return AuthorList.parse(nameToFormat).getAsFirstLastNamesLatexFree(abbrAuthorNames, false); } else { - return AuthorList.fixAuthorLastNameFirstCommasLatexFree(nameToFormat, abbrAuthorNames, false); + return AuthorList.parse(nameToFormat).getAsLastFirstNamesLatexFree(abbrAuthorNames, false); } } From 1c4928bbd3b3b051943bccd54e3c88c76231b7d4 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 16:24:26 -0400 Subject: [PATCH 49/61] Fix in-line of generateKey() method --- .../BibtexKeyGeneratorTest.java | 26 ++++++------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java index 02fe88f2a07..e7d44365ec2 100644 --- a/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java +++ b/src/test/java/org/jabref/logic/bibtexkeypattern/BibtexKeyGeneratorTest.java @@ -925,16 +925,13 @@ void keywordNKeywordsSeparatedBySpace() { BibEntry entry = new BibEntry(); entry.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = generateKey(entry, "keyword1"); - assertEquals("w1", result); + assertEquals("w1", generateKey(entry, "keyword1")); // check keywords with space - result = generateKey(entry, "keyword2"); - assertEquals("w2aw2b", result); + assertEquals("w2aw2b", generateKey(entry, "keyword2")); // check out of range - result = generateKey(entry, "keyword4"); - assertEquals("", result); + assertEquals("", generateKey(entry, "keyword4")); } @Test @@ -948,9 +945,7 @@ void crossrefkeywordNKeywordsSeparatedBySpace() { database.insertEntry(entry1); entry2.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = generateKey(entry1, "keyword1", database); - - assertEquals("w1", result); + assertEquals("w1", generateKey(entry1, "keyword1", database)); } @Test @@ -959,16 +954,13 @@ void keywordsNKeywordsSeparatedBySpace() { entry.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); // all keywords - String result = generateKey(entry, "keywords"); - assertEquals("w1w2aw2bw3", result); + assertEquals("w1w2aw2bw3", generateKey(entry, "keywords")); // check keywords with space - result = generateKey(entry, "keywords2"); - assertEquals("w1w2aw2b", result); + assertEquals("w1w2aw2b", generateKey(entry, "keywords2")); // check out of range - result = generateKey(entry, "keywords55"); - assertEquals("w1w2aw2bw3", result); + assertEquals("w1w2aw2bw3", generateKey(entry, "keywords55")); } @Test @@ -982,9 +974,7 @@ void crossrefkeywordsNKeywordsSeparatedBySpace() { database.insertEntry(entry1); entry2.setField(StandardField.KEYWORDS, "w1, w2a w2b, w3"); - String result = generateKey(entry1, "keywords", database); - - assertEquals("w1w2aw2bw3", result); + assertEquals("w1w2aw2bw3", generateKey(entry1, "keywords", database)); } @Test From 55f3f1826287d14d73c924719f32c92ad6dde713 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 17:28:40 -0400 Subject: [PATCH 50/61] Fix separating tests into parsing/representation --- .../jabref/model/entry/AuthorListTest.java | 559 ++++++++---------- 1 file changed, 244 insertions(+), 315 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 7941b0c84df..dbc61f70c3c 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -26,6 +26,58 @@ public static int size(String bibtex) { return AuthorList.parse(bibtex).getNumberOfAuthors(); } + private static AuthorList emptyAuthor() { + return AuthorList.parse(""); + } + + private static AuthorList oneAuthorWithLatex() { + return AuthorList.parse(MUHAMMAD_ALKHWARIZMI); + } + + private static AuthorList oneAuthorWithEscapedBrackets() { + return AuthorList.parse("{\\L{}}u\\}kas\\{z Mic\\}h\\{a\\l{}"); + } + + private static AuthorList twoAuthorsWithLatex() { + return AuthorList.parse(MUHAMMAD_ALKHWARIZMI + " and " + CORRADO_BOHM); + } + + private static AuthorList threeAuthorsWithLatex() { + return AuthorList.parse(MUHAMMAD_ALKHWARIZMI + " and " + CORRADO_BOHM + " and " + KURT_GODEL); + } + + private static AuthorList oneInstitutionWithLatex() { + return AuthorList.parse(BANU_MOSA); + } + + private static AuthorList oneInstituteWithEscapedBrackets() { + return AuthorList.parse("{{\\L{}}u\\}kas\\{z Mic\\}h\\{a\\l{}}"); + } + + private static AuthorList oneInstitutionWithParanthesisAtStart() { + return AuthorList.parse("{{\\L{}}ukasz Micha\\l{}}"); + } + + private static AuthorList twoInstitutionsWithLatex() { + return AuthorList.parse(BANU_MOSA + " and " + BANU_MOSA); + } + + private static AuthorList mixedAuthorAndInstituteWithLatex() { + return AuthorList.parse(BANU_MOSA + " and " + CORRADO_BOHM); + } + + @Test + public void parseFirstNameOneAuthorWithLatexAndEscapedBrackets() { + Author author = oneAuthorWithEscapedBrackets().getAuthor(0); + assertEquals("Łu}kas{z", author.getFirst().orElse(null)); + } + + @Test + public void parseLastNameOneAuthorWithLatexAndEscapedBrackets() { + Author author = oneAuthorWithEscapedBrackets().getAuthor(0); + assertEquals("Mic}h{ał", author.getLast().orElse(null)); + } + @Test public void testFixAuthorNatbib() { assertEquals("", AuthorList.fixAuthorNatbib("")); @@ -42,79 +94,68 @@ public void testFixAuthorNatbib() { } @Test - public void fixAuthorNatbibLatexFreeNullAuthorStringThrowsException() { - assertThrows(NullPointerException.class, () -> AuthorList.fixAuthorNatbibLatexFree(null)); - } - - @Test - public void fixAuthorNatbibLatexFreeEmptyAuthorStringForEmptyInput() { - assertEquals("", AuthorList.fixAuthorNatbibLatexFree("")); + public void getAsNatbibLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", emptyAuthor().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeCachesLatexFreeString() { - String cachedString = AuthorList - .fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI); - assertSame(cachedString, AuthorList - .fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI)); + public void getAsNatbibLatexFreeCachesLatexFreeString() { + String cachedString = oneAuthorWithLatex().getAsNatbibLatexFree(); + assertSame(cachedString, oneAuthorWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeOneAuthorNameFromLatex() { + public void getAsNatbibLatexFreeUnicodeOneAuthorNameFromLatex() { assertEquals("al-Khwārizmī", - AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI)); + oneAuthorWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeTwoAuthorNamesFromLatex() { + public void getAsNatbibLatexFreeUnicodeTwoAuthorNamesFromLatex() { assertEquals("al-Khwārizmī and Böhm", - AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM)); + twoAuthorsWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeAuthorEtAlFromLatex() { + public void getAsNatbibLatexFreeUnicodeAuthorEtAlFromLatex() { assertEquals("al-Khwārizmī et al.", - AuthorList.fixAuthorNatbibLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL)); + threeAuthorsWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeOneInsitutionNameFromLatex() { + public void getAsNatbibLatexFreeUnicodeOneInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA)); + oneInstitutionWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeTwoInsitutionNameFromLatex() { + public void getAsNatbibLatexFreeUnicodeTwoInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA - + " and " + BANU_MOSA)); + twoInstitutionsWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeUnicodeMixedAuthorsFromLatex() { + public void getAsNatbibLatexFreeUnicodeMixedAuthorsFromLatex() { assertEquals("The Banū Mūsā brothers and Böhm", - AuthorList.fixAuthorNatbibLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM)); + mixedAuthorAndInstituteWithLatex().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeOneInstitutionWithParanthesisAtStart() { + public void getAsNatbibLatexFreeOneInstitutionWithParanthesisAtStart() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Micha\\l{}}")); + oneInstitutionWithParanthesisAtStart().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeAuthorWithEscapedBrackets() { + public void getAsNatbibLatexFreeAuthorWithEscapedBrackets() { assertEquals("Mic}h{ał", - AuthorList.fixAuthorNatbibLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}")); + oneAuthorWithEscapedBrackets().getAsNatbibLatexFree()); } @Test - public void fixAuthorNatbibLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorNatbibLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}")); + public void getAsNatbibLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łu}kas{z Mic}h{ał", + oneInstituteWithEscapedBrackets().getAsNatbibLatexFree()); } @Test @@ -193,163 +234,132 @@ public void testFixAuthorFirstNameFirstCommas() { } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbr() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorFirstNameFirstCommasLatexFree(null, true, false)); - } - - @Test - public void fixAuthorFirstNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbr() { - assertEquals("", AuthorList.fixAuthorFirstNameFirstCommasLatexFree("", true, false)); + public void getAsFirstLastNamesLatexFreeEmptyAuthorStringForEmptyInputAbbr() { + assertEquals("", emptyAuthor().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeCachesLatexFreeStringAbbr() { - String cachedString = AuthorList - .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false); - assertSame(cachedString, AuthorList - .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + public void getAsFirstLastNamesLatexFreeCachesLatexFreeStringAbbr() { + String cachedString = oneAuthorWithLatex().getAsFirstLastNamesLatexFree(true, false); + assertSame(cachedString, oneAuthorWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { + public void getAsFirstLastNamesLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { assertEquals("M. al-Khwārizmī", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + oneAuthorWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { + public void getAsFirstLastNamesLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { assertEquals("M. al-Khwārizmī and C. Böhm", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, true, false)); + twoAuthorsWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { + public void getAsFirstLastNamesLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { assertEquals("M. al-Khwārizmī, C. Böhm and K. Gödel", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, false)); + threeAuthorsWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { - assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA, true, false)); + public void getAsFirstLastNamesLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { + assertEquals("The Banū Mūsā brothers", oneInstitutionWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { + public void getAsFirstLastNamesLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, true, false)); + twoInstitutionsWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { + public void getAsFirstLastNamesLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { assertEquals("The Banū Mūsā brothers and C. Böhm", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, true, false)); + mixedAuthorAndInstituteWithLatex().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { + public void getAsFirstLastNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - true, false)); + oneInstitutionWithParanthesisAtStart().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbr() { + public void getAsFirstLastNamesLatexFreeAuthorWithEscapedBracketsAbbr() { assertEquals("Ł. Mic}h{ał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - true, false)); - } - - @Test - public void fixAuthorFirstNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - true, false)); + oneAuthorWithEscapedBrackets().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeNullAuthorStringThrowsException() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorFirstNameFirstCommasLatexFree(null, false, false)); + public void getAsFirstLastNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { + assertEquals("Łu}kas{z Mic}h{ał", + oneInstituteWithEscapedBrackets().getAsFirstLastNamesLatexFree(true, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInput() { - assertEquals("", AuthorList.fixAuthorFirstNameFirstCommasLatexFree("", false, false)); + public void getAsFirstLastNamesLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", emptyAuthor().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeCachesLatexFreeString() { - String cachedString = AuthorList - .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false); - assertSame(cachedString, AuthorList - .fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + public void getAsFirstLastNamesLatexFreeCachesLatexFreeString() { + String cachedString = oneAuthorWithLatex().getAsFirstLastNamesLatexFree(false, false); + assertSame(cachedString, oneAuthorWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatex() { + public void getAsFirstLastNamesLatexFreeUnicodeOneAuthorNameFromLatex() { assertEquals("Muḥammad al-Khwārizmī", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + oneAuthorWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { + public void getAsFirstLastNamesLatexFreeUnicodeTwoAuthorNamesFromLatex() { assertEquals("Muḥammad al-Khwārizmī and Corrado Böhm", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, false, false)); + twoAuthorsWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatex() { + public void getAsFirstLastNamesLatexFreeThreeUnicodeAuthorsFromLatex() { assertEquals("Muḥammad al-Khwārizmī, Corrado Böhm and Kurt Gödel", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, false)); + threeAuthorsWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { + public void getAsFirstLastNamesLatexFreeUnicodeOneInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA, false, false)); + oneInstitutionWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + public void getAsFirstLastNamesLatexFreeUnicodeTwoInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, false, false)); + twoInstitutionsWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + public void getAsFirstLastNamesLatexFreeUnicodeMixedAuthorsFromLatex() { assertEquals("The Banū Mūsā brothers and Corrado Böhm", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, false, false)); + mixedAuthorAndInstituteWithLatex().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + public void getAsFirstLastNamesLatexFreeOneInstitutionWithParanthesisAtStart() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - false, false)); + oneInstitutionWithParanthesisAtStart().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - false, false)); + public void getAsFirstLastNamesLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Łu}kas{z Mic}h{ał", + oneAuthorWithEscapedBrackets().getAsFirstLastNamesLatexFree(false, false)); } @Test - public void fixAuthorFirstNameFirstCommasLatexFreeInstituteAuthorWithEscapedBrackets() { + public void getAsFirstLastNamesLatexFreeInstituteAuthorWithEscapedBrackets() { assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorFirstNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - false, false)); + oneInstituteWithEscapedBrackets().getAsFirstLastNamesLatexFree(false, false)); } @Test @@ -439,323 +449,263 @@ public void testFixAuthorLastNameFirstCommasOxfordComma() { } @Test - public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbr() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, true, false)); - } - - @Test - public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbr() { - assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", true, false)); + public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInputAbbr() { + assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringAbbr() { - String cachedString = AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false); - assertSame(cachedString, AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + public void getAsLastFirstNamesLatexFreeCachesLatexFreeStringAbbr() { + String cachedString = oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, false); + assertSame(cachedString, oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeUnicodeOneAuthorNameFromLatexAbbr() { assertEquals("al-Khwārizmī, M.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, false)); + oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoAuthorNamesFromLatexAbbr() { assertEquals("al-Khwārizmī, M. and Böhm, C.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, true, false)); + twoAuthorsWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeThreeUnicodeAuthorsFromLatexAbbr() { assertEquals("al-Khwārizmī, M., Böhm, C. and Gödel, K.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, false)); + threeAuthorsWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeUnicodeOneInsitutionNameFromLatexAbbr() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, true, false)); + oneInstitutionWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoInsitutionNameFromLatexAbbr() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, true, false)); + twoInstitutionsWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { + public void getAsLastFirstNamesLatexFreeUnicodeMixedAuthorsFromLatexAbbr() { assertEquals("The Banū Mūsā brothers and Böhm, C.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, true, false)); + mixedAuthorAndInstituteWithLatex().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { + public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbr() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - true, false)); + oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbr() { + public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsAbbr() { assertEquals("Mic}h{ał, Ł.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - true, false)); - } - - @Test - public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - true, false)); + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsException() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, false, false)); + public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { + assertEquals("Łu}kas{z Mic}h{ał", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInput() { - assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", false, false)); + public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInput() { + assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeString() { - String cachedString = AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false); - assertSame(cachedString, AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + public void getAsLastFirstNamesLatexFreeCachesLatexFreeString() { + String cachedString = oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, false); + assertSame(cachedString, oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatex() { + public void getAsLastFirstNamesLatexFreeUnicodeOneAuthorNameFromLatex() { assertEquals("al-Khwārizmī, Muḥammad", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, false)); + oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoAuthorNamesFromLatex() { assertEquals("al-Khwārizmī, Muḥammad and Böhm, Corrado", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, false, false)); + twoAuthorsWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatex() { + public void getAsLastFirstNamesLatexFreeThreeUnicodeAuthorsFromLatex() { assertEquals("al-Khwārizmī, Muḥammad, Böhm, Corrado and Gödel, Kurt", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, false)); + threeAuthorsWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { + public void getAsLastFirstNamesLatexFreeUnicodeOneInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, false, false)); + oneInstitutionWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, false, false)); + twoInstitutionsWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + public void getAsLastFirstNamesLatexFreeUnicodeMixedAuthorsFromLatex() { assertEquals("The Banū Mūsā brothers and Böhm, Corrado", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, false, false)); + mixedAuthorAndInstituteWithLatex().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStart() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - false, false)); - } - - @Test - public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Mic}h{ał, Łukasz", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - false, false)); + oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - false, false)); + public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBrackets() { + assertEquals("Mic}h{ał, Łu}kas{z", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionAbbrOxfordComma() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, true, true)); + public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łu}kas{z Mic}h{ał", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, false)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputAbbrOxfordComma() { - assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", true, true)); + public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInputAbbrOxfordComma() { + assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringAbbrOxfordComma() { - String cachedString = AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true); - assertSame(cachedString, AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true)); + public void getAsLastFirstNamesLatexFreeCachesLatexFreeStringAbbrOxfordComma() { + String cachedString = oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, true); + assertSame(cachedString, oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeOneAuthorNameFromLatexAbbrOxfordComma() { assertEquals("al-Khwārizmī, M.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, true, true)); + oneAuthorWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoAuthorNamesFromLatexAbbrOxfordComma() { assertEquals("al-Khwārizmī, M. and Böhm, C.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, true, true)); + twoAuthorsWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeThreeUnicodeAuthorsFromLatexAbbrOxfordComma() { assertEquals("al-Khwārizmī, M., Böhm, C., and Gödel, K.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, true, true)); + threeAuthorsWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeOneInsitutionNameFromLatexAbbrOxfordComma() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, true, true)); + oneInstitutionWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoInsitutionNameFromLatexAbbrOxfordComma() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, true, true)); + twoInstitutionsWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeMixedAuthorsFromLatexAbbrOxfordComma() { assertEquals("The Banū Mūsā brothers and Böhm, C.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, true, true)); + mixedAuthorAndInstituteWithLatex().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbrOxfordComma() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - true, true)); + oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsAbbrOxfordComma() { + public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsAbbrOxfordComma() { assertEquals("Mic}h{ał, Ł.", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - true, true)); - } - - @Test - public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsAbbrOxfordComma() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - true, true)); + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeNullAuthorStringThrowsExceptionOxfordComma() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorLastNameFirstCommasLatexFree(null, false, true)); + public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbrOxfordComma() { + assertEquals("Łu}kas{z Mic}h{ał", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeEmptyAuthorStringForEmptyInputOxfordComma() { - assertEquals("", AuthorList.fixAuthorLastNameFirstCommasLatexFree("", false, true)); + public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInputOxfordComma() { + assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeCachesLatexFreeStringOxfordComma() { - String cachedString = AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true); - assertSame(cachedString, AuthorList - .fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true)); + public void getAsLastFirstNamesLatexFreeCachesLatexFreeStringOxfordComma() { + String cachedString = oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, true); + assertSame(cachedString, oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneAuthorNameFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeOneAuthorNameFromLatexOxfordComma() { assertEquals("al-Khwārizmī, Muḥammad", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false, true)); + oneAuthorWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoAuthorNamesFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoAuthorNamesFromLatexOxfordComma() { assertEquals("al-Khwārizmī, Muḥammad and Böhm, Corrado", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, false, true)); + twoAuthorsWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeThreeUnicodeAuthorsFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeThreeUnicodeAuthorsFromLatexOxfordComma() { assertEquals("al-Khwārizmī, Muḥammad, Böhm, Corrado, and Gödel, Kurt", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false, true)); + threeAuthorsWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeOneInsitutionNameFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeOneInsitutionNameFromLatexOxfordComma() { assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA, false, true)); + oneInstitutionWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeTwoInsitutionNameFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeTwoInsitutionNameFromLatexOxfordComma() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, false, true)); + twoInstitutionsWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeUnicodeMixedAuthorsFromLatexOxfordComma() { + public void getAsLastFirstNamesLatexFreeUnicodeMixedAuthorsFromLatexOxfordComma() { assertEquals("The Banū Mūsā brothers and Böhm, Corrado", - AuthorList.fixAuthorLastNameFirstCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, false, true)); + mixedAuthorAndInstituteWithLatex().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeOneInstitutionWithParanthesisAtStartOxfordComma() { + public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartOxfordComma() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", - false, true)); + oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeAuthorWithEscapedBracketsOxfordComma() { - assertEquals("Mic}h{ał, Łukasz", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", - false, true)); + public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsOxfordComma() { + assertEquals("Mic}h{ał, Łu}kas{z", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, true)); } @Test - public void fixAuthorLastNameFirstCommasLatexFreeInstituteAuthorWithEscapedBracketsOxfordComma() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorLastNameFirstCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", - false, true)); + public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsOxfordComma() { + assertEquals("Łu}kas{z Mic}h{ał", + oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, true)); } @Test @@ -847,80 +797,59 @@ public void testFixAuthorLastNameOnlyCommas() { } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeNullAuthorStringThrowsException() { - assertThrows(NullPointerException.class, - () -> AuthorList.fixAuthorLastNameOnlyCommasLatexFree(null, false)); - } - - @Test - public void fixAuthorLastNameOnlyCommasLatexFreeEmptyAuthorStringForEmptyInput() { - assertEquals("", AuthorList.fixAuthorLastNameOnlyCommasLatexFree("", false)); - } - - @Test - public void fixAuthorLastNameOnlyCommasLatexFreeCachesLatexFreeString() { - String cachedString = AuthorList - .fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false); - assertSame(cachedString, AuthorList - .fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false)); + public void getAsLastNamesLatexFreeCachesLatexFreeString() { + String cachedString = oneAuthorWithLatex().getAsLastNamesLatexFree(false); + assertSame(cachedString, oneAuthorWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeOneAuthorNameFromLatex() { - assertEquals("al-Khwārizmī", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI, false)); + public void getAsLastNamesLatexFreeUnicodeOneAuthorNameFromLatex() { + assertEquals("al-Khwārizmī", oneAuthorWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeTwoAuthorNamesFromLatex() { - assertEquals("al-Khwārizmī and Böhm", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM, false)); + public void getAsLastNamesLatexFreeUnicodeTwoAuthorNamesFromLatex() { + assertEquals("al-Khwārizmī and Böhm", twoAuthorsWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeThreeUnicodeAuthorsFromLatex() { - assertEquals("al-Khwārizmī, Böhm and Gödel", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(MUHAMMAD_ALKHWARIZMI - + " and " + CORRADO_BOHM + " and " + KURT_GODEL, false)); + public void getAsLastNamesLatexFreeUnicodeThreeUnicodeAuthorsFromLatex() { + assertEquals("al-Khwārizmī, Böhm and Gödel", threeAuthorsWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeOneInsitutionNameFromLatex() { - assertEquals("The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA, false)); + public void getAsLastNamesLatexFreeUnicodeOneInsitutionNameFromLatex() { + assertEquals("The Banū Mūsā brothers", oneInstitutionWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeTwoInsitutionNameFromLatex() { + public void getAsLastNamesLatexFreeUnicodeTwoInsitutionNameFromLatex() { assertEquals("The Banū Mūsā brothers and The Banū Mūsā brothers", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA - + " and " + BANU_MOSA, false)); + twoInstitutionsWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeUnicodeMixedAuthorsFromLatex() { + public void getAsLastNamesLatexFreeUnicodeMixedAuthorsFromLatex() { assertEquals("The Banū Mūsā brothers and Böhm", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree(BANU_MOSA - + " and " + CORRADO_BOHM, false)); + mixedAuthorAndInstituteWithLatex().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeOneInstitutionWithParanthesisAtStart() { + public void getAsLastNamesLatexFreeOneInstitutionWithParanthesisAtStart() { assertEquals("Łukasz Michał", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{{\\L{}}ukasz Micha\\l{}}", false)); + oneInstitutionWithParanthesisAtStart().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeAuthorWithEscapedBrackets() { + public void getAsLastNamesLatexFreeAuthorWithEscapedBrackets() { assertEquals("Mic}h{ał", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{\\L{}}ukasz Mic\\}h\\{a\\l{}", false)); + oneAuthorWithEscapedBrackets().getAsLastNamesLatexFree(false)); } @Test - public void fixAuthorLastNameOnlyCommasLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łukasz Mic}h{ał", - AuthorList.fixAuthorLastNameOnlyCommasLatexFree("{{\\L{}}ukasz Mic\\}h\\{a\\l{}}", false)); + public void getAsLastNamesLatexFreeInstituteAuthorWithEscapedBrackets() { + assertEquals("Łu}kas{z Mic}h{ał", + oneInstituteWithEscapedBrackets().getAsLastNamesLatexFree(false)); } @Test From e6cda69de72610e492f8623df8d8fd44768fe74c Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 17:32:46 -0400 Subject: [PATCH 51/61] Fix cache check and simplify expressions --- .../jabref/model/entry/AuthorListTest.java | 69 +++++++++---------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index dbc61f70c3c..3cf8b3c1e4b 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -7,6 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -88,9 +89,9 @@ public void testFixAuthorNatbib() { .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter")); // Is not cached! - assertTrue(AuthorList - .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter").equals(AuthorList - .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter"))); + assertSame(AuthorList + .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter"), AuthorList + .fixAuthorNatbib("John von Neumann and John Smith and Black Brown, Peter")); } @Test @@ -163,7 +164,7 @@ public void testGetAuthorList() { // Test caching in authorCache. AuthorList al = AuthorList.parse("John Smith"); assertEquals(al, AuthorList.parse("John Smith")); - assertFalse(al.equals(AuthorList.parse("Smith"))); + assertNotEquals(al, AuthorList.parse("Smith")); } @Test @@ -179,10 +180,9 @@ public void testFixAuthorFirstNameFirstCommas() { false)); // Check caching - assertTrue(AuthorList.fixAuthorFirstNameFirstCommas( - "John von Neumann and John Smith and Black Brown, Peter", true, false).equals( - AuthorList - .fixAuthorFirstNameFirstCommas("John von Neumann and John Smith and Black Brown, Peter", true, false))); + assertEquals(AuthorList.fixAuthorFirstNameFirstCommas( + "John von Neumann and John Smith and Black Brown, Peter", true, false), AuthorList + .fixAuthorFirstNameFirstCommas("John von Neumann and John Smith and Black Brown, Peter", true, false)); assertEquals("John Smith and Peter Black Brown", AuthorList .fixAuthorFirstNameFirstCommas("John Smith and Black Brown, Peter", false, false)); @@ -210,10 +210,9 @@ public void testFixAuthorFirstNameFirstCommas() { true)); // Check caching - assertTrue(AuthorList.fixAuthorFirstNameFirstCommas( - "John von Neumann and John Smith and Black Brown, Peter", true, true).equals( - AuthorList - .fixAuthorFirstNameFirstCommas("John von Neumann and John Smith and Black Brown, Peter", true, true))); + assertEquals(AuthorList.fixAuthorFirstNameFirstCommas( + "John von Neumann and John Smith and Black Brown, Peter", true, true), AuthorList + .fixAuthorFirstNameFirstCommas("John von Neumann and John Smith and Black Brown, Peter", true, true)); assertEquals("John Smith and Peter Black Brown", AuthorList .fixAuthorFirstNameFirstCommas("John Smith and Black Brown, Peter", false, true)); @@ -376,9 +375,9 @@ public void testFixAuthorFirstNameFirst() { .fixAuthorFirstNameFirst("von Last, Jr. III, First")); // Check caching - assertTrue(AuthorList - .fixAuthorFirstNameFirst("John von Neumann and John Smith and Black Brown, Peter").equals(AuthorList - .fixAuthorFirstNameFirst("John von Neumann and John Smith and Black Brown, Peter"))); + assertEquals(AuthorList + .fixAuthorFirstNameFirst("John von Neumann and John Smith and Black Brown, Peter"), AuthorList + .fixAuthorFirstNameFirst("John von Neumann and John Smith and Black Brown, Peter")); } @Test @@ -397,7 +396,7 @@ public void testFixAuthorLastNameFirstCommasNoComma() { // Check caching assertEquals(a, b); - assertTrue(a.equals(b)); + assertSame(a, b); assertEquals("Smith, John and Black Brown, Peter", AuthorList.fixAuthorLastNameFirstCommas("John Smith and Black Brown, Peter", false, false)); @@ -430,7 +429,7 @@ public void testFixAuthorLastNameFirstCommasOxfordComma() { // Check caching assertEquals(a, b); - assertTrue(a.equals(b)); + assertSame(a, b); assertEquals("Smith, John and Black Brown, Peter", AuthorList .fixAuthorLastNameFirstCommas("John Smith and Black Brown, Peter", false, true)); @@ -724,9 +723,9 @@ public void testFixAuthorLastNameFirst() { assertEquals("von Last, Jr, First", AuthorList .fixAuthorLastNameFirst("von Last, Jr ,First")); - assertTrue(AuthorList - .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter").equals(AuthorList - .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter"))); + assertEquals(AuthorList + .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter"), AuthorList + .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter")); // Test Abbreviation == false assertEquals("Smith, John", AuthorList.fixAuthorLastNameFirst("John Smith", false)); @@ -741,10 +740,9 @@ public void testFixAuthorLastNameFirst() { assertEquals("von Last, Jr, First", AuthorList.fixAuthorLastNameFirst( "von Last, Jr ,First", false)); - assertTrue(AuthorList.fixAuthorLastNameFirst( - "John von Neumann and John Smith and Black Brown, Peter", false).equals( - AuthorList - .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter", false))); + assertEquals(AuthorList.fixAuthorLastNameFirst( + "John von Neumann and John Smith and Black Brown, Peter", false), AuthorList + .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter", false)); // Test Abbreviate == true assertEquals("Smith, J.", AuthorList.fixAuthorLastNameFirst("John Smith", true)); @@ -759,10 +757,9 @@ public void testFixAuthorLastNameFirst() { assertEquals("von Last, Jr, F.", AuthorList.fixAuthorLastNameFirst("von Last, Jr ,First", true)); - assertTrue(AuthorList.fixAuthorLastNameFirst( - "John von Neumann and John Smith and Black Brown, Peter", true).equals( - AuthorList - .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter", true))); + assertEquals(AuthorList.fixAuthorLastNameFirst( + "John von Neumann and John Smith and Black Brown, Peter", true), AuthorList + .fixAuthorLastNameFirst("John von Neumann and John Smith and Black Brown, Peter", true)); } @Test @@ -773,10 +770,9 @@ public void testFixAuthorLastNameOnlyCommas() { assertEquals("Smith", AuthorList.fixAuthorLastNameOnlyCommas("John Smith", false)); assertEquals("Smith", AuthorList.fixAuthorLastNameOnlyCommas("Smith, Jr, John", false)); - assertTrue(AuthorList.fixAuthorLastNameOnlyCommas( - "John von Neumann and John Smith and Black Brown, Peter", false).equals( - AuthorList - .fixAuthorLastNameOnlyCommas("John von Neumann and John Smith and Black Brown, Peter", false))); + assertEquals(AuthorList.fixAuthorLastNameOnlyCommas( + "John von Neumann and John Smith and Black Brown, Peter", false), AuthorList + .fixAuthorLastNameOnlyCommas("John von Neumann and John Smith and Black Brown, Peter", false)); assertEquals("von Neumann, Smith and Black Brown", AuthorList .fixAuthorLastNameOnlyCommas( @@ -786,10 +782,9 @@ public void testFixAuthorLastNameOnlyCommas() { assertEquals("Smith", AuthorList.fixAuthorLastNameOnlyCommas("John Smith", true)); assertEquals("Smith", AuthorList.fixAuthorLastNameOnlyCommas("Smith, Jr, John", true)); - assertTrue(AuthorList.fixAuthorLastNameOnlyCommas( - "John von Neumann and John Smith and Black Brown, Peter", true).equals( - AuthorList - .fixAuthorLastNameOnlyCommas("John von Neumann and John Smith and Black Brown, Peter", true))); + assertEquals(AuthorList.fixAuthorLastNameOnlyCommas( + "John von Neumann and John Smith and Black Brown, Peter", true), AuthorList + .fixAuthorLastNameOnlyCommas("John von Neumann and John Smith and Black Brown, Peter", true)); assertEquals("von Neumann, Smith, and Black Brown", AuthorList .fixAuthorLastNameOnlyCommas( @@ -981,7 +976,7 @@ public void testGetAuthorsNatbib() { // Test caching AuthorList al = AuthorList .parse("John von Neumann and John Smith and Black Brown, Peter"); - assertTrue(al.getAsNatbib().equals(al.getAsNatbib())); + assertEquals(al.getAsNatbib(), al.getAsNatbib()); } @Test From 2e120fd8b242958c8da3cc6032c97c5dfc1d66d0 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 17:33:35 -0400 Subject: [PATCH 52/61] Drop inlined methods --- .../org/jabref/model/entry/AuthorList.java | 36 ------------------- 1 file changed, 36 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/AuthorList.java b/src/main/java/org/jabref/model/entry/AuthorList.java index caa6d5aa36d..a88976f779f 100644 --- a/src/main/java/org/jabref/model/entry/AuthorList.java +++ b/src/main/java/org/jabref/model/entry/AuthorList.java @@ -233,15 +233,6 @@ public static String fixAuthorFirstNameFirstCommas(String authors, boolean abbr, return AuthorList.parse(authors).getAsFirstLastNames(abbr, oxfordComma); } - /** - * This is a convenience method for getAuthorsFirstFirstLatexFree() - * - * @see AuthorList#getAsFirstLastNames - */ - public static String fixAuthorFirstNameFirstCommasLatexFree(String authors, boolean abbr, boolean oxfordComma) { - return AuthorList.parse(authors).getAsFirstLastNamesLatexFree(abbr, oxfordComma); - } - /** * This is a convenience method for getAuthorsFirstFirstAnds() * @@ -260,15 +251,6 @@ public static String fixAuthorLastNameFirstCommas(String authors, boolean abbr, return AuthorList.parse(authors).getAsLastFirstNames(abbr, oxfordComma); } - /** - * This is a convenience method for getAuthorsLastFirstLatexFree() - * - * @see AuthorList#getAsLastFirstNames - */ - public static String fixAuthorLastNameFirstCommasLatexFree(String authors, boolean abbr, boolean oxfordComma) { - return AuthorList.parse(authors).getAsLastFirstNamesLatexFree(abbr, oxfordComma); - } - /** * This is a convenience method for getAuthorsLastFirstAnds(true) * @@ -296,15 +278,6 @@ public static String fixAuthorLastNameOnlyCommas(String authors, boolean oxfordC return AuthorList.parse(authors).getAsLastNames(oxfordComma); } - /** - * This is a convenience method for getAuthorsLastOnlyLatexFree() - * - * @see AuthorList#getAsLastNames - */ - public static String fixAuthorLastNameOnlyCommasLatexFree(String authors, boolean oxfordComma) { - return AuthorList.parse(authors).getAsLastNamesLatexFree(oxfordComma); - } - /** * This is a convenience method for getAuthorsForAlphabetization() * @@ -323,15 +296,6 @@ public static String fixAuthorNatbib(String authors) { return AuthorList.parse(authors).getAsNatbib(); } - /** - * This is a convenience method for getAuthorsNatbibLatexFree() - * - * @see AuthorList#getAsNatbib - */ - public static String fixAuthorNatbibLatexFree(String authors) { - return AuthorList.parse(authors).getAsNatbibLatexFree(); - } - /** * Builds a new array of strings with stringbuilder. * Regarding to the name affixes. From 8cc947c23f53087b97a05265a9d735e37cabc689 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Tue, 26 May 2020 17:45:17 -0400 Subject: [PATCH 53/61] Fix most abbreviated abbreviations --- .../org/jabref/model/entry/AuthorList.java | 108 +++++++++--------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/AuthorList.java b/src/main/java/org/jabref/model/entry/AuthorList.java index a88976f779f..e317e93e0d1 100644 --- a/src/main/java/org/jabref/model/entry/AuthorList.java +++ b/src/main/java/org/jabref/model/entry/AuthorList.java @@ -229,8 +229,8 @@ public static AuthorList parse(String authors) { * * @see AuthorList#getAsFirstLastNames */ - public static String fixAuthorFirstNameFirstCommas(String authors, boolean abbr, boolean oxfordComma) { - return AuthorList.parse(authors).getAsFirstLastNames(abbr, oxfordComma); + public static String fixAuthorFirstNameFirstCommas(String authors, boolean abbreviate, boolean oxfordComma) { + return AuthorList.parse(authors).getAsFirstLastNames(abbreviate, oxfordComma); } /** @@ -247,8 +247,8 @@ public static String fixAuthorFirstNameFirst(String authors) { * * @see AuthorList#getAsLastFirstNames */ - public static String fixAuthorLastNameFirstCommas(String authors, boolean abbr, boolean oxfordComma) { - return AuthorList.parse(authors).getAsLastFirstNames(abbr, oxfordComma); + public static String fixAuthorLastNameFirstCommas(String authors, boolean abbreviate, boolean oxfordComma) { + return AuthorList.parse(authors).getAsLastFirstNames(abbreviate, oxfordComma); } /** @@ -424,11 +424,11 @@ public String getAsNatbibLatexFree() { * Oxford comma. */ public String getAsLastNames(boolean oxfordComma) { - int abbrInt = oxfordComma ? 0 : 1; + int abbreviationIndex = oxfordComma ? 0 : 1; // Check if we've computed this before: - if (authorsLastOnly[abbrInt] != null) { - return authorsLastOnly[abbrInt]; + if (authorsLastOnly[abbreviationIndex] != null) { + return authorsLastOnly[abbreviationIndex]; } StringBuilder result = new StringBuilder(); @@ -448,19 +448,19 @@ public String getAsLastNames(boolean oxfordComma) { result.append(getAuthor(i).getLastOnly()); } } - authorsLastOnly[abbrInt] = result.toString(); - return authorsLastOnly[abbrInt]; + authorsLastOnly[abbreviationIndex] = result.toString(); + return authorsLastOnly[abbreviationIndex]; } public String getAsLastNamesLatexFree(boolean oxfordComma) { - int abbrInt = oxfordComma ? 0 : 1; + int abbreviationIndex = oxfordComma ? 0 : 1; // Check if we've computed this before: - if (authorsLastOnlyLatexFree[abbrInt] != null) { - return authorsLastOnlyLatexFree[abbrInt]; + if (authorsLastOnlyLatexFree[abbreviationIndex] != null) { + return authorsLastOnlyLatexFree[abbreviationIndex]; } - authorsLastOnlyLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsLastNames(oxfordComma)); - return authorsLastOnlyLatexFree[abbrInt]; + authorsLastOnlyLatexFree[abbreviationIndex] = LatexToUnicodeAdapter.format(getAsLastNames(oxfordComma)); + return authorsLastOnlyLatexFree[abbreviationIndex]; } /** @@ -486,12 +486,12 @@ public String getAsLastNamesLatexFree(boolean oxfordComma) { * Oxford comma. */ public String getAsLastFirstNames(boolean abbreviate, boolean oxfordComma) { - int abbrInt = abbreviate ? 0 : 1; - abbrInt += oxfordComma ? 0 : 2; + int abbreviationIndex = abbreviate ? 0 : 1; + abbreviationIndex += oxfordComma ? 0 : 2; // Check if we've computed this before: - if (authorsLastFirst[abbrInt] != null) { - return authorsLastFirst[abbrInt]; + if (authorsLastFirst[abbreviationIndex] != null) { + return authorsLastFirst[abbreviationIndex]; } StringBuilder result = new StringBuilder(); @@ -511,21 +511,21 @@ public String getAsLastFirstNames(boolean abbreviate, boolean oxfordComma) { result.append(getAuthor(i).getLastFirst(abbreviate)); } } - authorsLastFirst[abbrInt] = result.toString(); - return authorsLastFirst[abbrInt]; + authorsLastFirst[abbreviationIndex] = result.toString(); + return authorsLastFirst[abbreviationIndex]; } public String getAsLastFirstNamesLatexFree(boolean abbreviate, boolean oxfordComma) { - int abbrInt = abbreviate ? 0 : 1; - abbrInt += oxfordComma ? 0 : 2; + int abbreviationIndex = abbreviate ? 0 : 1; + abbreviationIndex += oxfordComma ? 0 : 2; // Check if we've computed this before: - if (authorsLastFirstLatexFree[abbrInt] != null) { - return authorsLastFirstLatexFree[abbrInt]; + if (authorsLastFirstLatexFree[abbreviationIndex] != null) { + return authorsLastFirstLatexFree[abbreviationIndex]; } - authorsLastFirstLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsLastFirstNames(abbreviate, oxfordComma)); - return authorsLastFirstLatexFree[abbrInt]; + authorsLastFirstLatexFree[abbreviationIndex] = LatexToUnicodeAdapter.format(getAsLastFirstNames(abbreviate, oxfordComma)); + return authorsLastFirstLatexFree[abbreviationIndex]; } @Override @@ -548,22 +548,22 @@ public String toString() { * @return formatted list of authors. */ public String getAsLastFirstNamesWithAnd(boolean abbreviate) { - int abbrInt = abbreviate ? 0 : 1; + int abbreviationIndex = abbreviate ? 0 : 1; // Check if we've computed this before: - if (authorLastFirstAnds[abbrInt] != null) { - return authorLastFirstAnds[abbrInt]; + if (authorLastFirstAnds[abbreviationIndex] != null) { + return authorLastFirstAnds[abbreviationIndex]; } - authorLastFirstAnds[abbrInt] = getAuthors().stream().map(author -> author.getLastFirst(abbreviate)) + authorLastFirstAnds[abbreviationIndex] = getAuthors().stream().map(author -> author.getLastFirst(abbreviate)) .collect(Collectors.joining(" and ")); - return authorLastFirstAnds[abbrInt]; + return authorLastFirstAnds[abbreviationIndex]; } public String getAsLastFirstFirstLastNamesWithAnd(boolean abbreviate) { - int abbrInt = abbreviate ? 0 : 1; + int abbreviationIndex = abbreviate ? 0 : 1; // Check if we've computed this before: - if (authorsLastFirstFirstLast[abbrInt] != null) { - return authorsLastFirstFirstLast[abbrInt]; + if (authorsLastFirstFirstLast[abbreviationIndex] != null) { + return authorsLastFirstFirstLast[abbreviationIndex]; } StringBuilder result = new StringBuilder(); @@ -575,8 +575,8 @@ public String getAsLastFirstFirstLastNamesWithAnd(boolean abbreviate) { } } - authorsLastFirstFirstLast[abbrInt] = result.toString(); - return authorsLastFirstFirstLast[abbrInt]; + authorsLastFirstFirstLast[abbreviationIndex] = result.toString(); + return authorsLastFirstFirstLast[abbreviationIndex]; } /** @@ -594,29 +594,29 @@ public String getAsLastFirstFirstLastNamesWithAnd(boolean abbreviate) { * Smith and P. Black Brown" * * - * @param abbr whether to abbreivate first names. + * @param abbreviate whether to abbreivate first names. * @param oxfordComma Whether to put a comma before the and at the end. * @return formatted list of authors. * @see serial comma for an detailed explaination about the * Oxford comma. */ - public String getAsFirstLastNames(boolean abbr, boolean oxfordComma) { + public String getAsFirstLastNames(boolean abbreviate, boolean oxfordComma) { - int abbrInt = abbr ? 0 : 1; - abbrInt += oxfordComma ? 0 : 2; + int abbreviationIndex = abbreviate ? 0 : 1; + abbreviationIndex += oxfordComma ? 0 : 2; // Check if we've computed this before: - if (authorsFirstFirst[abbrInt] != null) { - return authorsFirstFirst[abbrInt]; + if (authorsFirstFirst[abbreviationIndex] != null) { + return authorsFirstFirst[abbreviationIndex]; } StringBuilder result = new StringBuilder(); if (!isEmpty()) { - result.append(getAuthor(0).getFirstLast(abbr)); + result.append(getAuthor(0).getFirstLast(abbreviate)); int i = 1; while (i < (getNumberOfAuthors() - 1)) { result.append(", "); - result.append(getAuthor(i).getFirstLast(abbr)); + result.append(getAuthor(i).getFirstLast(abbreviate)); i++; } if ((getNumberOfAuthors() > 2) && oxfordComma) { @@ -624,24 +624,24 @@ public String getAsFirstLastNames(boolean abbr, boolean oxfordComma) { } if (getNumberOfAuthors() > 1) { result.append(" and "); - result.append(getAuthor(i).getFirstLast(abbr)); + result.append(getAuthor(i).getFirstLast(abbreviate)); } } - authorsFirstFirst[abbrInt] = result.toString(); - return authorsFirstFirst[abbrInt]; + authorsFirstFirst[abbreviationIndex] = result.toString(); + return authorsFirstFirst[abbreviationIndex]; } - public String getAsFirstLastNamesLatexFree(boolean abbr, boolean oxfordComma) { - int abbrInt = abbr ? 0 : 1; - abbrInt += oxfordComma ? 0 : 2; + public String getAsFirstLastNamesLatexFree(boolean abbreviate, boolean oxfordComma) { + int abbreviationIndex = abbreviate ? 0 : 1; + abbreviationIndex += oxfordComma ? 0 : 2; // Check if we've computed this before: - if (authorsFirstFirstLatexFree[abbrInt] != null) { - return authorsFirstFirstLatexFree[abbrInt]; + if (authorsFirstFirstLatexFree[abbreviationIndex] != null) { + return authorsFirstFirstLatexFree[abbreviationIndex]; } - authorsFirstFirstLatexFree[abbrInt] = LatexToUnicodeAdapter.format(getAsFirstLastNames(abbr, oxfordComma)); - return authorsFirstFirstLatexFree[abbrInt]; + authorsFirstFirstLatexFree[abbreviationIndex] = LatexToUnicodeAdapter.format(getAsFirstLastNames(abbreviate, oxfordComma)); + return authorsFirstFirstLatexFree[abbreviationIndex]; } /** From 2fc9e169282e5f5d9d2b0d1a8b5db452521afac2 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 13:43:56 -0400 Subject: [PATCH 54/61] Drop old formatName method --- .../gui/maintable/MainTableNameFormatter.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java index fb0fb985e4a..1f3803943e3 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java @@ -43,28 +43,4 @@ public String formatNameLatexFree(final String nameToFormat) { return AuthorList.parse(nameToFormat).getAsLastFirstNamesLatexFree(abbrAuthorNames, false); } } - - /** - * Format a name field for the table, according to user preferences. - * - * @param nameToFormat The contents of the name field. - * @return The formatted name field. - */ - public String formatName(final String nameToFormat) { - if (nameToFormat == null) { - return null; - } - - if (namesAsIs) { - return nameToFormat; - } else if (namesNatbib) { - return AuthorList.fixAuthorNatbib(nameToFormat); - } else if (namesLastOnly) { - return AuthorList.fixAuthorLastNameOnlyCommas(nameToFormat, false); - } else if (namesFf) { - return AuthorList.fixAuthorFirstNameFirstCommas(nameToFormat, abbrAuthorNames, false); - } else { - return AuthorList.fixAuthorLastNameFirstCommas(nameToFormat, abbrAuthorNames, false); - } - } } From b4b39937134920e0adc0947d44183fa476190248 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 13:45:23 -0400 Subject: [PATCH 55/61] Refactor formatNameLatexFree The author list parsing is moved outside of the if/else statements --- .../org/jabref/gui/maintable/MainTableNameFormatter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java index 1f3803943e3..287f249a17a 100644 --- a/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java +++ b/src/main/java/org/jabref/gui/maintable/MainTableNameFormatter.java @@ -30,17 +30,18 @@ public String formatNameLatexFree(final String nameToFormat) { if (nameToFormat == null) { return null; } + AuthorList authors = AuthorList.parse(nameToFormat); if (namesAsIs) { return nameToFormat; } else if (namesNatbib) { - return AuthorList.parse(nameToFormat).getAsNatbibLatexFree(); + return authors.getAsNatbibLatexFree(); } else if (namesLastOnly) { - return AuthorList.parse(nameToFormat).getAsLastNamesLatexFree(false); + return authors.getAsLastNamesLatexFree(false); } else if (namesFf) { - return AuthorList.parse(nameToFormat).getAsFirstLastNamesLatexFree(abbrAuthorNames, false); + return authors.getAsFirstLastNamesLatexFree(abbrAuthorNames, false); } else { - return AuthorList.parse(nameToFormat).getAsLastFirstNamesLatexFree(abbrAuthorNames, false); + return authors.getAsLastFirstNamesLatexFree(abbrAuthorNames, false); } } } From 3cb62328bac5bc0dcf48de337de097aee5c54dd9 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 13:48:08 -0400 Subject: [PATCH 56/61] Refactor new parse tests --- .../java/org/jabref/model/entry/AuthorListTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 3cf8b3c1e4b..a57f657a7b5 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -68,15 +68,15 @@ private static AuthorList mixedAuthorAndInstituteWithLatex() { } @Test - public void parseFirstNameOneAuthorWithLatexAndEscapedBrackets() { - Author author = oneAuthorWithEscapedBrackets().getAuthor(0); - assertEquals("Łu}kas{z", author.getFirst().orElse(null)); + public void parseFirstNameOneAuthorWithLatexAndEscapedBrackets() throws Exception { + assertEquals("Łu}kas{z", + oneAuthorWithEscapedBrackets().getAuthor(0).getFirst().orElse(null)); } @Test - public void parseLastNameOneAuthorWithLatexAndEscapedBrackets() { - Author author = oneAuthorWithEscapedBrackets().getAuthor(0); - assertEquals("Mic}h{ał", author.getLast().orElse(null)); + public void parseLastNameOneAuthorWithLatexAndEscapedBrackets() throws Exception { + assertEquals("Mic}h{ał", + oneAuthorWithEscapedBrackets().getAuthor(0).getLast().orElse(null)); } @Test From b3f0d1bbecd6ec1f9de572cb2570b770cd0bd84a Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 17:12:20 -0400 Subject: [PATCH 57/61] Add more parse tests --- .../jabref/model/entry/AuthorListTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index a57f657a7b5..bf3201ff3cf 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -79,6 +79,36 @@ public void parseLastNameOneAuthorWithLatexAndEscapedBrackets() throws Exception oneAuthorWithEscapedBrackets().getAuthor(0).getLast().orElse(null)); } + @Test + public void parseFirstNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("Mu{\\d{h}}ammad", + twoAuthorsWithLatex().getAuthor(0).getFirst().orElse(null)); + } + + @Test + public void parseFirstNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("Corrado", + twoAuthorsWithLatex().getAuthor(1).getFirst().orElse(null)); + } + + @Test + public void parseLastNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("al-Khw{\\={a}}rizm{\\={i}}", + twoAuthorsWithLatex().getAuthor(0).getLast().orElse(null)); + } + + @Test + public void parseLastNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("B{\\\"o}hm", + twoAuthorsWithLatex().getAuthor(1).getLast().orElse(null)); + } + + @Test + public void parseInstitutionAuthorWithLatexNames() throws Exception { + assertEquals("The Ban\\={u} M\\={u}s\\={a} brothers", + oneInstitutionWithLatex().getAuthor(0).getLast().orElse(null)); + } + @Test public void testFixAuthorNatbib() { assertEquals("", AuthorList.fixAuthorNatbib("")); From 5a27bbca52dd44d563d81d876a6f7b22f3a49ad6 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 17:28:28 -0400 Subject: [PATCH 58/61] Drop all test cases containing escaped brackets --- .../jabref/model/entry/AuthorListTest.java | 116 ------------------ 1 file changed, 116 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index bf3201ff3cf..815d4bfc81d 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -35,10 +35,6 @@ private static AuthorList oneAuthorWithLatex() { return AuthorList.parse(MUHAMMAD_ALKHWARIZMI); } - private static AuthorList oneAuthorWithEscapedBrackets() { - return AuthorList.parse("{\\L{}}u\\}kas\\{z Mic\\}h\\{a\\l{}"); - } - private static AuthorList twoAuthorsWithLatex() { return AuthorList.parse(MUHAMMAD_ALKHWARIZMI + " and " + CORRADO_BOHM); } @@ -51,10 +47,6 @@ private static AuthorList oneInstitutionWithLatex() { return AuthorList.parse(BANU_MOSA); } - private static AuthorList oneInstituteWithEscapedBrackets() { - return AuthorList.parse("{{\\L{}}u\\}kas\\{z Mic\\}h\\{a\\l{}}"); - } - private static AuthorList oneInstitutionWithParanthesisAtStart() { return AuthorList.parse("{{\\L{}}ukasz Micha\\l{}}"); } @@ -67,18 +59,6 @@ private static AuthorList mixedAuthorAndInstituteWithLatex() { return AuthorList.parse(BANU_MOSA + " and " + CORRADO_BOHM); } - @Test - public void parseFirstNameOneAuthorWithLatexAndEscapedBrackets() throws Exception { - assertEquals("Łu}kas{z", - oneAuthorWithEscapedBrackets().getAuthor(0).getFirst().orElse(null)); - } - - @Test - public void parseLastNameOneAuthorWithLatexAndEscapedBrackets() throws Exception { - assertEquals("Mic}h{ał", - oneAuthorWithEscapedBrackets().getAuthor(0).getLast().orElse(null)); - } - @Test public void parseFirstNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { assertEquals("Mu{\\d{h}}ammad", @@ -177,18 +157,6 @@ public void getAsNatbibLatexFreeOneInstitutionWithParanthesisAtStart() { oneInstitutionWithParanthesisAtStart().getAsNatbibLatexFree()); } - @Test - public void getAsNatbibLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsNatbibLatexFree()); - } - - @Test - public void getAsNatbibLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łu}kas{z Mic}h{ał", - oneInstituteWithEscapedBrackets().getAsNatbibLatexFree()); - } - @Test public void testGetAuthorList() { // Test caching in authorCache. @@ -314,18 +282,6 @@ public void getAsFirstLastNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbr oneInstitutionWithParanthesisAtStart().getAsFirstLastNamesLatexFree(true, false)); } - @Test - public void getAsFirstLastNamesLatexFreeAuthorWithEscapedBracketsAbbr() { - assertEquals("Ł. Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsFirstLastNamesLatexFree(true, false)); - } - - @Test - public void getAsFirstLastNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { - assertEquals("Łu}kas{z Mic}h{ał", - oneInstituteWithEscapedBrackets().getAsFirstLastNamesLatexFree(true, false)); - } - @Test public void getAsFirstLastNamesLatexFreeEmptyAuthorStringForEmptyInput() { assertEquals("", emptyAuthor().getAsFirstLastNamesLatexFree(false, false)); @@ -379,18 +335,6 @@ public void getAsFirstLastNamesLatexFreeOneInstitutionWithParanthesisAtStart() { oneInstitutionWithParanthesisAtStart().getAsFirstLastNamesLatexFree(false, false)); } - @Test - public void getAsFirstLastNamesLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Łu}kas{z Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsFirstLastNamesLatexFree(false, false)); - } - - @Test - public void getAsFirstLastNamesLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łukasz Mic}h{ał", - oneInstituteWithEscapedBrackets().getAsFirstLastNamesLatexFree(false, false)); - } - @Test public void testFixAuthorFirstNameFirst() { assertEquals("John Smith", AuthorList.fixAuthorFirstNameFirst("John Smith")); @@ -530,18 +474,6 @@ public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbr oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(true, false)); } - @Test - public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsAbbr() { - assertEquals("Mic}h{ał, Ł.", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, false)); - } - - @Test - public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbr() { - assertEquals("Łu}kas{z Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, false)); - } - @Test public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInput() { assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(false, false)); @@ -595,18 +527,6 @@ public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStart() { oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(false, false)); } - @Test - public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Mic}h{ał, Łu}kas{z", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, false)); - } - - @Test - public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łu}kas{z Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, false)); - } - @Test public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInputAbbrOxfordComma() { assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(true, true)); @@ -660,18 +580,6 @@ public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartAbbr oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(true, true)); } - @Test - public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsAbbrOxfordComma() { - assertEquals("Mic}h{ał, Ł.", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, true)); - } - - @Test - public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsAbbrOxfordComma() { - assertEquals("Łu}kas{z Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(true, true)); - } - @Test public void getAsLastFirstNamesLatexFreeEmptyAuthorStringForEmptyInputOxfordComma() { assertEquals("", emptyAuthor().getAsLastFirstNamesLatexFree(false, true)); @@ -725,18 +633,6 @@ public void getAsLastFirstNamesLatexFreeOneInstitutionWithParanthesisAtStartOxfo oneInstitutionWithParanthesisAtStart().getAsLastFirstNamesLatexFree(false, true)); } - @Test - public void getAsLastFirstNamesLatexFreeAuthorWithEscapedBracketsOxfordComma() { - assertEquals("Mic}h{ał, Łu}kas{z", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, true)); - } - - @Test - public void getAsLastFirstNamesLatexFreeInstituteAuthorWithEscapedBracketsOxfordComma() { - assertEquals("Łu}kas{z Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsLastFirstNamesLatexFree(false, true)); - } - @Test public void testFixAuthorLastNameFirst() { @@ -865,18 +761,6 @@ public void getAsLastNamesLatexFreeOneInstitutionWithParanthesisAtStart() { oneInstitutionWithParanthesisAtStart().getAsLastNamesLatexFree(false)); } - @Test - public void getAsLastNamesLatexFreeAuthorWithEscapedBrackets() { - assertEquals("Mic}h{ał", - oneAuthorWithEscapedBrackets().getAsLastNamesLatexFree(false)); - } - - @Test - public void getAsLastNamesLatexFreeInstituteAuthorWithEscapedBrackets() { - assertEquals("Łu}kas{z Mic}h{ał", - oneInstituteWithEscapedBrackets().getAsLastNamesLatexFree(false)); - } - @Test public void testFixAuthorForAlphabetization() { assertEquals("Smith, J.", AuthorList.fixAuthorForAlphabetization("John Smith")); From c7578b37f605085afb23068d4a615435cef661b4 Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 17:31:13 -0400 Subject: [PATCH 59/61] Refactor parse with latex tests Move them close to other parse tests --- .../jabref/model/entry/AuthorListTest.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/test/java/org/jabref/model/entry/AuthorListTest.java b/src/test/java/org/jabref/model/entry/AuthorListTest.java index 815d4bfc81d..eda59858ac6 100644 --- a/src/test/java/org/jabref/model/entry/AuthorListTest.java +++ b/src/test/java/org/jabref/model/entry/AuthorListTest.java @@ -59,36 +59,6 @@ private static AuthorList mixedAuthorAndInstituteWithLatex() { return AuthorList.parse(BANU_MOSA + " and " + CORRADO_BOHM); } - @Test - public void parseFirstNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { - assertEquals("Mu{\\d{h}}ammad", - twoAuthorsWithLatex().getAuthor(0).getFirst().orElse(null)); - } - - @Test - public void parseFirstNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { - assertEquals("Corrado", - twoAuthorsWithLatex().getAuthor(1).getFirst().orElse(null)); - } - - @Test - public void parseLastNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { - assertEquals("al-Khw{\\={a}}rizm{\\={i}}", - twoAuthorsWithLatex().getAuthor(0).getLast().orElse(null)); - } - - @Test - public void parseLastNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { - assertEquals("B{\\\"o}hm", - twoAuthorsWithLatex().getAuthor(1).getLast().orElse(null)); - } - - @Test - public void parseInstitutionAuthorWithLatexNames() throws Exception { - assertEquals("The Ban\\={u} M\\={u}s\\={a} brothers", - oneInstitutionWithLatex().getAuthor(0).getLast().orElse(null)); - } - @Test public void testFixAuthorNatbib() { assertEquals("", AuthorList.fixAuthorNatbib("")); @@ -1135,6 +1105,36 @@ public void parseNameWithBraces() throws Exception { assertEquals(new AuthorList(expected), AuthorList.parse("H{e}lene Fiaux")); } + @Test + public void parseFirstNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("Mu{\\d{h}}ammad", + twoAuthorsWithLatex().getAuthor(0).getFirst().orElse(null)); + } + + @Test + public void parseFirstNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("Corrado", + twoAuthorsWithLatex().getAuthor(1).getFirst().orElse(null)); + } + + @Test + public void parseLastNameFromFirstAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("al-Khw{\\={a}}rizm{\\={i}}", + twoAuthorsWithLatex().getAuthor(0).getLast().orElse(null)); + } + + @Test + public void parseLastNameFromSecondAuthorMultipleAuthorsWithLatexNames() throws Exception { + assertEquals("B{\\\"o}hm", + twoAuthorsWithLatex().getAuthor(1).getLast().orElse(null)); + } + + @Test + public void parseInstitutionAuthorWithLatexNames() throws Exception { + assertEquals("The Ban\\={u} M\\={u}s\\={a} brothers", + oneInstitutionWithLatex().getAuthor(0).getLast().orElse(null)); + } + /** * This tests the issue described at https://github.com/JabRef/jabref/pull/2669#issuecomment-288519458 */ From b8bf4f374d70dedd9036b5f7ad24edf642f36fae Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Wed, 27 May 2020 17:35:08 -0400 Subject: [PATCH 60/61] Fix my own spelling mistakes --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed5e9476b55..5c0d1237af2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -72,8 +72,8 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We fixed an issue where brackets in regular expressions were not working. [6469](https://github.com/JabRef/jabref/pull/6469) - We fixed an issue where LaTeX citations for specific commands (\autocites) of biblatex-mla were not recognized. [#6476](https://github.com/JabRef/jabref/issues/6476) - We fixed an issue where drag and drop was not working on empty database. [#6487](https://github.com/JabRef/jabref/issues/6487) -- We fixed an issue where "null" appeared in generated bibtex keys. [#6459](https://github.com/JabRef/jabref/issues/6459) -- We fixed an issue where authors' name were incorrectly displayed in the authors column when they were bracketed. [#6465](https://github.com/JabRef/jabref/issues/6465) [#6459](https://github.com/JabRef/jabref/issues/6459) +- We fixed an issue where "null" appeared in generated BibTeX keys. [#6459](https://github.com/JabRef/jabref/issues/6459) +- We fixed an issue where the authors' names were incorrectly displayed in the authors' column when they were bracketed. [#6465](https://github.com/JabRef/jabref/issues/6465) [#6459](https://github.com/JabRef/jabref/issues/6459) ### Removed From cc23e29b0c205df2a0f135a80d896cfa4d8cc7ea Mon Sep 17 00:00:00 2001 From: Jonatan Asketorp <2598631+k3KAW8Pnf7mkmdSMPHz27@users.noreply.github.com> Date: Thu, 28 May 2020 10:14:57 -0400 Subject: [PATCH 61/61] Refactor abbreviation name --- src/main/java/org/jabref/model/entry/AuthorList.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/model/entry/AuthorList.java b/src/main/java/org/jabref/model/entry/AuthorList.java index e317e93e0d1..b617b792632 100644 --- a/src/main/java/org/jabref/model/entry/AuthorList.java +++ b/src/main/java/org/jabref/model/entry/AuthorList.java @@ -712,7 +712,7 @@ public String getForAlphabetization() { return authorsAlph; } - public void addAuthor(String first, String firstabbr, String von, String last, String jr) { - authors.add(new Author(first, firstabbr, von, last, jr)); + public void addAuthor(String first, String firstNameAbbreviation, String von, String last, String jr) { + authors.add(new Author(first, firstNameAbbreviation, von, last, jr)); } }