Skip to content

Commit 627d2a1

Browse files
committed
Add support for page.md
1 parent 1d404bc commit 627d2a1

8 files changed

Lines changed: 51 additions & 7 deletions

File tree

.claude/settings.local.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"permissions": {
3+
"allow": [
4+
"Bash(node --test:*)"
5+
]
6+
}
7+
}

lib/build-pages/page-builders/md/get-md.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ function rewriteLinks (body /*, pretty */) {
114114
return body.replace(regex, function (_match, p1, p2, _p3) {
115115
const f = p2.toLowerCase()
116116

117-
// root readme
118-
if (f === 'readme') return p1 + '/"'
117+
// root readme or page.md
118+
if (f === 'readme' || f === 'page') return p1 + '/"'
119119

120-
// nested readme
121-
if (f.match(/readme$/)) return p1 + f.replace(/readme$/, '') + '"'
120+
// nested readme or page.md
121+
if (f.match(/readme$/) || f.match(/\/page$/)) return p1 + f.replace(/(readme|page)$/, '') + '"'
122122

123123
// pretty url
124124
// if (pretty) return p1 + f + '/"'

lib/identify-pages.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ export async function identifyPages (src, opts = {}) {
240240
: files['page.html']
241241
if (htmlPage) htmlPage.type = 'html'
242242
/** @type {PageFile | undefined} */
243+
const pageMd = opts?.buildDrafts
244+
? files['page.md'] ?? files['page.draft.md']
245+
: files['page.md']
246+
if (pageMd) pageMd.type = 'md'
247+
/** @type {PageFile | undefined} */
243248
const readmePage = opts?.buildDrafts
244249
? files['README.md'] ?? files['README.draft.md']
245250
: files['README.md']
@@ -281,7 +286,7 @@ export async function identifyPages (src, opts = {}) {
281286

282287
const page = (conflict)
283288
? null
284-
: jsPage || htmlPage || readmePage
289+
: jsPage || htmlPage || pageMd || readmePage
285290

286291
if (page && page.type) {
287292
pages.push({
@@ -306,9 +311,10 @@ export async function identifyPages (src, opts = {}) {
306311
const isMarkdownFile = fileName.endsWith('.md')
307312
const isDraftFile = fileName.endsWith('.draft.md')
308313
const isReadmeFile = fileName === 'README.md' || fileName === 'README.draft.md'
314+
const isPageMdFile = fileName === 'page.md' || fileName === 'page.draft.md'
309315

310316
if (
311-
!isReadmeFile && (
317+
!isReadmeFile && !isPageMdFile && (
312318
(opts.buildDrafts && (isMarkdownFile || isDraftFile)) ||
313319
(!opts.buildDrafts && (isMarkdownFile && !isDraftFile))
314320
)

lib/identify-pages.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ test.describe('identify-pages', () => {
1515
assert.ok(results.layouts, 'Layouts are found')
1616

1717
assert.ok(results.layouts['root'], 'A root layouts is found')
18-
assert.equal(Object.keys(results.pages).length, 25, '25 pages are found')
18+
assert.equal(Object.keys(results.pages).length, 27, '27 pages are found')
1919

2020
assert.equal(results.warnings.length, 0, '0 warnings produced')
2121
// assert.equal(results.nonPageFolders.length, 4, '4 non-page-folder')
2222
assert.equal(results.pages.find(p => p.path === 'html-page')?.pageFile?.type, 'html', 'html page is type html')
2323
assert.equal(results.pages.find(p => p.path === 'md-page')?.pageFile?.type, 'md', 'md page is type md')
2424
assert.equal(results.pages.find(p => p.path === 'js-page')?.pageFile?.type, 'js', 'js-page is type js')
25+
assert.equal(results.pages.find(p => p.path === 'page-md-page')?.pageFile?.type, 'md', 'page-md-page is type md')
26+
assert.equal(results.pages.find(p => p.path === 'page-md-page')?.pageFile?.basename, 'page.md', 'page-md-page uses page.md')
27+
assert.equal(results.pages.find(p => p.path === 'page-md-precedence')?.pageFile?.basename, 'page.md', 'page.md takes precedence over README.md')
2528
})
2629
})

test-cases/general-features/index.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ test.describe('general-features', () => {
7474
style: true,
7575
worker: true
7676
},
77+
'page-md-page/index.html': {
78+
client: false,
79+
style: false,
80+
},
81+
'page-md-precedence/index.html': {
82+
client: false,
83+
style: false,
84+
},
7785
}
7886

7987
const files = await allFiles(dest, { shaper: fwData => fwData })
@@ -90,6 +98,17 @@ test.describe('general-features', () => {
9098
? 'Generated'
9199
: 'Did not generate'} a global client`)
92100

101+
// Special test for page.md precedence over README.md
102+
const pageMdPrecedencePath = path.join(dest, 'page-md-precedence/index.html')
103+
try {
104+
const pageMdContent = await readFile(pageMdPrecedencePath, 'utf8')
105+
assert.ok(pageMdContent.includes('from page.md'), 'page.md content is rendered')
106+
assert.ok(!pageMdContent.includes('from README.md'), 'README.md content is not rendered when page.md exists')
107+
} catch (err) {
108+
const error = err instanceof Error ? err : new Error('Unknown error', { cause: err })
109+
assert.fail('Failed to verify page.md precedence: ' + error.message)
110+
}
111+
93112
// Special test for markdown-it.settings.js
94113
const mdSettingsTestPath = path.join(dest, 'md-page/markdown-settings-test.html')
95114
try {
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# page-md-page
2+
3+
This is an md page rendered from a page.md file.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# page-md-precedence (from README.md)
2+
3+
This content should NOT appear - page.md takes precedence.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# page-md-precedence (from page.md)
2+
3+
This content comes from page.md and should take precedence over README.md.

0 commit comments

Comments
 (0)