From 22f02412112e57ddd071fd105fb594e38856e14f Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 20 Jul 2021 10:37:14 +0200 Subject: [PATCH 001/108] GrobidPdfMetadataImporter implemented Implemented an Importer that querries Grobid for metadata of a pdf. The necessary Grobid functionality (retrieving BibTeX for a pdf) is not yet available in Grobid, but we opened a PR that implements it (kermitt2/grobid#800). --- .../fetcher/GrobidCitationFetcher.java | 3 +- .../fileformat/GrobidPdfMetadataImporter.java | 95 +++++++++++++++++++ .../logic/importer/util/GrobidService.java | 58 +++++++++++ .../org/jabref/logic/net/URLDownload.java | 12 ++- src/main/resources/l10n/JabRef_en.properties | 2 + .../GrobidPdfMetadataImporterTest.java | 71 ++++++++++++++ 6 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java create mode 100644 src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java diff --git a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java index bf16d71570d..7955e206fd7 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java @@ -23,9 +23,10 @@ public class GrobidCitationFetcher implements SearchBasedFetcher { + public static final String GROBID_URL = "http://grobid.jabref.org:8070"; + private static final Logger LOGGER = LoggerFactory.getLogger(GrobidCitationFetcher.class); - private static final String GROBID_URL = "http://grobid.jabref.org:8070"; private ImportFormatPreferences importFormatPreferences; private GrobidService grobidService; diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java new file mode 100644 index 00000000000..b2b75eb24d2 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java @@ -0,0 +1,95 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.Objects; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ParserResult; +import org.jabref.logic.importer.util.GrobidService; +import org.jabref.logic.l10n.Localization; +import org.jabref.logic.util.StandardFileType; + +/** + * Wraps the GrobidService function to be used as an Importer. + */ +public class GrobidPdfMetadataImporter extends Importer { + + private final GrobidService grobidService; + private final ImportFormatPreferences importFormatPreferences; + + public GrobidPdfMetadataImporter(String grobidServerURL, ImportFormatPreferences importFormatPreferences) { + this.grobidService = new GrobidService(grobidServerURL); + this.importFormatPreferences = importFormatPreferences; + } + + @Override + public String getName() { + return Localization.lang("Grobid PDF metadata"); + } + + @Override + public StandardFileType getFileType() { + return StandardFileType.PDF; + } + + @Override + public ParserResult importDatabase(BufferedReader reader) throws IOException { + Objects.requireNonNull(reader); + throw new UnsupportedOperationException( + "PdfXmpImporter does not support importDatabase(BufferedReader reader)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(String data) throws IOException { + Objects.requireNonNull(data); + throw new UnsupportedOperationException( + "PdfXmpImporter does not support importDatabase(String data)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(Path filePath, Charset defaultEncoding) { + Objects.requireNonNull(filePath); + try { + return new ParserResult(grobidService.processPDF(filePath, importFormatPreferences)); + } catch (Exception exception) { + return ParserResult.fromError(exception); + } + } + + @Override + public boolean isRecognizedFormat(BufferedReader reader) throws IOException { + Objects.requireNonNull(reader); + return false; + } + + /** + * Returns whether the given stream contains data that is a.) a pdf and b.) + * contains at least one BibEntry. + */ + @Override + public boolean isRecognizedFormat(Path filePath, Charset defaultEncoding) throws IOException { + Objects.requireNonNull(filePath); + String[] splittedFileName = filePath.getFileName().toString().split("\\."); + if (splittedFileName.length <= 1) { + return false; + } + String extension = splittedFileName[splittedFileName.length - 1]; + return getFileType().getExtensions().contains(extension); + } + + @Override + public String getId() { + return "grobidPdf"; + } + + @Override + public String getDescription() { + return "Wraps the GrobidService function to be used as an Importer."; + } +} diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index ec9b7567fc0..c42d766eb8d 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -3,9 +3,17 @@ import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Duration; +import java.util.List; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.net.URLDownload; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.util.DummyFileUpdateMonitor; /** * Implements an API to a GROBID server, as described at @@ -19,6 +27,8 @@ */ public class GrobidService { + public static String HTTP_REQUEST_BOUNDARY = "---------------------------JabRefRequest"; + public enum ConsolidateCitations { NO(0), WITH_METADATA(1), WITH_DOI_ONLY(2); private int code; @@ -59,4 +69,52 @@ public String processCitation(String rawCitation, ConsolidateCitations consolida return httpResponse; } + + public List processPDF(Path filePath, ImportFormatPreferences importFormatPreferences) throws IOException, ParseException { + URLDownload urlDownload = new URLDownload(grobidServerURL + + "/api/processHeaderDocument"); // shall we use processFulltextDocument? + urlDownload.setConnectTimeout(Duration.ofSeconds(150)); + urlDownload.addHeader("Accept", MediaTypes.APPLICATION_BIBTEX); + urlDownload.addHeader("Content-Type", "multipart/form-data; boundary=" + HTTP_REQUEST_BOUNDARY); + urlDownload.setPostData(readPdf(filePath)); + String httpResponse = urlDownload.asString(); + + if (httpResponse == null || httpResponse.equals("@misc{-1,\n author = {}\n}\n")) { // This filters empty BibTeX entries + throw new IOException("The GROBID server response does not contain anything."); + } + + BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); + return parser.parseEntries(httpResponse); + } + + private byte[] readPdf(Path filePath) throws IOException { + StringBuilder preFile = new StringBuilder(); + preFile.append("--"); + preFile.append(HTTP_REQUEST_BOUNDARY); + preFile.append("\r\n"); + preFile.append("Content-Disposition: form-data; name=\"consolidateHeader\"\r\n\r\n1\r\n--"); + preFile.append(HTTP_REQUEST_BOUNDARY); + preFile.append("\r\n"); + preFile.append("Content-Disposition: form-data; name=\"input\"; filename=\""); + preFile.append(filePath.getFileName().toString()); + preFile.append("\"\r\nContent-Type: application/pdf\r\n\r\n"); + byte[] preFileBytes = preFile.toString().getBytes(); + + byte[] fileContent = Files.readAllBytes(filePath); + + StringBuilder postFile = new StringBuilder(); + postFile.append("\r\n--"); + postFile.append(HTTP_REQUEST_BOUNDARY); + postFile.append("\r\n"); + postFile.append("Content-Disposition: form-data; name=\"input\"\r\n\r\n\r\n--"); + postFile.append(HTTP_REQUEST_BOUNDARY); + postFile.append("--\r\n"); + byte[] postFileBytes = postFile.toString().getBytes(); + + byte[] post = new byte[preFileBytes.length + fileContent.length + postFileBytes.length]; + System.arraycopy(preFileBytes, 0, post, 0, preFileBytes.length); + System.arraycopy(fileContent, 0, post, preFileBytes.length, fileContent.length); + System.arraycopy(postFileBytes, 0, post, preFileBytes.length + fileContent.length, postFileBytes.length); + return post; + } } diff --git a/src/main/java/org/jabref/logic/net/URLDownload.java b/src/main/java/org/jabref/logic/net/URLDownload.java index f0c5f778d08..3b1d7e16795 100644 --- a/src/main/java/org/jabref/logic/net/URLDownload.java +++ b/src/main/java/org/jabref/logic/net/URLDownload.java @@ -69,7 +69,7 @@ public class URLDownload { private final URL source; private final Map parameters = new HashMap<>(); - private String postData = ""; + private byte[] postData = null; private Duration connectTimeout = DEFAULT_CONNECT_TIMEOUT; /** @@ -222,6 +222,12 @@ public void addHeader(String key, String value) { } public void setPostData(String postData) { + if (postData != null) { + this.postData = postData.getBytes(); + } + } + + public void setPostData(byte[] postData) { if (postData != null) { this.postData = postData; } @@ -339,10 +345,10 @@ private URLConnection openConnection() throws IOException { for (Entry entry : this.parameters.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } - if (!this.postData.isEmpty()) { + if (this.postData != null) { connection.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { - wr.writeBytes(this.postData); + wr.write(this.postData); } } diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 8abf5a998e1..1d77e6e7eda 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2363,3 +2363,5 @@ Rebuild\ fulltext\ search\ index\ for\ current\ library?=Rebuild fulltext search Rebuilding\ fulltext\ search\ index...=Rebuilding fulltext search index... Failed\ to\ access\ fulltext\ search\ index=Failed to access fulltext search index Found\ match\ in\ %0=Found match in %0 + +Grobid\ PDF\ metadata=Grobid PDF metadata diff --git a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java new file mode 100644 index 00000000000..9c448ce70bd --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java @@ -0,0 +1,71 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; +import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class GrobidPdfMetadataImporterTest { + + private GrobidPdfMetadataImporter importer; + private ImportFormatPreferences importFormatPreferences; + + @BeforeEach + public void setUp() { + importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); + importer = new GrobidPdfMetadataImporter(GrobidCitationFetcher.GROBID_URL, importFormatPreferences); + } + + @Test + public void testsGetExtensions() { + assertEquals(StandardFileType.PDF, importer.getFileType()); + } + + @Test + public void testImportEntries() throws URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("LNCS-minimal.pdf").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + + assertEquals(1, bibEntries.size()); + + BibEntry be0 = bibEntries.get(0); + assertEquals(Optional.of("Lastname, Firstname"), be0.getField(StandardField.AUTHOR)); + assertEquals(Optional.of("Paper Title"), be0.getField(StandardField.TITLE)); + } + + @Test + public void testIsRecognizedFormat() throws IOException, URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("annotated.pdf").toURI()); + assertTrue(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + + @Test + public void testIsRecognizedFormatReject() throws IOException, URISyntaxException { + Path file = Path.of(PdfXmpImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); + assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + + @Test + public void testGetCommandLineId() { + assertEquals("grobidPdf", importer.getId()); + } +} From 8effaa9155c714f4db1cc5a1c001b74b1b6f9998 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 20 Jul 2021 17:24:20 +0200 Subject: [PATCH 002/108] Fixed class when accessing resources --- .../importer/fileformat/GrobidPdfMetadataImporterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java index 9c448ce70bd..77c5b2db4d9 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java @@ -60,7 +60,7 @@ public void testIsRecognizedFormat() throws IOException, URISyntaxException { @Test public void testIsRecognizedFormatReject() throws IOException, URISyntaxException { - Path file = Path.of(PdfXmpImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); } From 5d487d2eabe2fd5c7e854fe19eb3c094fb8a5955 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 20 Jul 2021 17:31:34 +0200 Subject: [PATCH 003/108] Draft of merge dialog --- .../gui/mergeentries/MultiMergeEntries.java | 133 ++++++++++++++++++ .../mergeentries/MultiMergeEntriesDialog.java | 45 ++++++ 2 files changed, 178 insertions(+) create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java new file mode 100644 index 00000000000..77f2a429d96 --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -0,0 +1,133 @@ +package org.jabref.gui.mergeentries; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Vector; +import java.util.function.Supplier; + +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.event.EventType; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; + +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; + +public class MultiMergeEntries extends GridPane { + + private HashMap fieldRows = new HashMap<>(); + private List fieldEditorColumn = new Vector<>(); + + private ColumnConstraints columnConstraints = new ColumnConstraints(); + + public MultiMergeEntries() { + Node fieldEditorHeader = new Label(Localization.lang("Entry")); + fieldEditorColumn.add(fieldEditorHeader); + this.addRow(0, new Label(Localization.lang("Supplier:")), fieldEditorHeader); + columnConstraints.setPercentWidth(100.0 / getColumnCount()); + getColumnConstraints().addAll(columnConstraints, columnConstraints); + } + + public void addEntry(String title, BibEntry entry) { + int column = addColumn(title); + + for (Map.Entry fieldEntry : entry.getFieldMap().entrySet()) { + if (!fieldRows.containsKey(fieldEntry.getKey())) { + addField(fieldEntry.getKey()); + } + fieldRows.get(fieldEntry.getKey()).addValue(column, fieldEntry.getValue()); + } + getColumnConstraints().add(columnConstraints); + } + + public void addEntry(String title, Supplier> entrySupplier) { + } + + public BibEntry getMergeEntry() { + BibEntry mergedEntry = new BibEntry(); + for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { + mergedEntry.setField(fieldRowEntry.getKey(), ((TextArea) fieldEditorColumn.get(fieldRowEntry.getValue().rowIndex)).getText()); + } + return mergedEntry; + } + + private int addColumn(String name) { + int columnIndex = getColumnCount() - 1; + // This will replace the fieldEditor column, which has to move 1 to the right. + int newEntryEditorColumnIndex = getColumnCount(); + for (Node node : fieldEditorColumn) { + setColumnIndex(node, newEntryEditorColumnIndex); + } + Button sourceButton = new Button(name); + sourceButton.setOnAction(new EventHandler() { + @Override + public void handle(ActionEvent event) { + getChildrenUnmodifiable().stream().filter(node -> getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)); + } + }); + add(sourceButton, columnIndex, 0); + return columnIndex; + } + + public void addField(Field field) { + TextArea fieldEditorCell = new TextArea(); + FieldRow newRow = new FieldRow(getRowCount(), fieldEditorCell); + fieldRows.put(field, newRow); + int fieldEditorColumnIndex = getColumnCount() - 1; + add(new Label(field.getDisplayName()), 0, newRow.rowIndex); + fieldEditorColumn.add(fieldEditorCell); + add(fieldEditorCell, fieldEditorColumnIndex, newRow.rowIndex); + } + + private class FieldRow { + public int rowIndex; + public ToggleGroup toggleGroup = new ToggleGroup(); + public TextArea entryEditorField; + + public FieldRow(int rowIndex, TextArea entryEditorField) { + this.rowIndex = rowIndex; + this.entryEditorField = entryEditorField; + + ChangeListener textChangeListener = new ChangeListener() { + @Override + public void changed(ObservableValue observable, Object oldValue, Object newValue) { + if (toggleGroup.getSelectedToggle() != null) { + toggleGroup.getSelectedToggle().setSelected(false); + entryEditorField.textProperty().removeListener(this); + } + } + }; + + toggleGroup.selectedToggleProperty().addListener( + (observable, oldValue, newValue) -> { + if (observable != null && newValue != null && newValue.isSelected()) { + ToggleButton toggle = (ToggleButton) observable.getValue(); + entryEditorField.setText(toggle.getText()); + entryEditorField.textProperty().addListener(textChangeListener); + } else { + entryEditorField.textProperty().removeListener(textChangeListener); + } + } + ); + } + + public void addValue(int columnIndex, String value) { + ToggleButton cellButton = new ToggleButton(value); + cellButton.setWrapText(true); + cellButton.setToggleGroup(toggleGroup); + add(cellButton, columnIndex, rowIndex); + } + } +} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java new file mode 100644 index 00000000000..5544bf9bb6f --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java @@ -0,0 +1,45 @@ +package org.jabref.gui.mergeentries; + +import java.util.Optional; +import java.util.function.Supplier; + +import javafx.scene.control.ButtonBar; +import javafx.scene.control.ButtonType; + +import org.jabref.gui.util.BaseDialog; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.BibEntry; + +public class MultiMergeEntriesDialog extends BaseDialog { + + private final MultiMergeEntries multiMergeEntries; + + public MultiMergeEntriesDialog() { + multiMergeEntries = new MultiMergeEntries(); + + init(); + } + + private void init() { + this.getDialogPane().setContent(multiMergeEntries); + + // Create buttons + ButtonType replaceEntries = new ButtonType(Localization.lang("Merge entries"), ButtonBar.ButtonData.OK_DONE); + this.getDialogPane().getButtonTypes().setAll(ButtonType.CANCEL, replaceEntries); + this.setResultConverter(buttonType -> { + if (buttonType.equals(replaceEntries)) { + return multiMergeEntries.getMergeEntry(); + } else { + return null; + } + }); + } + + public void addEntry(String title, BibEntry entry) { + multiMergeEntries.addEntry(title, entry); + } + + public void addEntry(String title, Supplier> entrySupplier) { + multiMergeEntries.addEntry(title, entrySupplier); + } +} From 96cd5cff7dfeb1368b4b2d85ef908c75dbbb71ac Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 21 Jul 2021 07:35:26 +0200 Subject: [PATCH 004/108] Default to first available entry --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 77f2a429d96..8b79854561a 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -128,6 +128,9 @@ public void addValue(int columnIndex, String value) { cellButton.setWrapText(true); cellButton.setToggleGroup(toggleGroup); add(cellButton, columnIndex, rowIndex); + if (toggleGroup.getSelectedToggle() == null) { + cellButton.setSelected(true); + } } } } From 8b5510e05a3c1375f3acc2e9395a14d813b1f8f2 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 21 Jul 2021 15:33:55 +0200 Subject: [PATCH 005/108] Changed layout Headers and the entry editor are now placed in VBox/HBox containers around the table that displays the options. Users can (if necessary) scroll in h and v directions. --- .../gui/mergeentries/MultiMergeEntries.java | 125 +++++++++++++----- 1 file changed, 93 insertions(+), 32 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 8b79854561a..6e7de0d6207 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -1,25 +1,27 @@ package org.jabref.gui.mergeentries; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Vector; import java.util.function.Supplier; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.event.ActionEvent; import javafx.event.EventHandler; -import javafx.event.EventType; -import javafx.scene.Node; import javafx.scene.control.Button; +import javafx.scene.control.Control; import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.RowConstraints; +import javafx.scene.layout.VBox; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -28,16 +30,63 @@ public class MultiMergeEntries extends GridPane { private HashMap fieldRows = new HashMap<>(); - private List fieldEditorColumn = new Vector<>(); - private ColumnConstraints columnConstraints = new ColumnConstraints(); + private ScrollPane topScrollPane; + private ScrollPane leftScrollPane; + private ScrollPane centerScrollPane; + private ScrollPane rightScrollPane; + + private HBox supplierHeader; + private VBox fieldHeader; + private GridPane optionsGrid; + private VBox fieldEditor; + + private ColumnConstraints leftColumnConstraints = new ColumnConstraints(); + private ColumnConstraints centerColumnConstraints = new ColumnConstraints(); + private ColumnConstraints rightColumnConstraints = new ColumnConstraints(); public MultiMergeEntries() { - Node fieldEditorHeader = new Label(Localization.lang("Entry")); - fieldEditorColumn.add(fieldEditorHeader); - this.addRow(0, new Label(Localization.lang("Supplier:")), fieldEditorHeader); - columnConstraints.setPercentWidth(100.0 / getColumnCount()); - getColumnConstraints().addAll(columnConstraints, columnConstraints); + init(); + } + + private void init() { + + supplierHeader = new HBox(); + fieldHeader = new VBox(); + optionsGrid = new GridPane(); + fieldEditor = new VBox(); + + topScrollPane = new ScrollPane(supplierHeader); + leftScrollPane = new ScrollPane(fieldHeader); + centerScrollPane = new ScrollPane(optionsGrid); + rightScrollPane = new ScrollPane(fieldEditor); + topScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + topScrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + leftScrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + leftScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + centerScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); + + add(new Label(Localization.lang("Supplier:")), 0, 0); + add(topScrollPane, 1, 0); + add(new Label(Localization.lang("Entry:")), 2, 0); + add(leftScrollPane, 0, 1); + add(centerScrollPane, 1, 1); + add(rightScrollPane, 2, 1); + + topScrollPane.hvalueProperty().bindBidirectional(centerScrollPane.hvalueProperty()); + leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); + rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); + + leftColumnConstraints.setMinWidth(200); + centerColumnConstraints.setMinWidth(750); + rightColumnConstraints.setMinWidth(250); + getColumnConstraints().addAll(leftColumnConstraints, centerColumnConstraints, rightColumnConstraints); + + RowConstraints topRowConstraints = new RowConstraints(); + RowConstraints bottomRowConstraints = new RowConstraints(); + topRowConstraints.setPercentHeight(0.05); + bottomRowConstraints.setPercentHeight(0.95); + getRowConstraints().addAll(topRowConstraints, bottomRowConstraints); } public void addEntry(String title, BibEntry entry) { @@ -49,7 +98,6 @@ public void addEntry(String title, BibEntry entry) { } fieldRows.get(fieldEntry.getKey()).addValue(column, fieldEntry.getValue()); } - getColumnConstraints().add(columnConstraints); } public void addEntry(String title, Supplier> entrySupplier) { @@ -58,37 +106,50 @@ public void addEntry(String title, Supplier> entrySupplier) { public BibEntry getMergeEntry() { BibEntry mergedEntry = new BibEntry(); for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { - mergedEntry.setField(fieldRowEntry.getKey(), ((TextArea) fieldEditorColumn.get(fieldRowEntry.getValue().rowIndex)).getText()); + mergedEntry.setField(fieldRowEntry.getKey(), ((TextArea) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText()); } return mergedEntry; } private int addColumn(String name) { - int columnIndex = getColumnCount() - 1; - // This will replace the fieldEditor column, which has to move 1 to the right. - int newEntryEditorColumnIndex = getColumnCount(); - for (Node node : fieldEditorColumn) { - setColumnIndex(node, newEntryEditorColumnIndex); - } + int columnIndex = supplierHeader.getChildren().size(); Button sourceButton = new Button(name); - sourceButton.setOnAction(new EventHandler() { - @Override - public void handle(ActionEvent event) { - getChildrenUnmodifiable().stream().filter(node -> getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)); - } - }); - add(sourceButton, columnIndex, 0); + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); + HBox.setHgrow(sourceButton, Priority.ALWAYS); + supplierHeader.getChildren().add(sourceButton); + sourceButton.setMinWidth(250); + + optionsGrid.add(new Label(), columnIndex, 0); + ColumnConstraints constraint = new ColumnConstraints(); + constraint.setMinWidth(Control.USE_PREF_SIZE); + constraint.setMaxWidth(Control.USE_PREF_SIZE); + constraint.prefWidthProperty().bind(sourceButton.widthProperty()); + optionsGrid.getColumnConstraints().add(constraint); + return columnIndex; } public void addField(Field field) { TextArea fieldEditorCell = new TextArea(); - FieldRow newRow = new FieldRow(getRowCount(), fieldEditorCell); + fieldEditorCell.setWrapText(true); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell); fieldRows.put(field, newRow); - int fieldEditorColumnIndex = getColumnCount() - 1; - add(new Label(field.getDisplayName()), 0, newRow.rowIndex); - fieldEditorColumn.add(fieldEditorCell); - add(fieldEditorCell, fieldEditorColumnIndex, newRow.rowIndex); + Label fieldHeaderLabel = new Label(field.getDisplayName()); + fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); + fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); + fieldEditorCell.setMaxHeight(Double.MAX_VALUE); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + fieldHeader.getChildren().add(fieldHeaderLabel); + fieldEditor.getChildren().add(fieldEditorCell); + + optionsGrid.add(new Label(), 0, newRow.rowIndex); + RowConstraints constraint = new RowConstraints(); + constraint.setMinHeight(Control.USE_PREF_SIZE); + constraint.setMaxHeight(Control.USE_PREF_SIZE); + constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + optionsGrid.getRowConstraints().add(constraint); } private class FieldRow { @@ -127,7 +188,7 @@ public void addValue(int columnIndex, String value) { ToggleButton cellButton = new ToggleButton(value); cellButton.setWrapText(true); cellButton.setToggleGroup(toggleGroup); - add(cellButton, columnIndex, rowIndex); + optionsGrid.add(cellButton, columnIndex, rowIndex); if (toggleGroup.getSelectedToggle() == null) { cellButton.setSelected(true); } From 3a4a01a07059bbd449ee30175901f19eb4ab9ff0 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 21 Jul 2021 16:00:35 +0200 Subject: [PATCH 006/108] Checkstyle --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 6e7de0d6207..026bb39cbfc 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -7,8 +7,6 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; import javafx.scene.control.Button; import javafx.scene.control.Control; import javafx.scene.control.Label; From 8314855db8ecded5c12e369768002d5cc6ca8ecc Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 21 Jul 2021 19:50:50 +0200 Subject: [PATCH 007/108] Bind buttons with equal content together --- .../jabref/gui/mergeentries/MultiMergeEntries.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 026bb39cbfc..ccd16d55037 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -12,6 +12,7 @@ import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; +import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; import javafx.scene.layout.ColumnConstraints; @@ -185,11 +186,20 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue public void addValue(int columnIndex, String value) { ToggleButton cellButton = new ToggleButton(value); cellButton.setWrapText(true); - cellButton.setToggleGroup(toggleGroup); optionsGrid.add(cellButton, columnIndex, rowIndex); if (toggleGroup.getSelectedToggle() == null) { cellButton.setSelected(true); } + for (Toggle otherToggle : toggleGroup.getToggles()) { + if (otherToggle instanceof ToggleButton) { + ToggleButton otherToggleButton = (ToggleButton) otherToggle; + if (otherToggleButton.getText().equals(value)) { + cellButton.selectedProperty().bindBidirectional(otherToggleButton.selectedProperty()); + return; + } + } + } + cellButton.setToggleGroup(toggleGroup); } } } From 05964bc57136ecc446f7089f160a1413634bb733 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 08:03:19 +0200 Subject: [PATCH 008/108] Use TextArea only for multiline fields --- .../gui/mergeentries/MultiMergeEntries.java | 24 ++++++++++++++----- .../mergeentries/MultiMergeEntriesDialog.java | 5 ++-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index ccd16d55037..dce4c7d4c07 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -12,6 +12,8 @@ import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.control.TextInputControl; import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; @@ -22,12 +24,15 @@ import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; +import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.FieldFactory; public class MultiMergeEntries extends GridPane { + private final FieldContentFormatterPreferences fieldContentFormatterPreferences; private HashMap fieldRows = new HashMap<>(); private ScrollPane topScrollPane; @@ -44,7 +49,8 @@ public class MultiMergeEntries extends GridPane { private ColumnConstraints centerColumnConstraints = new ColumnConstraints(); private ColumnConstraints rightColumnConstraints = new ColumnConstraints(); - public MultiMergeEntries() { + public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences) { + this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; init(); } @@ -105,7 +111,7 @@ public void addEntry(String title, Supplier> entrySupplier) { public BibEntry getMergeEntry() { BibEntry mergedEntry = new BibEntry(); for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { - mergedEntry.setField(fieldRowEntry.getKey(), ((TextArea) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText()); + mergedEntry.setField(fieldRowEntry.getKey(), ((TextInputControl) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText()); } return mergedEntry; } @@ -129,8 +135,14 @@ private int addColumn(String name) { } public void addField(Field field) { - TextArea fieldEditorCell = new TextArea(); - fieldEditorCell.setWrapText(true); + boolean isMultiLine = FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); + TextInputControl fieldEditorCell = null; + if (isMultiLine) { + fieldEditorCell = new TextArea(); + ((TextArea) fieldEditorCell).setWrapText(true); + } else { + fieldEditorCell = new TextField(); + } VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell); fieldRows.put(field, newRow); @@ -154,9 +166,9 @@ public void addField(Field field) { private class FieldRow { public int rowIndex; public ToggleGroup toggleGroup = new ToggleGroup(); - public TextArea entryEditorField; + public TextInputControl entryEditorField; - public FieldRow(int rowIndex, TextArea entryEditorField) { + public FieldRow(int rowIndex, TextInputControl entryEditorField) { this.rowIndex = rowIndex; this.entryEditorField = entryEditorField; diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java index 5544bf9bb6f..bfbfc8e28f8 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java @@ -7,6 +7,7 @@ import javafx.scene.control.ButtonType; import org.jabref.gui.util.BaseDialog; +import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -14,8 +15,8 @@ public class MultiMergeEntriesDialog extends BaseDialog { private final MultiMergeEntries multiMergeEntries; - public MultiMergeEntriesDialog() { - multiMergeEntries = new MultiMergeEntries(); + public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences) { + multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences); init(); } From 0f64b1cf659b63969b2a646c4d0a394092f3dad3 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 09:59:51 +0200 Subject: [PATCH 009/108] Use SplitPane --- .../gui/mergeentries/MultiMergeEntries.java | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index dce4c7d4c07..fd998dd417e 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -11,6 +11,7 @@ import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ScrollPane; +import javafx.scene.control.SplitPane; import javafx.scene.control.TextArea; import javafx.scene.control.TextField; import javafx.scene.control.TextInputControl; @@ -30,11 +31,15 @@ import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; -public class MultiMergeEntries extends GridPane { +public class MultiMergeEntries extends SplitPane { private final FieldContentFormatterPreferences fieldContentFormatterPreferences; private HashMap fieldRows = new HashMap<>(); + private VBox labelColumn; + private VBox optionsColumn; + private VBox entryColumn; + private ScrollPane topScrollPane; private ScrollPane leftScrollPane; private ScrollPane centerScrollPane; @@ -45,10 +50,6 @@ public class MultiMergeEntries extends GridPane { private GridPane optionsGrid; private VBox fieldEditor; - private ColumnConstraints leftColumnConstraints = new ColumnConstraints(); - private ColumnConstraints centerColumnConstraints = new ColumnConstraints(); - private ColumnConstraints rightColumnConstraints = new ColumnConstraints(); - public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences) { this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; init(); @@ -56,6 +57,10 @@ public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterP private void init() { + labelColumn = new VBox(); + optionsColumn = new VBox(); + entryColumn = new VBox(); + supplierHeader = new HBox(); fieldHeader = new VBox(); optionsGrid = new GridPane(); @@ -70,28 +75,17 @@ private void init() { leftScrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); leftScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); centerScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - - add(new Label(Localization.lang("Supplier:")), 0, 0); - add(topScrollPane, 1, 0); - add(new Label(Localization.lang("Entry:")), 2, 0); - add(leftScrollPane, 0, 1); - add(centerScrollPane, 1, 1); - add(rightScrollPane, 2, 1); - topScrollPane.hvalueProperty().bindBidirectional(centerScrollPane.hvalueProperty()); leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); - leftColumnConstraints.setMinWidth(200); - centerColumnConstraints.setMinWidth(750); - rightColumnConstraints.setMinWidth(250); - getColumnConstraints().addAll(leftColumnConstraints, centerColumnConstraints, rightColumnConstraints); + labelColumn.getChildren().addAll(new Label(Localization.lang("Supplier:")), leftScrollPane); + optionsColumn.getChildren().addAll(topScrollPane, centerScrollPane); + entryColumn.getChildren().addAll(new Label(Localization.lang("Entry:")), rightScrollPane); - RowConstraints topRowConstraints = new RowConstraints(); - RowConstraints bottomRowConstraints = new RowConstraints(); - topRowConstraints.setPercentHeight(0.05); - bottomRowConstraints.setPercentHeight(0.95); - getRowConstraints().addAll(topRowConstraints, bottomRowConstraints); + setResizableWithParent(labelColumn, false); + setDividerPositions(0.1, 0.6, 0.3); + getItems().addAll(labelColumn, optionsColumn, entryColumn); } public void addEntry(String title, BibEntry entry) { @@ -119,7 +113,7 @@ public BibEntry getMergeEntry() { private int addColumn(String name) { int columnIndex = supplierHeader.getChildren().size(); Button sourceButton = new Button(name); - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); HBox.setHgrow(sourceButton, Priority.ALWAYS); supplierHeader.getChildren().add(sourceButton); sourceButton.setMinWidth(250); @@ -171,6 +165,9 @@ private class FieldRow { public FieldRow(int rowIndex, TextInputControl entryEditorField) { this.rowIndex = rowIndex; this.entryEditorField = entryEditorField; + entryEditorField.prefWidthProperty().bind(rightScrollPane.widthProperty()); + entryEditorField.setMinWidth(Control.USE_PREF_SIZE); + entryEditorField.setMaxWidth(Control.USE_PREF_SIZE); ChangeListener textChangeListener = new ChangeListener() { @Override From 1260cf9a3a397241eeb36d06dead3afa1067239e Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 11:25:49 +0200 Subject: [PATCH 010/108] Fixed scaling of labels --- .../gui/mergeentries/MultiMergeEntries.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index fd998dd417e..930006b69bd 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -18,6 +18,7 @@ import javafx.scene.control.Toggle; import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleGroup; +import javafx.scene.control.Tooltip; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; @@ -79,9 +80,18 @@ private void init() { leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); - labelColumn.getChildren().addAll(new Label(Localization.lang("Supplier:")), leftScrollPane); + Label supplierHeaderLabel = new Label(Localization.lang("Supplier")); + Label entryHeaderLabel = new Label(Localization.lang("Entry")); + supplierHeaderLabel.prefHeightProperty().bind(supplierHeader.heightProperty()); + supplierHeaderLabel.setMinHeight(Control.USE_PREF_SIZE); + supplierHeaderLabel.setMaxHeight(Control.USE_PREF_SIZE); + entryHeaderLabel.prefHeightProperty().bind(supplierHeader.heightProperty()); + entryHeaderLabel.setMinHeight(Control.USE_PREF_SIZE); + entryHeaderLabel.setMaxHeight(Control.USE_PREF_SIZE); + + labelColumn.getChildren().addAll(supplierHeaderLabel, leftScrollPane); optionsColumn.getChildren().addAll(topScrollPane, centerScrollPane); - entryColumn.getChildren().addAll(new Label(Localization.lang("Entry:")), rightScrollPane); + entryColumn.getChildren().addAll(entryHeaderLabel, rightScrollPane); setResizableWithParent(labelColumn, false); setDividerPositions(0.1, 0.6, 0.3); @@ -195,6 +205,9 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue public void addValue(int columnIndex, String value) { ToggleButton cellButton = new ToggleButton(value); cellButton.setWrapText(true); + Tooltip buttonTooltip = new Tooltip(value); + buttonTooltip.setWrapText(true); + cellButton.setTooltip(buttonTooltip); optionsGrid.add(cellButton, columnIndex, rowIndex); if (toggleGroup.getSelectedToggle() == null) { cellButton.setSelected(true); From 97fb43df33a70fe7a199523d61175112e5c29f2e Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 12:01:45 +0200 Subject: [PATCH 011/108] Add tooltip for toggle buttons --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 930006b69bd..af2c74e41ef 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -25,6 +25,7 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; +import javafx.scene.text.TextAlignment; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.l10n.Localization; @@ -207,6 +208,8 @@ public void addValue(int columnIndex, String value) { cellButton.setWrapText(true); Tooltip buttonTooltip = new Tooltip(value); buttonTooltip.setWrapText(true); + buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); + buttonTooltip.setTextAlignment(TextAlignment.LEFT); cellButton.setTooltip(buttonTooltip); optionsGrid.add(cellButton, columnIndex, rowIndex); if (toggleGroup.getSelectedToggle() == null) { From 733415f9b6c0679d6263b29bf9656f55b7834b4b Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 13:59:05 +0200 Subject: [PATCH 012/108] Implemented loading BibEntries in background --- .../gui/mergeentries/MultiMergeEntries.java | 61 +++++++++++++++---- .../mergeentries/MultiMergeEntriesDialog.java | 5 +- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index af2c74e41ef..36d7e805f6d 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -10,6 +10,7 @@ import javafx.scene.control.Button; import javafx.scene.control.Control; import javafx.scene.control.Label; +import javafx.scene.control.ProgressIndicator; import javafx.scene.control.ScrollPane; import javafx.scene.control.SplitPane; import javafx.scene.control.TextArea; @@ -23,10 +24,14 @@ import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; import javafx.scene.text.TextAlignment; +import org.jabref.gui.util.BackgroundTask; +import org.jabref.gui.util.DefaultTaskExecutor; +import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -36,6 +41,7 @@ public class MultiMergeEntries extends SplitPane { private final FieldContentFormatterPreferences fieldContentFormatterPreferences; + private final TaskExecutor taskExecutor; private HashMap fieldRows = new HashMap<>(); private VBox labelColumn; @@ -52,8 +58,9 @@ public class MultiMergeEntries extends SplitPane { private GridPane optionsGrid; private VBox fieldEditor; - public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences) { + public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences, TaskExecutor taskExecutor) { this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; + this.taskExecutor = taskExecutor; init(); } @@ -100,9 +107,42 @@ private void init() { } public void addEntry(String title, BibEntry entry) { - int column = addColumn(title); + Button sourceButton = new Button(title); + int column = addColumn(sourceButton); + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == column).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); - for (Map.Entry fieldEntry : entry.getFieldMap().entrySet()) { + writeBibEntryToColumn(entry, column); + } + + public void addEntry(String title, Supplier> entrySupplier) { + HBox header = new HBox(); + Button sourceButton = new Button(title); + ProgressIndicator loadingIndicator = new ProgressIndicator(-1); + header.getChildren().addAll(sourceButton, loadingIndicator); + HBox.setHgrow(sourceButton, Priority.ALWAYS); + sourceButton.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(loadingIndicator, Priority.NEVER); + int column = addColumn(header); + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == column).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); + sourceButton.setDisable(true); + loadingIndicator.prefHeightProperty().bind(sourceButton.heightProperty()); + loadingIndicator.setMinHeight(Control.USE_PREF_SIZE); + loadingIndicator.setMaxHeight(Control.USE_PREF_SIZE); + + BackgroundTask.wrap(() -> { + Optional entry = entrySupplier.get(); + DefaultTaskExecutor.runInJavaFXThread(() -> { + if (entry.isPresent()) { + sourceButton.setDisable(false); + writeBibEntryToColumn(entry.get(), column); + } + header.getChildren().remove(loadingIndicator); + }); + }).executeWith(taskExecutor); + } + + private void writeBibEntryToColumn(BibEntry bibEntry, int column) { + for (Map.Entry fieldEntry : bibEntry.getFieldMap().entrySet()) { if (!fieldRows.containsKey(fieldEntry.getKey())) { addField(fieldEntry.getKey()); } @@ -110,9 +150,6 @@ public void addEntry(String title, BibEntry entry) { } } - public void addEntry(String title, Supplier> entrySupplier) { - } - public BibEntry getMergeEntry() { BibEntry mergedEntry = new BibEntry(); for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { @@ -121,19 +158,17 @@ public BibEntry getMergeEntry() { return mergedEntry; } - private int addColumn(String name) { + private int addColumn(Region header) { int columnIndex = supplierHeader.getChildren().size(); - Button sourceButton = new Button(name); - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == columnIndex).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); - HBox.setHgrow(sourceButton, Priority.ALWAYS); - supplierHeader.getChildren().add(sourceButton); - sourceButton.setMinWidth(250); + HBox.setHgrow(header, Priority.ALWAYS); + supplierHeader.getChildren().add(header); + header.setMinWidth(250); optionsGrid.add(new Label(), columnIndex, 0); ColumnConstraints constraint = new ColumnConstraints(); constraint.setMinWidth(Control.USE_PREF_SIZE); constraint.setMaxWidth(Control.USE_PREF_SIZE); - constraint.prefWidthProperty().bind(sourceButton.widthProperty()); + constraint.prefWidthProperty().bind(header.widthProperty()); optionsGrid.getColumnConstraints().add(constraint); return columnIndex; diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java index bfbfc8e28f8..d1d22ea2af0 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java @@ -7,6 +7,7 @@ import javafx.scene.control.ButtonType; import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -15,8 +16,8 @@ public class MultiMergeEntriesDialog extends BaseDialog { private final MultiMergeEntries multiMergeEntries; - public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences) { - multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences); + public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences, TaskExecutor taskExecutor) { + multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences, taskExecutor); init(); } From 620424cfdae94b0b15acc698d6d701d4e6ddfdc7 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 23 Jul 2021 14:26:15 +0200 Subject: [PATCH 013/108] Implemented DOI Lookup button --- .../gui/mergeentries/MultiMergeEntries.java | 56 ++++++++++++++++--- .../mergeentries/MultiMergeEntriesDialog.java | 5 +- 2 files changed, 52 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 36d7e805f6d..492fe8bf664 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -33,14 +33,24 @@ import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; +import org.jabref.logic.importer.FetcherException; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; +import org.jabref.model.entry.field.StandardField; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class MultiMergeEntries extends SplitPane { + private static final Logger LOGGER = LoggerFactory.getLogger(MultiMergeEntries.class); + private final FieldContentFormatterPreferences fieldContentFormatterPreferences; + private final ImportFormatPreferences importFormatPreferences; private final TaskExecutor taskExecutor; private HashMap fieldRows = new HashMap<>(); @@ -58,8 +68,9 @@ public class MultiMergeEntries extends SplitPane { private GridPane optionsGrid; private VBox fieldEditor; - public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences, TaskExecutor taskExecutor) { + public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; + this.importFormatPreferences = importFormatPreferences; this.taskExecutor = taskExecutor; init(); } @@ -109,8 +120,7 @@ private void init() { public void addEntry(String title, BibEntry entry) { Button sourceButton = new Button(title); int column = addColumn(sourceButton); - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == column).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); - + setupSourceButtonAction(sourceButton, column); writeBibEntryToColumn(entry, column); } @@ -123,7 +133,7 @@ public void addEntry(String title, Supplier> entrySupplier) { sourceButton.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(loadingIndicator, Priority.NEVER); int column = addColumn(header); - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream().filter(node -> GridPane.getColumnIndex(node) == column).filter(node -> node instanceof ToggleButton).forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); + setupSourceButtonAction(sourceButton, column); sourceButton.setDisable(true); loadingIndicator.prefHeightProperty().bind(sourceButton.heightProperty()); loadingIndicator.setMinHeight(Control.USE_PREF_SIZE); @@ -141,6 +151,15 @@ public void addEntry(String title, Supplier> entrySupplier) { }).executeWith(taskExecutor); } + private void setupSourceButtonAction(Button sourceButton, int column) { + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream() + .filter(node -> GridPane.getColumnIndex(node) == column) + .filter(node -> node instanceof HBox) + .forEach(hbox -> ((HBox) hbox).getChildrenUnmodifiable().stream() + .filter(node -> node instanceof ToggleButton) + .forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)))); + } + private void writeBibEntryToColumn(BibEntry bibEntry, int column) { for (Map.Entry fieldEntry : bibEntry.getFieldMap().entrySet()) { if (!fieldRows.containsKey(fieldEntry.getKey())) { @@ -184,7 +203,7 @@ public void addField(Field field) { fieldEditorCell = new TextField(); } VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); - FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell); + FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell, field); fieldRows.put(field, newRow); Label fieldHeaderLabel = new Label(field.getDisplayName()); fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); @@ -208,9 +227,12 @@ private class FieldRow { public ToggleGroup toggleGroup = new ToggleGroup(); public TextInputControl entryEditorField; - public FieldRow(int rowIndex, TextInputControl entryEditorField) { + private Field field; + + public FieldRow(int rowIndex, TextInputControl entryEditorField, Field field) { this.rowIndex = rowIndex; this.entryEditorField = entryEditorField; + this.field = field; entryEditorField.prefWidthProperty().bind(rightScrollPane.widthProperty()); entryEditorField.setMinWidth(Control.USE_PREF_SIZE); entryEditorField.setMaxWidth(Control.USE_PREF_SIZE); @@ -239,14 +261,17 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue } public void addValue(int columnIndex, String value) { + HBox cell = new HBox(); ToggleButton cellButton = new ToggleButton(value); + cell.getChildren().add(cellButton); + HBox.setHgrow(cellButton, Priority.ALWAYS); cellButton.setWrapText(true); Tooltip buttonTooltip = new Tooltip(value); buttonTooltip.setWrapText(true); buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); buttonTooltip.setTextAlignment(TextAlignment.LEFT); cellButton.setTooltip(buttonTooltip); - optionsGrid.add(cellButton, columnIndex, rowIndex); + optionsGrid.add(cell, columnIndex, rowIndex); if (toggleGroup.getSelectedToggle() == null) { cellButton.setSelected(true); } @@ -260,6 +285,23 @@ public void addValue(int columnIndex, String value) { } } cellButton.setToggleGroup(toggleGroup); + + if (field.equals(StandardField.DOI)) { + Button doiButton = new Button(Localization.lang("Lookup")); + cell.getChildren().add(doiButton); + doiButton.setOnAction(event -> { + DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); + doiButton.setDisable(true); + addEntry(Localization.lang("From DOI"), () -> { + try { + return doiFetcher.performSearchById(value); + } catch (FetcherException e) { + LOGGER.warn("Failed to fetch BibEntry for DOI {}", value, e); + return Optional.empty(); + } + }); + }); + } } } } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java index d1d22ea2af0..6089d13cadd 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java @@ -9,6 +9,7 @@ import org.jabref.gui.util.BaseDialog; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; +import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; @@ -16,8 +17,8 @@ public class MultiMergeEntriesDialog extends BaseDialog { private final MultiMergeEntries multiMergeEntries; - public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences, TaskExecutor taskExecutor) { - multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences, taskExecutor); + public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { + multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences, importFormatPreferences, taskExecutor); init(); } From 46bf75ab4ca55082cc82530ce97296b93c07c5a4 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sun, 25 Jul 2021 00:03:12 +0200 Subject: [PATCH 014/108] Changed Button content to TextFlow To be able to use the DiffHighlighter, but the TextFlow is ugly because it grows beyond it's boundaries if the text is too long. --- .../gui/mergeentries/MultiMergeEntries.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 492fe8bf664..7ed5f15e143 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -27,11 +27,15 @@ import javafx.scene.layout.Region; import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; +import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; import javafx.scene.text.TextAlignment; +import javafx.scene.text.TextFlow; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; +import org.jabref.gui.util.component.DiffHighlightingTextPane; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; @@ -219,6 +223,7 @@ public void addField(Field field) { constraint.setMinHeight(Control.USE_PREF_SIZE); constraint.setMaxHeight(Control.USE_PREF_SIZE); constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + optionsGrid.getRowConstraints().add(constraint); } @@ -262,7 +267,12 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue public void addValue(int columnIndex, String value) { HBox cell = new HBox(); - ToggleButton cellButton = new ToggleButton(value); + ToggleButton cellButton = new ToggleButton(); + TextFlow buttonText = new DiffHighlightingTextPane(); + buttonText.getChildren().add(new Text(value)); + // Label buttonText = new Label(value); + // buttonText.setWrapText(true); + cellButton.setGraphic(buttonText); cell.getChildren().add(cellButton); HBox.setHgrow(cellButton, Priority.ALWAYS); cellButton.setWrapText(true); @@ -286,6 +296,13 @@ public void addValue(int columnIndex, String value) { } cellButton.setToggleGroup(toggleGroup); + entryEditorField.textProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, String oldValue, String newValue) { + // cellButton.setText + } + }); + if (field.equals(StandardField.DOI)) { Button doiButton = new Button(Localization.lang("Lookup")); cell.getChildren().add(doiButton); From f036112435be7c4abd3500caa516fc99934543eb Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 13:28:39 +0200 Subject: [PATCH 015/108] Change DOI button to icon --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 7ed5f15e143..a20918a0ab1 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -304,7 +304,7 @@ public void changed(ObservableValue observable, String oldValu }); if (field.equals(StandardField.DOI)) { - Button doiButton = new Button(Localization.lang("Lookup")); + Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); cell.getChildren().add(doiButton); doiButton.setOnAction(event -> { DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); From a5d216c317967abaa85558a84f5ace1f72a7e31b Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 14:12:11 +0200 Subject: [PATCH 016/108] Use FileHelper method to get extension --- .../importer/fileformat/GrobidPdfMetadataImporter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java index b2b75eb24d2..c6215fd27c1 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java @@ -5,6 +5,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.util.Objects; +import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; @@ -12,6 +13,7 @@ import org.jabref.logic.importer.util.GrobidService; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.util.FileHelper; /** * Wraps the GrobidService function to be used as an Importer. @@ -75,12 +77,11 @@ public boolean isRecognizedFormat(BufferedReader reader) throws IOException { @Override public boolean isRecognizedFormat(Path filePath, Charset defaultEncoding) throws IOException { Objects.requireNonNull(filePath); - String[] splittedFileName = filePath.getFileName().toString().split("\\."); - if (splittedFileName.length <= 1) { + Optional extension = FileHelper.getFileExtension(filePath); + if (extension.isEmpty()) { return false; } - String extension = splittedFileName[splittedFileName.length - 1]; - return getFileType().getExtensions().contains(extension); + return getFileType().getExtensions().contains(extension.get()); } @Override From d9dc84e8968f25055121d59d1694bf1bd708b927 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 14:31:05 +0200 Subject: [PATCH 017/108] Use ellipsing text flow --- .../DiffHighlightingEllipsingTextFlow.java | 133 ++++++++++++++++++ .../gui/mergeentries/MultiMergeEntries.java | 61 +++++--- 2 files changed, 175 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java new file mode 100644 index 00000000000..1f76b908e83 --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -0,0 +1,133 @@ +package org.jabref.gui.mergeentries; + +import javafx.beans.DefaultProperty; +import javafx.beans.property.StringProperty; +import javafx.beans.value.ChangeListener; +import javafx.collections.FXCollections; +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import javafx.scene.Node; +import javafx.scene.text.Text; +import javafx.scene.text.TextFlow; + +@DefaultProperty("children") +public class DiffHighlightingEllipsingTextFlow extends TextFlow { + + private final static String DEFAULT_ELLIPSIS_STRING = "..."; + private StringProperty ellipsisString; + + private ObservableList allChildren = FXCollections.observableArrayList(); + private ChangeListener sizeChangeListener = (observableValue, number, t1) -> adjustText(); + + private String fullText; + + public DiffHighlightingEllipsingTextFlow(String fullText) { + this.fullText = fullText; + allChildren.addListener((ListChangeListener) this::adjustChildren); + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + adjustText(); + } + + @Override + public ObservableList getChildren() { + return allChildren; + } + + private void adjustChildren(ListChangeListener.Change change) { + while (change.next()) { + if (change.wasRemoved()) { + super.getChildren().remove(change.getFrom(), change.getTo()); + } else if (change.wasAdded()) { + super.getChildren().addAll(change.getFrom(), change.getAddedSubList()); + } + } + adjustText(); + } + + private void adjustText() { + // remove listeners + widthProperty().removeListener(sizeChangeListener); + heightProperty().removeListener(sizeChangeListener); + while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { + if (super.getChildren().isEmpty()) { + // nothing fits + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + return; + } + super.getChildren().remove(super.getChildren().size() - 1); + super.autosize(); + } + while (getHeight() <= getMaxHeight() && getWidth() <= getMaxWidth()) { + if (super.getChildren().size() == allChildren.size()) { + if (allChildren.size() > 0) { + // all Texts are displayed, let's make sure all chars are as well + Node lastChildAsShown = super.getChildren().get(super.getChildren().size() - 1); + Node lastChild = allChildren.get(allChildren.size() - 1); + if (lastChildAsShown instanceof Text && ((Text) lastChildAsShown).getText().length() < ((Text) lastChild).getText().length()) { + ((Text) lastChildAsShown).setText(((Text) lastChild).getText()); + } else { + // nothing to fill the space with + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + return; + } + } + } else { + super.getChildren().add(allChildren.get(super.getChildren().size())); + } + super.autosize(); + } + // ellipse the last text as much as necessary + while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { + Node lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); + while (getEllipsisString().equals(((Text) lastChildAsShown).getText())) { + if (super.getChildren().size() == 0) { + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + return; + } + lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); + } + if (lastChildAsShown instanceof Text && ((Text) lastChildAsShown).getText().length() > 0) { + Text shortenedChild = new Text(ellipseString(((Text) lastChildAsShown).getText())); + super.getChildren().add(shortenedChild); + } else { + // don't know what to do with anything else. Leave without adding listeners + return; + } + super.autosize(); + } + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + } + + private String ellipseString(String s) { + int spacePos = s.lastIndexOf(' '); + if (spacePos < 0) { + return getEllipsisString(); + } + return s.substring(0, spacePos) + getEllipsisString(); + } + + public final void setEllipsisString(String value) { + ellipsisString.set((value == null) ? "" : value); + } + + public String getEllipsisString() { + return ellipsisString == null ? DEFAULT_ELLIPSIS_STRING : ellipsisString.get(); + } + + public final StringProperty ellipsisStringProperty() { + return ellipsisString; + } + + public String getFullText() { + return fullText; + } + + public void setFullText(String fullText) { + this.fullText = fullText; + } +} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index a20918a0ab1..3526fc0a3f7 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -7,6 +7,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; +import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Control; import javafx.scene.control.Label; @@ -27,15 +28,13 @@ import javafx.scene.layout.Region; import javafx.scene.layout.RowConstraints; import javafx.scene.layout.VBox; -import javafx.scene.shape.Rectangle; import javafx.scene.text.Text; import javafx.scene.text.TextAlignment; -import javafx.scene.text.TextFlow; +import org.jabref.gui.icon.IconTheme; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; -import org.jabref.gui.util.component.DiffHighlightingTextPane; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; @@ -197,8 +196,15 @@ private int addColumn(Region header) { return columnIndex; } + private boolean isMultilineField(Field field) { + if (field.equals(StandardField.DOI)) { + return false; + } + return FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); + } + public void addField(Field field) { - boolean isMultiLine = FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); + boolean isMultiLine = isMultilineField(field); TextInputControl fieldEditorCell = null; if (isMultiLine) { fieldEditorCell = new TextArea(); @@ -256,7 +262,11 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue (observable, oldValue, newValue) -> { if (observable != null && newValue != null && newValue.isSelected()) { ToggleButton toggle = (ToggleButton) observable.getValue(); - entryEditorField.setText(toggle.getText()); + if (toggle.getGraphic() instanceof DiffHighlightingEllipsingTextFlow) { + entryEditorField.setText(((DiffHighlightingEllipsingTextFlow) toggle.getGraphic()).getFullText()); + } else { + entryEditorField.setText(toggle.getText()); + } entryEditorField.textProperty().addListener(textChangeListener); } else { entryEditorField.textProperty().removeListener(textChangeListener); @@ -266,22 +276,34 @@ public void changed(ObservableValue observable, Object oldValue, Object newValue } public void addValue(int columnIndex, String value) { - HBox cell = new HBox(); + boolean isMultiLine = isMultilineField(field); ToggleButton cellButton = new ToggleButton(); - TextFlow buttonText = new DiffHighlightingTextPane(); - buttonText.getChildren().add(new Text(value)); - // Label buttonText = new Label(value); - // buttonText.setWrapText(true); - cellButton.setGraphic(buttonText); - cell.getChildren().add(cellButton); + HBox cell = new HBox(); + cell.prefWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); + cell.setMinWidth(Control.USE_PREF_SIZE); + cell.setMaxWidth(Control.USE_PREF_SIZE); + cell.setSpacing(0); + // cell.setBorder(new Bor); + if (isMultiLine) { + DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(value); + buttonText.getChildren().add(new Text(value)); + // buttonText.maxWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); + // buttonText.maxHeightProperty().bind(entryEditorField.heightProperty()); + buttonText.maxWidthProperty().bind(cellButton.widthProperty()); + buttonText.maxHeightProperty().bind(cellButton.heightProperty()); + cellButton.setGraphic(buttonText); + Tooltip buttonTooltip = new Tooltip(value); + buttonTooltip.setWrapText(true); + buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); + buttonTooltip.setTextAlignment(TextAlignment.LEFT); + cellButton.setTooltip(buttonTooltip); + } else { + cellButton.setText(value); + } HBox.setHgrow(cellButton, Priority.ALWAYS); - cellButton.setWrapText(true); - Tooltip buttonTooltip = new Tooltip(value); - buttonTooltip.setWrapText(true); - buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); - buttonTooltip.setTextAlignment(TextAlignment.LEFT); - cellButton.setTooltip(buttonTooltip); + cell.getChildren().add(cellButton); optionsGrid.add(cell, columnIndex, rowIndex); + if (toggleGroup.getSelectedToggle() == null) { cellButton.setSelected(true); } @@ -299,12 +321,13 @@ public void addValue(int columnIndex, String value) { entryEditorField.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, String newValue) { - // cellButton.setText + // highlight text } }); if (field.equals(StandardField.DOI)) { Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); + HBox.setHgrow(doiButton, Priority.NEVER); cell.getChildren().add(doiButton); doiButton.setOnAction(event -> { DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); From 6e6b5bc1396c5ff48a4830383b37cc559373c904 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 14:50:56 +0200 Subject: [PATCH 018/108] Ignore empty fields --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 3526fc0a3f7..0a6d952c4ec 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -7,7 +7,6 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; -import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Control; import javafx.scene.control.Label; @@ -175,7 +174,10 @@ private void writeBibEntryToColumn(BibEntry bibEntry, int column) { public BibEntry getMergeEntry() { BibEntry mergedEntry = new BibEntry(); for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { - mergedEntry.setField(fieldRowEntry.getKey(), ((TextInputControl) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText()); + String fieldValue = ((TextInputControl) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText(); + if (fieldValue != null) { + mergedEntry.setField(fieldRowEntry.getKey(), fieldValue); + } } return mergedEntry; } From 35467159dffc3815447e42610daf1024e9fba26e Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:25:35 +0200 Subject: [PATCH 019/108] Use jsoup to issue POST request --- .../logic/importer/util/GrobidService.java | 48 ++++--------------- .../importer/util/GrobidServiceTest.java | 20 ++++++++ 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index c42d766eb8d..cd7dc161489 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -15,6 +15,9 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.util.DummyFileUpdateMonitor; +import org.jsoup.Connection; +import org.jsoup.Jsoup; + /** * Implements an API to a GROBID server, as described at * https://grobid.readthedocs.io/en/latest/Grobid-service/#grobid-web-services @@ -71,13 +74,13 @@ public String processCitation(String rawCitation, ConsolidateCitations consolida } public List processPDF(Path filePath, ImportFormatPreferences importFormatPreferences) throws IOException, ParseException { - URLDownload urlDownload = new URLDownload(grobidServerURL - + "/api/processHeaderDocument"); // shall we use processFulltextDocument? - urlDownload.setConnectTimeout(Duration.ofSeconds(150)); - urlDownload.addHeader("Accept", MediaTypes.APPLICATION_BIBTEX); - urlDownload.addHeader("Content-Type", "multipart/form-data; boundary=" + HTTP_REQUEST_BOUNDARY); - urlDownload.setPostData(readPdf(filePath)); - String httpResponse = urlDownload.asString(); + Connection.Response response = Jsoup.connect(grobidServerURL + "/api/processHeaderDocument") + .header("Accept", MediaTypes.APPLICATION_BIBTEX) + .data("input", filePath.toString(), Files.newInputStream(filePath)) + .method(Connection.Method.POST) + .execute(); + + String httpResponse = response.body(); if (httpResponse == null || httpResponse.equals("@misc{-1,\n author = {}\n}\n")) { // This filters empty BibTeX entries throw new IOException("The GROBID server response does not contain anything."); @@ -86,35 +89,4 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); return parser.parseEntries(httpResponse); } - - private byte[] readPdf(Path filePath) throws IOException { - StringBuilder preFile = new StringBuilder(); - preFile.append("--"); - preFile.append(HTTP_REQUEST_BOUNDARY); - preFile.append("\r\n"); - preFile.append("Content-Disposition: form-data; name=\"consolidateHeader\"\r\n\r\n1\r\n--"); - preFile.append(HTTP_REQUEST_BOUNDARY); - preFile.append("\r\n"); - preFile.append("Content-Disposition: form-data; name=\"input\"; filename=\""); - preFile.append(filePath.getFileName().toString()); - preFile.append("\"\r\nContent-Type: application/pdf\r\n\r\n"); - byte[] preFileBytes = preFile.toString().getBytes(); - - byte[] fileContent = Files.readAllBytes(filePath); - - StringBuilder postFile = new StringBuilder(); - postFile.append("\r\n--"); - postFile.append(HTTP_REQUEST_BOUNDARY); - postFile.append("\r\n"); - postFile.append("Content-Disposition: form-data; name=\"input\"\r\n\r\n\r\n--"); - postFile.append(HTTP_REQUEST_BOUNDARY); - postFile.append("--\r\n"); - byte[] postFileBytes = postFile.toString().getBytes(); - - byte[] post = new byte[preFileBytes.length + fileContent.length + postFileBytes.length]; - System.arraycopy(preFileBytes, 0, post, 0, preFileBytes.length); - System.arraycopy(fileContent, 0, post, preFileBytes.length, fileContent.length); - System.arraycopy(postFileBytes, 0, post, preFileBytes.length + fileContent.length, postFileBytes.length); - return post; - } } diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index d73a8911ce0..c56b0b4d268 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -1,25 +1,38 @@ package org.jabref.logic.importer.util; import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.List; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fileformat.GrobidPdfMetadataImporterTest; +import org.jabref.model.entry.BibEntry; import org.jabref.testutils.category.FetcherTest; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.mockito.Answers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @FetcherTest public class GrobidServiceTest { private static GrobidService grobidService; + private static ImportFormatPreferences importFormatPreferences; @BeforeAll public static void setup() { grobidService = new GrobidService("http://grobid.jabref.org:8070"); + importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); } @Test @@ -51,4 +64,11 @@ public void processInvalidCitationTest() { assertThrows(IOException.class, () -> grobidService.processCitation("iiiiiiiiiiiiiiiiiiiiiiii", GrobidService.ConsolidateCitations.WITH_METADATA)); } + @Test + public void processPdfTest() throws IOException, ParseException, URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("LNCS-minimal.pdf").toURI()); + List response = grobidService.processPDF(file, importFormatPreferences); + assertEquals(1, response.size()); + } + } From 6906d111c63129df687ece80048084bfeac0611f Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:26:42 +0200 Subject: [PATCH 020/108] Removed unnecessary field --- src/main/java/org/jabref/logic/importer/util/GrobidService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index cd7dc161489..df10ac37f46 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -30,8 +30,6 @@ */ public class GrobidService { - public static String HTTP_REQUEST_BOUNDARY = "---------------------------JabRefRequest"; - public enum ConsolidateCitations { NO(0), WITH_METADATA(1), WITH_DOI_ONLY(2); private int code; From c9e4c06d560f5ca38f65d71c7f127061e8d07a95 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:40:00 +0200 Subject: [PATCH 021/108] Reverted URLDownload It's no longer necessary to set the POST data by bytes as we use JSoup for that. --- src/main/java/org/jabref/logic/net/URLDownload.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/net/URLDownload.java b/src/main/java/org/jabref/logic/net/URLDownload.java index 3b1d7e16795..f0c5f778d08 100644 --- a/src/main/java/org/jabref/logic/net/URLDownload.java +++ b/src/main/java/org/jabref/logic/net/URLDownload.java @@ -69,7 +69,7 @@ public class URLDownload { private final URL source; private final Map parameters = new HashMap<>(); - private byte[] postData = null; + private String postData = ""; private Duration connectTimeout = DEFAULT_CONNECT_TIMEOUT; /** @@ -222,12 +222,6 @@ public void addHeader(String key, String value) { } public void setPostData(String postData) { - if (postData != null) { - this.postData = postData.getBytes(); - } - } - - public void setPostData(byte[] postData) { if (postData != null) { this.postData = postData; } @@ -345,10 +339,10 @@ private URLConnection openConnection() throws IOException { for (Entry entry : this.parameters.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } - if (this.postData != null) { + if (!this.postData.isEmpty()) { connection.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { - wr.write(this.postData); + wr.writeBytes(this.postData); } } From f319fc796b09d8de7a77eda96903c13f39bef335 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 17:14:07 +0200 Subject: [PATCH 022/108] Enable VGrow --- .../org/jabref/gui/mergeentries/MultiMergeEntries.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 0a6d952c4ec..1c0e5258940 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -114,6 +114,13 @@ private void init() { optionsColumn.getChildren().addAll(topScrollPane, centerScrollPane); entryColumn.getChildren().addAll(entryHeaderLabel, rightScrollPane); + VBox.setVgrow(supplierHeaderLabel, Priority.NEVER); + VBox.setVgrow(leftScrollPane, Priority.ALWAYS); + VBox.setVgrow(topScrollPane, Priority.NEVER); + VBox.setVgrow(centerScrollPane, Priority.ALWAYS); + VBox.setVgrow(entryHeaderLabel, Priority.NEVER); + VBox.setVgrow(rightScrollPane, Priority.ALWAYS); + setResizableWithParent(labelColumn, false); setDividerPositions(0.1, 0.6, 0.3); getItems().addAll(labelColumn, optionsColumn, entryColumn); From 993ad84ed8325bea8c606ecc74dfeaca7691e38f Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 13:34:15 +0200 Subject: [PATCH 023/108] Insets and DiffHighlighting --- .../gui/mergeentries/MultiMergeEntries.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java index 1c0e5258940..9d06a581f6d 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java @@ -7,6 +7,7 @@ import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; +import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Control; import javafx.scene.control.Label; @@ -221,6 +222,7 @@ public void addField(Field field) { } else { fieldEditorCell = new TextField(); } + fieldEditorCell.setPadding(new Insets(10, 0, 10, 0)); VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell, field); fieldRows.put(field, newRow); @@ -295,7 +297,8 @@ public void addValue(int columnIndex, String value) { // cell.setBorder(new Bor); if (isMultiLine) { DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(value); - buttonText.getChildren().add(new Text(value)); + buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(entryEditorField.getText(), value, " ")); + // buttonText.getChildren().add(new Text(value)); // buttonText.maxWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); // buttonText.maxHeightProperty().bind(entryEditorField.heightProperty()); buttonText.maxWidthProperty().bind(cellButton.widthProperty()); @@ -306,6 +309,13 @@ public void addValue(int columnIndex, String value) { buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); buttonTooltip.setTextAlignment(TextAlignment.LEFT); cellButton.setTooltip(buttonTooltip); + + /* + entryEditorField.textProperty().addListener((observable, oldValue, newValue) -> { + buttonText.getChildren().remove(0, buttonText.getChildren().size()); + buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(newValue, buttonText.getFullText(), " ")); + }); + */ } else { cellButton.setText(value); } @@ -327,13 +337,6 @@ public void addValue(int columnIndex, String value) { } cellButton.setToggleGroup(toggleGroup); - entryEditorField.textProperty().addListener(new ChangeListener() { - @Override - public void changed(ObservableValue observable, String oldValue, String newValue) { - // highlight text - } - }); - if (field.equals(StandardField.DOI)) { Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); HBox.setHgrow(doiButton, Priority.NEVER); From 8a7b80f853a5e1d5ccdcc843521ae9d9639aa4f5 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 20 Jul 2021 10:37:14 +0200 Subject: [PATCH 024/108] GrobidPdfMetadataImporter implemented Implemented an Importer that querries Grobid for metadata of a pdf. The necessary Grobid functionality (retrieving BibTeX for a pdf) is not yet available in Grobid, but we opened a PR that implements it (kermitt2/grobid#800). --- .../fetcher/GrobidCitationFetcher.java | 3 +- .../fileformat/GrobidPdfMetadataImporter.java | 95 +++++++++++++++++++ .../logic/importer/util/GrobidService.java | 58 +++++++++++ .../org/jabref/logic/net/URLDownload.java | 12 ++- src/main/resources/l10n/JabRef_en.properties | 2 + .../GrobidPdfMetadataImporterTest.java | 71 ++++++++++++++ 6 files changed, 237 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java create mode 100644 src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java diff --git a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java index bf16d71570d..7955e206fd7 100644 --- a/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java +++ b/src/main/java/org/jabref/logic/importer/fetcher/GrobidCitationFetcher.java @@ -23,9 +23,10 @@ public class GrobidCitationFetcher implements SearchBasedFetcher { + public static final String GROBID_URL = "http://grobid.jabref.org:8070"; + private static final Logger LOGGER = LoggerFactory.getLogger(GrobidCitationFetcher.class); - private static final String GROBID_URL = "http://grobid.jabref.org:8070"; private ImportFormatPreferences importFormatPreferences; private GrobidService grobidService; diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java new file mode 100644 index 00000000000..b2b75eb24d2 --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java @@ -0,0 +1,95 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.BufferedReader; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.Objects; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ParserResult; +import org.jabref.logic.importer.util.GrobidService; +import org.jabref.logic.l10n.Localization; +import org.jabref.logic.util.StandardFileType; + +/** + * Wraps the GrobidService function to be used as an Importer. + */ +public class GrobidPdfMetadataImporter extends Importer { + + private final GrobidService grobidService; + private final ImportFormatPreferences importFormatPreferences; + + public GrobidPdfMetadataImporter(String grobidServerURL, ImportFormatPreferences importFormatPreferences) { + this.grobidService = new GrobidService(grobidServerURL); + this.importFormatPreferences = importFormatPreferences; + } + + @Override + public String getName() { + return Localization.lang("Grobid PDF metadata"); + } + + @Override + public StandardFileType getFileType() { + return StandardFileType.PDF; + } + + @Override + public ParserResult importDatabase(BufferedReader reader) throws IOException { + Objects.requireNonNull(reader); + throw new UnsupportedOperationException( + "PdfXmpImporter does not support importDatabase(BufferedReader reader)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(String data) throws IOException { + Objects.requireNonNull(data); + throw new UnsupportedOperationException( + "PdfXmpImporter does not support importDatabase(String data)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(Path filePath, Charset defaultEncoding) { + Objects.requireNonNull(filePath); + try { + return new ParserResult(grobidService.processPDF(filePath, importFormatPreferences)); + } catch (Exception exception) { + return ParserResult.fromError(exception); + } + } + + @Override + public boolean isRecognizedFormat(BufferedReader reader) throws IOException { + Objects.requireNonNull(reader); + return false; + } + + /** + * Returns whether the given stream contains data that is a.) a pdf and b.) + * contains at least one BibEntry. + */ + @Override + public boolean isRecognizedFormat(Path filePath, Charset defaultEncoding) throws IOException { + Objects.requireNonNull(filePath); + String[] splittedFileName = filePath.getFileName().toString().split("\\."); + if (splittedFileName.length <= 1) { + return false; + } + String extension = splittedFileName[splittedFileName.length - 1]; + return getFileType().getExtensions().contains(extension); + } + + @Override + public String getId() { + return "grobidPdf"; + } + + @Override + public String getDescription() { + return "Wraps the GrobidService function to be used as an Importer."; + } +} diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index ec9b7567fc0..c42d766eb8d 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -3,9 +3,17 @@ import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Duration; +import java.util.List; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fileformat.BibtexParser; import org.jabref.logic.net.URLDownload; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.util.DummyFileUpdateMonitor; /** * Implements an API to a GROBID server, as described at @@ -19,6 +27,8 @@ */ public class GrobidService { + public static String HTTP_REQUEST_BOUNDARY = "---------------------------JabRefRequest"; + public enum ConsolidateCitations { NO(0), WITH_METADATA(1), WITH_DOI_ONLY(2); private int code; @@ -59,4 +69,52 @@ public String processCitation(String rawCitation, ConsolidateCitations consolida return httpResponse; } + + public List processPDF(Path filePath, ImportFormatPreferences importFormatPreferences) throws IOException, ParseException { + URLDownload urlDownload = new URLDownload(grobidServerURL + + "/api/processHeaderDocument"); // shall we use processFulltextDocument? + urlDownload.setConnectTimeout(Duration.ofSeconds(150)); + urlDownload.addHeader("Accept", MediaTypes.APPLICATION_BIBTEX); + urlDownload.addHeader("Content-Type", "multipart/form-data; boundary=" + HTTP_REQUEST_BOUNDARY); + urlDownload.setPostData(readPdf(filePath)); + String httpResponse = urlDownload.asString(); + + if (httpResponse == null || httpResponse.equals("@misc{-1,\n author = {}\n}\n")) { // This filters empty BibTeX entries + throw new IOException("The GROBID server response does not contain anything."); + } + + BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); + return parser.parseEntries(httpResponse); + } + + private byte[] readPdf(Path filePath) throws IOException { + StringBuilder preFile = new StringBuilder(); + preFile.append("--"); + preFile.append(HTTP_REQUEST_BOUNDARY); + preFile.append("\r\n"); + preFile.append("Content-Disposition: form-data; name=\"consolidateHeader\"\r\n\r\n1\r\n--"); + preFile.append(HTTP_REQUEST_BOUNDARY); + preFile.append("\r\n"); + preFile.append("Content-Disposition: form-data; name=\"input\"; filename=\""); + preFile.append(filePath.getFileName().toString()); + preFile.append("\"\r\nContent-Type: application/pdf\r\n\r\n"); + byte[] preFileBytes = preFile.toString().getBytes(); + + byte[] fileContent = Files.readAllBytes(filePath); + + StringBuilder postFile = new StringBuilder(); + postFile.append("\r\n--"); + postFile.append(HTTP_REQUEST_BOUNDARY); + postFile.append("\r\n"); + postFile.append("Content-Disposition: form-data; name=\"input\"\r\n\r\n\r\n--"); + postFile.append(HTTP_REQUEST_BOUNDARY); + postFile.append("--\r\n"); + byte[] postFileBytes = postFile.toString().getBytes(); + + byte[] post = new byte[preFileBytes.length + fileContent.length + postFileBytes.length]; + System.arraycopy(preFileBytes, 0, post, 0, preFileBytes.length); + System.arraycopy(fileContent, 0, post, preFileBytes.length, fileContent.length); + System.arraycopy(postFileBytes, 0, post, preFileBytes.length + fileContent.length, postFileBytes.length); + return post; + } } diff --git a/src/main/java/org/jabref/logic/net/URLDownload.java b/src/main/java/org/jabref/logic/net/URLDownload.java index f0c5f778d08..3b1d7e16795 100644 --- a/src/main/java/org/jabref/logic/net/URLDownload.java +++ b/src/main/java/org/jabref/logic/net/URLDownload.java @@ -69,7 +69,7 @@ public class URLDownload { private final URL source; private final Map parameters = new HashMap<>(); - private String postData = ""; + private byte[] postData = null; private Duration connectTimeout = DEFAULT_CONNECT_TIMEOUT; /** @@ -222,6 +222,12 @@ public void addHeader(String key, String value) { } public void setPostData(String postData) { + if (postData != null) { + this.postData = postData.getBytes(); + } + } + + public void setPostData(byte[] postData) { if (postData != null) { this.postData = postData; } @@ -339,10 +345,10 @@ private URLConnection openConnection() throws IOException { for (Entry entry : this.parameters.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } - if (!this.postData.isEmpty()) { + if (this.postData != null) { connection.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { - wr.writeBytes(this.postData); + wr.write(this.postData); } } diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 76dd9d53222..22d25fd8b59 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2365,3 +2365,5 @@ Rebuild\ fulltext\ search\ index\ for\ current\ library?=Rebuild fulltext search Rebuilding\ fulltext\ search\ index...=Rebuilding fulltext search index... Failed\ to\ access\ fulltext\ search\ index=Failed to access fulltext search index Found\ match\ in\ %0=Found match in %0 + +Grobid\ PDF\ metadata=Grobid PDF metadata diff --git a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java new file mode 100644 index 00000000000..9c448ce70bd --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java @@ -0,0 +1,71 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; +import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class GrobidPdfMetadataImporterTest { + + private GrobidPdfMetadataImporter importer; + private ImportFormatPreferences importFormatPreferences; + + @BeforeEach + public void setUp() { + importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); + importer = new GrobidPdfMetadataImporter(GrobidCitationFetcher.GROBID_URL, importFormatPreferences); + } + + @Test + public void testsGetExtensions() { + assertEquals(StandardFileType.PDF, importer.getFileType()); + } + + @Test + public void testImportEntries() throws URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("LNCS-minimal.pdf").toURI()); + List bibEntries = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + + assertEquals(1, bibEntries.size()); + + BibEntry be0 = bibEntries.get(0); + assertEquals(Optional.of("Lastname, Firstname"), be0.getField(StandardField.AUTHOR)); + assertEquals(Optional.of("Paper Title"), be0.getField(StandardField.TITLE)); + } + + @Test + public void testIsRecognizedFormat() throws IOException, URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("annotated.pdf").toURI()); + assertTrue(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + + @Test + public void testIsRecognizedFormatReject() throws IOException, URISyntaxException { + Path file = Path.of(PdfXmpImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); + assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); + } + + @Test + public void testGetCommandLineId() { + assertEquals("grobidPdf", importer.getId()); + } +} From 6fe2a236f4cbffe584986b0f3957cd4bc394e910 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 20 Jul 2021 17:24:20 +0200 Subject: [PATCH 025/108] Fixed class when accessing resources --- .../importer/fileformat/GrobidPdfMetadataImporterTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java index 9c448ce70bd..77c5b2db4d9 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporterTest.java @@ -60,7 +60,7 @@ public void testIsRecognizedFormat() throws IOException, URISyntaxException { @Test public void testIsRecognizedFormatReject() throws IOException, URISyntaxException { - Path file = Path.of(PdfXmpImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("BibtexImporter.examples.bib").toURI()); assertFalse(importer.isRecognizedFormat(file, StandardCharsets.UTF_8)); } From f99bc52d2f11176a2f170b687c844860ef938d13 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 14:12:11 +0200 Subject: [PATCH 026/108] Use FileHelper method to get extension --- .../importer/fileformat/GrobidPdfMetadataImporter.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java index b2b75eb24d2..c6215fd27c1 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java @@ -5,6 +5,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.util.Objects; +import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; @@ -12,6 +13,7 @@ import org.jabref.logic.importer.util.GrobidService; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.util.FileHelper; /** * Wraps the GrobidService function to be used as an Importer. @@ -75,12 +77,11 @@ public boolean isRecognizedFormat(BufferedReader reader) throws IOException { @Override public boolean isRecognizedFormat(Path filePath, Charset defaultEncoding) throws IOException { Objects.requireNonNull(filePath); - String[] splittedFileName = filePath.getFileName().toString().split("\\."); - if (splittedFileName.length <= 1) { + Optional extension = FileHelper.getFileExtension(filePath); + if (extension.isEmpty()) { return false; } - String extension = splittedFileName[splittedFileName.length - 1]; - return getFileType().getExtensions().contains(extension); + return getFileType().getExtensions().contains(extension.get()); } @Override From 1d64d8086995eafc83b11d25df8925a64d1a997c Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:25:35 +0200 Subject: [PATCH 027/108] Use jsoup to issue POST request --- .../logic/importer/util/GrobidService.java | 48 ++++--------------- .../importer/util/GrobidServiceTest.java | 20 ++++++++ 2 files changed, 30 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index c42d766eb8d..cd7dc161489 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -15,6 +15,9 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.util.DummyFileUpdateMonitor; +import org.jsoup.Connection; +import org.jsoup.Jsoup; + /** * Implements an API to a GROBID server, as described at * https://grobid.readthedocs.io/en/latest/Grobid-service/#grobid-web-services @@ -71,13 +74,13 @@ public String processCitation(String rawCitation, ConsolidateCitations consolida } public List processPDF(Path filePath, ImportFormatPreferences importFormatPreferences) throws IOException, ParseException { - URLDownload urlDownload = new URLDownload(grobidServerURL - + "/api/processHeaderDocument"); // shall we use processFulltextDocument? - urlDownload.setConnectTimeout(Duration.ofSeconds(150)); - urlDownload.addHeader("Accept", MediaTypes.APPLICATION_BIBTEX); - urlDownload.addHeader("Content-Type", "multipart/form-data; boundary=" + HTTP_REQUEST_BOUNDARY); - urlDownload.setPostData(readPdf(filePath)); - String httpResponse = urlDownload.asString(); + Connection.Response response = Jsoup.connect(grobidServerURL + "/api/processHeaderDocument") + .header("Accept", MediaTypes.APPLICATION_BIBTEX) + .data("input", filePath.toString(), Files.newInputStream(filePath)) + .method(Connection.Method.POST) + .execute(); + + String httpResponse = response.body(); if (httpResponse == null || httpResponse.equals("@misc{-1,\n author = {}\n}\n")) { // This filters empty BibTeX entries throw new IOException("The GROBID server response does not contain anything."); @@ -86,35 +89,4 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); return parser.parseEntries(httpResponse); } - - private byte[] readPdf(Path filePath) throws IOException { - StringBuilder preFile = new StringBuilder(); - preFile.append("--"); - preFile.append(HTTP_REQUEST_BOUNDARY); - preFile.append("\r\n"); - preFile.append("Content-Disposition: form-data; name=\"consolidateHeader\"\r\n\r\n1\r\n--"); - preFile.append(HTTP_REQUEST_BOUNDARY); - preFile.append("\r\n"); - preFile.append("Content-Disposition: form-data; name=\"input\"; filename=\""); - preFile.append(filePath.getFileName().toString()); - preFile.append("\"\r\nContent-Type: application/pdf\r\n\r\n"); - byte[] preFileBytes = preFile.toString().getBytes(); - - byte[] fileContent = Files.readAllBytes(filePath); - - StringBuilder postFile = new StringBuilder(); - postFile.append("\r\n--"); - postFile.append(HTTP_REQUEST_BOUNDARY); - postFile.append("\r\n"); - postFile.append("Content-Disposition: form-data; name=\"input\"\r\n\r\n\r\n--"); - postFile.append(HTTP_REQUEST_BOUNDARY); - postFile.append("--\r\n"); - byte[] postFileBytes = postFile.toString().getBytes(); - - byte[] post = new byte[preFileBytes.length + fileContent.length + postFileBytes.length]; - System.arraycopy(preFileBytes, 0, post, 0, preFileBytes.length); - System.arraycopy(fileContent, 0, post, preFileBytes.length, fileContent.length); - System.arraycopy(postFileBytes, 0, post, preFileBytes.length + fileContent.length, postFileBytes.length); - return post; - } } diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index d73a8911ce0..c56b0b4d268 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -1,25 +1,38 @@ package org.jabref.logic.importer.util; import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.List; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fileformat.GrobidPdfMetadataImporterTest; +import org.jabref.model.entry.BibEntry; import org.jabref.testutils.category.FetcherTest; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; +import org.mockito.Answers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; @FetcherTest public class GrobidServiceTest { private static GrobidService grobidService; + private static ImportFormatPreferences importFormatPreferences; @BeforeAll public static void setup() { grobidService = new GrobidService("http://grobid.jabref.org:8070"); + importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); } @Test @@ -51,4 +64,11 @@ public void processInvalidCitationTest() { assertThrows(IOException.class, () -> grobidService.processCitation("iiiiiiiiiiiiiiiiiiiiiiii", GrobidService.ConsolidateCitations.WITH_METADATA)); } + @Test + public void processPdfTest() throws IOException, ParseException, URISyntaxException { + Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("LNCS-minimal.pdf").toURI()); + List response = grobidService.processPDF(file, importFormatPreferences); + assertEquals(1, response.size()); + } + } From f591bfc2be642da499b9d3b0ca04d582f3032117 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:26:42 +0200 Subject: [PATCH 028/108] Removed unnecessary field --- src/main/java/org/jabref/logic/importer/util/GrobidService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index cd7dc161489..df10ac37f46 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -30,8 +30,6 @@ */ public class GrobidService { - public static String HTTP_REQUEST_BOUNDARY = "---------------------------JabRefRequest"; - public enum ConsolidateCitations { NO(0), WITH_METADATA(1), WITH_DOI_ONLY(2); private int code; From b2bd36505851a1734f1682aa6341403bbf5e7a5a Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 28 Jul 2021 15:40:00 +0200 Subject: [PATCH 029/108] Reverted URLDownload It's no longer necessary to set the POST data by bytes as we use JSoup for that. --- src/main/java/org/jabref/logic/net/URLDownload.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/net/URLDownload.java b/src/main/java/org/jabref/logic/net/URLDownload.java index 3b1d7e16795..f0c5f778d08 100644 --- a/src/main/java/org/jabref/logic/net/URLDownload.java +++ b/src/main/java/org/jabref/logic/net/URLDownload.java @@ -69,7 +69,7 @@ public class URLDownload { private final URL source; private final Map parameters = new HashMap<>(); - private byte[] postData = null; + private String postData = ""; private Duration connectTimeout = DEFAULT_CONNECT_TIMEOUT; /** @@ -222,12 +222,6 @@ public void addHeader(String key, String value) { } public void setPostData(String postData) { - if (postData != null) { - this.postData = postData.getBytes(); - } - } - - public void setPostData(byte[] postData) { if (postData != null) { this.postData = postData; } @@ -345,10 +339,10 @@ private URLConnection openConnection() throws IOException { for (Entry entry : this.parameters.entrySet()) { connection.setRequestProperty(entry.getKey(), entry.getValue()); } - if (this.postData != null) { + if (!this.postData.isEmpty()) { connection.setDoOutput(true); try (DataOutputStream wr = new DataOutputStream(connection.getOutputStream())) { - wr.write(this.postData); + wr.writeBytes(this.postData); } } From e458c777aef29b3fec25ad24e70874347c971364 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 14:07:49 +0200 Subject: [PATCH 030/108] Changelog entry --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fd26fa03dce..f1a3bb96ff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added the option to copy the DOI of an entry directly from the context menu copy submenu. [#7826](https://github.com/JabRef/jabref/issues/7826) - We added a fulltext search feature. [#2838](https://github.com/JabRef/jabref/pull/2838) +- We improved the deduction of bib-entries from imported fulltext pdf's. [#7947](https://github.com/JabRef/jabref/pull/7947) ### Changed From 5478585683958fe63e0ff937208b706f48313c66 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 16:46:08 +0200 Subject: [PATCH 031/108] Add pdf link to imported entry --- .../importer/fileformat/GrobidPdfMetadataImporter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java index c6215fd27c1..f8e50696862 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/GrobidPdfMetadataImporter.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Path; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -13,6 +14,8 @@ import org.jabref.logic.importer.util.GrobidService; import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.LinkedFile; import org.jabref.model.util.FileHelper; /** @@ -58,7 +61,9 @@ public ParserResult importDatabase(String data) throws IOException { public ParserResult importDatabase(Path filePath, Charset defaultEncoding) { Objects.requireNonNull(filePath); try { - return new ParserResult(grobidService.processPDF(filePath, importFormatPreferences)); + List result = grobidService.processPDF(filePath, importFormatPreferences); + result.forEach(entry -> entry.addFile(new LinkedFile("", filePath.toAbsolutePath(), "PDF"))); + return new ParserResult(result); } catch (Exception exception) { return ParserResult.fromError(exception); } From d0cc6637a4337a13eda25ac81baf20f6057d0cba Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 16:55:07 +0200 Subject: [PATCH 032/108] Remove citationkey from Grobid Grobid cannot predict a citationkey --- .../java/org/jabref/logic/importer/util/GrobidService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index df10ac37f46..df28f689407 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -85,6 +85,8 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo } BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); - return parser.parseEntries(httpResponse); + List result = parser.parseEntries(httpResponse); + result.stream().forEach((entry) -> entry.setCitationKey("")); + return result; } } From 2cd78fc356767f5da198e618813d5bca57b76ef9 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 16:55:41 +0200 Subject: [PATCH 033/108] FirstPageImporter --- .../fileformat/PdfFirstPageImporter.java | 116 ++++++++++++++++++ .../fileformat/PdfFirstPageImporterTest.java | 72 +++++++++++ .../logic/importer/fileformat/coverpage.pdf | Bin 0 -> 94807 bytes .../logic/importer/fileformat/embedded.pdf | Bin 0 -> 52091 bytes .../importer/fileformat/mixedMetadata.pdf | Bin 0 -> 195322 bytes 5 files changed, 188 insertions(+) create mode 100644 src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java create mode 100644 src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf create mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/mixedMetadata.pdf diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java new file mode 100644 index 00000000000..6e5d088304e --- /dev/null +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java @@ -0,0 +1,116 @@ +package org.jabref.logic.importer.fileformat; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringWriter; +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.jabref.logic.importer.FetcherException; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.ParserResult; +import org.jabref.logic.importer.fetcher.DoiFetcher; +import org.jabref.logic.l10n.Localization; +import org.jabref.logic.util.OS; +import org.jabref.logic.util.StandardFileType; +import org.jabref.logic.xmp.EncryptedPdfsNotSupportedException; +import org.jabref.logic.xmp.XmpUtilReader; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.LinkedFile; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.identifier.DOI; +import org.jabref.model.entry.types.EntryType; +import org.jabref.model.entry.types.StandardEntryType; +import org.jabref.model.strings.StringUtil; +import org.jabref.model.util.DummyFileUpdateMonitor; + +import com.google.common.base.Strings; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.text.PDFTextStripper; + +/** + * PdfContentImporter imports a verbatim BibTeX entry from the first page of the PDF. + */ +public class PdfFirstPageImporter extends Importer { + + private final ImportFormatPreferences importFormatPreferences; + + public PdfFirstPageImporter(ImportFormatPreferences importFormatPreferences) { + this.importFormatPreferences = importFormatPreferences; + } + + @Override + public boolean isRecognizedFormat(BufferedReader input) throws IOException { + return input.readLine().startsWith("%PDF"); + } + + @Override + public ParserResult importDatabase(BufferedReader reader) throws IOException { + Objects.requireNonNull(reader); + throw new UnsupportedOperationException("PdfFirstPageImporter does not support importDatabase(BufferedReader reader)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(String data) throws IOException { + Objects.requireNonNull(data); + throw new UnsupportedOperationException("PdfFirstPageImporter does not support importDatabase(String data)." + + "Instead use importDatabase(Path filePath, Charset defaultEncoding)."); + } + + @Override + public ParserResult importDatabase(Path filePath, Charset defaultEncoding) { + List result = new ArrayList<>(1); + try (PDDocument document = XmpUtilReader.loadWithAutomaticDecryption(filePath)) { + String firstPageContents = getFirstPageContents(document); + BibtexParser parser = new BibtexParser(importFormatPreferences, new DummyFileUpdateMonitor()); + result = parser.parseEntries(firstPageContents); + } catch (EncryptedPdfsNotSupportedException e) { + return ParserResult.fromErrorMessage(Localization.lang("Decryption not supported.")); + } catch (IOException | ParseException e) { + return ParserResult.fromError(e); + } + + result.forEach(entry -> entry.addFile(new LinkedFile("", filePath.toAbsolutePath(), "PDF"))); + result.forEach(entry -> entry.setCommentsBeforeEntry("")); + return new ParserResult(result); + } + + private String getFirstPageContents(PDDocument document) throws IOException { + PDFTextStripper stripper = new PDFTextStripper(); + + stripper.setStartPage(1); + stripper.setEndPage(1); + stripper.setSortByPosition(true); + stripper.setParagraphEnd(System.lineSeparator()); + StringWriter writer = new StringWriter(); + stripper.writeText(document, writer); + + return writer.toString(); + } + + @Override + public String getName() { + return "PDFfirstpage"; + } + + @Override + public StandardFileType getFileType() { + return StandardFileType.PDF; + } + + @Override + public String getDescription() { + return "PdfFirstPageImporter imports a verbatim BibTeX entry from the first page of the PDF."; + } + +} diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java new file mode 100644 index 00000000000..e8b6ffc7574 --- /dev/null +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java @@ -0,0 +1,72 @@ +package org.jabref.logic.importer.fileformat; + +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; + +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.Importer; +import org.jabref.logic.util.StandardFileType; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.LinkedFile; +import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.types.StandardEntryType; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Answers; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class PdfFirstPageImporterTest { + + private PdfFirstPageImporter importer; + private ImportFormatPreferences importFormatPreferences; + + @BeforeEach + void setUp() { + importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); + when(importFormatPreferences.getFieldContentFormatterPreferences().getNonWrappableFields()).thenReturn(List.of()); + importer = new PdfFirstPageImporter(importFormatPreferences); + } + + @Test + void testsGetExtensions() { + assertEquals(StandardFileType.PDF, importer.getFileType()); + } + + @Test + void testGetDescription() { + assertEquals("PdfFirstPageImporter imports a verbatim BibTeX entry from the first page of the PDF.", + importer.getDescription()); + } + + @Test + void doesNotHandleEncryptedPdfs() throws Exception { + Path file = Path.of(PdfFirstPageImporter.class.getResource("/pdfs/encrypted.pdf").toURI()); + List result = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + assertEquals(Collections.emptyList(), result); + } + + @Test + void importTwiceWorksAsExpected() throws Exception { + Path file = Path.of(PdfFirstPageImporterTest.class.getResource("mixedMetadata.pdf").toURI()); + List result = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + + BibEntry expected = new BibEntry(StandardEntryType.Article); + expected.setCitationKey("jabreftest2021"); + expected.setField(StandardField.AUTHOR, "Me, myself and I"); + expected.setField(StandardField.TITLE, "Something"); + expected.setField(StandardField.VOLUME, "1"); + expected.setField(StandardField.JOURNAL, "Some Journal"); + expected.setField(StandardField.YEAR, "2021"); + expected.setFiles(Collections.singletonList(new LinkedFile("", file.toAbsolutePath(), "PDF"))); + + List resultSecondImport = importer.importDatabase(file, StandardCharsets.UTF_8).getDatabase().getEntries(); + assertEquals(Collections.singletonList(expected), result); + assertEquals(Collections.singletonList(expected), resultSecondImport); + } +} diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf b/src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4ee942026a337ce7d82c15c077b89fb39cd59404 GIT binary patch literal 94807 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 ID+2$20Lpgw;s5{u literal 0 HcmV?d00001 diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf b/src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d399b8214e81c529c111beeb2a2bde6abd2cc880 GIT binary patch literal 52091 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%0D)`Vf3i{V46*wX=yM0lk>D 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

~ae05Kbmiu~4UIUMzTYCUT^zo+4kZ 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�KY(X9 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

*

- * Elements are in default order. + * Elements are sorted by name. *

* * @return all custom importers, elements are of type InputFormat */ public SortedSet getImportFormats() { - return this.formats; + return new TreeSet<>(this.formats); } /** * Human readable list of all known import formats (name and CLI Id). *

- *

List is in default-order.

+ *

List is sorted by importer name.

* * @return human readable list of all known import formats */ public String getImportFormatList() { StringBuilder sb = new StringBuilder(); - for (Importer imFo : formats) { + for (Importer imFo : getImportFormats()) { int pad = Math.max(0, 14 - imFo.getName().length()); sb.append(" "); sb.append(imFo.getName()); @@ -212,7 +213,7 @@ private UnknownFormatImport importUnknownFormat(CheckedFunction Date: Mon, 16 Aug 2021 09:06:24 +0200 Subject: [PATCH 076/108] Checkstyle --- src/main/java/org/jabref/gui/entryeditor/EntryEditor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 52695a3929a..aa3097ec004 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -45,7 +45,6 @@ import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.EntryBasedFetcher; import org.jabref.logic.importer.WebFetchers; -import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; From eadbf674225f44cb6f3026076570fd9005a32d49 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 10:14:13 +0200 Subject: [PATCH 077/108] Added explanaition on need for runInJavaFXThread --- .../org/jabref/gui/mergeentries/MultiMergeEntriesView.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 70b9d9278c5..5dc031b7477 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -251,6 +251,10 @@ private class Cell extends HBox { public Cell(String content, Field field, int columnIndex) { this.content = content; + /* + If this is not explicitly done on the JavaFX thread, the bindings to the text fields don't work properly. + The text only shows up after one text in that same row is selected by the user. + */ DefaultTaskExecutor.runInJavaFXThread(() -> { FieldRow row = fieldRows.get(field); From 2b00f4798039630779947188e4418dacb5f2742a Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 10:54:29 +0200 Subject: [PATCH 078/108] Styling for dark theme --- .../DiffHighlightingEllipsingTextFlow.java | 9 +++++++-- .../jabref/gui/mergeentries/MultiMergeEntries.css | 14 +++----------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 8e3667e57e7..79481dd7597 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -117,6 +117,7 @@ private boolean ellipseUntilTextFits() { } if (lastChildAsShown instanceof Text && ((Text) lastChildAsShown).getText().length() > 0) { Text shortenedChild = new Text(ellipseString(((Text) lastChildAsShown).getText())); + shortenedChild.getStyleClass().addAll(lastChildAsShown.getStyleClass()); super.getChildren().add(shortenedChild); } else { // don't know what to do with anything else @@ -133,7 +134,9 @@ public void highlightDiff() { final List highlightedText; switch (diffMode.getValue()) { case PLAIN: - highlightedText = List.of(new Text(fullText)); + Text text = new Text(fullText); + text.getStyleClass().add("text-unchanged"); + highlightedText = List.of(text); break; case WORD: highlightedText = DiffHighlighting.generateDiffHighlighting(fullText, comparisonString.get(), " "); @@ -146,7 +149,9 @@ public void highlightDiff() { } allChildren.addAll(highlightedText); } else { - allChildren.addAll(new Text(fullText)); + Text text = new Text(fullText); + text.getStyleClass().add("text-unchanged"); + allChildren.addAll(text); } super.autosize(); adjustText(); diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css index ed6864fccfa..bc75303ab35 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css @@ -1,13 +1,13 @@ .text-changed { - -fx-fill: darkgreen; + -fx-fill: -jr-orange; } .text-added { - -fx-fill: #54A3F2; + -fx-fill: -jr-green; } .text-removed { - -fx-fill: #FA5B68; + -fx-fill: -jr-red; } .grid-pane { @@ -21,14 +21,6 @@ -fx-border-image-insets: 0; } -.text-area:focused .content { - -fx-background-color: transparent, white, transparent, white; -} - -.text-area .content { - -fx-background-color: transparent, white, transparent, white; -} - .box { -fx-spacing: 10; } From 18dbb67b98d40cac30506e1a8095272bdbaaccf5 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 11:12:55 +0200 Subject: [PATCH 079/108] Fixed WebFetchersTest --- src/test/java/org/jabref/logic/importer/WebFetchersTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java index 458a5b0985d..0efb6c29d24 100644 --- a/src/test/java/org/jabref/logic/importer/WebFetchersTest.java +++ b/src/test/java/org/jabref/logic/importer/WebFetchersTest.java @@ -1,5 +1,6 @@ package org.jabref.logic.importer; +import java.nio.charset.Charset; import java.util.Collection; import java.util.HashSet; import java.util.Set; @@ -13,6 +14,8 @@ import org.jabref.logic.importer.fetcher.IsbnViaOttoBibFetcher; import org.jabref.logic.importer.fetcher.JstorFetcher; import org.jabref.logic.importer.fetcher.MrDLibFetcher; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.preferences.FilePreferences; import io.github.classgraph.ClassGraph; import io.github.classgraph.ClassInfoList; @@ -62,7 +65,7 @@ void getIdBasedFetchersReturnsAllFetcherDerivingFromIdBasedFetcher() throws Exce @Test void getEntryBasedFetchersReturnsAllFetcherDerivingFromEntryBasedFetcher() throws Exception { - Set idFetchers = WebFetchers.getEntryBasedFetchers(importFormatPreferences); + Set idFetchers = WebFetchers.getEntryBasedFetchers(importFormatPreferences, mock(FilePreferences.class), mock(BibDatabaseContext.class), Charset.defaultCharset()); try (ScanResult scanResult = classGraph.scan()) { ClassInfoList controlClasses = scanResult.getClassesImplementing(EntryBasedFetcher.class.getCanonicalName()); From 9a138b6cd368ee5d7b6a88159cd654bd54b530d2 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 12:33:38 +0200 Subject: [PATCH 080/108] Added parse pdf metadata button to GUI --- .../externalfiles/DownloadFullTextAction.java | 3 +- .../gui/fieldeditors/LinkedFileViewModel.java | 68 ++++++++++++------- .../gui/fieldeditors/LinkedFilesEditor.java | 10 ++- .../LinkedFilesEditorViewModel.java | 15 ++-- .../gui/importer/ImportEntriesViewModel.java | 3 +- .../gui/maintable/OpenExternalFileAction.java | 3 +- .../gui/maintable/OpenFolderAction.java | 3 +- .../gui/maintable/columns/FileColumn.java | 6 +- .../mergeentries/MultiMergeEntriesView.java | 6 +- .../fieldeditors/LinkedFileViewModelTest.java | 27 ++++---- 10 files changed, 79 insertions(+), 65 deletions(-) diff --git a/src/main/java/org/jabref/gui/externalfiles/DownloadFullTextAction.java b/src/main/java/org/jabref/gui/externalfiles/DownloadFullTextAction.java index 7f328a91ba1..93b32af2375 100644 --- a/src/main/java/org/jabref/gui/externalfiles/DownloadFullTextAction.java +++ b/src/main/java/org/jabref/gui/externalfiles/DownloadFullTextAction.java @@ -144,8 +144,7 @@ private void addLinkedFileFromURL(BibDatabaseContext databaseContext, URL url, B databaseContext, Globals.TASK_EXECUTOR, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, ExternalFileTypes.getInstance()); onlineFile.download(); diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 32b1e7fba3e..13bd20aca63 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -35,15 +35,17 @@ import org.jabref.gui.icon.IconTheme; import org.jabref.gui.icon.JabRefIcon; import org.jabref.gui.linkedfile.LinkedFileEditDialogView; +import org.jabref.gui.mergeentries.MultiMergeEntriesView; import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.externalfiles.LinkedFileHandler; +import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; +import org.jabref.logic.importer.fileformat.GrobidPdfMetadataImporter; import org.jabref.logic.l10n.Localization; import org.jabref.logic.net.URLDownload; import org.jabref.logic.util.io.FileNameUniqueness; import org.jabref.logic.util.io.FileUtil; -import org.jabref.logic.xmp.XmpPreferences; import org.jabref.logic.xmp.XmpUtilWriter; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -51,7 +53,7 @@ import org.jabref.model.strings.StringUtil; import org.jabref.model.util.FileHelper; import org.jabref.model.util.OptionalUtil; -import org.jabref.preferences.FilePreferences; +import org.jabref.preferences.PreferencesService; import de.saxsys.mvvmfx.utils.validation.FunctionBasedValidator; import de.saxsys.mvvmfx.utils.validation.ValidationMessage; @@ -69,12 +71,11 @@ public class LinkedFileViewModel extends AbstractViewModel { private final DoubleProperty downloadProgress = new SimpleDoubleProperty(-1); private final BooleanProperty downloadOngoing = new SimpleBooleanProperty(false); private final BooleanProperty isAutomaticallyFound = new SimpleBooleanProperty(false); - private final BooleanProperty canWriteXMPMetadata = new SimpleBooleanProperty(false); + private final BooleanProperty isOfflinePdf = new SimpleBooleanProperty(false); private final DialogService dialogService; private final BibEntry entry; private final TaskExecutor taskExecutor; - private final FilePreferences filePreferences; - private final XmpPreferences xmpPreferences; + private final PreferencesService preferences; private final LinkedFileHandler linkedFileHandler; private final ExternalFileTypes externalFileTypes; @@ -85,19 +86,17 @@ public LinkedFileViewModel(LinkedFile linkedFile, BibDatabaseContext databaseContext, TaskExecutor taskExecutor, DialogService dialogService, - XmpPreferences xmpPreferences, - FilePreferences filePreferences, + PreferencesService preferences, ExternalFileTypes externalFileTypes) { this.linkedFile = linkedFile; - this.filePreferences = filePreferences; - this.linkedFileHandler = new LinkedFileHandler(linkedFile, entry, databaseContext, filePreferences); + this.preferences = preferences; + this.linkedFileHandler = new LinkedFileHandler(linkedFile, entry, databaseContext, preferences.getFilePreferences()); this.databaseContext = databaseContext; this.entry = entry; this.dialogService = dialogService; this.taskExecutor = taskExecutor; this.externalFileTypes = externalFileTypes; - this.xmpPreferences = xmpPreferences; fileExistsValidator = new FunctionBasedValidator<>( linkedFile.linkProperty(), @@ -105,18 +104,18 @@ public LinkedFileViewModel(LinkedFile linkedFile, if (linkedFile.isOnlineLink()) { return true; } else { - Optional path = FileHelper.find(databaseContext, link, filePreferences); + Optional path = FileHelper.find(databaseContext, link, preferences.getFilePreferences()); return path.isPresent() && Files.exists(path.get()); } }, ValidationMessage.warning(Localization.lang("Could not find file '%0'.", linkedFile.getLink()))); downloadOngoing.bind(downloadProgress.greaterThanOrEqualTo(0).and(downloadProgress.lessThan(1))); - canWriteXMPMetadata.setValue(!linkedFile.isOnlineLink() && linkedFile.getFileType().equalsIgnoreCase("pdf")); + isOfflinePdf.setValue(!linkedFile.isOnlineLink() && linkedFile.getFileType().equalsIgnoreCase("pdf")); } - public BooleanProperty canWriteXMPMetadataProperty() { - return canWriteXMPMetadata; + public BooleanProperty isOfflinePdfProperty() { + return isOfflinePdf; } public boolean isAutomaticallyFound() { @@ -211,7 +210,7 @@ public void openFolder() { Optional resolvedPath = FileHelper.find( databaseContext, linkedFile.getLink(), - filePreferences); + preferences.getFilePreferences()); if (resolvedPath.isPresent()) { JabRefDesktop.openFolderAndSelectFile(resolvedPath.get()); @@ -246,7 +245,7 @@ public void renameFileToName(String targetFileName) { return; } - Optional file = linkedFile.findIn(databaseContext, filePreferences); + Optional file = linkedFile.findIn(databaseContext, preferences.getFilePreferences()); if (file.isPresent()) { performRenameWithConflictCheck(targetFileName); } else { @@ -283,13 +282,13 @@ public void moveToDefaultDirectory() { } // Get target folder - Optional fileDir = databaseContext.getFirstExistingFileDir(filePreferences); + Optional fileDir = databaseContext.getFirstExistingFileDir(preferences.getFilePreferences()); if (fileDir.isEmpty()) { dialogService.showErrorDialogAndWait(Localization.lang("Move file"), Localization.lang("File directory is not set or does not exist!")); return; } - Optional file = linkedFile.findIn(databaseContext, filePreferences); + Optional file = linkedFile.findIn(databaseContext, preferences.getFilePreferences()); if ((file.isPresent())) { // Found the linked file, so move it try { @@ -325,9 +324,9 @@ public boolean isGeneratedNameSameAsOriginal() { * @return true if suggested filepath is same as existing filepath. */ public boolean isGeneratedPathSameAsOriginal() { - Optional newDir = databaseContext.getFirstExistingFileDir(filePreferences); + Optional newDir = databaseContext.getFirstExistingFileDir(preferences.getFilePreferences()); - Optional currentDir = linkedFile.findIn(databaseContext, filePreferences).map(Path::getParent); + Optional currentDir = linkedFile.findIn(databaseContext, preferences.getFilePreferences()).map(Path::getParent); BiPredicate equality = (fileA, fileB) -> { try { @@ -351,7 +350,7 @@ public void moveToDefaultDirectoryAndRename() { * successfully, does not exist in the first place or the user choose to remove it) */ public boolean delete() { - Optional file = linkedFile.findIn(databaseContext, filePreferences); + Optional file = linkedFile.findIn(databaseContext, preferences.getFilePreferences()); if (file.isEmpty()) { LOGGER.warn("Could not find file " + linkedFile.getLink()); @@ -395,13 +394,13 @@ public void edit() { public void writeXMPMetadata() { // Localization.lang("Writing XMP metadata...") BackgroundTask writeTask = BackgroundTask.wrap(() -> { - Optional file = linkedFile.findIn(databaseContext, filePreferences); + Optional file = linkedFile.findIn(databaseContext, preferences.getFilePreferences()); if (file.isEmpty()) { // TODO: Print error message // Localization.lang("PDF does not exist"); } else { try { - XmpUtilWriter.writeXmp(file.get(), entry, databaseContext.getDatabase(), xmpPreferences); + XmpUtilWriter.writeXmp(file.get(), entry, databaseContext.getDatabase(), preferences.getXmpPreferences()); } catch (IOException | TransformerException ex) { // TODO: Print error message // Localization.lang("Error while writing") + " '" + file.toString() + "': " + ex; @@ -421,7 +420,7 @@ public void download() { throw new UnsupportedOperationException("In order to download the file it has to be an online link"); } try { - Optional targetDirectory = databaseContext.getFirstExistingFileDir(filePreferences); + Optional targetDirectory = databaseContext.getFirstExistingFileDir(preferences.getFilePreferences()); if (targetDirectory.isEmpty()) { dialogService.showErrorDialogAndWait(Localization.lang("Download file"), Localization.lang("File directory is not set or does not exist!")); return; @@ -443,7 +442,7 @@ public void download() { } if (!isDuplicate) { - LinkedFile newLinkedFile = LinkedFilesEditorViewModel.fromFile(destination, databaseContext.getFileDirectories(filePreferences), externalFileTypes); + LinkedFile newLinkedFile = LinkedFilesEditorViewModel.fromFile(destination, databaseContext.getFileDirectories(preferences.getFilePreferences()), externalFileTypes); List linkedFiles = entry.getFiles(); entry.addLinkedFile(entry, linkedFile, newLinkedFile, linkedFiles); @@ -495,7 +494,7 @@ public BackgroundTask prepareDownloadTask(Path targetDirectory, URLDownloa String suggestedTypeName = externalFileType.getName(); linkedFile.setFileType(suggestedTypeName); String suggestedName = linkedFileHandler.getSuggestedFileName(externalFileType.getExtension()); - String fulltextDir = FileUtil.createDirNameFromPattern(databaseContext.getDatabase(), entry, filePreferences.getFileDirectoryPattern()); + String fulltextDir = FileUtil.createDirNameFromPattern(databaseContext.getDatabase(), entry, preferences.getFilePreferences().getFileDirectoryPattern()); suggestedName = FileNameUniqueness.getNonOverWritingFileName(targetDirectory.resolve(fulltextDir), suggestedName); return targetDirectory.resolve(fulltextDir).resolve(suggestedName); }) @@ -538,4 +537,21 @@ public LinkedFile getFile() { public ValidationStatus fileExistsValidationStatus() { return fileExistsValidator.getValidationStatus(); } + + public void parsePdfMetadataAndShowMergeDialog() { + linkedFile.findIn(databaseContext, preferences.getFilePreferences()).ifPresent(filePath -> { + MultiMergeEntriesView dialog = new MultiMergeEntriesView(preferences, taskExecutor); + dialog.addSource(Localization.lang("Entry"), entry); + dialog.addSource(Localization.lang("Grobid"), () -> new GrobidPdfMetadataImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + // to be added once #7947 is merged + // dialog.addSource(Localization.lang("Embedded"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + // dialog.addSource(Localization.lang("XMP"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + // dialog.addSource(Localization.lang("Verbatim"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + // dialog.addSource(Localization.lang("Content"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.showAndWait().ifPresent(newEntry -> { + databaseContext.getDatabase().removeEntry(entry); + databaseContext.getDatabase().insertEntry(newEntry); + }); + }); + } } diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 89859d5251f..909b55f4572 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -174,14 +174,20 @@ private static Node createFileDisplay(LinkedFileViewModel linkedFile) { Button writeXMPMetadata = IconTheme.JabRefIcons.IMPORT.asButton(); writeXMPMetadata.setTooltip(new Tooltip(Localization.lang("Write BibTeXEntry as XMP metadata to PDF."))); - writeXMPMetadata.visibleProperty().bind(linkedFile.canWriteXMPMetadataProperty()); + writeXMPMetadata.visibleProperty().bind(linkedFile.isOfflinePdfProperty()); writeXMPMetadata.setOnAction(event -> linkedFile.writeXMPMetadata()); writeXMPMetadata.getStyleClass().setAll("icon-button"); + Button parsePdfMetadata = IconTheme.JabRefIcons.FILE_SEARCH.asButton(); + parsePdfMetadata.setTooltip(new Tooltip(Localization.lang("Parse Metadata from PDF."))); + parsePdfMetadata.visibleProperty().bind(linkedFile.isOfflinePdfProperty()); + parsePdfMetadata.setOnAction(event -> linkedFile.parsePdfMetadataAndShowMergeDialog()); + parsePdfMetadata.getStyleClass().setAll("icon-button"); + HBox container = new HBox(10); container.setPrefHeight(Double.NEGATIVE_INFINITY); - container.getChildren().addAll(acceptAutoLinkedFile, info, writeXMPMetadata); + container.getChildren().addAll(acceptAutoLinkedFile, info, writeXMPMetadata, parsePdfMetadata); return container; } diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java index de4ccfa1e84..e3f542e4a95 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditorViewModel.java @@ -106,8 +106,7 @@ public LinkedFileViewModel fromFile(Path file) { databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, externalFileTypes); } @@ -123,8 +122,7 @@ private List parseToFileViewModel(String stringValue) { databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, externalFileTypes)) .collect(Collectors.toList()); } @@ -154,8 +152,7 @@ public void addNewFile() { databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, externalFileTypes)); }); } @@ -192,8 +189,7 @@ private List findAssociatedNotLinkedFiles(BibEntry entry) { databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, externalFileTypes); newLinkedFile.markAsAutomaticallyFound(); result.add(newLinkedFile); @@ -243,8 +239,7 @@ private void addFromURL(URL url) { databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - preferences.getFilePreferences(), + preferences, externalFileTypes); files.add(onlineFile); onlineFile.download(); diff --git a/src/main/java/org/jabref/gui/importer/ImportEntriesViewModel.java b/src/main/java/org/jabref/gui/importer/ImportEntriesViewModel.java index 5402e77a4e4..a5dfacdfec5 100644 --- a/src/main/java/org/jabref/gui/importer/ImportEntriesViewModel.java +++ b/src/main/java/org/jabref/gui/importer/ImportEntriesViewModel.java @@ -152,8 +152,7 @@ public void importEntries(List entriesToImport, boolean shouldDownload databaseContext, taskExecutor, dialogService, - preferences.getXmpPreferences(), - filePreferences, + preferences, ExternalFileTypes.getInstance()); linkedFileViewModel.download(); } diff --git a/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java b/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java index a11ab0dfa88..1c5b182689d 100644 --- a/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java +++ b/src/main/java/org/jabref/gui/maintable/OpenExternalFileAction.java @@ -54,8 +54,7 @@ public void execute() { databaseContext, Globals.TASK_EXECUTOR, dialogService, - preferencesService.getXmpPreferences(), - preferencesService.getFilePreferences(), + preferencesService, ExternalFileTypes.getInstance()); linkedFileViewModelList.add(linkedFileViewModel); diff --git a/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java b/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java index 8b147729d86..ae7540d110b 100644 --- a/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java +++ b/src/main/java/org/jabref/gui/maintable/OpenFolderAction.java @@ -37,8 +37,7 @@ public void execute() { databaseContext, Globals.TASK_EXECUTOR, dialogService, - preferencesService.getXmpPreferences(), - preferencesService.getFilePreferences(), + preferencesService, ExternalFileTypes.getInstance() ); linkedFileViewModel.openFolder(); diff --git a/src/main/java/org/jabref/gui/maintable/columns/FileColumn.java b/src/main/java/org/jabref/gui/maintable/columns/FileColumn.java index 3ad18d627ab..c963ed87b23 100644 --- a/src/main/java/org/jabref/gui/maintable/columns/FileColumn.java +++ b/src/main/java/org/jabref/gui/maintable/columns/FileColumn.java @@ -68,8 +68,7 @@ public FileColumn(MainTableColumnModel model, entry.getEntry(), database, Globals.TASK_EXECUTOR, dialogService, - preferencesService.getXmpPreferences(), - preferencesService.getFilePreferences(), + preferencesService, externalFileTypes); linkedFileViewModel.open(); } @@ -132,8 +131,7 @@ private ContextMenu createFileMenu(BibEntryTableViewModel entry, List { private final MultiMergeEntriesViewModel viewModel; private final TaskExecutor taskExecutor; - private final JabRefPreferences preferences; + private final PreferencesService preferences; - public MultiMergeEntriesView(JabRefPreferences preferences, + public MultiMergeEntriesView(PreferencesService preferences, TaskExecutor taskExecutor) { this.preferences = preferences; this.taskExecutor = taskExecutor; diff --git a/src/test/java/org/jabref/gui/fieldeditors/LinkedFileViewModelTest.java b/src/test/java/org/jabref/gui/fieldeditors/LinkedFileViewModelTest.java index b5443699f57..5b78bd0d6c2 100644 --- a/src/test/java/org/jabref/gui/fieldeditors/LinkedFileViewModelTest.java +++ b/src/test/java/org/jabref/gui/fieldeditors/LinkedFileViewModelTest.java @@ -28,6 +28,7 @@ import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; import org.jabref.preferences.FilePreferences; +import org.jabref.preferences.PreferencesService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; @@ -60,7 +61,7 @@ class LinkedFileViewModelTest { private DialogService dialogService; private final ExternalFileTypes externalFileType = mock(ExternalFileTypes.class); private final FilePreferences filePreferences = mock(FilePreferences.class); - private final XmpPreferences xmpPreferences = mock(XmpPreferences.class); + private final PreferencesService preferences = mock(PreferencesService.class); private CookieManager cookieManager; @BeforeEach @@ -76,6 +77,8 @@ void setUp(@TempDir Path tempFolder) throws Exception { when(externalFileType.getExternalFileTypeByMimeType(contains("text/html"))).thenReturn(Optional.of(StandardExternalFileType.URL)); when(externalFileType.getExternalFileTypeByExt("pdf")).thenReturn(Optional.of(StandardExternalFileType.PDF)); when(externalFileType.getExternalFileTypeByExt("html")).thenReturn(Optional.of(StandardExternalFileType.URL)); + when(preferences.getFilePreferences()).thenReturn(filePreferences); + when(preferences.getXmpPreferences()).thenReturn(mock(XmpPreferences.class)); tempFile = tempFolder.resolve("temporaryFile"); Files.createFile(tempFile); @@ -100,7 +103,7 @@ void deleteWhenFilePathNotPresentReturnsTrue() { linkedFile = spy(new LinkedFile("", Path.of("nonexistent file"), "")); doReturn(Optional.empty()).when(linkedFile).findIn(any(BibDatabaseContext.class), any(FilePreferences.class)); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); boolean removed = viewModel.delete(); assertTrue(removed); @@ -118,7 +121,7 @@ void deleteWhenRemoveChosenReturnsTrueButDoesNotDeletesFile() { any(ButtonType.class), any(ButtonType.class))).thenAnswer(invocation -> Optional.of(invocation.getArgument(3))); // first vararg - remove button - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); boolean removed = viewModel.delete(); assertTrue(removed); @@ -136,7 +139,7 @@ void deleteWhenDeleteChosenReturnsTrueAndDeletesFile() { any(ButtonType.class), any(ButtonType.class))).thenAnswer(invocation -> Optional.of(invocation.getArgument(4))); // second vararg - delete button - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); boolean removed = viewModel.delete(); assertTrue(removed); @@ -154,7 +157,7 @@ void deleteMissingFileReturnsTrue() { any(ButtonType.class), any(ButtonType.class))).thenAnswer(invocation -> Optional.of(invocation.getArgument(4))); // second vararg - delete button - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); boolean removed = viewModel.delete(); assertTrue(removed); @@ -171,7 +174,7 @@ void deleteWhenDialogCancelledReturnsFalseAndDoesNotRemoveFile() { any(ButtonType.class), any(ButtonType.class))).thenAnswer(invocation -> Optional.of(invocation.getArgument(5))); // third vararg - cancel button - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); boolean removed = viewModel.delete(); assertFalse(removed); @@ -189,7 +192,7 @@ void downloadHtmlFileCausesWarningDisplay() throws MalformedURLException { String fileType = StandardExternalFileType.URL.getName(); linkedFile = new LinkedFile(url, fileType); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, preferences, externalFileType); viewModel.download(); @@ -204,7 +207,7 @@ void downloadDoesNotOverwriteFileTypeExtension() throws MalformedURLException { when(filePreferences.getFileNamePattern()).thenReturn("[citationkey]"); when(filePreferences.getFileDirectoryPattern()).thenReturn(""); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, preferences, externalFileType); BackgroundTask task = viewModel.prepareDownloadTask(tempFile.getParent(), new URLDownload("http://arxiv.org/pdf/1207.0408v1")); task.onSuccess(destination -> { @@ -229,7 +232,7 @@ void downloadHtmlWhenLinkedFilePointsToHtml() throws MalformedURLException { databaseContext.setDatabasePath(tempFile); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, preferences, externalFileType); viewModel.download(); @@ -252,7 +255,7 @@ void isNotSamePath() { when(filePreferences.getFileNamePattern()).thenReturn("[citationkey]"); when(databaseContext.getFirstExistingFileDir(filePreferences)).thenReturn(Optional.of(Path.of("/home"))); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); assertFalse(viewModel.isGeneratedPathSameAsOriginal()); } @@ -263,7 +266,7 @@ void isSamePath() { when(filePreferences.getFileNamePattern()).thenReturn("[citationkey]"); when(databaseContext.getFirstExistingFileDir(filePreferences)).thenReturn(Optional.of(tempFile.getParent())); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, taskExecutor, dialogService, preferences, externalFileType); assertTrue(viewModel.isGeneratedPathSameAsOriginal()); } @@ -286,7 +289,7 @@ void downloadPdfFileWhenLinkedFilePointsToPdfUrl() throws MalformedURLException databaseContext.setDatabasePath(tempFile); - LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, xmpPreferences, filePreferences, externalFileType); + LinkedFileViewModel viewModel = new LinkedFileViewModel(linkedFile, entry, databaseContext, new CurrentThreadTaskExecutor(), dialogService, preferences, externalFileType); viewModel.download(); // Loop through downloaded files to check for filetype='pdf' From 41de0d023c9ce50efe24a94f5978be8cc4413760 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 12:37:33 +0200 Subject: [PATCH 081/108] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d3c1aed5c1..08421d2bcd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added a fulltext search feature. [#2838](https://github.com/JabRef/jabref/pull/2838) - We improved the deduction of bib-entries from imported fulltext pdfs. [#7947](https://github.com/JabRef/jabref/pull/7947) - We added unprotect_terms to the list of bracketed pattern modifiers [#7826](https://github.com/JabRef/jabref/pull/7960) +- We added a dialog that allows to parse metadata from linked pdfs. [#7929](https://github.com/JabRef/jabref/pull/7929) ### Changed From 6cd954439a7690fc1dd98463956c0986119f3c9d Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 14:22:59 +0200 Subject: [PATCH 082/108] Fixed moving-text glitch --- .../DiffHighlightingEllipsingTextFlow.java | 37 ++++++++----------- .../gui/mergeentries/MultiMergeEntries.css | 2 + .../mergeentries/MultiMergeEntriesView.java | 5 ++- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 79481dd7597..3270a2b44a4 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -48,10 +48,8 @@ public ObservableList getChildren() { } private void adjustChildren(ListChangeListener.Change change) { - while (change.next()) { - super.getChildren().clear(); - super.getChildren().addAll(allChildren); - } + super.getChildren().clear(); + super.getChildren().addAll(allChildren); super.autosize(); adjustText(); } @@ -108,21 +106,16 @@ private boolean fillUntilOverflowing() { private boolean ellipseUntilTextFits() { while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { - Node lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); - while (getEllipsisString().equals(((Text) lastChildAsShown).getText())) { - if (super.getChildren().size() == 0) { + Text lastChildAsShown = (Text) super.getChildren().remove(super.getChildren().size() - 1); + while (getEllipsisString().equals(lastChildAsShown.getText()) || "".equals(lastChildAsShown.getText())) { + if (super.getChildren().isEmpty()) { return false; } - lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); - } - if (lastChildAsShown instanceof Text && ((Text) lastChildAsShown).getText().length() > 0) { - Text shortenedChild = new Text(ellipseString(((Text) lastChildAsShown).getText())); - shortenedChild.getStyleClass().addAll(lastChildAsShown.getStyleClass()); - super.getChildren().add(shortenedChild); - } else { - // don't know what to do with anything else - return false; + lastChildAsShown = (Text) super.getChildren().remove(super.getChildren().size() - 1); } + Text shortenedChild = new Text(ellipseString(lastChildAsShown.getText())); + shortenedChild.getStyleClass().addAll(lastChildAsShown.getStyleClass()); + super.getChildren().add(shortenedChild); super.autosize(); } return true; @@ -139,19 +132,19 @@ public void highlightDiff() { highlightedText = List.of(text); break; case WORD: - highlightedText = DiffHighlighting.generateDiffHighlighting(fullText, comparisonString.get(), " "); + highlightedText = DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, " "); break; case CHARACTER: - highlightedText = DiffHighlighting.generateDiffHighlighting(fullText, comparisonString.get(), ""); + highlightedText = DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, ""); break; default: throw new UnsupportedOperationException("Not implemented " + diffMode.getValue()); } - allChildren.addAll(highlightedText); + allChildren.addAll(highlightedText); } else { Text text = new Text(fullText); text.getStyleClass().add("text-unchanged"); - allChildren.addAll(text); + allChildren.add(text); } super.autosize(); adjustText(); @@ -159,8 +152,8 @@ public void highlightDiff() { private String ellipseString(String s) { int spacePos = s.lastIndexOf(' '); - if (spacePos < 0) { - return ""; + if (spacePos <= 0) { + return getEllipsisString(); } return s.substring(0, spacePos) + getEllipsisString(); } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css index bc75303ab35..99dffba7da4 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css @@ -19,6 +19,8 @@ -fx-border-insets: 0; -fx-background-insets: 0; -fx-border-image-insets: 0; + -fx-padding: 0; + -fx-background-radius: 0; } .box { diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 39ea74f7108..8a540e70049 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -271,6 +271,7 @@ public Cell(String content, Field field, int columnIndex) { cellButton.prefHeightProperty().bind(heightProperty()); cellButton.setMinHeight(Control.USE_PREF_SIZE); cellButton.setMaxHeight(Control.USE_PREF_SIZE); + cellButton.setGraphicTextGap(0); getChildren().add(cellButton); cellButton.maxWidthProperty().bind(widthProperty()); HBox.setHgrow(cellButton, Priority.ALWAYS); @@ -278,8 +279,8 @@ public Cell(String content, Field field, int columnIndex) { // Text DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content, viewModel.mergedEntryProperty().get().getFieldBinding(field).asOrdinary(), diffMode.valueProperty()); - buttonText.maxWidthProperty().bind(widthProperty()); - buttonText.maxHeightProperty().bind(heightProperty()); + buttonText.maxWidthProperty().bind(widthProperty().add(-10)); + buttonText.maxHeightProperty().bind(heightProperty().add(-10)); cellButton.setGraphic(buttonText); // Tooltip From 1f4bf8440a6bac08ba43ab1d7595569dd37056b8 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 14:33:46 +0200 Subject: [PATCH 083/108] Follow up on glitch-fix --- .../gui/mergeentries/DiffHighlightingEllipsingTextFlow.java | 2 +- .../org/jabref/gui/mergeentries/MultiMergeEntriesView.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 3270a2b44a4..bd8c2362fa0 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -153,7 +153,7 @@ public void highlightDiff() { private String ellipseString(String s) { int spacePos = s.lastIndexOf(' '); if (spacePos <= 0) { - return getEllipsisString(); + return ""; } return s.substring(0, spacePos) + getEllipsisString(); } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 8a540e70049..40670b86f13 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -10,6 +10,7 @@ import javafx.collections.ListChangeListener; import javafx.collections.MapChangeListener; import javafx.fxml.FXML; +import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; @@ -280,7 +281,7 @@ public Cell(String content, Field field, int columnIndex) { DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content, viewModel.mergedEntryProperty().get().getFieldBinding(field).asOrdinary(), diffMode.valueProperty()); buttonText.maxWidthProperty().bind(widthProperty().add(-10)); - buttonText.maxHeightProperty().bind(heightProperty().add(-10)); + buttonText.maxHeightProperty().bind(heightProperty()); cellButton.setGraphic(buttonText); // Tooltip From 0468e67e436cc25e3ebdbde51a9a9b07816c0983 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 14:39:49 +0200 Subject: [PATCH 084/108] Checkstyle and localization --- .../org/jabref/gui/fieldeditors/LinkedFileViewModel.java | 4 ++-- .../jabref/gui/mergeentries/MultiMergeEntriesView.java | 1 - src/main/resources/l10n/JabRef_en.properties | 8 ++++++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 13bd20aca63..ead8810228e 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -542,10 +542,10 @@ public void parsePdfMetadataAndShowMergeDialog() { linkedFile.findIn(databaseContext, preferences.getFilePreferences()).ifPresent(filePath -> { MultiMergeEntriesView dialog = new MultiMergeEntriesView(preferences, taskExecutor); dialog.addSource(Localization.lang("Entry"), entry); - dialog.addSource(Localization.lang("Grobid"), () -> new GrobidPdfMetadataImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource("Grobid", () -> new GrobidPdfMetadataImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); // to be added once #7947 is merged // dialog.addSource(Localization.lang("Embedded"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - // dialog.addSource(Localization.lang("XMP"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + // dialog.addSource(Localization.lang("XMP metadata"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); // dialog.addSource(Localization.lang("Verbatim"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); // dialog.addSource(Localization.lang("Content"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); dialog.showAndWait().ifPresent(newEntry -> { diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 40670b86f13..79e2a476cca 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -10,7 +10,6 @@ import javafx.collections.ListChangeListener; import javafx.collections.MapChangeListener; import javafx.fxml.FXML; -import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 4ce17bb33f0..2b28299d0a0 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2365,3 +2365,11 @@ Failed\ to\ access\ fulltext\ search\ index=Failed to access fulltext search ind Found\ match\ in\ %0=Found match in %0 Grobid\ PDF\ metadata=Grobid PDF metadata +Character\ by\ character=Character by character +Embedded=Embedded +Entry=Entry +Parse\ Metadata\ from\ PDF.=Parse Metadata from PDF. +Symmetric\ character\ by\ character=Symmetric character by character +Symmetric\ word\ by\ word=Symmetric word by word +Verbatim=Verbatim +Word\ by\ word=Word by word From 3d46df470b77d393ffffa9e6651a7b70679c3ca6 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 14:45:02 +0200 Subject: [PATCH 085/108] Grobid does not need localization --- .../org/jabref/logic/importer/fileformat/PdfGrobidImporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java index dcdd9463628..094b02308fc 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java @@ -33,7 +33,7 @@ public PdfGrobidImporter(String grobidServerURL, ImportFormatPreferences importF @Override public String getName() { - return Localization.lang("Grobid"); + return "Grobid"; } @Override From 40b27598081d7c9eaf98a84347bfd6789fa8703e Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 14:46:20 +0200 Subject: [PATCH 086/108] Followup on removed Grobid localization --- src/main/resources/l10n/JabRef_en.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 57f6d4be53c..7b60659b08c 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2362,5 +2362,3 @@ Rebuild\ fulltext\ search\ index\ for\ current\ library?=Rebuild fulltext search Rebuilding\ fulltext\ search\ index...=Rebuilding fulltext search index... Failed\ to\ access\ fulltext\ search\ index=Failed to access fulltext search index Found\ match\ in\ %0=Found match in %0 - -Grobid=Grobid From 6324cf2fda844d3bb4479522df848a9242bc4820 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 15:07:33 +0200 Subject: [PATCH 087/108] Fixed tests --- .../logic/importer/ImportFormatReaderIntegrationTest.java | 2 ++ .../logic/importer/ImportFormatReaderTestParameterless.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java b/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java index 3f338e8d6e8..8a32f29391d 100644 --- a/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java +++ b/src/test/java/org/jabref/logic/importer/ImportFormatReaderIntegrationTest.java @@ -5,6 +5,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; +import java.util.Set; import java.util.stream.Stream; import org.jabref.logic.preferences.TimestampPreferences; @@ -31,6 +32,7 @@ void setUp() { reader = new ImportFormatReader(); ImportFormatPreferences importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getEncoding()).thenReturn(StandardCharsets.UTF_8); + when(importFormatPreferences.getCustomImportList()).thenReturn(Set.of()); when(timestampPreferences.getTimestampField()).then(invocation -> StandardField.TIMESTAMP); reader.resetImportFormats(importFormatPreferences, mock(XmpPreferences.class), new DummyFileUpdateMonitor()); } diff --git a/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java b/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java index ab838803ae2..b44125c11bb 100644 --- a/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java +++ b/src/test/java/org/jabref/logic/importer/ImportFormatReaderTestParameterless.java @@ -2,6 +2,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; +import java.util.Set; import org.jabref.logic.preferences.TimestampPreferences; import org.jabref.logic.xmp.XmpPreferences; @@ -27,6 +28,7 @@ void setUp() { reader = new ImportFormatReader(); ImportFormatPreferences importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getEncoding()).thenReturn(StandardCharsets.UTF_8); + when(importFormatPreferences.getCustomImportList()).thenReturn(Set.of()); reader.resetImportFormats(importFormatPreferences, mock(XmpPreferences.class), fileMonitor); } From 089b025cda44b27c2fe285a2fd4b360345189e95 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 15:17:51 +0200 Subject: [PATCH 088/108] Enable all importers --- .../gui/fieldeditors/LinkedFileViewModel.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 3e74f4d4412..147d31e94ff 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -41,7 +41,11 @@ import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.externalfiles.LinkedFileHandler; import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; +import org.jabref.logic.importer.fileformat.PdfContentImporter; +import org.jabref.logic.importer.fileformat.PdfEmbeddedBibFileImporter; import org.jabref.logic.importer.fileformat.PdfGrobidImporter; +import org.jabref.logic.importer.fileformat.PdfVerbatimBibTextImporter; +import org.jabref.logic.importer.fileformat.PdfXmpImporter; import org.jabref.logic.l10n.Localization; import org.jabref.logic.net.URLDownload; import org.jabref.logic.util.io.FileNameUniqueness; @@ -543,11 +547,10 @@ public void parsePdfMetadataAndShowMergeDialog() { MultiMergeEntriesView dialog = new MultiMergeEntriesView(preferences, taskExecutor); dialog.addSource(Localization.lang("Entry"), entry); dialog.addSource("Grobid", () -> new PdfGrobidImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - // to be added once #7947 is merged - // dialog.addSource(Localization.lang("Embedded"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - // dialog.addSource(Localization.lang("XMP metadata"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - // dialog.addSource(Localization.lang("Verbatim"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - // dialog.addSource(Localization.lang("Content"), () -> new GrobidPdfMetadataImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource(Localization.lang("Embedded"), () -> new PdfEmbeddedBibFileImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource(Localization.lang("XMP metadata"), () -> new PdfXmpImporter(preferences.getXmpPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource(Localization.lang("Verbatim"), () -> new PdfVerbatimBibTextImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource(Localization.lang("Content"), () -> new PdfContentImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); dialog.showAndWait().ifPresent(newEntry -> { databaseContext.getDatabase().removeEntry(entry); databaseContext.getDatabase().insertEntry(newEntry); From b555adafc9633a63aee601671717ed8c7a75b266 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 21:21:23 +0200 Subject: [PATCH 089/108] Checkstyle --- .../org/jabref/logic/importer/fileformat/PdfGrobidImporter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java index 094b02308fc..84f952d0601 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfGrobidImporter.java @@ -12,7 +12,6 @@ import org.jabref.logic.importer.Importer; import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.util.GrobidService; -import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.StandardFileType; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; From 44fee74862022b757641aed5b11c17634f80b710 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 18 Aug 2021 08:50:44 +0200 Subject: [PATCH 090/108] Improved display --- .../org/jabref/gui/mergeentries/MultiMergeEntriesView.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 79e2a476cca..43e72f9be79 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -14,6 +14,7 @@ import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; import javafx.scene.control.ComboBox; +import javafx.scene.control.ContentDisplay; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; @@ -282,6 +283,8 @@ public Cell(String content, Field field, int columnIndex) { buttonText.maxWidthProperty().bind(widthProperty().add(-10)); buttonText.maxHeightProperty().bind(heightProperty()); cellButton.setGraphic(buttonText); + cellButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + cellButton.setContentDisplay(ContentDisplay.CENTER); // Tooltip Tooltip buttonTooltip = new Tooltip(content); From 7a98c8a9d947266606327177fce802552f90702b Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 18 Aug 2021 21:31:10 +0200 Subject: [PATCH 091/108] Modern switch statements Co-authored-by: Carl Christian Snethlage <50491877+calixtus@users.noreply.github.com> --- .../DiffHighlightingEllipsingTextFlow.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index bd8c2362fa0..6169f36f0de 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -124,22 +124,16 @@ private boolean ellipseUntilTextFits() { public void highlightDiff() { allChildren.clear(); if (comparisonString.get() != null && !comparisonString.get().equals(fullText)) { - final List highlightedText; - switch (diffMode.getValue()) { - case PLAIN: + final List highlightedText = switch (diffMode.getValue()) { + case PLAIN -> { Text text = new Text(fullText); text.getStyleClass().add("text-unchanged"); - highlightedText = List.of(text); - break; - case WORD: - highlightedText = DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, " "); - break; - case CHARACTER: - highlightedText = DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, ""); - break; - default: - throw new UnsupportedOperationException("Not implemented " + diffMode.getValue()); - } + yield List.of(text); + } + case WORD -> DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, " "); + case CHARACTER -> DiffHighlighting.generateDiffHighlighting(comparisonString.get(), fullText, ""); + default -> throw new UnsupportedOperationException("Not implemented " + diffMode.getValue()); + }; allChildren.addAll(highlightedText); } else { Text text = new Text(fullText); From fb186e31aff0556dc6da45d6bd52b029d5008eec Mon Sep 17 00:00:00 2001 From: Carl Christian Snethlage Date: Wed, 18 Aug 2021 21:53:51 +0200 Subject: [PATCH 092/108] Fixed position of buttons in LinkedFilesEditor --- .../java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java index 909b55f4572..c85c76d6f94 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFilesEditor.java @@ -23,6 +23,7 @@ import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; import javafx.scene.text.Text; import org.jabref.gui.DialogService; @@ -162,6 +163,7 @@ private static Node createFileDisplay(LinkedFileViewModel linkedFile) { progressIndicator.visibleProperty().bind(linkedFile.downloadOngoingProperty()); HBox info = new HBox(8); + HBox.setHgrow(info, Priority.ALWAYS); info.setStyle("-fx-padding: 0.5em 0 0.5em 0;"); // To align with buttons below which also have 0.5em padding info.getChildren().setAll(icon, link, desc, progressIndicator); From 9f69569bb6b68bef3bd0a0123e612169c542d121 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Thu, 19 Aug 2021 10:10:57 +0200 Subject: [PATCH 093/108] Collapse importers that yield no result --- .../gui/fieldeditors/LinkedFileViewModel.java | 27 +++++++++++++++---- .../gui/mergeentries/MultiMergeEntries.fxml | 1 + .../mergeentries/MultiMergeEntriesView.java | 11 ++++++++ .../MultiMergeEntriesViewModel.java | 12 +++++++++ src/main/resources/l10n/JabRef_en.properties | 1 + 5 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java index 147d31e94ff..63e12206bf8 100644 --- a/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java +++ b/src/main/java/org/jabref/gui/fieldeditors/LinkedFileViewModel.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Optional; import java.util.function.BiPredicate; +import java.util.function.Supplier; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; @@ -40,6 +41,8 @@ import org.jabref.gui.util.ControlHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.externalfiles.LinkedFileHandler; +import org.jabref.logic.importer.Importer; +import org.jabref.logic.importer.ParserResult; import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; import org.jabref.logic.importer.fileformat.PdfContentImporter; import org.jabref.logic.importer.fileformat.PdfEmbeddedBibFileImporter; @@ -546,15 +549,29 @@ public void parsePdfMetadataAndShowMergeDialog() { linkedFile.findIn(databaseContext, preferences.getFilePreferences()).ifPresent(filePath -> { MultiMergeEntriesView dialog = new MultiMergeEntriesView(preferences, taskExecutor); dialog.addSource(Localization.lang("Entry"), entry); - dialog.addSource("Grobid", () -> new PdfGrobidImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - dialog.addSource(Localization.lang("Embedded"), () -> new PdfEmbeddedBibFileImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - dialog.addSource(Localization.lang("XMP metadata"), () -> new PdfXmpImporter(preferences.getXmpPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - dialog.addSource(Localization.lang("Verbatim"), () -> new PdfVerbatimBibTextImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); - dialog.addSource(Localization.lang("Content"), () -> new PdfContentImporter(preferences.getImportFormatPreferences()).importDatabase(filePath, preferences.getDefaultEncoding()).getDatabase().getEntries().get(0)); + dialog.addSource("Grobid", wrapImporterToSupplier(new PdfGrobidImporter(GrobidCitationFetcher.GROBID_URL, preferences.getImportFormatPreferences()), filePath)); + dialog.addSource(Localization.lang("Embedded"), wrapImporterToSupplier(new PdfEmbeddedBibFileImporter(preferences.getImportFormatPreferences()), filePath)); + dialog.addSource(Localization.lang("XMP metadata"), wrapImporterToSupplier(new PdfXmpImporter(preferences.getXmpPreferences()), filePath)); + dialog.addSource(Localization.lang("Verbatim"), wrapImporterToSupplier(new PdfVerbatimBibTextImporter(preferences.getImportFormatPreferences()), filePath)); + dialog.addSource(Localization.lang("Content"), wrapImporterToSupplier(new PdfContentImporter(preferences.getImportFormatPreferences()), filePath)); dialog.showAndWait().ifPresent(newEntry -> { databaseContext.getDatabase().removeEntry(entry); databaseContext.getDatabase().insertEntry(newEntry); }); }); } + + private Supplier wrapImporterToSupplier(Importer importer, Path filePath) { + return () -> { + try { + ParserResult parserResult = importer.importDatabase(filePath, preferences.getDefaultEncoding()); + if (parserResult.isInvalid() || parserResult.isEmpty() || !parserResult.getDatabase().hasEntries()) { + return null; + } + return parserResult.getDatabase().getEntries().get(0); + } catch (IOException e) { + return null; + } + }; + } } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index 6f05aefcb43..a90588d7df9 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -45,6 +45,7 @@ +

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 literal 0 HcmV?d00001 From eb22157838461e4b436de1cb0004ced14405b249 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 16:57:55 +0200 Subject: [PATCH 034/108] Fixed grammar mistake in CHANGELOG.md Co-authored-by: Christoph --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1a3bb96ff5..c20be87f1c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve - We added the option to copy the DOI of an entry directly from the context menu copy submenu. [#7826](https://github.com/JabRef/jabref/issues/7826) - We added a fulltext search feature. [#2838](https://github.com/JabRef/jabref/pull/2838) -- We improved the deduction of bib-entries from imported fulltext pdf's. [#7947](https://github.com/JabRef/jabref/pull/7947) +- We improved the deduction of bib-entries from imported fulltext pdfs. [#7947](https://github.com/JabRef/jabref/pull/7947) ### Changed From 3ac0094eefb522d036e8166cf019cb87842cc067 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 17:02:02 +0200 Subject: [PATCH 035/108] Fixed Grobid tests --- .../jabref/logic/importer/util/GrobidServiceTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index c56b0b4d268..5f13f566a33 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -4,11 +4,13 @@ import java.net.URISyntaxException; import java.nio.file.Path; import java.util.List; +import java.util.Optional; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.GrobidPdfMetadataImporterTest; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.StandardField; import org.jabref.testutils.category.FetcherTest; import org.junit.jupiter.api.BeforeAll; @@ -30,7 +32,7 @@ public class GrobidServiceTest { @BeforeAll public static void setup() { - grobidService = new GrobidService("http://grobid.jabref.org:8070"); + grobidService = new GrobidService("http://office:8070"); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); } @@ -46,7 +48,7 @@ public void processValidCitationTest() throws IOException { assertTrue(responseRows[1].contains("author") && responseRows[1].contains("Derwing, T and Rossiter, M")); assertTrue(responseRows[2].contains("title") && responseRows[2].contains("Teaching native speakers")); assertTrue(responseRows[3].contains("journal") && responseRows[3].contains("Journal of Multilingual and Multicultural")); - assertTrue(responseRows[4].contains("year") && responseRows[4].contains("2002")); + assertTrue(responseRows[4].contains("date") && responseRows[4].contains("2002")); assertTrue(responseRows[5].contains("pages") && responseRows[5].contains("245--259")); assertTrue(responseRows[6].contains("volume") && responseRows[6].contains("23")); assertTrue(responseRows[7].contains("number") && responseRows[7].contains("4")); @@ -69,6 +71,10 @@ public void processPdfTest() throws IOException, ParseException, URISyntaxExcept Path file = Path.of(GrobidPdfMetadataImporterTest.class.getResource("LNCS-minimal.pdf").toURI()); List response = grobidService.processPDF(file, importFormatPreferences); assertEquals(1, response.size()); + BibEntry be0 = response.get(0); + assertEquals(Optional.of("Lastname, Firstname"), be0.getField(StandardField.AUTHOR)); + assertEquals(Optional.of("Paper Title"), be0.getField(StandardField.TITLE)); + assertEquals(Optional.of("2014-10-5"), be0.getField(StandardField.DATE)); } } From c87ed4e9ba6d979fad77428f9d948913c84de66f Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 17:03:19 +0200 Subject: [PATCH 036/108] Fixed Grobid URL --- .../java/org/jabref/logic/importer/util/GrobidServiceTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index 5f13f566a33..3dd0be06db9 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -8,6 +8,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.ParseException; +import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; import org.jabref.logic.importer.fileformat.GrobidPdfMetadataImporterTest; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; @@ -32,7 +33,7 @@ public class GrobidServiceTest { @BeforeAll public static void setup() { - grobidService = new GrobidService("http://office:8070"); + grobidService = new GrobidService(GrobidCitationFetcher.GROBID_URL); importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getKeywordSeparator()).thenReturn(','); } From 3d8c4da8d3edac0c24e9196c3a4cba9930878a25 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 17:05:08 +0200 Subject: [PATCH 037/108] Checkstyle --- .../logic/importer/fileformat/PdfFirstPageImporterTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java index e8b6ffc7574..7f7f3c53793 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporterTest.java @@ -6,7 +6,6 @@ import java.util.List; import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.Importer; import org.jabref.logic.util.StandardFileType; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; From 168b8669d76f77f4fb87b709efaf0c32c4c5cee2 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 17:12:17 +0200 Subject: [PATCH 038/108] Fixed doc --- .../jabref/logic/importer/fileformat/PdfFirstPageImporter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java index 6e5d088304e..a8783ad473f 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java @@ -38,7 +38,7 @@ import org.apache.pdfbox.text.PDFTextStripper; /** - * PdfContentImporter imports a verbatim BibTeX entry from the first page of the PDF. + * PdfFirstPageImporter imports a verbatim BibTeX entry from the first page of the PDF. */ public class PdfFirstPageImporter extends Importer { From 42adea9dd91ef2f2b26dcda51b78a129ff41e442 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Fri, 30 Jul 2021 17:13:28 +0200 Subject: [PATCH 039/108] Checkstyle --- .../importer/fileformat/PdfFirstPageImporter.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java index a8783ad473f..54d4658a6d7 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfFirstPageImporter.java @@ -7,33 +7,20 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.Locale; import java.util.Objects; -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.l10n.Localization; -import org.jabref.logic.util.OS; import org.jabref.logic.util.StandardFileType; import org.jabref.logic.xmp.EncryptedPdfsNotSupportedException; import org.jabref.logic.xmp.XmpUtilReader; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; -import org.jabref.model.entry.field.StandardField; -import org.jabref.model.entry.identifier.DOI; -import org.jabref.model.entry.types.EntryType; -import org.jabref.model.entry.types.StandardEntryType; -import org.jabref.model.strings.StringUtil; import org.jabref.model.util.DummyFileUpdateMonitor; -import com.google.common.base.Strings; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; From 980af839b90b34c007c10988ce23655a961618e7 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sun, 1 Aug 2021 15:56:50 +0200 Subject: [PATCH 040/108] MVVM split --- .../gui/mergeentries/MultiMergeEntries.fxml | 46 +++ .../gui/mergeentries/MultiMergeEntries.java | 359 ------------------ .../mergeentries/MultiMergeEntriesDialog.java | 48 --- .../mergeentries/MultiMergeEntriesView.java | 342 +++++++++++++++++ .../MultiMergeEntriesViewModel.java | 57 +++ 5 files changed, 445 insertions(+), 407 deletions(-) create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml delete mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java delete mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml new file mode 100644 index 00000000000..dd4296a580a --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java deleted file mode 100644 index 9d06a581f6d..00000000000 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.java +++ /dev/null @@ -1,359 +0,0 @@ -package org.jabref.gui.mergeentries; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Supplier; - -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; -import javafx.geometry.Insets; -import javafx.scene.control.Button; -import javafx.scene.control.Control; -import javafx.scene.control.Label; -import javafx.scene.control.ProgressIndicator; -import javafx.scene.control.ScrollPane; -import javafx.scene.control.SplitPane; -import javafx.scene.control.TextArea; -import javafx.scene.control.TextField; -import javafx.scene.control.TextInputControl; -import javafx.scene.control.Toggle; -import javafx.scene.control.ToggleButton; -import javafx.scene.control.ToggleGroup; -import javafx.scene.control.Tooltip; -import javafx.scene.layout.ColumnConstraints; -import javafx.scene.layout.GridPane; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; -import javafx.scene.layout.RowConstraints; -import javafx.scene.layout.VBox; -import javafx.scene.text.Text; -import javafx.scene.text.TextAlignment; - -import org.jabref.gui.icon.IconTheme; -import org.jabref.gui.util.BackgroundTask; -import org.jabref.gui.util.DefaultTaskExecutor; -import org.jabref.gui.util.TaskExecutor; -import org.jabref.logic.bibtex.FieldContentFormatterPreferences; -import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.fetcher.DoiFetcher; -import org.jabref.logic.l10n.Localization; -import org.jabref.model.entry.BibEntry; -import org.jabref.model.entry.field.Field; -import org.jabref.model.entry.field.FieldFactory; -import org.jabref.model.entry.field.StandardField; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MultiMergeEntries extends SplitPane { - - private static final Logger LOGGER = LoggerFactory.getLogger(MultiMergeEntries.class); - - private final FieldContentFormatterPreferences fieldContentFormatterPreferences; - private final ImportFormatPreferences importFormatPreferences; - private final TaskExecutor taskExecutor; - private HashMap fieldRows = new HashMap<>(); - - private VBox labelColumn; - private VBox optionsColumn; - private VBox entryColumn; - - private ScrollPane topScrollPane; - private ScrollPane leftScrollPane; - private ScrollPane centerScrollPane; - private ScrollPane rightScrollPane; - - private HBox supplierHeader; - private VBox fieldHeader; - private GridPane optionsGrid; - private VBox fieldEditor; - - public MultiMergeEntries(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { - this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; - this.importFormatPreferences = importFormatPreferences; - this.taskExecutor = taskExecutor; - init(); - } - - private void init() { - - labelColumn = new VBox(); - optionsColumn = new VBox(); - entryColumn = new VBox(); - - supplierHeader = new HBox(); - fieldHeader = new VBox(); - optionsGrid = new GridPane(); - fieldEditor = new VBox(); - - topScrollPane = new ScrollPane(supplierHeader); - leftScrollPane = new ScrollPane(fieldHeader); - centerScrollPane = new ScrollPane(optionsGrid); - rightScrollPane = new ScrollPane(fieldEditor); - topScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - topScrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - leftScrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - leftScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - centerScrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); - topScrollPane.hvalueProperty().bindBidirectional(centerScrollPane.hvalueProperty()); - leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); - rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); - - Label supplierHeaderLabel = new Label(Localization.lang("Supplier")); - Label entryHeaderLabel = new Label(Localization.lang("Entry")); - supplierHeaderLabel.prefHeightProperty().bind(supplierHeader.heightProperty()); - supplierHeaderLabel.setMinHeight(Control.USE_PREF_SIZE); - supplierHeaderLabel.setMaxHeight(Control.USE_PREF_SIZE); - entryHeaderLabel.prefHeightProperty().bind(supplierHeader.heightProperty()); - entryHeaderLabel.setMinHeight(Control.USE_PREF_SIZE); - entryHeaderLabel.setMaxHeight(Control.USE_PREF_SIZE); - - labelColumn.getChildren().addAll(supplierHeaderLabel, leftScrollPane); - optionsColumn.getChildren().addAll(topScrollPane, centerScrollPane); - entryColumn.getChildren().addAll(entryHeaderLabel, rightScrollPane); - - VBox.setVgrow(supplierHeaderLabel, Priority.NEVER); - VBox.setVgrow(leftScrollPane, Priority.ALWAYS); - VBox.setVgrow(topScrollPane, Priority.NEVER); - VBox.setVgrow(centerScrollPane, Priority.ALWAYS); - VBox.setVgrow(entryHeaderLabel, Priority.NEVER); - VBox.setVgrow(rightScrollPane, Priority.ALWAYS); - - setResizableWithParent(labelColumn, false); - setDividerPositions(0.1, 0.6, 0.3); - getItems().addAll(labelColumn, optionsColumn, entryColumn); - } - - public void addEntry(String title, BibEntry entry) { - Button sourceButton = new Button(title); - int column = addColumn(sourceButton); - setupSourceButtonAction(sourceButton, column); - writeBibEntryToColumn(entry, column); - } - - public void addEntry(String title, Supplier> entrySupplier) { - HBox header = new HBox(); - Button sourceButton = new Button(title); - ProgressIndicator loadingIndicator = new ProgressIndicator(-1); - header.getChildren().addAll(sourceButton, loadingIndicator); - HBox.setHgrow(sourceButton, Priority.ALWAYS); - sourceButton.setMaxWidth(Double.MAX_VALUE); - HBox.setHgrow(loadingIndicator, Priority.NEVER); - int column = addColumn(header); - setupSourceButtonAction(sourceButton, column); - sourceButton.setDisable(true); - loadingIndicator.prefHeightProperty().bind(sourceButton.heightProperty()); - loadingIndicator.setMinHeight(Control.USE_PREF_SIZE); - loadingIndicator.setMaxHeight(Control.USE_PREF_SIZE); - - BackgroundTask.wrap(() -> { - Optional entry = entrySupplier.get(); - DefaultTaskExecutor.runInJavaFXThread(() -> { - if (entry.isPresent()) { - sourceButton.setDisable(false); - writeBibEntryToColumn(entry.get(), column); - } - header.getChildren().remove(loadingIndicator); - }); - }).executeWith(taskExecutor); - } - - private void setupSourceButtonAction(Button sourceButton, int column) { - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream() - .filter(node -> GridPane.getColumnIndex(node) == column) - .filter(node -> node instanceof HBox) - .forEach(hbox -> ((HBox) hbox).getChildrenUnmodifiable().stream() - .filter(node -> node instanceof ToggleButton) - .forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)))); - } - - private void writeBibEntryToColumn(BibEntry bibEntry, int column) { - for (Map.Entry fieldEntry : bibEntry.getFieldMap().entrySet()) { - if (!fieldRows.containsKey(fieldEntry.getKey())) { - addField(fieldEntry.getKey()); - } - fieldRows.get(fieldEntry.getKey()).addValue(column, fieldEntry.getValue()); - } - } - - public BibEntry getMergeEntry() { - BibEntry mergedEntry = new BibEntry(); - for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { - String fieldValue = ((TextInputControl) fieldEditor.getChildren().get(fieldRowEntry.getValue().rowIndex)).getText(); - if (fieldValue != null) { - mergedEntry.setField(fieldRowEntry.getKey(), fieldValue); - } - } - return mergedEntry; - } - - private int addColumn(Region header) { - int columnIndex = supplierHeader.getChildren().size(); - HBox.setHgrow(header, Priority.ALWAYS); - supplierHeader.getChildren().add(header); - header.setMinWidth(250); - - optionsGrid.add(new Label(), columnIndex, 0); - ColumnConstraints constraint = new ColumnConstraints(); - constraint.setMinWidth(Control.USE_PREF_SIZE); - constraint.setMaxWidth(Control.USE_PREF_SIZE); - constraint.prefWidthProperty().bind(header.widthProperty()); - optionsGrid.getColumnConstraints().add(constraint); - - return columnIndex; - } - - private boolean isMultilineField(Field field) { - if (field.equals(StandardField.DOI)) { - return false; - } - return FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); - } - - public void addField(Field field) { - boolean isMultiLine = isMultilineField(field); - TextInputControl fieldEditorCell = null; - if (isMultiLine) { - fieldEditorCell = new TextArea(); - ((TextArea) fieldEditorCell).setWrapText(true); - } else { - fieldEditorCell = new TextField(); - } - fieldEditorCell.setPadding(new Insets(10, 0, 10, 0)); - VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); - FieldRow newRow = new FieldRow(fieldHeader.getChildren().size(), fieldEditorCell, field); - fieldRows.put(field, newRow); - Label fieldHeaderLabel = new Label(field.getDisplayName()); - fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); - fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); - fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); - fieldEditorCell.setMaxHeight(Double.MAX_VALUE); - VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); - fieldHeader.getChildren().add(fieldHeaderLabel); - fieldEditor.getChildren().add(fieldEditorCell); - - optionsGrid.add(new Label(), 0, newRow.rowIndex); - RowConstraints constraint = new RowConstraints(); - constraint.setMinHeight(Control.USE_PREF_SIZE); - constraint.setMaxHeight(Control.USE_PREF_SIZE); - constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); - - optionsGrid.getRowConstraints().add(constraint); - } - - private class FieldRow { - public int rowIndex; - public ToggleGroup toggleGroup = new ToggleGroup(); - public TextInputControl entryEditorField; - - private Field field; - - public FieldRow(int rowIndex, TextInputControl entryEditorField, Field field) { - this.rowIndex = rowIndex; - this.entryEditorField = entryEditorField; - this.field = field; - entryEditorField.prefWidthProperty().bind(rightScrollPane.widthProperty()); - entryEditorField.setMinWidth(Control.USE_PREF_SIZE); - entryEditorField.setMaxWidth(Control.USE_PREF_SIZE); - - ChangeListener textChangeListener = new ChangeListener() { - @Override - public void changed(ObservableValue observable, Object oldValue, Object newValue) { - if (toggleGroup.getSelectedToggle() != null) { - toggleGroup.getSelectedToggle().setSelected(false); - entryEditorField.textProperty().removeListener(this); - } - } - }; - - toggleGroup.selectedToggleProperty().addListener( - (observable, oldValue, newValue) -> { - if (observable != null && newValue != null && newValue.isSelected()) { - ToggleButton toggle = (ToggleButton) observable.getValue(); - if (toggle.getGraphic() instanceof DiffHighlightingEllipsingTextFlow) { - entryEditorField.setText(((DiffHighlightingEllipsingTextFlow) toggle.getGraphic()).getFullText()); - } else { - entryEditorField.setText(toggle.getText()); - } - entryEditorField.textProperty().addListener(textChangeListener); - } else { - entryEditorField.textProperty().removeListener(textChangeListener); - } - } - ); - } - - public void addValue(int columnIndex, String value) { - boolean isMultiLine = isMultilineField(field); - ToggleButton cellButton = new ToggleButton(); - HBox cell = new HBox(); - cell.prefWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); - cell.setMinWidth(Control.USE_PREF_SIZE); - cell.setMaxWidth(Control.USE_PREF_SIZE); - cell.setSpacing(0); - // cell.setBorder(new Bor); - if (isMultiLine) { - DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(value); - buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(entryEditorField.getText(), value, " ")); - // buttonText.getChildren().add(new Text(value)); - // buttonText.maxWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); - // buttonText.maxHeightProperty().bind(entryEditorField.heightProperty()); - buttonText.maxWidthProperty().bind(cellButton.widthProperty()); - buttonText.maxHeightProperty().bind(cellButton.heightProperty()); - cellButton.setGraphic(buttonText); - Tooltip buttonTooltip = new Tooltip(value); - buttonTooltip.setWrapText(true); - buttonTooltip.prefWidthProperty().bind(cellButton.widthProperty()); - buttonTooltip.setTextAlignment(TextAlignment.LEFT); - cellButton.setTooltip(buttonTooltip); - - /* - entryEditorField.textProperty().addListener((observable, oldValue, newValue) -> { - buttonText.getChildren().remove(0, buttonText.getChildren().size()); - buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(newValue, buttonText.getFullText(), " ")); - }); - */ - } else { - cellButton.setText(value); - } - HBox.setHgrow(cellButton, Priority.ALWAYS); - cell.getChildren().add(cellButton); - optionsGrid.add(cell, columnIndex, rowIndex); - - if (toggleGroup.getSelectedToggle() == null) { - cellButton.setSelected(true); - } - for (Toggle otherToggle : toggleGroup.getToggles()) { - if (otherToggle instanceof ToggleButton) { - ToggleButton otherToggleButton = (ToggleButton) otherToggle; - if (otherToggleButton.getText().equals(value)) { - cellButton.selectedProperty().bindBidirectional(otherToggleButton.selectedProperty()); - return; - } - } - } - cellButton.setToggleGroup(toggleGroup); - - if (field.equals(StandardField.DOI)) { - Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); - HBox.setHgrow(doiButton, Priority.NEVER); - cell.getChildren().add(doiButton); - doiButton.setOnAction(event -> { - DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); - doiButton.setDisable(true); - addEntry(Localization.lang("From DOI"), () -> { - try { - return doiFetcher.performSearchById(value); - } catch (FetcherException e) { - LOGGER.warn("Failed to fetch BibEntry for DOI {}", value, e); - return Optional.empty(); - } - }); - }); - } - } - } -} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java deleted file mode 100644 index 6089d13cadd..00000000000 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesDialog.java +++ /dev/null @@ -1,48 +0,0 @@ -package org.jabref.gui.mergeentries; - -import java.util.Optional; -import java.util.function.Supplier; - -import javafx.scene.control.ButtonBar; -import javafx.scene.control.ButtonType; - -import org.jabref.gui.util.BaseDialog; -import org.jabref.gui.util.TaskExecutor; -import org.jabref.logic.bibtex.FieldContentFormatterPreferences; -import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.l10n.Localization; -import org.jabref.model.entry.BibEntry; - -public class MultiMergeEntriesDialog extends BaseDialog { - - private final MultiMergeEntries multiMergeEntries; - - public MultiMergeEntriesDialog(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { - multiMergeEntries = new MultiMergeEntries(fieldContentFormatterPreferences, importFormatPreferences, taskExecutor); - - init(); - } - - private void init() { - this.getDialogPane().setContent(multiMergeEntries); - - // Create buttons - ButtonType replaceEntries = new ButtonType(Localization.lang("Merge entries"), ButtonBar.ButtonData.OK_DONE); - this.getDialogPane().getButtonTypes().setAll(ButtonType.CANCEL, replaceEntries); - this.setResultConverter(buttonType -> { - if (buttonType.equals(replaceEntries)) { - return multiMergeEntries.getMergeEntry(); - } else { - return null; - } - }); - } - - public void addEntry(String title, BibEntry entry) { - multiMergeEntries.addEntry(title, entry); - } - - public void addEntry(String title, Supplier> entrySupplier) { - multiMergeEntries.addEntry(title, entrySupplier); - } -} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java new file mode 100644 index 00000000000..801010d7eb8 --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -0,0 +1,342 @@ +package org.jabref.gui.mergeentries; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +import javafx.beans.value.ChangeListener; +import javafx.fxml.FXML; +import javafx.geometry.Insets; +import javafx.scene.control.Button; +import javafx.scene.control.ButtonBar; +import javafx.scene.control.ButtonType; +import javafx.scene.control.Control; +import javafx.scene.control.Label; +import javafx.scene.control.ProgressIndicator; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.scene.control.TextInputControl; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.RowConstraints; +import javafx.scene.layout.VBox; +import javafx.scene.text.TextAlignment; + +import org.jabref.gui.icon.IconTheme; +import org.jabref.gui.util.BackgroundTask; +import org.jabref.gui.util.BaseDialog; +import org.jabref.gui.util.DefaultTaskExecutor; +import org.jabref.gui.util.TaskExecutor; +import org.jabref.logic.bibtex.FieldContentFormatterPreferences; +import org.jabref.logic.importer.FetcherException; +import org.jabref.logic.importer.ImportFormatPreferences; +import org.jabref.logic.importer.fetcher.DoiFetcher; +import org.jabref.logic.l10n.Localization; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; +import org.jabref.model.entry.field.FieldFactory; +import org.jabref.model.entry.field.StandardField; + +import com.airhacks.afterburner.views.ViewLoader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MultiMergeEntriesView extends BaseDialog { + + private static final Logger LOGGER = LoggerFactory.getLogger(MultiMergeEntriesView.class); + + // LEFT + @FXML private ScrollPane leftScrollPane; + @FXML private VBox fieldHeader; + + // CENTER + @FXML private ScrollPane topScrollPane; + @FXML private HBox supplierHeader; + @FXML private ScrollPane centerScrollPane; + @FXML private GridPane optionsGrid; + + // RIGHT + @FXML private ScrollPane rightScrollPane; + @FXML private VBox fieldEditor; + + private final MultiMergeEntriesViewModel viewModel; + private final FieldContentFormatterPreferences fieldContentFormatterPreferences; + private final ImportFormatPreferences importFormatPreferences; + private final TaskExecutor taskExecutor; + + public MultiMergeEntriesView(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { + viewModel = new MultiMergeEntriesViewModel(); + + ViewLoader.view(this) + .load() + .setAsDialogPane(this); + + this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; + this.importFormatPreferences = importFormatPreferences; + this.taskExecutor = taskExecutor; + + ButtonType mergeEntries = new ButtonType(Localization.lang("Merge entries"), ButtonBar.ButtonData.OK_DONE); + this.getDialogPane().getButtonTypes().setAll(ButtonType.CANCEL, mergeEntries); + this.setResultConverter(buttonType -> { + if (buttonType.equals(mergeEntries)) { + return viewModel.getMergedEntry(); + } else { + return null; + } + }); + } + + @FXML + public void initialize() { + topScrollPane.hvalueProperty().bindBidirectional(centerScrollPane.hvalueProperty()); + leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); + rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); + } + + /** + * Add a new source of bib-data to the view + * @param title the column header for this source of data + * @param entry the new data + */ + public void addSource(String title, BibEntry entry) { + Button sourceButton = new Button(title); + int column = addColumn(sourceButton); + setupSourceButtonAction(sourceButton, column); + writeBibEntryToColumn(entry, column); + } + + /** + * Add a new supplier of bib-data to the view + * @param title the column header for this source of data + * @param entrySupplier the supplier that will gather data + */ + public void addSource(String title, Supplier> entrySupplier) { + LoadingSupplierHeader sourceButton = new LoadingSupplierHeader(title); + int column = addColumn(sourceButton); + setupSourceButtonAction(sourceButton, column); + + BackgroundTask.wrap(() -> { + Optional entry = entrySupplier.get(); + DefaultTaskExecutor.runInJavaFXThread(() -> { + if (entry.isPresent()) { + sourceButton.setDisable(false); + writeBibEntryToColumn(entry.get(), column); + } + sourceButton.done(); + }); + }).executeWith(taskExecutor); + } + + /** + * Adds a column to the view. The column should represent a new source of data for the BibEntry. + * The width of this column will be bound to the width of its header. + * @param header the header of the column + * @return the index of the new column + */ + private int addColumn(Region header) { + int columnIndex = supplierHeader.getChildren().size(); + + // add header + HBox.setHgrow(header, Priority.ALWAYS); + supplierHeader.getChildren().add(header); + header.setMinWidth(250); + + // setup column constraints + ColumnConstraints constraint = new ColumnConstraints(); + constraint.setMinWidth(Control.USE_PREF_SIZE); + constraint.setMaxWidth(Control.USE_PREF_SIZE); + constraint.prefWidthProperty().bind(header.widthProperty()); + optionsGrid.getColumnConstraints().add(constraint); + return columnIndex; + } + + /** + * Adds ToggleButtons for all fields that are set for this BibEntry + * @param bibEntry the entry to write + * @param column the index of the column to write this entry to + */ + private void writeBibEntryToColumn(BibEntry bibEntry, int column) { + for (Map.Entry fieldEntry : bibEntry.getFieldMap().entrySet()) { + // make sure there is a row for the field + if (!viewModel.getFieldRows().containsKey(fieldEntry.getKey())) { + addField(fieldEntry.getKey()); + } + + // write the field + Cell cell = new Cell(fieldEntry.getValue(), fieldEntry.getKey(), column); + optionsGrid.add(cell, column, viewModel.getFieldRows().get(fieldEntry.getKey()).rowIndex); + } + } + + /** + * Set up the button that displays the name of the source so that if it is clicked, all toggles in that column are + * selected. + * @param sourceButton the header button to setup + * @param column the column this button is heading + */ + private void setupSourceButtonAction(Button sourceButton, int column) { + sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream() + .filter(node -> GridPane.getColumnIndex(node) == column) + .filter(node -> node instanceof HBox) + .forEach(hbox -> ((HBox) hbox).getChildrenUnmodifiable().stream() + .filter(node -> node instanceof ToggleButton) + .forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)))); + } + + /** + * Adds a row that represents this field + * @param field the field to add to the view as a new row in the table + */ + private void addField(Field field) { + + // setup field editor column entry + boolean isMultiLine = isMultilineField(field); + TextInputControl fieldEditorCell = null; + if (isMultiLine) { + fieldEditorCell = new TextArea(); + ((TextArea) fieldEditorCell).setWrapText(true); + } else { + fieldEditorCell = new TextField(); + } + fieldEditorCell.setPadding(new Insets(15, 0, 15, 0)); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + MultiMergeEntriesViewModel.FieldRow newRow = new MultiMergeEntriesViewModel.FieldRow(fieldHeader.getChildren().size(), field); + viewModel.getFieldRows().put(field, newRow); + newRow.entryEditorTextProperty().bindBidirectional(fieldEditorCell.textProperty()); + fieldEditorCell.setMaxHeight(Double.MAX_VALUE); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + fieldEditor.getChildren().add(fieldEditorCell); + + ChangeListener unselectToggleOnManualEdit = (observable, oldValue, newValue) -> newRow.toggleGroup.selectToggle(null); + + newRow.toggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> { + newRow.entryEditorTextProperty().removeListener(unselectToggleOnManualEdit); + if (newValue != null && newValue.isSelected()) { + DiffHighlightingEllipsingTextFlow toggleText = ((DiffHighlightingEllipsingTextFlow) ((ToggleButton) newValue).getGraphic()); + newRow.entryEditorTextProperty().set(toggleText.getFullText()); + } else { + newRow.entryEditorTextProperty().set(""); + } + newRow.entryEditorTextProperty().addListener(unselectToggleOnManualEdit); + }); + + newRow.entryEditorTextProperty().addListener(unselectToggleOnManualEdit); + + // setup header label + Label fieldHeaderLabel = new Label(field.getDisplayName()); + fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); + fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); + fieldHeader.getChildren().add(fieldHeaderLabel); + + // setup RowConstraints + RowConstraints constraint = new RowConstraints(); + constraint.setMinHeight(Control.USE_PREF_SIZE); + constraint.setMaxHeight(Control.USE_PREF_SIZE); + constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + optionsGrid.getRowConstraints().add(constraint); + } + + /** + * Checks if the Field can be multiline + * @param field the field to be checked + * @return true if the field may be multiline, false otherwise + */ + private boolean isMultilineField(Field field) { + if (field.equals(StandardField.DOI)) { + return false; + } + return FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); + } + + private class LoadingSupplierHeader extends Button { + + private ProgressIndicator loadingIndicator; + + public LoadingSupplierHeader(String title) { + super(title); + loadingIndicator = new ProgressIndicator(-1); + loadingIndicator.setPrefHeight(20); + loadingIndicator.setMinHeight(Control.USE_PREF_SIZE); + loadingIndicator.setMaxHeight(Control.USE_PREF_SIZE); + setGraphic(loadingIndicator); + setDisable(true); + } + + public void done() { + setGraphic(null); + } + } + + private class Cell extends HBox { + + private final String content; + + public Cell(String content, Field field, int columnIndex) { + this.content = content; + + MultiMergeEntriesViewModel.FieldRow row = viewModel.getFieldRows().get(field); + + prefWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); + setMinWidth(Control.USE_PREF_SIZE); + setMaxWidth(Control.USE_PREF_SIZE); + + // Button + ToggleButton cellButton = new ToggleButton(); + cellButton.prefHeightProperty().bind(heightProperty()); + cellButton.setMinHeight(Control.USE_PREF_SIZE); + cellButton.setMaxHeight(Control.USE_PREF_SIZE); + getChildren().add(cellButton); + HBox.setHgrow(cellButton, Priority.ALWAYS); + + // Text + DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content); + buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(row.getEntryEditorText(), content, " ")); + buttonText.maxWidthProperty().bind(cellButton.widthProperty()); + buttonText.maxHeightProperty().bind(cellButton.heightProperty()); + cellButton.setGraphic(buttonText); + + // Tooltip + Tooltip buttonTooltip = new Tooltip(content); + buttonTooltip.setWrapText(true); + buttonTooltip.prefWidthProperty().bind(widthProperty()); + buttonTooltip.setTextAlignment(TextAlignment.LEFT); + cellButton.setTooltip(buttonTooltip); + + cellButton.setToggleGroup(row.toggleGroup); + if (row.toggleGroup.getSelectedToggle() == null) { + cellButton.setSelected(true); + } + + if (field.equals(StandardField.DOI)) { + Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); + HBox.setHgrow(doiButton, Priority.NEVER); + getChildren().add(doiButton); + + doiButton.setOnAction(event -> { + DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); + doiButton.setDisable(true); + addSource(Localization.lang("From DOI"), () -> { + try { + return doiFetcher.performSearchById(content); + } catch (FetcherException e) { + LOGGER.warn("Failed to fetch BibEntry for DOI {}", content, e); + return Optional.empty(); + } + }); + }); + } + } + + public String getContent() { + return content; + } + + } +} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java new file mode 100644 index 00000000000..b2a67738f2d --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java @@ -0,0 +1,57 @@ +package org.jabref.gui.mergeentries; + +import java.util.HashMap; +import java.util.Map; + +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import javafx.scene.control.ToggleGroup; + +import org.jabref.gui.AbstractViewModel; +import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.field.Field; + +public class MultiMergeEntriesViewModel extends AbstractViewModel { + + private HashMap fieldRows = new HashMap<>(); + + public static class FieldRow { + public int rowIndex; + public ToggleGroup toggleGroup = new ToggleGroup(); + private final StringProperty entryEditorText = new SimpleStringProperty(); + + private Field field; + + public FieldRow(int rowIndex, Field field) { + this.rowIndex = rowIndex; + this.field = field; + } + + public StringProperty entryEditorTextProperty() { + return entryEditorText; + } + + public String getEntryEditorText() { + return entryEditorText.get(); + } + + public void setEntryEditorText(String newEntryEditorText) { + entryEditorText.set(newEntryEditorText); + } + } + + public HashMap getFieldRows() { + return fieldRows; + } + + public BibEntry getMergedEntry() { + BibEntry mergedEntry = new BibEntry(); + for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { + String fieldValue = fieldRowEntry.getValue().getEntryEditorText(); + if (fieldValue != null) { + mergedEntry.setField(fieldRowEntry.getKey(), fieldValue); + } + } + return mergedEntry; + } +} From 73dc505069f6e4fab9579f93941f4ceba5decaa8 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sun, 1 Aug 2021 16:56:22 +0200 Subject: [PATCH 041/108] Use JSoup for plaintext citations as well --- .../logic/importer/util/GrobidService.java | 20 +++++++++---------- .../importer/util/GrobidServiceTest.java | 2 +- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index df28f689407..a8711d6facf 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -1,17 +1,13 @@ package org.jabref.logic.importer.util; import java.io.IOException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.time.Duration; import java.util.List; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.ParseException; import org.jabref.logic.importer.fileformat.BibtexParser; -import org.jabref.logic.net.URLDownload; import org.jabref.model.entry.BibEntry; import org.jabref.model.util.DummyFileUpdateMonitor; @@ -56,13 +52,14 @@ public GrobidService(String grobidServerURL) { * @throws IOException if an I/O excecption during the call ocurred or no BibTeX entry could be determiend */ public String processCitation(String rawCitation, ConsolidateCitations consolidateCitations) throws IOException { - rawCitation = URLEncoder.encode(rawCitation, StandardCharsets.UTF_8); - URLDownload urlDownload = new URLDownload(grobidServerURL - + "/api/processCitation"); - urlDownload.setConnectTimeout(Duration.ofSeconds(5)); - urlDownload.addHeader("Accept", MediaTypes.APPLICATION_BIBTEX); - urlDownload.setPostData("citations=" + rawCitation + "&consolidateCitations=" + consolidateCitations); - String httpResponse = urlDownload.asString(); + Connection.Response response = Jsoup.connect(grobidServerURL + "/api/processCitation") + .header("Accept", MediaTypes.APPLICATION_BIBTEX) + .data("citations", rawCitation) + .data("consolidateCitations", String.valueOf(consolidateCitations.getCode())) + .method(Connection.Method.POST) + .ignoreContentType(true) + .execute(); + String httpResponse = response.body(); if (httpResponse == null || httpResponse.equals("@misc{-1,\n author = {}\n}\n")) { // This filters empty BibTeX entries throw new IOException("The GROBID server response does not contain anything."); @@ -76,6 +73,7 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo .header("Accept", MediaTypes.APPLICATION_BIBTEX) .data("input", filePath.toString(), Files.newInputStream(filePath)) .method(Connection.Method.POST) + .ignoreContentType(true) .execute(); String httpResponse = response.body(); diff --git a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java index 3dd0be06db9..45b96b78e62 100644 --- a/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java +++ b/src/test/java/org/jabref/logic/importer/util/GrobidServiceTest.java @@ -75,7 +75,7 @@ public void processPdfTest() throws IOException, ParseException, URISyntaxExcept BibEntry be0 = response.get(0); assertEquals(Optional.of("Lastname, Firstname"), be0.getField(StandardField.AUTHOR)); assertEquals(Optional.of("Paper Title"), be0.getField(StandardField.TITLE)); - assertEquals(Optional.of("2014-10-5"), be0.getField(StandardField.DATE)); + assertEquals(Optional.of("2014-10-05"), be0.getField(StandardField.DATE)); } } From d8412071b03a38cea8b113cc6062c7992a002456 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 2 Aug 2021 15:58:33 +0200 Subject: [PATCH 042/108] Actual MVVM --- .../DiffHighlightingEllipsingTextFlow.java | 26 +- .../gui/mergeentries/MultiMergeEntries.fxml | 76 ++-- .../mergeentries/MultiMergeEntriesView.java | 340 ++++++++++-------- .../MultiMergeEntriesViewModel.java | 101 ++++-- 4 files changed, 321 insertions(+), 222 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 1f76b908e83..d7463279e01 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -18,12 +18,13 @@ public class DiffHighlightingEllipsingTextFlow extends TextFlow { private ObservableList allChildren = FXCollections.observableArrayList(); private ChangeListener sizeChangeListener = (observableValue, number, t1) -> adjustText(); + private ListChangeListener listChangeListener = this::adjustChildren; - private String fullText; + private final String fullText; public DiffHighlightingEllipsingTextFlow(String fullText) { this.fullText = fullText; - allChildren.addListener((ListChangeListener) this::adjustChildren); + allChildren.addListener(listChangeListener); widthProperty().addListener(sizeChangeListener); heightProperty().addListener(sizeChangeListener); adjustText(); @@ -46,6 +47,9 @@ private void adjustChildren(ListChangeListener.Change change) { } private void adjustText() { + if (allChildren.size() == 0) { + return; + } // remove listeners widthProperty().removeListener(sizeChangeListener); heightProperty().removeListener(sizeChangeListener); @@ -103,10 +107,22 @@ private void adjustText() { heightProperty().addListener(sizeChangeListener); } + public void highlightDiffTo(String s) { + allChildren.removeListener(listChangeListener); + allChildren.clear(); + if (s != null && !s.equals(fullText)) { + allChildren.addAll(DiffHighlighting.generateDiffHighlighting(fullText, s, " ")); + } else { + allChildren.addAll(new Text(fullText)); + } + adjustText(); + allChildren.addListener(listChangeListener); + } + private String ellipseString(String s) { int spacePos = s.lastIndexOf(' '); if (spacePos < 0) { - return getEllipsisString(); + return ""; } return s.substring(0, spacePos) + getEllipsisString(); } @@ -126,8 +142,4 @@ public final StringProperty ellipsisStringProperty() { public String getFullText() { return fullText; } - - public void setFullText(String fullText) { - this.fullText = fullText; - } } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index dd4296a580a..f54ce62d1b8 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -1,46 +1,46 @@ - - + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 801010d7eb8..c184b52821b 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -1,10 +1,15 @@ package org.jabref.gui.mergeentries; +import java.util.HashMap; import java.util.Map; +import java.util.NoSuchElementException; import java.util.Optional; import java.util.function.Supplier; import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.ListChangeListener; +import javafx.collections.MapChangeListener; import javafx.fxml.FXML; import javafx.geometry.Insets; import javafx.scene.control.Button; @@ -18,6 +23,7 @@ import javafx.scene.control.TextField; import javafx.scene.control.TextInputControl; import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; import javafx.scene.control.Tooltip; import javafx.scene.layout.ColumnConstraints; import javafx.scene.layout.GridPane; @@ -28,10 +34,10 @@ import javafx.scene.layout.VBox; import javafx.scene.text.TextAlignment; +import org.jabref.gui.Globals; import org.jabref.gui.icon.IconTheme; -import org.jabref.gui.util.BackgroundTask; import org.jabref.gui.util.BaseDialog; -import org.jabref.gui.util.DefaultTaskExecutor; +import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.TaskExecutor; import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.importer.FetcherException; @@ -44,6 +50,7 @@ import org.jabref.model.entry.field.StandardField; import com.airhacks.afterburner.views.ViewLoader; +import com.tobiasdiez.easybind.EasyObservableValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,6 +77,10 @@ public class MultiMergeEntriesView extends BaseDialog { private final ImportFormatPreferences importFormatPreferences; private final TaskExecutor taskExecutor; + private final ToggleGroup headerToggleGroup = new ToggleGroup(); + + private final HashMap fieldRows = new HashMap<>(); + public MultiMergeEntriesView(FieldContentFormatterPreferences fieldContentFormatterPreferences, ImportFormatPreferences importFormatPreferences, TaskExecutor taskExecutor) { viewModel = new MultiMergeEntriesViewModel(); @@ -83,11 +94,25 @@ public MultiMergeEntriesView(FieldContentFormatterPreferences fieldContentFormat ButtonType mergeEntries = new ButtonType(Localization.lang("Merge entries"), ButtonBar.ButtonData.OK_DONE); this.getDialogPane().getButtonTypes().setAll(ButtonType.CANCEL, mergeEntries); - this.setResultConverter(buttonType -> { - if (buttonType.equals(mergeEntries)) { - return viewModel.getMergedEntry(); - } else { - return null; + this.setResultConverter(viewModel::resultConverter); + + viewModel.entriesProperty().addListener((ListChangeListener) c -> { + while (c.next()) { + if (c.wasAdded()) { + for (MultiMergeEntriesViewModel.Entry entryColumn : c.getAddedSubList()) { + addColumn(entryColumn); + } + } + } + }); + + viewModel.mergedEntryProperty().get().getFieldsObservable().addListener(new MapChangeListener() { + @Override + public void onChanged(Change change) { + if (change.wasAdded() && !fieldRows.containsKey(change.getKey())) { + FieldRow fieldRow = new FieldRow(change.getKey(), viewModel.mergedEntryProperty().get().getFields().size() - 1); + fieldRows.put(change.getKey(), fieldRow); + } } }); } @@ -99,50 +124,10 @@ public void initialize() { rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); } - /** - * Add a new source of bib-data to the view - * @param title the column header for this source of data - * @param entry the new data - */ - public void addSource(String title, BibEntry entry) { - Button sourceButton = new Button(title); - int column = addColumn(sourceButton); - setupSourceButtonAction(sourceButton, column); - writeBibEntryToColumn(entry, column); - } - - /** - * Add a new supplier of bib-data to the view - * @param title the column header for this source of data - * @param entrySupplier the supplier that will gather data - */ - public void addSource(String title, Supplier> entrySupplier) { - LoadingSupplierHeader sourceButton = new LoadingSupplierHeader(title); - int column = addColumn(sourceButton); - setupSourceButtonAction(sourceButton, column); - - BackgroundTask.wrap(() -> { - Optional entry = entrySupplier.get(); - DefaultTaskExecutor.runInJavaFXThread(() -> { - if (entry.isPresent()) { - sourceButton.setDisable(false); - writeBibEntryToColumn(entry.get(), column); - } - sourceButton.done(); - }); - }).executeWith(taskExecutor); - } - - /** - * Adds a column to the view. The column should represent a new source of data for the BibEntry. - * The width of this column will be bound to the width of its header. - * @param header the header of the column - * @return the index of the new column - */ - private int addColumn(Region header) { - int columnIndex = supplierHeader.getChildren().size(); - + private void addColumn(MultiMergeEntriesViewModel.Entry entryColumn) { // add header + int columnIndex = supplierHeader.getChildren().size(); + ToggleButton header = generateEntryHeader(entryColumn, columnIndex); // entweder normaler button oder mit ProgressIndicator HBox.setHgrow(header, Priority.ALWAYS); supplierHeader.getChildren().add(header); header.setMinWidth(250); @@ -153,24 +138,47 @@ private int addColumn(Region header) { constraint.setMaxWidth(Control.USE_PREF_SIZE); constraint.prefWidthProperty().bind(header.widthProperty()); optionsGrid.getColumnConstraints().add(constraint); - return columnIndex; + + if (!entryColumn.isLoadingProperty().getValue()) { + writeBibEntryToColumn(entryColumn, columnIndex); + } else { + header.setDisable(true); + entryColumn.isLoadingProperty().addListener((observable, oldValue, newValue) -> { + if (!newValue) { + writeBibEntryToColumn(entryColumn, columnIndex); + header.setDisable(false); + } + }); + } + } + + private ToggleButton generateEntryHeader(MultiMergeEntriesViewModel.Entry column, int columnIndex) { + ToggleButton header = new ToggleButton(); + header.setToggleGroup(headerToggleGroup); + header.textProperty().bind(column.titleProperty()); + setupSourceButtonAction(header, columnIndex); + if (column.isLoadingProperty().getValue()) { + ProgressIndicator progressIndicator = new ProgressIndicator(-1); + progressIndicator.setPrefHeight(20); + header.setGraphic(progressIndicator); + progressIndicator.visibleProperty().bind(column.isLoadingProperty()); + return header; + } else { + return header; + } } /** * Adds ToggleButtons for all fields that are set for this BibEntry - * @param bibEntry the entry to write - * @param column the index of the column to write this entry to + * @param entryColumn the entry to write + * @param columnIndex the index of the column to write this entry to */ - private void writeBibEntryToColumn(BibEntry bibEntry, int column) { - for (Map.Entry fieldEntry : bibEntry.getFieldMap().entrySet()) { - // make sure there is a row for the field - if (!viewModel.getFieldRows().containsKey(fieldEntry.getKey())) { - addField(fieldEntry.getKey()); - } - - // write the field - Cell cell = new Cell(fieldEntry.getValue(), fieldEntry.getKey(), column); - optionsGrid.add(cell, column, viewModel.getFieldRows().get(fieldEntry.getKey()).rowIndex); + private void writeBibEntryToColumn(MultiMergeEntriesViewModel.Entry entryColumn, int columnIndex) { + for (Map.Entry entry : entryColumn.entryProperty().get().getFieldsObservable().entrySet()) { + Field key = entry.getKey(); + String value = entry.getValue(); + Cell cell = new Cell(value, key, columnIndex); + optionsGrid.add(cell, columnIndex, fieldRows.get(key).rowIndex); } } @@ -180,67 +188,20 @@ private void writeBibEntryToColumn(BibEntry bibEntry, int column) { * @param sourceButton the header button to setup * @param column the column this button is heading */ - private void setupSourceButtonAction(Button sourceButton, int column) { - sourceButton.setOnAction(event -> optionsGrid.getChildrenUnmodifiable().stream() - .filter(node -> GridPane.getColumnIndex(node) == column) - .filter(node -> node instanceof HBox) - .forEach(hbox -> ((HBox) hbox).getChildrenUnmodifiable().stream() - .filter(node -> node instanceof ToggleButton) - .forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true)))); - } - - /** - * Adds a row that represents this field - * @param field the field to add to the view as a new row in the table - */ - private void addField(Field field) { - - // setup field editor column entry - boolean isMultiLine = isMultilineField(field); - TextInputControl fieldEditorCell = null; - if (isMultiLine) { - fieldEditorCell = new TextArea(); - ((TextArea) fieldEditorCell).setWrapText(true); - } else { - fieldEditorCell = new TextField(); - } - fieldEditorCell.setPadding(new Insets(15, 0, 15, 0)); - VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); - MultiMergeEntriesViewModel.FieldRow newRow = new MultiMergeEntriesViewModel.FieldRow(fieldHeader.getChildren().size(), field); - viewModel.getFieldRows().put(field, newRow); - newRow.entryEditorTextProperty().bindBidirectional(fieldEditorCell.textProperty()); - fieldEditorCell.setMaxHeight(Double.MAX_VALUE); - VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); - fieldEditor.getChildren().add(fieldEditorCell); - - ChangeListener unselectToggleOnManualEdit = (observable, oldValue, newValue) -> newRow.toggleGroup.selectToggle(null); - - newRow.toggleGroup.selectedToggleProperty().addListener((observable, oldValue, newValue) -> { - newRow.entryEditorTextProperty().removeListener(unselectToggleOnManualEdit); - if (newValue != null && newValue.isSelected()) { - DiffHighlightingEllipsingTextFlow toggleText = ((DiffHighlightingEllipsingTextFlow) ((ToggleButton) newValue).getGraphic()); - newRow.entryEditorTextProperty().set(toggleText.getFullText()); - } else { - newRow.entryEditorTextProperty().set(""); + private void setupSourceButtonAction(ToggleButton sourceButton, int column) { + sourceButton.selectedProperty().addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) { + if (newValue) { + optionsGrid.getChildrenUnmodifiable().stream() + .filter(node -> GridPane.getColumnIndex(node) == column) + .filter(node -> node instanceof HBox) + .forEach(hbox -> ((HBox) hbox).getChildrenUnmodifiable().stream() + .filter(node -> node instanceof ToggleButton) + .forEach(toggleButton -> ((ToggleButton) toggleButton).setSelected(true))); + } } - newRow.entryEditorTextProperty().addListener(unselectToggleOnManualEdit); }); - - newRow.entryEditorTextProperty().addListener(unselectToggleOnManualEdit); - - // setup header label - Label fieldHeaderLabel = new Label(field.getDisplayName()); - fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); - fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); - fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); - fieldHeader.getChildren().add(fieldHeaderLabel); - - // setup RowConstraints - RowConstraints constraint = new RowConstraints(); - constraint.setMinHeight(Control.USE_PREF_SIZE); - constraint.setMaxHeight(Control.USE_PREF_SIZE); - constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); - optionsGrid.getRowConstraints().add(constraint); } /** @@ -255,25 +216,6 @@ private boolean isMultilineField(Field field) { return FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); } - private class LoadingSupplierHeader extends Button { - - private ProgressIndicator loadingIndicator; - - public LoadingSupplierHeader(String title) { - super(title); - loadingIndicator = new ProgressIndicator(-1); - loadingIndicator.setPrefHeight(20); - loadingIndicator.setMinHeight(Control.USE_PREF_SIZE); - loadingIndicator.setMaxHeight(Control.USE_PREF_SIZE); - setGraphic(loadingIndicator); - setDisable(true); - } - - public void done() { - setGraphic(null); - } - } - private class Cell extends HBox { private final String content; @@ -281,11 +223,14 @@ private class Cell extends HBox { public Cell(String content, Field field, int columnIndex) { this.content = content; - MultiMergeEntriesViewModel.FieldRow row = viewModel.getFieldRows().get(field); + FieldRow row = fieldRows.get(field); prefWidthProperty().bind(((Region) supplierHeader.getChildren().get(columnIndex)).widthProperty()); setMinWidth(Control.USE_PREF_SIZE); setMaxWidth(Control.USE_PREF_SIZE); + prefHeightProperty().bind(((Region) fieldEditor.getChildren().get(row.rowIndex)).heightProperty()); + setMinHeight(Control.USE_PREF_SIZE); + setMaxHeight(Control.USE_PREF_SIZE); // Button ToggleButton cellButton = new ToggleButton(); @@ -297,9 +242,13 @@ public Cell(String content, Field field, int columnIndex) { // Text DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content); - buttonText.getChildren().addAll(DiffHighlighting.generateDiffHighlighting(row.getEntryEditorText(), content, " ")); - buttonText.maxWidthProperty().bind(cellButton.widthProperty()); - buttonText.maxHeightProperty().bind(cellButton.heightProperty()); + buttonText.highlightDiffTo(viewModel.mergedEntryProperty().get().getField(field).get()); + // viewModel.mergedEntryProperty().get().getFieldBinding(field).asOrdinary().subscribe((newValue) -> { + // buttonText.highlightDiffTo(newValue); + // }); + + buttonText.maxWidthProperty().bind(widthProperty()); + buttonText.maxHeightProperty().bind(heightProperty()); cellButton.setGraphic(buttonText); // Tooltip @@ -324,10 +273,10 @@ public Cell(String content, Field field, int columnIndex) { doiButton.setDisable(true); addSource(Localization.lang("From DOI"), () -> { try { - return doiFetcher.performSearchById(content); - } catch (FetcherException e) { + return doiFetcher.performSearchById(content).get(); + } catch (FetcherException | NoSuchElementException e) { LOGGER.warn("Failed to fetch BibEntry for DOI {}", content, e); - return Optional.empty(); + return null; } }); }); @@ -339,4 +288,99 @@ public String getContent() { } } + + public void addSource(String title, BibEntry entry) { + viewModel.addSource(new MultiMergeEntriesViewModel.Entry(title, entry)); + } + + public void addSource(String title, Supplier supplier) { + MultiMergeEntriesViewModel.Entry entry = new MultiMergeEntriesViewModel.Entry(title, supplier, Globals.TASK_EXECUTOR); + viewModel.addSource(entry); + } + + private class FieldRow { + + public final ToggleGroup toggleGroup = new ToggleGroup(); + private final TextInputControl fieldEditorCell; + + private final int rowIndex; + + private Field field; + + private EasyObservableValue fieldBinding; + + public FieldRow(Field field, int rowIndex) { + this.field = field; + this.rowIndex = rowIndex; + + // setup field editor column entry + boolean isMultiLine = isMultilineField(field); + if (isMultiLine) { + fieldEditorCell = new TextArea(); + ((TextArea) fieldEditorCell).setWrapText(true); + } else { + fieldEditorCell = new TextField(); + } + + addRow(field); + + ChangeListener unselectToggleOnManualEdit = (observable, oldValue, newValue) -> toggleGroup.selectToggle(null); + + viewModel.mergedEntryProperty().get().getFieldBinding(field).addListener(unselectToggleOnManualEdit); + + toggleGroup.selectedToggleProperty().addListener((obs, oldValue, newValue) -> { + viewModel.mergedEntryProperty().get().getFieldBinding(field).removeListener(unselectToggleOnManualEdit); + if (newValue == null) { + viewModel.mergedEntryProperty().get().setField(field, ""); + } else { + viewModel.mergedEntryProperty().get().setField(field, ((DiffHighlightingEllipsingTextFlow) ((ToggleButton) newValue).getGraphic()).getFullText()); + headerToggleGroup.selectToggle(null); + } + viewModel.mergedEntryProperty().get().getFieldBinding(field).addListener(unselectToggleOnManualEdit); + }); + + } + + /** + * Adds a row that represents this field + * @param field the field to add to the view as a new row in the table + */ + private void addRow(Field field) { + fieldEditorCell.setPadding(new Insets(15, 0, 15, 0)); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + + fieldBinding = viewModel.mergedEntryProperty().get().getFieldBinding(field).asOrdinary(); + BindingsHelper.bindBidirectional( + fieldEditorCell.textProperty(), + fieldBinding, + text -> { + if (text != null) { + fieldEditorCell.setText(text); + } + }, + binding -> { + if (binding != null) { + viewModel.mergedEntryProperty().get().setField(field, binding); + } + }); + + fieldEditorCell.setMaxHeight(Double.MAX_VALUE); + VBox.setVgrow(fieldEditorCell, Priority.ALWAYS); + fieldEditor.getChildren().add(fieldEditorCell); + + // setup header label + Label fieldHeaderLabel = new Label(field.getDisplayName()); + fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); + fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); + fieldHeader.getChildren().add(fieldHeaderLabel); + + // setup RowConstraints + RowConstraints constraint = new RowConstraints(); + constraint.setMinHeight(Control.USE_PREF_SIZE); + constraint.setMaxHeight(Control.USE_PREF_SIZE); + constraint.prefHeightProperty().bind(fieldEditorCell.heightProperty()); + optionsGrid.getRowConstraints().add(constraint); + } + } } diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java index b2a67738f2d..6cf90fa1c0e 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesViewModel.java @@ -1,57 +1,100 @@ package org.jabref.gui.mergeentries; -import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ListProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; -import javafx.scene.control.ToggleGroup; +import javafx.collections.FXCollections; +import javafx.scene.control.ButtonType; import org.jabref.gui.AbstractViewModel; +import org.jabref.gui.util.BackgroundTask; +import org.jabref.gui.util.TaskExecutor; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; public class MultiMergeEntriesViewModel extends AbstractViewModel { - private HashMap fieldRows = new HashMap<>(); + private ListProperty entries = new SimpleListProperty<>(FXCollections.observableArrayList()); - public static class FieldRow { - public int rowIndex; - public ToggleGroup toggleGroup = new ToggleGroup(); - private final StringProperty entryEditorText = new SimpleStringProperty(); + private ObjectProperty mergedEntry = new SimpleObjectProperty<>(new BibEntry()); - private Field field; - - public FieldRow(int rowIndex, Field field) { - this.rowIndex = rowIndex; - this.field = field; + public void addSource(Entry entryColumn) { + if (!entryColumn.isLoading.getValue()) { + updateFields(entryColumn.entry.get()); + } else { + entryColumn.isLoading.addListener((observable, oldValue, newValue) -> { + if (!newValue) { + updateFields(entryColumn.entry.get()); + } + }); } + entries.add(entryColumn); + } - public StringProperty entryEditorTextProperty() { - return entryEditorText; + public void updateFields(BibEntry entry) { + for (Map.Entry fieldEntry : entry.getFieldMap().entrySet()) { + // make sure there is a row for the field + if (!mergedEntry.get().getFieldsObservable().containsKey(fieldEntry.getKey())) { + mergedEntry.get().setField(fieldEntry.getKey(), fieldEntry.getValue()); + } } + } - public String getEntryEditorText() { - return entryEditorText.get(); + public BibEntry resultConverter(ButtonType button) { + if (button == ButtonType.CANCEL) { + return null; } + return mergedEntry.get(); + } - public void setEntryEditorText(String newEntryEditorText) { - entryEditorText.set(newEntryEditorText); - } + public ListProperty entriesProperty() { + return entries; } - public HashMap getFieldRows() { - return fieldRows; + public ObjectProperty mergedEntryProperty() { + return mergedEntry; } - public BibEntry getMergedEntry() { - BibEntry mergedEntry = new BibEntry(); - for (Map.Entry fieldRowEntry : fieldRows.entrySet()) { - String fieldValue = fieldRowEntry.getValue().getEntryEditorText(); - if (fieldValue != null) { - mergedEntry.setField(fieldRowEntry.getKey(), fieldValue); - } + public static class Entry { + private final StringProperty title = new SimpleStringProperty(""); + private final ObjectProperty entry = new SimpleObjectProperty<>(); + private final BooleanProperty isLoading = new SimpleBooleanProperty(false); + + public Entry(String title, Supplier entrySupplier, TaskExecutor taskExecutor) { + this.title.set(title); + isLoading.set(true); + + BackgroundTask.wrap(entrySupplier::get) + .onSuccess(value -> { + entry.set(value); + isLoading.set(false); + }) + .executeWith(taskExecutor); + } + + public Entry(String title, BibEntry entry) { + this.title.set(title); + this.entry.set(entry); + } + + public StringProperty titleProperty() { + return title; + } + + public ObjectProperty entryProperty() { + return entry; + } + + public BooleanProperty isLoadingProperty() { + return isLoading; } - return mergedEntry; } } From 616e73d273462a527194aa375429b1f5b3fa0fcf Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 2 Aug 2021 18:56:19 +0200 Subject: [PATCH 043/108] Fixes and styling Co-authored-by: Calixtus --- .../DiffHighlightingEllipsingTextFlow.java | 6 +- .../gui/mergeentries/MultiMergeEntries.css | 41 +++++++ .../gui/mergeentries/MultiMergeEntries.fxml | 11 +- .../mergeentries/MultiMergeEntriesView.java | 108 +++++++++--------- .../MultiMergeEntriesViewModel.java | 4 +- 5 files changed, 108 insertions(+), 62 deletions(-) create mode 100644 src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index d7463279e01..3e433256682 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -8,6 +8,7 @@ import javafx.collections.ObservableList; import javafx.scene.Node; import javafx.scene.text.Text; +import javafx.scene.text.TextAlignment; import javafx.scene.text.TextFlow; @DefaultProperty("children") @@ -110,13 +111,16 @@ private void adjustText() { public void highlightDiffTo(String s) { allChildren.removeListener(listChangeListener); allChildren.clear(); + super.getChildren().clear(); if (s != null && !s.equals(fullText)) { allChildren.addAll(DiffHighlighting.generateDiffHighlighting(fullText, s, " ")); } else { allChildren.addAll(new Text(fullText)); } - adjustText(); + super.getChildren().addAll(allChildren); allChildren.addListener(listChangeListener); + super.autosize(); + adjustText(); } private String ellipseString(String s) { diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css new file mode 100644 index 00000000000..b5a325dda2a --- /dev/null +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css @@ -0,0 +1,41 @@ +.text-changed { + -fx-fill: darkgreen; +} + +.text-added { + -fx-fill: #54A3F2; +} + +.text-removed { + -fx-fill: #FA5B68; +} + +.label { + -fx-padding: 10, 10, 10, 10; +} + +.grid-pane { + -fx-spacing: 10; +} + +.toggle-button { + -fx-start-margin: 10; + -fx-end-margin: 10; +} + +.text-area, .text-field{ + -fx-border-insets: 10; +} + +.text-field { + -fx-background-insets: 10; + -fx-padding: 10; +} + +.text-area:focused .content { + -fx-background-color: transparent, white, transparent, white; +} + +.text-area .content { + -fx-background-color: transparent, white, transparent, white; +} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index f54ce62d1b8..0c1816655eb 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -9,6 +9,7 @@ + @@ -16,10 +17,10 @@ - + @@ -29,11 +30,11 @@ - + - - 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 From 0b64ebd1a93daaf3830f9744418c24c0c724e9c4 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:02:55 +0200 Subject: [PATCH 060/108] Configurable diff-modes and styling --- .../DiffHighlightingEllipsingTextFlow.java | 37 +++++++++-- .../gui/mergeentries/MultiMergeEntries.css | 25 +++----- .../gui/mergeentries/MultiMergeEntries.fxml | 63 ++++++++++--------- .../mergeentries/MultiMergeEntriesView.java | 54 +++++++++------- 4 files changed, 110 insertions(+), 69 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 947df0f5079..46897a28d5b 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -1,6 +1,9 @@ package org.jabref.gui.mergeentries; +import java.util.List; + import javafx.beans.DefaultProperty; +import javafx.beans.property.ObjectProperty; import javafx.beans.property.StringProperty; import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; @@ -10,6 +13,8 @@ import javafx.scene.text.Text; import javafx.scene.text.TextFlow; +import com.tobiasdiez.easybind.EasyObservableValue; + @DefaultProperty("children") public class DiffHighlightingEllipsingTextFlow extends TextFlow { @@ -21,12 +26,20 @@ public class DiffHighlightingEllipsingTextFlow extends TextFlow { private ListChangeListener listChangeListener = this::adjustChildren; private final String fullText; + private final EasyObservableValue comparisonString; + private final ObjectProperty diffMode; - public DiffHighlightingEllipsingTextFlow(String fullText) { + public DiffHighlightingEllipsingTextFlow(String fullText, EasyObservableValue comparisonString, ObjectProperty diffMode) { this.fullText = fullText; allChildren.addListener(listChangeListener); widthProperty().addListener(sizeChangeListener); heightProperty().addListener(sizeChangeListener); + + this.comparisonString = comparisonString; + this.diffMode = diffMode; + comparisonString.addListener((obs, oldValue, newValue) -> highlightDiff()); + diffMode.addListener((obs, oldValue, newValue) -> highlightDiff()); + highlightDiff(); } @Override @@ -104,13 +117,29 @@ private void adjustText() { heightProperty().addListener(sizeChangeListener); } - public void highlightDiffTo(String s) { + public void highlightDiff() { allChildren.clear(); - if (s != null && !s.equals(fullText)) { - allChildren.addAll(DiffHighlighting.generateDiffHighlighting(fullText, s, " ")); + if (comparisonString.get() != null && !comparisonString.get().equals(fullText)) { + final List highlightedText; + switch (diffMode.getValue()) { + case PLAIN: + highlightedText = List.of(new Text(fullText)); + break; + case WORD: + highlightedText = DiffHighlighting.generateDiffHighlighting(fullText, comparisonString.get(), " "); + break; + case CHARACTER: + highlightedText = DiffHighlighting.generateDiffHighlighting(fullText, comparisonString.get(), ""); + break; + default: + throw new UnsupportedOperationException("Not implemented " + diffMode.getValue()); + } + allChildren.addAll(highlightedText); } else { allChildren.addAll(new Text(fullText)); } + super.autosize(); + adjustText(); } private String ellipseString(String s) { diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css index b5a325dda2a..ed6864fccfa 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.css @@ -10,26 +10,15 @@ -fx-fill: #FA5B68; } -.label { - -fx-padding: 10, 10, 10, 10; -} - .grid-pane { - -fx-spacing: 10; + -fx-hgap: 10; + -fx-vgap: 10; } .toggle-button { - -fx-start-margin: 10; - -fx-end-margin: 10; -} - -.text-area, .text-field{ - -fx-border-insets: 10; -} - -.text-field { - -fx-background-insets: 10; - -fx-padding: 10; + -fx-border-insets: 0; + -fx-background-insets: 0; + -fx-border-image-insets: 0; } .text-area:focused .content { @@ -39,3 +28,7 @@ .text-area .content { -fx-background-color: transparent, white, transparent, white; } + +.box { + -fx-spacing: 10; +} diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index 0c1816655eb..1965e37ab34 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -10,38 +10,45 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 1788b9947f2..7aa51f4af55 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -1,16 +1,19 @@ package org.jabref.gui.mergeentries; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.function.Supplier; +import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.collections.MapChangeListener; import javafx.fxml.FXML; import javafx.scene.control.Button; import javafx.scene.control.ButtonBar; import javafx.scene.control.ButtonType; +import javafx.scene.control.ComboBox; import javafx.scene.control.Control; import javafx.scene.control.Label; import javafx.scene.control.ProgressIndicator; @@ -36,17 +39,17 @@ import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; -import org.jabref.logic.bibtex.FieldContentFormatterPreferences; import org.jabref.logic.importer.FetcherException; -import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.l10n.Localization; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.FieldFactory; import org.jabref.model.entry.field.StandardField; +import org.jabref.preferences.JabRefPreferences; import com.airhacks.afterburner.views.ViewLoader; +import com.tobiasdiez.easybind.EasyBind; import com.tobiasdiez.easybind.EasyObservableValue; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -69,19 +72,19 @@ public class MultiMergeEntriesView extends BaseDialog { @FXML private ScrollPane rightScrollPane; @FXML private VBox fieldEditor; + @FXML private ComboBox diffMode; + private final ToggleGroup headerToggleGroup = new ToggleGroup(); private final HashMap fieldRows = new HashMap<>(); private final MultiMergeEntriesViewModel viewModel; - private final FieldContentFormatterPreferences fieldContentFormatterPreferences; - private final ImportFormatPreferences importFormatPreferences; private final TaskExecutor taskExecutor; - public MultiMergeEntriesView(FieldContentFormatterPreferences fieldContentFormatterPreferences, - ImportFormatPreferences importFormatPreferences, + private final JabRefPreferences preferences; + + public MultiMergeEntriesView(JabRefPreferences preferences, TaskExecutor taskExecutor) { - this.fieldContentFormatterPreferences = fieldContentFormatterPreferences; - this.importFormatPreferences = importFormatPreferences; + this.preferences = preferences; this.taskExecutor = taskExecutor; viewModel = new MultiMergeEntriesViewModel(); @@ -119,6 +122,20 @@ public void initialize() { topScrollPane.hvalueProperty().bindBidirectional(centerScrollPane.hvalueProperty()); leftScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); rightScrollPane.vvalueProperty().bindBidirectional(centerScrollPane.vvalueProperty()); + + fillDiffModes(); + } + + private void fillDiffModes() { + diffMode.setItems(FXCollections.observableList(List.of(MergeEntries.DiffMode.PLAIN, MergeEntries.DiffMode.WORD, MergeEntries.DiffMode.CHARACTER))); + MergeEntries.DiffMode diffModePref = preferences.getMergeDiffMode() + .flatMap(MergeEntries.DiffMode::parse) + .orElse(MergeEntries.DiffMode.WORD); + diffMode.setValue(diffModePref); + + EasyBind.subscribe(this.diffMode.valueProperty(), mode -> { + preferences.storeMergeDiffMode(mode.name()); + }); } private void addColumn(MultiMergeEntriesViewModel.Entry entryColumn) { @@ -220,16 +237,13 @@ private boolean isMultilineField(Field field) { if (field.equals(StandardField.DOI)) { return false; } - return FieldFactory.isMultiLineField(field, fieldContentFormatterPreferences.getNonWrappableFields()); + return FieldFactory.isMultiLineField(field, preferences.getFieldContentParserPreferences().getNonWrappableFields()); } private class Cell extends HBox { private final String content; - // Reference needs to be kept, since java garbage collection would otherwise destroy the subscription - @SuppressWarnings("FieldCanBeLocal") private EasyObservableValue fieldBinding; - public Cell(String content, Field field, int columnIndex) { this.content = content; @@ -250,10 +264,11 @@ public Cell(String content, Field field, int columnIndex) { cellButton.setMinHeight(Control.USE_PREF_SIZE); cellButton.setMaxHeight(Control.USE_PREF_SIZE); getChildren().add(cellButton); + cellButton.maxWidthProperty().bind(widthProperty()); HBox.setHgrow(cellButton, Priority.ALWAYS); // Text - DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content); + DiffHighlightingEllipsingTextFlow buttonText = new DiffHighlightingEllipsingTextFlow(content, viewModel.mergedEntryProperty().get().getFieldBinding(field).asOrdinary(), diffMode.valueProperty()); buttonText.maxWidthProperty().bind(widthProperty()); buttonText.maxHeightProperty().bind(heightProperty()); @@ -271,17 +286,17 @@ public Cell(String content, Field field, int columnIndex) { cellButton.setSelected(true); } - fieldBinding = viewModel.mergedEntryProperty().get() - .getFieldBinding(field).asOrdinary(); - fieldBinding.subscribe(buttonText::highlightDiffTo); - if (field.equals(StandardField.DOI)) { Button doiButton = IconTheme.JabRefIcons.LOOKUP_IDENTIFIER.asButton(); HBox.setHgrow(doiButton, Priority.NEVER); + doiButton.prefHeightProperty().bind(cellButton.heightProperty()); + doiButton.setMinHeight(Control.USE_PREF_SIZE); + doiButton.setMaxHeight(Control.USE_PREF_SIZE); + getChildren().add(doiButton); doiButton.setOnAction(event -> { - DoiFetcher doiFetcher = new DoiFetcher(importFormatPreferences); + DoiFetcher doiFetcher = new DoiFetcher(preferences.getImportFormatPreferences()); doiButton.setDisable(true); addSource(Localization.lang("From DOI"), () -> { try { @@ -327,10 +342,8 @@ public FieldRow(Field field, int rowIndex) { if (isMultiLine) { fieldEditorCell = new TextArea(); ((TextArea) fieldEditorCell).setWrapText(true); - fieldEditorCell.getStyleClass().add("text-area"); } else { fieldEditorCell = new TextField(); - fieldEditorCell.getStyleClass().add("text-field"); } addRow(field); @@ -376,7 +389,6 @@ private void addRow(Field field) { // setup header label Label fieldHeaderLabel = new Label(field.getDisplayName()); - fieldHeaderLabel.getStyleClass().add("label"); fieldHeaderLabel.prefHeightProperty().bind(fieldEditorCell.heightProperty()); fieldHeaderLabel.setMaxWidth(Control.USE_PREF_SIZE); fieldHeaderLabel.setMinWidth(Control.USE_PREF_SIZE); From 649049c12a194603380f968c37d280dca1c21f4e Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:14:03 +0200 Subject: [PATCH 061/108] Localization --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml | 4 ++-- src/main/resources/l10n/JabRef_en.properties | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index 1965e37ab34..26c18eb806a 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -36,7 +36,7 @@ - - diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 22d25fd8b59..d2867028276 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -1173,6 +1173,7 @@ Please\ open\ or\ start\ a\ new\ library\ before\ searching=Please open or start Canceled\ merging\ entries=Canceled merging entries Merge\ entries=Merge entries +Merged\ entry=Merged entry Merged\ entries=Merged entries None=None Parse=Parse @@ -1277,6 +1278,7 @@ Keep\ left=Keep left Keep\ right=Keep right Old\ entry=Old entry From\ import=From import +From\ DOI=From DOI No\ problems\ found.=No problems found. Save\ changes=Save changes Discard\ changes=Discard changes From b6e3aaaf3e683663d97ab4571cd537bbb82d6f79 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:14:15 +0200 Subject: [PATCH 062/108] Refactor --- .../DiffHighlightingEllipsingTextFlow.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 46897a28d5b..86599446065 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -63,6 +63,16 @@ private void adjustText() { // remove listeners widthProperty().removeListener(sizeChangeListener); heightProperty().removeListener(sizeChangeListener); + + removeUntilTextFits(); + fillUntilOverflowing(); + ellipseUntilTextFits(); + + widthProperty().addListener(sizeChangeListener); + heightProperty().addListener(sizeChangeListener); + } + + private void removeUntilTextFits() { while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { if (super.getChildren().isEmpty()) { // nothing fits @@ -73,6 +83,9 @@ private void adjustText() { super.getChildren().remove(super.getChildren().size() - 1); super.autosize(); } + } + + private void fillUntilOverflowing() { while (getHeight() <= getMaxHeight() && getWidth() <= getMaxWidth()) { if (super.getChildren().size() == allChildren.size()) { if (allChildren.size() > 0) { @@ -93,7 +106,9 @@ private void adjustText() { } super.autosize(); } - // ellipse the last text as much as necessary + } + + private void ellipseUntilTextFits() { while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { Node lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); while (getEllipsisString().equals(((Text) lastChildAsShown).getText())) { @@ -113,8 +128,6 @@ private void adjustText() { } super.autosize(); } - widthProperty().addListener(sizeChangeListener); - heightProperty().addListener(sizeChangeListener); } public void highlightDiff() { From 1bf6409c4f76ddfcd1c727a1e056e216ef8d2714 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:29:06 +0200 Subject: [PATCH 063/108] Derive XMP preferences from importFormatPreferences --- .../logic/importer/fileformat/PdfMergeMetadataImporter.java | 4 ++-- .../importer/fileformat/PdfMergeMetadataImporterTest.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java index 1fd2329d7f2..9d50e6e1f76 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java @@ -39,12 +39,12 @@ public class PdfMergeMetadataImporter extends Importer { private final List metadataImporters; private final ImportFormatPreferences importFormatPreferences; - public PdfMergeMetadataImporter(ImportFormatPreferences importFormatPreferences, XmpPreferences xmpPreferences) { + public PdfMergeMetadataImporter(ImportFormatPreferences importFormatPreferences) { this.importFormatPreferences = importFormatPreferences; this.metadataImporters = List.of( new PdfGrobidImporter(GrobidCitationFetcher.GROBID_URL, importFormatPreferences), new PdfEmbeddedBibFileImporter(importFormatPreferences), - new PdfXmpImporter(xmpPreferences), + new PdfXmpImporter(importFormatPreferences.getXmpPreferences()), new PdfVerbatimBibTextImporter(importFormatPreferences), new PdfContentImporter(importFormatPreferences) ); diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java index 416e829e4ad..2a9bfbadb4e 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporterTest.java @@ -31,8 +31,7 @@ class PdfMergeMetadataImporterTest { void setUp() { importFormatPreferences = mock(ImportFormatPreferences.class, Answers.RETURNS_DEEP_STUBS); when(importFormatPreferences.getFieldContentFormatterPreferences().getNonWrappableFields()).thenReturn(List.of()); - xmpPreferences = mock(XmpPreferences.class); - importer = new PdfMergeMetadataImporter(importFormatPreferences, xmpPreferences); + importer = new PdfMergeMetadataImporter(importFormatPreferences); } @Test From 787e040e441f19d58542445abb076b47a3be40ba Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:29:22 +0200 Subject: [PATCH 064/108] Localization --- src/main/resources/l10n/JabRef_en.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 03820bf9c79..57f6d4be53c 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -2363,4 +2363,4 @@ Rebuilding\ fulltext\ search\ index...=Rebuilding fulltext search index... Failed\ to\ access\ fulltext\ search\ index=Failed to access fulltext search index Found\ match\ in\ %0=Found match in %0 -Grobid\ PDF\ metadata=Grobid PDF metadata +Grobid=Grobid From a3cdff9159f019c26ccca60b0efcba75ad2d8d85 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:33:34 +0200 Subject: [PATCH 065/108] Use Importers in JabRef --- .../externalfiles/ExternalFilesContentImporter.java | 8 ++++++-- .../org/jabref/logic/importer/ImportFormatReader.java | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java b/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java index da9a88d7c62..9ff0ca204bf 100644 --- a/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java +++ b/src/main/java/org/jabref/logic/externalfiles/ExternalFilesContentImporter.java @@ -7,7 +7,7 @@ import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.OpenDatabase; import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.fileformat.PdfContentImporter; +import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; import org.jabref.logic.importer.fileformat.PdfXmpImporter; import org.jabref.logic.preferences.TimestampPreferences; import org.jabref.model.util.FileUpdateMonitor; @@ -23,7 +23,11 @@ public ExternalFilesContentImporter(ImportFormatPreferences importFormatPreferen } public ParserResult importPDFContent(Path file) { - return new PdfContentImporter(importFormatPreferences).importDatabase(file, StandardCharsets.UTF_8); + try { + return new PdfMergeMetadataImporter(importFormatPreferences).importDatabase(file, StandardCharsets.UTF_8); + } catch (IOException e) { + return ParserResult.fromError(e); + } } public ParserResult importXMPContent(Path file) { diff --git a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java index 3b00f3e5057..c5d7d8140cc 100644 --- a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java +++ b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java @@ -8,6 +8,7 @@ import java.util.SortedSet; import java.util.TreeSet; +import org.jabref.logic.importer.fetcher.GrobidCitationFetcher; import org.jabref.logic.importer.fileformat.BibTeXMLImporter; import org.jabref.logic.importer.fileformat.BiblioscapeImporter; import org.jabref.logic.importer.fileformat.BibtexImporter; @@ -22,6 +23,10 @@ import org.jabref.logic.importer.fileformat.MsBibImporter; import org.jabref.logic.importer.fileformat.OvidImporter; import org.jabref.logic.importer.fileformat.PdfContentImporter; +import org.jabref.logic.importer.fileformat.PdfEmbeddedBibFileImporter; +import org.jabref.logic.importer.fileformat.PdfGrobidImporter; +import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; +import org.jabref.logic.importer.fileformat.PdfVerbatimBibTextImporter; import org.jabref.logic.importer.fileformat.PdfXmpImporter; import org.jabref.logic.importer.fileformat.RepecNepImporter; import org.jabref.logic.importer.fileformat.RisImporter; @@ -64,7 +69,11 @@ public void resetImportFormats(ImportFormatPreferences newImportFormatPreference formats.add(new ModsImporter(importFormatPreferences)); formats.add(new MsBibImporter()); formats.add(new OvidImporter()); + formats.add(new PdfMergeMetadataImporter(importFormatPreferences)); + formats.add(new PdfVerbatimBibTextImporter(importFormatPreferences)); formats.add(new PdfContentImporter(importFormatPreferences)); + formats.add(new PdfEmbeddedBibFileImporter(importFormatPreferences)); + formats.add(new PdfGrobidImporter(GrobidCitationFetcher.GROBID_URL, importFormatPreferences)); formats.add(new PdfXmpImporter(xmpPreferences)); formats.add(new RepecNepImporter(importFormatPreferences)); formats.add(new RisImporter()); From 564988ace5eae3ce0ac6fe166dd0d7b88aee49c1 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 10:57:32 +0200 Subject: [PATCH 066/108] Remove unnecessary test documents --- .../logic/importer/fileformat/coverpage.pdf | Bin 94807 -> 0 bytes .../logic/importer/fileformat/embedded.pdf | Bin 52091 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf delete mode 100644 src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf b/src/test/resources/org/jabref/logic/importer/fileformat/coverpage.pdf deleted file mode 100644 index 4ee942026a337ce7d82c15c077b89fb39cd59404..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94807 zcma&NQ;;q`^sd>qx!YgcwryLxZQHhO+qP{RyKUR<`JI~iPfgXCi<67wO{G$`F7mEQ zCC?&N5D}wgq+^94onIbVhhYXV0PGAcVR(38=w(c7&792v91I+Q|GUA^i&YgK z#jFjSO+-wL?2Jud`1oL)oE=RJY+&3sMpSj|mKe}{ZtL!fh-q{C@Q4Wq=0n*AfNBsW z`h{0JtrYmgG7%~xerH{-oX?>M5GBf0ot(V9y?t&Pe3>^Uaxy>x7nRMCS&O;TV(T}X90z0NiQKevwjGxVlqkN?uJ zgwgom0vabxMegBfD>LROsgQ{mrIxvxGkdafo^tBLr45;eyvf^DL|_AwPlhw+BdSUr zw>!)2zDUN*0%Ntw!wqmtgitLt`}2^| zBb8>O6diV-K9^E=+MMbG*4po7w)Rfj+D!IS2|fNT<3R30Dv4Dq1*q5$ra&x4GvG&2 zUyvIV>!|{|&0B49(f}oBFnS#vdb+lm64ay3G7^JKpn)&J(1?lcbK!#JiHL%lSF|AffWU;-1&0UO&I0BhTB$Kg zx_-0u+H6-kWXCAY#J`8p>e0x;*S$AuaMph#slQlwZoD2p%^CXQ{u}nbK1q<*yPd;$ zK4sZ?51j6<=8S~?(DL%So<0l}`gQbom2RoU!5GC!Gy#3%gSQ@H%nt?a6RTSR=ZnmoLZdQCtpl|ofldMUgWHBzhayXU=Au}&GSo;g^ zgICwc0sJ+K_uUsdyB{H=SU}jJhknZEqYtBOI$)6m+X-!P7}5mTiQz{sVVsI)=%oqkD4yl~;^1N@ z>xw#$qw9e6rISZXeSI-?tBG#1T?;4eV_@rOqqH(KeJY=*evtWO^kT(!5Ii{mqr#Zj z8vj3*`A_{XyD@V7@4jPXWcok$ofFLdq8l@lG6Ty3GaDnb5|reBl5Lfly-9(Aoneic zg-I1kQZam$VR@Mq%#nrXktGJ6RVwm<)g{1L%ED37)Hm1EIy|j6DKUstcz`?=7@jtWw zvdsTT04FB{Ro=WR_@AUF&fBnoqQ0t(n#XJ1`@9x?kt z48iXrBVnArkP+e?`~d|30B%08b8864mO2=)0T3@36pX{mTOAq=O6%-wtl`#{t*z}} z0Z4K>utl-R6wo~gmsapIp=^MJI@F&#FJphQdEkdN^S>N2Kt9^#OL+*q!7WWVNYKDr zIQj}mU^mVL2OyBb@&2C|K)mQK{;9-ZKjfO<@*t3Vbwj{+j`u$~H+5&b5&3ugfdK%d z!2x8bSN}m9pjCxGVEHBGv&UCA)4)K31AP$!>8J;M_-8P|gZ^r-!Tef~AZRAeK>eT4 zznOE;!NFWy+zyF9gU2ox?|mGvWZ8b!Y)EGQ07S&N`gjVU2N)m+$bXK%bosaY zQ13$%pPSzNL2+rsgUI?m{1C&Cmhc_F1NV*~okBpf5}4s}YkhdXG4}2r!1@&9So+`% z0fP=d6TWt#8ov>@w*=5Gkm(OwQ*oI6kDrgP{EuEC0m%00WBgD2wdvYwqXOc){@-;8 zzpj&$L|eeR*@0g`a(sfiK=kx|6apIYkb9529?b#seII-8yiU3}^zMSd4}a73|E5`jy*s&>AT!+keyC&zymkRV+XB9Qq7}$R z%eld-;awp9{ZOXyUqkd^!b5}zHzUi<@5;maC#8j*`gy-@f;aa0@nzqzzK6j&_VN7c zC;=k~`TN;n<>ey*g^Pgj+PmMB43kqp-5vDki8Bm;Bcg-0ckDr(ej@dM+w%cgfuWqf z#=ty+wyXMP{Rj|&0NH-`C6qJxZ-dE7i`}za^4G9a}j(6)4^rr5x^JzK$-6zrWIMzZ*#xho; z6E!${OcP}3(!kQ8t4jz#`iSLCP&_vyPSnvgMQk5XeIgIrgSo!aW9Y*BN;_QD6t z)tpzS!Bp()Vn#dkGKMq3j_2r4HcMp{=a1Q+6b~2@^Es1eb8zC3%MtVzsrpRC9yWc3 z@{dg!N6>#5E;ATQw$6xyBwx;ktrk;WWz?|5A(FRKcEo7IJR zmi)4=g^VAz7u*J>=EM^eyQ-LE!5mq}_NO2wyG6o3~2OM^{20S?GR8EQ(eupF|Eb((9o7!IWpe;m_2 zv<;9p8My5hSA`LK5l*Jv(zQZLMMDt&b99X8z6A3gbI_Q&W{t8nT^9Ze~vpCAe_sMuqBkpV7+SDiOMWk4?7Ex4|me$ki z5^NT6wwq8Mv~|Ev{ymD#TV6fIX=^-)XU%ySU*^S-Z5~C27SVAeE-`TH5_Y^%hjIr~ zp`jQIMLJzV1Zt)js?sM*qCx=A?6upscsY3@XmaBs%v%u+laNhEY7ur)h%{+rZVpY2 zF&nO3Fi&fWp|eVQg>|g%1Mq>qJxr1^I)Eb*3xz-(1%C#w!srCGA_Dy!LOy0!cfFru zs_>AmxT8^ZSVBZFE5j>e4mbbdc^bvq#?X$LqqQX!9!VC9J-s-_()D|@o%|PGod*-k@RM%ugOSu*u8y0tXCU$0V;uoPNat=Zg zA{*=dz&|~f*>vkJBt!wnD4Xp^n=8n=Fl-JVAx4Hy1Nw_h$r>|cj z0k?T}cjC7suTgur7j?~b4aEl$bXA~}5Ogf^8$m|13Z|NK#rk?Q&m5V1dYV<%6juf^ zDn>xCSb4&g-BBIen_m|Jib#6d$Tz}7`K$bG*{MTii|4G%8FmtoyXqd1(}wnwKC88? zB<0n$3@LrD{A1C8_A%|bco=*^GR;a8&@P6JEI$qkO5>^;$@>H=^(mh0j-rG+*-MHM z!dniZRMHz4j_IRG5Sd6$RpOMW0nvmgA8gQl%54|zA`wul2Ul`m2$({7aEs$Ek%4)I z#3%_Xf)rJ2mQ}!GGh+OM3wYQVE28wM3%SVaj_E`CzM`_Inzyu=UOYy|sr1MVo*o@&eu40FBFG1F{^yZar-c*6$#$LXGTg z;ws-rzpg9yp98Tt*(o1b#=JRd1B`b=uHl*^ORM+w6)chrOUweRL2~^}ytcEnW#P96 zX+G^E$Ii@Z<%s-yAVK9GDz1i!RQh54rAKPMwCAh@vu})PWjx{DGsjU?Q5jv^!UzU1 zxvQ`M{=5>nPY>1X09!4Pq0jJ^#$}(u2UQChW)!uJRP0#D2H-NG7*k6{?yW13=tcBP&$V|>&3B>ZN%+RYXQzA%;c8|cntSsGn8~R zReaPt#c^$GYEH}fZ;XS`XSP~d@eO}fiV^iQwGZz7iMuyBF?~!Wx`~|XmqN<+G_YBC zs#eN_RCr1#c)B{$9zKMwZ1Aq5hKE_>6QY5(#04#=%7rmq2+8QQ9M( zRW$A3rlje|cWsLn=BEQAy^g?r))oiv+eq20s$M9&Z))7S(2ND2T81FvxdgomWC6j4 z?lU=OImj{<(5fs}9q;-RodUGC+)#m3sE}Uq(6Oq29a< z{g+~m2QH?~uXWM>nfO^?co+s?@$!t~CCM%HQhK%Q`tL)*^72V#x0&oAJa?Nc4gzghhwoKk{6}die5XG z6NB;I__sy4)IKduk|iRUqvrg0$>|TpB%Vd^uA13wiOA=2B^Z;NTl*7DlX9~V3l8y$ zf>1HW=v2siK8yvCz(*CH&3~x=FtH$BvZXJVF%=!q#`L5i!5fY>m2Nn@CsX5d)_2BV z=e~1QT2MluO?6wGxm@>H-22c-I}VHbNtG|@*U)j2UN;>7U=vZg^xAM%MJ&{3O7<_G zbF;k2E_!(hcdD;=ac!vFm#}qtXKsPI3_cA-2FVo2681gRIN|{gA|yj~N~01H+q_d* zJT6kOdxHwLVan`pJzNg7N|&xES=STKwG{5oH-tQO?@l5U@vkVnD`ZRNUT3YX6~c#y zt?%wtUCDuZS;U~`)}YNu;y2VRybjrK_%o?HQA?#Y>$B4v*F{b|+?-mM4Ru6q;aQsV zHziM zKhAde-%;fSvl2;kU(AI_J1KiEbg?%zlu_~Iw}p1_)hEqu-9!zcTG&c55St0zh4;5aveQ`AC)s_$CjwfunAe5+-{b9w)&9m)M2xNc~Rj~0nNB;8}dQC<0yWQ&{p3L zLG^=S^)&HRiv3{E*y0%B!?Eur zcR^l%Ll%h0$ocI0D9_9TF!xUnPiPh(oj44w#07dkHE*OV~V5wsP9}KL)M2PED7!s;|(jM&bz2>y}#*7Na zzp*1$MMetN_>j~c7p@E0sD)b0MxrV6h%o8NWVF(K`1RMkPKM<8lMhktSB=$T~@VlA7V7Q z7QtzrzsugRn&nO+OdfqXC=rAf99gi8{R%UUxH~IkkHHpn!*k;85E^iAz|MKTyWB8d z7&;z65eGj!$S$bv^~mZnUmi})3#c>+fur-5 zjz6B2|7``qaLv@gu%T$iSrnX?m(PNbRYZhRpq?OD?E{A%QrMj~*B*d;Ny}kt+9>3= zxp0WfWFxA;cQVP;^qt|r%G*0BhWHPT6M@#l;rE_!G@eQJ`DLRc> zqpK4Pb2B|FFJSSPT`>syM&0^~DuiOL3w<=S~X){kW018Rwr964(@bn*($okdxHan4IbYtcd(Ts{ zW69ejLeDy@Ra&?&oyVu`kW~owvA3?+_TX0NJdj&FI;5FOL17~)^iWcw8_Kh+!sCyP zw~Nc+M8mo1e%~b0>hqGdl-G4q*bemrJhVeDmb(|E1=~wMx}Gr!n^aaQ(8bzVNS$zY z#a`nW&7R4Llu|-OD1zK|l4ph$d968v+A-pv)_L%F50Xm0S|7e=uK*)J#a4d;Y`9WPwK+df1@ zq^a*^#U6@k)#}4^^CtY*o>-z@O|}Y31CrqX?6wWiuUfh&&zKk5j{%05pP-&us2k;( zX<06lg~1s>{)HLZ@%T%s>e->u2dOm)YcKrkFlfXo>LoGHB{a*v#A=_(JR^vfAixR0 zj%Or}YZDrrC@TKmfamQ0DL0Ki$cxIZcy`gwkYEwnICA^86klG-(RB}*QfGqN%Y~fq z0)Cvi8n*hg&ndFk>wGdG$O_&qVmj8&%Cq;jwB#Y(A%0Zet*j3cc-d=}9|$tg4dgRr z2EBB>Lqyp@o@z2=Vi;6V)^IVEe`I)^kTUc3 z8Z2q={^y$!JI=Xk-oMU8dq(DGsE;=U7HC@2*%%7FZ;8wXabM?EDA9#TIfwQ<_skvWxahop2)!7QISZCMZ!R4y1}wwsri|ha_)$`O6)K%>@cx#j(eUUyTkaa{nity( zb5c4E|GIff648}5`a915CCIvaZiBMz#MKaSM$|H^-3d~D)?=bHA}|u!)^Ev#4LCm# zz;5dcAbSh|-=dLH8CJZJC)UZ%+hVG*WQ=3DFwks;QeXrUad#`_QKE@QnEaClff{Pd z{gNq2ouRH$yq}fqmwe61mZoh{n+n_LIt4O(;oZcov;=NH{7P#=??v!>;pqIA&FRZp zH4bsyh*vh;ao1s$wAE4wQX6*CW^;0+iQ>Fc+*%Flk8rDErEIbYvhGds+vd-=bZd~S z1D3M|6ulLckICKvAAy^-x4_V(M=KQ0F6mW*%3PD>q5^YGL?M+_Dq<7|T}|!8oBIii zlV!SxELv!28xRqb9)hi6@=%*Br_zCFkL7c0UU*KW?#*?d%bPN;qd0 zj1lk-q|o}3GpS}Deyxg9exyU8&3im4zA;ZVZ*(s0k~qA$!XFXkW}yl7L_CgVu<4`T zYy=zqis6nS3&BgAKH*4=^;Lw|>ZNMqp{&t#`xS4}lh5rWwZA<6nQ;6r0!Ku|cd(-( z%2RUz*CWquwgvkTr8d}mF+F%WCr6v2my`C>2~_M2A>g6Dfo3OJ*v|(Q)~rHy^0n$T zEE{7ywaNW1SyzY!OFp>;0 z;PWfVj+0ouH?VQGck+%z6XD@IF!MwAVa6z`elsZi0}>jgr0Ay)qA>~TSt8eY;$WHH z_{ejvO^&}S?ZOx$Zg^X^!`JciJ8O&2M?Hf|#C4CrSP{4#Rh$TZ#iK`rT_N-TrtdPY z$7W4CrFi*MNL{`+=8gi=yzv9FTQ%YsVacRAsPKE)+Nc~vBiU(TLkZGqmc2%Y`6_l7 zKkf@EX9LO|jKlc9(P6tV;0bJZ98~Ndo)|CXDmf=q+fjWDi}e?URfN=Bs5Jy4LqjN| zn^*nrbR;0}AT=L_wW6=;__i*0qbC@>w(0b%ww@aIN%_v&Y3^4%YiBQ^#d9!1nGnFU z`dLd8K_3^nNqs`bwQ@kiRi+(ogn`jq9;M13m2JwcH zLA>YatiRtp+CJ095cAGGQRj;y+O})F;ue3VT?)QGB1!%%6{jnTF$3JDlTaw-vAc$x zdA!UF-}=4zn8+EDQWrRaC>4npxt623Lk@HpwL@&1^`Kg!Tzr5sU_xwy_3Asy4UMY4 z#_KBCs|oOs#BK53w`Q?~K}ADNja5;0FjRnSc@;Rq4sGDumRpV{M8hb1zuWh&?MtVc z6ly5HNt`lySC2CbncRg9N6r489o0aYXgcOEwT`^=VPl4lpMN1vn%7OuCcodV3?7r- zW~{qJ0I?!jFCT2ehg3g zlf+^U=vpK-mzQA8DkcXD$EoTK^=e(^+ATparv#fj+=m8Mw{*|}XTae$!v$5!V0d{kaDi6epDvd`IZp|i&c z{?crmp_@uz(L?Wpb#cm5Jx7Jgc;vNOxZa=g&9WIs*(S$D2aFr+Zzz?M>>7A_cz0p=wjQ3uBKSm_^oD0ar<{_0+X5P5!c^&+L(NQ}@+(#Sm(qYu z^vDLvA@ERLUXnpTt6=OVe*8odi%^Hq<_GVc44cYnvSaDEjbo0GUJd1Gm}-!hRr@9h z>WO{Ck}p77S=*Im*84rCWRI8zd4h6(vkXIdAi?mYMkN{Al>8@V;f(}nBfMoKe6XvVcM&8UZx8t64yxKLKL}V?DjtiehkVJ>>9Rg z`iAN^Vxz7sHIxUE_f(peY;3EEO|{t2G|BD@SEvRa#h&|6W3MDQk zH}f1E$ve7UV-y*2MTFf_o@mV#oBdi6z23}UkM1)YrfN67+AEG z0qCz)!DPX%PORcp0u_%VahFi^pYRq_C?-iV*pY-E7vqM?+aF3 zCVS6dgKHJH?Y5RUp@uOhWnSrl^qbc6E+4d(^K$(T4`3q4V-k!j=jPs#;@n9!3=dSTe%tcQ%TgY{hoG)S2x0*N7D@+qxMM7n4KCf!2F8#U< zgMwetqPK?39{Aj?8A{MUt=yG@()VDgENl`xN?w117jN8goAIL@d8J0`DP97B>w*1- zqYpIF#%cxfDt|btfb>?4_*J@Ab(ky!PrN+9Dq)@p1AY`vxtXSOEWp3Za&LXTpCx-} zT?>u?qbcbV^-RrxJ4p~VRIR?AtSZE60 zB5rlbIi1nC49%8{E1<6_J)sy3e`f7gE!}hLK!-BIF$=&A)KVM2(w%A-O5VwQC?3P! z6`vXr{~{Y=U9`GlOE0Y2Tgi;4I<(%!t=Nb{hAA+QL7F3`9cc$bINuLz?sx`kT}93} zTt(QF8kN8DuH4Gd$}WK%-r5{*7F2;_w$&{pg(9~bp89yRHlT{qb*Z-Ji4vV-bHQL^ zw&RiZ=fR1`DBRBL$Mb5q9PGzIUp$@q#qdZMZ~6T)mUJU!-+?Ey()`OtsXLspBsXi8 zD%HRuSazM~>k_{m%ZkQ|pORI3DO?+5t(q1d0!#p7>3mLsUCH^I(j8}rT$#=6c^-bp z=+Xt?YB6>{?_tq2VI32qe&5A-PBz*P2_KRTWrmaAknbBNjLgC5%fg4>Jl-{x8izTC zde3x8pBIZONAT;d^)0rh3-1P0B^cdWL*4N;BpLa*3oQCmH_?lp;l(`%M3+Am4sBc< ze--tp$7fYhyzUbW8MYukwWy_*8<8C<$`sUb(xy(}o$VzwC4!N8D`_IN|1r9m;j+Y2 zj1u#{xQ6gQRrBf-K1!z(z%I_E{`eD>Z$IkUNP5e|ZbV>9g@ zq|G$Ct*k2Q@Tn~LE(?Fi5hi#1XF>US(=<{32#m_3j#}GVO!V^9Ppww84*^YrsLL_P zk5&E_shHXs6AEFabiMOEyK!0e%~JbB8ZN|x;>*K&&M>wi?|jsOx@=D*r)9ywpUd_Z z{=3;Zb^mJ_4PV)R56UIJz3Fmjt<}Q&zPp3F<+gV@t9X*($oa6h#a3MN-8y2%c%-bX zn{=hKW$^ZV8R}n722rP{jmBwx=gOSaH|?a3qF-9#J8F2zS?52$MG-xp@%btT7B&Fi zm#p|bt(4s9u*VF?d{m>``CHdT#FAy9Y+KF_cZ~6tr&!Wkkom1Mapl3B?$nSXFYH2$ zxaf=^2!}g+_6DQW)8kNySR~L*|4c<`%4=wbl5kOM=BpV;}rJ{R`H=dV(>JVp1;yoG5=vH#52U*pwH z)jeqStYL(pPfm!;AmoZv^WQOYM3Ql^m(5b6Mkc4fZE+CbtSvcR(p6`~*i3X|8MD+8 zri^XK<pNfuSd`y=3Dv>7qt%0o{*_P|5hU3#hRxQJ3<6A1f~4LmU_3k$AvsU90D z_JR-d&~xk%c^nlyx28o$oSDB9?~=D@`L*&NJWM#&zjH7$pTiKxz6I08*Ev0snf==} zPk7>n^`@#5YtFS6ER3`JBLoblP@?So*3p5M&HVE>0O;GIev5tlpWyd1awhO1kJlfO z?bxEIZ4m&d2QF?aL4=Ux84UmUP)%@lHk_TSxg3)@@345!YO^eUiTa!$vOAf}7?pEm z`##?f$~)gY?9j-ZttVGdZ@7R6)~NpcP;Kjb1m{Ok1iB0Zh|67u#Ol;t8lJKa$6i_L z9GfnzCr!1CsUt^1dmTZyES;mh$|VuT&ZrJtRm>Ycx}&++M+{+=j6%<^V&~yi;}A39 zid7kMY01#oixVLe5sD7;WV9;rTt=5FL*g=N!<6C>#@jjfs=} zf55o^FC)j!#LE1C%*Z)Iswmquv5Im@i6aO2=Q|74Ep|N-0RX`y!3ro)gwDmpJ(6}x zXy+1`3Z7{QO2x#oq9UGs3vE8PufJB?U5%>~85z8f)6-3_`}!-)N6P*HoBT=%uuS=Q z0t#@2MKvZB6fh8f0RvxvLU?k}5LB#d@DCo~*d0u?V=w`#;@6*|ARoZ8S_UU%l&~QI zCa^Sv44{BRLQ6tHO9KG`781xm(i0$&g2{&)>?Z`W@%1M|0d^rhRuJOyD%@k>W_ii) z(*@4fr}NJ*F6Owsb@mTLMFWQnLIScu+CaDn=0%2c1p7lYU{A5}s7K0Say4&mMhOh; z_8;XEpG3`%0-khy0Ny^d;0gp>7W9~@KwrEVRI0|FunTt5a1$Jz|kIjb;CpkKoe)a}pT28wiq`PH?R_pc9T0J$$o zP@iFO0xS3~m{=c3yPX&9x%Ru9x(%HAYd;Z507!z<%T4nDo6k{ z82fhWU#pL{g>^l73*+|1THIg9w9Z=v07yxYlT(0POMO)Fn{dFujMD8W@6~;}2mrQ` zcl@$i?ZJj$)&NNCX23>ZTO;t51z+S)mqg!VkU@pOg#yqH$p0~27a;zg{?}l>cm_x3 zaNl@nU&o_z`8k?{GV@eD)7OyD0fw>b-oQzA5~`4c`SQh z$|QgN{V8bv>HU7FuSK7wL_5o-65&aMV zjYHp@y_17U>#?(_!E8uW1CV~NJeMPyv4%B87i@NA%dx zsw({2@&kd03Hyf0NvI%z3KRhHN>?*Rw2Cyy^;97OyuQjffc`jv!Ujs9tM*pzV8LmfU=v0K(Iv88N zS`~fgQ*E3?!gWbrHuM7=DtDpi8zrnJEjfni$!s5uYOW>9@{i$OQSpUi4le`Cxlbon z>6o%{LV~CZvgi@Ao5K~t8RgSs>L3+WYKUc{F&ozjycLh)( zUzl^MlM>Cx07sB^0$RQc-lWE}T(yvFgh!`U)rU51#=Z^RuGZAc%Q_p#& z6Ye#xr7&P zIr2DGS4WJbNL`I6vXZXiEL&!>S|D#9Ajzyf4G>sf-Wx@oQdxGBPgKfHb9cTI%`kCX zy6%QsR;s7?MocPqq*=weI(hIbXiShodl9TnJ#G4Y3{Xk=38swp(a$Y`Vwf(=^f0e{ z_xMD)ShzSi?3a0708A3S-srx%i=MyTsIeamc8rJ>B$bT;JvxfjcUy_SS|L!cCNs}D z_hNF|36aDRPuBFIoM!UZr+Q7fw_P2oWM1IP2*Dd8nVL_&t!3V zo9A@^EVv67r)9Vixn(8xc#9>detY19VxyQfCvPbASg$F9rpSX}{_)cw)v z<+cJFco1<%K%5tU&D?B4DJL@J(UazS!3Kp@L(#pIwnQk*H8qRbR*j&!l9W#SAhk=v z6SJ}V5Wg#(oU>ey157bGbUCr|=IN>>NX&x_c3jBpzqhE#j$jwQbBY#t_-zs*Biy4S zhs$+eLlaUJ3r;|{9Ot+%PFQJUHeOzW*tC$vfylzj9nABzkOe)MU1hS@!lsGd%?cOqR%*^{6D$7v;pOScemlbSrx^;*<9GdoI{Y=( za-~TOA>>f0I#lQ|1udeUyCitTah5?C|DHj*hE z?&9GtDk0|iymu#|mz3Qy=Y9|@;J>WYfVg^Nrlal~P3+ zNg4z4A&L8;(YNcEzQM%dtl2-58s53K>~9M7K=EorDc>=Z`{xMq1f)r+bp$U$YL{u@M8f*h`Z zS*vt9!`-UVEE;NHdh1O!blUUim3Ckm+)!7BmF_UrVq5l0^&1BGllr98QS4r$<|%>{ z+Om${J zjKj~XI*GRFgGPiNhy~j_$~t41xxao#F0J$3o@P!jn(3)fjL%Qp{3juYWtWuT*;rb0 zWSk{1xa-Sy7sp+gQJMNO6Ihj+tfj-YQL@`K4w!G8ClZKFeb7K7_r?%7(%a^JWQNZt z3Zm!Q>#A1WPes~%yx`>V2V!0$6Gw5f@nI*lh}LzO-Q9L4YVG<=p5s=urJ^EIDRty7 zeeH`s*tM?IF~_1IxY46l7F&E7-3(^c=SQS`t*ADWCE2kyzwgSj z7VRHJ%A7yX^kB>NqWO}ViVao!PV==-z6S2e%erTS5#VUA@{H)1KVE3i<|U`vq24PT zg2Y-o9a*qP7W#~vy&T?M@(F5u4VA-7t#Ctqr=yQPE}_>nc{`ARF*~mD)Jyl@DIlYl z;=E%sTnJ#5{$U66)RGea|LF1ym&=6ACQdWUOJG@iw%wrOBCVS^O1E^FwG|@~j`7)X zf`2shCQWl)c`W38MA+|tjP0Egp9CsO>9Aau)@z3~On+A$yWVFu)bFlx;oNPA+yBzg~jnTUZm6i09rMmCqhQbKOYfKZG ziwdlbs@l|QTavV7b%zRiL!CyZx&A8$Gpw{1NC&y0l!N9SpUy-?%ujPRNcaQi3?*B< zrOwF{qlA0VQ_unJx=cPto5PMkCkMjbN!3F`scbQ*SP8j%)I3ivkwijoR;j8yIp+4@@fT4?&q;rC$F{v$&U!#}(3 zkI$?W$l@Ed?;--vV7#;_xDFZ%6LAa2j3{Z#q8( zKk!FO<12N16T#*SBxS1r_Gn}5_+<_y3Z^u5(vFTF_TL^qEfzi3HkYEgF0Yv#-3pVP zmpjEgnD2dIU|C8AmCJI@Q-%8K(cPPhGo~&f-zB8y33O)t0a2g@$5e$0+c6Rj{A^OW zuv%@#GR{&;iI53Z?f5W5OQuby;IiaR{dyry7y6HW43cZhgEKwtlpgSvIf^8o4GAR2 zV6G0RoYFb~o_^z*Ty43^Sb2Gc6(XP%#C|nF)2ebF5c#U+IUtjv6}U@;fQKUKvD&md^b!yy#^f#_Vg{lhKGOQ&ZSkJiUf zqLSw*CpLA&DlD2Gtm7iF%Pd5@4J|^~Q+UE^Yn5ALEP;rf&3jEJ6SV4zrKZt>#Eu1M z##bdp&uKJzy|5tBo5dBd*Lq6+(110el*z;QTl|FwyK~Rr@tpV7RM5cn>TbZcqJ+n_ zMuhJE3VUFV_RQ<4c@OJ0&zTX!=+Q`PJrXxIQ33JNK36!(bc52>LrC<~+AEqjsB)Xl zb%e26U3Av3w?pNi`FRx}m*==3u@g^111f2p&7ukc>j2^c4%jS*n!?I3pP)-YYBN$} zr_x`Z-z{03>wZhD`jVzDiNI=w=w5nV#J|k$B^`PM;;O1jG zjdugtF}lUXh^`CM&J6ZNUnW?cI#Tg$aFB_a5^FB_6?|eXw5oIRt}Jy|nW|Xi`o%Z* z`AFfF)Due|5!=@q4Y3>W(3v3v-+}PnBp!c8d#zzCXpT|TR3+({z4z=slX0|O=actK za4W2CMU3TNz<+xQxVW)Jjx)@d6Vry#1wl_Tz#CiAgqqr+Y;=i|dBTBZ*A}Y1L_4vm zSZYQ1`xFaXfy%VMG-#j7OV&a5L1MojITKc|Y?T$y8h!=-6Ll0r>Tr=bCgh&ue!1_0 z2O$RCpdHs5^Uu(zgfsT&FOeM+eso=eE%LlzZrutE{RCbB`vrfO`TS@#^#xq{8#mcL zh3EuH)IQM#a)0lVLM0y)@r*`gYwhe>Wq0pSiIo@(9dQmbC?*U)IW!eU!B=T4VSPSwXBNZKb0L_$+oyB;@lfQ+Sme8a>CwD4aAz4E=SZ z_d#o}eJrgY%OhCv9Y5nlUVj+2yffMK$TC>5cF3K28CeJfenpgbh^+W@(54CJwkh0t z0q1gr!AM@o;_hc2UNST!;|Tcj_UPN9ajt_X3@#TW8zT37G)Dd;v2So+QDTJm0@g!; zTh5GNRrApEP~^MCpCyteF+OmcZSwbd82PicyT?qB^WZj+2h|iFoi{-qg&#+yBbH|{&!#fJe)1CEg zu`_`~@|2DkCt3rY7|U?o!F1JD3bO3C?6#$P^l(*>+ypLOLN&`fi^CrWuAagAscrUm zW|kS?E$q`~;hhpX&V4#OA5uwx=k5BnCEEQ+H@@jEM7ED#&LclJH&l)`7)`!V9r34VE3 zeNN5%A4mk}CzI=MHuMB5u12X~y9Gznmso}yCvlZHqAe)f;;~Z`XjWt0cGH6lJcvU-xt?tFMK5v*l6+xa(N?r;?aNLT6kS&@AQ*L z9wl-nh^D2D+W2w&hp}=V)bRTSHD(`dD`-Ok*Srn{XUNkPqrReP!gld8(c~tR?F7j- zh{eW6&^OQ)5N8Ucyy<8x(`u01vK8xP{(F%V1U%6GlTt4rnCq>z0|1}|O$C#hNDvl755>|ThxgL^Lv z1s4o$zoE(NyG9e_mTa*Ql3N1ab${RN#k%8HuJOoYO{~W{s?CWmE>| zXH>BTr*U2-AIP~!Lx^u*QSPq#4WwA^1f9jF$BL#vEzg(ogW^W?>X^jMd_-II>5M{D z4$F(YAFc0Ym=hY)yU01poNC8co94}0tb4#iyqi4vMeo0YMB*pcyOHGE_31p#@7itz!h0;DDLu^y*W>PUeuO++gV$yDD;(Gc~u~Bj- zmmO{}1#1u{Y;c(>XW)I%a91&U%znf^Q(%6 zOtU&4&eG#L$&})Ky2N&N_Owz5lH0F?;=3O6f;-%zY1+Lv7nc|5<^sDO)I4Y!i~Z0X zSFVGG7UBBi7h7`>ZqOx3Fe_@5rhSM(g$OZnwh>#vJM1W)s!mCZPToJkdY{%B1&lr2 zL}@wjC*YF<|KtpAIZxp4kwF}67v!N?1$R) zV2VJ4WKj-(9p9=CDJImo>}N6*`&MQJrqtT&=n}WmI2=!PKT^%b*BC5Xi3WM{o|v^L z^>fZ5+9KR{eK!&=6yddoTaQjU_k@nc?2$bv7o{?u7=e(*OI${8DN9&wF>c6$v*aC- z6DF0bxPKMFmF-~>2%(Oe)boJl4ZE{ThU&UACC+geVM~r2#bj>}bm!h6*Bl4Euk86s z5ZxHKPagct{-hoYQcHP0K?CwS=MO~GS2Ry#gO@FFk0P&<@iN&@Pk6j*8bc(il(>^p z6i=FMeBLk!=<~3h8%Uk9uvOMcVHeBZ(alwpyIK8S*|!cDA`dzj$6#YluvtUq!Q~RD z&1*)LH{y|d%Plh|IqRjRY}I05zY%%Hvk{mu2b!8$Y(W4(rV{(<2e&OP2f0mGxKdU6wDZ%!!#z!9 zaX2|ZQ*QIhdkO03?Y}s_jDF%le$ICTw3P20GgbJC%p$KoukVIZ))qgTg=`j9znRUy z)or76T0V5p<%o#I?UcbupqOf5=Y6tgg!xaedm;r+{_NLuFkJCXEb0`hI&R^^1%1)x z3UZ0}w@cI_20rxOn>>34sYPJofsDl4+%MsnGXs0yA?hUtHEK1scXtXF^^ne^_Cq(m zmCwXzE8os>D_6uaiDEE+raZ8<^0*cz!W2@`R&M3nOKvf??{2b7+4;TdScF?E?Vi&8 z7{0JRdYUIEqV1X9-)mX$hUi0^e(F-BAtBX%sklpL!L^}~h~ zU1(8kJERH+TK>y5=5sCy&RN}Ua%gDhR%yA|npZPPDGyEZdiH9alMI3GW~v)HRL_WN zvf{>grJ{dQw1pjglO+8}Bu!9Z@|Za237FgN{@r!IEj@>t1M1$#J*0ueU+Q~zFEKei zt$@(p2!t2fZOJQAoPEhf`nZY=b{3+B*QZwC*L6YYvTTvFG-J(&BH{f?{=Vy(LoV@j z*Ql}UHPF=)U=F1T(4vzoTHTl2igkt}(%;c>_wg>_+gmckJ=tXNG`$fne$#g6N0R|ETA#lLT z@FJinBGD=#1cVawQYplQ-E5^)Dhk<2^r?>5yw6{2-@QpK`@8Eg z4z5Fo@$cS{cbxaY2%4Ifh582pQQ$bi4nc(gz8I^pH-Y>MkYOM)^KuXzZ2S0>Zz$Uh z8uFZqiv0Zih#BE+5Lic5 z0zXh;oSlTcJq8s3AyTOKg9HWvg)8zPR`IDp`W0sR0~t!#vGCy^LkSZY#Ci7BPZ$8I zj9~ijV1F#-JiVIO z7ti}u6!2rCgG_Fmm?O{f8$oGTpf$)GF0FC_y26Y?uIsio92Zn=ummlSGBY*&L5a%=m z5O1Rf0)2CH@4~ph_l&{g2j79$40zlK0^H5*^{KUbcySghjtBS;`Ol~?i|i<^NvYns zkNrMWRuz2*5*R`<5YUi8f)VgblEvzWd@;u&!rYg~{6?&Zbrb+@?5!NupWjCL{vrh2 z#&f&{`kyih9BD#>zx~KMVK|x8~4{G9>k8i3+Kir zY>>0-+j!Wrdr>x(0D-a#c@g{aQ3EjiviO+_PfuI2{aQMREkCA5$EnZp$Eyr<65{?% z$;c={0T?nc03`TIxaXE6fCySEV&48mj|5aiM8S%N2fVuu1)#HlIr}R@Y67VEb@a3Z z@gZ(Rjt>J?U#nj{mjChklb&$k;NOmH;RJI{f`6`uxZ&|8b&{2T=kyzEcw-t({xv9= zoI#d8|63@zmNP`k{vt+TM!BO z;g0{XrmE-Opl622rm6?Y_YB1b-zTdg{-zery)`9%8l^}#Q>fon_InAp?PCA5-gGaO znL@V#X(z$4Kr=x0H3H!tXM9RQOb)4*k*X5lHJ0ym{Q1N1+zkKsic2!6AR$)dKBzz& z+UPY-4A@*hE6S6d*^zO_$b|GmZijmuxui3#YKQ?(MT6ndZm>_TFyI?Abp8nQpqj|q z=-f0S`@SNp)oE{cf<2-1N?d^Cw#A)An({=H_0J22oN#9o*rx}UO~;!p$K@tA`pU+r z?;{%e>llr4lW_f9AR-iX+jGNaS^<8lUh@v`Z3ui3{u;j9+7nG{h(@=3lk^-*rF4;i~7Ya*F-)Ed9Rxjs)U7gD{Xwb+t|i7tOI}24DtpOJ)^Y;L8ke1;~zx& z?KU;k-BK*X6}qn5?ib6xc8!&|8|KX~i}GQ5wU*Caapm*zoW9*{81L09+l;bGB>#i= zfkTTe)3M9!vZ`JjJl0oAS{ZvB`WIGy{(Iy>%WCIGG?@$cGe5Nm$h<$f3iKAnUZ`a< zziY2q42@A_L&AJO4>8rvukFlgWs!AT?5=AW{=CL&J!VE;8Q#1Ofd#fc750fo-}^-B z2u;JMp(5V21oW8+Vj(hz2N?P=-kt3J!SsYT)1-B7v(xgWPEn;izQ?#ee#OT-&PM>25Ewoz&@ z9M9oD=*V#fb7V*F$-OT7_to*HID-~zjSW6!GoQ+`tEc=)b4u}fJt&D`Tvf0xL9T== z8O;?`0(aXsFAG?s5G6D*#*0ESS(iVL=-~N4-BdFxFg&zLAH&||o{awfIgiaMza0}t zJr0x>Qwdl-PaxvSCs&O3ECNw=F59z{20#c|HO(4mXc( z-*R3uQ$EqfLk}(T#;|P(VH)w6S>2$0Q5AV-Q9$utQprH2Y31<@z6sHZbnq^F^1W_- zeglb^pkxxKvleq%|i zA_$E|eeQH9>RGxrYpwvp=5@(bSi(!rqD+wa`YZVA5#aT@a#}9Mi_3U;3%6~q+!nG2 z4^KV(H$p%xDW^=VNN%cAn-xWxQ2iVR^&b1eNu(yL+28%c7|Au3AV~^yZl9Zx7g?(h zt&gBGFbgAc#JULzWs_RT+e3ql--D6AF)yp%X{U`UFuC4)G0jsHGO@FLpJFEXf&08d z6M5#!(})=gZ7D~aDEJ@s@I=TsAc=z0CEyN6!HwWAlXNgjhtpb*Vhno&0%Xm6T%YQ5 z9~OH%RACK}`)ORrl~XsD&~98_VWLyuGlyRE;prIBOZA!AQ}V|wFC%dJg#~o1D2&ru z0uZc|<0$csqBeg-#XI=A44sVyGm$$TYM^;pW*oonNzP+E-*`#z7hC?2I!`)QkT|9l zyTP(&aeeHb9-Sk~3}Ou4RlUL~(0oozbr-yd+5;wB*}8i(uWh~Saa~9mC_$f>CUvj) zbTFdz)CiDmd8=@9z-a!9XVDF=34F_T_m=&kNpHnFj3E~_9emytM^T~*U=aKJ;9Ft1 zQWtb{a^hOt>oep{MHR!_yFgj!EIh80w^AiseR40gJK+ZuT^V=+k$0-&&`#$tD)Op= z;)uz}dF;Hw7~P=?OR}_qS5c(O@FA0ffI`q@oqMhSYKaD|cuzU-?`uhw4?<(wICJK| zr!Q}cGZ2I5hc=k~=@>hjiyqWw6Wkn292@tvs1wjqUfYN7ugr>CKFgphGg4NmPqS5} zvkJ|;jk)DgD>Yo7?RT8fu`;2!nnKL&Adczrw}`8E2s>IiC%jwA$y7l{*M8-s>&+CnK`X%z_$#1eh24W zTSAEwSh*>!{0oW{L5iv0(a~_K)}?AiV4QYihdHVB_$ZSIFxzYqn2~F~q8Yq2`DRSW%I zy5+f>W773p%rr5T$)|lECo`l~ExXnGpk*W^e!3*0_);M*!sW&JWK!Z&Iav_3a`g%< zFG#8iRwLLsU-f>D+qHEb=UiJs?|#OP`!xArBUx_vZpInniYrLoxZIoH`h04Bq3%Sg z)GL_h5V~lF?Ez+h&A&H zP%1aZ(D@KTn>JEGe4;7k2b&WzR>r22>Mn`9}y=zK>J zn{Lc6S$b71DvkVQowy(cUvUKG@7DK5kLz9$gI@i2SrzW3tSZLCb?2}3=apl%Ob3+Y zH@YeMU-i~9%eEuBg>7q!!kSJrtvBIiUVf`WW2SIoli7oV)lRN>P-zWxJIm?yrnqPk z>z@%SQ+hS-zLI+5+F84qg85$vI4(V8g0#s)l4D%PJy zq{eTYo?PGMKh(BPE4efu?yo1vxa)ebHfR@Bqtn+C16$SFX6sW)R)SIRYYFzTyvaqG z(ayr*@7cxG%<)xFZlcI1^qCCzNn0zv>Dq&O%arcwKSG!KUtB`L@HHF6d;0S1wpXqP zdWwICw#vF)xi!^Kno;mPbcJPU-b0KNy{r;YrrZRY;@=s^sV%#AtSbm~EGhj65Q@x* z)~A!qK`gt5z;1gDh*rhP^lFl;_*anMAtqj3+oPgWYVme$yJ;>CED0*9Wi1?`;-OFN zv-2{7M=VRzXtt}c>5}gxS)e_)7J4^dY7;_MVK9z8@~xgNj-Uq+#~=#X&LdWw4(^!A zbZ=P8fnu9BVO#Of*;UBBTWsq?GZO^h0xrFWo>lDBy=r5NpSK;<2B+L_GYn>d43YwR z6I0C=&H{L{uSP`BwxUIYVbnmL?iDAK3@4f&gMFq8hGIxWo2FYMvg}-GUo*C=qjy~} zI=g;|Wct<%y@%L&W9R9jiqZdM~* zj}MBCcId3pic8mzt~}d=mHjADzRY$mCE9j7<%+O=K#Ft9 zQlF8f)M1h(TnxESX)%2Ku1>3;q$G{WOwS+GQwxJ!Dyt0P8WHsuE24#qu4-l2tRUJbz^ya z+cbO}MP)8T8f0I$`9TfIS+#q?9;$e;>{aq^H+(Z!t9Z|5t_MW&8cFA~hQ1!ma%#ly zYXuiG5iPaeX*%e&Z$0N;km(m=L}<4dYroTDWenh+?tfCYZFz$oRhoJREfs^;$~_kL zIxxH+2UZ(CY)^Zb4t7X~M=Wo%wvVbQ_ve2;fxUb}C_KGp*0fQzKg$&X%V}ViDxd$G zr0t8Z?5(?aaNjXm*D13kzNp9iy=b^Xa{LZ2Rbw#-v9Td!bX$%)A2h6gl7OUA^9}Dh zf*_AHfQp_|U4xB&>1YUESo_fWlQ}Q&WHix}?IOa(pe+5kAD?oquJ> z;eF@XE}w5)E57@Vlblu4G-XBBEULtceT6ni(~0)I!>wEeTTH{hb06P-rka_Ee!qxK z|H8BQQ&qADo#Wc9yeh$fz16I)MBrJT#SC8y|BY3H6pAgkx0`gWuV?dzu#Xt{!L1Dn zlMB+mcUAIi-?_pkkn`}3Tvi$a{tfbC1(hL;l$06YQSb_hxD59C}GQR7A z;i*iWn7V!?z9ZBFc+@SHhui_Qu^K$uqyWzG*0W`^_KTR_jL{|t$gW9Q9`jtP3klhg4bbmL^Se}H$5zRtIy z)EnN1s&FIN63Uh(Z49uvr9B-OJq{F$-lgLvUz$QQYNM4efnwQfGd-KH_j9?^-LJ96EHurFzJPbu#HdR_Cn-SfI7>v86E5wD!G zxYMeUpC?rq$;TbMtASCE`p|W!PVBv?;z|}1{gz*w)2g-_j!zR4Nj_y)uU2ycE4)_= zf$@ZPvqTheWIF*LpmL2f5F;8qZyMN z$Rg3XDm-JgeJ&9p*UQr1ZDk_BLp6&QehJBijvLuyE?dpRRv`LOa}zWZNq0-a)I-_e zZtNl2<1_)P${VoH&DQWqac!Fi>^923+Dpa|Fik)>jx_aIucwfj91YCAl0)&#V5fcSPug*BfC!98zn-%#1_s^8(0o`*p%+MW2SxD|U0 z<^95fH!`KT&C5VF!TG#TziD3_?kRu7O4N36>(f(EXA?%hbepJ7t|2I1z?LP{DbImf zBwbAD?Hkubvf)8+HUxF=hS}bPeS(YY#7xKn9KN*cangREnD{k-Nj&%$_Iu$%U3OypgB2-iu`qJX;(bjJXEXexo}n<9vFH$ zoQ*i0;o)JVv2%q)N$3EQQ89ZSs-I0aTwi91^|I(uu&lAP^Y(nkV}UJ~Yg4VQ4g)w6 z_fAqGT{{V(YvCQ(Uw%1P1RH0Ssg(7a64$0g#EnDnLJfFFXKp}1-#<1~^iightq_r- z?Ln%Bq>NyXGSlEb`VhJX1kqFPM9|$bhA2>=c)>X7G#=X|Ov-evrkRci?JOd$7K3N_ zYrOD=DQzeXd7-KZD!#Bbxqh6(4kIr7X>A)3#Ui8X=L${39vbo$FN%!|JeHv{Hh#+d58e1?WGL%ZHR z_RbHTOU#`JUGZ)gBUZwD=EZ&k%aJapO2)`mMdt~xUtm&6HJ|?g*8a~y0RKYzEDS9F zjne)}f^3ZcF{IDV%E9peBMBy3FVW(j_doyvp0m0HJ;5mnD}#`P00bt4AaF_4FM21^ zMG@eZL`$py6ZNp4Ls7{_5%8zo=KT7+*16vPgKE2(8_aXlJl=ggIiqDnRd5vE8E8(n`b zP>}PFA^^jrfQL*EhfNOx1Oh-1Am88-gX6#~1bPnO0f7_(@S!1|2@e&;^Sv1D$;>Yo z8Nb~?Z-qbrjtCNJZ|YnEE3jdK!h{k5fFPGJ&RtxHP=Ww5iV7Ssm!I`WUr@6eG+KHx z(_35GD2JznQG*h?#L&)a1r4*w+z64UxB*1)S_00?q@fe0bsRaE;#po7E(tm^~%xxxWjRAvDX zs006C&H+aS7B}J*;W-S?A&&T^b!;|~EehhEoPr4(@k;o=lmm|S7pPmmqJH`|*GZ(X zFaE|KK!|g3{NM}@Ak&(~g>-ojy0HET)ajJ`zU3Hb1h61Lq<~5S8r%S6z%OfFnR_zp zvs|ewe3gG%1qt}GK*2h6V*#N-xQFO|Cw_PfbQ=KBj3T3*{q_O>wn~hQ0Kz#?pc%kB z2N6sDR{EWUasIT{)8PZZ0&WBAIm+Vze7%2u&YVW+!BLP5zT&^tf1-BT8rjs;QayPe z_8D7QQQ!ykMU=k5+U>re)S#x zienstiNE~->Nu_PZ4EWfjB`hCv$N5KG!55_3s-R0|}21IZmyy-Vmn+odI|6>~JF<+=bx{!bO#I1-5 zDZ=xik`vMZ1sE_Q=qc}_B#;&t0sQZ&DY^Q6{2Va|$f86H>y-f1k3fNN6fqX_*{O(u z5tKjAKWqa5jI#W-os<9=oBe4x1J-l(SNpI6yo?ysk-kI|t8adce;2u7PJx4yW@U;B z+6Hwm2Djv`R5W`;SNAC6?rXHoAS2%947hmaC?c0YtMEhV40|if`aETM`>H1VOPHn{ z4}L34139W#S4ytE``^D!?#8{a&!4vTanRw#m5Z@lhk$xyT~Ly zSHi8n&bBaY2kuD2^_mbY_vN}xD*INNL-B8I_k9AHhY_{E{4T@xk*8mJY3b)0cz#{Y7=65U!X2e+xhU=AIh7+y z9(rdlY2VLordrp%A+SsP>0=R^o)-<6=DpT51$*|;82N>Fa0e(Fn1#J~!JD+XqF~z! z^3s_)O?E1OdGah5I`KR2+yZ+WF-0uPCsr2`zXr|~bKS>Zf-wJPd*=U3;PdkKEm+iF zs|tdAuL)bwRnG@S^>1tBEMw~K6!Z{iZS|aN$PbQET zzkH&4#)@uMp!S@F;D05KfTyL_!-whN`7}}@0#Ze!ac5R3CSnsUp4B|WCO!4Vppr^7 zZw6s?p8JpU_v}zfVBBd&v#@+E_HlzTV592rRZ@1l@cwprbK@l|g+tG?E&Wv%%ay!^ z@8#av>Jr>SWW2t+Jhr#feQohF_6e~i)1VzSR_UzC%@en8iVn}vTHXgEdzs?*Y|((@ zbO7Lbm3apTrEEu(mGHQQLo>+{WfI|#eC6$jpTT$w686G!3q~!$y}-eFHSl;f&=C+^ zbP35M8Z2xElCQ@$Pm;{v(Y-rRB!{;it_ot$_b3z}53DT=Q=f=#_qh-++T?{T8+XI6 zrq9POXZVOc@k5_s_RX+z7$-#FEWazGylGwwz0YvIlLd9$$rgKE<3+=3dxo*V<@Q{4 zslQ>`r0<%BG>jyYr&Csr>h&w9aA2-OxI5t1mOV~QxNj5Ymg7<$VZepYS4JKif~3oN zS%;wttKEW$%*R)_X5^hQ4e#5A1+j|s$OMSlzeRZ%(2ylY-tNdsw9fX1Q_R`#f zuj_c9i+i%;4OdFQ>Xky~DaeRi>%G62I6BD;*iN~(d$D*NOP?>SDm|o~WH*htFGy9% zRQ!vBIp|G-#4H_q3!SviS(DZ?4e!iHuo(;N0YdYUO}W$CDyMqfxUfj|&?+p!p3jVT zLF(dd61rzjjaef-LG~mIk!1*Z2Of?#Huc1E+&7~#C6nU1z-vYbXBY*AH=ZSuEeMD_X2;_pWrjOc$4b4{%9w}9>aGft&?uXCOLOg!qFEtxybjmXLYliC zKukCJ&m}libXx>dpEoGQ)g(f^^;}J*!O_mG$S7rPx1`7=lj_6rUGpC2 zlazlKAvVP>z@Vr~h1yxGbunEXozZ7^2FBXir;SN@T zz4Y72sM%bqMDdA?QdyXD2}oRHOCW#+u066w(t?sYYgR=HBiat&N;rsJ(5@UWJ?0KbDbLF^V6| z{MsF<#ZV%78|5mL-p}(ptUlx==^JfYvTM{s+T%URpS+TR)9EiqvMek24zPSlq*wE$ zV#_wPxiEhzqCBJ9g2<%oe7pPWTiNBYQDMDUIc80#R6Ma@%KT*hBBL6NSZ+x_FKQz* zooH}>yvrhQUq2{zr=V14_@*A5z~M{3uzzhi*ORVsTfDrqSqoFe@>_6t3JSmvGB24@#p^zkIilxp(m~56Of|2GmDXKhj1hajP`ONt%4S8B zcA!ny)5|0iOi}kYVwx1TFNTHXW1Po(2|P&nVRfA5H*2I*0^1+CT+cXpMS720ngrK0 zhi%1A`H@Pwh(0JkmnlK|c61*mnxxF?j9p@HZ2GLmUcHk$l&==ec+7?mwshACtBUPZ z()SG5|m= z=(ytAibgPMW@dCTgD(X6Hk(mH(~NXQEv)Ac@J>WQB3Yyhl4xy5=HtdQXoxy_MeK7g zz|HyFv!LA{FFUzCayF|%!5_0=kfg{L&7)g1c;%RRQTxwE1=p_C$U*r2?U20AeJalL zzwWB<-tVo-MI+Bn;~?XjRp*PND0@VytP7Bk)ClfbhZ>g`OYuHH{yXVehTfPSpLU8Z z3dKVuNwh8thlMiuv7%E>>3?F;C6 z=gl!!3I}J4UvcGzK9$Q_5JzQeyjfd~wqmp0K?ysw>P8%tRBk;TIw!T;p*MP#?Ko1` zy&3~-r;JTAJ%`=&a2EKNj{VE;>3Q4<{aaC7a5VCy|Hxa7&#Shk;LW^(6Hoybi zr>ePauZMOJk8&Z?cFj)98qH6tWHa?W^k{49)s+}!J(X>0;ahLdD+BR2J!Why$jAwX z5CZX!H*z6(w6YJjn$*6qbP|#ug-2m^9viSHj_5Y*d)SJ!@s zSB{;LE*Np0=@+uiXm~-#@a`Fs<07%e9C7)(@#~Vpk_vTHG=EZ)_eIxs&&tn=294t% z7$p|3|BzmD)O3$s7Z|=QSS5X=`25)_Ew|)kLB%s5>8yl&Xk{OcSWg<<2YN{&hq|!+Egj`Fd6HKiYm~W>rm%<*<$Awtc@DH^(&44X_^>KT z6ur7~Q6A1Luig17Ec93bYTE*&$zey8jNNQU!U7(Rkn8W6FmSl~-G5@eS)5|6rN>V5 z0f58U)+ZOOgslCzL;JIu?qGq6r7eIyhlb3H*&qmgNb0w|Al-2mkyxtbiDYxnfB z8rK2r9(#tV71*7sb16ddktB z2PF&R#bj_jZEuf#3SQj3jkb1?=@BQ_wFPw{er}sbja3aEmOrdM@mmHVAtZWM7R@WisMhG{@yubEB!v0h_E*14n+~=Xzl2UeG~p(|NH{ft;n1+}+3ws@2~nEvP}o zeP+`!>r|+hb<=$qS7^oC7i}Ran;Moob+M*Kwb&m&art>bLs;qgZ6-1HIEf9C=k`75%A0F-7G_sSVZVuR$^Dk9m@-*QnwFM=I z^X_%|qS&BhMyfr-=XA@rBEaUTV=fu~RSzyV9n+}P7pU7X7^(`b8?b6A-dB=rpSA`& z6g)Fqsi_q@C2n|1NRMz&-R}fkaWQ&27Yy^L5WPos@<@5ma;(V9G8Q>_?v}UNC-)e3 z_+`z_hEMO*V$|B+$vt15fU{OP$W%kzL2tXN8%d;(@y7q4e>?FeoAb~#8y zK_OuNlPXn2E4yxh|Fd)_)K1e`DRe06RT1eY+GDe0{6rl^CI+4=3)mpLR@(e<#oGq) z=V1mnKS`#5A@DVfX|mprzs>R|>jqq2m=%|*7kB%k9#W$w3qRtBFf9cKzxx3zPOIy5a2d7=tc9vQnS}h_y{R8 zGQtD>H!nuWW_t6iT}mj_C_Cd@_Bg0VP<~Ha8V2vXA4@(lhZr-_NhToP5nTzlq3wKG zk{i(ti3%;4OTYpGx}*``R)($&6eDvMjQw7$qXbcnKkW~4PT8RTHC?IRC&lZ6{S|<3 zHIl=0ajqR%UmLWUu)+TheUM!__~*cwJ7C_)s}?#*2>9I2eWJDE&g8O4 z)?%4{Onb}LH+ z>yAo|q|^w%K+_>zLr84rY2NA2S!5p=c0BrS)NLlmfdXyj@?^G~Ekbh}pVm&*UnBmFQj2}|3T&)e_rS9R(z#gnD59!M<=Pr*=TvgoVXy!n14SaN$Ml|j z4;p`!>c(2dii?tqu*Jqz*-i)U8Vf;4$sFr@Vs(gB-6Gd*EW=i3XziszAEKyuR>n0< zATl}nN~j87K7}`{F?i_3iqh5s$N{5V)eTX7q-&cc6YuP?mSAX=7UL3Eci@^w6j*RU zKex^6X@3&6c@>gSm?2z#JDtKx zbYDwFrd?34y2nl3I=w(gqyj3l(Atqkwc&++ZYvP;=FD^+3wP~#Jy@xgJMnmJ;p*Z1scsE z$=#w~h79wK@u)e9zjJw4Wp;c!F4YqtpTVxIw|c5ID@vTSvC{f-!u`5F$dqw`u&$tB z)a!Ro=48v8ADLnd+-(YWQkrl*REoiB=AR^%8;Uzq9J7^LKc+|zx#876J^aTZ(x_VR zG~ZLETJaU@Magto-tNvjLT&G!7}-G+lWtr=>myW$GpKni&O1Kx=H$(|m(Ui6iCS0# zDrej@FxzrHX|rTi5q(Tz?d+)u^iFwB1X~@=;AthjrB*1^P_d_n58kj=DnWmLoiV0rAqIwVj@JhtQ!l>8ZO=1}#)0E&yD~#9zfVp+Khq z)<~9uvaK;6@oNf@)%m5*Zl!T=du$M>90XKhYokr?O^`L@`c~yU{o@CDVh=UjHk>Q+ z5W}jH+Y6(nls37Pl=Q7)t?Qg8o5U(uGD7@ zq3Yrey6i1FkUBjL#&R6R2hLNsi5ahuXIuq^N0ti^AV@i~K$16LNHIJ}2mC!$ zx}A-J`<^lAS!Kmi4xmNh1ZC=)}*>@lBDZJbwBiFS!p?u>#5R*7^?i8(<*3KQ0%*s<(iwVH?`w;k83m;+ps43vyDW+xi&pZ~GdxQ%g}{5AC;ejAmcDJ&a@$eR8Rk=4y)bAmm&hz^D87$QYx! z%XA2#bN5G1=2U17UBi*wWAsz7eC8-kSGT*DgyH>!>5p`%M|0Yb9cKPFxKCwm0u#z{ zznZYZ)k}t0G=!L-%u5E#8;60;=$wzS5kDY11f{JAHQ&AQnE#INIv0VGUt7EI5+(?B zSu~3T0%rz!mswK30%eNyQ`v7L+RT2u1mk^|qhA07 zcc1(J6A800{3q9vgY|!#tl(`9`Z+{GQZ ze-QMNx@Gq?@=@9;JJHLMe;&Hs2Ig$JRTlIROa^2kf)9LM6f1}sJ&e<5m)Kkz{ zOQ*oa0@R+#nFf&L7t0TVo=3mu((%s@V7adwM&BO?q%=K^^@~ce zk;&Hnhwbn07Ld|`FhBaR)4wr_eh%Qihm}uF0UX~3y!l;2{nQ48v#%!xtZ%CS8`tHh z@#ku6`;^uYkdRQ*k`oZq)e%F{KfDbE5s#K+VDIQu2#mgt{-?@Z@7V0q#%9kz-^NJq zt@ci35A2_wPuRcD)8}V$W`3-1dv-j&Z*Kd-B{aHcy9=kWJgUCFx`}CibPVyv#f#ts zp1<%_(Z%$uqAG=@rG_=vw?=x(I!fB7MDN;aq};;L<_0Di`7L#%1M((j3grw`&&0ss z;OGG8{|bZ+TSOBx_9{Y-otZaeFH#xM*+|?BjbPPXP+AjM$7M?6vQ;Y z^^`a4N5pPw>fg|jfYc9fZfOhrHulwpZvM#TTh|@bfyEzn(escFDBb7xr*YB!mfBDg zlk$c4(ib^JPE0{ZRVe$VHuzT%9BjP4d99DTKcAIVhC*COV|Ck6%`op(O0Pd zX+&jVWC*?g%eDTd^y$`5`&Y@k(gzlVdB4|tY`w>Y3X%W0w7)5REiHNnclvk6`Zsm_ zSJ&m|_0h-t{x?c=YHjj@CiRl_`&SRPda8Q+cewYpvT@P#W@58P)_>}!vJ&7IS4BO) zzP<73ry)TW^o9Z7%+T^VN07-Cnb8FpgEE~HJ^gE&(sxqX2R=Qy4OXsyW&Zmm2-uAl ze&N^tR>9cl-N%f*_w_&r_0G%u*Hcm+lTh<;cVTF727u1aj@~}hllG3&0L-1SH#U!c z{;CEJjE-S#owF+gaChMWENzXm@4J>1gws#{uJz1z2tp6_2ky`ah+guGPYY1A?FYZc zRrZKC{9|i&58h*i`75vuAX@Z?|LQh7zIw^C<0rMg?kiPY^SA!T3od%($8QQibdMJg z+Hd{{Hx8xG{NK;zX7&pAo}2fB$v zu>Mo9XLGY_r+`J3AF+f-@zhuB2RDGX^+t~K3&;Tw?YI7hVc^W@1n|3Y)$Gu&7esv-w25a4`k;OBM*40#@wTi~alw;@!ZP#i zDqLX;sv54#9jDbR7}iWm-pb?kvlyk6xoZ`ql{tu+PR)&K{Vod-C09pSfA?Z|S8{3x zxeK&OB9d!$Hyu(OANRYzNq4(?-{b8bU|stU9CRbPAz$=I5pM=zrH;H>V^3fn;~! z^Dami6B%?*SmMWY78_55b6J<_RQ|vqS)>9KYMT;J!_fDw>%ybR16gN#$9DCSyM~15 zh267;)#w3^kHD(ag_G*1D!kb4N~!9o?MCiJ6`>T=Uf*!wT4nray9`+C-;N#x-l9=d;9vsSFVuNv@H>N;k8R`y2^jw!zagr zP-G!;*Pq1_=v)_Q4Ik>>!l31<%3q;cUL#OIyzG!|=pfzxJ%Y zHAKF5mE~E&!5W^RDdZf{oM#-Fa7`7ZSyq}3yGq?{`2hR(70wIQWT933+Zo4*wZ(Ju zR}qKq*Y{&Xo9;^tpd?0Amo5#i@VD4d%1>mDk4R@NnHnVBLa$odD#}wv z4*`pB^cN~1b-Y7JIk?n45c}8L)%!TH@+|qn2bT`OFni_H8A84H`qt#<9rCsvIo>pWs ze(K~$DEC6G&ZXB3rJIw(^mT!}ytEMo(9hd>I66RORn7LS2xfDg@!I%pEH--|lgXjQ z1{JJ1Gh~k6P=!NGoOXZ=p9u*hx^B3hD%YZN1WR`#jk$NC&u1b51x_cG$1`jOXq5d* zx|jlgZFb&o_+j@#C-v5nYH2tpPu&a{2Y5C*G-Oh*BOvL%%^*ZXQMNJ$Llps}aR-a*UG3>x}w}5n$&~xSIzyeeSvDXz&iL zD2dkgM|qOI8EEbtaZO4wUjJ!o-C1S~GJVKx0I@d7P0{|57I2nm5h|d@#Kz5H8wQ3| z{z5h0X=8wS3efUtYgI6{q;1GHZc|;qqia-|(De4OW(IN^{cDa=!_p6X{Ym`*?6{01 zPBTJZ_{%4_wEua5rDNLZ1a5@a3^99e*SBB)JT-D@s1?U&ft53(a_)-p(lXCy0ZNHI zZeTtjE~SoiI8f^#n?k${mkr3N{ggsF$s~V;!IK}Z$C_>Gi3_V*u7`SiQkXtU!O=|2 znRv0~Wu&X!q*PC*s^7+vrz~!Yl3Vv>f3FjF9)$&)Sk8~hz-2Y&^CX7Qo5Y=p7ADtU zC&H|iZkT~ed>!t(O;V^04|5<-xVakyojdNoF6e3((I>O^cj=k2BY==hbp@XKIhrEF zv=oGA;A@B5+p|i-z?FgadL~gcXf(Xy%7;7171V`vn-=!Uv4Axc+up_1hF>-EjMv>( zPIhUWkmHS?G`2_ryAsi89H`o|>;SdEcTy)dDQrJSj9ttUk>QQTt5vNN4^k%-Mt)=W z7#xnd_uPveQpVY^hVuQkd zRM<=Xl{`IQluQiQ`=N%Pt9c=PYE{%+ClKPv8$n}SSMMG%@Y?39WeUB}gcFciv`rf~ zbP7#jAo3CwuGICNpY5lEHf=sNDo8$dgL>VR6Qt&l*-UP{Y5^0EG&pqyrI?d=egK_i zY%e(mZ@&*L5Gc-*$FkzrommTswK+KvS;YynH^i~Wy=;S2!YR_k%H%N)V!-O%HgrN( z*iJU_@&|ta71ebjU0~_TPg&3C2sI+R54;2O=&v;}+%403Fh7LHQG?aLVAfo|4mT*T z#-mamrKn1joZ@xp`4vpn&*=0>bc*q+eimpEsq7rr1+|D&wKIqlrg&K)q$P2-Z}b(8 zC$xpYiPP?g(cYg{#OIK{$#6)Af0eAW6cA*XR2KQ7ZUdUR{}_nweo!#RoN>TLF2cz$ zvuxx|twike(<<%hMOS;TL|dMx>Ppx92wEM7(g;7b@upNWvVnfz1`>OZ#fTsSFbHLf zWgUa(I!M0>`CQge*u%CXc_Hdg45Z%ZW)HZKFH6%K4z$ znBga`?fb<9tNQ^lNooa#vnV#2vh)xBSVD1aCD3SC4CcnMxM)V8H2?%gawN&Y^lHFK znClIHSo(6td zlo;Ih!E()^n&@1~;|?y?sGVh8HLqaslo;j=SdnTUn86<}QbGdn@`h+g{71QZ@*8jZb3w@fMQVqTX0rZ6D6hFIX>aPyof__ys2C3hb1_aJP#m^*ZGZmJK}T)ZgdQ_a*Q zqI<3~+X~_WR}%8(zB02#T$~H~h}tf{OQs1qS8tb)6o#3nJBHT7NE$4~#h>tc*DUQb zget+NKg-ek$nYw9S{_0Q^`o?)l|Ekr^r_cy!X%fi-*Ms6fq=51^H*>#p#fxCg@y$( zRYRn~VOrnHvjNs#qSd2E%DkF(5v(9JEaoP|t_Lp4^oY=IfJiyKFoSXFf4ioEgo!4s zegWWLb9AA=5B7g_rTi(q$$B~J_`w3Ee3T-Co8)-DuG)m8lIG;4^PGJHJD!ryGrmFK zt-}KC(G?{w{)hS}t3~V##EMq6q1^TO(-Mp0P`f4f z?0+*2?yEDcBJzyk9+x=*P^;$p0x)mCQ|xwFzPyEP;Z{8@(1q?=QMDFd;m$dx$eIsE zu=0GbigDz+iwOHuC!pDKUyZmmGEc)ItVoDL_G)|c7whukZt%odo@mce0!-gw>>mzZ zk;oXKuH;aJFVbgt{zSr0CVRneEU3u>*W3_9Lx)X@#{RCExi1da6shvs`WtwT>o*Q6 zQwM-dYZ+8)jcwvEtm{>GsCPgwe?y!LlU3zfNQG0I->Z{*RML)3)hQXi&+fA>08%I= zwlN>2^q=eJ>Y7L~OU749kvFeS&niz+4F(xAzOk}Oks9Mok}3l;vY{Udq6+&q*~k-% zq9YcI?Kqs?)5z_O@fVqq+U&C}^eQ`kPEWUfn?x;Z2$aLCE}`Bv47w(pXA1ZP)}V6B zS)Z1C>ird8P^NONWFEp-2IT_E62Y{p{I(czeoN+vCaJEcy|uy_A^(?9^U=o>C7Y+; zqz(qDVh61S2_bz9fw;Jj6DVd5JaH3*h_lrMa{oZ*(j6w#RXUZ(VctFN18@ z;r51v0)hpDSZ*!u*7tE$n(n?ZvUO`{yrPf%0=31!9&)w5(FCsjrp{B>RXE>Ige2#Y zb~c@U60Tbz>nj$F#w$YX;)qE73C}JVwoQiFD@lau!)Z&2e4q+J!W%fA{*6c!+>}(T z@pAO;Lrz&zlE(#_=o%G!r>6q8$&6q}DAtws1GlnIIBp1nD)_y=_JLaWkdT3bAnLEQ zkqP345}6T0W!dy>%|0IDQjFR=zmrBe4D$59Xp_J3y6JU`p|~Po!LvqC_;N+%c~`u;(k9n6uw5%#IXAu zjUdE-x*eAX02TyfdrnQR+lSQ2N(>DqyOXC_kp^$Qx;gBTN^iL+=l%`A%6nm_;Bl(R z`o68iJfHZyp&+ES!lqyUVQv{*t%ut^29pA|(-JM|R(ibm8b<*5ebVs%A^4unj@k#f zA>SqBs`F)6wvZR$F|FMB6)9 zx;BdMp%4-~E(`HaA|cB$p>%Y2KX}*GZ8eL7FHM1 zMY+qHTYS#Qh&AERk)n-(ch8g46miLmU;C>TI6O0jj5TkjN6j13ygv2A2>XN&4SJHS zMfu}OUE%x9AgItfD6U9jm)Xg)p439ITaePOSB4_e{2v6xN@DhWC3PatCc3>lnUso@}K z(;Z)_i(A|x13JE#NXzRv2&~Tw5SVpvXUq_e4$qFsY(*w*$CXzT_tFTov82%X*N_M7 zbrPz*Af|lD+`NwtxyO-tR{kwE|C%Ki3H<||;v*Ifd`YfROuw_Na;#outNznZ3_JJw zCmFx;j)h;iBZ4H;Ri`}9rY3h#1l&kmZu5~+PXVPnS%lv|n*4Sm#qpFr7A69_-4AcWv)#4bHXoNJ|(jmNE%83{oJGFs@-^{3SS4La- zy}ODST^;j)CptH_sMI{;Je|{@mt%t(jy3EmyMtuZ_Vn7LLa$cs1ev?PI_6Qocn5Rp zO(+Y)U`P$-qIX;*6CV^+plL4IQ-_r1L!QCS%WgtdamrNw{inHp&p7Bn0n%iNk)wMD z@T|>k>9r-JD*eZ}?ZPn~cM+;DUMEg)GAdzD7Z?F8HcBE;{J1q%bq-u?GgN6JlZp+O zIsA2_rt)|@bCoXmTswnnB~_G64H{JDi!}nz8ipD(m3E)F*y(7vo&MDr21nCgo_Gl; zqq`S_$AEpg4P^K4aH}hEq6GaD^`cMUbO26%T(jk5?dS6zK{$?@b}W1TG8wZ3gR7O> zJR^L3s$A5&BN;|P0{qK=5m}X+>!}5Jmn)*@#_U&p1IqDFMZ|6T_S1fgfF_oFRkQa` zg7S;RL&5urk!TOS+}!P7Iy?L+DUWASvj)9!enUjQ3`B}VRPo)uyz)cZpVX%Q!jGwI z!)n>CKv~|QrX$;b_fXd&FY06Oc!U(x0Wvv?Dr2TCe4&O>kc^g#EXkjbmsq4nJVe^230U$Z`wsFG_b8qgr7!-n%KQ7`7gJT9`ECjyB<(4 zp5#W2$rXU{zmPXeu;t8`f&o8zn@noh!EDi0M66+#$njyQ-M0yqa)0|uHc`1*mG+LU zZ}Hi;HNrhvmcS-ncCL7-}~QH*hWWHPF>l7*N&cL5!{{+)8Vx;grgKa?45@NMDRGQ$NaY8%$~wLR)edP>g)lEDt73t^Qq!GYPenda*j%C~XGwAL z=DO!AeAQ9)ps@|E#|KyK$T-}hWYz|cnDh?}M~a7d_vqp1XSOqw>MKO*jD|JQngyQO z=SKFV62P*dc7E7LRrikvJaZjU|I1^r%_|vcFA=*A;L6rl?6k|-f0s*zit2a~cZZE# z$fE>+W%sJs?^eJcQ|*UpSk6@zY<_gtqkZ@bLThm?a!v0ldLVGknHh}AKZX<{-y-p} zPDKg-xcfp6w$1xy3ZSe-r{-vvbV;)rYpge^#71_li>^=;c=s&V(+NO{op64K3~M75 z&cp#~b(n?$2ba*Y)sZ|`d>6JiCQ%ZCz&vYe!#UZpQvgdURw5H0;f4F+tS>D_CEbE` zFq-$xP2#05yxy9I_Ay)@4d!3skQ>#LfP`=tg40va7L0cMAWpXw-T`!2N2KbitDj zE&p_^2O~VB^JWj@6$|=1MTKRJC(K_1y56F7F>FwtjDciI9$|z=Ll}DOI6~2G97&uiK3bA;++Ou;oYR9B@_6ApV($Q;@%x(3cE-a>Z`lC< zxXun{R8&<~k9p7bCyZ~?7f6V8{Sq-3l12=2Z1V*7tIWPLD4>=A5ewwr*Rx5ONMHUR z&DtOe8ur>mdM>r)pASO!$#QTV$I_m5Ydq?b385mIh~sZ5Jw8>H`gdZy^Y(Q{LG4P= z7xw5s7QT1Y=(*?!-H_7}f`ZvMAw{VDkSZ+^YNcgK_Rvb3MO8+87pi8tD-wP7v{c^^V; z6idH?D3>@^j!sUf_zfNZvQ;D#zH@_vfi`@-Gzrxacb*P}tTCYdOC+6#<9@CP%}fj5 zzFvgPT+R@VV;>fl*#9lJ3DwR3x;>I2d^W-n->5s9SE0cr_xBJ+OgVG>UjqS6cj4%u-swq1Rd+Qq)>A!r1) zV9|P*&oOVCLy@89E?DB+#a4w>+B9caF0oO3MT5SlgTYxrK-MA*jRX+V;yFkjXrV2Blq%iF)k@?T;< zh|DHg7;pGD211xGf?fcv+J~|xhNB7qsueq}m(JWZ3vAKUUm_=(s`P#72co2Db{|U@ zZHt3 zg1C%T5+bFXX6f-CcBH@*yNa7uzW=*Cda(g(m6-uAvz)b@fy)Muol3EizhbUnnNPf?rgZvtGkKink-yP?sh%IksP=TV94}X&WiTZ&AXc@v020J`#0Oj zNn;C+U1Oe9B;g#x*f!gw#?erQ6(oosDGy~rkz1Ra7nFrl!93o8PoqgHR{4-4UpDcs zvw4*Dvz74Afu9}IssN7crC4ZEvqIan_noO`0)EMCeH(|_IK{xw+fw{0e<_LNz=fpJ zlwEcK$zZa-5C-YEkvAJn{G5^WPt&CH(b$6>v`}{|q=pD0WxyhxZbi1akC+?hS9o%2 z*G=0azgTC3bbz)X%gZVJcv$I+Ft0SDwG%7fI^)RvTA}FOFlG-2f(PC(9bYy{gBlZQ49H}B4Au~0~VvA_zl3E(2_#*?8{a8nCt-UPg2qVK? z=My+DZb%^OxU#yM{K;LBTQNq20VK&11BhXs^SmLMteR(E+8rF*LeJRF^UjbSAWSIkU+-}X!WClu$X4e zc4|n*ggT%=(MLJ61KbKN8fYfUP-BUMn;*OviE9MU(u!=fEmIj2I%x>tk*mWaiM=EW zDtIKINg=lg9M=_UGtlF@KTNH&@&h7GaPiZ!_(~EXo-C2i^|zx#>GX*Akm=OzZM2<( z%Ct3iAu68CO;|PbFXs6p^}(nM&>Tmzxcs=E$3UZkoz_x+u{GZ~m`XcwNX-Q^GhE9b zGf&gZ0OK$kdw>hDVp8*$S#torW{4ppiBaxXfT}A(B@`|6lvHlo@P|{wVm=k|jJ4@z zO}Nqc&9wSS==xy=&ge{1k;NkE-DVRBA;9TPyfgy|1#-HQu()#!V^BoR7bDk^(3*NW zv2wDx*_-nMxP$s@Z|sxxz!KIdm~vCo?W)4I*=tF$#tc67#k4r`>p=RAj^ylR0pa%!}TgMVRw4 zlO5KD>TJLw9Trzl%bnJFQplQe1_2X3DlZ5C- zD-g{4%)VndL88nwIzVW!lPk#~V|!Y)dlnfCp_gAC3ys2z&wW}?1MBy~a+BaV8Aw$V z*_tSjSljR(E2br7&Uk$7H3T(O3>%Z3*9+By^A)1K)_R1(AL_n~h=2$(B=W9X<0{_g z*C^Xg8M4Pp++mM2vk2IoiktZKHQ2@>FEB0g2ImzF;En4vyv%C1mpq?pEyC zDyVAJZIM9FD|V5<^Q1|X(#u=S<%(y{s0A*?I$v|@S0$xob4)H89dBpt)@%rO0!}-g zh>U0$y$#~gxxUy(WJ=O|h#1LdO1m7(_F{{{_d9l;G zLiarbybmQy{!C2Oc=NH^hVt zhYSJMog5=Pc9=F=&7e%b+O{0a{!B~a|18_izk$;Mv@(8s9zEy;Tnyj_;ciI0Ie(6`<>(Od-z{~`R@h}SF1aB~pL#=|loJ6a9xn8? zG7A^;e4+1uwrk)^d)`l3-Ua<9Eb9C^K*CR`8&XCS^>u(WMg(fc(_w zh@+|4Z!5H7k3iN!X&DD$p3Eh_)&%M*e{BBK%V|hR*y$1gZG1V0tDNuH_%DXpsRn`B zENJ{Fs3%|0KPIxvsC6s|om;>*ZR+vc*qed<#`Q^!8dzqbS8s6#)ygE7ULo=d7?hezNNtyxjcF6IkGk@dNw6mRp3W0AZrFD6A#LiDKdod-YS4*Yk5$oli43GYr|#BgP~p9eb|Izlnd#f zX5l)mPM1TYR&{8GKu8eVkS{?_`fez-5;;Nlz22iWAwi{1)aunPpC$XLtaRP1g|k`{ zR!Z9VwSyNF&Vu5UWye8?)6+$%svTS!%!V(7ukgXM8{s6;d*|BW_4mu}4que^t!qX4 zseuO|NdGtW(VAE#1&`C-PNpXszGhedF_q^n0}dDIV7a|jF&mdj@~6Lfu#JR-plNq* zn!YU+(7*Fwj-x-s4dF_uq3UAQY$R|=?@H9vD!m({cr6OZA(_pynGEXJjfHE<%z1(q z;u%Jglc_=FT;Q0*`|M!`1UPZWJ7%#QYEn(nseU<% z3`7rzAMY7qTW3Tt`P%9^sVEIV^|t~oks>~>Fh#&?-JMq=I$@Kpk1+LO58pIiT{s`k zldp*_!HZ*rZ{MHbiRoI*H@&gr(;imPsmzZVd*LNV<%x?V;E6lF4++q<%2zjeY-&?R z@s?TlVoc7ylyd?FXp_EI#W9akZ-n@A6PF$dE)I1pu*6?NB8#a*JZ_Kgh&nY>(s|@c zOg}SN21|9+eA=UnWwvx%@Q4rysGTpBqP@w|T2z%YL7x%~(a*;2rXKE#he`EL&2 z?(~=o44bN)pcJHpTTbqj1+9xfhTUP?cmoRwRg>y++h;81Xw}Bf7*)Vr36(@_-NG7P z1zYpF>4SrCOj(cI6gmg-IgeBJK5rf-a^nRX{#pvVUt8YLCu(*h^CZZwj~0L=8jYnl zIE3(cb$m6`#zyaRE6{Zfkmhn^Gu$wgjpyqK`7pxSnJr2cy2+mteMV+=43CX~+EW{w zU%eldle#OOAHZKWVM>0-y-Do6pQ7(}`zTLovG+LZ5eK`By*K{`s!1w1&tWx{5t-X@ zV*7&K#+tGju_ouTk;PSNO066OTtk1MymfjFgo;({SfpB8vbWO36j8?aXZEx_~ zTJ|xC(c-#;OE0^Y9RR^Ocumn=^{1Sb18RDythvQR7Lm&ShO=y zi&JDvxB!jWe+*4)-cev>j`ZRv&w?C+$^t_P$i7rU$%@R)CM}vH7BDr7aWdtRWtzeF za|+vgONG>u&!IqwWZFIbL#PfPZe(Nd$LE%8M>WcXL1uQ|6asKn(UNHPUwLshaW^M+ z)o5s&zOb^TV2|M5JnHvOFGPk1#kjsjq_q7TCmzvUCF{Q1B|Ixf-sgr;7fz3mpbOK? z2&{Lhw>!*G7An({Nna!?qDkGaCjm>gNd=gFKeP_aw8mJ*=GAyB!X2O)>HUrX%QLOk|!5(9;BgBlt z!@Ye0KOAOD`2F4qcJG0YU{?S>9_~kRAM))H3EaxmS7Xh|Bh!g&zTo+44nnO$h z!@`6cjU8oIpY4!M?=;76)5Z7-I=fEL%Iv% z5v?~OIbof}?>Kp-f`eaK_z1foWgrW!%7fb`&^Ag)m$E~r5TTK4pmMN!G61%RthTvp zlqcr>Ae4JJX%HCqi4c&Che`Jb1!S`6%X{rjwXcLKI&AV%J@$=wdcXy;sMny|WfC8U2njd$#MBz5#ozn}t|5x&qWhYE#05 zauqL$Bh7oE_A5}J>}4oNN57XsBxk{gITS$`MXh(tenE-!=Oodq)X)q$kcQD<=fGr} z%7|4GRb61#9+m!ELlkOvMg}Uy+aE=D1Cc0<*VO>sLQ7Fk1py)2)4F2&sMUh^ySMJn zt<}|y$D-mnI{X?wYvCUgB7Lj4mi6?9x*Ex-6InAO-bh2}0}~vQ0|&0+@JiICt+lP9 zh4}m)X6kY3$y5ffnTLA961fHJ3Y(kD)5J@$!fjRu{?v!1WsF~+F51^vgc&;WjEX>G zRGQU!LVum0hDtES6t+jxHd6MP@Hnluwm1qCsKu2#=RvAwG|haVJ*?y1Een*GJ{aVg zM`h(0O+%TsXBt<@;sKN(qhD1%b~l@qkqYft1T%S1(T%@Xd`dnVl3FD2XPM9sHLHt? zRZb~lBVvNhq*_}Fko-tiIfxp)F34+R0Z$I@HY0x0@`6^`?KTQaGy z^cjIKpmb3^8RMCb$FRNb9-7m$ocgdF*Tof2#o!93!f-PL0l}^6_GKhX<*Zgj^fNeK z-e~=NK`dQD1kOxT7wViy>;Q~PU?=@-VE7(O-|R0LE#;A%F$1b#?+YL>Or z2`j~Oi41BJt!;cplXPxA;Pa~EzYgiGA!lQ4Q@%W*e$_P9fV^$SuaFug+6p1Fvn^Vv zL{ZeRTPHfSxETos;%zJu7tmthuw=nX9ql%5-n46mzRBW@punv$PV(EK-Sds69u?ZH z60Zn~gcda^jktC@N5_PLNZm2z*XiCARz)*vSlcHPJDefu!|+lX z4+Zhu+^o)V$SjdXFHwfT zo_PHvjh$O*#i@P#r?Eqt*{ zJ_yyNy`#@H#1O40r6)J!+Wo_e!6;GuUvLh_{}tz;|9`5pIOrMwcbbEqfra(|D*pbz zXb$D2A1qc_L`m_e;%Hm+9Z9z|W*BsOLo9kt&SC-n;$nf$5|HFuTMz_`1X0f2kK(zz zKfW`cx!DcZoi~@YGq0Vz9EL^9OM6L;A?krgdh)=eFlch9c!i~fg9A{20B>!6d^%R5 zB3h6Gh~KT)nQ}N+hmijK!afFL?S6caMN()%{0K{Wa{i4Og#ID$eFWqa1Vm6Ez;6Eh z@jc=6C~|((W7r0;atFX<1NnL?)*={~+Y_LM79sqr?;n(Y!x5-`1O$Y`cOq>36A;$` z^?-Z;7WhHf>)>j0P)CsS{%U;v;59$R`tU7+{|ZrTZQDl|i zIKbA?41q;`^}pH!w+8@%qp;T3&fLcQ5Ln^h`Y{bd0Mr9*2;{H*nuuofv-lVuKf3t2 z0Y~|Zzuf`)_3He3GYC;k{{?Y+{z&~DAvjH;V^mI|*Z;9R^2u6Qq?7fBDaE7pPf+y( z!y_PqLHuV`^#02dMFRP#`nTU#ASsW9&VM{-n=tn5Hg@YL;eS&1qYwJcmc|J~p-u09 zqL-5e0P3$g&X)UU*7Aq&_(%4rr}10I`L`E)yn~JNci;3a@&5NNAPX;6*M}~C&`A(4 zl@BIV3-s()F*o36TZ_4ld3gHVr%M6?(E+0UVh}*R@+G z;}pz4kV&sLUe^WMKLHH#8wb~+s|q{*HH1Pj$)~M<{QBKijJ*tH`eQZY4hjN@kA@bH z#tL6Sq6-M<4+rOnS2K|7H;&#v1NvVZ8UetudoKW1I`nIu86`Que(I;mCotp#V0+51 z$TxuPiC+S}zt#^PakTN}caU%}z;?bLLZZb79U`E;)=yCU;!$fL2jSSy)}xiB?bRMW zoIln#)-kC4);Cy!i;Z8gW(6|MDpMWvL*dBf(QkfqCT;r{s4gOmq)+?6qYRDh( zM}ju{V`DI9pbh+==6~z>FU6DJbf7qs;&%OB>7fAY*Xhwuqgh2Zyh;*{UiK( zeMfsFtn&N;{3`;XVnZ_~3+HP^p-Ad`z-yyJzlLlb%*_kXhzMC<3vSLioiY$St{QQG-GqS5#W|utqwIBYj@#_gp2^F^CE(sky&G+QHj>qHKfwxlsd6 z$%csar)N_B$l?$0b^7+r!40e=7h`)sfPF4c9`is&t+?_59TW1{=MZ2HSeSJwn zS6D8 zCq{bU%OGq>Dnchou``VUM+6MjjJ8Srg9TatyxUSY4bXM}5!Ge^U0%a3jy92 z=`kc++s+mD+zDZ|hr-eAWL;lujlzY+Z)W67BXwLW%*(G6!5~t7q|9};y88Y5sq%^- z^xGnH#%ETXBsGG7_O0~t=Rr+RYa4>|bDQFp@- zlSsRXm#o`jhzBOT*YEYpiBr3s@%>g&lXr#8EX0trj^EXYqh18 ztQ2^KRc#KG8c3T94A_^OtiMM=`QIx{vx;1~hc}}vMCvOImZ6QA2m`-2pIz!OT( zj@xT8ZP8B0comFzuMd~W1X`ny5Qwr#Uj}9*I6q1K)?6n@@C`Pu3%TKkOGWa zw6rAoe&Iuegh%gX`ceVMD5M!`<7WpNc?ah-C;PIZ0b~6$FCRBZl;NjJR8BmkI(xcx zLp3n0F8Z1|a$5HBYI%#2(azDpZEz;F3{PCf#x_FtklSPG0LbbDyA(`)hCVw2Z&z9& z*>8dyitI3H*UBIoJzp39)vucvEd|L+rg(~+7VQp$-B1y~p`*wq!&l$*adNr2&=u%m zG*_kTfqT{Yhw%1_-(%$)xJZHCyCA(8XUBI}TO_e-2dzVN%`PhnK1{xqtcsz6O_W$S zv6QwS)E5IV722(Xsc}?FP;eNh>y)Z4H~;N%1y}(dNQu?lGV-2Plq&m&40qmAS!)k@ z4Y%FLV>IMWvgFGV+>`|b*5SE3?+y#mNu0X9&AEkcQup_qP&V-j?qWh>zzM zXDjrV$vg1(245T6jGm8)O>>9S&*F6_6@R%D_joKV&8IUfyo~^BtrHr+^Z=fre+^8V zSPjgXvVrfrye+pA01_z&M_T-I8KX1WR4=L9uUolV)xwy_2ETYdaGhr~cSr1#y7|3c z9L;gK69)OxXq6ZFrMSvJ3FvXK@_TAi{xzQl!Ohz9J)+7@1Kj59-rW!3nCU~(l>Z1T zOZ0vXhw+yB*qeU`o_nIp6}XPj2v@rj>zueRs;epH?>c&Ip_7XtryLzk@V~8Hsf9u^pQ+B3b zRh@lrLFrb!p>ON;mDHj}kisl(?qaBZ5{U|($8a*04W!}BFrA)NegNEq%CQOe#>8<^-Sr1`t;0R!$%#>PPPpqynS?nkN0lJv{4v!)gyEiGeVm?m`=R8 zs&|LPya_hqg}zN0QJ=PoS{w%who3W=w4c1u{##YRl`^Ct)r7SnIDp(lj8>`SS^J>y zUZb7)go-7*zmPSXTFnb(Os{zEcnIkMa2CySA=*6Xr;X~r-&a%?TWl|I5GBfD>%F-F zkzT%CJhnT@Atg%|=0L&6Byd*L2_M^3fosYW43&s-RCXmaA$OOacv_6&S<7EBen4m| zgF?&O6H{g9wo;*2!b*>yT-7A(w}s9g)Fqv|8(sSdAJ62t`kE|-tED2-s=Oa`%v5Bz zJGqIN@^sP>4w=@>gt;zrrXgo=;!*>>yi?zw4A#c>kB?Ul&?Eb!S^|LY1fjbIYM zD)=#ADpnuxkpZ~Y#5z<=9-1@&^&?ht`Gyb<2z%&6%^?UwKiGhg`Y*;#tx`4Te3f72 z=Y72?!!-inQ&2R|xDLwR2*gatBV^;^UR+n>q&m$I<4M~DYA%29>U_f9E9jC2w zm8Q2IH$5#A)>5uSd;{E4cVCp~EMh;%!OI^J154-0GYP`6zFjDy1d#(+%dG>m4O`|?r~xU3&H1Ty&BF) z%G{djQ86SotoFl?HM?{0{GYzRSI67N`hn{QMk~H2a6 z@_!gRhb~co?uxc;+qP}nwr$()er?;fZM?Q^+jd?CS;^oVWLCeRs@6UG?vq0^RD}CZ zR+292lQQ@q8LE_Ft9GB*8U;Y4E??MI%Bv~oUXudK>;?Fg(J<-eW2~P&Gj%_95Ix-2 zt4JyRKxtc2>?EgE`S)>vR`u>Dec1gwMUV#!BZ%}`nir$XjdrbzuQ3R(uJF$zjMb%W zwnOI9#^8R+$HXXnoo>r`^`JYc%CSfqc2TWT;>A**Gpts855-?vzca<_W0f;9t&rAn zh8v+C5zYu{mWO_a5mO@g9Y{w=ZvS*i9M7blaI0{~+Bqnkve+n(!p+O?+yl|`4B-~2 z6Jp0-fy|a+>lE~G0vM={HButW~Ebf#^em1 zy_C}J8iT5kX4DDQ3SdFt7R%Lf zxDk!E?}!sPvdGHelhsfkxR3H7)?5$Y)^(zJ0*6k+Co1y`$*bBp?gH@YB8- z=JLUL7;Y*!88{Y70>K?jJ|TxEs9V0yK@T$O>A5R+=?&qtYpTY45h1ynTOOgVUOF+k4J*i7v^v*!-OdNUSeR0_J#&|y^ta-y;b3B?XAN2` zTkXIn%a0B3jo9+TT0k}SL=?)raschUl4Q(Jtm+-SyK7Xkn@k{)oE%Jhh9W@Iz@50GaNoB52_B1`{{B_g93(hr>vZD};=1n`Lfu(*m$ldDM zC~WA%9AfD!#(h(WWVjEP-A6BETk6?HQ|wfSW|=Cv343{hv!mAB4p)DHMsWrLhQA1( z&-77o=7XbSEcEH;nyN^QRCSXMxjjw5)nGH1gkb25nR6bF4}_JUi?|u`ps|*siL;Drr+%z6B5l9;H^J7zEMd90eU-3@s151m3VF3 zHsT&}@~MiQYioHu|1=e(yzIjH*@iR(T6kNoYiU8sh&;~`(@@|Xlp~Fxsfs8s=4v!W-!_kV0*2RvT|6q`C_Aq(c$5N?s4TGTHlfLE)A5dLg zgnwigG#5b_Uk1Nxg2DbTOx^-hU-HEL&Ux6vf>#*&OV4gfSbHL}jo+d?j&06{;z{T* zBSrbdG#~76!;`OMZ)+u*`<166zN={B$|3QK$n65tJE;&@Qp#r(*!xZs7dx z*IRjvzewda$?}ktu3)xYz%odY^EzO}GIpht#B#U;-WS#dsnhA+n_|VRWs3uU|O`GiTWB%;oH#K~e<7k6pS!RjhAd9)?G;9+J3e$X%d0}Ej4|UuSS6m-!GaUNI&oHlsnycp?h6Z?N|=2n z$(=kSh&@#7dJigq?e)1eUNn?k5fe5^f!rFKwzPdl#?N+-CmnK~H^69CITyD&3njQ6irw3onGb;?6jx^gxjiv=w+)Ho3d*5f4=9{rP`GaTxcvSDH%`UW{izWi|qavqd48)Huha08~E=XM%(ON*@i*y0`d8TY|O6G$_*3?axvk;l7(IBBeD%|X0E z-@9NeX$8l?82%{y3!%hKM9X(Pf`h#M0hrvxha2rpQcD zk4jFvaCz^=5*>*(=|fyP)eoN5@U<w4%R>&ak1RhlN~1hH%HRz2WIF89el0$ zH(G~6*?A&Q58yZH6X**x3j6xm;pHu*u`pYW9U%NEMbZW1h(vT9Jp9Gm{q%v5CC(wl zVsXOhf6D4uP;L2C_9o zO!&4$%+EUdj#C8*+lsR90w>_*AD{$YRW~9_=JnGANl7vZ;x!{MJU#R8MeTGC}Gy4 zRV=2dI_D(Mgrs8@EFxz_90wAC`DZI#{ZBCJ02+c04|0{Fmz1aDw74Tbkn)CUW>u$? z+;j38h7n9Wc;!9`Noyod0ry0i6Sopc-rp6ODB+By^N3S4Ls)a==vmKu71m>mFU)*y zDVDd&k?|Z=Z}OEJh9pj0{ikTWZYJ;4fu<4sy)JQ_P_UmXV0C|K$%MBW(gi}xfz%`C zv=f76R=9fAEo<$@&PM1#$#zH~HrOj9xSl=xoiUBk>B5Z6%x%hmjG8`TgCbVBwO21d6i_)W z6|a1&6sy-%@cF$96fcF5myGQ!i5Xz_RH9xxYd(8vDA{OM(gH$>5V~mq|1|XUQB#bV z;91~V+rB`mg0LdHXxT_-Ifi}AoxfY?Ntg+}53Bo^-w(TFX13@^*yq6XIRom$)N4;% zNkV?gc6YDTZ04U;UVSZ0#RRkForEtsW=)P=$_uULt~E*DE1plje`tWG(=f98Ofc*b zrF~)mV_0x=e!SBuS=BtNDOs0QP4LWNi`Y0yu2k<;T`@B^`qh#adMo3o1tT8mi8QRI>)mkp zdNZT8BLo#jncEa@>1k+NhjC+-mwbdcX~vge%2Ut=3iKqxdjo|)!1;=q${3%>R?03f zn3?n;UYV_x3;P4?sv?P29m16iBCPngkMch%a$7>a)$@)2*jl3+wM~s+sT8_@w0>zb z{(f{OXeH77Irr4NINVObk%7_Fb`+gecWO(RWf$vX<~D?Hi&Ma0^?+cipd&eW2XDNdLI;nJ9OL)m?25zJzlI zuZw@o+W0j6UDFsrsfxaOwj;kzN!a`tmjpLpLKE~bDlY$58$0qz=~&aE1og;WkY;+h0m!{Vpnz1Kr2J{{LKZrU)#vR<$W}jS;W4%7}@7w6l?(+ z&y13l;QaJcPd9=BBVXs1s-U9k?%bFM?MOP_ z>70f%TJ1U!5p@Nks^sNgc7;j)@>BgWH!e{jSyAK=JVJkjTibG%l#eHt1sBivPd=Gi z`9b!kD!?tQ?Fp`|ww;2#Jq3Bd|{F&kwr-9yWGRO8Frd=LTL_{CcG^J68L_Nq$c&6 z!`lK2nRkR|<5Q~zj`-!trYvF=oi^bnJ+A54GdS6k@#F;P+afDaxm_|%N=<#JT(#x_ z7UMk6#+!g4)zXh5Sjme`#_jXsPWdo#tFuZ;giZoE!#<-w7Ktq9`R`>!6P6_2n@O1R z)19Sfq}C2=Pe)pV){^*Yspnc?&wzEI#% z&OqIvilb@`2YlU5@X*kdg(pdn&f!sRU4_3K;vM`8adeEhG`?7% zM#ZdCHIandXB@t8o>#F(`W?Kx`t&(k`Qd4S?mt&P;JFswL0m34d5eqIS~ zA0P0VM`K)?yQAdbzIbFi-Z=xsQnR<46)T{i`WutA)lFSC9q~wyt)JZLVTG=^ACTEE z&;|2(+21_3v1_z=0)OAaR^0791X@UzDGdMdCVIiA)bq|y$x_7neY@cuSRYNzAc@xM z(UQSk&4PO2^|2qZDIxFnOHNtSwO;gI0&S1C);H3;CDGa;bs_%uXF~Y2(e4kCnhS{2 zFT{z4#7>c7Q9g8zi(Ex5N{FO7h36~Mt*gpB>E=I>$B#eM+cBs7NT74xH>-Md`D_5w zs7N&4H0WQ7Q?LLrPn-GLX*~1YM4oVN{Tt(eI75IiCA9Whqza-bn4E|EEi-36Eop#h zo%t%PjyXKk-IUz?ngmoQI$(2%!HNt8@`Gk&hto}@9m14UdiP9UDo(wq_XLV8Y7kbL z`gj(VY#&zb1%FNzi3!Bq8dF-KWhDzXHvO!W_l~WTpCrH#$59%Q4wQp8yJ>%I2>_Dy zr}U6-*5w#<6RMHd`(~KyQ4B=scH~#1`h0sIzQH1Bu!QTS|42PSyb`MJOb!rnyO)?4 zre>wfd{$N9iiV-)^kJRt)sBwf6&>?E3W~)M3+!+4$u!r*kfS=mj`;da-YN2`46PhLVtV%J)_s{uY z@q5#S!p#ZNX=75kmxYDA^5dGn$|s@V@CPVvvYUUk3`nCs_IwSbps>K z>|IVz@!AGpS|g8niZh1dWBrx$ZB(r|EPZN82IU*(v`+^~MiRMR+qQ}~Lh4ba&L)y- z%PJMWe%CIwTq0l!DTljCa)uGUHPwc$vX8s5G2z8Sq6-Tn? z(;ZhO7)zF3PI{GsogHtQ*G1bz+RQ@9IC9QT_>#9w6qgY6do&AOFg4$m12cjP(nplb z{qpK2WBj-U&`e6pP{NCrj1%&R@`_u)5}lduhjAQN0lt;DAq}h^Q+1m^be7{KGj7?H zz;3N#pBGtO=*&t?W}hY#?LKz0maAhYmNMEgxNihMB|ZdKEAFSPx7>z(*_7-`%c;|4 z)IEG8n)InJY1d^20hMobmYi%);O-E;IQ!~MjBZ+EFo^Xt%7 z!(6Q1^7{nB&&7AqNiS_Mj3vAL9ck+!Knkc^-6=JAKTm7lo=Uz7?O&w|)>_Gt?vo;8 zx4v($U4lP>bkF`0O9bJ+B|pXx4mww> zj)?j!H8w>8G(@?k32ho&VxyPA;N+3nrQYg%AyECx$WrF> zCFXiE@qh{SUzHGU!l(G?(WiI|Y6~9J=SMx-@xdC+vG>Z{vDU%n6nf@xa|amTq;Dm` zwHBU>p*%l*k_OgYG5ZB)wRDe^@+J8HGO~48VS_j0SaF}>>=0%*Q3j_LsAR<+(!x+w zPOYyM^nE!DKKHJ-qDXfcBa2D5SXw6K`ApeehCMP#%apTR%qYEDFC1HGHt8FI|En~R z@2W!!X?(6qaly_I1Ky8a;Djs^w8nSmA6ZDPwi4z&_V!wGuenn)&cYYv{}z%js(WVh zIs6K=Z-@uWJxodyj`d?({!>>uxoMDe+xz43LrK}jxad%|>P}%sG0r15`&Sq;@kjZD z_b-a>Uz%^yo7Wq~xj&DC3#a!`o>fVgTGI+?B>r}vfUIkn*01GdAKy@j?Mi)}cpd*V z&9QJ^jCnaXSh=GN$aTm2iqPJ*t%7J*&(RX3Qr>0b+#8oO=(tu0A9-pNB@3D;f_r;g zy8C!`N?qoB1!21i6#*TGyKQL%I14pP%6a-CnA9B1#r{$P-n9A`SL%cr66vSz&WX!1 zT$5zRIhbmS#Hv*J(YeHeb^03fKZ?H;>@I>0SXJ7-{1eiFHJ$SOD!Iv_PH{B8yRZA% zjs^_BZZ{f6VBy}<0pq9nXZZWvE%KISr)UgWnR-$ zvKb(>?1u+;)JsoXh(x&M`fKgY=8i8~Udr6+PJOt9@o#DwUc)|FyGbrg$)i#P1M;heOu{D>J^lnzlN+w4e;Mrb^tdLe>)N1am=8x`DTXaU z_DzGtL4WRIk5ZDp?$e|&y2sMFJDxe2k~Ru+xy`dluLpNCg|-6~X-7uBroz<0{!B;0 z(=)58)}w5a=+|Jg3>?y6gd`~x;tlTdwswH@EGDPrZj_C32U$a#l@`j0gm2Q7(Vl`F z(#lhi?N;Dax+2XN0N{P@D_$R}CvGnx*?J2bAOS!qx*xp53w<63)&W+_H=Xf8dLSs_ zE=}ift^0lQ->9C>{0BskLi@Q54GXoOv)Eq1kED)50yHv0XI|PJOcp}j@>HR+EsorhRZ{Nymji$9( zZckp%YuD@NRa&H+aF+4{mK|t9FgFpWppF1yKyzg)n*;&?$b%DLAdiNO3>QN&?~%S6 z4H<6)G!U3O$~$~mGxRW$r+rd`$PTjVek=f~x;H=sIsg&^AY>FkAOIeL!kfNGdo+Z= z=mM-6timx6#Q-iL1Pz&Gdr}$n)F_&#{;9q{AdP_OkrXfGr0Gn4s5>Iux3sHpzlyNY>`|cFyDi-~gz51ETpcK>JX9D*!D7(7^#% z1K5`xX1>`uzi&x z3ps?bzHuslWDbB|7;u0Cpl|MN{`o%S0i0i`R*>L*IJwl=Tn2G$02DKL!1Boo2SVO> z8~|zY%Uuy^Z;&s(orP&6GkZ%{`M1lnQ~*v%*??o;@ZYC!fUf@RcnCU>sUP=$L+Qn> zIL(!LEv%b807ns`dcQn*uoED_-P!G=&%DVN=a4RLuU}|E!`PL%U0aPVF2_r*!E9Z^ zD5hVB8(9s18#V-z0DK4#D8P3>1ap94V4KPBu7KDw&`y*X}lAN z`2b>rzFjl`atMeo{M~P_!0Ve`_~9OkUnjwvw$nc839g|1mA=)OaD4!S^8=&vNYL(8 zBzS)Qer%V%xD|xBJ`a3TVa6L>vy1h2lVP)cPa=Vhsj^I?>`=ZTT%Y;00G*^ z@JJvIRX>7*0Cvy*#QWZP$9;(S_yM1Ozqmgde(s~T-}raER7d>(jR<~_XXE$VUY?tH z|Gs<~LIAd3{{ru*yT1VozOMfU!*t3Aya9XOM0@^#{#rX3sH3NSf*;Yl?#4aqztycm z0o?}#G?(%K#4_tg)}9Hx?;XN zB#z45U*1#ZmDzZs7vYiRSO!W*LS;yxtnd5_=w_}4CJ*JXA^xytFPO=RdGf4s}n;KniHK$(x`(4=VgwQ@415m0WE!dq+7*UC-+c+^-FS;VLd4q%%S^l z6cR^Esb>fjGs++4bEF|bG2|@K+oU*UiojXL&qY!;Nm{ahVQA|-`JFLq%lC|M4#IRw z%{j(*Kwb&4>N?4x*;3&L6?+jlpDs9hMGxu57pLL_J#5k+qcA6zgX1B$a|h=xH~tkW z4-a%q9>*9!7t6s=ON4+D2UE_pJp1b=~V4;`gIEv z;1-(J_G09}CE(=p(tkv2Lsv+l8Fjw1#VU%Bzj%DB%4kiw>eR)zB;xYPl9Z~*^nIur zS``)bq|TL={Yqp2iK83)pjB`e81tTj=tyVR!C{{bc)#_h5r>Mx=qlE9`Q+R0NibD57LxeA^v{$kxO((@PN!@#(55t?epv!{#Lwb~!^ zF+35j9q$7Q2IDkqP*B9EcSNrAjTg|j_LeK528KGavt z9-VZOXw*sha_!A0;2miX(F>E)Amv3$fkh!FKyY$J(`1eh%ko`Yox5ed0EiK^^z~JnGzN2ldJvK2W_njne$m>}7cd(UbPJmHzo+IE!y`K0WBOre@#AF(< zO02&U^%-uTuYW*yLYtrJxJ1REZ|w49jm{alj)+94IxtgR>vvp&j;C)Bn^rmKbid9q zs8xTrqb8RDv2tklC~0&Cj9)(qTI<`Lw=meodB{?LO$Mn3aJsKzFa(ir48-poF(Iw` zjLBbck*hwO$eE*RS05xsv0e?t?^B~}khAQTsino#okC}yt>Cd*W$hgo{3R5q${o4Le9dUdn+_*-t>wcg?io!)2yb8wu~^_ z=~1aH`N*VxoGHULgsG|TyUlw_YkA@5iVa_t)tKYJrn8*^3*z8dAWfbHIlJw&A}50; z2JhS(2IdkWwZ0KOMXr`dRu(niOQtc7E^Bx2Ww8Sv9D(NRz4&JBX;Wvs)9x^RTceej zHqK)et336@kcO_y;ub;ZT8BV^rs^A)=#?eYDw)EU#S|t-Q0(fB4NQ}F%kHrls;6It z8-0!8*4)%9rQcu6@q}Anf9qc?Sxv>rRDNdZvySeDjV)L8E{bGf?(vqdxAa=vUhn#e z^u8Tuak*%oWTzN2zXyhxV8bx;bIM$J;7}RyPU@J!qjG30JWhJc8%#%chZAopitIaG zTuEiT8P)~+i`*!_@LMGH7WkU(rrvL9Nv|cW%>0QI;oNwx~=%; zc(N&Xm~;%e1G55?k8&XbQs-CUn@xu|;J%y$Xk|?88lJxJ7gV>k^z35;&C7u+WAVkP zZ`y@QSIr>>R4_q}!O*0k)^8kq!!dJt%QCbw@!FBz!9X_%zMleI#Omu{==x9(T-J=H zg)h?ZK`tu_y0PID#=ce9)#q95+s^$D1Xb&hv_UeNkWRZ7zX75&y~IwVWM%gHahfZN zFFidP)n-n|2sz#e>zP>D2JZsfa36CN!HB|1U&Oqin`mbRsK+B5MH--m*}ygR`ZiKK zVw~-`MOK8-RQ>p$VVXfA3O2z7y_BscO+THB$8Z$J3P@O`R58S! zyVtI24d*D2ABhBo+v+P5B}d~hb3cJo=-?x$)gRM76vyb2gq zrr}c;cuLr1@qfERKI3S{)hJvs&|eXYl(bj?$ISBwqEG4=!$u`&egiPVZRz?qFTF*|(U+MdIz2fhD`2pAAt~hu8_?E1Ti-CGdp%9UJ)0V3+^W!Kxvs1K15C zC4;`d@p#a+ypSvQePxnr9u;{yDm|Mpmb{;q;&-227GZHND(=Y+i+JW+wqvEBGVpJ; zE5t_C&^wR+3x(=UnBXd#6gQReuj&*_um=KiCXd$aZ`DC#rFA|^T`HB#`{m=N#7AO* z-R%p7u;AM8PsK{ulOmE0nAeP#m(l&Ha3uf~j!kMzM@KMh3hIo{>XPg%In~*|1gNng zXpH%$S-U3S4;WN#1lKyrw@?GQjaX=)^zGerz)*zK-f~kD?YxAX9ISc^vKZ|AoM$(( zZqHNfi@FTXwW&JLV`P%>Vt0`x%^PR81qmZ@QcVAjBE9)(7~Vt94@g!HcW z6|9@IMy4^kR<%2ztMC^$oKudyTpTcZKefLIge8`tvT}Ijv7i)>W|4d$n(0h7_Z{+}F(Gx5V*d#iE0_nSjRXxIV*!07 z3Fb?j#DqqIv_DIh6p#BuoXf(`ZoQOGha;(D&(OxcOovJ9(xeNC@7^eZSj-rfOb=Fi)~k7SCT@v9|YX&s)u*?>rQQ_VF39Hl^V zEC#EiK&x3RZwA$Iqwq8V+Lh`m1C~iNv3yNo*&T0LAd^7Z$78Hp zJ#dyYdXy>S_CFx7ai&qV-&___2mtfnPd}X%37U6Z?c>DiJO0Z|8D~4vY#2Dpt1{3~ zR#U#BvuNC<(B%Kz+Ake{q2#q?7FQp-Caw|Gj(ORb9qH+P_p$d8I2(m>d1MK7do6YU zgBb?D<2CepA5H29?{cx$2_9{|Qn?nl&6d-9t%uwC@1bJyXx&ujj~Lj$u)`GYz_gJb z*1wP3kg!B$gDjk~SF0%&QszGnKy8lTCD=_=k`~=1f2z1!^<@TTq_9Qy4ano*SM5Ev ze7WqtYCgW24>6lNVFZun2KEbEE=i2K_)`lNBmJGGrO{LZ{wN!2$Q21p{j$)OZU1!C zSr|+D`N6w_m|b`}O$ByvZ5>YMm_(QDdsLOD{!rF5)3-qmxQ%R|R^QJ{o$0cdKHrfl zPBRR8%Rf`S4a?HHloXNRp$?-k%W|>}wk;Aq>Z$Y8w3_6XPbDmm0j^yjfP&tl> zlxkB|gp~DQf>kG-3%5Cm)IJxFF(&bvaTCyGr`gKrkQc?vn_aY%l&1^B9a3qDx3;Qz zNJXI0huL55GzSeImp5!O$k|wvHH2kRnI4$Tlm0q#j?cR*qm>etLoWRrw9L!j_W;Z%DoZcuV` z;(BSM<=}i$yBD=Q&u;dsKv_~F_Z4)&RfUO5@jO;=bMET#Pv+a9jT9|hbR`I^z8$zW zWJx@lB;L{N!lxXrtvoq%>%pL3SM0Uu0}4;&2gu=Td6ROlejU-gemq`wPL33s&^KP+ z%{^llDuxd4h+@lW!k463P-fDvvhPiJfXFTJn~JoMqvqXUbp;zcBzJzC0fr8a@irA_ zC`?=QS%lHl0bzu0LNO{UHpv)cNThm6XC@kWp>DTK9s}c|X~J63N;ZP`9$ow%p%~^h zzN$fTZP&rkHd>m8ClXLhHVqPy;jEy&bE`)6g>y{wYf+zxUQ6pX{2C*clZ`n5DU!<2 zw+vMU3cuc|Bon)9N8$?yPa%`}S8hGG==C^%(C5^odWTV%Q8RbHO{%bzUf>~tBT|}h zIjXd{Hk?sFAQs>-a%v;+JG!WTl(S~*=DdS^x7ug|iu*b-k?;5-L`VYijgPERnW+`D zkbLQad6x7t+%;QLNhhob)c%9fVp(OGY1o8+^vM7I<`eiLeSJ#;>A44fZ&RkW44SDl zL~L@3G8BHYo+q!nSw`B2KK&5y)ryg|@UW83+ZP3H!BgfhNg74&6uF2h3*Pu6%bgDX z(x20o9Py+h+4i_+!%Ag25aNfi!*u&^l>1P1m|Llyq&0=TVNyvz-G|x( z(f#H~;d!6qXsijt)iazFtRz=^CeC_JPP~NoPc@M?OWRN_S+!^;qzRvrPtUBPO}ia& zOZBQ0!cF6;eH$JLCr zQK(FA?jaP+`BU`jjef?9kiw~_%bP<3>>O0{oVcKFj7=Rt;Fr(7y-;DPA@;J$tkjif z7gHIM66~u}wDU%q&z6v{)c`oQC#JEKL?Zg}KX3*xqlufcrqPj4Eets908sG?PS)?$Vr zDPLL(UB`{F45?Us1}ocBhIprOQk?W`>)#f!Z0q^l*0EYh!>3#4_4)^hLX=hA}iZ2MB z4wQwC8pPnR>TftqR6onnbjK-wEN5bCb`k1wm&;0ff<6d%*seJ^UpYZX@C!X5moRup zXTb3=qH3&MS4v<`lXh(!@q#LnSg$FfnJ2`n8=@I-HO810215XocTL~$QTldPUo=sn zzpL5AQ;yG=KdiM?$aRO37we+v<@uc1#%3hD;AS?DEcBaTiaoH7y6xHK#2c_wQON1C zHt=jMEP%syO5XHy=jjfPQx3JM>{ULS6S`BZ5W^ewKd(m7!I0=9-mer_<85 zTXQxEt`5+Vv0##O3N~_>2)jQ*=Ej9&rDymY-{V=Zqe)@puP*Q7L$dcvw}Mdc(>y(V zL@taq`M>4f`|G+ivx%%J=fZRr43bY!WsK4Xlme5gKBD(`>6AZm(*-<_+ zW|Xj@c?W?&Z${uRuQROL^D+V2E5{RIw=y(5u4%@Lhhr$`Nmc6w=Fot8|dL- z#3WHuGw}V${AT^@=gUV|*7*duu`ZV~qvNE{>_gR3lWVAy`j(B^f@)~*>0;eZ`axzd zwn1&Lxtmws_YDW?uBxw*bbYjXumXp9+1&wg_XdBKD)kz%N3Nc&5hLB3SRStO&j;&0 z8Fg&fh#zHAUdUVk$*53|=~q17Pt%oV?94UT6)2idE=B?ui;|hU7?4@zD+Ndg@6Emr zBQ#wdyPCP)B+<5u`6#SRXDESsxtojdFGKRmXsi!bSKW!P$MzSEw!JAlUP}mJLt5W~u;7oZ4%X=2I|)e<9jkO?P;Q;v97~G$ ziYUD|KVAEJ6yBQj)$T{D%m(GHxC=%hmA>Ul2a$>=w$W)|RZa$Q$6|V-ia2j=_II@B znu{&ZWUx~%&SgXU5_$zzbKYELW2Ug_nBW@WDKmrzr|!z==DHaMHZOYG`k;D}k@a9#IR+x#*4N ztB7kP`hjje8nErfo!XZS9jTifPEkB6OoNQPb4w7C$BQceRQOX6?f&B7H0@sotrkXY z0{K^izNj_>IQqA4dWX&_d;0}%!Jr5rFa0|t6RsZb{sUZ<1HKb%iv9T!I5I)B=|4DC9J3}_ABpD6Ijj4WWF$-_lQ?{ zTa>QI_XQk4s75i+oieG=N)e|%9c_!5xHt{v2X>neJWbC7pW6waRD|>Pi+o-KjS)NX zBa-G8r{gvK77$Or9|R~y_iJI=9Uo$30C@{3!BUf5OFCW}TQix(u%-dV{)q-S8a8?P|g=CS3dA1k*iEk`79+$C#*-#bBjU#fJd~ylQGIU#>d( zmHQA213=XhL6Cd>bFVTtXgM}$%nN>;5b(kzq+wKSi;z6_p=UDc*-XrP?quQMAq>c^m;r>Y<)V}vasM{=uRBXSC zP~&c#4ZqYW?#n52j;|OA?))TIW&ZmiDtgjVHINfoYsHPzW};fUIyHk{B5mfZg!J^M zb-VL=`-uC{MQ$Q@gWBcE8W8=;CkqKzLn`53Z@%>fdb<5)5gR z$MP8CYd^Quy}k2LLn9S)JI%|Te7@vQgGD# z0#p?hB;aMDx~EK|!E(p&pjJhw?9BJXj*0jzAA{64GaD@IYe9oV zY{B0FkV|$w%4jKZ2o`hU_Rfs2_#LR4Y+3qCRW%r3ZWW@C&FF8$SQ(Du-$p>4;N^Z4 zG3-njWZg)y3rw(6cbHmj7oG3QK#>frXsDuB0Pi%t()n>pH1^F zkvdAUyR}prOQ`9S`84;HRtqp}*A%zEDmN{quwlE!K^QEXNu8@QE25B-&E%J7j>fZy z74XltNj(K42KbiBWTtT8(nOCfvi5F17K3IbIIHtg0h7e*vr_Ny&9EnVyuV;GSt-}w z{byyOh!>!3xg!iVTbV;Xuff1BGsceLZX3>H-c3nlSPMUD#{2)UE4DaeL-2k!0|NiK zP_-u*TYZT8qq8P3l1x$Q z^@-0=xt5_*Ia&miyPHfY;EABYPF1GrEjMu(AH@~4rq7F12pnteoKTcvQm$ncA!Tm=b< z{Hj{KiHYp9Ft%#w*T=qYd3j(_=sQ-9EofXew;&ya=N%3dqhl|SSPALuE`BaiSdNRr zzE}0QT6Y1h$?KVi^?Rky9sl{LNAT&9NPWhN_WI5Q%?pY-BR%XrNE%6mo(F~gTa6!8 zDMiFMFDO#|pjMn(<={0M2a;N)j^4t)5zeh3j|AuuLXT_NTuSFaUrovls93yTjU9Na zHUyLt{XqXHe`CbQ1DEHmUrdi^C2l0$)vRQ%^uc#%YpgC zzE6zKRCMEu$7Q6=2m)d)X@mEt6x4gKiUf|VK%wRJp(SjN=Fh{jb!rAzOk=J@OiIQ| zN7C%U4vV?_Io$rL zUqHo-)*n+eA0wMi1|MrfQYo5Bti|)6x>989*+5g-zTF9Gi6keUAFHI(x5phCyW%db zwRYUvl32}7*ZeTBFL^6!X~X-e#Niu#X2V`Sw!<}L#A4AWa9gHGXdDth2exFU!=&ja z%0O9>MQLqZNe^x&Z}(JYPodK^n?j;4O~K3?Nwq5+_X!Wg4g9wUs4qSw1T>QZLLAs| z#!L-`wn{8n^EfrvTl!V_XR(oobV2Y6PYiEiShQ)5>lL+7tF&=>Ef`0K4ZVkq^J?GL1a;Phy%nw7-B)w{y1e@qzYe zq#hnvS1Lgjv+#Hzh!TWT0}=*Gcc;xQC5$hNOs$!zXL4N)MyrCYHU7_8|+vQeK9d>-X_ zCFdav9Lbw|Kb!Tumq;YlM4`5|mrnDF;iYR<;|Fcka)#TM@e^V`5{J-l7+CdfiKhMP z-bUD`+#?Jl3@{A*Rqmuq)QNxozFDq0$~FmwRSj9{I*GWdBRK+LSx;CE&qzbHwNn$N z(OLDQ^7UX1-*f)T`^aLib0a0KG}97q8rT#rPERR=dmBuLsBqLGYi%RrEONL)|A9M1 z!NP^O_X|nq`OgvCgugLxJ$PZMVL+`)F@YTYQ@|R+M@$p_8m8`NDhc#i#ZP+kf!~{N zN_4+;4Fc%Ny|(;U+BvWc@}fe0N*Mn8i`3PGS-?f8lP0u5b2s~Ut178^&CF+jV z`>uoR@v<8;3+ReHbOKVt{+=o0voLukMrM#O6X(SF3w0iU2ye<~}3 zc;zX)EYuHpp+^T0j{rbI1&Ndd0t6T&kU#7n0Z~jMfOrMl1Z;5+yoBgb4i5M!9Fj$k zbh3Bm*|gxV2bhgO2OuFN6!YrNDX@bY6(ZR05P-I}he;0&*tIn=fHsj=Ps;6Tr5H`jN)r2jmt|KsXEuxI(Hm;(+9>G1Tr^X}L2t3Y{MJ~_!x*>i(OtgTgOF9RQ_`=%U>SNJF<^M3r@%VGugOjr)MpH*ARhpM0D%G?1(bgS zP!2z=xVK6a)@wJnD>+wp_a_#h8G8`cz@Hct3!o`{=L<2Pw|_?=fP4WOE8xfcU^fB) z1ZZu5AQwQp92iFK&iyruVd)3n=Macw3fus&n~@L#;OqJGa{6M_+zp~V`gZqe7o9f0 zrohyMVD>TXtZxAd3IZP>QyvCn4;cjzNI(D*GT>jy55nE8T&KZW9{0O=4b~POVEmi$ z5IgyEo~-xpImiq@cqsJUt=>iiHn=cgwmkFOUdfdKs2yKYLrtq5p< zHR5=XK08$%2m*sU>L=_#yKFLmZ}9GMt}kFHU=W;NKv4jodVc}PfPl;0yU}ouf2Z?J}PV zno_)#>g@%!Zzk=eOu@mo%c$N{?M=NQ*My-i98c<6N5ZQ4)C9|o3>qwWtr-X;Mb%?XLEiD?VlPaT(EF;GQ>aM#M?H^Qlf)uhRf;3GtIo+%-(6E_ z)Q__Wlk?RUY`iV0Jz;k$cNtv^G$JK^Qw}IZCim>iLh!MTG$P$x=xaU82`__HX-as? zfL0hnzh(+>*t_r!p$Y&iotX##%SG8THMvm|=^8Pa^jWS=g4o=4sKu0nORf6T?SmLb zMR-<5tyMO*(3OA7p5~sVvydtJ84I_w9UF%04yDck{72BEX>*;ez8w*FKLqMDmy*&hGl;p0iBuGc`b zbSGkAi?dOd+{Lr%hFg$B2!+`q3q#37GW?t&Qo2*ab?HJhyS zC+}z2QD1l+4XI+jQFVwQa7r&0C^|kb*K2(sGaUqCp2xd+%4Hz@*@(0kNyqSBjg0d9 zD@WFd0ZjY#HrJcPjHWk%v-!;XMXej2@A;r;wmS)p%6I)J4)^1x7e_gh+w)(Hy;HAn zZMZHuZQHhO+qP}nw%=*nwr$(CZO{Ia&hD(F*TFs8_LMFC zvp$9^I8KYLK(tpy2&A+wDv5rE*+@Da$A2odUbznjRgNt=zoGnZh2vqKBt_$pg100r zLZ{K`Q+y(4uFy{I0d7onM$HT#+S7mVzB1kLu z<2O?JxlKc@TW~`r5-*bZG6XbOpbdTewT?F^f0NoezPwMoE#J#9Q3ooo` z5?@j3N$qf$lTzwj?&4+#zCNs~l)gIJKm`LM<*evR5Q6wl*!I^sg}WVE-C^HauxbhK z@(pU|#rgw+J*r>?C9_b{Y0%lU)EiSNzPgp9C4>CQXRIxuRg#R?Mwx>hxj{HZi4k_z zC#uL-x;7T}8KR8q_v|?ZWx2ftbpHfE9@z}%9IIY7t{Rd=w8#X&21A9S2f-dLSiAiJ z{mEMXsz8um9moFj9i1XdGA|Qwf&u63Y=JOj^=_dyK2Hs&!w9XX0Oct5x@=T{+zNJf zDB4z!y-FOYBl>X#+0B2>B-i<%z_Os>HENhHZ1OQuv|T2JNh8=rJ z0aS0VRV?yqn_GAiMUK#LaBndWbd2{&=2S9h;bIEkh>9H2BSQ(~z}uJ#+vPN)_b}Ke?*eFy{)eB{4ws^NHCP6opz~_ z7o1b|{uBOSewXpElQ?>JnTT=Rf&NTE#a0u@e#Ypr6cD?~Wmz#JG;-6ype4V>?mR-W(mxCmBhw zcxrLbBDa)KrIx|s!2KBtT!mdXzdJaCNIbcT{MASHa!O5;tkGAOP{>!bKIufETx+ii zn~!!A$fsCJ^8&p66M=Ep`>8~Xn5Oat5;%2n{VWQqX;8A49J6yPW3X=IbkG$MSwmEc zn-wNmBZvE53_3r-+`ZhGO}B$?@!}!XLxw>3B3?k2ns5hS;bOMgM?IvbFRyl^=XE%d zaB1W#?hNfBCKTF62j{J8GJ9#U`M1tw2lG&dR5w<v$&HfF!Mr_?>U{ z1}-t`NQ=Y5*TM^%nGiR3O~eG!&&h8}cbkPkK+zmz&Q@lY^(ToQOK$j7t66Sf0c5^+ zOX7y4F5*eLzdexrse z)<=|#^(1;ND1+^_$QGX4YvSF?H+$7ecf^RzRcIME+f`zRA{p;@AapkXKM&?a2>41kdX)Aij&_uHj`?u`0+^8~e%FM9Ler=Q!F?V~%awW%qJKUAk&nihX{Kpbp8?NtWSrPz~Rs<*y^n1j(ycFHx z52CQi+pNI9kg9!yT|#|#M)Vq=@5N>+@{$V(6Rdnf67KOCyfIzU`9kMjo7-LrgkxR% zS8Bt;yut0QGz1To7x5CYA57bnUgF#*r)f<}ygj(VU%=FRc^y098Ur~=O;!378ObVg z1+3vNX&(E7iQA>bD~_cqxNYM@JKDnT0^1GkPC=r9ADN~&5ASHp3bCY52AI*9zQrhV zr&EW-{b)40)VOb~!gAJkXSMPex%w^-WpI#$O7MI~Ffyh|usr4RTH15t;-6Hqhk`p+ zoCOPaj%z{hk1O2LSr2xOdCPjAh~#?fTX&o3A&w;qSj>J1C6DTs1+7+*;aode?n2ko$7}N_IIFW2#Di1^*HDjR2IaDb>36n^XZx%x7^8f^j2BxhI@KMX z0ttjZtSU|o!EKgTBthqFKIn`!GG2}ZEsx_G&XnrL;tzTWu^<5#* z9LZ>)~lZhT8vNR6Fi3InD1(`M>0Sd zu8d{h7IWio_~~c&XxOx1BJJeVQtayD*7Llv&1Ua|nXUTo#1vUfvU8YQ(2l zaSlK0lIW5{G3?1lLNGkcK{X-d$){vNUe-5FmJg!u(n8pl5o|0g^X$iXn+Pk7S#+oi zA#&P&8*tPv<{WB^Vh1P^wYK~$;uXzrWMn2A#IoXas;3>Z(t@@x)VZBoefq75F&uGp z2~P-&Iz9*c+|PY(Di!Z7taOuAD~DM|zH=&S3ft;T)tgg|m$)3gG0bVi94~~17gD8; zo$(zWx~i2_g4Q2H&3X=o33}Ijo6i#iTkJ*!>-MsX0!Z?Gj1l?P*)_9KvnuuG5>kcC>u7qd3vo@P$ozg^5!)s#Mf`hZZ952YdHn)=X87>#hgv8vAEiMfFfZT zP20}m0f1$M=vcr{y}whJh<0+;F`Y68qsAvaf=oa|MOQEL?|e;TY$fC{%eLvsYrwXP z=xV+xeZe4Ejq@!hiif&oo>Su^OUkOlK+3a+^Edzd5omXF60>M!cJPCxhRZiP^0|y? zEvq;vx_Q~7Dn0TF-K_)jh2+lGQy;K2@(%)RRK?Xs@-^3uQ~#rO%_vkNDuoY-%}F)ND<_wDs~TMRb3B zm7g7=XenhZxCtk(#sYUVH9=;CJm1A<{fBQG}FFnM9P?AIg5m#!X@0RTYs=`nn%`GVvsp57ZGcFTqPP=5T0r0CWdY;jf(DmipekP-=* zF#*pc?DZ3cQo<*&kL^Q`-*N6)ihO8DJSkkH%QN)GOl-Z~u@w2s5!tM#ylOPn7PA5b zD37Pfcf(C43f?3enVa@eqYoae^_1fjXB9z^P@P}b1wgj-57Vh7&T9PUm5LMHG!#h zJFJ0c(~*U<%)oobc4@%TgxK|ps`OEDNOS+w$PVr<^oaQD4KP-q?t!c?9+Cc)pA?P1 zG@7)?YZWPLYn%|+;Rgx^GS9~t? zf%+E2|B^cS#x8llXQ53vg=;V(vnUVa=Qae}@`~G=gs$9KLT+5S6KkGX$|)w%CuvR5 zwTGH{ZDlK85l>8BAeOXxLjy-1)8~XycxO#P&REjy0n~4JuLgnXdw~hNjXfFwbH3;2 zr3ul8!Pc#mIgHIKQSW-CALrU7gewOe1?n+hr-oe5Qo@4(s?N;e+unimxVf5V1)OC-98l3bAZ1uI4(L4&R0 z!{m?C4MQKJ+O-~GqC}tTzdRkU08gMCeuP^*tXcMA2C6}79IC0>SFvHye_adJ^ufy= zAdRk=yTj9EDW0;^v~6Cq25~AUWeG0MZ|ZDwoSwsjq|Y8t+O?pKcd}8}3Syhv84e?f z#q73oR3?gAae5anY_0>UTw*NR=6(6^M{R|5r*r(|+|cdP64Ce(rfQd-+y*MDhcTia zB5d}pP6*SBrcG4Ov=O?q?Frh~k4VUgWG7k0w@R1dJOvF3M(YKoo)=|;0+a7aG~Wf> z$P3I1hW4K>jnAFoH1w$2JlNMvWXpMX5+wbH8b8gK<-GaNpU&1c0yA-B)S#>xO`?W)G@x$RHG?EEg01- z@wQ^sl_O$PI(_jJ+KlKM6dd~jg%=OGT;mxT>53;sIMRMj?;P8E?r@UGoP6rB8J$^c z-<7oMQu6#Q8~8)5-wp|9x|QA`B)a__Vp%TFb}(0R)5R+*6X6e}7Q;Xp4-F)+e;F3o zIcvv6S!9w9_Sgbo@dd+46@n)Ogeu9C`Bq+>x8*$*w|whVw4u}+Lmm*JdBHvzcbx0i zdy}WL#RkF#M;>Xg&0(Em{t=z*nY(y2xI^K+9i-zy+e{Bwg2Vau`j+Kql?pm|;bL6Asp%N( zW8UO61&nOEu}!p47K(bcaU$z}=DcnJXD~jRWv*T3!$1bdO%uV)Pld%~tlS`@s_}$+ zpK`U)jah6rlsR=IHaL1yz$dSpMoc8Z?2n&b{j2G69Yt8!>uG%C+S7eRrP-s zJ!dKheO0X|yTtfmip?N05rVTR=_i)b_dd+JJa^;dIiQvj#z`1UCHKh@z?GC!Ytt#g zDO>k`AMNgo*TuM&1hy%g?*WnTW@XlJ(IkwE`i_S=xtpG18E2M$& zEILCjRou`H(i6RrrL0H_g?7Ri-_GUs#?9%muO9+goOs>tfpwV0NpaqYLwPOxzUb9? zL=^4rD;m-vAg)%&BJ&V)zHY8AE!I5!6*ZkW8uN^f!2c-dUWU!QY|)vJg|fe_INH!j70#@~w=?$JYc#fT zVt#OT;SGsbr}a&yFe>Rixx+C0C$XXw`b~G2i>W*mjq46i4iNlGO-+}2A&^`>ezC^p zvSd6qbb9Gkt0*-rbieg*W{o0SB+^rtRu^Lb2IJx0u%% z-x!Ri%oe2>HyT>&UbAqTLrpXMxc@)fYDsIJs*a=BB=R4DU{8BL9^SD6` zC3rIP;pbOJG$&eVZooMNrRJ&y_!IRw{8LWiSpn&_N$AXt7ink@D?tNn``yAmILLW+ zwQvaaL_lHq_XDh>+3LPCGG!B&WIkrk#f>5pTN%FSQ3sC^r`=sz=G6`gx35cZyiQ|t zYt05Aeg%BRHZm7He%Zv4_=adRI6ffV1$dT^MjQ=)>8fZ`O(gr+)H5ynfGvc`Y;uWM z36Kp}bd~@KaqbfEpSggVN3Rv~*l3F*Ybm?oKj^_aF+5P*vRtyd8cgZw z3cc<*Xq{bGQZ%6U0P8xJc{aifyf@qCof`Hiv~i}* z&!p%`%j?KwQ8dev_Ba1Y@Zyjw3m8;=DuJN7X#6VWcGzxBq%V`F>aOFUr?ZJ+TH7=> zfl)8)8piK;cR~Kj=I)r>V}2=vWE_IBv=bQ7{nao$7456+Y=~9L1Wi=TAvjHR3!PXT z$j4Ygs;qb~@SXOicHI^c>}c}nhej**n>+@`WFS{On-+ag>djarG`g!${%hAi^A7^M zxPr!MZQA@3fRIlb!V$I)#SeQ=vMn7=e4ur{!2nyIXZX{RZkC|l*Ew{9e^B8CoIjAl zN~AXRc-FjRzH>-@CdC}ITCVb2_h4?+8=AO#MP-kb38YLEg7Kr`au;!VQp9n)j)xRL zFK__F=SBXdXD_x3GgD6=n{ov{Or^K_H1VxM=$Tf&DCq^7x{mA`BnwqI9D0?Q3ygU$ zM15rXmha`p+!9dO;Xi*557bh3aT*LySPPmKif8$epIg#~V`Cw(ZWnVw!y3~uOR;ff zD*8fOO?&yZ@K#V%<^x6^lM8pPd`MfW-JDuG5iZlAdaN@yQRKBgm@gWVb^cg`o*2=? z-WUA1<27*T5WS};KO*DFj=3lA-SMBLkh`;=6(enYOR=mNDL61+y_h2@ zk3W~6aY?tbevD)))Pk|&D~RW@1If&n&l&C5TO)j&d03Go7%IcJUxbQ5_n!I#m1ivN zs&n^7x$=j^UepmsVx5`@0bNsb%2;1-9+@^Byk@4}{4=C5+nrHR^-n_N`=Y-##7lLg z9qS|W)h-r0Q(v)Rhg4Z-jDxU{*U7^B6Q99`ZSP6^Sx7nJ*a|}xyIq3}sJo>gU!hlP zD9kJ=%8?JhW`8=h^>u{^e>6*7U>g29jN2z)A0nH7*@2`_r4eiEVGoX)veWyB?5bs9 z?9XwGOmiX;&`2fz9BJKPy!_68OTMwmKme`<=HYVLqOM2BT1py<>esSxr{E7I8u!TLX<5Tbdt}L$ z<=!m3*t|Rpc1}Bfqx!%+O_{WF%f)UCP%H)^RF)_u{p_eC9KTA1*038YTXRJEVcc>C zK7t|lHlJCfqCck5Y!%@c?lRpC{-A&9_-Ial<+IFTM8FNFo#@JGGLxh_j^}$}*516r z`{AbKG?jbVqEmm{>lRC-vYyJ?+@*eHjpuUDpJB&ht{s116_oyUl;Qpo%T(7j@j?Lu*WKqhS_kv7Yem`>RXp{WBJL$bUxZc`nfj5-{tN7cv+>Gw=ozh5hm>wh7Tq?_&2&}d@I?W z0@}Fto@c@EUM_Eb6#6~#^HoD_-wCeHN$V6k-pB)obRFd7Pzgi+$)()Un>|DrNnRnvX`fS%bv0n3Yv0k$E)V7&w>Aw!9P z(lj{`pN&+9^?U)ipyEImg#IN7Yov=8ewz*+3JM8Kt7)Y&1zs1F{Q(3>IS}hXED2Z; zhk-9)fYjCW??ud}c$odU5`{nYTZ$0R1T?518esTHa3o6_h=3+M5}+C*fZR{P0WJ6v zzk+=4!2rO1vtR;L#Qr5;m_4}>BD)ZyhYl$E{4|^)BCkLYB=`vRY@FpX@TEflG?;yI z!=LjM)gCqksmH-DCWvfuaiB6VaDW+Kt)77{ z0HFc|EUJhA=kNgo97I06J-!k6?FS;YS(>;Zp`VK106Fq-|HgUxnwq8w4#3TH`BG3|IEXbig@Gbo=IZ=wX*>@oP4W`< zo@2j4w=}fzTm`6q&)?JL<`a-$LZ}J=NKsW$0ZPJvmRp(w>id$`4J7&D1K)8i<;WBO zYVgfXVK4Tcz<#^^KJuyx0KRjkq6QafAjbbv+o6F%`x|-_{>%&PL%#o>dvZ_wlivN| zO_27FnhsL;?*I7hs_7@lkI4f`HvqV#e^XIbkrMu-T|xY-t4SlsLEnGZtmVcUSNj95 zPoAt}NHQTQF^0Di&N&Xl82r+4SJkJ(MZjz+SQbCCfG7wNBmUksyhESNdazki@z`|; ztZjd5Eo4R&@2|c}f|S7PRjAlPzy}ilK|z6r5NSq7fCsaq!1Sj~pm0%x7`UQ?AyBB~ zzCf$40qmcNt>qAT|;^BM)R{}ZI@e@D=B>e_x0c^jqi!>r7{RLF3 zB{QGHbLq<8cVe=r$sDQoc^7Mxua0YQZ?3n+ZQ*I6hq%uwq zhmZFvPkhju-{5YQ6^#DOf#Np&eJY|?CYNzFy-TJ+M>gj?sVq(LWN#Z`;uK|JRrO>S zU&Sb1O~y#Yc5&lnNGtVSw$JKlo-#3F?Kr4_y0kU+Cya?@$)@4soHz^Dl*w7{;`)`) zg*ke_IZyU{8`m(Q)%$%u{25n%%xzZ73Yn=wVu*7tE27%tVq$!2lia)$G>FMfhKfmX zBN@?|GIR3E;wI^tB=1MXt=W$`TMl{jYdQJGqWkMeizE7Maeqh|scBfnM8^tqmX*ga z;*BIcqKJqh61UN>nw+(U2mZD*rZ$j@K85w3byS=6HQdsnbJ;=Sb*eRiSV%%RPjt9> znde>#ai%L_+U{W#*F`xRb~R%;UrVQ57uM%9|N2(_`)80F}}WJ*vhJA~Hu|Jh#NTUg)4u1oa;u z*}xa3lykUAw?P^+*-V;m;2r}Z`&fwg_-piTF12vSCHkid#^(& zcs-=f#A7j(i%TfKH&fy^M+lGK?J4C!4Pu86x0}l4c}xibm}#HIZ4__Q)%BuNly!n& z;2ULF#Dl>$XGhHJOl&7wneOYIiHWj6IcI3J^m`1cq3>IOCoI`<*U+AO zt^%%UnwqEo5>ZNo@!g-ex8x@CaSCO%nu2`oksxsJMKKi?PP&A@oJCunqp~1t`v zXOC1L)`~X$A}Qj=h32AcGwR{i>Q?bl{o}G*iS3g#AodqCr16XVecfKvb_$*$oDua> z-z;lAt4=Ew%VWB$67C#~qOe5?#U)zUfE}Q{PWYXKhO2*P_)mhOE1&aCo&|KS%AscZ z0CPh*>0X(Yh*3ocrtB?B`XVzT^{R6f6|$=9%FW{19h-VvpY;v&8G>K&k5WY7_xasq zkN>Pe|ALq>knGOR`KmY*vSygb^6m}ZC~ry>mM|-CD(b^jTcv#9BY5NUjjl>5OJq)OMEXQmI60B&F9S0j2B*l)V;wpR08OsFZ zm5U0GZbjJ1hA&x8rybEt!`o)8!f8idY)hrYFfn_Fz|0*@tLEr-o~xxWV*9z<8;8Eh z1R~Ur-#j=@kXBsiw3XPJA3kiwc-zUH1!c%OV(dFv) zUc#&&fjUiS8OXIm8x^|?vw%q?Rmba;ZL$vUBOX_}XGKr6+NBqQ7FGZC;BUD*^T1iB zb0!J!tLOz7yMn@Ng{rQV>6b!Bwo-OQ1n+g=cAT`|bYO_MD6>5f+eDP?XlyCZ-j1ZB zY~l#aZf@3#eUaF@fPo}U-XHl$j}F1SU6Si!D_O=p2eC%2Qph*rrP-qMr*NK^jPG2X zs8EH8Iaa_YYv!=gwj*}2b;;WZ&ZsJ8Ke&EEm&Bv;7lr}vIHev9Gfo!kO1tE*5xgm$ z@KVT_%2@l3E?VVuMHbiZ`_B$tUPF3#=oTp(7mXJ%%@9qw;7va;$bvz~oKOs& zU}p|Sl_bR9WJ7m!=+;^Y51^5#-A4?|orvE@{?!076+Vb2#OwWqV3XZDUe3OX+J{xf z^|}d03j=1ISETOFk1g@mfpi(47 z`dcSGa}=p=gf9J3c`2JJ48|yI{_M(3m~$svkFG4nh8)u4%FbjVQ#}4FFVFSe_Whyp zRnZsJXswhmol^DD6X>r@H*{~) z{@lx8O^@o;S`y&;UH=p}1hag?)TW~ogTn5#>68JRu+3(*bbS8pT?l%%rO?SHKF$NQgxw>NIh$-_GynnVzObst)~Vl_ba>EBKHeplHT)SD_b!B>jrQ4(=diy+Svb{P(${Iv!4a^_ zzEmo{n+j*YAE1;_mmCNG>^wjE?hDs`M(%MO7SG3Dn9{VO>eet=Y-&+TRQ&LWd{;SU z`U!t`ZDh`QNAP%br!ALHcp`pXc{!xQr|HM$?0tf+lmQC)+0`GCL5MrkqbWD5M_)MM zs5Ys^ZYxzC!1(@}=+w(&4k$+=y9Tg`QD&hIgaztWz}P$|BT(05eE zY}6ya?iw|iTCBlea;FQvm?wSZ*i(FVS(ln`y2=BL(V@pHu@shHNp>zxQNXJv_Y!xy zHCRZhaO)K0!kt{%lKyARq}@I7d`#zn-o5W1O7?9+mZW==1AW)XpA3oD`teGI*2wS2 z#VBrZykDWWpS6 zTvg9Z_OefzdOUI%tVqrRvzx{{5u2EB9}H{#wK;^BN-^Xa4@I{n1UgiVDb`i{rsEX~ zL9!M{NYEZ%jw(fGwVsD;mHEj?+!AIm=x4~=Z_IegeZ*mN4~{14bt^f!?0Tc3A=XMu zf;Z)6)Q3IR^WhbmYjH?5-^?wa-RbO>z&4H7@k5k#B-t2t3YI&Qx(w$`x}x=Nxua7* ziRIOkDyc`cxqujjec&pAtjuM|&dKukUQvIq?C|IjsZoM;9 zMns;<4SGn!$N6qEsN9%Ai1m8-i+ax)JqP*c?;cU$+~83+D5?*HgcgYj^uZDOz~l3&#hB@ zEnkh?f(I5m|2?*AjqBoar@~|;YFPRp)p#Km6z}{um+C83{EezmHAcA9PNH-t zqJH-;NQA)qm2&6BhiTSJa7+V-D_P1(I~4ye9>GfE!dtw)c6PQ3QInLcz8`DNZr-qZ zby7SWx|lPo>QCJoR}$2jr9Np_?kS&ILl#q%miTIVUX1WpUSO->(r?%O_NFHfCM=wr zraZtr?2pNVu`>2$icMrq?Et&_C>&GmMkI6yXKPHPD$BdO`f&1|;ITSc26 zzN{qUJwP}TE%IP)H_1AWKD)C4ZOXgKm9T2Ofs9=6e&nlNvftqYEdma~l_hJ``|0;` z^dOO9wMMI^2k}NMUSgIFS7x{@t}Uo44?xe5qCS(n5;k~rNvE>?H5zs>fNYAr@IW@- z@NQdIaW*E`38{x&Z7Eys&nVN}ia0GPL`wTguxB4H2kG@5@FqLEGT0NDaf?Mvdxopc zqu1oP3@w05z60ed7XPtoV|g8ug^K)*FRgb7`TyUNSQ-AeEs2AL?f=}!FcB~^u(GrK zpU?j}CNVOyGyT77(*H%ny%kg?>jI4~Mmh?`A{rIq_I4F5oM>bR2n2#|prjp@^7eLQ z2RDivrR`A8@oX`Jli7Lpug>*uQfuPPX79`QH7h<*MK4lue0&pt#?BVh)Wp>2061!# ziuwsiQ)4|tLt`BvIe8MH9Q2)@F+d5`#vHz(_3$e#Faj3?#5XlED1XkaaaFB99u7@F z&5eK>9iN&V9~wF#HZ=5&KWx>_M?f)wco>3W3gp|u7PJ*yAxdMbeO*vSreMzU_X(ny z@jv+E@zII-`v4B55oAjcMo>*a6JZ&}<|BIn!30pHku4;kfbI`9NUR?Ps^!4g%+1Nk z2uO32S#v9+yT}xPOEAAwK(wBBeHPIMuf0nP;Sw~3hyfK*`v#pth0XJQlM5~L9r zI1dyJLAXBUrzt!*1#unjJsYQ-gcSJO1i1BcN#j%=7;Im^39yl=;TQLo{%$XjK+T^c z7zVb6)>c4`4uKjupK%xn=9`3W2*fpv2|!RytPfTY?R9nTmp~k07|7(_=3e}SAiq5U z2;q5qU;kzUdsEOR|5fG{A$pIN=@0IS$CQzp7|~in}-t(Gn+CR6t zBc&xNWlO&w!^qU+y9<&S9NP?)I-&+xL+Y76$sBPXKLZj2>e$54@W9XL*X} z-}2S_+QZU!3s!UgUmU6V&$K2(!YO`~b(2FQ2A_Y!FF*1ReA*ws-(TFLf6@CN8p*AJ z;X`=lDg4i$IBa8xM*Fwvy^JRKIrEQcO#>!(QMzaKhv?jxgJ5&!Cu4>=i?Kp(T9BPp0W|!C%OqJQ}AEK zF?*w{N9h7Tn2mthk^jJ%mCP?_9&-9GG#@(X2l_D(Q`QeOAN%Xw_*{wBFR*4Fbkirg z58cRTo>;DJ-XG9!iJzR!8~uCs`mg>y=L0{pC!eobdD2VY^4yX8JGxKp)PsJK@9g!X z{Hb{f_4=*+-5*hWL2%B_)5*t}8$a_E|9gBE7K|GhHqfb`2KM7uhUzD)ei}3)7o%Mq zgq)IHCFwj<=gdY6$F>o{*kWqQd-b|5)X1xQuZ|9SQO7%j{NsM>o z^~yh2BAa6GiEQb~Q3^)kJI_pW2Dl+z(B!Vt#(Q6upoZ`+35}xW(`s(Rw5mRAJmG{o zhGSkO!-$3Tx_d*xKfj`OeA&GoJzLnuuhq-W+!W^^C!|Wk?8GrqvU4fQ# zxvz~*CPZup^+l+}&l32oEOM7=mWZVT`BIc7w$kw+V#SJAROT4OBI=H{;4}acy>2`KHX|xK zrHR~Q+@9X-Ia2xgjYC4wc=bmEu#q$NlWxjQ(yK0#jQxE?WmEzGG>Wl2AqDQp?ACVA zjlvOb2@Kgx=~Uy|H&dnnATdXuMF4j$!|mcT7|@zM!tD+NCDqku1F5heT|7F&gZq`? zY-waLbEyaFFgEK(M!U=W8!@h8;RYOjzz`_e^|FZ_pP^Fyy)amh!E1`=ku7$G)Taz; zCHot?Iryxfv|4W0?!u1{`q_QjH;+^&A zs_SwEi#oMJ;rS#?#|;I1h5~CsQuI@FcCQnsspwmZ+2!+X$&%LdQ0`7%LkyZ4)`l%D zCu=u7pnKi#P`!@A>_H1FwLFH6X!&`R3hpk+bNbgBUUKPH>X26l?1Oof3PO637z4gJh%F<>m=)bT1MomnU7mDgO2z@j z&WCto8PZHSK;$rSi0fSqeh&zE7Ail6hF+E=v_|+N`*Ge2JE*=ze8uG)CqhKUeE~;H zC@B5gp>>g}n-ZrX_XrL}21M|fgEKBIl}U5FHS|<-Sl4D?u>P%`AS608IRJCqv23ww zgkqb@EjAi!y`xUg2%#ofSM#~YcId{E!DL*Jlh}Y|Zf*#EPiptV!DO0oh+;2V=XiT{p^Uaxieh+EF-RI`o&Ry?+lFFU9yW zXS_=Rul97rP0?56(z}5chq}f`y%=4IiTuYO+;o;)EOq@BcK<5eDk5IW_PA1X_!)AC zdP6_vpD`_Q+o9h|-Qa+>+kqt)$h#G`y*ZcF2=U*N*Cy+BX@HJ_+OCmF+m`S%K!eS} znyofF{15b)E;B_3%zl=+{8;1R2^b*Z=+Ay0nbLbeY+I-PxN9v8!3CFP6&NZBNwq|O zYz~8@H^dPKgw%(7(uH-ZA!#Y*85tSP^6&p!Le=2C15FQ=De3LP=OiohGiCJ~defU$+;tSK1 zwnT=9a)GdPcj0-(&ZD074f1v+3f7c-Qj+J#1LQ7|^S=rVZmsC|CyUb+`7qGSV*0t? zZt*AxNr~seH*slbThY3WJde?3n)d1U&L1ZeaMQfZVNo_}2!Zpp{Pb(1EV%y2P^+fc z??02gvw)Ls=Nvh!ZNr&^P{@IQf*p6oX5CXb*QO}M@cBQBQrz?EadPu2{Aai?$QwIk z#OJXBb7^Z15r|*8uM^IdW>0f2krnj;G?Mwv3kfAU3KHL)Ga$_l_Xc4(L#GR0+m2gj zz>8R5Umd{r_1{Q&nu%iRaQ2_Kr=L1@PJ5_^yCv*leC!D|cd{kCvHE6^A1anP$fuNc zq6mwlI1C*~@pSnhYe9iLvv1ZE%LXHOQF@)-h$Z$(E@|2Ps8_L?bvCJ_Aar-!eg>>r z&l4%H<+qn$W%R-qi|iaizzBKZx<^gM>oW?*Klf!`_T_xGb^8e~CIWp?KL2$Itedk+ z5>R_qH=U>+8x%Nj2OhB?U8gI-^V#d5~m@F$7N!j`pTp_t+q+)n?i1Q8`bks|0-r zg@u^;Mah&}L)}EKi!&Tk$xh5(-u|B#=L-%--+hQI6*YkbtBlM4RZq65?6hH%{L5mR`4mkMTYy4lsdTMiOE zsTKnHRyeWHREE8>4cJCdO#_goo}vvVI)nyD^?HpTQl}98j-sin{ zO#HsIL=3NK;D_xR{kO`y@v-gRo6R9YaUjn{k&O{#ScDx598K(ycdx6+GQ@jDn<9IH zyPc@--<=P;8;N)-7rn0p0pwkmaekU~WT&q)u|Y(=|HXHXCHc^!nrHD_fl+`C4_FC* zWih7w1%m_>}0jPF!w}hjD%SoA*wP?Q%oB}Ztw-n&L=6xYF}r&8Wlb2t#jWfqIAk@jm$qLq652HIHs6ce71}z7X``3M zTSpT>Qpklm@c2RDLu=huenp=y zJLSTVF{;3TEfa;khsG z%|1iEA?d+-xn8Oal{K-&qosIcvN(oUqx3zC z+X+U;GrtSSsf7Bck-_-D57BXnTnie1mf}hw50b4x&hI5V%7~Wvh(4VY_nYZy%)#OK zLo0(>L)9dXlGF`ohn*y@Mv9GDk}x?i{_Eh-P*g70E0|+wWU=meyX%;!U{vl(9#VFZ zKQ`M>L4Ets4e(Ou9-tx z4-fwqRFJQJN(4vsF8>g1^8?)6TEyC*4yv6w1-Nv@?A%{MZiNCD;-k9!%|8y z{2T-*p{wF9A*A553}^h;9W$6(#GgT6g`a*Wv$OXZQACKA zqv_y>d~!WCFcIH^qVSOQC(UAskn~FD$ConSCd@q~>t*-%CmFry^DJZNJ|OR=j49#3 z;2&YoF&Z}dhoy0)P72(G;d{xS*70C)rOG*r^Dg+@8FEhY3&hAd$OPEO+JS3lBOF@p z`BzNc6ICdPbkHrA!45&5iE(v?DN871eUGx`n)3a_8F6-Dlojm*CsbQ2lqwfIbR=|@ z9E#FRg(CxeXf*ulil)qG!LA3GErd<-%3WLnmi(S$BO=(zWuYi`TBUk=46r{BzXS)k z6XC$n#~infqn1*3oLt#1l0Uvg1vOP2x%^u2%lmE#ffn!?qLY zy@Ncn-Pe*co?yAKjVcleN7a6y^=9>Zse5bqdSufK$qMWMoQfDqmTUfii1lJykH36r zpv8G@bgH1hxO-|iK^2dQ(KGYJ3Z80>$+-HSj(^Cakgil3_C8eMoo8IcxPw?E1o8FXkeSu zLZoz$k{c>QvT7sllTX$;Gu0X|`4)VPOJRO4?qCOlb{zxYB8T3L#`n$aKZYKo9O zM|doP$Ny?@k!@|OMPE$KZ1S4)Na-HF2ttus9NpObk4dnigI;`H3KMD^-S6a?!D0>_ zw~n}E9POo1l}|+V#~@@>tD|>)wNOQ?DB0syw+} zk6P`|QgZ0VK`oTPq5dCTfVh}-X>ga?)A!MFx>0eJ2eT7o3|So#oRp7re$$ne8Tpdl z&)vbMTYK@@=s0z_mS@btuGou@_yxBFU;4_km`Pn8>NX-P$Wf}H8||Z6tR1y8{f6j+ zhB{1h2Aa29UKl5u*Ax%`B+TzXo=5}oP|}_HxVA6lv(}2V-3gBM zAPwyyhz~%)4xlhs7BE=v`7U>FaP=B79HZ~SaMGrh6&l>XKzL^RT}~?!YxcPY40*x# zs7{d2YsAp5A0~}~eT!s}mrvd~dZZ_V#F}8BoX}wNFGS{qkHS^n9NSFPqq;-sbeh^|U%|n;yf60@8u}D^LAJhz?gh&G?=xv(yc|Zx z)L7+1Ety@tq&_>#yL2>q9LIw>XlQX$!T^UNIyBAUlHuY)&p9c(HoX()YBc=&bipRq z3Y|cr;0#B2j}z_z2%^?~>VhO^z(t1eC<69Pm4>!!P z+TSmO*Hw{82YVgOqkV`m(x~)UWNF$lv0`1V@erL;%0pyg`xWy`{+=zvU>bCCwBiV- z+^nb%6p6sAJDu(Ek-Aq_Dhlg}!O2y>GSUP2S1k*7j#m+K82z0OdQ$1opV|bL6h%B! zXa8oI)MRD4#0mdA0v!P!fYSqw?!a0A32Q0zyumGEI71FfD5Kqy>C2c+# z3m&HmVmG%pYv{=kU}Kr8?C)7`gv$?)93M?QKI5#Nuz$=5`w99q#r>gX5JW4h2pUXR znG_xBYpu1DJ3-WxITo&w-ePt3a}s^Sk;@A$au~6N-|1D+OCfN045Ta}DdT8?Xfv4S8U3pI%B(FNq5?3;bs0Kg<}H4u5{hrxaZk;pI_YH-^WBxkXm` z6e2-M6t`>YzBFa5=X>PrTg&{Vx?ClW4UF}PFvY>~zV53YwpT*Fw=Tr;0?KvgNa1{I zz?>U-3@Aw8#@`q&MRiw=Qs^gXnY%_}AaZP+Y*(0o^tniM3(3HD4_^6|JJjQ8lVXYf zNyeYLOCie_Yq^Y92^fPIh5SAd?GKyOz!M)Z&@(&KMs}Z~1+@#A zDn){ za(5`pafSm}+*XA-Urfi5MY^s7-T07?83KdM#_wI=%N#k*`onYbgXaIj0`05>e_Ht*%hVNb0TfrbIcQ| znw(qnr73u~R2ps>B3VwVm>!uHi zp8yfl>AUt+0hLG4$^cl35Lyy`>CYvoSc8Vb$wRa~{8#PVTs zi%C@|R^)~vi)JO5QG=|n7ZHZT9LQ5Il12uw+=MQK5S!VBJdFb6J4*;GJ;TBRy%pQ9#4fa-saI!eZ33aiGK-eFpcEtIkdi+IY@i!|Br^=*4hjs-&}i$76Ps*%*e~y60EH z!a^@eYQw}@nzewyBab3wd4IZqKkU*)KAW(#D{YCl4#Tzy5hJ_3g#mj>18bXVpD>!3 zQcz){89yvvdyvC%Y3MJ=+EE#r+s(UW##6mOD11o}NY-J<8j(q^>Ql@ZRNdTMa~o@&JTugi zPFQSj%z>^v(!|-Ra~WaIx6~ciimQNMiFrGp-4I0=1A+4jk&qx-0!tG)# zF{YH$j08F zb{oq0gqDI&31WMyc=-;ml@ebSKapFSvHCB04~C<8jk)W3$$x&6U=^ZpM=l|0l=6zf zWNLHMJlT!sv3A)kacBpw3rcCA%siJwsCI()#-r{UX%xsca?)0j8HX%>U}rV)qowX) z1;_#_P}(Qrr0#344tAcCK@?Uf48 zwx#~lXF14#^GiI7Q@N*ej*^QE4tbKTC$Ux0@>cC+`cjhZD%Z>n$BNV3v^e&I$Q4`D zMwZ>>2tp-yokN%a-m?x3+()raYu98<6l&R+t2;l5C-MGC|5_$okJfe~$!M;)^L?>c zmQ zX1+RYAilBLLZI0@mWxo|G#4@$&bdKa#;ngOb`mTz%IMR%XB+o*ai%N7E7Ay_2H zh*Sx`Eq~7QFoQEVx>~7I$P8vyDrsBhd?PtCzvG3C04M!Ah6vtN%g1P?(MnJ`Vy$Jh zY?)PbTXMZdlHUJDcsEobOKc;e(0T-|Rh>$w0|`FR<0AHxLw7PM7ME5CM;1U}rg{0R zxW!1H@>;mn50S#G*rklu%1YioN5n=UpAT;qF*w0)9<_Gi%Bnm%8jp`Eh;P9^L7r4d7XZnV&*CymXG3rT+cx z(0Kjj9-^Dw%BtIsP&0s&I^Nz~|9u$IK08{g51XzwJv7`yiA`k;!KSrX^@gx46C3oy zAyDfL+SlQ#St|IOt#YvUBjy0BDr+8xfa7^SjBa@1EzX7#6*3c}{h7lwonr{x#4zv_ zO|xpd0_zl!1L*Hl2>N7ALicxroOzoWS_ujFZovdrD;+?lSJZb}e|0x-}#HQVfGP za*4IU>~KdYNyK02b)AwBeR^RzVr0*Tg%@kn)`>`cXufgg~!x46zz@9m#E%t92U=3vJw*TrLdRo&Iuh{Rvya^3-H`2da@dYtFC z#c)68rui&d-82c{5U$R!`4VhCGfDH1U`DT8Uwe`zs^WPYWt~S*k40E2zOs+?1&jK;C0mIuD4;4vHEgGMYCE$TH&c5RJ(gM}LP6e= z)hk(fgm#b=U08#yp#S1I7#PDlvVsO_ovp;6o+qxpYjsZtr~GO#ox1v+BKlZcB{Dl* zn28)*iVst9XZ8oRBT@RW=d)sTHT1|PwRZAm(?SJGul`ddshz za7q8v0u0cUSM9tOp$ei~0|o0+dTo+(WkO*-^T(-*LQMnVLK;+gNewH{B&Jnt_xI~t znmhU0?FAS%a$4b~K=9I^mrwgil&9RXDmtsMrin`e?8X6_;VMM9taaMfq z4t5g)!POb)oObCi$eH^Z(e+zn2SSksM~fqZ>w?oSZ>VIB0+T(&1uy>KlX)5vQc!C? zbE5M^BPGd zRJzku%nLSHyEHkq^M3GgO${W=Z<5Gi8`u$DBJnHE0=zV0Jjo7?sv|*Bt?QRx6f#c@ zlNbafZu3cYihUk7zw0&SbOdoTu!vLlKts{E-}QX;i66!eJyBS@ro%TqDZi)RY1~ezoLF!vV)ZOmO8ggXB5&0MX{s5IzE2jIHN=j|B^O?X|wo~zQ0+V_6CT# z1^a%yZE3i-v5v8(k;i7PkCn?AcV4DZ7293C5W?z4_g>7OFFb<+_K?m>eM*Zhn{9kV zhpdq|kuP^oI)AA?q!i5xa=^Q1)r_!#4jJ9=wJGUa@la1S7rhsp6Q+0w5ojp0Z+NK# znuWLU^J*BGoVxQ#Y5+kM6iX*1@kBVs!9ib`(-&7nGwXK56qKrLf^9WV7r&%J$H&JI z;sSALv(Js+neK{<_9oXACM;!y4w#U*N8kvk^jgg`JTE1jB-P<%&1K=8Z*G#{s01Bp zYgeDFd$NUtx;-pRjQY{LxVt1{14{{U(tY2T?;(8y7r&Q4pz`v!LA;RM-~J|Gm9B2% zW8EL&VHIcv9?=St^slA;n$24K&OAXl;2vou1hhJ6@!}qHp!gzrx>bFoJ|J4|VLUYd zUG&*TvPeAj*R~1_I-0w#iWMQpFaD0^Wc>!u`rJpJq)A)EbJaMUJq#osZ@g7&Wq-8n z^;;y)VN;Tmkc}iz&{;K#BPB)G#Sk!uvl_2yV#hYpZ_Y|Bour<}VrOng_QWDwB(kSU zC386gyw&SuusY_v&H88SmDhxm{SCdGz&6C|b(uBRxzQOH;B+jlEY>S4r85rA>2Mu! z-S3C&3E$!={!^k;4px>>m?FvwE9P>zr&UDXH;QL4VOx$V)~>M$yk(A$5ayh?|j8 zyM1YjvM;w;IuC~3v3Dej@}U>nUG;QB7gLcyIU5L>P9d!HxcPERkK?5?h;Rw2N{9z| zcGZ5HFG@cHT3F%r3So!1Nbq;|(e3r;i$Iww1+)))_8p~)uX(!?q2KKzZyCN{mmZlR zXFQQDxG~Jv^Y#8&p&@l!mJh%;Z%P{gduGk8@e2oO+luXN8B5J};Z|d}8vbG+f$in^W6gFk?T$1kwg*KQ@7o=A4qih82whs{_dHa9UY47xQX`BWfgk zby&R;8K{-E1Fwb%Cshb<9=iC01-4Y_n_lyJ!P5N`{n<2HGkG~tUfI)+st%p+kro&ZRHiUnBV$A2BtEw~_mLvXrcfT*WqpW@PN7q|qsWc7 zLC96ZmzfVj{=yu_G)Ph|QWFj(zEfW8{pBlfIz9m*ZcFZ(oU6(>HV}qW4*leU)g-G! zOTNGBPmNZ>{7i_t*tR{qz_<&$gmxx(;ueTZB5w!=;Xx&5xi!qG5l)$)H(>I+u&$-9 zl?m&&Y~~xRoLy7piDwlj4XAmksS`vIPpi?IZ3TaN6z5GuWUeqJ7xekG zD<L8lu#n;6Qk%GAm!u zGWU43?3y&N)PMeOE?R&DjjnFMWR(|C#NBhJ+F?@mi z9`;<@@l9o=JYEzn;)Z&;>YFnJY>nwzA9x!+x)L$8Db^Y(SF{U-5bVi8r@l9e%`-F4 zg5keVwe+4FR(?GZFfjf%D7=lXSKsGHo+#{5Qj zgBO<4RlTfL{bM`}YPLF2F>~BWn7GFHy$V9UV!OI!>vWr?J5#_L77?uY4suw*Lj`Y_ z%x{Z_OobkoZn1rH*PaLj@9KL^65MV4`O5y+1;bYxsGz9Z+#l1t*nN@dUj+ zTd{y(auT~C?#ln7AF=*CUs)X8<9tThto!*{8IQ;i0vx+RO-F&Ayx zX;gl*Uo&RLJ567D_DdAgTl5Qx`Su0bJ#E$k?_{(42BO1_b9^_XHt{V+oV2h@=#zyI z<_G^_tdOPSn@S?viVLUh548zN5}p{=o(YXl8K%GE2ZOZ*BZJ~RN{F3wj93D{plnj$ zOKaE}4hUT#J==^QWwI)@#NKEoMcZ_`mSl|Ir!QOUd}##>oI3k#eQvI{AQ~D+`!a5S zaPv*;*^>3oz2hP}_uYP<+{yNg|GLK>h-zvBCo*J`}m!DCn~{dl1Rk|a4pWDx;BSBfKa z5Mx>e3+wwDwFbOrpHD!hexJ{!{2=5EPvJ#G_1d*d+G@Od5o*gm9Nd(yT44E-NsK@` zFje$vOlt(B((`R@nLXUG5JhBz2=tXm=29DJb;I^|HVz8uDtiHM)5Nq-GBSt9QvHhY zVAE}XT!ixmhwVug8A*yE731$X&Ss8hx=Df{Gj|i2PpkCfk4aKg8yOmZqyld)LQLv@ zNFMp~dcflS>1XSZ`}3LJ9Wr>~7i+CJEnA27SH-^L^m`Pi!UmF~ys)Do`Oivt_T2BM z*m+HiSapE2&T?l<9w=Iuq-n}*yFaZD5fSwzXKRN1ociVq6;05}KMn&qPLC+FpdYKt zYc;VF@Woy}QU!ImUC^{J9?JsT^Stjqk7^7fHc%v`be)o*x-ES(++Qy1o88SGpyeM& zc8?d>9$R;MBhv0Z@%}F)a+d!>A_uelCx@IF{9h9=FoQwB|7|=1YXxui#6#TT22NgN za(b04QQYakZ;>QPTdBF@03!0@n1ylR{%N|q>39cFN?dbg{-mh4DI=dmlG@>F5W_&Mv6xeCm7j@} zJ@rT^_fvR4Jz>}`y&r6JcuhAcyA#Ya02@k>`6nlYzrY+Rgl(J}F@OF8d(GbBL;yhQ zhn+kz4TL_4pIEfRLysUsisxt{3rv_*@#kp_MB<)DlnXfssC5XxEgvh28sj=a2y_EE zf7tIo=@foA{NNk)OT}1*$QFZyLV(*0Wn$ng7C&NQ{FERFCj+}9E+o)%1(yqiTqN!p zT4DZ$2f)F8ct$(LVQ{8gj3rI_ZQTsLDH-=kJ)9&Zuds~Fh1g*#UjYJpZxetflAD^n zlWFUNBMYU4tyd-0p+*8F4(HvId@+S=M;xO!1_jAR64*1ZNro|IM+HHLiY>u}5~-)q zhYB~USwJG7^z)&6mk-B>T_BZzC=d3T3IT=2_-Ab_Ug&n<2Di}n2T;s;076c`zm^h( z)S~bayZfzoY*MWDa%=1p<8dKD&)awK=$3N=(nEa-`>}kCKgI3U*k(cz`N}}G( zdUoVRtRtrFayPTwhnnU#zwv$=E;MI&hWkG8m$Dny* zlKV!61ymQjm>iW=V=88feS75l~Pgw)#j%W8hpY5DS* z?pgh5+NEZ*iifcpCw9MI zd$tv?^2|%sG0g+W$+WBLU&`3JmyRhriBgZaD~OzA!aeL?O+2)}4@(Me8Hx7}^F8j| zC)3yW9xIPN>-riT_zBHwUvuBuS#PLPr*l_EX~KAMHI(6>YSL`X%>$Kj9b)MyA}Zw? z$Z>$hGeahI8{V1cwPz?%tyfaU(SPcyQ_g+k;%cqafsLP^$qqyv6a`Q^=b$j>-5GVvNi@Jgg(s zEzfpS0UCL^s#Sw{j50Ghyy!XT?>c-MEq_Q-_pmy5zfe^mLrrQh-kvFTj)pTdk1Q)I z&rS-WRE8hYM`0gES!j9Xu6CcA`&Vg>yehpHs9{l;hN3n8X6|$TMeuZ^M9+7xZ6O{$ zm!0*kvF)`Ab3pY?AOqIW(g%HG1tnH1?HaiIJ}132WVx__k9_2fuCFulyM7~wP4oIm z*`ukeQnFZas!~?Fzq3<@sFJqM!T9H{g6iqZ@S9KL9C`2rb4dT*kR%({`(JaNQfcA2 zoBdI1+?3pTwRh@$ykMKQu0kC)4*86`*J%V7^E!s|-0RCmk>e_}Kel|iAIFQK3%pL( zUOD04>bq>Bg5JU4h7g7_%2nOIrLnMv)QL0N^SQg3rDkEPNFDQ5-reaPQQ%c6)8t-v z+6f!oZ`s#WS)G-upfj)x!TGI%jrN%Z>3OdRWB=*zh?nVkX>|fWXEsu+k7DXh|Z1SaIO^;KRcXp)m z+!1ZBisl)4yy_k_0L}lGMU?eF7Ew6|TO(&fV+R10oso%>u^K%y1Bi)%g^3!TQP9Cy z-^upl&PVgVtLC;gLi$d|04gC)7A6*ECNPkRnGFPDVWMSXp=4sB{E(BjHTs`KlpOT! z>^>6FFpB6~IU2(=$|(t}F^D)@SsCct*!-i5l9{<9;N$w2PILejV+Y5Nt^q&>W)L$g z2MZf3JqrWdzjgh;8Um!uU5o)NOw1gNLdFK>`Zm-6OFMlhGe={6fXn}ToQ>h*1=R4o zy#EY}t$_vnM^Yvxz&{0UZg@r|cROPMqpX32qLVc|qYMD_5!gt?+`-Wa0AynMw_6&3 za0B_g!~jykz|8+Z%?l* z<(dr|X8a}$c+4L$78C-k|I>O!qEbv`W>j8u*Z!|66~iz(|ucpkz&jUJAqBa z{Ky-qR}ke&C*L$qiL(M_P_I!Mf5VmcC@jhaDCwxtR@9@yLp4F58%c;P(q&2z;^xvH zXV>>VM#9u6IQ0o{H4eIBts5}^{_Fh{W=pX~j>5mM9-V(@QynUx5O;&^NC&OgICC`= z(|d*>BMMumNPSlmNTDZr8VMkXZpXerok#ooAxOme7~bAFnkaa z?B-6B9_qIs=KZvN?M*COZi{eP%dytFNV03w@)Q)QMLp-c+l*rsA%j)anM7S(2})WxA(CP3{~{F>)+}8o z)6CIeKh;*PiD3aEaOTjhHn7=E0E>*G{&3$?Xn_SqOKxI4*;H*(fnw|$RH*Mr-SJb# zHgYI^hvUN}7#`6Vi2J5I!!d1npgRn^n(X|77?E}bi}VJ(Wf+|C&xwB^w}1`wQq)%u z*Zu!uX8RYZ3rV4Ugmm5y!#hd}iWad)p}VJ`_KIcjgDq(a%_bW?P$&}am=yxSP;9CR zC8ZTdHXxjrmJVYOFyNf%4sLQVPuc!7K2Rj$9}E|>JOT}?9dHfX2{S<3Aqon23s9q% zesU9h%*1z8qrfdwgfO%+E9lbC51dNntlO9Jj-YLr46C7B$$XD4i(_a1;$TN?vZ+xo zkdgTuwFbZOol!)#^dt`^xi2h^Ik}Pkkwrt&&AK46@ROMdLElICz}jop2~utgc6K^Q zL~G(dA9HH7agGO6UEsm=F4x}@vr8Nl`qlTi(=DDwd3h!1hC<$-wnCl1qm*g_iRNJC z|03FRhm?^ZW6mgz1xh`5Q?z5?zETt>Zk5=3g|JI{&1a%nR>|_`$2iIM7#ijK7fCnA za%4hy3E_!kX(aN8HAD%gTK*)e-Nb?L!nKrf+FkN6mh6h0j~%j>^R^g~bh)V5n>7Xn z?Z-(7wgM{lDu|Z^cKjvBLRh|Z#ZT|wmx>pcO;5om1<#a5Y869nuz9^=F4vP-3U=n% zMcw1SjPG&P+o4fPcREmOi)dj&WZMnDn5{igjEP3f&eJ{AJ!r-FG3=MF z#s=N*A~D995pQVj0*SVzm>U=@Z$=ZIAadK7sKPlpuMp=Ox)Ro83L=R6jCdz)5=!JCx6uy0qf`{B(0V8Ia!zv}UqrZA(Q^CA)i= zFodxU;~M20qJ zHae7gs>@btL);HcFF@Gyu1JxCuzxMPbQ$cC=8RIU_ccCp>*iyb_)M=~tf(z3_W zGRJ~Ck~Vy4LRNG1EG?I9zkk(V_jYV?y+TWc>GxB)_a7W%VN(41ZHLCBnk)5`z@!nv z4n*If(tPO?pMVLl!2|UFH4Qnx`?Ndp1&7NGTxnkt;$=#-*B%QN@Jmqn8EE|zzl)c{ zy>?8FEil)a9MMt27YVH!btL-*Q{S!0pTau8mZ}9NTx~79(3`tGS|{B(rc5QvbPR~g$NhvBbI|bM>$RF z1E(x1M#oOBDCSnsVGPsp6sHKHB{`ilH;q(q^Bxe8MQ+))y z&>(IV&N1)D@XHrVd27=v*^~>gy1Ba8b!bYVgE9UpK~g(f`*fJU7)lu`uYef!(o?R) zy7C~`!n4QD!6|dj)+z2V=PI`+4;KfgHJby@4Y>uvYl#hr!{R&~xDD2ZccoG8uz}c> z5oWcJHs$cHS4Ri0D-buzgd1|ja8h38zBOL;!0t8z%wv|^hg zL9=S-GG3*Hiw9D}@}`Yplj@o^E9dCxPEs+E+GaBU|IdQY}DI~ z1idBGt7W?j;K|fp#+QCwfJflP&LR3q>#cP5WJkuGFw#y{iqXT^__+GlJLHg2!HOwz{kJ=^^M-3?!6S$x$9HXC6J|G>SJf3jH)GST+MGh*TiZ zu})L5g@leIk0OtRVw;3Go`ig+k94)w`!eiuo<@+)L`B`exoH%2s9ZU_<+Kw1*Rg>z zSr<_`+P99%(On}8W#SZ=@-m#bW0>JJ0^inqjEn#OQ#d;5J2<&Hd<;GZ2*|+%Pfji@ ID+2$20Lpgw;s5{u diff --git a/src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf b/src/test/resources/org/jabref/logic/importer/fileformat/embedded.pdf deleted file mode 100644 index d399b8214e81c529c111beeb2a2bde6abd2cc880..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52091 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%0D)`Vf3i{V46*wX=yM0lk>D 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 Date: Tue, 10 Aug 2021 11:24:11 +0200 Subject: [PATCH 067/108] Fixed error introduced by refactor The return-escapes in the while loop now need to be done with booleans --- .../DiffHighlightingEllipsingTextFlow.java | 31 +++++++++---------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java index 86599446065..8e3667e57e7 100644 --- a/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java +++ b/src/main/java/org/jabref/gui/mergeentries/DiffHighlightingEllipsingTextFlow.java @@ -64,28 +64,27 @@ private void adjustText() { widthProperty().removeListener(sizeChangeListener); heightProperty().removeListener(sizeChangeListener); - removeUntilTextFits(); - fillUntilOverflowing(); - ellipseUntilTextFits(); + if (removeUntilTextFits() && fillUntilOverflowing()) { + ellipseUntilTextFits(); + } widthProperty().addListener(sizeChangeListener); heightProperty().addListener(sizeChangeListener); } - private void removeUntilTextFits() { + private boolean removeUntilTextFits() { while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { if (super.getChildren().isEmpty()) { // nothing fits - widthProperty().addListener(sizeChangeListener); - heightProperty().addListener(sizeChangeListener); - return; + return false; } super.getChildren().remove(super.getChildren().size() - 1); super.autosize(); } + return true; } - private void fillUntilOverflowing() { + private boolean fillUntilOverflowing() { while (getHeight() <= getMaxHeight() && getWidth() <= getMaxWidth()) { if (super.getChildren().size() == allChildren.size()) { if (allChildren.size() > 0) { @@ -96,9 +95,7 @@ private void fillUntilOverflowing() { ((Text) lastChildAsShown).setText(((Text) lastChild).getText()); } else { // nothing to fill the space with - widthProperty().addListener(sizeChangeListener); - heightProperty().addListener(sizeChangeListener); - return; + return false; } } } else { @@ -106,16 +103,15 @@ private void fillUntilOverflowing() { } super.autosize(); } + return true; } - private void ellipseUntilTextFits() { + private boolean ellipseUntilTextFits() { while (getHeight() > getMaxHeight() || getWidth() > getMaxWidth()) { Node lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); while (getEllipsisString().equals(((Text) lastChildAsShown).getText())) { if (super.getChildren().size() == 0) { - widthProperty().addListener(sizeChangeListener); - heightProperty().addListener(sizeChangeListener); - return; + return false; } lastChildAsShown = super.getChildren().remove(super.getChildren().size() - 1); } @@ -123,11 +119,12 @@ private void ellipseUntilTextFits() { Text shortenedChild = new Text(ellipseString(((Text) lastChildAsShown).getText())); super.getChildren().add(shortenedChild); } else { - // don't know what to do with anything else. Leave without adding listeners - return; + // don't know what to do with anything else + return false; } super.autosize(); } + return true; } public void highlightDiff() { From ba139712616e769ad54c5daf49d257ab9312d651 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Tue, 10 Aug 2021 11:25:20 +0200 Subject: [PATCH 068/108] Fit field-editor-column to width --- .../java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml index 26c18eb806a..6f05aefcb43 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntries.fxml @@ -40,7 +40,7 @@ - + From e3d279ae51681435c996e19842f99d35a115a7f0 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Wed, 11 Aug 2021 07:11:41 +0200 Subject: [PATCH 069/108] Checkstyle --- .../logic/importer/fileformat/PdfMergeMetadataImporter.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java index 9d50e6e1f76..c453544a185 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java @@ -20,7 +20,6 @@ import org.jabref.logic.importer.fetcher.IsbnFetcher; import org.jabref.logic.importer.util.FileFieldParser; import org.jabref.logic.util.StandardFileType; -import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; import org.jabref.model.entry.field.Field; From 25e7b2ec59e40799098237211d81a787c5a1e96a Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sat, 14 Aug 2021 19:05:18 +0200 Subject: [PATCH 070/108] Localization in diff-mode --- .../jabref/gui/mergeentries/MergeEntries.java | 20 ++++++++++++++----- .../mergeentries/MultiMergeEntriesView.java | 4 ++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jabref/gui/mergeentries/MergeEntries.java b/src/main/java/org/jabref/gui/mergeentries/MergeEntries.java index 42ff20930f7..63ee5c762e5 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MergeEntries.java +++ b/src/main/java/org/jabref/gui/mergeentries/MergeEntries.java @@ -425,11 +425,17 @@ public void setRightHeaderText(String rightHeaderText) { public enum DiffMode { - PLAIN, - WORD, - CHARACTER, - WORD_SYMMETRIC, - CHARACTER_SYMMETRIC; + PLAIN(Localization.lang("None")), + WORD(Localization.lang("Word by word")), + CHARACTER(Localization.lang("Character by character")), + WORD_SYMMETRIC(Localization.lang("Symmetric word by word")), + CHARACTER_SYMMETRIC(Localization.lang("Symmetric character by character")); + + private final String text; + + DiffMode(String text) { + this.text = text; + } public static Optional parse(String name) { try { @@ -438,6 +444,10 @@ public static Optional parse(String name) { return Optional.empty(); } } + + public String getDisplayText() { + return text; + } } public enum DefaultRadioButtonSelectionMode { diff --git a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java index 7aa51f4af55..70b9d9278c5 100644 --- a/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java +++ b/src/main/java/org/jabref/gui/mergeentries/MultiMergeEntriesView.java @@ -39,6 +39,7 @@ import org.jabref.gui.util.BindingsHelper; import org.jabref.gui.util.DefaultTaskExecutor; import org.jabref.gui.util.TaskExecutor; +import org.jabref.gui.util.ViewModelListCellFactory; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.fetcher.DoiFetcher; import org.jabref.logic.l10n.Localization; @@ -128,6 +129,9 @@ public void initialize() { private void fillDiffModes() { diffMode.setItems(FXCollections.observableList(List.of(MergeEntries.DiffMode.PLAIN, MergeEntries.DiffMode.WORD, MergeEntries.DiffMode.CHARACTER))); + new ViewModelListCellFactory() + .withText(MergeEntries.DiffMode::getDisplayText) + .install(diffMode); MergeEntries.DiffMode diffModePref = preferences.getMergeDiffMode() .flatMap(MergeEntries.DiffMode::parse) .orElse(MergeEntries.DiffMode.WORD); From 04eecaf16c87f2cf07e1a13df0c348be259515ae Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sat, 14 Aug 2021 20:42:38 +0200 Subject: [PATCH 071/108] Grobid Timeout --- src/main/java/org/jabref/logic/importer/util/GrobidService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/jabref/logic/importer/util/GrobidService.java b/src/main/java/org/jabref/logic/importer/util/GrobidService.java index a8711d6facf..6d893805877 100644 --- a/src/main/java/org/jabref/logic/importer/util/GrobidService.java +++ b/src/main/java/org/jabref/logic/importer/util/GrobidService.java @@ -58,6 +58,7 @@ public String processCitation(String rawCitation, ConsolidateCitations consolida .data("consolidateCitations", String.valueOf(consolidateCitations.getCode())) .method(Connection.Method.POST) .ignoreContentType(true) + .timeout(20000) .execute(); String httpResponse = response.body(); @@ -74,6 +75,7 @@ public List processPDF(Path filePath, ImportFormatPreferences importFo .data("input", filePath.toString(), Files.newInputStream(filePath)) .method(Connection.Method.POST) .ignoreContentType(true) + .timeout(20000) .execute(); String httpResponse = response.body(); From b7e5b6251afc519dd3fa57538708ebdbffa43e33 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sat, 14 Aug 2021 20:45:06 +0200 Subject: [PATCH 072/108] Null-check --- .../PdfEmbeddedBibFileImporter.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfEmbeddedBibFileImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfEmbeddedBibFileImporter.java index 168b582a08a..e91754afeb4 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfEmbeddedBibFileImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfEmbeddedBibFileImporter.java @@ -82,16 +82,18 @@ public ParserResult importDatabase(Path filePath, Charset defaultEncoding) { private List getEmbeddedBibFileEntries(PDDocument document) throws IOException, ParseException { List allParsedEntries = new ArrayList<>(); PDDocumentNameDictionary nameDictionary = document.getDocumentCatalog().getNames(); - PDEmbeddedFilesNameTreeNode efTree = nameDictionary.getEmbeddedFiles(); - if (efTree != null) { - Map names = efTree.getNames(); - if (names != null) { - allParsedEntries.addAll(extractAndParseFiles(names)); - } else { - List> kids = efTree.getKids(); - for (PDNameTreeNode node : kids) { - names = node.getNames(); + if (nameDictionary != null) { + PDEmbeddedFilesNameTreeNode efTree = nameDictionary.getEmbeddedFiles(); + if (efTree != null) { + Map names = efTree.getNames(); + if (names != null) { allParsedEntries.addAll(extractAndParseFiles(names)); + } else { + List> kids = efTree.getKids(); + for (PDNameTreeNode node : kids) { + names = node.getNames(); + allParsedEntries.addAll(extractAndParseFiles(names)); + } } } } From 5cbf9190488662536805d5598c43a265e5ab2e5a Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Sat, 14 Aug 2021 20:50:21 +0200 Subject: [PATCH 073/108] Use MergeImporter as WebFetcher Users can perform a PDF import on already imported pdf's to improve the quality of the entry --- .../jabref/gui/entryeditor/EntryEditor.java | 3 +- .../jabref/logic/importer/WebFetchers.java | 7 +++- .../fileformat/PdfMergeMetadataImporter.java | 36 +++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java index 84c98978b75..52695a3929a 100644 --- a/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java +++ b/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java @@ -45,6 +45,7 @@ import org.jabref.logic.help.HelpFile; import org.jabref.logic.importer.EntryBasedFetcher; import org.jabref.logic.importer.WebFetchers; +import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.Field; @@ -355,7 +356,7 @@ private void setupToolBar() { // Add menu for fetching bibliographic information ContextMenu fetcherMenu = new ContextMenu(); - for (EntryBasedFetcher fetcher : WebFetchers.getEntryBasedFetchers(preferencesService.getImportFormatPreferences())) { + for (EntryBasedFetcher fetcher : WebFetchers.getEntryBasedFetchers(preferencesService.getImportFormatPreferences(), preferencesService.getFilePreferences(), databaseContext, preferencesService.getDefaultEncoding())) { MenuItem fetcherMenuItem = new MenuItem(fetcher.getName()); fetcherMenuItem.setOnAction(event -> fetchAndMerge(fetcher)); fetcherMenu.getItems().add(fetcherMenuItem); diff --git a/src/main/java/org/jabref/logic/importer/WebFetchers.java b/src/main/java/org/jabref/logic/importer/WebFetchers.java index a30b86db3d0..bf4eaef50a5 100644 --- a/src/main/java/org/jabref/logic/importer/WebFetchers.java +++ b/src/main/java/org/jabref/logic/importer/WebFetchers.java @@ -1,5 +1,6 @@ package org.jabref.logic.importer; +import java.nio.charset.Charset; import java.util.Comparator; import java.util.HashSet; import java.util.Optional; @@ -37,10 +38,13 @@ import org.jabref.logic.importer.fetcher.SpringerLink; import org.jabref.logic.importer.fetcher.TitleFetcher; import org.jabref.logic.importer.fetcher.ZbMATH; +import org.jabref.logic.importer.fileformat.PdfMergeMetadataImporter; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.identifier.DOI; import org.jabref.model.entry.identifier.Identifier; +import org.jabref.preferences.FilePreferences; import static org.jabref.model.entry.field.StandardField.EPRINT; import static org.jabref.model.entry.field.StandardField.ISBN; @@ -133,7 +137,7 @@ public static SortedSet getIdBasedFetchers(ImportFormatPreferenc /** * @return sorted set containing entry based fetchers */ - public static SortedSet getEntryBasedFetchers(ImportFormatPreferences importFormatPreferences) { + public static SortedSet getEntryBasedFetchers(ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext databaseContext, Charset defaultEncoding) { SortedSet set = new TreeSet<>(Comparator.comparing(WebFetcher::getName)); set.add(new AstrophysicsDataSystem(importFormatPreferences)); set.add(new DoiFetcher(importFormatPreferences)); @@ -141,6 +145,7 @@ public static SortedSet getEntryBasedFetchers(ImportFormatPre set.add(new MathSciNet(importFormatPreferences)); set.add(new CrossRef()); set.add(new ZbMATH(importFormatPreferences)); + set.add(new PdfMergeMetadataImporter.EntryBasedFetcherWrapper(importFormatPreferences, filePreferences, databaseContext, defaultEncoding)); return set; } diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java index c453544a185..2d301e70307 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfMergeMetadataImporter.java @@ -8,9 +8,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; import java.util.Set; import org.jabref.gui.DefaultInjector; +import org.jabref.logic.importer.EntryBasedFetcher; import org.jabref.logic.importer.FetcherException; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.importer.Importer; @@ -20,10 +22,12 @@ import org.jabref.logic.importer.fetcher.IsbnFetcher; import org.jabref.logic.importer.util.FileFieldParser; import org.jabref.logic.util.StandardFileType; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.LinkedFile; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; +import org.jabref.preferences.FilePreferences; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -139,4 +143,36 @@ public String getDescription() { return "PdfMergeMetadataImporter imports metadata from a PDF using multiple strategies and merging the result."; } + public static class EntryBasedFetcherWrapper extends PdfMergeMetadataImporter implements EntryBasedFetcher { + + private static final Logger LOGGER = LoggerFactory.getLogger(DefaultInjector.class); + private final FilePreferences filePreferences; + private final BibDatabaseContext databaseContext; + private final Charset defaultEncoding; + + public EntryBasedFetcherWrapper(ImportFormatPreferences importFormatPreferences, FilePreferences filePreferences, BibDatabaseContext context, Charset defaultEncoding) { + super(importFormatPreferences); + this.filePreferences = filePreferences; + this.databaseContext = context; + this.defaultEncoding = defaultEncoding; + } + + @Override + public List performSearch(BibEntry entry) throws FetcherException { + for (LinkedFile file : entry.getFiles()) { + Optional filePath = file.findIn(databaseContext, filePreferences); + if (filePath.isPresent()) { + try { + ParserResult result = importDatabase(filePath.get(), defaultEncoding); + if (!result.isEmpty()) { + return result.getDatabase().getEntries(); + } + } catch (IOException e) { + LOGGER.error("Cannot read \"{}\"", filePath.get(), e); + } + } + } + return List.of(); + } + } } From 1cb4dfcdcdc3ec56eb7a9a4b8343280f5b84af8b Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 08:46:28 +0200 Subject: [PATCH 074/108] Only force BibTeX import if everything else fails Fixes #7984 --- .../logic/importer/ImportFormatReader.java | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java index c5d7d8140cc..9ed26ed76ba 100644 --- a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java +++ b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java @@ -175,20 +175,25 @@ public UnknownFormatImport(String format, ParserResult parserResult) { public UnknownFormatImport importUnknownFormat(Path filePath, TimestampPreferences timestampPreferences, FileUpdateMonitor fileMonitor) throws ImportException { Objects.requireNonNull(filePath); - // First, see if it is a BibTeX file: try { - ParserResult parserResult = OpenDatabase.loadDatabase(filePath, importFormatPreferences, timestampPreferences, fileMonitor); - if (parserResult.getDatabase().hasEntries() || !parserResult.getDatabase().hasNoStrings()) { - parserResult.setFile(filePath.toFile()); - return new UnknownFormatImport(ImportFormatReader.BIBTEX_FORMAT, parserResult); + UnknownFormatImport unknownFormatImport = importUnknownFormat(importer -> importer.importDatabase(filePath, importFormatPreferences.getEncoding()), importer -> importer.isRecognizedFormat(filePath, importFormatPreferences.getEncoding())); + unknownFormatImport.parserResult.setFile(filePath.toFile()); + return unknownFormatImport; + } catch (ImportException e) { + // If all importers fail, try to read the file as BibTeX + try { + ParserResult parserResult = OpenDatabase.loadDatabase(filePath, importFormatPreferences, timestampPreferences, fileMonitor); + if (parserResult.getDatabase().hasEntries() || !parserResult.getDatabase().hasNoStrings()) { + parserResult.setFile(filePath.toFile()); + return new UnknownFormatImport(ImportFormatReader.BIBTEX_FORMAT, parserResult); + } else { + throw new ImportException(Localization.lang("Could not find a suitable import format.")); + } + } catch (IOException ignore) { + // Ignored + throw new ImportException(Localization.lang("Could not find a suitable import format.")); } - } catch (IOException ignore) { - // Ignored } - - UnknownFormatImport unknownFormatImport = importUnknownFormat(importer -> importer.importDatabase(filePath, importFormatPreferences.getEncoding()), importer -> importer.isRecognizedFormat(filePath, importFormatPreferences.getEncoding())); - unknownFormatImport.parserResult.setFile(filePath.toFile()); - return unknownFormatImport; } /** From 3ab8ebb9d26dd281cb258b980922d08442a88f31 Mon Sep 17 00:00:00 2001 From: Benedikt Tutzer Date: Mon, 16 Aug 2021 08:59:01 +0200 Subject: [PATCH 075/108] Prioritize non-bruteforce importers that When importing, try importers that can tell if they are suitable for a certain file format or not. Some importers only check if a file is present, not if it in the correct format (isRecognizedFormat is always true if an existing file is given). They are used last. The List of importers now reflects that prioritization. It is not sorted by importer names anymore. The getter-methods getImportFormats and getImportFormatList still sort the List by name for the View. --- .../logic/importer/ImportFormatReader.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java index 9ed26ed76ba..08a72a802a1 100644 --- a/src/main/java/org/jabref/logic/importer/ImportFormatReader.java +++ b/src/main/java/org/jabref/logic/importer/ImportFormatReader.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -47,7 +48,7 @@ public class ImportFormatReader { * All import formats. * Sorted accordingly to {@link Importer#compareTo}, which defaults to alphabetically by the name */ - private final SortedSet formats = new TreeSet<>(); + private final List formats = new ArrayList<>(); private ImportFormatPreferences importFormatPreferences; @@ -56,8 +57,6 @@ public void resetImportFormats(ImportFormatPreferences newImportFormatPreference formats.clear(); - formats.add(new BiblioscapeImporter()); - formats.add(new BibtexImporter(importFormatPreferences, fileMonitor)); formats.add(new BibTeXMLImporter()); formats.add(new CopacImporter()); formats.add(new EndnoteImporter(importFormatPreferences)); @@ -78,6 +77,8 @@ public void resetImportFormats(ImportFormatPreferences newImportFormatPreference formats.add(new RepecNepImporter(importFormatPreferences)); formats.add(new RisImporter()); formats.add(new SilverPlatterImporter()); + formats.add(new BiblioscapeImporter()); + formats.add(new BibtexImporter(importFormatPreferences, fileMonitor)); // Get custom import formats formats.addAll(importFormatPreferences.getCustomImportList()); @@ -119,26 +120,26 @@ public ParserResult importFromFile(String format, Path file) throws ImportExcept * All importers. *