From 72a42294ff5bea1126a7217b17daf7727db243eb Mon Sep 17 00:00:00 2001 From: Alexander Goussas Date: Tue, 2 Jun 2026 11:26:39 -0500 Subject: [PATCH] feat: add duden source for german definitions --- .../FrenchWordDefinitionRepository.java | 2 +- .../GermanWordDefinitionRepository.java | 29 +++++++++++++++++++ .../LanguageAwareDefinitionsRepository.java | 6 ++-- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/main/java/net/frustratedfunctor/definitions/GermanWordDefinitionRepository.java diff --git a/src/main/java/net/frustratedfunctor/definitions/FrenchWordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/FrenchWordDefinitionRepository.java index 0b26252..f8bf961 100644 --- a/src/main/java/net/frustratedfunctor/definitions/FrenchWordDefinitionRepository.java +++ b/src/main/java/net/frustratedfunctor/definitions/FrenchWordDefinitionRepository.java @@ -22,7 +22,7 @@ public class FrenchWordDefinitionRepository implements WordDefinitionRepository .map(Element::ownText) .toList(); } catch (Exception e) { - Log.error("Error while fetching word translations", e); + Log.error("Error while fetching word definitions", e); return new ArrayList<>(); } } diff --git a/src/main/java/net/frustratedfunctor/definitions/GermanWordDefinitionRepository.java b/src/main/java/net/frustratedfunctor/definitions/GermanWordDefinitionRepository.java new file mode 100644 index 0000000..8790df0 --- /dev/null +++ b/src/main/java/net/frustratedfunctor/definitions/GermanWordDefinitionRepository.java @@ -0,0 +1,29 @@ +package net.frustratedfunctor.definitions; + +import io.quarkus.logging.Log; +import jakarta.enterprise.context.ApplicationScoped; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Element; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; + +@ApplicationScoped +public class GermanWordDefinitionRepository implements WordDefinitionRepository { + @Override + public List definitionsForWord(String word) { + try { + final var larousseUrl = URI.create("https://www.duden.de/rechtschreibung/" + word).toURL(); + final var doc = Jsoup.parse(larousseUrl, 10_000); + return doc + .select("#bedeutungen .enumeration__text") + .stream() + .map(Element::ownText) + .toList(); + } catch (Exception e) { + Log.error("Error while fetching word definitions", e); + return new ArrayList<>(); + } + } +} diff --git a/src/main/java/net/frustratedfunctor/definitions/LanguageAwareDefinitionsRepository.java b/src/main/java/net/frustratedfunctor/definitions/LanguageAwareDefinitionsRepository.java index fd43308..a2059e1 100644 --- a/src/main/java/net/frustratedfunctor/definitions/LanguageAwareDefinitionsRepository.java +++ b/src/main/java/net/frustratedfunctor/definitions/LanguageAwareDefinitionsRepository.java @@ -10,9 +10,11 @@ import java.util.List; @ApplicationScoped public class LanguageAwareDefinitionsRepository implements WordDefinitionRepository { private final FrenchWordDefinitionRepository french; + private final GermanWordDefinitionRepository german; - public LanguageAwareDefinitionsRepository(FrenchWordDefinitionRepository french) { + public LanguageAwareDefinitionsRepository(FrenchWordDefinitionRepository french, GermanWordDefinitionRepository german) { this.french = french; + this.german = german; } @Override @@ -23,7 +25,7 @@ public class LanguageAwareDefinitionsRepository implements WordDefinitionReposit public List definitionsForWord(String word, String lang) { return switch (Lang.parseOrDefault(lang)) { case French -> french.definitionsForWord(word); - case German -> List.of("OOPS! NOT IMPLEMENTED"); + case German -> german.definitionsForWord(word); }; } } -- 2.43.0