-
Notifications
You must be signed in to change notification settings - Fork 24
/
contentlayer.config.js
122 lines (114 loc) · 3.14 KB
/
contentlayer.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { defineDocumentType, makeSource } from 'contentlayer/source-files'
import remarkGfm from 'remark-gfm'
import rehypePrettyCode from 'rehype-pretty-code'
import rehypeSlug from 'rehype-slug'
import rehypeAutolinkHeadings from 'rehype-autolink-headings'
/** @type {import('contentlayer/source-files').ComputedFields} */
const computedFields = {
slug: {
type: 'string',
resolve: doc => doc._raw.sourceFileName.replace(/\.mdx/, '')
}
}
/** @type {import('contentlayer/source-files').defineDocumentType} */
const About = defineDocumentType(() => ({
name: 'About',
filePathPattern: `about/**/*.mdx`,
contentType: 'mdx',
fields: {
title: { type: 'string', required: true },
summary: { type: 'string', required: true }
},
computedFields
}))
/** @type {import('contentlayer/source-files').defineDocumentType} */
const Projects = defineDocumentType(() => ({
name: 'Projects',
filePathPattern: `projects/**/*.mdx`,
contentType: 'mdx',
fields: {
title: { type: 'string', required: true },
summary: { type: 'string', required: true },
image: { type: 'string', required: true },
tag: {
type: 'list',
of: { type: 'string' },
required: true
}
},
computedFields
}))
/** @type {import('contentlayer/source-files').defineDocumentType} */
const Articles = defineDocumentType(() => ({
name: 'Articles',
filePathPattern: `articles/**/*.mdx`,
contentType: 'mdx',
fields: {
title: { type: 'string', required: true },
summary: { type: 'string', required: true },
publishedDate: { type: 'string', required: true },
tag: {
type: 'list',
of: { type: 'string' },
required: true
}
},
computedFields: {
...computedFields,
headings: {
type: 'json',
resolve: async doc => {
const regXHeader = /\n(?<flag>#{1,6})\s+(?<content>.+)/g
const headings = Array.from(doc.body.raw.matchAll(regXHeader)).map(({ groups }) => {
const flag = groups?.flag
const content = groups?.content
let level = ''
switch (flag?.length) {
case 1:
level = 'one'
break
case 2:
level = 'two'
break
case 3:
level = 'three'
break
case 4:
level = 'four'
break
case 5:
level = 'five'
break
case 6:
level = 'six'
break
default:
level = 'unknown'
}
return {
level: level,
text: content
}
})
return headings
}
}
}
}))
/** @type {import('rehype-pretty-code').Options} */
const rehypePrettyOptions = {
theme: {
dark: 'github-dark-dimmed',
light: 'github-light'
},
keepBackground: true
}
/** @type {import('contentlayer/source-files').SourcePlugin} */
export default makeSource({
contentDirPath: './src/content',
documentTypes: [About, Projects, Articles],
mdx: {
remarkPlugins: [remarkGfm],
rehypePlugins: [rehypeSlug, rehypeAutolinkHeadings, [rehypePrettyCode, rehypePrettyOptions]]
}
})