diff --git a/CHANGELOG.md b/CHANGELOG.md index 080c970bf1f..c8a94b58d58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -40,6 +40,7 @@ The new default removes the linked file from the entry instead of deleting the f - We changed the metadata reading and writing. DublinCore is now the only metadata format, JabRef supports. (https://github.com/JabRef/jabref/pull/3710) - We added another CLI functionality for reading and writing metadata to pdfs. (see https://github.com/JabRef/jabref/pull/3756 and see http://help.jabref.org/en/CommandLine) - We no longer print errors in field values during autosave into the log [#3811](https://github.com/JabRef/jabref/issues/3811) +- We improved the search performance by adding a short delay before starting to display search results [Bug report in the forum](http://discourse.jabref.org/t/poor-performance-of-jabref-4/1110/2) ### Fixed - We fixed several performance problems with the management of journal abbreviations [#3323](https://github.com/JabRef/jabref/issues/3323) @@ -56,6 +57,7 @@ The new default removes the linked file from the entry instead of deleting the f - We fixed the name of the group editing window to "Add group" instead of "Edit Group" when adding a new group. [koppor#277](https://github.com/koppor/jabref/issues/277) - We fixed the `pureauth` [BibTeX key generator pattern](https://help.jabref.org/en/BibtexKeyPatterns) to just return the author if no author, but an editor is present. - We fixed an issue where the "Copy linked files" dialog produced an error when the entry had no file [#3818](https://github.com/JabRef/jabref/issues/3818) +- We fixed the coloring of the search box icon in case a user switches to advanced search mode [#3870](https://github.com/JabRef/jabref/issues/3870) - We fixed an issue where pressing del in the `file` field would trigger the delete dialog a second file, if the first file is deleted [#3926](https://github.com/JabRef/jabref/issues/3926) ### Removed diff --git a/build.gradle b/build.gradle index 9b10378ee34..b8e0f547f61 100644 --- a/build.gradle +++ b/build.gradle @@ -158,14 +158,14 @@ dependencies { compile group: 'com.microsoft.azure', name: 'applicationinsights-core', version: '2.0.2' compile group: 'com.microsoft.azure', name: 'applicationinsights-logging-log4j2', version: '2.0.2' - testCompile 'org.junit.jupiter:junit-jupiter-api:5.1.0' - testCompile 'org.junit.jupiter:junit-jupiter-params:5.1.0' - testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.1.0' - testRuntime 'org.junit.vintage:junit-vintage-engine:5.1.0' - testCompile 'org.junit.platform:junit-platform-launcher:1.1.0' + testCompile 'org.junit.jupiter:junit-jupiter-api:5.1.1' + testCompile 'org.junit.jupiter:junit-jupiter-params:5.1.1' + testRuntime 'org.junit.jupiter:junit-jupiter-engine:5.1.1' + testRuntime 'org.junit.vintage:junit-vintage-engine:5.1.1' + testCompile 'org.junit.platform:junit-platform-launcher:1.1.1' testRuntime 'org.apache.logging.log4j:log4j-core:2.11.0' testRuntime 'org.apache.logging.log4j:log4j-jul:2.11.0' - testCompile 'org.mockito:mockito-core:2.17.0' + testCompile 'org.mockito:mockito-core:2.18.0' testCompile 'com.github.tomakehurst:wiremock:2.16.0' testCompile 'org.assertj:assertj-swing-junit:3.8.0' testCompile 'org.reflections:reflections:0.9.11' @@ -175,7 +175,7 @@ dependencies { testCompile "org.testfx:testfx-core:4.0.+" testCompile "org.testfx:testfx-junit5:4.0.+" - checkstyle 'com.puppycrawl.tools:checkstyle:8.8' + checkstyle 'com.puppycrawl.tools:checkstyle:8.9' } jacoco { diff --git a/src/main/java/org/jabref/cli/ArgumentProcessor.java b/src/main/java/org/jabref/cli/ArgumentProcessor.java index cd4e96ce523..618f54e3860 100644 --- a/src/main/java/org/jabref/cli/ArgumentProcessor.java +++ b/src/main/java/org/jabref/cli/ArgumentProcessor.java @@ -41,6 +41,7 @@ import org.jabref.logic.search.SearchQuery; import org.jabref.logic.shared.prefs.SharedDatabasePreferences; import org.jabref.logic.util.OS; +import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.Defaults; import org.jabref.model.EntryTypes; import org.jabref.model.database.BibDatabase; @@ -223,11 +224,6 @@ private List processArguments() { doAuxImport(loaded); } - if (cli.isXmpFacilities()) { - XmpUtilMain.executeXmpConsoleApplicaton(); - System.exit(0); - } - return loaded; } @@ -471,7 +467,8 @@ private void importPreferences() { LayoutFormatterPreferences layoutPreferences = Globals.prefs .getLayoutFormatterPreferences(Globals.journalAbbreviationLoader); SavePreferences savePreferences = SavePreferences.loadForExportFromPreferences(Globals.prefs); - Globals.exportFactory = ExporterFactory.create(customExporters, layoutPreferences, savePreferences); + XmpPreferences xmpPreferences = Globals.prefs.getXMPPreferences(); + Globals.exportFactory = ExporterFactory.create(customExporters, layoutPreferences, savePreferences, xmpPreferences); } catch (JabRefException ex) { LOGGER.error("Cannot import preferences", ex); } diff --git a/src/main/java/org/jabref/cli/JabRefCLI.java b/src/main/java/org/jabref/cli/JabRefCLI.java index e6585516889..f427c8e0dbb 100644 --- a/src/main/java/org/jabref/cli/JabRefCLI.java +++ b/src/main/java/org/jabref/cli/JabRefCLI.java @@ -140,10 +140,6 @@ public String getExportMatches() { return cl.getOptionValue("exportMatches"); } - public boolean isXmpFacilities() { - return cl.hasOption("readAndWriteXmpMetadata"); - } - public boolean isGenerateBibtexKeys() { return cl.hasOption("generateBibtexKeys"); } public boolean isAutomaticallySetFileLinks() { return cl.hasOption("automaticallySetFileLinks"); } @@ -236,11 +232,6 @@ private Options getOptions() { desc(Localization.lang("Automatically set file links")). build()); - options.addOption(Option.builder("xmp"). - longOpt("readAndWriteXmpMetadata"). - desc("Read and write xmp metadata from/to pdf files"). - build()); - return options; } diff --git a/src/main/java/org/jabref/cli/XmpUtilMain.java b/src/main/java/org/jabref/cli/XmpUtilMain.java deleted file mode 100644 index 5ff5ffc6a0d..00000000000 --- a/src/main/java/org/jabref/cli/XmpUtilMain.java +++ /dev/null @@ -1,129 +0,0 @@ -package org.jabref.cli; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.StringWriter; -import java.nio.file.Paths; -import java.util.List; - -import javax.xml.transform.TransformerException; - -import org.jabref.Globals; -import org.jabref.logic.bibtex.BibEntryWriter; -import org.jabref.logic.bibtex.LatexFieldFormatter; -import org.jabref.logic.importer.ImportFormatPreferences; -import org.jabref.logic.importer.ParserResult; -import org.jabref.logic.importer.fileformat.BibtexParser; -import org.jabref.logic.xmp.XmpPreferences; -import org.jabref.logic.xmp.XmpUtilReader; -import org.jabref.logic.xmp.XmpUtilWriter; -import org.jabref.model.database.BibDatabaseMode; -import org.jabref.model.entry.BibEntry; -import org.jabref.preferences.JabRefPreferences; - -public class XmpUtilMain { - - private static XmpPreferences xmpPreferences; - private static ImportFormatPreferences importFormatPreferences; - - private XmpUtilMain() { - } - - /** - * Reads metadata from pdf and print all included bib entries to the console. - * - * @param filename Filename of the pdf file (.pdf) - */ - private static void readPdfAndPrintBib(String filename) throws IOException { - if (filename.endsWith(".pdf")) { - List entryList = XmpUtilReader.readXmp(filename, xmpPreferences); - - BibEntryWriter bibtexEntryWriter = new BibEntryWriter( - new LatexFieldFormatter(Globals.prefs.getLatexFieldFormatterPreferences()), false); - - for (BibEntry entry : entryList) { - StringWriter writer = new StringWriter(); - bibtexEntryWriter.write(entry, writer, BibDatabaseMode.BIBTEX); - System.out.println(writer.getBuffer()); - } - } else { - System.err.println("Insert a file path (.pdf)"); - } - } - - /** - * Writes all entries included in the bib file to the metadata section of the pdf file. - * - * @param bibFile Filename of the bib file (.bib) - * @param pdfFile Filename of the pdf file (.pdf) - */ - private static void writeBibFileToPdfMetadata(String bibFile, String pdfFile) throws FileNotFoundException, IOException, TransformerException { - if (bibFile.endsWith(".bib") && pdfFile.endsWith(".pdf")) { - try (FileReader reader = new FileReader(bibFile)) { - ParserResult result = new BibtexParser(importFormatPreferences, Globals.getFileUpdateMonitor()).parse(reader); - XmpUtilWriter.writeXmp(Paths.get(pdfFile), result.getDatabase().getEntries(), result.getDatabase(), xmpPreferences); - System.out.println("Metadata sucessfully written to Pdf."); - } - } else { - System.err.println("Insert correct file paths (.bib and .pdf)"); - } - } - - /** - * Print usage information for the console tool xmpUtil. - */ - private static void printMenu() { - System.out.println("---------------------Menu-----------------------"); - System.out.println("(0) Exit"); - System.out.println("(1) Read metadata from PDF and print as bibtex"); - System.out.println("(2) Write entries in bib file to Pdf metadata"); - System.out.println(" To report bugs visit https://issues.jabref.org"); - System.out.println("-------------------------------------------------"); - System.out.print("Choose an option: "); - } - - /** - * The tool is implemented as a console application with a read-evaluate-print cycle. - */ - public static void executeXmpConsoleApplicaton() { - if (Globals.prefs == null) { - Globals.prefs = JabRefPreferences.getInstance(); - } - - xmpPreferences = Globals.prefs.getXMPPreferences(); - importFormatPreferences = Globals.prefs.getImportFormatPreferences(); - - BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in)); - - int option = -1; - while (option != 0) { - try { - XmpUtilMain.printMenu(); - option = Integer.parseInt(consoleReader.readLine()); - - if (option == 0) { - break; - } else if (option == 1) { - System.out.print("Insert your filename (.pdf): "); - String filename = consoleReader.readLine().trim(); - XmpUtilMain.readPdfAndPrintBib(filename); - } else if (option == 2) { - System.out.print("Insert your filename (.bib): "); - String bibFile = consoleReader.readLine().trim(); - System.out.print("Insert your filename (.pdf): "); - String pdfFile = consoleReader.readLine().trim(); - XmpUtilMain.writeBibFileToPdfMetadata(bibFile, pdfFile); - } - } catch (IOException | TransformerException e) { - System.err.println(e.getMessage()); - } - } - } - - public static void main(String[] args) { - XmpUtilMain.executeXmpConsoleApplicaton(); - } -} diff --git a/src/main/java/org/jabref/gui/search/GlobalSearchBar.java b/src/main/java/org/jabref/gui/search/GlobalSearchBar.java index 045b3fc19df..26391446b0c 100644 --- a/src/main/java/org/jabref/gui/search/GlobalSearchBar.java +++ b/src/main/java/org/jabref/gui/search/GlobalSearchBar.java @@ -56,16 +56,16 @@ import org.jabref.model.entry.BibEntry; import org.jabref.preferences.SearchPreferences; -import impl.org.controlsfx.skin.AutoCompletePopup; -import org.controlsfx.control.textfield.AutoCompletionBinding; -import org.fxmisc.easybind.EasyBind; +import org.reactfx.util.FxTimer; +import org.reactfx.util.Timer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class GlobalSearchBar extends HBox { + private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchBar.class); private static final Logger LOGGER = LoggerFactory.getLogger(GlobalSearchBar.class); + private static final int SEARCH_DELAY = 400; private static final PseudoClass CLASS_NO_RESULTS = PseudoClass.getPseudoClass("emptyResult"); private static final PseudoClass CLASS_RESULTS_FOUND = PseudoClass.getPseudoClass("emptyResult"); @@ -86,6 +86,13 @@ public class GlobalSearchBar extends HBox { private SearchDisplayMode searchDisplayMode; + private final JLabel searchIcon = new JLabel(IconTheme.JabRefIcon.SEARCH.getIcon()); + + /** + * if this flag is set the searchbar won't be selected after the next search + */ + private boolean dontSelectSearchBar; + public GlobalSearchBar(JabRefFrame frame) { super(); this.frame = Objects.requireNonNull(frame); @@ -244,10 +251,15 @@ private void openLocalFindingsInExternalPanel() { SearchResultFrame searchDialog = new SearchResultFrame(currentBasePanel.frame(), Localization.lang("Search results in library %0 for %1", currentBasePanel.getBibDatabaseContext() - .getDatabaseFile().map(File::getName).orElse(GUIGlobals.UNTITLED_TITLE), + .getDatabasePath() + .map(Path::getFileName) + .map(Path::toString) + .orElse(GUIGlobals.UNTITLED_TITLE), this.getSearchQuery().localize()), getSearchQuery(), false); - List entries = currentBasePanel.getDatabase().getEntries().stream() + List entries = currentBasePanel.getDatabase() + .getEntries() + .stream() .filter(BibEntry::isSearchHit) .collect(Collectors.toList()); searchDialog.addEntries(entries, currentBasePanel); diff --git a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java index 5eb9145f6c5..fe40eb2a640 100644 --- a/src/main/java/org/jabref/logic/exporter/ExporterFactory.java +++ b/src/main/java/org/jabref/logic/exporter/ExporterFactory.java @@ -11,6 +11,7 @@ import org.jabref.logic.journals.JournalAbbreviationLoader; import org.jabref.logic.layout.LayoutFormatterPreferences; import org.jabref.logic.util.FileType; +import org.jabref.logic.xmp.XmpPreferences; import org.jabref.preferences.JabRefPreferences; public class ExporterFactory { @@ -29,7 +30,7 @@ private ExporterFactory(List exporters) { } public static ExporterFactory create(Map customFormats, - LayoutFormatterPreferences layoutPreferences, SavePreferences savePreferences) { + LayoutFormatterPreferences layoutPreferences, SavePreferences savePreferences, XmpPreferences xmpPreferences) { List exporters = new ArrayList<>(); @@ -54,6 +55,8 @@ public static ExporterFactory create(Map customFormats exporters.add(new OpenDocumentSpreadsheetCreator()); exporters.add(new MSBibExporter()); exporters.add(new ModsExporter()); + exporters.add(new XmpExporter(xmpPreferences)); + exporters.add(new XmpPdfExporter(xmpPreferences)); // Now add custom export formats exporters.addAll(customFormats.values()); @@ -65,7 +68,8 @@ public static ExporterFactory create(JabRefPreferences preferences, JournalAbbre Map customFormats = preferences.customExports.getCustomExportFormats(preferences, abbreviationLoader); LayoutFormatterPreferences layoutPreferences = preferences.getLayoutFormatterPreferences(abbreviationLoader); SavePreferences savePreferences = SavePreferences.loadForExportFromPreferences(preferences); - return create(customFormats, layoutPreferences, savePreferences); + XmpPreferences xmpPreferences = preferences.getXMPPreferences(); + return create(customFormats, layoutPreferences, savePreferences, xmpPreferences); } /** diff --git a/src/main/java/org/jabref/logic/exporter/XmpExporter.java b/src/main/java/org/jabref/logic/exporter/XmpExporter.java new file mode 100644 index 00000000000..6a08536ec1c --- /dev/null +++ b/src/main/java/org/jabref/logic/exporter/XmpExporter.java @@ -0,0 +1,72 @@ +package org.jabref.logic.exporter; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import org.jabref.logic.util.FileType; +import org.jabref.logic.xmp.XmpPreferences; +import org.jabref.logic.xmp.XmpUtilWriter; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.BibEntry; + +/** + * A custom exporter to write bib entries to a .xmp file for further processing + * in other scenarios and applications. The xmp metadata are written in dublin + * core format. + */ +public class XmpExporter extends Exporter { + + private static final String XMP_SPLIT_PATTERN = "split"; + + private final XmpPreferences xmpPreferences; + + public XmpExporter(XmpPreferences xmpPreferences) { + super("xmp", FileType.PLAIN_XMP.getDescription(), FileType.PLAIN_XMP); + this.xmpPreferences = xmpPreferences; + } + + @Override + public void export(BibDatabaseContext databaseContext, Path file, Charset encoding, List entries) throws Exception { + Objects.requireNonNull(databaseContext); + Objects.requireNonNull(file); + Objects.requireNonNull(entries); + + if (entries.isEmpty()) { + return; + } + + // This is a distinction between writing all entries from the supplied list to a single .xmp file, + // or write every entry to a separate file. + if (file.getFileName().toString().trim().equals(XMP_SPLIT_PATTERN)) { + + for (BibEntry entry : entries) { + // Avoid situations, where two cite keys are null + Path entryFile; + String suffix = entry.getId() + "_" + entry.getCiteKey() + ".xmp"; + if (file.getParent() == null) { + entryFile = Paths.get(suffix); + } else { + entryFile = Paths.get(file.getParent().toString() + "/" + suffix); + } + + this.writeBibToXmp(entryFile, Arrays.asList(entry), encoding); + } + } else { + this.writeBibToXmp(file, entries, encoding); + } + } + + private void writeBibToXmp(Path file, List entries, Charset encoding) throws IOException { + try (BufferedWriter writer = Files.newBufferedWriter(file, encoding)) { + writer.write(XmpUtilWriter.generateXmpString(entries, this.xmpPreferences)); + writer.flush(); + } + } +} diff --git a/src/main/java/org/jabref/logic/exporter/XmpPdfExporter.java b/src/main/java/org/jabref/logic/exporter/XmpPdfExporter.java new file mode 100644 index 00000000000..1713dcd2352 --- /dev/null +++ b/src/main/java/org/jabref/logic/exporter/XmpPdfExporter.java @@ -0,0 +1,35 @@ +package org.jabref.logic.exporter; + +import java.nio.charset.Charset; +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; + +import org.jabref.logic.util.FileType; +import org.jabref.logic.xmp.XmpPreferences; +import org.jabref.logic.xmp.XmpUtilWriter; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.BibEntry; + +public class XmpPdfExporter extends Exporter { + + private final XmpPreferences xmpPreferences; + + public XmpPdfExporter(XmpPreferences xmpPreferences) { + super("pdf", FileType.PDF_XMP.getDescription(), FileType.PDF_XMP); + this.xmpPreferences = xmpPreferences; + } + + @Override + public void export(BibDatabaseContext databaseContext, Path pdfFile, Charset encoding, List entries) throws Exception { + + Objects.requireNonNull(databaseContext); + Objects.requireNonNull(pdfFile); + Objects.requireNonNull(entries); + + if (pdfFile.toString().endsWith(".pdf")) { + XmpUtilWriter.writeXmp(pdfFile, entries, databaseContext.getDatabase(), xmpPreferences); + } + } + +} diff --git a/src/main/java/org/jabref/logic/importer/fileformat/PdfXmpImporter.java b/src/main/java/org/jabref/logic/importer/fileformat/PdfXmpImporter.java index 8ed231e1c21..38e4f074e11 100644 --- a/src/main/java/org/jabref/logic/importer/fileformat/PdfXmpImporter.java +++ b/src/main/java/org/jabref/logic/importer/fileformat/PdfXmpImporter.java @@ -33,7 +33,7 @@ public String getName() { @Override public FileType getFileType() { - return FileType.XMP; + return FileType.PDF_XMP; } @Override diff --git a/src/main/java/org/jabref/logic/search/SearchQuery.java b/src/main/java/org/jabref/logic/search/SearchQuery.java index a57b305c148..d33fa4f90ff 100644 --- a/src/main/java/org/jabref/logic/search/SearchQuery.java +++ b/src/main/java/org/jabref/logic/search/SearchQuery.java @@ -84,6 +84,11 @@ private String getLocalizedRegularExpressionDescription() { } } + /** + * Tests if the query is an advanced search query described as described in the help + * + * @return true if the query is an advanced search query + */ public boolean isGrammarBasedSearch() { return rule instanceof GrammarBasedSearchRule; } diff --git a/src/main/java/org/jabref/logic/util/FileType.java b/src/main/java/org/jabref/logic/util/FileType.java index cb1de601dc0..f9f67cbfe03 100644 --- a/src/main/java/org/jabref/logic/util/FileType.java +++ b/src/main/java/org/jabref/logic/util/FileType.java @@ -49,7 +49,8 @@ public enum FileType { RIS(Localization.lang("%0 file", "RIS"), "ris"), SILVER_PLATTER(Localization.lang("%0 file", "SilverPlatter"), "dat", "txt"), SIMPLE_HTML(Localization.lang("%0 file", Localization.lang("Simple HTML")), "html"), - XMP(Localization.lang("XMP-annotated PDF"), "pdf"), + PDF_XMP(Localization.lang("XMP-annotated PDF"), "pdf"), + PLAIN_XMP(Localization.lang("%0 file", "XMP"), "xmp"), AUX(Localization.lang("%0 file", "AUX"), "aux"), JSTYLE(Localization.lang("Style file"), "jstyle"), diff --git a/src/main/java/org/jabref/logic/xmp/XmpUtilWriter.java b/src/main/java/org/jabref/logic/xmp/XmpUtilWriter.java index 45f10167009..b11dae2f24b 100644 --- a/src/main/java/org/jabref/logic/xmp/XmpUtilWriter.java +++ b/src/main/java/org/jabref/logic/xmp/XmpUtilWriter.java @@ -3,6 +3,8 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -82,15 +84,38 @@ public static void writeXmp(Path file, BibEntry entry, XmpUtilWriter.writeXmp(file, bibEntryList, database, xmpPreferences); } + /** + * Writes the information of the bib entry to the dublin core schema using + * a custom extractor. + * + * @param dcSchema Dublin core schema, which is filled with the bib entry. + * @param entry The entry, which is added to the dublin core metadata. + * @param database maybenull An optional database which the given bibtex entries belong to, which will be used to + * resolve strings. If the database is null the strings will not be resolved. + * @param xmpPreferences The user's xmp preferences. + */ private static void writeToDCSchema(DublinCoreSchema dcSchema, BibEntry entry, BibDatabase database, XmpPreferences xmpPreferences) { BibEntry resolvedEntry = XmpUtilWriter.getDefaultOrDatabaseEntry(entry, database); - DublinCoreExtractor dcExtractor = new DublinCoreExtractor(dcSchema, xmpPreferences, resolvedEntry); - dcExtractor.fillDublinCoreSchema(); + writeToDCSchema(dcSchema, resolvedEntry, xmpPreferences); } + /** + * Writes the information of the bib entry to the dublin core schema using + * a custom extractor. + * + * @param dcSchema Dublin core schema, which is filled with the bib entry. + * @param entry The entry, which is added to the dublin core metadata. + * @param xmpPreferences The user's xmp preferences. + */ + private static void writeToDCSchema(DublinCoreSchema dcSchema, BibEntry entry, + XmpPreferences xmpPreferences) { + + DublinCoreExtractor dcExtractor = new DublinCoreExtractor(dcSchema, xmpPreferences, entry); + dcExtractor.fillDublinCoreSchema(); + } /** * Try to write the given BibTexEntry as a DublinCore XMP Schema @@ -139,7 +164,14 @@ private static void writeDublinCore(PDDocument document, if (metaRaw == null) { meta = XMPMetadata.createXMPMetadata(); } else { - meta = XmpUtilShared.parseXmpMetadata(metaRaw.createInputStream()); + try { + meta = XmpUtilShared.parseXmpMetadata(metaRaw.createInputStream()); + // In case, that the pdf file has no namespace definition for xmp, + // but metadata in a different format, the parser throws an exception + // Creating an empty xmp metadata element solves this problem + } catch (IOException e) { + meta = XMPMetadata.createXMPMetadata(); + } } // Remove all current Dublin-Core schemas @@ -159,6 +191,38 @@ private static void writeDublinCore(PDDocument document, catalog.setMetadata(metadataStream); } + /** + * This method generates an xmp metadata string in dublin core format. + *
+ * + * @param entries A list of entries, which are added to the dublin core metadata. + * @param xmpPreferences The user's xmp preferences. + * + * @return If something goes wrong (e.g. an exception is thrown), the method returns an empty string, + * otherwise it returns the xmp metadata as a string in dublin core format. + */ + public static String generateXmpString(List entries, XmpPreferences xmpPreferences) { + XMPMetadata meta = XMPMetadata.createXMPMetadata(); + for (BibEntry entry : entries) { + DublinCoreSchema dcSchema = meta.createAndAddDublinCoreSchema(); + XmpUtilWriter.writeToDCSchema(dcSchema, entry, xmpPreferences); + } + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + XmpSerializer serializer = new XmpSerializer(); + serializer.serialize(meta, os, true); + return os.toString(StandardCharsets.UTF_8.name()); + } catch (TransformerException e) { + LOGGER.warn("Tranformation into xmp not possible: " + e.getMessage(), e); + return ""; + } catch (UnsupportedEncodingException e) { + LOGGER.warn("Unsupported encoding to UTF-8 of bib entries in xmp metadata.", e); + return ""; + } catch (IOException e) { + LOGGER.warn("IO Exception thrown by closing the output stream.", e); + return ""; + } + } + /** * Try to write the given BibTexEntry in the Document Information (the * properties of the pdf). diff --git a/src/main/java/org/jabref/model/search/rules/GrammarBasedSearchRule.java b/src/main/java/org/jabref/model/search/rules/GrammarBasedSearchRule.java index 8d8aba8fd81..eaa6cd3840e 100644 --- a/src/main/java/org/jabref/model/search/rules/GrammarBasedSearchRule.java +++ b/src/main/java/org/jabref/model/search/rules/GrammarBasedSearchRule.java @@ -27,6 +27,8 @@ /** * The search query must be specified in an expression that is acceptable by the Search.g4 grammar. + * + * This class implements the "Advanced Search Mode" described in the help */ public class GrammarBasedSearchRule implements SearchRule { diff --git a/src/main/java/org/jabref/model/search/rules/SearchRules.java b/src/main/java/org/jabref/model/search/rules/SearchRules.java index f4046d1a2a7..1dd4b5b1d89 100644 --- a/src/main/java/org/jabref/model/search/rules/SearchRules.java +++ b/src/main/java/org/jabref/model/search/rules/SearchRules.java @@ -1,9 +1,12 @@ package org.jabref.model.search.rules; -import org.jabref.model.strings.StringUtil; +import java.util.regex.Pattern; public class SearchRules { + + private static final Pattern SIMPLE_EXPRESSION = Pattern.compile("[^\\p{Punct}]*"); + private SearchRules() { } @@ -11,7 +14,7 @@ private SearchRules() { * Returns the appropriate search rule that fits best to the given parameter. */ public static SearchRule getSearchRuleByQuery(String query, boolean caseSensitive, boolean regex) { - if (StringUtil.isBlank(query)) { + if (isSimpleQuery(query)) { return new ContainBasedSearchRule(caseSensitive); } @@ -25,6 +28,10 @@ public static SearchRule getSearchRuleByQuery(String query, boolean caseSensitiv } } + private static boolean isSimpleQuery(String query) { + return SIMPLE_EXPRESSION.matcher(query).matches(); + } + private static SearchRule getSearchRule(boolean caseSensitive, boolean regex) { if (regex) { return new RegexBasedSearchRule(caseSensitive); diff --git a/src/main/resources/l10n/JabRef_fr.properties b/src/main/resources/l10n/JabRef_fr.properties index 41e5c3629dd..885dd523fdf 100644 --- a/src/main/resources/l10n/JabRef_fr.properties +++ b/src/main/resources/l10n/JabRef_fr.properties @@ -110,7 +110,7 @@ Assigned\ 1\ entry\ to\ group\ "%0".=Une entrée ajoutée au groupe "%0". Attach\ URL=Attacher l'URL -Attempt\ to\ automatically\ set\ file\ links\ for\ your\ entries.\ Automatically\ setting\ works\ if\ a\ file\ in\ your\ file\ directory
or\ a\ subdirectory\ is\ named\ identically\ to\ an\ entry's\ BibTeX\ key,\ plus\ extension.=Cela tente de définir automatiquement les liens fichier de vos entrées.
La définition automatique fonctionne si un fichier dans votre répertoire fichier
ou dans un sous-répertoire porte le même nom que la clef d'une entrée BibTeX,
l'extension en plus. +Attempt\ to\ automatically\ set\ file\ links\ for\ your\ entries.\ Automatically\ setting\ works\ if\ a\ file\ in\ your\ file\ directory
or\ a\ subdirectory\ is\ named\ identically\ to\ an\ entry's\ BibTeX\ key,\ plus\ extension.=Tente de définir automatiquement les liens de fichier de vos entrées.
La définition automatique fonctionne si un fichier dans votre répertoire de fichiers
ou dans un sous-répertoire porte le même nom que la clef d'une entrée BibTeX,
l'extension en plus. Autodetect\ format=Détection automatique du format @@ -124,7 +124,7 @@ Automatically\ create\ groups=Créer automatiquement des groupes Automatically\ remove\ exact\ duplicates=Supprimer automatiquement les doublons identiques -Allow\ overwriting\ existing\ links.=Ecraser les liens existants. +Allow\ overwriting\ existing\ links.=Écraser les liens existants. Do\ not\ overwrite\ existing\ links.=Ne pas écraser les liens existants. @@ -181,7 +181,7 @@ Changed\ language\ settings=Paramètres linguistiques modifiés Changed\ preamble=Préambule modifié -Check\ existing\ file\ links=Vérifier les liens fichier existants +Check\ existing\ file\ links=Vérifier les liens de fichier existants Check\ links=Vérifier les liens @@ -252,11 +252,11 @@ Could\ not\ instantiate\ %0\ %1=N'a pas pu initialiser %0 %1 Could\ not\ instantiate\ %0.\ Have\ you\ chosen\ the\ correct\ package\ path?=%0 a échoué. Avez-vous choisi le chemin de paquetage correct ? Could\ not\ open\ link=Le lien n'a pas pu être ouvert -Could\ not\ print\ preview=Echec de l'impression de l'aperçu +Could\ not\ print\ preview=Échec de l'impression de l'aperçu Could\ not\ run\ the\ 'vim'\ program.=Le programme 'vim' n'a pas pu être lancé. -Could\ not\ save\ file.=Le fichier n'a pas pu être enregistré . +Could\ not\ save\ file.=Le fichier n'a pas pu être enregistré. Character\ encoding\ '%0'\ is\ not\ supported.=L'encodage de caractères '%0' n'est pas supporté. crossreferenced\ entries\ included=Entrées avec références croisées incluses @@ -383,8 +383,8 @@ Edit=Editer Edit\ custom\ export=Editer l'exportation personnalisée Edit\ entry=Editer l'entrée -Save\ file=Editer le lien de fichier -Edit\ file\ type=Editer le type de fichier +Save\ file=Enregistrer un fichier +Edit\ file\ type=Éditer le type de fichier Add\ group=Ajouter un groupe Edit\ group=Editer le groupe @@ -433,8 +433,8 @@ Error\ opening\ file=Erreur lors de l'ouverture du fichier Error\ while\ writing=Erreur lors de l'écriture -'%0'\ exists.\ Overwrite\ file?='%0' existe. Ecraser le fichier ? -Overwrite\ file?=Ecraser le fichier ? +'%0'\ exists.\ Overwrite\ file?='%0' existe. Écraser le fichier ? +Overwrite\ file?=Écraser le fichier ? Export=Exporter @@ -505,7 +505,7 @@ Filter\ None=Aucun filtre Finished\ automatically\ setting\ external\ links.=La définition automatique des liens externes est terminée. -Finished\ synchronizing\ file\ links.\ Entries\ changed\:\ %0.=Synchronisation des liens fichier terminée. Entrées modifiées \: %0. +Finished\ synchronizing\ file\ links.\ Entries\ changed\:\ %0.=Synchronisation des liens de fichier terminée. Entrées modifiées \: %0. Finished\ writing\ XMP\ for\ %0\ file\ (%1\ skipped,\ %2\ errors).=Fin de l'écriture des XMP pour %0 fichiers (%1 passés, %2 erreurs). First\ select\ the\ entries\ you\ want\ keys\ to\ be\ generated\ for.=Commencez par sélectionner les entrées pour lesquelles vous voulez que des clefs soient générées. @@ -693,7 +693,7 @@ Link\ local\ file=Lier le fichier local Link\ to\ file\ %0=Lien vers le fichier %0 Listen\ for\ remote\ operation\ on\ port=Ecouter le port pour des opérations à distance -Load\ and\ Save\ preferences\ from/to\ jabref.xml\ on\ start-up\ (memory\ stick\ mode)=Charger et enregistrer les préférences de/vers jabref.xml au démarrage (mode clef mémoire) +Load\ and\ Save\ preferences\ from/to\ jabref.xml\ on\ start-up\ (memory\ stick\ mode)=Charger et enregistrer les préférences de/vers jabref.xml au démarrage (mode clef-mémoire) Look\ and\ feel=Apparence Main\ file\ directory=Répertoire de fichiers principal @@ -825,7 +825,7 @@ Open\ file=Ouvrir un fichier Open\ last\ edited\ libraries\ at\ startup=Ouvrir les fichiers de la dernière session au démarrage -Connect\ to\ shared\ database=Ouvrir base partagée +Connect\ to\ shared\ database=Se connecter à une base de données partagée Open\ terminal\ here=Ouvrir un terminal ici @@ -857,9 +857,9 @@ Override\ the\ BibTeX\ field\ by\ the\ selected\ text=Remplacer la clef BibTeX p Overwrite=Ecraser -Overwrite\ existing\ field\ values=Ecraser les valeurs existantes du champ +Overwrite\ existing\ field\ values=Écraser les valeurs existantes du champ -Overwrite\ keys=Ecraser les clefs +Overwrite\ keys=Écraser les clefs pairs\ processed=paires traitées Password=Mot de passe @@ -918,7 +918,7 @@ Previous\ entry=Entrée précédente Primary\ sort\ criterion=Critère de tri principal Problem\ with\ parsing\ entry=Problème de traitement d'une entrée Processing\ %0=Traitement de %0 -Pull\ changes\ from\ shared\ database=Récupérer les modif. depuis la base partagée +Pull\ changes\ from\ shared\ database=Récupérer les modifications depuis la base de données partagée Pushed\ citations\ to\ %0=Envoyer les citations vers %0 @@ -1025,9 +1025,9 @@ Save\ before\ closing=Enregistrement avant fermeture Save\ library=Enregistrement le fichier Save\ library\ as...=Enregistrement le fichier sous... -Save\ entries\ in\ their\ original\ order=Enregistrement les entrées dans leur ordre original +Save\ entries\ in\ their\ original\ order=Enregistrer les entrées dans leur ordre original -Save\ failed=Echec de l'enregistrement +Save\ failed=Échec de l'enregistrement Save\ failed\ during\ backup\ creation=L'enregistrement a échoué durant la création de la copie de secours @@ -1132,13 +1132,13 @@ Strings=Chaîne Strings\ for\ library=Chaînes pour le fichier -Sublibrary\ from\ AUX=Sous-fichier à partir de LaTeX AUX +Sublibrary\ from\ AUX=Sous-fichier à partir du LaTeX AUX Switches\ between\ full\ and\ abbreviated\ journal\ name\ if\ the\ journal\ name\ is\ known.=Basculer entre les noms de journaux développés et abrégés si le nom de journal est connu. Synchronize\ file\ links=Synchroniser les liens vers les fichiers -Synchronizing\ file\ links...=Synchronisation des liens fichier... +Synchronizing\ file\ links...=Synchronisation des liens vers les fichiers... Table\ appearance=Apparence de la table @@ -1201,7 +1201,7 @@ This\ group\ contains\ entries\ based\ on\ manual\ assignment.\ Entries\ can\ be This\ group\ contains\ entries\ whose\ %0\ field\ contains\ the\ keyword\ %1=Ce groupe contient des entrées dont le champ %0 contient le mot-clef %1 This\ group\ contains\ entries\ whose\ %0\ field\ contains\ the\ regular\ expression\ %1=Ce groupe contient des entrées dont le champ %0 contient l'expression régulière %1 -This\ makes\ JabRef\ look\ up\ each\ file\ link\ and\ check\ if\ the\ file\ exists.\ If\ not,\ you\ will\ be\ given\ options
to\ resolve\ the\ problem.=JabRef cherche chaque fichier lien et vérifie si le fichier existe. Si non, des options vous seront proposées
pour résoudre le problème. +This\ makes\ JabRef\ look\ up\ each\ file\ link\ and\ check\ if\ the\ file\ exists.\ If\ not,\ you\ will\ be\ given\ options
to\ resolve\ the\ problem.=JabRef cherche chaque lien de fichier et vérifie si le fichier existe. Si non, des options vous seront proposées
pour résoudre le problème. This\ operation\ requires\ all\ selected\ entries\ to\ have\ BibTeX\ keys\ defined.=Cette opération nécessite que toutes les entrées sélectionnées aient des clefs BibTeX définies @@ -1280,7 +1280,7 @@ web\ link=Lien internet What\ do\ you\ want\ to\ do?=Que voulez-vous faire ? When\ adding/removing\ keywords,\ separate\ them\ by=Lors de l'ajout/suppression de mots-clefs, les séparer avec -Will\ write\ XMP-metadata\ to\ the\ PDFs\ linked\ from\ selected\ entries.=Ecrit les métadonnées XMP dans les PDFs liés aux entrées sélectionnées +Will\ write\ XMP-metadata\ to\ the\ PDFs\ linked\ from\ selected\ entries.=Écrira les métadonnées XMP dans les PDFs liés aux entrées sélectionnées. with=avec @@ -1312,7 +1312,7 @@ Query\ '%0'\ with\ fetcher\ '%1'\ did\ not\ return\ any\ results.=Le requête '% Move\ file=Déplacer fichier Rename\ file=Renommer le fichier -Move\ file\ failed=Echec du déplacement du fichier +Move\ file\ failed=Échec du déplacement du fichier Could\ not\ move\ file\ '%0'.=Le fichier '%0' n'a pas pu être déplacé. Could\ not\ find\ file\ '%0'.=Le fichier '%0' n'a pas pu être trouvé. Number\ of\ entries\ successfully\ imported=Nombre d'entrées importées avec succès @@ -1326,9 +1326,9 @@ Show\ global\ search\ results\ in\ a\ window=Afficher les résultats de recherch Search\ in\ all\ open\ libraries=Rechercher sur tous les fichiers ouverts Move\ file\ to\ file\ directory?=Déplacer le fichier vers le répertoire de fichiers ? -Library\ is\ protected.\ Cannot\ save\ until\ external\ changes\ have\ been\ reviewed.=Le fichier est protégée. L'enregistrement ne peut être effectué tant que les changements externes n'auront pas été vérifiés. +Library\ is\ protected.\ Cannot\ save\ until\ external\ changes\ have\ been\ reviewed.=Le fichier est protégé. L'enregistrement ne peut pas être effectué tant que les changements externes n'auront pas été vérifiés. Protected\ library=Fichier protégée -Refuse\ to\ save\ the\ library\ before\ external\ changes\ have\ been\ reviewed.=Refuser d'enregistrer le fichier tant que les changements externes ne sont pas vérifiés. +Refuse\ to\ save\ the\ library\ before\ external\ changes\ have\ been\ reviewed.=Refus d'enregistrement du fichier tant que les changements externes ne sont pas vérifiés. Library\ protection=Protection du fichier Unable\ to\ save\ library=Impossible d'enregistrer le fichier @@ -1387,7 +1387,7 @@ Error\ opening\ file\ '%0'.=Erreur lors de l'ouverture du fichier '%0'. Formatter\ not\ found\:\ %0=Formateur non trouvé \: %0 Clear\ inputarea=Vider la zone de saisie -Could\ not\ save,\ file\ locked\ by\ another\ JabRef\ instance.=Echec de l'enregistrement, le fichier est verrouillé par une autre instance de JabRef. +Could\ not\ save,\ file\ locked\ by\ another\ JabRef\ instance.=Échec de l'enregistrement, le fichier est verrouillé par une autre instance de JabRef. File\ is\ locked\ by\ another\ JabRef\ instance.=Le fichier est verrouillé par une autre instance de JabRef. Do\ you\ want\ to\ override\ the\ file\ lock?=Voulez-vous outrepasser le verrouillage du fichier ? File\ locked=Fichier verrouillé @@ -1399,7 +1399,7 @@ Generate\ groups\ for\ author\ last\ names=Création de groupes pour les noms d' Generate\ groups\ from\ keywords\ in\ a\ BibTeX\ field=Création de groupes à partir de mots-clefs d'un champ BibTeX Enforce\ legal\ characters\ in\ BibTeX\ keys=Imposer des caractères légaux dans les clefs BibTeX -Save\ without\ backup?=Enregistrer sans sauvegarde de secours? +Save\ without\ backup?=Enregistrer sans sauvegarde de secours ? Unable\ to\ create\ backup=Impossible de créer une sauvegarde de secours Move\ file\ to\ file\ directory=Déplacer le fichier vers le répertoire de fichiers Rename\ file\ to=Renommer le fichier en @@ -1435,7 +1435,7 @@ Table\ and\ entry\ editor\ colors=Couleurs de la table et de l'éditeur d'entré General\ file\ directory=Répertoire général User-specific\ file\ directory=Répertoire spécifique à l'utilisateur -Search\ failed\:\ illegal\ search\ expression=Echec de la recherche \: Expression de recherche illégale +Search\ failed\:\ illegal\ search\ expression=Échec de la recherche \: Expression de recherche illégale Show\ ArXiv\ column=Montrer la colonne ArXiv You\ must\ enter\ an\ integer\ value\ in\ the\ interval\ 1025-65535\ in\ the\ text\ field\ for=Vous devez entrer dans le champ texte une valeur entière comprise entre 1025 et 65535 pour @@ -1537,7 +1537,7 @@ You\ need\ to\ select\ one\ of\ your\ open\ libraries\ from\ which\ to\ choose\ First\ select\ entries\ to\ clean\ up.=Commencez par sélectionner les entrées à nettoyer Cleanup\ entry=Nettoyage des entrées Autogenerate\ PDF\ Names=Génération automatique des noms des PDF -Auto-generating\ PDF-Names\ does\ not\ support\ undo.\ Continue?=La génération automatique des noms des PDF ne peut pas être annulée. Continuer? +Auto-generating\ PDF-Names\ does\ not\ support\ undo.\ Continue?=La génération automatique des noms des PDF ne peut pas être annulée. Continuer ? Use\ full\ firstname\ whenever\ possible=Utiliser le prénom en entier quand c'est possible Use\ abbreviated\ firstname\ whenever\ possible=Utiliser le prénom abrégé quand c'est possible @@ -1574,7 +1574,7 @@ Expand\ all=Tout étendre Collapse\ all=Tout masquer Opens\ the\ file\ browser.=Ouvre l'explorateur de fichier. Scan\ directory=Examiner le répertoire -Searches\ the\ selected\ directory\ for\ unlinked\ files.=Rechercher les fichiers non liés dans le répertoire sélectionné +Searches\ the\ selected\ directory\ for\ unlinked\ files.=Recherche les fichiers non liés dans le répertoire sélectionné. Starts\ the\ import\ of\ BibTeX\ entries.=Débuter l'importation des entrées BibTeX Leave\ this\ dialog.=Quitter cette fenêtre de dialogue. Create\ directory\ based\ keywords=Créer les mots-clefs selon le répertoire @@ -1638,21 +1638,21 @@ Correct\ the\ entry,\ and\ reopen\ editor\ to\ display/edit\ source.=Corrigez l' Could\ not\ connect\ to\ a\ running\ gnuserv\ process.\ Make\ sure\ that\ Emacs\ or\ XEmacs\ is\ running,
and\ that\ the\ server\ has\ been\ started\ (by\ running\ the\ command\ 'server-start'/'gnuserv-start').=La connexion à un processus gnuserv actif a échoué. Assurez-vous que Emacs ou XEmacs soit lancé,
et que le serveur a été démarré (en lançant la commande 'server-start'/'gnuserv-start'). Could\ not\ connect\ to\ running\ OpenOffice/LibreOffice.=La connexion à OpenOffice/LibreOffice n'a pas pu être lancée. Make\ sure\ you\ have\ installed\ OpenOffice/LibreOffice\ with\ Java\ support.=Assurez-vous qu'OpenOffice/LibreOffice est installé avec le support Java. -If\ connecting\ manually,\ please\ verify\ program\ and\ library\ paths.=En cas de connexion manuelle, vérifiez les chemins du programme et de la bibliothèque. +If\ connecting\ manually,\ please\ verify\ program\ and\ library\ paths.=En cas de connexion manuelle, vérifiez les chemins du programme et du fichier. Error\ message\:=Message d'erreur \: -If\ a\ pasted\ or\ imported\ entry\ already\ has\ the\ field\ set,\ overwrite.=Si une entrée collée ou importée a le champ déjà paramétré, écraser. +If\ a\ pasted\ or\ imported\ entry\ already\ has\ the\ field\ set,\ overwrite.=Si une entrée collée ou importée a ce champ déjà paramétré, l'écraser. Import\ metadata\ from\ PDF=Importer les méta-données à partir du PDF Not\ connected\ to\ any\ Writer\ document.\ Please\ make\ sure\ a\ document\ is\ open,\ and\ use\ the\ 'Select\ Writer\ document'\ button\ to\ connect\ to\ it.=Pas de connexion à un document Writer. S'il vous plait, assurez-vous qu'un document est ouvert et utiliser le bouton 'Sélectionner un document Writer' pour vous y connecter. Removed\ all\ subgroups\ of\ group\ "%0".=Tous les sous-groupes du groupe "%0" ont été supprimés. To\ disable\ the\ memory\ stick\ mode\ rename\ or\ remove\ the\ jabref.xml\ file\ in\ the\ same\ folder\ as\ JabRef.=Pour désactiver le mode Memory-stick, renommer ou supprimer le fichier jabref.xml dans le même répertoire que JabRef Unable\ to\ connect.\ One\ possible\ reason\ is\ that\ JabRef\ and\ OpenOffice/LibreOffice\ are\ not\ both\ running\ in\ either\ 32\ bit\ mode\ or\ 64\ bit\ mode.=Connexion impossible. Une raison potentielle est que JabRef et OpenOffice/LibreOffice ne fonctionnent pas tous les deux soit en mode 32 bits, soit en mode 64 bits. Use\ the\ following\ delimiter\ character(s)\:=Utiliser le(s) caractère(s) de délimitation suivant \: -When\ downloading\ files,\ or\ moving\ linked\ files\ to\ the\ file\ directory,\ prefer\ the\ BIB\ file\ location\ rather\ than\ the\ file\ directory\ set\ above=Lors du téléchargement de fichiers ou du déplacement de fichiers liées vers le répertoire de fichiers, préférez l'emplacement du fichier BIB au répertoire ci-dessus +When\ downloading\ files,\ or\ moving\ linked\ files\ to\ the\ file\ directory,\ prefer\ the\ BIB\ file\ location\ rather\ than\ the\ file\ directory\ set\ above=Lors du téléchargement de fichiers ou du déplacement de fichiers liées vers le répertoire des fichiers, préférez l'emplacement du fichier BIB au répertoire ci-dessus Your\ style\ file\ specifies\ the\ character\ format\ '%0',\ which\ is\ undefined\ in\ your\ current\ OpenOffice/LibreOffice\ document.=Votre fichier de style spécifie le format de caractère '%0', qui n'est pas défini dans votre document OpenOffice/LibreOffice actuel. Your\ style\ file\ specifies\ the\ paragraph\ format\ '%0',\ which\ is\ undefined\ in\ your\ current\ OpenOffice/LibreOffice\ document.=Votre fichier de style spécifie le format de paragraphe '%0', qui n'est pas défini dans votre document OpenOffice/LibreOffice actuel. Searching...=Recherche... -You\ have\ selected\ more\ than\ %0\ entries\ for\ download.\ Some\ web\ sites\ might\ block\ you\ if\ you\ make\ too\ many\ rapid\ downloads.\ Do\ you\ want\ to\ continue?=Vous avez sélectionné plus de %0 entrées à télécharger. Certains sites web pourraient vous bloquer si vous effectuez de trop nombreux et rapides téléchargements. Voulez-vous continuer? +You\ have\ selected\ more\ than\ %0\ entries\ for\ download.\ Some\ web\ sites\ might\ block\ you\ if\ you\ make\ too\ many\ rapid\ downloads.\ Do\ you\ want\ to\ continue?=Vous avez sélectionné plus de %0 entrées à télécharger. Certains sites web pourraient vous bloquer si vous effectuez de trop nombreux et rapides téléchargements. Voulez-vous continuer ? Confirm\ selection=Confirmez la sélection Add\ {}\ to\ specified\ title\ words\ on\ search\ to\ keep\ the\ correct\ case=Ajouter {} aux mots du titre spécifiés lors d'une recherche pour préserver la casse correcte Import\ conversions=Importer les conversions @@ -1829,7 +1829,7 @@ This\ search\ contains\ entries\ in\ which=Cette recherche contient des entrées Unable\ to\ autodetect\ OpenOffice/LibreOffice\ installation.\ Please\ choose\ the\ installation\ directory\ manually.=La détection automatique de OpenOffice/LibreOffice a échouée. S'il voul plait, sélectionnez manuellement le répertoire d'installation. JabRef\ no\ longer\ supports\ 'ps'\ or\ 'pdf'\ fields.
File\ links\ are\ now\ stored\ in\ the\ 'file'\ field\ and\ files\ are\ stored\ in\ an\ external\ file\ directory.
To\ make\ use\ of\ this\ feature,\ JabRef\ needs\ to\ upgrade\ file\ links.

=JabRef ne gère plus les champs 'ps' et 'pdf'.
Les liens vers les fichiers sont maintenant enregistrés dans le champ 'file' et les fichiers sont enregistrés dans un répertoire externe.
Pour utiliser cette fonctionnalité, JabRef a besoin de mettre à jour les liens vers les fichiers.

-This\ library\ uses\ outdated\ file\ links.=Ce fichier utilise des liens de fichier périmés +This\ library\ uses\ outdated\ file\ links.=Ce fichier utilise des liens de fichier périmés. Clear\ search=Vider la recherche Close\ library=Fermer le fichier @@ -2174,9 +2174,9 @@ Shared\ entry\ is\ no\ longer\ present=L'entrée partagée n'est plus présente The\ BibEntry\ you\ currently\ work\ on\ has\ been\ deleted\ on\ the\ shared\ side.=L'entrée sur laquelle vous travaillez actuellement a été supprimée de la base partagée. You\ can\ restore\ the\ entry\ using\ the\ "Undo"\ operation.=Vous pouvez restaurer l'entrée en utilisant l'opération "Annuler". Remember\ password?=Mémoriser le mot de passe ? -You\ are\ already\ connected\ to\ a\ database\ using\ entered\ connection\ details.=Vous êtes déjà connecté à un fichier en utilisant les informations de connexion entrées. +You\ are\ already\ connected\ to\ a\ database\ using\ entered\ connection\ details.=Vous êtes déjà connecté à une base de données en utilisant les informations de connexion entrées. -Cannot\ cite\ entries\ without\ BibTeX\ keys.\ Generate\ keys\ now?=Citation impossible sans clef BibTeX. Générer les clefs maintenant? +Cannot\ cite\ entries\ without\ BibTeX\ keys.\ Generate\ keys\ now?=Citation impossible sans clef BibTeX. Générer les clefs maintenant ? New\ technical\ report=Nouveau rapport technique %0\ file=%0 fichier @@ -2201,7 +2201,7 @@ Migration\ help\ information=Aide sur la migration Entered\ database\ has\ obsolete\ structure\ and\ is\ no\ longer\ supported.=Ce fichier a une structure obsolète qui n'est plus gérée. However,\ a\ new\ database\ was\ created\ alongside\ the\ pre-3.6\ one.=Ainsi, un nouveau fichier a été créée en parallèle de celle antérieure à la version 3.6. Click\ here\ to\ learn\ about\ the\ migration\ of\ pre-3.6\ databases.=Cliquer ici pour plus de détails sur la migration des fichiers antérieurs à la version 3.6. -Opens\ a\ link\ where\ the\ current\ development\ version\ can\ be\ downloaded=Ouvre un lien d'où-la version de développement actuelle peut être téléchargée +Opens\ a\ link\ where\ the\ current\ development\ version\ can\ be\ downloaded=Ouvre un lien à partir duquel la version de développement actuelle peut être téléchargée See\ what\ has\ been\ changed\ in\ the\ JabRef\ versions=Afficher les changements dans les versions de JabRef Referenced\ BibTeX\ key\ does\ not\ exist=La clef BibTeX référencée n'existe pas Finished\ downloading\ full\ text\ document\ for\ entry\ %0.=Téléchargement terminé pour le texte intégral de l'entrée %0. @@ -2318,7 +2318,7 @@ Remove\ from\ entry=Effacer de l'entrée The\ group\ name\ contains\ the\ keyword\ separator\ "%0"\ and\ thus\ probably\ does\ not\ work\ as\ expected.=Le nom du groupe contient le séparateur de mot-clef "%0" et ne fonctionnera probablement donc pas comme attendu. There\ exists\ already\ a\ group\ with\ the\ same\ name.=Un groupe portant ce nom existe déjà. -Copy\ linked\ files\ to\ folder...=Copier les fichiers liés dans un répertoire... +Copy\ linked\ files\ to\ folder...=Copie les fichiers liés dans un répertoire... Copied\ file\ successfully=Fichier copié avec succès Copying\ files...=Copie des fichiers... Copying\ file\ %0\ of\ entry\ %1=Copie du fichier %0 de l'entrée %1 diff --git a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java index c620578c826..ce7d1058d25 100644 --- a/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/CsvExportFormatTest.java @@ -10,6 +10,7 @@ import java.util.Map; import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -36,7 +37,8 @@ public void setUp() { Map customFormats = new HashMap<>(); LayoutFormatterPreferences layoutPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS); SavePreferences savePreferences = mock(SavePreferences.class); - ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences); + XmpPreferences xmpPreferences = mock(XmpPreferences.class); + ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences, xmpPreferences); exportFormat = exporterFactory.getExporterByName("oocsv").get(); diff --git a/src/test/java/org/jabref/logic/exporter/ExporterTest.java b/src/test/java/org/jabref/logic/exporter/ExporterTest.java index 66dfa4ccc00..7f9584dafe7 100644 --- a/src/test/java/org/jabref/logic/exporter/ExporterTest.java +++ b/src/test/java/org/jabref/logic/exporter/ExporterTest.java @@ -12,6 +12,7 @@ import java.util.Map; import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -57,7 +58,8 @@ public static Collection exportFormats() { Map customFormats = new HashMap<>(); LayoutFormatterPreferences layoutPreferences = mock(LayoutFormatterPreferences.class); SavePreferences savePreferences = mock(SavePreferences.class); - ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences); + XmpPreferences xmpPreferences = mock(XmpPreferences.class); + ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences, xmpPreferences); for (Exporter format : exporterFactory.getExporters()) { result.add(new Object[]{format, format.getDisplayName()}); diff --git a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java index b3661c61a88..053f16f935a 100644 --- a/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java +++ b/src/test/java/org/jabref/logic/exporter/HtmlExportFormatTest.java @@ -10,6 +10,7 @@ import java.util.Map; import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.xmp.XmpPreferences; import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; @@ -37,7 +38,8 @@ public void setUp() { Map customFormats = new HashMap<>(); LayoutFormatterPreferences layoutPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS); SavePreferences savePreferences = mock(SavePreferences.class); - ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences); + XmpPreferences xmpPreferences = mock(XmpPreferences.class); + ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences, xmpPreferences); exportFormat = exporterFactory.getExporterByName("html").get(); diff --git a/src/test/java/org/jabref/logic/exporter/XmpExporterTest.java b/src/test/java/org/jabref/logic/exporter/XmpExporterTest.java new file mode 100644 index 00000000000..28532bed71d --- /dev/null +++ b/src/test/java/org/jabref/logic/exporter/XmpExporterTest.java @@ -0,0 +1,112 @@ +package org.jabref.logic.exporter; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.jabref.logic.layout.LayoutFormatterPreferences; +import org.jabref.logic.xmp.XmpPreferences; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.entry.BibEntry; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.mockito.Answers; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; + +public class XmpExporterTest { + + private Exporter exporter; + private BibDatabaseContext databaseContext; + private Charset encoding; + + @Rule public TemporaryFolder testFolder = new TemporaryFolder(); + + @Before + public void setUp() { + Map customFormats = new HashMap<>(); + LayoutFormatterPreferences layoutPreferences = mock(LayoutFormatterPreferences.class, Answers.RETURNS_DEEP_STUBS); + SavePreferences savePreferences = mock(SavePreferences.class); + XmpPreferences xmpPreferences = mock(XmpPreferences.class); + ExporterFactory exporterFactory = ExporterFactory.create(customFormats, layoutPreferences, savePreferences, xmpPreferences); + + exporter = exporterFactory.getExporterByName("xmp").get(); + + databaseContext = new BibDatabaseContext(); + encoding = StandardCharsets.UTF_8; + } + + @Test + public void exportSingleEntry() throws Exception { + + Path file = testFolder.newFile().toPath(); + + BibEntry entry = new BibEntry(); + entry.setField("author", "Alan Turing"); + + exporter.export(databaseContext, file, encoding, Arrays.asList(entry)); + + List lines = Files.readAllLines(file); + assertTrue(lines.size() == 21); + assertEquals("Alan Turing", lines.get(7).trim()); + } + + @Test + public void writeMutlipleEntriesInASingleFile() throws Exception { + + Path file = testFolder.newFile().toPath(); + + BibEntry entryTuring = new BibEntry(); + entryTuring.setField("author", "Alan Turing"); + + BibEntry entryArmbrust = new BibEntry(); + entryArmbrust.setField("author", "Michael Armbrust"); + entryArmbrust.setCiteKey("Armbrust2010"); + + exporter.export(databaseContext, file, encoding, Arrays.asList(entryTuring, entryArmbrust)); + + List lines = Files.readAllLines(file); + assertTrue(lines.size() == 39); + assertEquals("Alan Turing", lines.get(7).trim()); + assertEquals("Michael Armbrust", lines.get(20).trim()); + } + + @Test + public void writeMultipleEntriesInDifferentFiles() throws Exception { + + Path file = testFolder.newFile("split").toPath(); + + BibEntry entryTuring = new BibEntry(); + entryTuring.setField("author", "Alan Turing"); + + BibEntry entryArmbrust = new BibEntry(); + entryArmbrust.setField("author", "Michael Armbrust"); + entryArmbrust.setCiteKey("Armbrust2010"); + + exporter.export(databaseContext, file, encoding, Arrays.asList(entryTuring, entryArmbrust)); + + List lines = Files.readAllLines(file); + assertTrue(lines.size() == 0); + + Path fileTuring = Paths.get(file.getParent().toString() + "/" + entryTuring.getId() + "_null.xmp"); + List linesTuring = Files.readAllLines(fileTuring); + assertTrue(linesTuring.size() == 21); + assertEquals("Alan Turing", linesTuring.get(7).trim()); + + Path fileArmbrust = Paths.get(file.getParent().toString() + "/" + entryArmbrust.getId() + "_Armbrust2010.xmp"); + List linesArmbrust = Files.readAllLines(fileArmbrust); + assertTrue(linesArmbrust.size() == 26); + assertEquals("Michael Armbrust", linesArmbrust.get(7).trim()); + } +} diff --git a/src/test/java/org/jabref/logic/importer/fileformat/PdfXmpImporterTest.java b/src/test/java/org/jabref/logic/importer/fileformat/PdfXmpImporterTest.java index c67684e122a..9c909ceba1d 100644 --- a/src/test/java/org/jabref/logic/importer/fileformat/PdfXmpImporterTest.java +++ b/src/test/java/org/jabref/logic/importer/fileformat/PdfXmpImporterTest.java @@ -45,7 +45,7 @@ public void testGetFormatName() { @Test public void testsGetExtensions() { - assertEquals(FileType.XMP, importer.getFileType()); + assertEquals(FileType.PDF_XMP, importer.getFileType()); } @Test diff --git a/src/test/java/org/jabref/logic/search/SearchQueryTest.java b/src/test/java/org/jabref/logic/search/SearchQueryTest.java index d2eab079763..029b03ce147 100644 --- a/src/test/java/org/jabref/logic/search/SearchQueryTest.java +++ b/src/test/java/org/jabref/logic/search/SearchQueryTest.java @@ -21,15 +21,15 @@ public void testToString() { @Test public void testIsContainsBasedSearch() { - assertFalse(new SearchQuery("asdf", true, false).isContainsBasedSearch()); - assertFalse(new SearchQuery("asdf", true, true).isContainsBasedSearch()); + assertTrue(new SearchQuery("asdf", true, false).isContainsBasedSearch()); + assertTrue(new SearchQuery("asdf", true, true).isContainsBasedSearch()); assertFalse(new SearchQuery("author=asdf", true, false).isContainsBasedSearch()); } @Test public void testIsGrammarBasedSearch() { - assertTrue(new SearchQuery("asdf", true, false).isGrammarBasedSearch()); - assertTrue(new SearchQuery("asdf", true, true).isGrammarBasedSearch()); + assertFalse(new SearchQuery("asdf", true, false).isGrammarBasedSearch()); + assertFalse(new SearchQuery("asdf", true, true).isGrammarBasedSearch()); assertTrue(new SearchQuery("author=asdf", true, false).isGrammarBasedSearch()); } @@ -186,4 +186,13 @@ public void isMatchedForNormalAndFieldBasedSearchMixed() { } + @Test + public void testSimpleTerm() { + String query = "progress"; + + SearchQuery result = new SearchQuery(query, false, false); + + assertFalse(result.isGrammarBasedSearch()); + } + }