diff --git a/code/services-application/search-service/src/main/java/nu/marginalia/search/command/commands/BangCommand.java b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/commands/BangCommand.java index bea3ce05..8f505782 100644 --- a/code/services-application/search-service/src/main/java/nu/marginalia/search/command/commands/BangCommand.java +++ b/code/services-application/search-service/src/main/java/nu/marginalia/search/command/commands/BangCommand.java @@ -21,6 +21,7 @@ public class BangCommand implements SearchCommandInterface { { bangsToPattern.put("!g", "https://www.google.com/search?q=%s"); bangsToPattern.put("!ddg", "https://duckduckgo.com/search?q=%s"); + bangsToPattern.put("!w", "https://search.marginalia.nu/search?query=%s%20site:en.wikipedia.org&profile=wiki"); } @Override @@ -41,18 +42,25 @@ public class BangCommand implements SearchCommandInterface { return Optional.empty(); } - private Optional matchBangPattern(String query, String bangKey) { + /** If the query contains the bang pattern bangKey, return the query with the bang pattern removed. */ + Optional matchBangPattern(String query, String bangKey) { var bm = new BangMatcher(query); while (bm.findNext(bangKey)) { - if (bm.isRelativeSpaceOrInvalid(-1)) + if (!bm.isRelativeSpaceOrInvalid(-1)) continue; - if (bm.isRelativeSpaceOrInvalid(bangKey.length())) + if (!bm.isRelativeSpaceOrInvalid(bangKey.length())) continue; - String queryWithoutBang = bm.prefix().trim() + " " + bm.suffix(bangKey.length()).trim(); - return Optional.of(queryWithoutBang); + StringBuilder ret = new StringBuilder(bm.prefix().trim()); + + if (!ret.isEmpty()) + ret.append(" "); + + ret.append(bm.suffix(bangKey.length()).trim()); + + return Optional.of(ret.toString()); } return Optional.empty(); diff --git a/code/services-application/search-service/src/test/java/nu/marginalia/search/command/commands/BangCommandTest.java b/code/services-application/search-service/src/test/java/nu/marginalia/search/command/commands/BangCommandTest.java new file mode 100644 index 00000000..047b646d --- /dev/null +++ b/code/services-application/search-service/src/test/java/nu/marginalia/search/command/commands/BangCommandTest.java @@ -0,0 +1,37 @@ +package nu.marginalia.search.command.commands; + +import nu.marginalia.client.Context; +import nu.marginalia.search.command.SearchParameters; +import nu.marginalia.search.exceptions.RedirectException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class BangCommandTest { + public BangCommand bangCommand = new BangCommand(); + + @Test + public void testG() { + try { + bangCommand.process(Context.internal(), + null, + new SearchParameters(" !g test", + null, null, null, null) + ); + Assertions.fail("Should have thrown RedirectException"); + } + catch (RedirectException ex) { + assertEquals("https://www.google.com/search?q=test", ex.newUrl); + } + } + + @Test + public void testMatchPattern() { + var match = bangCommand.matchBangPattern("!g test", "!g"); + + assertTrue(match.isPresent()); + assertEquals(match.get(), "test"); + } + +} \ No newline at end of file