Skip to content

Commit 5680d15

Browse files
authored
Fix mixed CRLF / CR (#8238)
* Remove "% Encoding: UTF8" * Introduce BibWriter * Fixes for the results of the block functionality * The written `.bib` file keeps the newline separator of the loaded `.bib` file * Fix checkstyle * Fix architecture test --> BibDatabase uses Sytem directly * NEWLINE does not need to be altered anymore * Fix obosolte language key * Fix checkstyle * Increase LOOKAHEAD
1 parent c94fa48 commit 5680d15

36 files changed

+604
-456
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve
4242
- We improved the Drag and Drop behavior in the "Customize Entry Types" Dialog [#6338](https://github.com/JabRef/jabref/issues/6338)
4343
- When determining the URL of an ArXiV eprint, the URL now points to the version [#8149](https://github.com/JabRef/jabref/pull/8149)
4444
- We Included all standard fields with citation key when exporting to Old OpenOffice/LibreOffice Calc Format [#8176](https://github.com/JabRef/jabref/pull/8176)
45+
- In case the database is encoded with `UTF8`, the `% Encoding` marker is not written anymore
46+
- The written `.bib` file has the same line endings [#390](https://github.com/koppor/jabref/issues/390)
47+
- The written `.bib` file always has a final line break
48+
- The written `.bib` file keeps the newline separator of the loaded `.bib` file
4549
- We present options to manually enter an article or return to the New Entry menu when the fetcher DOI fails to find an entry for an ID [#7870](https://github.com/JabRef/jabref/issues/7870)
4650
- We trim white space and non-ASCII characters from DOI [#8127](https://github.com/JabRef/jabref/issues/8127)
4751
- The duplicate checker now inspects other fields in case no difference in the required and optional fields are found.

src/jmh/java/org/jabref/benchmarks/Benchmarks.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.util.stream.Collectors;
1010

1111
import org.jabref.gui.Globals;
12+
import org.jabref.logic.exporter.BibWriter;
1213
import org.jabref.logic.exporter.BibtexDatabaseWriter;
1314
import org.jabref.logic.exporter.SavePreferences;
1415
import org.jabref.logic.formatter.bibtexfields.HtmlToLatexFormatter;
@@ -17,6 +18,7 @@
1718
import org.jabref.logic.layout.format.HTMLChars;
1819
import org.jabref.logic.layout.format.LatexToUnicodeFormatter;
1920
import org.jabref.logic.search.SearchQuery;
21+
import org.jabref.logic.util.OS;
2022
import org.jabref.model.database.BibDatabase;
2123
import org.jabref.model.database.BibDatabaseContext;
2224
import org.jabref.model.database.BibDatabaseMode;
@@ -77,7 +79,8 @@ public void init() throws Exception {
7779

7880
private StringWriter getOutputWriter() throws IOException {
7981
StringWriter outputWriter = new StringWriter();
80-
BibtexDatabaseWriter databaseWriter = new BibtexDatabaseWriter(outputWriter, mock(GeneralPreferences.class), mock(SavePreferences.class), new BibEntryTypesManager());
82+
BibWriter bibWriter = new BibWriter(outputWriter, OS.NEWLINE);
83+
BibtexDatabaseWriter databaseWriter = new BibtexDatabaseWriter(bibWriter, mock(GeneralPreferences.class), mock(SavePreferences.class), new BibEntryTypesManager());
8184
databaseWriter.savePartOfDatabase(new BibDatabaseContext(database, new MetaData()), database.getEntries());
8285
return outputWriter;
8386
}

src/main/java/org/jabref/cli/ArgumentProcessor.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.jabref.logic.citationkeypattern.CitationKeyGenerator;
2323
import org.jabref.logic.exporter.AtomicFileWriter;
2424
import org.jabref.logic.exporter.BibDatabaseWriter;
25+
import org.jabref.logic.exporter.BibWriter;
2526
import org.jabref.logic.exporter.BibtexDatabaseWriter;
2627
import org.jabref.logic.exporter.EmbeddedBibFilePdfExporter;
2728
import org.jabref.logic.exporter.Exporter;
@@ -531,7 +532,8 @@ private void saveDatabase(BibDatabase newBase, String subName) {
531532
GeneralPreferences generalPreferences = preferencesService.getGeneralPreferences();
532533
SavePreferences savePreferences = preferencesService.getSavePreferences();
533534
AtomicFileWriter fileWriter = new AtomicFileWriter(Path.of(subName), generalPreferences.getDefaultEncoding());
534-
BibDatabaseWriter databaseWriter = new BibtexDatabaseWriter(fileWriter, generalPreferences, savePreferences, Globals.entryTypesManager);
535+
BibWriter bibWriter = new BibWriter(fileWriter, OS.NEWLINE);
536+
BibDatabaseWriter databaseWriter = new BibtexDatabaseWriter(bibWriter, generalPreferences, savePreferences, Globals.entryTypesManager);
535537
databaseWriter.saveDatabase(new BibDatabaseContext(newBase));
536538

537539
// Show just a warning message if encoding did not work for all characters:

src/main/java/org/jabref/gui/JabRefMain.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.jabref.logic.protectedterms.ProtectedTermsLoader;
2626
import org.jabref.logic.remote.RemotePreferences;
2727
import org.jabref.logic.remote.client.RemoteClient;
28-
import org.jabref.logic.util.OS;
2928
import org.jabref.migrations.PreferencesMigrations;
3029
import org.jabref.model.database.BibDatabaseContext;
3130
import org.jabref.model.database.BibDatabaseMode;
@@ -141,10 +140,6 @@ private static void applyPreferences(PreferencesService preferences) {
141140

142141
// Initialize protected terms loader
143142
Globals.protectedTermsLoader = new ProtectedTermsLoader(preferences.getProtectedTermsPreferences());
144-
145-
// Override used newline character with the one stored in the preferences.
146-
// The preferences return the system newline character sequence as default.
147-
OS.NEWLINE = preferences.getNewLineSeparator().toString();
148143
}
149144

150145
private static void configureProxy(ProxyPreferences proxyPreferences) {

src/main/java/org/jabref/gui/SendAsEMailAction.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515
import org.jabref.gui.util.BackgroundTask;
1616
import org.jabref.logic.bibtex.BibEntryWriter;
1717
import org.jabref.logic.bibtex.FieldWriter;
18+
import org.jabref.logic.exporter.BibWriter;
1819
import org.jabref.logic.l10n.Localization;
20+
import org.jabref.logic.util.OS;
1921
import org.jabref.logic.util.io.FileUtil;
2022
import org.jabref.model.database.BibDatabaseContext;
2123
import org.jabref.model.entry.BibEntry;
@@ -72,6 +74,7 @@ private String sendEmail() throws Exception {
7274
}
7375

7476
StringWriter rawEntries = new StringWriter();
77+
BibWriter bibWriter = new BibWriter(rawEntries, OS.NEWLINE);
7578
BibDatabaseContext databaseContext = stateManager.getActiveDatabase().get();
7679
List<BibEntry> entries = stateManager.getSelectedEntries();
7780

@@ -80,7 +83,7 @@ private String sendEmail() throws Exception {
8083

8184
for (BibEntry entry : entries) {
8285
try {
83-
bibtexEntryWriter.write(entry, rawEntries, databaseContext.getMode());
86+
bibtexEntryWriter.write(entry, bibWriter, databaseContext.getMode());
8487
} catch (IOException e) {
8588
LOGGER.warn("Problem creating BibTeX file for mailing.", e);
8689
}
@@ -104,7 +107,7 @@ private String sendEmail() throws Exception {
104107
}
105108
}
106109

107-
String mailTo = "?Body=".concat(rawEntries.getBuffer().toString());
110+
String mailTo = "?Body=".concat(rawEntries.toString());
108111
mailTo = mailTo.concat("&Subject=");
109112
mailTo = mailTo.concat(preferencesService.getExternalApplicationsPreferences().getEmailSubject());
110113
for (String path : attachments) {

src/main/java/org/jabref/gui/entryeditor/SourceTab.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,13 @@
3838
import org.jabref.logic.bibtex.FieldWriter;
3939
import org.jabref.logic.bibtex.FieldWriterPreferences;
4040
import org.jabref.logic.bibtex.InvalidFieldValueException;
41+
import org.jabref.logic.exporter.BibWriter;
4142
import org.jabref.logic.importer.ImportFormatPreferences;
4243
import org.jabref.logic.importer.ParserResult;
4344
import org.jabref.logic.importer.fileformat.BibtexParser;
4445
import org.jabref.logic.l10n.Localization;
4546
import org.jabref.logic.search.SearchQuery;
47+
import org.jabref.logic.util.OS;
4648
import org.jabref.model.database.BibDatabase;
4749
import org.jabref.model.database.BibDatabaseContext;
4850
import org.jabref.model.database.BibDatabaseMode;
@@ -128,11 +130,11 @@ private void highlightSearchPattern() {
128130
}
129131

130132
private String getSourceString(BibEntry entry, BibDatabaseMode type, FieldWriterPreferences fieldWriterPreferences) throws IOException {
131-
StringWriter stringWriter = new StringWriter(200);
133+
StringWriter writer = new StringWriter();
134+
BibWriter bibWriter = new BibWriter(writer, OS.NEWLINE);
132135
FieldWriter fieldWriter = FieldWriter.buildIgnoreHashes(fieldWriterPreferences);
133-
new BibEntryWriter(fieldWriter, Globals.entryTypesManager).writeWithoutPrependedNewlines(entry, stringWriter, type);
134-
135-
return stringWriter.getBuffer().toString();
136+
new BibEntryWriter(fieldWriter, Globals.entryTypesManager).write(entry, bibWriter, type);
137+
return writer.toString();
136138
}
137139

138140
/* Work around for different input methods.

src/main/java/org/jabref/gui/exporter/SaveDatabaseAction.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.jabref.logic.autosaveandbackup.AutosaveManager;
2525
import org.jabref.logic.autosaveandbackup.BackupManager;
2626
import org.jabref.logic.exporter.AtomicFileWriter;
27+
import org.jabref.logic.exporter.BibWriter;
2728
import org.jabref.logic.exporter.BibtexDatabaseWriter;
2829
import org.jabref.logic.exporter.SaveException;
2930
import org.jabref.logic.exporter.SavePreferences;
@@ -229,12 +230,14 @@ private boolean saveDatabase(Path file, boolean selectedOnly, Charset encoding,
229230
SavePreferences savePreferences = this.preferences.getSavePreferences()
230231
.withSaveType(saveType);
231232
try (AtomicFileWriter fileWriter = new AtomicFileWriter(file, encoding, savePreferences.shouldMakeBackup())) {
232-
BibtexDatabaseWriter databaseWriter = new BibtexDatabaseWriter(fileWriter, generalPreferences, savePreferences, entryTypesManager);
233+
BibDatabaseContext bibDatabaseContext = libraryTab.getBibDatabaseContext();
234+
BibWriter bibWriter = new BibWriter(fileWriter, bibDatabaseContext.getDatabase().getNewLineSeparator());
235+
BibtexDatabaseWriter databaseWriter = new BibtexDatabaseWriter(bibWriter, generalPreferences, savePreferences, entryTypesManager);
233236

234237
if (selectedOnly) {
235-
databaseWriter.savePartOfDatabase(libraryTab.getBibDatabaseContext(), libraryTab.getSelectedEntries());
238+
databaseWriter.savePartOfDatabase(bibDatabaseContext, libraryTab.getSelectedEntries());
236239
} else {
237-
databaseWriter.saveDatabase(libraryTab.getBibDatabaseContext());
240+
databaseWriter.saveDatabase(bibDatabaseContext);
238241
}
239242

240243
libraryTab.registerUndoableChanges(databaseWriter.getSaveActionsFieldChanges());

src/main/java/org/jabref/gui/preferences/file/FileTab.fxml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131
toggleGroup="$stringsResolveToggleGroup"/>
3232
<TextField fx:id="resolveStringsExcept" HBox.hgrow="ALWAYS"/>
3333
</HBox>
34-
<HBox alignment="CENTER_LEFT" spacing="10.0">
35-
<Label alignment="TOP_LEFT" text="%Newline separator"/>
36-
<ComboBox fx:id="newLineSeparator" prefWidth="120.0"/>
37-
</HBox>
3834
<CheckBox fx:id="alwaysReformatBib" text="%Always reformat BIB file on save and export"/>
3935

4036
<Label styleClass="sectionHeader" text="%Autosave"/>

src/main/java/org/jabref/gui/preferences/file/FileTab.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import javafx.fxml.FXML;
44
import javafx.scene.control.Button;
55
import javafx.scene.control.CheckBox;
6-
import javafx.scene.control.ComboBox;
76
import javafx.scene.control.RadioButton;
87
import javafx.scene.control.TextField;
98

@@ -13,10 +12,8 @@
1312
import org.jabref.gui.help.HelpAction;
1413
import org.jabref.gui.preferences.AbstractPreferenceTabView;
1514
import org.jabref.gui.preferences.PreferencesTab;
16-
import org.jabref.gui.util.ViewModelListCellFactory;
1715
import org.jabref.logic.help.HelpFile;
1816
import org.jabref.logic.l10n.Localization;
19-
import org.jabref.preferences.NewLineSeparator;
2017

2118
import com.airhacks.afterburner.views.ViewLoader;
2219

@@ -27,7 +24,6 @@ public class FileTab extends AbstractPreferenceTabView<FileTabViewModel> impleme
2724
@FXML private RadioButton resolveStringsBibTex;
2825
@FXML private RadioButton resolveStringsAll;
2926
@FXML private TextField resolveStringsExcept;
30-
@FXML private ComboBox<NewLineSeparator> newLineSeparator;
3127
@FXML private CheckBox alwaysReformatBib;
3228

3329
@FXML private CheckBox autosaveLocalLibraries;
@@ -47,11 +43,6 @@ public void initialize() {
4743
resolveStringsAll.selectedProperty().bindBidirectional(viewModel.resolveStringsAllProperty());
4844
resolveStringsExcept.textProperty().bindBidirectional(viewModel.resolveStringsExceptProperty());
4945
resolveStringsExcept.disableProperty().bind(resolveStringsAll.selectedProperty().not());
50-
new ViewModelListCellFactory<NewLineSeparator>()
51-
.withText(NewLineSeparator::getDisplayName)
52-
.install(newLineSeparator);
53-
newLineSeparator.itemsProperty().bind(viewModel.newLineSeparatorListProperty());
54-
newLineSeparator.valueProperty().bindBidirectional(viewModel.selectedNewLineSeparatorProperty());
5546
alwaysReformatBib.selectedProperty().bindBidirectional(viewModel.alwaysReformatBibProperty());
5647

5748
autosaveLocalLibraries.selectedProperty().bindBidirectional(viewModel.autosaveLocalLibrariesProperty());

src/main/java/org/jabref/gui/preferences/file/FileTabViewModel.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,12 @@
11
package org.jabref.gui.preferences.file;
22

33
import javafx.beans.property.BooleanProperty;
4-
import javafx.beans.property.ListProperty;
5-
import javafx.beans.property.ObjectProperty;
64
import javafx.beans.property.SimpleBooleanProperty;
7-
import javafx.beans.property.SimpleListProperty;
8-
import javafx.beans.property.SimpleObjectProperty;
95
import javafx.beans.property.SimpleStringProperty;
106
import javafx.beans.property.StringProperty;
11-
import javafx.collections.FXCollections;
127

138
import org.jabref.gui.preferences.PreferenceTabViewModel;
149
import org.jabref.preferences.ImportExportPreferences;
15-
import org.jabref.preferences.NewLineSeparator;
1610
import org.jabref.preferences.PreferencesService;
1711

1812
public class FileTabViewModel implements PreferenceTabViewModel {
@@ -22,8 +16,6 @@ public class FileTabViewModel implements PreferenceTabViewModel {
2216
private final BooleanProperty resolveStringsBibTexProperty = new SimpleBooleanProperty();
2317
private final BooleanProperty resolveStringsAllProperty = new SimpleBooleanProperty();
2418
private final StringProperty resolveStringsExceptProperty = new SimpleStringProperty("");
25-
private final ListProperty<NewLineSeparator> newLineSeparatorListProperty = new SimpleListProperty<>();
26-
private final ObjectProperty<NewLineSeparator> selectedNewLineSeparatorProperty = new SimpleObjectProperty<>();
2719
private final BooleanProperty alwaysReformatBibProperty = new SimpleBooleanProperty();
2820
private final BooleanProperty autosaveLocalLibraries = new SimpleBooleanProperty();
2921

@@ -43,8 +35,6 @@ public void setValues() {
4335
resolveStringsAllProperty.setValue(importExportPreferences.shouldResolveStringsForAllStrings()); // Flipped around
4436
resolveStringsBibTexProperty.setValue(importExportPreferences.shouldResolveStringsForStandardBibtexFields());
4537
resolveStringsExceptProperty.setValue(importExportPreferences.getNonResolvableFields());
46-
newLineSeparatorListProperty.setValue(FXCollections.observableArrayList(NewLineSeparator.values()));
47-
selectedNewLineSeparatorProperty.setValue(importExportPreferences.getNewLineSeparator());
4838

4939
alwaysReformatBibProperty.setValue(importExportPreferences.shouldAlwaysReformatOnSave());
5040

@@ -59,7 +49,6 @@ public void storeSettings() {
5949
importExportPreferences.setResolveStringsForStandardBibtexFields(resolveStringsBibTexProperty.getValue());
6050
importExportPreferences.setResolveStringsForAllStrings(resolveStringsAllProperty.getValue());
6151
importExportPreferences.setNonResolvableFields(resolveStringsExceptProperty.getValue().trim());
62-
importExportPreferences.setNewLineSeparator(selectedNewLineSeparatorProperty.getValue());
6352
importExportPreferences.setAlwaysReformatOnSave(alwaysReformatBibProperty.getValue());
6453

6554
preferences.storeShouldAutosave(autosaveLocalLibraries.getValue());
@@ -89,14 +78,6 @@ public StringProperty resolveStringsExceptProperty() {
8978
return resolveStringsExceptProperty;
9079
}
9180

92-
public ListProperty<NewLineSeparator> newLineSeparatorListProperty() {
93-
return newLineSeparatorListProperty;
94-
}
95-
96-
public ObjectProperty<NewLineSeparator> selectedNewLineSeparatorProperty() {
97-
return selectedNewLineSeparatorProperty;
98-
}
99-
10081
public BooleanProperty alwaysReformatBibProperty() {
10182
return alwaysReformatBibProperty;
10283
}

src/main/java/org/jabref/logic/autosaveandbackup/BackupManager.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.jabref.logic.autosaveandbackup;
22

33
import java.io.IOException;
4+
import java.io.Writer;
45
import java.nio.charset.Charset;
56
import java.nio.file.Files;
67
import java.nio.file.Path;
@@ -13,10 +14,12 @@
1314

1415
import org.jabref.logic.bibtex.InvalidFieldValueException;
1516
import org.jabref.logic.exporter.AtomicFileWriter;
17+
import org.jabref.logic.exporter.BibWriter;
1618
import org.jabref.logic.exporter.BibtexDatabaseWriter;
1719
import org.jabref.logic.exporter.SavePreferences;
1820
import org.jabref.logic.util.CoarseChangeFilter;
1921
import org.jabref.logic.util.DelayTaskThrottler;
22+
import org.jabref.logic.util.OS;
2023
import org.jabref.logic.util.io.FileUtil;
2124
import org.jabref.model.database.BibDatabaseContext;
2225
import org.jabref.model.database.event.BibDatabaseContextChangedEvent;
@@ -135,7 +138,9 @@ private void performBackup(Path backupPath) {
135138
GeneralPreferences generalPreferences = preferences.getGeneralPreferences();
136139
SavePreferences savePreferences = preferences.getSavePreferences()
137140
.withMakeBackup(false);
138-
new BibtexDatabaseWriter(new AtomicFileWriter(backupPath, charset), generalPreferences, savePreferences, entryTypesManager)
141+
Writer writer = new AtomicFileWriter(backupPath, charset);
142+
BibWriter bibWriter = new BibWriter(writer, OS.NEWLINE);
143+
new BibtexDatabaseWriter(bibWriter, generalPreferences, savePreferences, entryTypesManager)
139144
.saveDatabase(bibDatabaseContext);
140145
} catch (IOException e) {
141146
logIfCritical(backupPath, e);

0 commit comments

Comments
 (0)