From fbbb325fa4be72f03e91c3247a248bdb0d1cd0e7 Mon Sep 17 00:00:00 2001 From: jinchat-joseph-yim Date: Fri, 29 Aug 2025 23:48:01 +0800 Subject: [PATCH 01/14] add new formatters and cayw resource tests --- .../http/server/cayw/CAYWQueryParams.java | 5 +- .../jabref/http/server/cayw/CAYWResource.java | 4 +- .../server/cayw/format/BibLatexFormatter.java | 14 +-- .../server/cayw/format/CAYWFormatter.java | 2 - .../server/cayw/format/FormatterService.java | 37 +++++--- .../http/server/cayw/format/MMDFormatter.java | 31 +++++++ .../server/cayw/format/NatbibFormatter.java | 42 +++++++++ .../server/cayw/format/PandocFormatter.java | 31 +++++++ .../cayw/format/SimpleJsonFormatter.java | 5 -- .../server/cayw/format/TypstFormatter.java | 31 +++++++ .../org/jabref/http/server/ServerTest.java | 19 +++- .../http/server/cayw/CAYWResourceTest.java | 63 +++++++++++++ .../cayw/format/CAYWFormattersTest.java | 88 +++++++++++++++++++ 13 files changed, 341 insertions(+), 31 deletions(-) create mode 100644 jabsrv/src/main/java/org/jabref/http/server/cayw/format/MMDFormatter.java create mode 100644 jabsrv/src/main/java/org/jabref/http/server/cayw/format/NatbibFormatter.java create mode 100644 jabsrv/src/main/java/org/jabref/http/server/cayw/format/PandocFormatter.java create mode 100644 jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java create mode 100644 jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java create mode 100644 jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWQueryParams.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWQueryParams.java index a050a4a30ae..79e2afdae04 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWQueryParams.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWQueryParams.java @@ -22,7 +22,6 @@ public class CAYWQueryParams { private String clipboard; @QueryParam("command") - @DefaultValue("autocite") private String command; @QueryParam("minimize") @@ -46,8 +45,8 @@ public class CAYWQueryParams { @QueryParam("application") private String application; - public String getCommand() { - return command; + public Optional getCommand() { + return Optional.ofNullable(command); } public boolean isClipboard() { diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWResource.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWResource.java index dcb18e1fe6a..8e50150b6e6 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWResource.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWResource.java @@ -74,7 +74,7 @@ public Response getCitation( if (queryParams.isProbe()) { return Response.ok("ready").build(); } - + BibDatabaseContext databaseContext = getBibDatabaseContext(queryParams); // Selected parameter handling @@ -127,7 +127,7 @@ public Response getCitation( // Push to Application parameter handling if (queryParams.getApplication().isPresent()) { - CitationCommandString citationCmd = new CitationCommandString("\\".concat(queryParams.getCommand()).concat("{"), ",", "}"); + CitationCommandString citationCmd = new CitationCommandString("\\".concat(queryParams.getCommand().orElse("autocite")).concat("{"), ",", "}"); PushToApplications.getApplication(queryParams.getApplication().get(), LOGGER::info, preferences.getPushToApplicationPreferences().withCitationCommand(citationCmd)) .ifPresent(application -> application.pushEntries(searchResults.stream().map(CAYWEntry::bibEntry).toList())); } diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java index 573a7e36c2f..c09d54705a0 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java @@ -1,6 +1,7 @@ package org.jabref.http.server.cayw.format; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import org.jabref.http.server.cayw.CAYWQueryParams; @@ -13,9 +14,11 @@ @Service public class BibLatexFormatter implements CAYWFormatter { - @Override - public String getFormatName() { - return "biblatex"; + private final String defaultCommand; + + public BibLatexFormatter(String defaultCommand) { + super(); + this.defaultCommand = defaultCommand; } @Override @@ -25,7 +28,7 @@ public MediaType getMediaType() { @Override public String format(CAYWQueryParams queryParams, List caywEntries) { - String command = queryParams.getCommand(); + String command = queryParams.getCommand().orElse(defaultCommand); List bibEntries = caywEntries.stream() .map(CAYWEntry::bibEntry) @@ -33,7 +36,8 @@ public String format(CAYWQueryParams queryParams, List caywEntries) { return "\\%s{%s}".formatted(command, bibEntries.stream() - .map(entry -> entry.getCitationKey().orElse("")) + .map(BibEntry::getCitationKey) + .flatMap(Optional::stream) .collect(Collectors.joining(","))); } } diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/CAYWFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/CAYWFormatter.java index ed7d652a383..88a1d53a071 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/CAYWFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/CAYWFormatter.java @@ -9,8 +9,6 @@ public interface CAYWFormatter { - String getFormatName(); - MediaType getMediaType(); String format(CAYWQueryParams caywQueryParams, List caywEntries); diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java index 4cb608d6196..d846a8a443d 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java @@ -1,7 +1,6 @@ package org.jabref.http.server.cayw.format; -import java.util.HashMap; -import java.util.Map; +import java.util.Locale; import org.jabref.http.server.cayw.CAYWQueryParams; @@ -10,20 +9,32 @@ @Service public class FormatterService { - private static final String DEFAULT_FORMATTER = "biblatex"; - private final Map formatters; - public FormatterService() { - this.formatters = new HashMap<>(); - registerFormatter(new SimpleJsonFormatter()); - registerFormatter(new BibLatexFormatter()); - } - - public void registerFormatter(CAYWFormatter formatter) { - formatters.putIfAbsent(formatter.getFormatName(), formatter); } public CAYWFormatter getFormatter(CAYWQueryParams queryParams) { - return formatters.getOrDefault(queryParams.getFormat().toLowerCase(), formatters.get(DEFAULT_FORMATTER)); + String format = queryParams.getFormat().toLowerCase(Locale.ROOT); + + switch (format) { + case "natbib": + case "latex": + case "cite": + return new NatbibFormatter("cite"); + case "citep": + return new NatbibFormatter("citep"); + case "citet": + return new NatbibFormatter("citet"); + case "mmd": + return new MMDFormatter(); + case "pandoc": + return new PandocFormatter(); + case "simple-json": + return new SimpleJsonFormatter(); + case "typst": + return new TypstFormatter(); + case "biblatex": + default: + return new BibLatexFormatter("autocite"); + } } } diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/MMDFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/MMDFormatter.java new file mode 100644 index 00000000000..497516f4e37 --- /dev/null +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/MMDFormatter.java @@ -0,0 +1,31 @@ +package org.jabref.http.server.cayw.format; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jabref.http.server.cayw.CAYWQueryParams; +import org.jabref.http.server.cayw.gui.CAYWEntry; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.MediaType; + +public class MMDFormatter implements CAYWFormatter { + + @Override + public MediaType getMediaType() { + return MediaType.TEXT_PLAIN_TYPE; + } + + @Override + public String format(CAYWQueryParams queryParams, List caywEntries) { + List bibEntries = caywEntries.stream() + .map(CAYWEntry::bibEntry) + .toList(); + + return bibEntries.stream() + .map(entry -> entry.getCitationKey().map("[#%s][]"::formatted)) + .flatMap(Optional::stream) + .collect(Collectors.joining("")); + } +} diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/NatbibFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/NatbibFormatter.java new file mode 100644 index 00000000000..59a9947a75d --- /dev/null +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/NatbibFormatter.java @@ -0,0 +1,42 @@ +package org.jabref.http.server.cayw.format; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jabref.http.server.cayw.CAYWQueryParams; +import org.jabref.http.server.cayw.gui.CAYWEntry; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.MediaType; +import org.jvnet.hk2.annotations.Service; + +@Service +public class NatbibFormatter implements CAYWFormatter { + + private final String defaultCommand; + + public NatbibFormatter(String defaultCommand) { + this.defaultCommand = defaultCommand; + } + + @Override + public MediaType getMediaType() { + return MediaType.TEXT_PLAIN_TYPE; + } + + @Override + public String format(CAYWQueryParams queryParams, List caywEntries) { + String command = queryParams.getCommand().orElse(defaultCommand); + + List bibEntries = caywEntries.stream() + .map(CAYWEntry::bibEntry) + .toList(); + + return "\\%s{%s}".formatted(command, + bibEntries.stream() + .map(BibEntry::getCitationKey) + .flatMap(Optional::stream) + .collect(Collectors.joining(","))); + } +} diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/PandocFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/PandocFormatter.java new file mode 100644 index 00000000000..a03c0dbd14c --- /dev/null +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/PandocFormatter.java @@ -0,0 +1,31 @@ +package org.jabref.http.server.cayw.format; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jabref.http.server.cayw.CAYWQueryParams; +import org.jabref.http.server.cayw.gui.CAYWEntry; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.MediaType; + +public class PandocFormatter implements CAYWFormatter { + + @Override + public MediaType getMediaType() { + return MediaType.TEXT_PLAIN_TYPE; + } + + @Override + public String format(CAYWQueryParams queryParams, List caywEntries) { + List bibEntries = caywEntries.stream() + .map(CAYWEntry::bibEntry) + .toList(); + + return "[%s]".formatted(bibEntries.stream() + .map(entry -> entry.getCitationKey().map("@%s"::formatted)) + .flatMap(Optional::stream) + .collect(Collectors.joining("; "))); + } +} diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/SimpleJsonFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/SimpleJsonFormatter.java index 480df4becfa..a08be38c6b5 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/SimpleJsonFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/SimpleJsonFormatter.java @@ -20,11 +20,6 @@ public SimpleJsonFormatter() { this.gson = new GsonFactory().provide(); } - @Override - public String getFormatName() { - return "simple-json"; - } - @Override public MediaType getMediaType() { return MediaType.APPLICATION_JSON_TYPE; diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java new file mode 100644 index 00000000000..558d8a1c18f --- /dev/null +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java @@ -0,0 +1,31 @@ +package org.jabref.http.server.cayw.format; + +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import org.jabref.http.server.cayw.CAYWQueryParams; +import org.jabref.http.server.cayw.gui.CAYWEntry; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.MediaType; + +public class TypstFormatter implements CAYWFormatter { + + @Override + public MediaType getMediaType() { + return MediaType.TEXT_PLAIN_TYPE; + } + + @Override + public String format(CAYWQueryParams queryParams, List caywEntries) { + List bibEntries = caywEntries.stream() + .map(CAYWEntry::bibEntry) + .toList(); + + return bibEntries.stream() + .map(entry -> entry.getCitationKey().map("@%s"::formatted)) + .flatMap(Optional::stream) + .collect(Collectors.joining(" ")); + } +} diff --git a/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java b/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java index e813f597b46..c98ab3e5df2 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java @@ -3,14 +3,18 @@ import java.util.EnumSet; import java.util.List; +import javafx.collections.FXCollections; + import org.jabref.http.JabRefSrvStateManager; import org.jabref.http.SrvStateManager; import org.jabref.http.dto.GlobalExceptionMapper; import org.jabref.http.dto.GsonFactory; +import org.jabref.http.server.cayw.format.FormatterService; import org.jabref.http.server.services.FilesToServe; import org.jabref.logic.bibtex.FieldPreferences; import org.jabref.logic.importer.ImportFormatPreferences; import org.jabref.logic.preferences.CliPreferences; +import org.jabref.logic.preferences.LastFilesOpenedPreferences; import org.jabref.model.entry.BibEntryPreferences; import com.google.gson.Gson; @@ -32,7 +36,7 @@ * *

More information on testing with Jersey is available at the Jersey's testing documentation

. */ -abstract class ServerTest extends JerseyTest { +public abstract class ServerTest extends JerseyTest { private static CliPreferences preferences; @@ -81,6 +85,15 @@ protected void configure() { } protected void addPreferencesToResourceConfig(ResourceConfig resourceConfig) { + resourceConfig.register(new AbstractBinder() { + @Override + protected void configure() { + bind(new FormatterService()).to(FormatterService.class); + } + }); + } + + protected void addFormatterServiceToResourceConfig(ResourceConfig resourceConfig) { resourceConfig.register(new AbstractBinder() { @Override protected void configure() { @@ -111,6 +124,10 @@ private static void initializePreferencesService() { FieldPreferences fieldContentFormatterPreferences = new FieldPreferences(false, List.of(), List.of()); // used twice, once for reading and once for writing when(importFormatPreferences.fieldPreferences()).thenReturn(fieldContentFormatterPreferences); + + LastFilesOpenedPreferences lastFilesOpenedPreferences = mock(LastFilesOpenedPreferences.class); + when(preferences.getLastFilesOpenedPreferences()).thenReturn(lastFilesOpenedPreferences); + when(lastFilesOpenedPreferences.getLastFilesOpened()).thenReturn(FXCollections.emptyObservableList()); } protected void addGlobalExceptionMapperToResourceConfig(ResourceConfig resourceConfig) { diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java new file mode 100644 index 00000000000..b1835771fe5 --- /dev/null +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java @@ -0,0 +1,63 @@ +package org.jabref.http.server.cayw; + +import javafx.collections.FXCollections; + +import org.jabref.http.SrvStateManager; +import org.jabref.http.server.ServerTest; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.Application; +import jakarta.ws.rs.core.Response; +import org.glassfish.hk2.utilities.binding.AbstractBinder; +import org.glassfish.jersey.server.ResourceConfig; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CAYWResourceTest extends ServerTest { + @Override + protected Application configure() { + ResourceConfig resourceConfig = new ResourceConfig(CAYWResource.class); + addFilesToServeToResourceConfig(resourceConfig); + addPreferencesToResourceConfig(resourceConfig); + addGsonToResourceConfig(resourceConfig); + addFormatterServiceToResourceConfig(resourceConfig); + + resourceConfig.register(new AbstractBinder() { + @Override protected void configure() { + SrvStateManager mockSrv = Mockito.mock(SrvStateManager.class); + BibEntry bibEntry = new BibEntry(); + bibEntry.setCitationKey("Author2025test"); + Mockito.when(mockSrv.getSelectedEntries()).thenReturn(FXCollections.observableArrayList(bibEntry)); + bind(mockSrv).to(SrvStateManager.class); + } + }); + + return resourceConfig.getApplication(); + } + + @Test + void probe_returns_ready() { + Response response = target("/better-bibtex/cayw") + .queryParam("probe", "1") + .request() + .get(); + assertEquals(200, response.getStatus()); + assertEquals("ready", response.readEntity(String.class)); + assertEquals("text/plain", response.getHeaderString("Content-Type")); + } + + @Test + void biblatex() { + Response response = target("/better-bibtex/cayw") + .queryParam("format", "biblatex") + .queryParam("selected", "1") + .request() + .get(); + + assertEquals(200, response.getStatus()); + assertEquals("\\autocite{Author2023test}", response.readEntity(String.class)); + assertEquals("text/plain", response.getHeaderString("Content-Type")); + } +} diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java new file mode 100644 index 00000000000..e42f0c9a18e --- /dev/null +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -0,0 +1,88 @@ +package org.jabref.http.server.cayw.format; + +import java.util.List; +import java.util.Optional; + +import org.jabref.http.server.cayw.CAYWQueryParams; +import org.jabref.http.server.cayw.gui.CAYWEntry; +import org.jabref.model.entry.BibEntry; + +import jakarta.ws.rs.core.MediaType; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class CAYWFormattersTest { + + private static CAYWEntry caywEntry(String key) { + BibEntry bibEntry = new BibEntry(); + bibEntry.setCitationKey(key); + return new CAYWEntry(bibEntry, "", "", ""); + } + + private static CAYWQueryParams queryParams(String command) { + CAYWQueryParams mock = Mockito.mock(CAYWQueryParams.class); + Mockito.when(mock.getCommand()).thenReturn(Optional.ofNullable(command)); + return mock; + } + + @Test + void biblatex_noCommand() { + BibLatexFormatter formatter = new BibLatexFormatter("autocite"); + String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + assertEquals("\\autocite{key1,key2}", actual); + assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); + } + + @Test + void biblatex_explicitCommand() { + BibLatexFormatter formatter = new BibLatexFormatter("autocite"); + String actual = formatter.format(queryParams("cite"), List.of(caywEntry("key1"))); + assertEquals("\\cite{key1}", actual); + assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); + } + + @Test + void biblatex_missingKey() { + // If you decide to DROP empties, change formatter + this expectation. + BibLatexFormatter formatter = new BibLatexFormatter("autocite"); + CAYWEntry entry1 = caywEntry("key1"); + CAYWEntry entry2 = caywEntry(""); + CAYWEntry entry3 = caywEntry("key3"); + String actual = formatter.format(queryParams(null), List.of(entry1, entry2, entry3)); + assertEquals("\\autocite{key1,key3}", actual); // current implementation + assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); + } + + @Test + void natbib_citep() { + NatbibFormatter formatter = new NatbibFormatter("citep"); + String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + assertEquals("\\citep{key1,key2}", actual); + assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); + } + + @Test + void mmd() { + MMDFormatter formatter = new MMDFormatter(); + String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + // Whatever your MMD formatter currently emits; adjust expected accordingly. + assertEquals("[#key1][][#key2][]", actual); + assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); + } + + @Test + void pandoc() { + PandocFormatter formatter = new PandocFormatter(); + String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + assertEquals("[@key1; @key2]", actual); + } + + @Test + void typst() { + TypstFormatter formatter = new TypstFormatter(); + String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + assertEquals("@key1 @key2", actual); + } +} From b4606c228c5b9e294c05e46d3cd1ccd1719d3bca Mon Sep 17 00:00:00 2001 From: jinchat-joseph-yim Date: Sat, 30 Aug 2025 00:18:30 +0800 Subject: [PATCH 02/14] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4cdec74cc2f..deeffdde7c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv - We added a new button for shortening the DOI near the DOI field in the general tab when viewing an entry. [#13639](https://github.com/JabRef/jabref/issues/13639) - We added support for finding CSL-Styles based on their short title (e.g. apa instead of "american psychological association"). [#13728](https://github.com/JabRef/jabref/pull/13728) - We added BibLaTeX datamodel validation support in order to improve error message quality in entries' fields validation. [#13318](https://github.com/JabRef/jabref/issues/13318) +- We added more supported formats of CAYW endpoint of HTTP server. [#13578](https://github.com/JabRef/jabref/issues/13578) ### Changed From 213bf256375f378e0efd1cb38b573afc40f1e482 Mon Sep 17 00:00:00 2001 From: jinchat-joseph-yim Date: Sat, 30 Aug 2025 00:56:32 +0800 Subject: [PATCH 03/14] correct method name and expected result in tests --- jabsrv/src/test/java/org/jabref/http/server/ServerTest.java | 4 ++-- .../java/org/jabref/http/server/cayw/CAYWResourceTest.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java b/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java index c98ab3e5df2..c434babc077 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/ServerTest.java @@ -84,7 +84,7 @@ protected void configure() { }); } - protected void addPreferencesToResourceConfig(ResourceConfig resourceConfig) { + protected void addFormatterServiceToResourceConfig(ResourceConfig resourceConfig) { resourceConfig.register(new AbstractBinder() { @Override protected void configure() { @@ -93,7 +93,7 @@ protected void configure() { }); } - protected void addFormatterServiceToResourceConfig(ResourceConfig resourceConfig) { + protected void addPreferencesToResourceConfig(ResourceConfig resourceConfig) { resourceConfig.register(new AbstractBinder() { @Override protected void configure() { diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java index b1835771fe5..689ac802248 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java @@ -28,7 +28,7 @@ protected Application configure() { @Override protected void configure() { SrvStateManager mockSrv = Mockito.mock(SrvStateManager.class); BibEntry bibEntry = new BibEntry(); - bibEntry.setCitationKey("Author2025test"); + bibEntry.setCitationKey("Author2023test"); Mockito.when(mockSrv.getSelectedEntries()).thenReturn(FXCollections.observableArrayList(bibEntry)); bind(mockSrv).to(SrvStateManager.class); } From 49a740c8de3f5be3fbcd59438d712e348a9a4c68 Mon Sep 17 00:00:00 2001 From: jinchat-joseph-yim Date: Sat, 30 Aug 2025 01:25:02 +0800 Subject: [PATCH 04/14] add sources of new formatter --- .jbang/JabSrvLauncher.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.jbang/JabSrvLauncher.java b/.jbang/JabSrvLauncher.java index 5b6ebd0cd54..647ef6e067b 100644 --- a/.jbang/JabSrvLauncher.java +++ b/.jbang/JabSrvLauncher.java @@ -19,6 +19,10 @@ //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWQueryParams.java //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/CAYWResource.java //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java +//SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/NatbibFormatter.java +//SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/MMDFormatter.java +//SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/PandocFormatter.java +//SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/CAYWFormatter.java //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java //SOURCES ../jabsrv/src/main/java/org/jabref/http/server/cayw/format/SimpleJsonFormatter.java From cf113a294a8b56e5380bb363b4141d4b19cede92 Mon Sep 17 00:00:00 2001 From: jinchat-joseph-yim Date: Sat, 30 Aug 2025 01:29:37 +0800 Subject: [PATCH 05/14] use bib entry constructor that takes citation key in test case --- .../java/org/jabref/http/server/cayw/CAYWResourceTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java index 689ac802248..c1d2eca69f7 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java @@ -27,8 +27,7 @@ protected Application configure() { resourceConfig.register(new AbstractBinder() { @Override protected void configure() { SrvStateManager mockSrv = Mockito.mock(SrvStateManager.class); - BibEntry bibEntry = new BibEntry(); - bibEntry.setCitationKey("Author2023test"); + BibEntry bibEntry = new BibEntry("Author2023test"); Mockito.when(mockSrv.getSelectedEntries()).thenReturn(FXCollections.observableArrayList(bibEntry)); bind(mockSrv).to(SrvStateManager.class); } From e77d5e020b05ca8ed37f947916cba20479a50848 Mon Sep 17 00:00:00 2001 From: josephyim Date: Mon, 1 Sep 2025 12:50:23 +0800 Subject: [PATCH 06/14] use builder of BibEntry with citation key --- .../http/server/cayw/CAYWResourceTest.java | 2 +- .../cayw/format/CAYWFormattersTest.java | 32 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java index c1d2eca69f7..0786268c341 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/CAYWResourceTest.java @@ -27,7 +27,7 @@ protected Application configure() { resourceConfig.register(new AbstractBinder() { @Override protected void configure() { SrvStateManager mockSrv = Mockito.mock(SrvStateManager.class); - BibEntry bibEntry = new BibEntry("Author2023test"); + BibEntry bibEntry = new BibEntry().withCitationKey("Author2023test"); Mockito.when(mockSrv.getSelectedEntries()).thenReturn(FXCollections.observableArrayList(bibEntry)); bind(mockSrv).to(SrvStateManager.class); } diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index e42f0c9a18e..f6a60302a18 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -2,6 +2,8 @@ import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.jabref.http.server.cayw.CAYWQueryParams; import org.jabref.http.server.cayw.gui.CAYWEntry; @@ -15,13 +17,16 @@ class CAYWFormattersTest { - private static CAYWEntry caywEntry(String key) { - BibEntry bibEntry = new BibEntry(); - bibEntry.setCitationKey(key); - return new CAYWEntry(bibEntry, "", "", ""); + private List caywEntries(String... keys) { + if (keys == null) { + return List.of(); + } + return Stream.of(keys) + .map(key -> new CAYWEntry(new BibEntry().withCitationKey(key), key, key, "")) + .collect(Collectors.toList()); } - private static CAYWQueryParams queryParams(String command) { + private CAYWQueryParams queryParams(String command) { CAYWQueryParams mock = Mockito.mock(CAYWQueryParams.class); Mockito.when(mock.getCommand()).thenReturn(Optional.ofNullable(command)); return mock; @@ -30,7 +35,7 @@ private static CAYWQueryParams queryParams(String command) { @Test void biblatex_noCommand() { BibLatexFormatter formatter = new BibLatexFormatter("autocite"); - String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); assertEquals("\\autocite{key1,key2}", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } @@ -38,7 +43,7 @@ void biblatex_noCommand() { @Test void biblatex_explicitCommand() { BibLatexFormatter formatter = new BibLatexFormatter("autocite"); - String actual = formatter.format(queryParams("cite"), List.of(caywEntry("key1"))); + String actual = formatter.format(queryParams("cite"), caywEntries("key1")); assertEquals("\\cite{key1}", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } @@ -47,10 +52,7 @@ void biblatex_explicitCommand() { void biblatex_missingKey() { // If you decide to DROP empties, change formatter + this expectation. BibLatexFormatter formatter = new BibLatexFormatter("autocite"); - CAYWEntry entry1 = caywEntry("key1"); - CAYWEntry entry2 = caywEntry(""); - CAYWEntry entry3 = caywEntry("key3"); - String actual = formatter.format(queryParams(null), List.of(entry1, entry2, entry3)); + String actual = formatter.format(queryParams(null), caywEntries("key1", "", "key3")); assertEquals("\\autocite{key1,key3}", actual); // current implementation assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } @@ -58,7 +60,7 @@ void biblatex_missingKey() { @Test void natbib_citep() { NatbibFormatter formatter = new NatbibFormatter("citep"); - String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); assertEquals("\\citep{key1,key2}", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } @@ -66,7 +68,7 @@ void natbib_citep() { @Test void mmd() { MMDFormatter formatter = new MMDFormatter(); - String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); // Whatever your MMD formatter currently emits; adjust expected accordingly. assertEquals("[#key1][][#key2][]", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); @@ -75,14 +77,14 @@ void mmd() { @Test void pandoc() { PandocFormatter formatter = new PandocFormatter(); - String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); assertEquals("[@key1; @key2]", actual); } @Test void typst() { TypstFormatter formatter = new TypstFormatter(); - String actual = formatter.format(queryParams(null), List.of(caywEntry("key1"), caywEntry("key2"))); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); assertEquals("@key1 @key2", actual); } } From a89cfee3f4fce6b082ed073926c87d14d35d2fdd Mon Sep 17 00:00:00 2001 From: josephyim Date: Fri, 5 Sep 2025 15:01:45 +0800 Subject: [PATCH 07/14] Update the format of typst to consider special character in key, and improve code readability of switch statement. --- .../server/cayw/format/FormatterService.java | 41 +++++++++---------- .../server/cayw/format/TypstFormatter.java | 2 +- .../cayw/format/CAYWFormattersTest.java | 5 +-- 3 files changed, 23 insertions(+), 25 deletions(-) diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java index d846a8a443d..1f0fed54521 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java @@ -15,26 +15,25 @@ public FormatterService() { public CAYWFormatter getFormatter(CAYWQueryParams queryParams) { String format = queryParams.getFormat().toLowerCase(Locale.ROOT); - switch (format) { - case "natbib": - case "latex": - case "cite": - return new NatbibFormatter("cite"); - case "citep": - return new NatbibFormatter("citep"); - case "citet": - return new NatbibFormatter("citet"); - case "mmd": - return new MMDFormatter(); - case "pandoc": - return new PandocFormatter(); - case "simple-json": - return new SimpleJsonFormatter(); - case "typst": - return new TypstFormatter(); - case "biblatex": - default: - return new BibLatexFormatter("autocite"); - } + return switch (format) { + case "natbib", + "latex", + "cite" -> + new NatbibFormatter("cite"); + case "citep" -> + new NatbibFormatter("citep"); + case "citet" -> + new NatbibFormatter("citet"); + case "mmd" -> + new MMDFormatter(); + case "pandoc" -> + new PandocFormatter(); + case "simple-json" -> + new SimpleJsonFormatter(); + case "typst" -> + new TypstFormatter(); + default -> + new BibLatexFormatter("autocite"); + }; } } diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java index 558d8a1c18f..1aa724ef210 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java @@ -24,7 +24,7 @@ public String format(CAYWQueryParams queryParams, List caywEntries) { .toList(); return bibEntries.stream() - .map(entry -> entry.getCitationKey().map("@%s"::formatted)) + .map(entry -> entry.getCitationKey().map("#cite(label(\"%s\"))"::formatted)) .flatMap(Optional::stream) .collect(Collectors.joining(" ")); } diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index f6a60302a18..7d8d241ffa2 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -69,7 +69,6 @@ void natbib_citep() { void mmd() { MMDFormatter formatter = new MMDFormatter(); String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); - // Whatever your MMD formatter currently emits; adjust expected accordingly. assertEquals("[#key1][][#key2][]", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } @@ -84,7 +83,7 @@ void pandoc() { @Test void typst() { TypstFormatter formatter = new TypstFormatter(); - String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); - assertEquals("@key1 @key2", actual); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2/slash")); + assertEquals("#cite(label(\"key1\")) #cite(label(\"key2/slash\"))", actual); } } From d6fe81ed7e71728a68bb4552a7ad7894735ff984 Mon Sep 17 00:00:00 2001 From: josephyim Date: Fri, 5 Sep 2025 17:52:55 +0800 Subject: [PATCH 08/14] Remove unnecessary constructor code for consistency --- .../org/jabref/http/server/cayw/format/BibLatexFormatter.java | 1 - .../org/jabref/http/server/cayw/format/FormatterService.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java index c09d54705a0..73c41b6236c 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/BibLatexFormatter.java @@ -17,7 +17,6 @@ public class BibLatexFormatter implements CAYWFormatter { private final String defaultCommand; public BibLatexFormatter(String defaultCommand) { - super(); this.defaultCommand = defaultCommand; } diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java index 1f0fed54521..ae77f74a195 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/FormatterService.java @@ -9,9 +9,6 @@ @Service public class FormatterService { - public FormatterService() { - } - public CAYWFormatter getFormatter(CAYWQueryParams queryParams) { String format = queryParams.getFormat().toLowerCase(Locale.ROOT); From 0e9fcdbc5b44b7ef6889920d1471c76cbefe54b5 Mon Sep 17 00:00:00 2001 From: josephyim Date: Fri, 5 Sep 2025 23:46:27 +0800 Subject: [PATCH 09/14] Ue cite in typst format only when key contains slash --- .../http/server/cayw/format/TypstFormatter.java | 8 +++++++- .../http/server/cayw/format/CAYWFormattersTest.java | 12 +++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java index 1aa724ef210..320438f59b3 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java @@ -24,7 +24,13 @@ public String format(CAYWQueryParams queryParams, List caywEntries) { .toList(); return bibEntries.stream() - .map(entry -> entry.getCitationKey().map("#cite(label(\"%s\"))"::formatted)) + .map(entry -> entry.getCitationKey().map(key -> { + if (key.contains("/")) { + return "#cite(label(\"%s\"))".formatted(key); + } else { + return "@%s".formatted(key); + } + })) .flatMap(Optional::stream) .collect(Collectors.joining(" ")); } diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index 7d8d241ffa2..93a45b8d4cf 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -50,7 +50,6 @@ void biblatex_explicitCommand() { @Test void biblatex_missingKey() { - // If you decide to DROP empties, change formatter + this expectation. BibLatexFormatter formatter = new BibLatexFormatter("autocite"); String actual = formatter.format(queryParams(null), caywEntries("key1", "", "key3")); assertEquals("\\autocite{key1,key3}", actual); // current implementation @@ -83,7 +82,14 @@ void pandoc() { @Test void typst() { TypstFormatter formatter = new TypstFormatter(); - String actual = formatter.format(queryParams(null), caywEntries("key1", "key2/slash")); - assertEquals("#cite(label(\"key1\")) #cite(label(\"key2/slash\"))", actual); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); + assertEquals("@key1 @key2", actual); + } + + @Test + void typst_slashInKey() { + TypstFormatter formatter = new TypstFormatter(); + String actual = formatter.format(queryParams(null), caywEntries("key1", "key2/slash", "key3")); + assertEquals("@key1 #cite(label(\"key2/slash\")) @key3", actual); } } From ab18130c61d70bbbe79dfb033f1884a9fbd0db2f Mon Sep 17 00:00:00 2001 From: josephyim Date: Fri, 5 Sep 2025 23:51:16 +0800 Subject: [PATCH 10/14] Remove meaningless comment --- .../org/jabref/http/server/cayw/format/CAYWFormattersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index 93a45b8d4cf..ab3ece538b3 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -52,7 +52,7 @@ void biblatex_explicitCommand() { void biblatex_missingKey() { BibLatexFormatter formatter = new BibLatexFormatter("autocite"); String actual = formatter.format(queryParams(null), caywEntries("key1", "", "key3")); - assertEquals("\\autocite{key1,key3}", actual); // current implementation + assertEquals("\\autocite{key1,key3}", actual); assertEquals(MediaType.TEXT_PLAIN_TYPE, formatter.getMediaType()); } From 70ce1b93ebc825847bd92c82c28dd55ff9918894 Mon Sep 17 00:00:00 2001 From: Philip <37398281+palukku@users.noreply.github.com> Date: Sun, 7 Sep 2025 15:40:53 +0200 Subject: [PATCH 11/14] Update jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java --- .../java/org/jabref/http/server/cayw/format/TypstFormatter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java index 320438f59b3..f455bacbaf1 100644 --- a/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java +++ b/jabsrv/src/main/java/org/jabref/http/server/cayw/format/TypstFormatter.java @@ -28,7 +28,7 @@ public String format(CAYWQueryParams queryParams, List caywEntries) { if (key.contains("/")) { return "#cite(label(\"%s\"))".formatted(key); } else { - return "@%s".formatted(key); + return "#cite(<%s>)".formatted(key); } })) .flatMap(Optional::stream) From 21d82a9de428efa21368a76122df3ec9ff0203f2 Mon Sep 17 00:00:00 2001 From: Philip <37398281+palukku@users.noreply.github.com> Date: Sun, 7 Sep 2025 16:01:25 +0200 Subject: [PATCH 12/14] Update jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java --- .../org/jabref/http/server/cayw/format/CAYWFormattersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index ab3ece538b3..15c6f971317 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -83,7 +83,7 @@ void pandoc() { void typst() { TypstFormatter formatter = new TypstFormatter(); String actual = formatter.format(queryParams(null), caywEntries("key1", "key2")); - assertEquals("@key1 @key2", actual); + assertEquals("#cite() #cite()", actual); } @Test From 9cadf5fb22f6f1736c9bb776f298b621cb8f9f71 Mon Sep 17 00:00:00 2001 From: Philip <37398281+palukku@users.noreply.github.com> Date: Sun, 7 Sep 2025 16:03:47 +0200 Subject: [PATCH 13/14] Fix test --- .../org/jabref/http/server/cayw/format/CAYWFormattersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index 15c6f971317..41709193040 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -90,6 +90,6 @@ void typst() { void typst_slashInKey() { TypstFormatter formatter = new TypstFormatter(); String actual = formatter.format(queryParams(null), caywEntries("key1", "key2/slash", "key3")); - assertEquals("@key1 #cite(label(\"key2/slash\")) @key3", actual); + assertEquals("@key1 #cite(label(\"key2/slash\")) #cite()", actual); } } From 68ee3bbb378a3907d4e5c3ef546c0086bf4646fe Mon Sep 17 00:00:00 2001 From: Philip <37398281+palukku@users.noreply.github.com> Date: Sun, 7 Sep 2025 16:22:49 +0200 Subject: [PATCH 14/14] Update jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java --- .../org/jabref/http/server/cayw/format/CAYWFormattersTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java index 41709193040..b879d58f469 100644 --- a/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java +++ b/jabsrv/src/test/java/org/jabref/http/server/cayw/format/CAYWFormattersTest.java @@ -90,6 +90,6 @@ void typst() { void typst_slashInKey() { TypstFormatter formatter = new TypstFormatter(); String actual = formatter.format(queryParams(null), caywEntries("key1", "key2/slash", "key3")); - assertEquals("@key1 #cite(label(\"key2/slash\")) #cite()", actual); + assertEquals("#cite() #cite(label(\"key2/slash\")) #cite()", actual); } }