From f837cc3e35e8292a63aa00708319848e9cf4bab1 Mon Sep 17 00:00:00 2001 From: MykolaGolubyev Date: Sun, 31 Aug 2025 12:53:11 -0400 Subject: [PATCH 1/2] flow: add chapter redirect index pages --- .../znai/structure/TableOfContents.java | 12 ++++++++++++ .../add-2025-08-31-index-pages-for-chapters.md | 1 + .../znai/website/WebSite.java | 18 ++++++++++++++++++ .../src/main/resources/template/redirect.html | 10 ++++++++++ 4 files changed, 41 insertions(+) create mode 100644 znai-docs/znai/release-notes/1.79/add-2025-08-31-index-pages-for-chapters.md create mode 100644 znai-website-gen/src/main/resources/template/redirect.html 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..133e5d728 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,12 @@ public List getTocItems() { return Collections.unmodifiableList(tocItems); } + public Set getAllDirNames() { + return tocItems.stream() + .filter(tocItem -> !tocItem.isIndex()) + .map(TocItem::getDirName).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 From afb8bb4dfdd4472066504b735cbcea3b3c818167 Mon Sep 17 00:00:00 2001 From: MykolaGolubyev Date: Sun, 31 Aug 2025 13:12:51 -0400 Subject: [PATCH 2/2] fix outside chapters --- .../testingisdocumenting/znai/structure/TableOfContents.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) 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 133e5d728..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 @@ -147,8 +147,9 @@ public List getTocItems() { public Set getAllDirNames() { return tocItems.stream() - .filter(tocItem -> !tocItem.isIndex()) - .map(TocItem::getDirName).collect(toSet()); + .map(TocItem::getDirName) + .filter(dirName -> !dirName.isEmpty()) + .collect(toSet()); } public Collection getResolvedPaths() {