From e609113f1cfcd658729f953b28e94b6c66865d17 Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Sun, 12 Jul 2026 14:33:08 +0200 Subject: [PATCH 1/3] chore(spec-006): mark content-extractor in progress, link issue #11 Refs #11 --- docs/specs/INDEX.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/specs/INDEX.md b/docs/specs/INDEX.md index 3c8a320..fee3da8 100644 --- a/docs/specs/INDEX.md +++ b/docs/specs/INDEX.md @@ -11,7 +11,7 @@ roadmap step, to be implemented sequentially (each builds on the previous). | 003 | 003-content-document-index | Content document & index | backend, search, data-model | `ContentDocument` record + Meilisearch `IndexSettings` bean | #5 | done | | 004 | 004-sitemap-crawler | Sitemap crawler | backend, crawler | `SitemapCrawler` — sitemap discovery of URLs + lastmod | #7 | done | | 005 | 005-page-fetcher | Page fetcher | backend, crawler | `PageFetcher` — robust HTTP fetch (ETag/IMS, rate limit, retry) | #9 | done | -| 006 | 006-content-extractor | Content extractor | backend, crawler | `ContentExtractor` — jsoup content + metadata extraction | — | open | +| 006 | 006-content-extractor | Content extractor | backend, crawler | `ContentExtractor` — jsoup content + metadata extraction | #11 | in progress | | 007 | 007-source-strategy | Source strategy | backend, architecture | `ContentSourceStrategy` interface + `WebsiteSourceStrategy` | — | open | | 008 | 008-content-indexer | Content indexer | backend, search, crawler | `ContentIndexer` — orchestration, diff, upsert/delete | — | open | | 009 | 009-content-bootstrap-step | Content bootstrap step | backend, search | `ContentBootstrapStep` — initial reindex via `SearchIndexBootstrapStep` | — | open | From 8352cfbbfcd8a96f8f2e947058dc8396c11e198e Mon Sep 17 00:00:00 2001 From: Hendrik Ebbers Date: Sun, 12 Jul 2026 14:38:07 +0200 Subject: [PATCH 2/3] feat(spec-006): jsoup content + metadata extractor - ExtractedContent record (body + title/excerpt/author/categories/ publishedDate/previewImage/locale; categories normalized). - ContentExtractor (@Component, ContentLocaleResolver + ObjectMapper): reads metadata before stripping scripts (JSON-LD survives), then strips script/style/noscript/template + comments; selects the container via contentSelector (comma fallback, body = whole doc, readability fallback), removes contentExclude, and whitespace-normalizes to block-separated body. Metadata from OpenGraph/Article meta, JSON-LD (arrays/@graph), and