Skip to content

Commit 6c511b8

Browse files
feat: adds yaml frontmatter support
1 parent 1d01c77 commit 6c511b8

File tree

5 files changed

+97
-1
lines changed

5 files changed

+97
-1
lines changed

package-lock.json

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,8 @@
4747
"typedoc": "^0.23.9",
4848
"typescript": "^4.7.4",
4949
"uglify-js": "^3.16.3"
50+
},
51+
"dependencies": {
52+
"yaml": "^2.4.5"
5053
}
5154
}

src/defaults.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { codeblockRenderer } from './renderers/codeblock';
55
import { dlRenderer } from './renderers/dl';
66
import { emojiRenderer } from './renderers/emoji';
77
import { footnoteRenderer } from './renderers/footnote';
8+
import { frontmatter, frontmatterRenderer } from './renderers/frontmatter';
89
import { h1Renderer } from './renderers/h1';
910
import { h2Renderer } from './renderers/h2';
1011
import { h3Renderer } from './renderers/h3';
@@ -18,7 +19,6 @@ import { italicRenderer } from './renderers/italic';
1819
import { linkRenderer } from './renderers/link';
1920
import { olRenderer } from './renderers/ol';
2021
import { pRenderer } from './renderers/p';
21-
import { strikethroughRenderer } from './renderers/strikethrough';
2222
import {
2323
bigintRenderer,
2424
booleanRenderer,
@@ -28,6 +28,7 @@ import {
2828
stringRenderer,
2929
undefinedRenderer,
3030
} from './renderers/primitives';
31+
import { strikethroughRenderer } from './renderers/strikethrough';
3132
import { subRenderer } from './renderers/sub';
3233
import { supRenderer } from './renderers/sup';
3334
import { tableRenderer } from './renderers/table';
@@ -79,6 +80,7 @@ export function getRenderers(customRenderers: Renderers = {}): Renderers {
7980
tasks: tasksRenderer,
8081
text: textRenderer,
8182
ul: ulRenderer,
83+
frontmatter: frontmatterRenderer,
8284
...customRenderers,
8385
};
8486
}

src/renderers/frontmatter.test.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { tsMarkdown } from '../rendering';
2+
import { FrontmatterEntry, frontmatter } from './frontmatter';
3+
4+
describe('given a frontmatter entry', () => {
5+
describe('with an object value', () => {
6+
const entry: FrontmatterEntry = {
7+
frontmatter: {
8+
date: '1970-01-01',
9+
},
10+
};
11+
12+
test('renders a frontmatter header with the specified object as content', () => {
13+
expect(tsMarkdown([entry])).toBe(
14+
`---\n${Object.keys(entry.frontmatter)[0]}: ${
15+
Object.values(entry.frontmatter)[0]
16+
}\n---`
17+
);
18+
});
19+
});
20+
21+
describe('using a helper with an object value', () => {
22+
const entry = frontmatter({ date: '1970-01-01' });
23+
24+
test('renders a frontmatter header with the specified object as content', () => {
25+
expect(tsMarkdown([entry])).toBe(
26+
`---\n${Object.keys(entry.frontmatter)[0]}: ${
27+
Object.values(entry.frontmatter)[0]
28+
}\n---`
29+
);
30+
});
31+
});
32+
});

src/renderers/frontmatter.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { stringify } from 'yaml';
2+
import { getMarkdownString } from '../rendering';
3+
import { MarkdownRenderer, RenderOptions } from '../rendering.types';
4+
import { MarkdownEntry } from '../shared.types';
5+
6+
/**
7+
* Markdown entry for generating frontmatter elements
8+
*/
9+
export interface FrontmatterEntry extends MarkdownEntry {
10+
frontmatter: Object;
11+
}
12+
13+
/**
14+
* Renderer for frontmatter entries
15+
*
16+
* @param entry the frontmatter object entry
17+
* @param options
18+
* @returns
19+
*/
20+
export const frontmatterRenderer: MarkdownRenderer = (
21+
entry: FrontmatterEntry
22+
) => {
23+
if ('frontmatter' in entry) {
24+
const frontmatterText = stringify(entry.frontmatter);
25+
return {
26+
markdown: `---\n${frontmatterText}---`,
27+
blockLevel: true,
28+
};
29+
}
30+
31+
throw new Error('Entry is not a frontmatter object. Unable to render');
32+
};
33+
34+
export function frontmatter(
35+
content: FrontmatterEntry['frontmatter']
36+
): FrontmatterEntry {
37+
return {
38+
frontmatter: content,
39+
};
40+
}

0 commit comments

Comments
 (0)