diff --git a/znai-core/src/main/java/org/testingisdocumenting/znai/structure/TableOfContents.java b/znai-core/src/main/java/org/testingisdocumenting/znai/structure/TableOfContents.java index 062000898..ecac62250 100644 --- a/znai-core/src/main/java/org/testingisdocumenting/znai/structure/TableOfContents.java +++ b/znai-core/src/main/java/org/testingisdocumenting/znai/structure/TableOfContents.java @@ -80,6 +80,12 @@ public TocItem firstNonIndexPage() { .orElse(null); } + public Optional firstPageInChapter(String dirName) { + return tocItems.stream() + .filter(tocItem -> tocItem.getDirName().equals(dirName)) + .findFirst(); + } + public void removeTocItem(String dirName, String fileNameWithoutExtension) { tocItems.removeIf(item -> item.match(dirName, fileNameWithoutExtension)); } @@ -139,6 +145,13 @@ public List getTocItems() { return Collections.unmodifiableList(tocItems); } + public Set getAllDirNames() { + return tocItems.stream() + .map(TocItem::getDirName) + .filter(dirName -> !dirName.isEmpty()) + .collect(toSet()); + } + public Collection getResolvedPaths() { return tocItemByPath.keySet(); } diff --git a/znai-docs/znai/release-notes/1.79/add-2025-08-31-index-pages-for-chapters.md b/znai-docs/znai/release-notes/1.79/add-2025-08-31-index-pages-for-chapters.md new file mode 100644 index 000000000..89dc0716c --- /dev/null +++ b/znai-docs/znai/release-notes/1.79/add-2025-08-31-index-pages-for-chapters.md @@ -0,0 +1 @@ +* Add: Generate index.html files for chapters to automatically redirect to the first page \ No newline at end of file diff --git a/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java b/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java index a7ee37deb..1676c720c 100644 --- a/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java +++ b/znai-website-gen/src/main/java/org/testingisdocumenting/znai/website/WebSite.java @@ -38,6 +38,7 @@ import org.testingisdocumenting.znai.utils.JsonUtils; import org.testingisdocumenting.znai.parser.MarkupParsingConfiguration; import org.testingisdocumenting.znai.parser.MarkupParsingConfigurations; +import org.testingisdocumenting.znai.utils.ResourceUtils; import org.testingisdocumenting.znai.website.modifiedtime.FileBasedPageModifiedTime; import org.testingisdocumenting.znai.website.modifiedtime.PageModifiedTimeStrategy; @@ -200,6 +201,7 @@ private void registerPreprocessor() { public void deploy() { reportPhase("deploying documentation"); generatePages(); + generateChapterIndexRedirectPages(); generateSearchIndex(); generateLlmContent(); deployToc(); @@ -634,6 +636,22 @@ private void generatePages() { buildJsonOfAllPages(); } + private void generateChapterIndexRedirectPages() { + reportPhase("generating chapter index redirect pages"); + + Set dirNames = toc.getAllDirNames(); + dirNames.forEach(dirName -> { + toc.firstPageInChapter(dirName).ifPresent((tocItem) -> { + String redirectUrl = docStructure.fullUrl( + tocItem.getDirName() + "/" + tocItem.getFileNameWithoutExtension()); + String redirectPage = ResourceUtils.textContent("template/redirect.html") + .replace("${newUrl}", redirectUrl); + + deployer.deploy(dirName + "/index.html", redirectPage); + }); + }); + } + private void generateSearchIndex() { reportPhase("generating search index"); diff --git a/znai-website-gen/src/main/resources/template/redirect.html b/znai-website-gen/src/main/resources/template/redirect.html new file mode 100644 index 000000000..7a0649d18 --- /dev/null +++ b/znai-website-gen/src/main/resources/template/redirect.html @@ -0,0 +1,10 @@ + + + + + + redirecting... + + + + \ No newline at end of file