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"
]);
}
Here is the working GroeiGidsParser.js for https://groeigids.nl/:
`"use strict";
/*
*/
class GroeigidsParser extends Parser {
}
// =============================================================================
// Registreer de parser in de ParserFactory
// =============================================================================
parserFactory.register("www.groeigids.nl", function () {
return new GroeigidsParser();
});
`