From: Lady Date: Sat, 23 Sep 2023 22:06:47 +0000 (-0400) Subject: List subpages in a see also section X-Git-Tag: 0.4.0 X-Git-Url: https://git.ladys.computer/GitWikiWeb/commitdiff_plain/b4a27c571b489ae88a315f460a69187128424a5a List subpages in a see also section --- diff --git a/build.js b/build.js index 3b40c3a..fa0b836 100644 --- a/build.js +++ b/build.js @@ -229,82 +229,6 @@ class GitWikiWebPage { djot.applyFilter(ast, () => { let titleSoFar = null; // used to collect strs from headings return { - doc: { - enter: (_) => {}, - exit: (e) => { - const links_section = []; - if (internalLinks.size || externalLinks.size) { - links_section.push( - rawBlock``, - ); - } else { - /* do nothing */ - } - e.children.push( - rawBlock``, - ); - }, - }, hard_break: { enter: (_) => { if (titleSoFar != null) { @@ -738,28 +662,157 @@ class GitWikiWebPage { ), ]).then(logErrorsAndCollectResults); promises.length = 0; - const redLinks = (() => { - const result = new Set(); - for (const page of pages.values()) { + const { redLinks, subpages } = (() => { + const redLinks = new Set(); + const subpages = new Map(); + for (const [pageRef, page] of pages) { + let superRef = pageRef; + while ( + (superRef = superRef.substring(0, superRef.indexOf("/"))) + ) { + // Iterate over potential superpages and record them if they + // actually exist. + if (pages.has(superRef)) { + // There is a superpage for the current page; record it. + if (subpages.has(superRef)) { + // The identified superpage already has other subpages. + subpages.get(superRef).add(pageRef); + } else { + // The identified superpage does not already have other + // subpages. + subpages.set(superRef, new Set([pageRef])); + } + break; + } else { + // The superpage for the current page has not been found + // yet. + /* do nothing */ + } + } for (const link of page.internalLinks()) { + // Iterate over the internal links of the current page and + // ensure they are all defined. if (pages.has(link)) { + // The link was defined. continue; } else { - result.add(link); + // The link was not defined; it is a redlink. + redLinks.add(link); } } } - return result; + return { redLinks, subpages }; })(); - for ( - const [pageRef, { ast, namespace, sections, source }] of pages - ) { + for (const [pageRef, page] of pages) { + const { ast, sections, source } = page; const title = sections.main?.title ?? pageRef; + const internalLinks = new Set(page.internalLinks()); + const externalLinks = new Map(page.externalLinks()); + const subpageRefs = subpages.get(pageRef) ?? new Set(); djot.applyFilter(ast, () => { let isNavigationPage = true; return { doc: { enter: (e) => { + const seeAlsoSection = []; + const linksSection = []; + if (subpageRefs.size) { + seeAlsoSection.push( + rawBlock``, + ); + } else { + /* do nothing */ + } + if (internalLinks.size || externalLinks.size) { + linksSection.push( + rawBlock``, + ); + } else { + /* do nothing */ + } + const childrenAndLinks = [ + ...e.children, + ...seeAlsoSection, + rawBlock``, + ]; const { content, navigation } = (() => { const navigation = []; if (pageRef == "Special:RecentlyChanged") { @@ -800,7 +853,7 @@ class GitWikiWebPage { }); } else { isNavigationPage = false; - return { content: e.children, navigation }; + return { content: childrenAndLinks, navigation }; } return { content: [ @@ -816,7 +869,7 @@ class GitWikiWebPage { rawBlock``, ],