From a53a32f0066a24d63e381f2820672fa2ca97f150 Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Sat, 4 May 2024 11:31:11 +0200 Subject: [PATCH] (search) Spell out website problems with "atomic elements" instead of having a hover that's inaccessible with keyboard navigation --- .../marginalia/search/model/UrlDetails.java | 21 ++++++++++++------- .../templates/search/parts/search-result.hdb | 4 +++- .../paperdoll/SearchServicePaperDoll.java | 6 ++---- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/services-application/search-service/java/nu/marginalia/search/model/UrlDetails.java b/code/services-application/search-service/java/nu/marginalia/search/model/UrlDetails.java index 82cb2ccc..41e152e6 100644 --- a/code/services-application/search-service/java/nu/marginalia/search/model/UrlDetails.java +++ b/code/services-application/search-service/java/nu/marginalia/search/model/UrlDetails.java @@ -7,6 +7,7 @@ import nu.marginalia.model.EdgeUrl; import nu.marginalia.model.crawl.DomainIndexingState; import nu.marginalia.model.crawl.HtmlFeature; +import java.util.ArrayList; import java.util.List; import java.util.StringJoiner; @@ -104,25 +105,25 @@ public class UrlDetails implements Comparable { return Integer.bitCount(features & mask); } - public String getProblems() { - StringJoiner sj = new StringJoiner(", "); + public List getProblems() { + List problems = new ArrayList<>(); if (isScripts()) { - sj.add("Javascript"); + problems.add(new UrlProblem("Js", "The page uses Javascript")); } if (isCookies()) { - sj.add("Cookies"); + problems.add(new UrlProblem("Co", "The page uses Cookies")); } if (isTracking()) { - sj.add("Tracking/Analytics"); + problems.add(new UrlProblem("Tr", "The page uses Tracking/Analytics")); } if (isAffiliate()) { - sj.add("Affiliate Linking"); + problems.add(new UrlProblem("Af", "The page may use Affiliate Linking")); } if (isAds()) { - sj.add("Ads/Adtech Tracking"); + problems.add(new UrlProblem("Ad", "The page uses Ads/Adtech Tracking")); } - return sj.toString(); + return problems; } @@ -151,4 +152,8 @@ public class UrlDetails implements Comparable { return 10; } + + public static record UrlProblem(String name, String description) { + + } } diff --git a/code/services-application/search-service/resources/templates/search/parts/search-result.hdb b/code/services-application/search-service/resources/templates/search/parts/search-result.hdb index ae152889..e448fcdb 100644 --- a/code/services-application/search-service/resources/templates/search/parts/search-result.hdb +++ b/code/services-application/search-service/resources/templates/search/parts/search-result.hdb @@ -10,7 +10,9 @@ Info {{#if hasMoreResults}}{{resultsFromSameDomain}}+{{/if}}{{/unless}}
- {{#if problemCount}} ⚠ {{problemCount}} {{/if}} + {{#each problems}} + {{name}} + {{/each}}
Terms appear in {{positionsCount}} positions
diff --git a/code/services-application/search-service/test/nu/marginalia/search/paperdoll/SearchServicePaperDoll.java b/code/services-application/search-service/test/nu/marginalia/search/paperdoll/SearchServicePaperDoll.java index 8963d39b..9c96dc18 100644 --- a/code/services-application/search-service/test/nu/marginalia/search/paperdoll/SearchServicePaperDoll.java +++ b/code/services-application/search-service/test/nu/marginalia/search/paperdoll/SearchServicePaperDoll.java @@ -33,10 +33,7 @@ import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; @@ -147,6 +144,7 @@ public class SearchServicePaperDoll extends AbstractModule { registerSearchResult("https://www.example.com/foo", "Foo", "Lorem ipsum dolor sit amet", Set.of(), 0.5, 0.5, ~0L); registerSearchResult("https://www.example2.com/bar", "Bar", "Some text goes here", Set.of(), 0.5, 0.5, 1L); + registerSearchResult("https://www.example3.com/baz", "All HTML Features", "This one's got every feature", EnumSet.allOf(HtmlFeature.class), 0.5, 0.5, 1L); for (;;); }