diff --git a/CHANGELOG.md b/CHANGELOG.md index b178e247e46..c79dd4689f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve ### Changed +- The CSL preview styles now also support displaying data from cross references entries that are linked via the `crossref` field [#7378](https://github.com/JabRef/jabref/issues/7378) - We made the Search button in Web Search wider. We also skewed the panel titles to the left [#8397](https://github.com/JabRef/jabref/issues/8397) ### Fixed @@ -21,8 +22,7 @@ Note that this project **does not** adhere to [Semantic Versioning](http://semve ### Removed - - +- We removed the option to copy CSL Citation styles data as `XSL_FO`, `ASCIIDOC`, and `RTF` as these haven not been working since a long time and are no longe rsupported in the external library used for processing the styles [#7378](https://github.com/JabRef/jabref/issues/7378) diff --git a/src/main/java/org/jabref/gui/actions/StandardActions.java b/src/main/java/org/jabref/gui/actions/StandardActions.java index 59d4b2309e8..2f6f5661d34 100644 --- a/src/main/java/org/jabref/gui/actions/StandardActions.java +++ b/src/main/java/org/jabref/gui/actions/StandardActions.java @@ -15,12 +15,8 @@ public enum StandardActions implements Action { COPY_CITE_KEY(Localization.lang("Copy \\cite{citation key}"), KeyBinding.COPY_CITE_CITATION_KEY), COPY_KEY_AND_TITLE(Localization.lang("Copy citation key and title"), KeyBinding.COPY_CITATION_KEY_AND_TITLE), COPY_KEY_AND_LINK(Localization.lang("Copy citation key and link"), KeyBinding.COPY_CITATION_KEY_AND_LINK), - COPY_CITATION_HTML(Localization.lang("Copy citation") + " (HTML)", KeyBinding.COPY_PREVIEW), - COPY_CITATION_MORE(Localization.lang("Copy citation") + "..."), - COPY_CITATION_TEXT("Text"), - COPY_CITATION_RTF("RTF"), - COPY_CITATION_ASCII_DOC("AsciiDoc"), - COPY_CITATION_XSLFO("XSL-FO"), + COPY_CITATION_HTML(Localization.lang("Copy citation (html)"), KeyBinding.COPY_PREVIEW), + COPY_CITATION_TEXT(Localization.lang("Copy citation (text)")), COPY_CITATION_PREVIEW(Localization.lang("Copy preview"), KeyBinding.COPY_PREVIEW), EXPORT_TO_CLIPBOARD(Localization.lang("Export to clipboard"), IconTheme.JabRefIcons.EXPORT_TO_CLIPBOARD), EXPORT_SELECTED_TO_CLIPBOARD(Localization.lang("Export selected entries to clipboard"), IconTheme.JabRefIcons.EXPORT_TO_CLIPBOARD), diff --git a/src/main/java/org/jabref/gui/maintable/RightClickMenu.java b/src/main/java/org/jabref/gui/maintable/RightClickMenu.java index a8b21da429f..2fd06310f21 100644 --- a/src/main/java/org/jabref/gui/maintable/RightClickMenu.java +++ b/src/main/java/org/jabref/gui/maintable/RightClickMenu.java @@ -104,14 +104,9 @@ private static Menu createCopySubMenu(ActionFactory factory, // the submenu will behave dependent on what style is currently selected (citation/preview) PreviewPreferences previewPreferences = preferencesService.getPreviewPreferences(); if (previewPreferences.getSelectedPreviewLayout() instanceof CitationStylePreviewLayout) { - copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.COPY_CITATION_HTML, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences))); - Menu copyCitationMenu = factory.createMenu(StandardActions.COPY_CITATION_MORE); - copyCitationMenu.getItems().addAll( - factory.createMenuItem(StandardActions.COPY_CITATION_TEXT, new CopyCitationAction(CitationStyleOutputFormat.TEXT, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences)), - factory.createMenuItem(StandardActions.COPY_CITATION_RTF, new CopyCitationAction(CitationStyleOutputFormat.RTF, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences)), - factory.createMenuItem(StandardActions.COPY_CITATION_ASCII_DOC, new CopyCitationAction(CitationStyleOutputFormat.ASCII_DOC, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences)), - factory.createMenuItem(StandardActions.COPY_CITATION_XSLFO, new CopyCitationAction(CitationStyleOutputFormat.XSL_FO, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences))); - copySpecialMenu.getItems().add(copyCitationMenu); + copySpecialMenu.getItems().addAll( + factory.createMenuItem(StandardActions.COPY_CITATION_HTML, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences)), + factory.createMenuItem(StandardActions.COPY_CITATION_TEXT, new CopyCitationAction(CitationStyleOutputFormat.TEXT, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences))); } else { copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.COPY_CITATION_PREVIEW, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, previewPreferences))); } diff --git a/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java b/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java index d80c2ee4013..256bb7ebd52 100644 --- a/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java +++ b/src/main/java/org/jabref/gui/preferences/preview/PreviewTabViewModel.java @@ -26,6 +26,7 @@ import org.jabref.gui.DialogService; import org.jabref.gui.DragAndDropDataFormats; +import org.jabref.gui.Globals; import org.jabref.gui.StateManager; import org.jabref.gui.preferences.PreferenceTabViewModel; import org.jabref.gui.util.BackgroundTask; @@ -121,7 +122,7 @@ public void setValues() { BackgroundTask.wrap(CitationStyle::discoverCitationStyles) .onSuccess(styles -> styles.stream() - .map(CitationStylePreviewLayout::new) + .map(style-> new CitationStylePreviewLayout(style, Globals.entryTypesManager)) .filter(style -> chosenListProperty.getValue().filtered(item -> item.getName().equals(style.getName())).isEmpty()) .sorted(Comparator.comparing(PreviewLayout::getName)) diff --git a/src/main/java/org/jabref/gui/preview/CopyCitationAction.java b/src/main/java/org/jabref/gui/preview/CopyCitationAction.java index dcdbf833ba7..453e81b3d9e 100644 --- a/src/main/java/org/jabref/gui/preview/CopyCitationAction.java +++ b/src/main/java/org/jabref/gui/preview/CopyCitationAction.java @@ -85,7 +85,7 @@ private List generateCitations() throws IOException { } if (styleSource != null) { - return CitationStyleGenerator.generateCitations(selectedEntries, styleSource, outputFormat); + return CitationStyleGenerator.generateCitations(selectedEntries, styleSource, outputFormat, stateManager.getActiveDatabase().get(), Globals.entryTypesManager); } else { return generateTextBasedPreviewLayoutCitations(); } @@ -126,46 +126,6 @@ protected static ClipboardContent processText(List citations) { return content; } - /** - * Converts the citations into the RTF format. - */ - protected static ClipboardContent processRtf(List citations) { - String result = "{\\rtf" + OS.NEWLINE + - String.join(CitationStyleOutputFormat.RTF.getLineSeparator(), citations) + - "}"; - ClipboardContent content = new ClipboardContent(); - content.putString(result); - content.putRtf(result); - return content; - } - - /** - * Inserts each citation into a XLSFO body and copies it to the clipboard - */ - protected static ClipboardContent processXslFo(List citations) { - String result = "" + OS.NEWLINE + - "" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + OS.NEWLINE; - - result += String.join(CitationStyleOutputFormat.XSL_FO.getLineSeparator(), citations); - - result += OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - "" + OS.NEWLINE; - - ClipboardContent content = new ClipboardContent(); - content.putString(result); - content.put(ClipBoardManager.XML, result); - return content; - } - /** * Inserts each citation into a HTML body and copies it to the clipboard */ @@ -197,9 +157,7 @@ private void setClipBoardContent(List citations) { ClipboardContent content; switch (outputFormat) { case HTML -> content = processHtml(citations); - case RTF -> content = processRtf(citations); - case XSL_FO -> content = processXslFo(citations); - case ASCII_DOC, TEXT -> content = processText(citations); + case TEXT -> content = processText(citations); default -> { LOGGER.warn("unknown output format: '" + outputFormat + "', processing it via the default."); content = processText(citations); diff --git a/src/main/java/org/jabref/gui/preview/PreviewViewer.java b/src/main/java/org/jabref/gui/preview/PreviewViewer.java index d0377175af9..0c2c1cd2e70 100644 --- a/src/main/java/org/jabref/gui/preview/PreviewViewer.java +++ b/src/main/java/org/jabref/gui/preview/PreviewViewer.java @@ -233,7 +233,7 @@ private void update() { ExporterFactory.entryNumber = 1; // Set entry number in case that is included in the preview layout. BackgroundTask - .wrap(() -> layout.generatePreview(entry.get(), database.getDatabase())) + .wrap(() -> layout.generatePreview(entry.get(), database)) .onRunning(() -> setPreviewText("" + Localization.lang("Processing %0", Localization.lang("Citation Style")) + ": " + layout.getDisplayName() + " ..." + "")) .onSuccess(this::setPreviewText) .onFailure(exception -> { diff --git a/src/main/java/org/jabref/logic/bst/BstPreviewLayout.java b/src/main/java/org/jabref/logic/bst/BstPreviewLayout.java index 545dce5ba6d..d0c040842fd 100644 --- a/src/main/java/org/jabref/logic/bst/BstPreviewLayout.java +++ b/src/main/java/org/jabref/logic/bst/BstPreviewLayout.java @@ -11,7 +11,7 @@ import org.jabref.logic.layout.format.RemoveLatexCommandsFormatter; import org.jabref.logic.layout.format.RemoveTilde; import org.jabref.logic.preview.PreviewLayout; -import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.slf4j.Logger; @@ -42,7 +42,7 @@ public BstPreviewLayout(Path path) { } @Override - public String generatePreview(BibEntry originalEntry, BibDatabase database) { + public String generatePreview(BibEntry originalEntry, BibDatabaseContext databaseContext) { if (error != null) { return error; } diff --git a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java index a831e074552..88467782466 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java +++ b/src/main/java/org/jabref/logic/citationstyle/CSLAdapter.java @@ -6,9 +6,14 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.Set; import org.jabref.logic.formatter.bibtexfields.RemoveNewlinesFormatter; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.BibEntryType; +import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.entry.Month; import org.jabref.model.entry.field.Field; import org.jabref.model.entry.field.StandardField; @@ -49,9 +54,10 @@ public class CSLAdapter { /** * Creates the bibliography of the provided items. This method needs to run synchronized because the underlying * CSL engine is not thread-safe. + * @param databaseContext {@link BibDatabaseContext} is used to be able to resolve fields and their aliases */ - public synchronized List makeBibliography(List bibEntries, String style, CitationStyleOutputFormat outputFormat) throws IOException, IllegalArgumentException { - dataProvider.setData(bibEntries); + public synchronized List makeBibliography(List bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) throws IOException, IllegalArgumentException { + dataProvider.setData(bibEntries, databaseContext, entryTypesManager); initialize(style, outputFormat); cslInstance.registerCitationItems(dataProvider.getIds()); final Bibliography bibliography = cslInstance.makeBibliography(); @@ -86,18 +92,26 @@ private void initialize(String newStyle, CitationStyleOutputFormat newFormat) th private static class JabRefItemDataProvider implements ItemDataProvider { private final List data = new ArrayList<>(); + private BibDatabaseContext bibDatabaseContext; + private BibEntryTypesManager entryTypesManager; /** * Converts the {@link BibEntry} into {@link CSLItemData}. */ - private static CSLItemData bibEntryToCSLItemData(BibEntry bibEntry) { + private static CSLItemData bibEntryToCSLItemData(BibEntry bibEntry, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager) { + String citeKey = bibEntry.getCitationKey().orElse(""); BibTeXEntry bibTeXEntry = new BibTeXEntry(new Key(bibEntry.getType().getName()), new Key(citeKey)); // Not every field is already generated into latex free fields RemoveNewlinesFormatter removeNewlinesFormatter = new RemoveNewlinesFormatter(); - for (Field key : bibEntry.getFieldMap().keySet()) { - bibEntry.getField(key) + + Optional entryType = entryTypesManager.enrich(bibEntry.getType(), bibDatabaseContext.getMode()); + + Set fields = entryType.map(BibEntryType::getAllFields).orElse(bibEntry.getFields()); + + for (Field key : fields) { + bibEntry.getResolvedFieldOrAlias(key, bibDatabaseContext.getDatabase()) .map(removeNewlinesFormatter::format) .map(LatexToUnicodeAdapter::format) .ifPresent(value -> { @@ -106,21 +120,24 @@ private static CSLItemData bibEntryToCSLItemData(BibEntry bibEntry) { value = bibEntry.getMonth().map(Month::getShortName).orElse(value); } bibTeXEntry.addField(new Key(key.getName()), new DigitStringValue(value)); + }); } return BIBTEX_CONVERTER.toItemData(bibTeXEntry); } - public void setData(List data) { + public void setData(List data, BibDatabaseContext bibDatabaseContext, BibEntryTypesManager entryTypesManager) { this.data.clear(); this.data.addAll(data); + this.bibDatabaseContext = bibDatabaseContext; + this.entryTypesManager = entryTypesManager; } @Override public CSLItemData retrieveItem(String id) { return data.stream() .filter(entry -> entry.getCitationKey().orElse("").equals(id)) - .map(JabRefItemDataProvider::bibEntryToCSLItemData) + .map(entry -> JabRefItemDataProvider.bibEntryToCSLItemData(entry, bibDatabaseContext, entryTypesManager)) .findFirst().orElse(null); } diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleCache.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleCache.java index bb7ba7f1f50..f94aaef26d9 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleCache.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleCache.java @@ -24,18 +24,18 @@ public class CitationStyleCache { private PreviewLayout citationStyle; private final LoadingCache citationStyleCache; - public CitationStyleCache(BibDatabaseContext database) { + public CitationStyleCache(BibDatabaseContext databaseContext) { citationStyleCache = CacheBuilder.newBuilder().maximumSize(CACHE_SIZE).build(new CacheLoader() { @Override public String load(BibEntry entry) { if (citationStyle != null) { - return citationStyle.generatePreview(entry, database.getDatabase()); + return citationStyle.generatePreview(entry, databaseContext); } else { return ""; } } }); - database.getDatabase().registerListener(new BibDatabaseEntryListener()); + databaseContext.getDatabase().registerListener(new BibDatabaseEntryListener()); } /** diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java index dfb6c2f846b..d9f5f2f8e45 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleGenerator.java @@ -5,7 +5,9 @@ import java.util.List; import org.jabref.logic.l10n.Localization; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.BibEntryTypesManager; import org.jbibtex.TokenMgrException; import org.slf4j.Logger; @@ -24,21 +26,21 @@ private CitationStyleGenerator() { } /** - * Generates a Citation based on the given entry and style + * Generates a Citation based on the given entry and style with a default {@link BibDatabaseContext} * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - protected static String generateCitation(BibEntry entry, CitationStyle style) { - return generateCitation(entry, style.getSource(), CitationStyleOutputFormat.HTML); + protected static String generateCitation(BibEntry entry, CitationStyle style, BibEntryTypesManager entryTypesManager) { + return generateCitation(entry, style.getSource(), entryTypesManager); } /** - * Generates a Citation based on the given entry and style + * Generates a Citation based on the given entry and style with a default {@link BibDatabaseContext} * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - protected static String generateCitation(BibEntry entry, String style) { - return generateCitation(entry, style, CitationStyleOutputFormat.HTML); + protected static String generateCitation(BibEntry entry, String style, BibEntryTypesManager entryTypesManager) { + return generateCitation(entry, style, CitationStyleOutputFormat.HTML, new BibDatabaseContext(), entryTypesManager); } /** @@ -46,8 +48,8 @@ protected static String generateCitation(BibEntry entry, String style) { * * @implNote the citation is generated using JavaScript which may take some time, better call it from outside the main Thread */ - public static String generateCitation(BibEntry entry, String style, CitationStyleOutputFormat outputFormat) { - return generateCitations(Collections.singletonList(entry), style, outputFormat).stream().findFirst().orElse(""); + public static String generateCitation(BibEntry entry, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { + return generateCitations(Collections.singletonList(entry), style, outputFormat, databaseContext, entryTypesManager).stream().findFirst().orElse(""); } /** @@ -55,9 +57,9 @@ public static String generateCitation(BibEntry entry, String style, CitationStyl * * @implNote The citations are generated using JavaScript which may take some time, better call it from outside the main thread. */ - public static List generateCitations(List bibEntries, String style, CitationStyleOutputFormat outputFormat) { + public static List generateCitations(List bibEntries, String style, CitationStyleOutputFormat outputFormat, BibDatabaseContext databaseContext, BibEntryTypesManager entryTypesManager) { try { - return CSL_ADAPTER.makeBibliography(bibEntries, style, outputFormat); + return CSL_ADAPTER.makeBibliography(bibEntries, style, outputFormat, databaseContext, entryTypesManager); } catch (IllegalArgumentException e) { LOGGER.error("Could not generate BibEntry citation. The CSL engine could not create a preview for your item.", e); return Collections.singletonList(Localization.lang("Cannot generate preview based on selected citation style.")); diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java b/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java index 9596bb140f5..d06763cb2c1 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java @@ -4,11 +4,8 @@ public enum CitationStyleOutputFormat { - ASCII_DOC("asciidoc", ""), HTML("html", OS.NEWLINE + "
" + OS.NEWLINE), - RTF("rtf", "\\line" + OS.NEWLINE), - TEXT("text", ""), - XSL_FO("fo", OS.NEWLINE); + TEXT("text", ""); private final String format; private final String lineSeparator; diff --git a/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java b/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java index 82f7df56f2b..7e790c3ef0e 100644 --- a/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java +++ b/src/main/java/org/jabref/logic/citationstyle/CitationStylePreviewLayout.java @@ -1,19 +1,22 @@ package org.jabref.logic.citationstyle; import org.jabref.logic.preview.PreviewLayout; -import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.BibEntryTypesManager; public class CitationStylePreviewLayout implements PreviewLayout { private final CitationStyle citationStyle; + private final BibEntryTypesManager bibEntryTypesManager; - public CitationStylePreviewLayout(CitationStyle citationStyle) { + public CitationStylePreviewLayout(CitationStyle citationStyle, BibEntryTypesManager bibEntryTypesManager) { this.citationStyle = citationStyle; + this.bibEntryTypesManager = bibEntryTypesManager; } @Override - public String generatePreview(BibEntry entry, BibDatabase database) { - return CitationStyleGenerator.generateCitation(entry, citationStyle.getSource(), CitationStyleOutputFormat.HTML); + public String generatePreview(BibEntry entry, BibDatabaseContext databaseContext) { + return CitationStyleGenerator.generateCitation(entry, citationStyle.getSource(), CitationStyleOutputFormat.HTML, databaseContext, bibEntryTypesManager); } @Override diff --git a/src/main/java/org/jabref/logic/layout/TextBasedPreviewLayout.java b/src/main/java/org/jabref/logic/layout/TextBasedPreviewLayout.java index a3bd00c9f30..bb7091dce3f 100644 --- a/src/main/java/org/jabref/logic/layout/TextBasedPreviewLayout.java +++ b/src/main/java/org/jabref/logic/layout/TextBasedPreviewLayout.java @@ -5,7 +5,7 @@ import org.jabref.logic.l10n.Localization; import org.jabref.logic.preview.PreviewLayout; -import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.slf4j.Logger; @@ -43,9 +43,9 @@ public void setText(String text) { } @Override - public String generatePreview(BibEntry entry, BibDatabase database) { + public String generatePreview(BibEntry entry, BibDatabaseContext databaseContext) { if (layout != null) { - return layout.doLayout(entry, database); + return layout.doLayout(entry, databaseContext.getDatabase()); } else { return ""; } diff --git a/src/main/java/org/jabref/logic/preview/PreviewLayout.java b/src/main/java/org/jabref/logic/preview/PreviewLayout.java index c071646a283..de3f327782c 100644 --- a/src/main/java/org/jabref/logic/preview/PreviewLayout.java +++ b/src/main/java/org/jabref/logic/preview/PreviewLayout.java @@ -2,7 +2,7 @@ import java.util.Locale; -import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; /** @@ -10,7 +10,7 @@ */ public interface PreviewLayout { - String generatePreview(BibEntry entry, BibDatabase database); + String generatePreview(BibEntry entry, BibDatabaseContext databaseContext); String getDisplayName(); diff --git a/src/main/java/org/jabref/logic/util/TestEntry.java b/src/main/java/org/jabref/logic/util/TestEntry.java index a4fcd5104db..ce969371bbe 100644 --- a/src/main/java/org/jabref/logic/util/TestEntry.java +++ b/src/main/java/org/jabref/logic/util/TestEntry.java @@ -20,7 +20,7 @@ public static BibEntry getTestEntry() { entry.setField(StandardField.TITLE, "Title of the test entry"); entry.setField(StandardField.NUMBER, "3"); entry.setField(StandardField.VOLUME, "34"); - entry.setField(StandardField.ISSUE, "3"); + entry.setField(StandardField.ISSUE, "7"); entry.setField(StandardField.YEAR, "2016"); entry.setField(StandardField.PAGES, "45--67"); entry.setField(StandardField.MONTH, "July"); diff --git a/src/main/java/org/jabref/preferences/JabRefPreferences.java b/src/main/java/org/jabref/preferences/JabRefPreferences.java index f01dbf68366..1a942f17da6 100644 --- a/src/main/java/org/jabref/preferences/JabRefPreferences.java +++ b/src/main/java/org/jabref/preferences/JabRefPreferences.java @@ -2460,7 +2460,7 @@ private List getPreviewLayouts(String style) { .map(layout -> { if (CitationStyle.isCitationStyleFile(layout)) { return CitationStyle.createCitationStyleFromFile(layout) - .map(file -> (PreviewLayout) new CitationStylePreviewLayout(file)) + .map(file -> (PreviewLayout) new CitationStylePreviewLayout(file, Globals.entryTypesManager)) .orElse(null); } else { return new TextBasedPreviewLayout(style, getLayoutFormatterPreferences(Globals.journalAbbreviationRepository)); diff --git a/src/main/resources/csl-styles/apa-6th-edition.csl b/src/main/resources/csl-styles/apa-6th-edition.csl new file mode 100644 index 00000000000..775857accbe --- /dev/null +++ b/src/main/resources/csl-styles/apa-6th-edition.csl @@ -0,0 +1,1566 @@ + + diff --git a/src/main/resources/l10n/JabRef_en.properties b/src/main/resources/l10n/JabRef_en.properties index 253237cc5b8..aa255b0d6de 100644 --- a/src/main/resources/l10n/JabRef_en.properties +++ b/src/main/resources/l10n/JabRef_en.properties @@ -172,7 +172,13 @@ Copied=Copied Copy=Copy +Copy\ title=Copy title +Copy\ \\cite{citation\ key}=Copy \\cite{citation key} +Copy\ citation\ (html)=Copy citation (html) +Copy\ citation\ (text)=Copy citation (text) Copy\ citation\ key=Copy citation key +Copy\ citation\ key\ and\ link=Copy citation key and link +Copy\ citation\ key\ and\ title=Copy citation key and title Copy\ to\ clipboard=Copy to clipboard @@ -1297,9 +1303,7 @@ Save\ changes=Save changes Discard\ changes=Discard changes Library\ '%0'\ has\ changed.=Library '%0' has changed. Print\ entry\ preview=Print entry preview -Copy\ title=Copy title -Copy\ \\cite{citation\ key}=Copy \\cite{citation key} -Copy\ citation\ key\ and\ title=Copy citation key and title + Invalid\ DOI\:\ '%0'.=Invalid DOI: '%0'. Same\ DOI\ used\ in\ multiple\ entries=Same DOI used in multiple entries should\ start\ with\ a\ name=should start with a name @@ -1708,7 +1712,6 @@ should\ be\ normalized=should be normalized Empty\ search\ ID=Empty search ID The\ given\ search\ ID\ was\ empty.=The given search ID was empty. -Copy\ citation\ key\ and\ link=Copy citation key and link biblatex\ field\ only=biblatex field only Error\ while\ generating\ fetch\ URL=Error while generating fetch URL @@ -1852,7 +1855,6 @@ Check\ integrity=Check integrity Cleanup\ URL\ link=Cleanup URL link Cleanup\ URL\ link\ by\ removing\ special\ symbols\ and\ extracting\ simple\ link=Cleanup URL link by removing special symbols and extracting simple link Copy\ DOI\ url=Copy DOI url -Copy\ citation=Copy citation Development\ version=Development version Export\ selected\ entries=Export selected entries Export\ selected\ entries\ to\ clipboard=Export selected entries to clipboard diff --git a/src/test/java/org/jabref/gui/preview/CopyCitationActionTest.java b/src/test/java/org/jabref/gui/preview/CopyCitationActionTest.java index 7dec89193c5..b8e686d5387 100644 --- a/src/test/java/org/jabref/gui/preview/CopyCitationActionTest.java +++ b/src/test/java/org/jabref/gui/preview/CopyCitationActionTest.java @@ -4,7 +4,6 @@ import javafx.scene.input.ClipboardContent; -import org.jabref.gui.ClipBoardManager; import org.jabref.logic.util.OS; import org.junit.jupiter.api.Test; @@ -109,94 +108,6 @@ void processText() throws Exception { assertEquals(expected, actual); } - @Test - void processRtf() throws Exception { - String expected = "{\\rtf" + OS.NEWLINE + - "[1]\\tab B. Smith, B. Jones, and J. Williams, \\uc0\\u8220{}Title of the test entry,\\uc0\\u8221{} {\\i{}BibTeX Journal}, vol. 34, no. 3, pp. 45\\uc0\\u8211{}67, Jul. 2016." + OS.NEWLINE + - "\\line" + OS.NEWLINE + - "[1]\\tab B. Smith, B. Jones, and J. Williams, \\uc0\\u8220{}Title of the test entry,\\uc0\\u8221{} {\\i{}BibTeX Journal}, vol. 34, no. 3, pp. 45\\uc0\\u8211{}67, Jul. 2016." + OS.NEWLINE + - "}"; - - String citation = "[1]\\tab B. Smith, B. Jones, and J. Williams, \\uc0\\u8220{}Title of the test entry,\\uc0\\u8221{} {\\i{}BibTeX Journal}, vol. 34, no. 3, pp. 45\\uc0\\u8211{}67, Jul. 2016." + OS.NEWLINE; - ClipboardContent content = CopyCitationAction.processRtf(Arrays.asList(citation, citation)); - - Object actual = content.getRtf(); - assertEquals(expected, actual); - } - - @Test - void processXslFo() throws Exception { - String expected = "" + OS.NEWLINE + - "" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - OS.NEWLINE + - "" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " [1]" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016." + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - "" + OS.NEWLINE + - OS.NEWLINE + - "" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " [1]" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016." + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - "" + OS.NEWLINE + - OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - "" + OS.NEWLINE; - - String citation = "" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " [1]" + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016." + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - " " + OS.NEWLINE + - "" + OS.NEWLINE; - - ClipboardContent xmlTransferable = CopyCitationAction.processXslFo(Arrays.asList(citation, citation)); - - Object actual = xmlTransferable.get(ClipBoardManager.XML); - assertEquals(expected, actual); - } - @Test void processHtmlAsHtml() throws Exception { String expected = "" + OS.NEWLINE + diff --git a/src/test/java/org/jabref/logic/bst/BstPreviewLayoutTest.java b/src/test/java/org/jabref/logic/bst/BstPreviewLayoutTest.java index 5e051fcbaac..f65b8f0f0a8 100644 --- a/src/test/java/org/jabref/logic/bst/BstPreviewLayoutTest.java +++ b/src/test/java/org/jabref/logic/bst/BstPreviewLayoutTest.java @@ -3,6 +3,7 @@ import java.nio.file.Path; import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; import org.jabref.model.entry.BibEntry; import org.jabref.model.entry.field.StandardField; import org.jabref.model.entry.types.StandardEntryType; @@ -14,7 +15,7 @@ class BstPreviewLayoutTest { - private final BibDatabase bibDatabase = mock(BibDatabase.class); + private final BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(); @Test public void generatePreviewForSimpleEntryUsingAbbr() throws Exception { @@ -22,7 +23,7 @@ public void generatePreviewForSimpleEntryUsingAbbr() throws Exception { BibEntry entry = new BibEntry().withField(StandardField.AUTHOR, "Oliver Kopp") .withField(StandardField.TITLE, "Thoughts on Development"); BibDatabase bibDatabase = mock(BibDatabase.class); - String preview = bstPreviewLayout.generatePreview(entry, bibDatabase); + String preview = bstPreviewLayout.generatePreview(entry, bibDatabaseContext); assertEquals("O. Kopp. Thoughts on development.", preview); } @@ -33,21 +34,21 @@ public void monthMayIsCorrectlyRendered() throws Exception { .withField(StandardField.TITLE, "Thoughts on Development") .withField(StandardField.MONTH, "#May#"); BibDatabase bibDatabase = mock(BibDatabase.class); - String preview = bstPreviewLayout.generatePreview(entry, bibDatabase); + String preview = bstPreviewLayout.generatePreview(entry, bibDatabaseContext); assertEquals("O. Kopp. Thoughts on development, May.", preview); } @Test public void generatePreviewForSliceTheoremPaperUsingAbbr() throws Exception { BstPreviewLayout bstPreviewLayout = new BstPreviewLayout(Path.of(BstPreviewLayoutTest.class.getResource("abbrv.bst").toURI())); - String preview = bstPreviewLayout.generatePreview(getSliceTheoremPaper(), bibDatabase); + String preview = bstPreviewLayout.generatePreview(getSliceTheoremPaper(), bibDatabaseContext); assertEquals("T. Diez. Slice theorem for fréchet group actions and covariant symplectic field theory. May 2014.", preview); } @Test public void generatePreviewForSliceTheoremPaperUsingIEEE() throws Exception { BstPreviewLayout bstPreviewLayout = new BstPreviewLayout(Path.of(ClassLoader.getSystemResource("bst/IEEEtran.bst").toURI())); - String preview = bstPreviewLayout.generatePreview(getSliceTheoremPaper(), bibDatabase); + String preview = bstPreviewLayout.generatePreview(getSliceTheoremPaper(), bibDatabaseContext); assertEquals("T. Diez, \"Slice theorem for fréchet group actions and covariant symplectic field theory\" May 2014.", preview); } diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java index 63627b59809..e0489efd4bc 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleGeneratorTest.java @@ -1,18 +1,26 @@ package org.jabref.logic.citationstyle; +import java.util.List; + import org.jabref.logic.l10n.Localization; import org.jabref.logic.util.TestEntry; +import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.database.BibDatabaseMode; import org.jabref.model.entry.BibEntry; +import org.jabref.model.entry.BibEntryTypesManager; import org.jabref.model.entry.field.StandardField; +import org.jabref.model.entry.types.StandardEntryType; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -@Disabled("For some reason, instead of vol and pp we get null. No idea about the origin of this problem.") class CitationStyleGeneratorTest { + private final BibEntryTypesManager bibEntryTypesManager = new BibEntryTypesManager(); + @Test void testIgnoreNewLine() { BibEntry entry = new BibEntry(); @@ -20,9 +28,9 @@ void testIgnoreNewLine() { // if the default citation style changes this has to be modified String expected = "
\n" + - "
[1]
F. Last and J. Doe, .
\n" + + "
[1]
F. Last and J. Doe,
\n" + "
\n"; - String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault()); + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @@ -33,105 +41,61 @@ void testIgnoreCarriageReturnNewLine() { // if the default citation style changes this has to be modified String expected = "
\n" + - "
[1]
F. Last and J. Doe, .
\n" + + "
[1]
F. Last and J. Doe,
\n" + "
\n"; - String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault()); + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @Test void testMissingCitationStyle() { String expected = Localization.lang("Cannot generate preview based on selected citation style."); - String citation = CitationStyleGenerator.generateCitation(new BibEntry(), "faulty citation style"); + String citation = CitationStyleGenerator.generateCitation(new BibEntry(), "faulty citation style", bibEntryTypesManager); assertEquals(expected, citation); } - @Test - void testAsciiDocFormat() { - String expectedCitation = "[1] B. Smith, B. Jones, and J. Williams, ``Title of the test entry,'' __BibTeX Journal__, vol. 34, no. 3, pp. 45–67, Jul. 2016.\n"; - BibEntry entry = TestEntry.getTestEntry(); - String style = CitationStyle.getDefault().getSource(); - CitationStyleOutputFormat format = CitationStyleOutputFormat.ASCII_DOC; - - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); - assertEquals(expectedCitation, actualCitation); - } - @Test void testHtmlFormat() { String expectedCitation = "
\n" + - "
[1]
B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016.
\n" + - "
\n"; - BibEntry entry = TestEntry.getTestEntry(); - String style = CitationStyle.getDefault().getSource(); - CitationStyleOutputFormat format = CitationStyleOutputFormat.HTML; + "
[1]
B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 7, Art. no. 3, 2016-07, doi: 10.1001/bla.blubb.
\n" + + " \n"; - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); - assertEquals(expectedCitation, actualCitation); - } - - @Test - void testRtfFormat() { - String expectedCitation = "[1]\\tab B. Smith, B. Jones, and J. Williams, \\uc0\\u8220{}Title of the test entry,\\uc0\\u8221{} {\\i{}BibTeX Journal}, vol. 34, no. 3, pp. 45\\uc0\\u8211{}67, Jul. 2016.\r\n"; BibEntry entry = TestEntry.getTestEntry(); String style = CitationStyle.getDefault().getSource(); - CitationStyleOutputFormat format = CitationStyleOutputFormat.RTF; + CitationStyleOutputFormat format = CitationStyleOutputFormat.HTML; - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); + String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format, new BibDatabaseContext(), bibEntryTypesManager); assertEquals(expectedCitation, actualCitation); } @Test void testTextFormat() { - String expectedCitation = "[1]B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016.\n"; - BibEntry entry = TestEntry.getTestEntry(); - String style = CitationStyle.getDefault().getSource(); - CitationStyleOutputFormat format = CitationStyleOutputFormat.TEXT; - - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); - assertEquals(expectedCitation, actualCitation); - } + String expectedCitation = "[1]B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 7, Art. no. 3, 2016-07, doi: 10.1001/bla.blubb.\n"; - @Test - void testXslFoFormat() { - String expectedCitation = "\n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " [1]\n" + - " \n" + - " \n" + - " B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016.\n" + - " \n" + - " \n" + - " \n" + - " \n" + - "\n"; BibEntry entry = TestEntry.getTestEntry(); String style = CitationStyle.getDefault().getSource(); - CitationStyleOutputFormat format = CitationStyleOutputFormat.XSL_FO; + CitationStyleOutputFormat format = CitationStyleOutputFormat.TEXT; - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); + String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format, new BibDatabaseContext(new BibDatabase(List.of(entry))), bibEntryTypesManager); assertEquals(expectedCitation, actualCitation); } @Test void testHandleDiacritics() { BibEntry entry = new BibEntry(); - entry.setField(StandardField.AUTHOR, "L{\"a}st, First and Doe, Jane"); + // We need to escape the backslash as well, because the slash is part of the LaTeX expression + entry.setField(StandardField.AUTHOR, "L{\\\"a}st, First and Doe, Jane"); // if the default citation style changes this has to be modified. // in this case ä was added to check if it is formatted appropriately String expected = "
\n" + - "
[1]
F. Läst and J. Doe, .
\n" + + "
[1]
F. Läst and J. Doe,
\n" + "
\n"; - String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault()); + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault(), bibEntryTypesManager); assertEquals(expected, citation); } @Test + @Disabled("Currently citeproc does not handler number field correctly") void testHandleAmpersand() { String expectedCitation = "[1]B. Smith, B. Jones, and J. Williams, “&TitleTest&” BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016.\n"; BibEntry entry = TestEntry.getTestEntry(); @@ -139,7 +103,114 @@ void testHandleAmpersand() { String style = CitationStyle.getDefault().getSource(); CitationStyleOutputFormat format = CitationStyleOutputFormat.TEXT; - String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format); + String actualCitation = CitationStyleGenerator.generateCitation(entry, style, format, new BibDatabaseContext(), bibEntryTypesManager); assertEquals(expectedCitation, actualCitation); } + + @Test + void testHandleCrossRefFields() { + BibEntry firstEntry = new BibEntry(StandardEntryType.InCollection) + .withCitationKey("smit2021") + .withField(StandardField.AUTHOR, "Smith, Bob") + .withField(StandardField.TITLE, "An article") + .withField(StandardField.PAGES, "1-10") + .withField(StandardField.CROSSREF, "jone2021"); + + BibEntry secondEntry = new BibEntry(StandardEntryType.Book) + .withCitationKey("jone2021") + .withField(StandardField.EDITOR, "Jones, John") + .withField(StandardField.PUBLISHER, "Great Publisher") + .withField(StandardField.TITLE, "A book") + .withField(StandardField.YEAR, "2021") + .withField(StandardField.ADDRESS, "Somewhere"); + + String expectedCitation = "[1]B. Smith, “An article,” J. Jones, Ed. Somewhere: Great Publisher, 2021, pp. 1–10.\n"; + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(firstEntry, secondEntry))); + String style = CitationStyle.getDefault().getSource(); + + String actualCitation = CitationStyleGenerator.generateCitation(firstEntry, style, CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expectedCitation, actualCitation); + } + + @Test + void testBibtexWithNumber() { + BibEntry entry = new BibEntry(StandardEntryType.Article); + entry.setField(StandardField.AUTHOR, "Last, First and\nDoe, Jane"); + entry.setField(StandardField.NUMBER, "7"); + + // if the default citation style changes this has to be modified + String expected = "[1]F. Last and J. Doe, Art. no. 7.\n"; + + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(entry))); + bibDatabaseContext.setMode(BibDatabaseMode.BIBTEX); + + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expected, citation); + } + + @Test + void testBiblatexWithIssue() { + BibEntry entry = new BibEntry(StandardEntryType.Article); + entry.setField(StandardField.AUTHOR, "Last, First and\nDoe, Jane"); + entry.setField(StandardField.ISSUE, "7"); + + // if the default citation style changes this has to be modified + String expected = "[1]F. Last and J. Doe, no. 7.\n"; + + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(entry))); + bibDatabaseContext.setMode(BibDatabaseMode.BIBLATEX); + + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expected, citation); + } + + @Test + void testBiblatexWitNumber() { + BibEntry entry = new BibEntry(StandardEntryType.Article); + entry.setField(StandardField.AUTHOR, "Last, First and Doe, Jane"); + entry.setField(StandardField.NUMBER, "7"); + + // if the default citation style changes this has to be modified + String expected = "[1]F. Last and J. Doe, Art. no. 7.\n"; + + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(entry))); + bibDatabaseContext.setMode(BibDatabaseMode.BIBLATEX); + + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expected, citation); + } + + @Test + void testBiblatexWithIssueAndNumber() { + BibEntry entry = new BibEntry(StandardEntryType.Article); + entry.setField(StandardField.AUTHOR, "Last, First and\nDoe, Jane"); + entry.setField(StandardField.ISSUE, "7"); + entry.setField(StandardField.NUMBER, "28"); + + // if the default citation style changes this has to be modified + String expected = "[1]F. Last and J. Doe, no. 7, Art. no. 28.\n"; + + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(entry))); + bibDatabaseContext.setMode(BibDatabaseMode.BIBLATEX); + + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expected, citation); + } + + @Test + void testBiblatexWithPages() { + BibEntry entry = new BibEntry(StandardEntryType.Article); + entry.setField(StandardField.AUTHOR, "Last, First and\nDoe, Jane"); + entry.setField(StandardField.PAGES, "7--8"); + entry.setField(StandardField.ISSUE, "28"); + + // if the default citation style changes this has to be modified + String expected = "[1]F. Last and J. Doe, no. 28, pp. 7–8.\n"; + + BibDatabaseContext bibDatabaseContext = new BibDatabaseContext(new BibDatabase(List.of(entry))); + bibDatabaseContext.setMode(BibDatabaseMode.BIBLATEX); + + String citation = CitationStyleGenerator.generateCitation(entry, CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.TEXT, bibDatabaseContext, bibEntryTypesManager); + assertEquals(expected, citation); + } } diff --git a/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java b/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java index 01b97bec227..6d97c192ca2 100644 --- a/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java +++ b/src/test/java/org/jabref/logic/citationstyle/CitationStyleTest.java @@ -1,14 +1,18 @@ package org.jabref.logic.citationstyle; +import java.util.List; + import org.jabref.logic.util.TestEntry; +import org.jabref.model.database.BibDatabase; +import org.jabref.model.database.BibDatabaseContext; +import org.jabref.model.database.BibDatabaseMode; +import org.jabref.model.entry.BibEntryTypesManager; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@Disabled("For some reason, instead of vol and pp we get null. No idea about the origin of this problem.") class CitationStyleTest { @Test @@ -18,14 +22,16 @@ void getDefault() throws Exception { @Test void testDefaultCitation() { - String citation = CitationStyleGenerator.generateCitation(TestEntry.getTestEntry(), CitationStyle.getDefault()); + + BibDatabaseContext context = new BibDatabaseContext(new BibDatabase(List.of(TestEntry.getTestEntry()))); + context.setMode(BibDatabaseMode.BIBLATEX); + String citation = CitationStyleGenerator.generateCitation(TestEntry.getTestEntry(), CitationStyle.getDefault().getSource(), CitationStyleOutputFormat.HTML, context, new BibEntryTypesManager()); // if the default citation style changes this has to be modified - String expected = "
\n" + - "
[1]
" + - "B. Smith, B. Jones, and J. Williams, “Title of the test entry,” " + - "BibTeX Journal, vol. 34, no. 3, pp. 45–67, Jul. 2016.
\n" + - "
\n"; + String expected = "
\n" + + "
[1]
B. Smith, B. Jones, and J. Williams, “Title of the test entry,” BibTeX Journal, vol. 34, no. 7, Art. no. 3, 2016-07, doi: 10.1001/bla.blubb.
\n" + + "
\n" + + ""; assertEquals(expected, citation); }