Skip to content

Please add this parser for the site https://www.groeigids.nl, (can be removed) #2590

@elfje4life

Description

@elfje4life

Here is the working GroeiGidsParser.js for https://groeigids.nl/:
`"use strict";

/*

  • Groeigids.js - WebToEpub parser voor www.groeigids.nl
  • Plaatsing:
  • Kopieer dit bestand naar: plugin/js/parsers/Groeigids.js
  • Voeg onderstaande regel toe in popup.html (bij de andere parser <script> tags):
  • <script src="js/parsers/Groeigids.js"></script>
  • Structuur van groeigids.nl:
  • Hoofdmenu → Diepere menu's → SubTitels → SubLinks (artikelen)
  • De parser doorloopt alle niveaus en maakt van elk artikel een hoofdstuk,
  • inclusief afbeelding, titel en tekst.
    */

class GroeigidsParser extends Parser {

constructor() {
    super();
}

// -------------------------------------------------------------------------
// Stap 1: Registreer de parser voor groeigids.nl
// -------------------------------------------------------------------------

// -------------------------------------------------------------------------
// Stap 2: Haal de lijst van alle hoofdstuk-URLs op
// Groeigids is een Angular SPA, dus we doorlopen de structuur handmatig:
//   Hoofdmenu → diepere menu links → per dieper menu → SubLinks (artikel URLs)
// -------------------------------------------------------------------------
async getChapterUrls(dom) {
    let chapterUrls = [];

    // Haal alle "diepere menu" links op van de hoofdpagina
    let menuLinks = [...dom.querySelectorAll(
        "app-groei-info-tiles section a"
    )];

    for (let menuLink of menuLinks) {
        let menuUrl = menuLink.href || menuLink.getAttribute("href");
        if (!menuUrl) continue;

        // Zorg dat het een absolute URL is
        menuUrl = new URL(menuUrl, "https://www.groeigids.nl").href;

        let menuDom = await this.fetchDom(menuUrl);
        if (!menuDom) continue;

        // Haal alle SubLinks (artikel-pagina's) op binnen dit diepere menu
        let subLinks = [...menuDom.querySelectorAll(
            "app-link-tree app-navigation-simple nav a"
        )];

        for (let subLink of subLinks) {
            let subUrl = subLink.href || subLink.getAttribute("href");
            if (!subUrl) continue;
            subUrl = new URL(subUrl, "https://www.groeigids.nl").href;

            let title = subLink.textContent.trim();
            chapterUrls.push({ sourceUrl: subUrl, title: title });
        }
    }

    return chapterUrls;
}

// -------------------------------------------------------------------------
// Stap 3: Haal de boektitel op van de hoofdpagina
// -------------------------------------------------------------------------
extractTitle(dom) {
    let titleEl = dom.querySelector(
        "app-home header h1"
    );
    return (titleEl !== null)
    ? titleEl.textContent.trim()
    : "Groeigids";
}

// -------------------------------------------------------------------------
// Stap 4: Haal de inhoud op van een individuele SubLink-pagina (artikel)
// -------------------------------------------------------------------------
findContent(dom) {
    // Bouw een container op met afbeelding + tekst samen
    let content = dom.createElement
    ? dom.createElement("div")
    : document.createElement("div");

    // Afbeelding (header img)
    let img = dom.querySelector(
        "app-article app-wp-section header img"
    );
    if (img) {
        content.appendChild(img.cloneNode(true));
    }

    // Artikeltekst
    let article = dom.querySelector(
        "app-article app-wp-section div.wp-section article"
    );
    if (article) {
        content.appendChild(article.cloneNode(true));
    }

    return content.children.length > 0 ? content : null;
}

// -------------------------------------------------------------------------
// Stap 5: Haal de hoofdstuktitel op van een SubLink-pagina
// -------------------------------------------------------------------------
findChapterTitle(dom) {
    return dom.querySelector(
        "app-article app-wp-section div.wp-section h1"
    );
}

// -------------------------------------------------------------------------
// Stap 6: Geen expliciete auteur op groeigids.nl, gebruik de standaard
// -------------------------------------------------------------------------
extractAuthor(dom) {
    return "Groeigids.nl";
}

// -------------------------------------------------------------------------
// Stap 7: Cover afbeelding — gebruik de eerste afbeelding van het eerste
// diepere menu
// -------------------------------------------------------------------------
findCoverImageUrl(dom) {
    return util.getFirstImgSrc(dom, "app-content-banner div.imagery");
}

// -------------------------------------------------------------------------
// Hulpfunctie: fetch een pagina en geef de DOM terug
// (WebToEpub's HttpClient wordt gebruikt via de Parser basisklasse)
// -------------------------------------------------------------------------
async fetchDom(url) {
    try {
        let xhr = await HttpClient.fetchHtml(url);
        return xhr.responseXML || new DOMParser().parseFromString(xhr.responseText, "text/html");
    } catch (e) {
        console.warn("GroeigidsParser: kon pagina niet ophalen:", url, e);
        return null;
    }
}

// -------------------------------------------------------------------------
// Verwijder ongewenste navigatie-elementen uit de inhoud
// -------------------------------------------------------------------------
removeUnwantedElements(pageContent) {
    super.removeUnwantedElements(pageContent, [
        "nav",
        "app-navigation-simple",
        "app-link-tree",
        "app-groei-info-tiles",
        "footer",
        ".cookie-banner",
        "script",
        "style"
    ]);
}

}

// =============================================================================
// Registreer de parser in de ParserFactory
// =============================================================================
parserFactory.register("www.groeigids.nl", function () {
return new GroeigidsParser();
});
`

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions