Skip to content

Commit 390335d

Browse files
committed
fix(engine): reparse html if pageTree requests a second pass
1 parent 6d2f469 commit 390335d

File tree

14 files changed

+140
-16
lines changed

14 files changed

+140
-16
lines changed

.changeset/lemon-knives-call.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@rocket/engine': patch
3+
'@rocket/launch': patch
4+
'@rocket/spark': patch
5+
---
6+
7+
Improve title tag handling

packages/engine/src/Engine.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,10 @@ export class Engine {
121121
if (pageTree.pageTreeChangedOnSave) {
122122
for (const sourceFilePath of sourceFiles) {
123123
const result = await this.renderFile({ sourceFilePath, throwOnError: true });
124+
await pageTree.add(result.sourceRelativeFilePath);
124125
await cleanupAutoGeneratedFiles(result);
125126
}
127+
await pageTree.save();
126128
}
127129
}
128130

packages/engine/src/web-menu/getHtmlMetaData.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,20 @@ export function getHtmlMetaData(htmlFilePath) {
2828
const metaData = {
2929
// headlinesWithId: [],
3030
};
31-
3231
/** @type {string | undefined} */
3332
let capturedHeadlineText = undefined;
33+
let withinHTMLHead = false;
3434
parser.eventHandler = (ev, _data) => {
3535
if (ev === SaxEventType.OpenTag) {
3636
const data = /** @type {Tag} */ (/** @type {any} */ (_data));
3737
if (isHeadline(data)) {
3838
capturedHeadlineText = '';
3939
}
40+
if (data.name === 'head') {
41+
withinHTMLHead = true;
42+
}
4043
}
44+
4145
if (capturedHeadlineText !== undefined && ev === SaxEventType.Text) {
4246
const data = /** @type {Text} */ (/** @type {any} */ (_data));
4347
capturedHeadlineText += data.value;
@@ -74,7 +78,7 @@ export function getHtmlMetaData(htmlFilePath) {
7478
metaData.menuNoLink = getAttribute(data, 'content') !== 'false';
7579
}
7680
}
77-
if (!metaData.title && data.name === 'title') {
81+
if (withinHTMLHead && data.name === 'title') {
7882
metaData.title = getText(data);
7983
}
8084

@@ -87,7 +91,7 @@ export function getHtmlMetaData(htmlFilePath) {
8791
.replace(/&/g, '&')
8892
.trim();
8993
const text = linkText || processedCapturedHeadlineText || '';
90-
if (data.name === 'h1') {
94+
if (!metaData.h1 && data.name === 'h1') {
9195
metaData.h1 = text;
9296
}
9397
if (id && text) {
@@ -104,6 +108,10 @@ export function getHtmlMetaData(htmlFilePath) {
104108
}
105109
capturedHeadlineText = undefined;
106110
}
111+
112+
if (data.name === 'head') {
113+
withinHTMLHead = false;
114+
}
107115
}
108116
};
109117

packages/engine/test-node/05z-menu.test.js

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -894,7 +894,7 @@ describe('Engine menus', () => {
894894
});
895895
});
896896

897-
it('15: link-text attribute', async () => {
897+
it('16: link-text attribute', async () => {
898898
const { build, readSource } = await setupTestEngine(
899899
'fixtures/05-menu/16-link-text-attribute/docs',
900900
);
@@ -929,4 +929,23 @@ describe('Engine menus', () => {
929929
url: '/',
930930
});
931931
});
932+
933+
it('17: title-tag', async () => {
934+
const { build, readSource, deleteSource } = await setupTestEngine(
935+
'fixtures/05-menu/17-title-tag/docs',
936+
);
937+
await deleteSource('pageTreeData.rocketGenerated.json');
938+
await build();
939+
940+
expect(JSON.parse(readSource('pageTreeData.rocketGenerated.json'))).to.deep.equal({
941+
h1: 'Welcome to Rocket',
942+
level: 0,
943+
menuLinkText: 'Welcome to Rocket',
944+
name: 'Welcome to Rocket',
945+
outputRelativeFilePath: 'index.html',
946+
sourceRelativeFilePath: 'index.rocket.js',
947+
title: 'Welcome to Rocket | Rocket',
948+
url: '/',
949+
});
950+
});
932951
});

packages/engine/test-node/fixtures/05-menu/02-generate-page-tree/docs/about.rocket.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ export { layout };
66

77
import { html } from 'lit';
88
export default () => html`
9-
<meta name="menu:link.text" content="About" />
10-
<title>About | MyPage</title>
11-
<h1>This is About</h1>
9+
<html>
10+
<head>
11+
<title>About | MyPage</title>
12+
</head>
13+
<body>
14+
<meta name="menu:link.text" content="About" />
15+
<h1>This is About</h1>
16+
</body>
17+
</html>
1218
`;

packages/engine/test-node/fixtures/05-menu/02-generate-page-tree/docs/pageTreeData.rocketGenerated.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"level": 0,
99
"children": [
1010
{
11-
"menuLinkText": "About",
1211
"title": "About | MyPage",
12+
"menuLinkText": "About",
1313
"h1": "This is About",
1414
"name": "This is About",
1515
"url": "/about/",
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/* START - Rocket auto generated - do not touch */
2+
export const sourceRelativeFilePath = 'index.rocket.js';
3+
import { layout, html } from './recursive.data.js';
4+
export { layout, html };
5+
/* END - Rocket auto generated - do not touch */
6+
7+
export default () => html` <h1>Welcome to Rocket</h1> `;
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"title": "Welcome to Rocket | Rocket",
3+
"h1": "Welcome to Rocket",
4+
"name": "Welcome to Rocket",
5+
"menuLinkText": "Welcome to Rocket",
6+
"url": "/",
7+
"outputRelativeFilePath": "index.html",
8+
"sourceRelativeFilePath": "index.rocket.js",
9+
"level": 0
10+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { PageTree } from '@rocket/engine';
2+
import { html } from 'lit';
3+
4+
const pageTree = new PageTree({
5+
inputDir: new URL('./', import.meta.url),
6+
outputDir: new URL('../__output', import.meta.url),
7+
});
8+
9+
await pageTree.restore();
10+
11+
const titleWrapperFn = title => (title ? `${title} | Rocket` : '');
12+
13+
export const layout = data => {
14+
const title = titleWrapperFn(pageTree.getPage(data.sourceRelativeFilePath)?.model?.name);
15+
return html`
16+
<html>
17+
<head>
18+
<title-server-only>${title}</title-server-only>
19+
</head>
20+
</html>
21+
<body>
22+
<main>${data.content()}</main>
23+
</body>
24+
</html>
25+
`;
26+
};
27+
28+
export { html };

packages/launch/src/LayoutMain.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export class LayoutMain extends Layout {
6565
},
6666
],
6767
footerMenu: [],
68-
titleWrapperFn: title => `${title} | ${this.options.siteName}`,
68+
titleWrapperFn: title => (title ? `${title} | ${this.options.siteName}` : ''),
6969
};
7070

7171
/**

0 commit comments

Comments
 (0)