diff --git a/CHANGELOG.md b/CHANGELOG.md index a6ffe9ebcee..e536e03ef78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -61,6 +61,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We fixed an issue where long directory names created from patterns could create an exception. [#3915](https://github.com/JabRef/jabref/issues/3915) - We fixed an issue where sort on numeric cases was broken. [#6349](https://github.com/JabRef/jabref/issues/6349) +- We fixed an issue where year and month fields were not cleared when converting to biblatex [#6224](https://github.com/JabRef/jabref/issues/6224) - We fixed an issue where an "Not on FX thread" exception occured when saving on linux [#6453](https://github.com/JabRef/jabref/issues/6453) - We fixed an issue where the library sort order was lost. [#6091](https://github.com/JabRef/jabref/issues/6091) - We fixed an issue where brackets in regular expressions were not working. [6469](https://github.com/JabRef/jabref/pull/6469) diff --git a/src/main/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanup.java b/src/main/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanup.java index 4d16457b241..006bf203f9e 100644 --- a/src/main/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanup.java +++ b/src/main/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanup.java @@ -3,10 +3,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Optional; import org.jabref.model.FieldChange; import org.jabref.model.cleanup.CleanupJob; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.Date; import org.jabref.model.entry.EntryConverter; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; @@ -39,6 +41,18 @@ public List cleanup(BibEntry entry) { entry.clearField(StandardField.YEAR).ifPresent(changes::add); entry.clearField(StandardField.MONTH).ifPresent(changes::add); }); + } else { + // If the year from date field is filled and equal to year it should be removed the year field + entry.getFieldOrAlias(StandardField.DATE).ifPresent(date -> { + Optional newDate = Date.parse(date); + Optional checkDate = Date.parse(entry.getFieldOrAlias(StandardField.YEAR), + entry.getFieldOrAlias(StandardField.MONTH), Optional.empty()); + + if (checkDate.equals(newDate)) { + entry.clearField(StandardField.YEAR).ifPresent(changes::add); + entry.clearField(StandardField.MONTH).ifPresent(changes::add); + } + }); } return changes; } diff --git a/src/main/java/org/jabref/model/entry/Date.java b/src/main/java/org/jabref/model/entry/Date.java index f9ff71ee645..10d5457a7d8 100644 --- a/src/main/java/org/jabref/model/entry/Date.java +++ b/src/main/java/org/jabref/model/entry/Date.java @@ -40,6 +40,7 @@ public Date(TemporalAccessor date) { * - "dd-MM-yyyy" (covers 15-1-2009) * - "d.M.uuuu" (covers 15.1.2015) * - "uuuu.M.d" (covers 2015.1.15) + * - "MMM, uuuu" (covers Jan, 2020) * The code is essentially taken from http://stackoverflow.com/questions/4024544/how-to-parse-dates-in-multiple-formats-using-simpledateformat. */ public static Optional parse(String dateString) { @@ -54,7 +55,8 @@ public static Optional parse(String dateString) { "MMMM d, uuuu", "MMMM, uuuu", "d.M.uuuu", - "uuuu.M.d", "uuuu"); + "uuuu.M.d", "uuuu", + "MMM, uuuu"); for (String formatString : formatStrings) { try { diff --git a/src/test/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanupTest.java b/src/test/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanupTest.java index b01b798618e..8c215028ba9 100644 --- a/src/test/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanupTest.java +++ b/src/test/java/org/jabref/logic/cleanup/ConvertToBiblatexCleanupTest.java @@ -33,17 +33,59 @@ public void cleanupMovesYearMonthToDate() { } @Test - public void cleanupWithDateAlreadyPresentDoesNothing() { + public void cleanupWithDateAlreadyPresentAndDifferentFromYearDoesNothing() { BibEntry entry = new BibEntry(); entry.setField(StandardField.YEAR, "2011"); entry.setField(StandardField.MONTH, "#jan#"); - entry.setField(StandardField.DATE, "2012"); + entry.setField(StandardField.DATE, "2012-01"); worker.cleanup(entry); assertEquals(Optional.of("2011"), entry.getField(StandardField.YEAR)); assertEquals(Optional.of("#jan#"), entry.getField(StandardField.MONTH)); - assertEquals(Optional.of("2012"), entry.getField(StandardField.DATE)); + assertEquals(Optional.of("2012-01"), entry.getField(StandardField.DATE)); + } + + @Test + public void cleanupWithDateAlreadyPresentAndDifferentFromMonthDoesNothing() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.YEAR, "2011"); + entry.setField(StandardField.MONTH, "#jan#"); + entry.setField(StandardField.DATE, "2011-02"); + + worker.cleanup(entry); + + assertEquals(Optional.of("2011"), entry.getField(StandardField.YEAR)); + assertEquals(Optional.of("#jan#"), entry.getField(StandardField.MONTH)); + assertEquals(Optional.of("2011-02"), entry.getField(StandardField.DATE)); + } + + @Test + public void cleanupWithEmptyDateDoesNothing() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.YEAR, ""); + entry.setField(StandardField.MONTH, ""); + entry.setField(StandardField.DATE, ""); + + worker.cleanup(entry); + + assertEquals(Optional.empty(), entry.getField(StandardField.YEAR)); + assertEquals(Optional.empty(), entry.getField(StandardField.MONTH)); + assertEquals(Optional.empty(), entry.getField(StandardField.DATE)); + } + + @Test + public void cleanupWithDateAlreadyPresentAndEqualsToYearAndMonth() { + BibEntry entry = new BibEntry(); + entry.setField(StandardField.YEAR, "2011"); + entry.setField(StandardField.MONTH, "#jan#"); + entry.setField(StandardField.DATE, "2011-01"); + + worker.cleanup(entry); + + assertEquals(Optional.empty(), entry.getField(StandardField.YEAR)); + assertEquals(Optional.empty(), entry.getField(StandardField.MONTH)); + assertEquals(Optional.of("2011-01"), entry.getField(StandardField.DATE)); } @Test @@ -55,4 +97,5 @@ public void cleanupMovesJournalToJournaltitle() { assertEquals(Optional.empty(), entry.getField(StandardField.JOURNAL)); assertEquals(Optional.of("Best of JabRef"), entry.getField(StandardField.JOURNALTITLE)); } + }