From b9ab28764dac646de7e61cd71356510488d84f49 Mon Sep 17 00:00:00 2001 From: Tushar Date: Sat, 21 Jun 2025 18:02:39 +0530 Subject: [PATCH 1/8] fix:Added copy Markdown to copy citation #12552. --- .../main/java/org/jabref/gui/actions/StandardActions.java | 1 + .../java/org/jabref/gui/maintable/RightClickMenu.java | 3 ++- .../org/jabref/gui/preview/ClipboardContentGenerator.java | 8 ++++++++ .../logic/citationstyle/CitationStyleOutputFormat.java | 3 ++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/jabgui/src/main/java/org/jabref/gui/actions/StandardActions.java b/jabgui/src/main/java/org/jabref/gui/actions/StandardActions.java index 446511c7857..edb65d7a27a 100644 --- a/jabgui/src/main/java/org/jabref/gui/actions/StandardActions.java +++ b/jabgui/src/main/java/org/jabref/gui/actions/StandardActions.java @@ -19,6 +19,7 @@ public enum StandardActions implements Action { 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_TEXT(Localization.lang("Copy citation (text)")), + COPY_CITATION_MARKDOWN(Localization.lang("Copy citation (markdown)")), 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/jabgui/src/main/java/org/jabref/gui/maintable/RightClickMenu.java b/jabgui/src/main/java/org/jabref/gui/maintable/RightClickMenu.java index 5a9c93e6cac..5fbee9fa50a 100644 --- a/jabgui/src/main/java/org/jabref/gui/maintable/RightClickMenu.java +++ b/jabgui/src/main/java/org/jabref/gui/maintable/RightClickMenu.java @@ -192,7 +192,8 @@ private static Menu createCopySubMenu(ActionFactory factory, if (previewPreferences.getSelectedPreviewLayout() instanceof CitationStylePreviewLayout) { copySpecialMenu.getItems().addAll( factory.createMenuItem(StandardActions.COPY_CITATION_HTML, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, preferences, abbreviationRepository)), - factory.createMenuItem(StandardActions.COPY_CITATION_TEXT, new CopyCitationAction(CitationStyleOutputFormat.TEXT, dialogService, stateManager, clipBoardManager, taskExecutor, preferences, abbreviationRepository))); + factory.createMenuItem(StandardActions.COPY_CITATION_TEXT, new CopyCitationAction(CitationStyleOutputFormat.TEXT, dialogService, stateManager, clipBoardManager, taskExecutor, preferences, abbreviationRepository)), + factory.createMenuItem(StandardActions.COPY_CITATION_MARKDOWN, new CopyCitationAction(CitationStyleOutputFormat.MARKDOWN, dialogService, stateManager, clipBoardManager, taskExecutor, preferences, abbreviationRepository))); } else { copySpecialMenu.getItems().add(factory.createMenuItem(StandardActions.COPY_CITATION_PREVIEW, new CopyCitationAction(CitationStyleOutputFormat.HTML, dialogService, stateManager, clipBoardManager, taskExecutor, preferences, abbreviationRepository))); } diff --git a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java index f49382d61a4..4249a47e1c3 100644 --- a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java +++ b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java @@ -45,6 +45,7 @@ public ClipboardContent generate(List selectedEntries, CitationStyleOu return switch (outputFormat) { case HTML -> processHtml(citations); case TEXT -> processText(citations); + case MARKDOWN -> processMarkdown(citations); }; } else { // if it is not a citation style take care of the preview @@ -120,6 +121,13 @@ static ClipboardContent processHtml(List citations) { return content; } + static ClipboardContent processMarkdown(List citations) { + String result = String.join(CitationStyleOutputFormat.MARKDOWN.getLineSeparator(), citations); + ClipboardContent content = new ClipboardContent(); + content.putString(result); + return content; + } + private List generateTextBasedPreviewLayoutCitations(List selectedEntries, BibDatabaseContext bibDatabaseContext) throws IOException { TextBasedPreviewLayout customPreviewLayout = previewPreferences.getCustomPreviewLayout(); Reader customLayoutReader = Reader.of(customPreviewLayout.getText().replace("__NEWLINE__", "\n")); diff --git a/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java b/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java index 2c11793df42..dfb4a2f5963 100644 --- a/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java +++ b/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java @@ -5,7 +5,8 @@ public enum CitationStyleOutputFormat { HTML("html", OS.NEWLINE + "
" + OS.NEWLINE), - TEXT("text", ""); + TEXT("text", ""), + MARKDOWN("markdown", OS.NEWLINE + "
" + OS.NEWLINE); private final String format; private final String lineSeparator; From 49b035b8083674ca6efb3cbd3166e567366a485c Mon Sep 17 00:00:00 2001 From: Tushar Date: Mon, 23 Jun 2025 20:46:35 +0530 Subject: [PATCH 2/8] fix:Added copy Markdown to copy citation #12552. --- jabgui/src/main/java/module-info.java | 2 ++ .../preview/ClipboardContentGenerator.java | 19 +++++++++++++++++-- .../CitationStyleOutputFormat.java | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/jabgui/src/main/java/module-info.java b/jabgui/src/main/java/module-info.java index 0a529f52082..aeb0e131036 100644 --- a/jabgui/src/main/java/module-info.java +++ b/jabgui/src/main/java/module-info.java @@ -188,5 +188,7 @@ requires org.antlr.antlr4.runtime; requires org.libreoffice.uno; requires com.dlsc.pdfviewfx; + requires flexmark; + requires flexmark.util.ast; // endregion } diff --git a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java index 4249a47e1c3..d0a8036a4d9 100644 --- a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java +++ b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java @@ -23,6 +23,7 @@ import com.airhacks.afterburner.injection.Injector; import com.google.common.annotations.VisibleForTesting; +import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter; public class ClipboardContentGenerator { @@ -122,9 +123,23 @@ static ClipboardContent processHtml(List citations) { } static ClipboardContent processMarkdown(List citations) { - String result = String.join(CitationStyleOutputFormat.MARKDOWN.getLineSeparator(), citations); + String result = "" + OS.NEWLINE + + "" + OS.NEWLINE + + " " + OS.NEWLINE + + " " + OS.NEWLINE + + " " + OS.NEWLINE + + " " + OS.NEWLINE + OS.NEWLINE; + + result += String.join(CitationStyleOutputFormat.HTML.getLineSeparator(), citations); + result += OS.NEWLINE + + " " + OS.NEWLINE + + "" + OS.NEWLINE; + + FlexmarkHtmlConverter converter = FlexmarkHtmlConverter.builder().build(); + String markdown = converter.convert(result); + ClipboardContent content = new ClipboardContent(); - content.putString(result); + content.putString(markdown); return content; } diff --git a/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java b/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java index dfb4a2f5963..3a2edf12063 100644 --- a/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java +++ b/jablib/src/main/java/org/jabref/logic/citationstyle/CitationStyleOutputFormat.java @@ -6,7 +6,7 @@ public enum CitationStyleOutputFormat { HTML("html", OS.NEWLINE + "
" + OS.NEWLINE), TEXT("text", ""), - MARKDOWN("markdown", OS.NEWLINE + "
" + OS.NEWLINE); + MARKDOWN("markdown", ""); private final String format; private final String lineSeparator; From d582566562a7e9f256fba9577c2fff647eb59bb1 Mon Sep 17 00:00:00 2001 From: Tushar Date: Tue, 24 Jun 2025 17:35:31 +0530 Subject: [PATCH 3/8] fix:Added copy Markdown to copy citation #12552. --- jabgui/src/main/java/module-info.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jabgui/src/main/java/module-info.java b/jabgui/src/main/java/module-info.java index aeb0e131036..899000bc7ba 100644 --- a/jabgui/src/main/java/module-info.java +++ b/jabgui/src/main/java/module-info.java @@ -188,7 +188,7 @@ requires org.antlr.antlr4.runtime; requires org.libreoffice.uno; requires com.dlsc.pdfviewfx; - requires flexmark; - requires flexmark.util.ast; +// requires flexmark; +// requires flexmark.util.ast; // endregion } From 508b93d1708a441cf74df9ebfdba537436ae677c Mon Sep 17 00:00:00 2001 From: Tushar Date: Fri, 27 Jun 2025 10:32:52 +0530 Subject: [PATCH 4/8] fix:Added @visibleForTesting in method processMarkdown #12552. --- .../org/jabref/gui/preview/ClipboardContentGenerator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java index d0a8036a4d9..ce5a61f5def 100644 --- a/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java +++ b/jabgui/src/main/java/org/jabref/gui/preview/ClipboardContentGenerator.java @@ -122,6 +122,11 @@ static ClipboardContent processHtml(List citations) { return content; } + /** + * Insert each citation into HTML. + * convert HTML to markdown using flexmark. + */ + @VisibleForTesting static ClipboardContent processMarkdown(List citations) { String result = "" + OS.NEWLINE + "" + OS.NEWLINE + From e805e7e6a7251da17f2df01446d17a8ea887cd0c Mon Sep 17 00:00:00 2001 From: Tushar Date: Sat, 19 Jul 2025 11:58:15 +0530 Subject: [PATCH 5/8] fix:submodule removal --- .../ClipboardContentGeneratorTest.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/jabgui/src/test/java/org/jabref/gui/preview/ClipboardContentGeneratorTest.java b/jabgui/src/test/java/org/jabref/gui/preview/ClipboardContentGeneratorTest.java index 307ea7a930e..5062c99f663 100644 --- a/jabgui/src/test/java/org/jabref/gui/preview/ClipboardContentGeneratorTest.java +++ b/jabgui/src/test/java/org/jabref/gui/preview/ClipboardContentGeneratorTest.java @@ -138,4 +138,32 @@ void processHtmlAsHtml() { Object actual = htmlTransferable.getHtml(); assertEquals(expected, actual); } + + @Test + void processMarkdownAsMarkdown() { + String expected = "\\[1\\] \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" + + "\\[1\\] \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"; + + String citation = "
" + OS.NEWLINE + + "
[1]
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; + + ClipboardContent markdown = ClipboardContentGenerator.processMarkdown(Arrays.asList(citation, citation)); + String actual = markdown.getString(); + + // Print actual output for debugging + System.out.println("=== Actual Markdown Output ==="); + System.out.println(actual); + System.out.println("=== End ==="); + + // Normalize both strings to ignore whitespace and formatting issues + String normalizedActual = actual.replaceAll("\\s+", " ").trim(); + String normalizedExpected = expected.replaceAll("\\s+", " ").trim(); + + assertEquals(normalizedExpected, normalizedActual); + } } + From 7b3fbf7a10cec89e284fa55e5ddd7f43b7d56bd0 Mon Sep 17 00:00:00 2001 From: Tushar Date: Sat, 19 Jul 2025 10:26:20 +0530 Subject: [PATCH 6/8] fix:Added @visibleForTesting in method processMarkdown #12552. --- jablib/src/main/resources/l10n/JabRef_en.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/jablib/src/main/resources/l10n/JabRef_en.properties b/jablib/src/main/resources/l10n/JabRef_en.properties index 5b983088790..a2fa48ab14e 100644 --- a/jablib/src/main/resources/l10n/JabRef_en.properties +++ b/jablib/src/main/resources/l10n/JabRef_en.properties @@ -171,6 +171,8 @@ Copy=Copy Copy\ title=Copy title Copy\ citation\ (html)=Copy citation (html) Copy\ citation\ (text)=Copy citation (text) +Copy\ citation\ (markdown)=Copy citation (markdown) + 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 From b3eb93c326ea240d110243b90afc20cbf8d0028a Mon Sep 17 00:00:00 2001 From: Tushar Date: Sat, 19 Jul 2025 11:22:12 +0530 Subject: [PATCH 7/8] Revert submodule changes to match main --- jablib/src/main/resources/csl-locales | 2 +- jablib/src/main/resources/csl-styles | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jablib/src/main/resources/csl-locales b/jablib/src/main/resources/csl-locales index 3bad4339367..ea1b54f24b6 160000 --- a/jablib/src/main/resources/csl-locales +++ b/jablib/src/main/resources/csl-locales @@ -1 +1 @@ -Subproject commit 3bad433936712a0c41ffe300442e7f519b51c89f +Subproject commit ea1b54f24b6773ca4aac35cd5e328d28aa1a7e89 diff --git a/jablib/src/main/resources/csl-styles b/jablib/src/main/resources/csl-styles index 59f124dc674..a711f7a81e5 160000 --- a/jablib/src/main/resources/csl-styles +++ b/jablib/src/main/resources/csl-styles @@ -1 +1 @@ -Subproject commit 59f124dc67441738d8823bc59d517edef8f43e06 +Subproject commit a711f7a81e5e6a989720012557045b6be1f81388 From b1811e2fdb1adcae7f3b61879bc424eb848463b6 Mon Sep 17 00:00:00 2001 From: Tushar Date: Sat, 19 Jul 2025 12:05:51 +0530 Subject: [PATCH 8/8] Reset submodule pointers to match main branch --- jablib/src/main/resources/csl-locales | 2 +- jablib/src/main/resources/csl-styles | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/jablib/src/main/resources/csl-locales b/jablib/src/main/resources/csl-locales index ea1b54f24b6..3bad4339367 160000 --- a/jablib/src/main/resources/csl-locales +++ b/jablib/src/main/resources/csl-locales @@ -1 +1 @@ -Subproject commit ea1b54f24b6773ca4aac35cd5e328d28aa1a7e89 +Subproject commit 3bad433936712a0c41ffe300442e7f519b51c89f diff --git a/jablib/src/main/resources/csl-styles b/jablib/src/main/resources/csl-styles index a711f7a81e5..59f124dc674 160000 --- a/jablib/src/main/resources/csl-styles +++ b/jablib/src/main/resources/csl-styles @@ -1 +1 @@ -Subproject commit a711f7a81e5e6a989720012557045b6be1f81388 +Subproject commit 59f124dc67441738d8823bc59d517edef8f43e06