Skip to content

Commit 3032ba9

Browse files
committed
feat(engine): menus now support special characters in markdown headings
1 parent 93503ed commit 3032ba9

File tree

8 files changed

+134
-5
lines changed

8 files changed

+134
-5
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
---
2+
'@rocket/engine': patch
3+
---
4+
5+
Menus now support special characters in markdown headings.
6+
7+
Examples:
8+
9+
```md
10+
# Fun Errors & Feedback
11+
12+
# <some-button>
13+
```

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,19 @@ export function getHtmlMetaData(htmlFilePath) {
8282
if (isHeadline(data)) {
8383
const id = getAttribute(data, 'id');
8484
const linkText = getAttribute(data, 'link-text');
85-
const text = linkText || capturedHeadlineText || '';
85+
const processedCapturedHeadlineText = capturedHeadlineText
86+
?.replace(/</g, '<')
87+
.replace(/&/g, '&')
88+
.trim();
89+
const text = linkText || processedCapturedHeadlineText || '';
8690
if (data.name === 'h1') {
8791
metaData.h1 = text;
8892
}
8993
if (id && text) {
9094
if (!metaData.headlinesWithId) {
9195
metaData.headlinesWithId = [];
9296
}
93-
const rawTextObj = linkText ? { rawText: capturedHeadlineText } : {};
97+
const rawTextObj = linkText ? { rawText: processedCapturedHeadlineText } : {};
9498
metaData.headlinesWithId.push({
9599
text,
96100
id,

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,4 +851,46 @@ describe('Engine menus', () => {
851851
level: 0,
852852
});
853853
});
854+
855+
it('15: markdown special characters', async () => {
856+
const { build, readSource } = await setupTestEngine(
857+
'fixtures/05-menu/15-md-special-characters/docs',
858+
);
859+
await build();
860+
861+
expect(JSON.parse(readSource('pageTreeData.rocketGenerated.json'))).to.deep.equal({
862+
children: [
863+
{
864+
h1: '<some-button>',
865+
headlinesWithId: [
866+
{
867+
id: 'some-button',
868+
level: 1,
869+
text: '<some-button>',
870+
},
871+
],
872+
level: 1,
873+
menuLinkText: '<some-button>',
874+
name: '<some-button>',
875+
outputRelativeFilePath: 'component/index.html',
876+
sourceRelativeFilePath: 'component.rocket.md',
877+
url: '/component/',
878+
},
879+
],
880+
h1: 'Fun Errors & Feedback',
881+
headlinesWithId: [
882+
{
883+
id: 'fun-errors--feedback',
884+
level: 1,
885+
text: 'Fun Errors & Feedback',
886+
},
887+
],
888+
level: 0,
889+
menuLinkText: 'Fun Errors & Feedback',
890+
name: 'Fun Errors & Feedback',
891+
outputRelativeFilePath: 'index.html',
892+
sourceRelativeFilePath: 'index.rocket.md',
893+
url: '/',
894+
});
895+
});
854896
});

packages/engine/test-node/fixtures/04-layouts/01-function/docs/pageTreeData.rocketGenerated.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
22
"title": "Fixed Title",
3-
"h1": "\n Welcome Members:\n ",
3+
"h1": "Welcome Members:",
44
"headlinesWithId": [
55
{
6-
"text": "\n Welcome Members:\n ",
6+
"text": "Welcome Members:",
77
"id": "welcome-members",
88
"level": 1
99
}
1010
],
1111
"name": "Fixed Title",
12-
"menuLinkText": "\n Welcome Members:\n ",
12+
"menuLinkText": "Welcome Members:",
1313
"url": "/",
1414
"outputRelativeFilePath": "index.html",
1515
"sourceRelativeFilePath": "index.rocket.js",
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
```js server
2+
/* START - Rocket auto generated - do not touch */
3+
export const sourceRelativeFilePath = 'component.rocket.md';
4+
import { layout, html } from './recursive.data.js';
5+
export { layout, html };
6+
/* END - Rocket auto generated - do not touch */
7+
```
8+
9+
# <some-button>
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
```js server
2+
/* START - Rocket auto generated - do not touch */
3+
export const sourceRelativeFilePath = 'index.rocket.md';
4+
import { layout, html } from './recursive.data.js';
5+
export { layout, html };
6+
/* END - Rocket auto generated - do not touch */
7+
```
8+
9+
# Fun Errors & Feedback
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"h1": "Fun Errors & Feedback",
3+
"headlinesWithId": [
4+
{
5+
"text": "Fun Errors & Feedback",
6+
"id": "fun-errors--feedback",
7+
"level": 1
8+
}
9+
],
10+
"name": "Fun Errors & Feedback",
11+
"menuLinkText": "Fun Errors & Feedback",
12+
"url": "/",
13+
"outputRelativeFilePath": "index.html",
14+
"sourceRelativeFilePath": "index.rocket.md",
15+
"level": 0,
16+
"children": [
17+
{
18+
"h1": "<some-button>",
19+
"headlinesWithId": [
20+
{
21+
"text": "<some-button>",
22+
"id": "some-button",
23+
"level": 1
24+
}
25+
],
26+
"name": "<some-button>",
27+
"menuLinkText": "<some-button>",
28+
"url": "/component/",
29+
"outputRelativeFilePath": "component/index.html",
30+
"sourceRelativeFilePath": "component.rocket.md",
31+
"level": 1
32+
}
33+
]
34+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { PageTree, SiteMenu } 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+
export const layout = data => {
12+
return html`
13+
${pageTree.renderMenu(new SiteMenu(), data.sourceRelativeFilePath)}
14+
<main>${data.content()}</main>
15+
`;
16+
};
17+
18+
export { html };

0 commit comments

Comments
 (0)