From 4e2616fe2e78c4439f093436fd75de6e156fa9a2 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Sun, 12 Apr 2026 09:39:32 +0200 Subject: [PATCH] feat: Implement site-specific recipe parsers for ICA and generic fallback --- backend/src/quick-import/parsers/README.md | 57 ++++++++ .../src/quick-import/parsers/base.parser.ts | 53 +++++++ .../quick-import/parsers/generic.parser.ts | 136 ++++++++++++++++++ .../src/quick-import/parsers/ica.parser.ts | 124 ++++++++++++++++ .../src/quick-import/quick-import.service.ts | 130 ++++++----------- 5 files changed, 414 insertions(+), 86 deletions(-) create mode 100644 backend/src/quick-import/parsers/README.md create mode 100644 backend/src/quick-import/parsers/base.parser.ts create mode 100644 backend/src/quick-import/parsers/generic.parser.ts create mode 100644 backend/src/quick-import/parsers/ica.parser.ts diff --git a/backend/src/quick-import/parsers/README.md b/backend/src/quick-import/parsers/README.md new file mode 100644 index 00000000..5c7de9c1 --- /dev/null +++ b/backend/src/quick-import/parsers/README.md @@ -0,0 +1,57 @@ +# Site-Specifika Parsers + +Denna mapp innehåller parsers för olika receptsidor. Varje webbplats kan ha sina egna selectors och datastrukturer. + +## Arkitektur + +- **`base.parser.ts`** – Bas-klass som alla parsers extendar +- **`ica.parser.ts`** – Optimerad parser för ica.se +- **`generic.parser.ts`** – Generisk fallback-parser för okända sidor + +## Så lägger du till en ny parser + +1. Skapa en ny fil, t.ex. `mathem.parser.ts`: + +```typescript +import { RecipeParser, ParsedRecipe } from './base.parser'; + +export class MathemsRecipeParser extends RecipeParser { + canHandle(url: string): boolean { + return /mathem\.se/i.test(url); // Matchar bara mathem.se-URLs + } + + parse(html: string): ParsedRecipe { + // Din site-specifika parsing-logik här + // Returnera { name, ingredients, instructions } + } +} +``` + +2. Registrera parsern i `quick-import.service.ts`: + +```typescript +const parsers: RecipeParser[] = [ + new IcaRecipeParser(), + new MathemsRecipeParser(), // Din nya parser här + new GenericRecipeParser(), // Måste vara sist (fallback) +]; +``` + +## Bästa praxis + +- **I18n**: Använd svenska användarmeddelanden +- **Säkerhet**: Sanitera HTML-output innan du använder det +- **Robustness**: Testa edge-cases (tomma ingredienser, långa instruktioner) +- **Prioritering**: Mer specifika parsers måste komma före generiska + +## Tips för att debugga en ny sida + +1. Kolla om sidan använder JSON-LD: Öppna DevTools → Sök efter `