This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch quick-fix/mirror-directory-links in repository https://gitbox.apache.org/repos/asf/camel-website.git
commit b32a72c633c47a0a7510a0f4e4b5d25d5284cdce Author: Claus Ibsen <[email protected]> AuthorDate: Fri Sep 18 18:54:36 2026 +0200 chore: point links between website pages and blog posts at their Markdown mirror Hugo pages link to each other by directory (../camel-dna/, /blog/2026/07/ some-post/), so a reader of the Markdown mirror following such a link got the HTML page. Like the .html links that are already rewritten to .md, a directory link now gets index.md appended when that page has a mirror; links to list pages, redirects and external sites are left alone. This runs as a pass over the generated index.md files once every mirror is written, since only then is the set of mirrors known. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> --- gulp/helpers/convert-page.js | 29 ++++++++++++++++++++++++++++- gulp/tasks/generate-markdown.js | 14 +++++++++++++- test/convert-page-test.js | 23 +++++++++++++++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/gulp/helpers/convert-page.js b/gulp/helpers/convert-page.js index ac593aae..d5cb6077 100644 --- a/gulp/helpers/convert-page.js +++ b/gulp/helpers/convert-page.js @@ -96,4 +96,31 @@ function trimBlogPost(article) { } } -module.exports = { convertPage }; +/** + * Points links at other website pages and blog posts to their Markdown mirror. Hugo pages link + * to each other by directory (`../camel-dna/`, `/blog/2026/07/some-post/#section`); where that + * page has a mirror, the link gets `index.md` appended so a reader stays in Markdown, like the + * `.html` links that convertPage already rewrites to `.md`. + * + * @param {string} markdown the converted page + * @param {string} pagePath site-relative path of this page's Markdown, e.g. /trust/index.md + * @param {(path: string) => boolean} hasMirror whether a site-relative Markdown path exists + * @returns {string} the Markdown with the links rewritten + */ +function rewriteDirectoryLinks(markdown, pagePath, hasMirror) { + const site = 'https://camel.apache.org'; + return markdown.replace(/\]\(([^)\s]*\/)(#[^)\s]*)?\)/g, (match, target, fragment = '') => { + let resolved; + try { + resolved = new URL(target, site + pagePath); + } catch { + return match; + } + if (resolved.origin !== site || !hasMirror(`${resolved.pathname}index.md`)) { + return match; + } + return `](${target}index.md${fragment})`; + }); +} + +module.exports = { convertPage, rewriteDirectoryLinks }; diff --git a/gulp/tasks/generate-markdown.js b/gulp/tasks/generate-markdown.js index de3aa02e..ecac0d1f 100644 --- a/gulp/tasks/generate-markdown.js +++ b/gulp/tasks/generate-markdown.js @@ -1,5 +1,5 @@ const fs = require('fs'); -const { convertPage } = require('../helpers/convert-page'); +const { convertPage, rewriteDirectoryLinks } = require('../helpers/convert-page'); const { createTurndownService } = require('../helpers/turndown-config'); const { generateToonSitemaps } = require('../helpers/toon-format'); const { generateLlmsTxt } = require('../helpers/llms-txt'); @@ -82,6 +82,18 @@ async function generateMarkdown() { console.log(`\nSuccessfully generated ${processedCount} Markdown files`); + // Website pages and blog posts link to each other by directory; now that every mirror is + // written, point such links at the mirror where there is one + const mirrors = new Set(processedPages); + for (const urlPath of processedPages.filter(p => p.endsWith('/index.md'))) { + const mdFile = `public${urlPath}`; + const markdown = fs.readFileSync(mdFile, 'utf8'); + const rewritten = rewriteDirectoryLinks(markdown, urlPath, p => mirrors.has(p)); + if (rewritten !== markdown) { + fs.writeFileSync(mdFile, rewritten, 'utf8'); + } + } + // Generate llms.txt file generateLlmsTxt(processedPages); diff --git a/test/convert-page-test.js b/test/convert-page-test.js index fbd86010..7477dba2 100644 --- a/test/convert-page-test.js +++ b/test/convert-page-test.js @@ -147,3 +147,26 @@ test('a blog post without the rail details still converts', () => { assert.equal(convertPage(html, createTurndownService()).markdown, '# Bare\n\nBody.') }) + +const { rewriteDirectoryLinks } = require('../gulp/helpers/convert-page') + +test('directory links to pages that have a Markdown mirror get index.md appended', () => { + const mirrors = new Set(['/camel-dna/index.md', '/blog/2026/07/some-post/index.md', '/trust/index.md']) + const markdown = 'See [Camel DNA](../camel-dna/), [a post](/blog/2026/07/some-post/#section), ' + + '[Why Camel](https://camel.apache.org/trust/), [downloads](../download/), ' + + '[docs](../manual/getting-started.md), [external](https://kaoto.io/) and .' + + assert.equal(rewriteDirectoryLinks(markdown, '/what-is-apache-camel/index.md', p => mirrors.has(p)), + 'See [Camel DNA](../camel-dna/index.md), [a post](/blog/2026/07/some-post/index.md#section), ' + + '[Why Camel](https://camel.apache.org/trust/index.md), [downloads](../download/), ' + + '[docs](../manual/getting-started.md), [external](https://kaoto.io/) and .') +}) + +test('directory links resolve relative to the page that carries them', () => { + const mirrors = new Set(['/blog/2026/07/other/index.md']) + + assert.equal(rewriteDirectoryLinks('[other](../other/)', '/blog/2026/07/this/index.md', p => mirrors.has(p)), + '[other](../other/index.md)') + assert.equal(rewriteDirectoryLinks('[other](../other/)', '/blog/2026/08/this/index.md', p => mirrors.has(p)), + '[other](../other/)') +})
