コードタグの実装
2025/02/24
コードタグを実装しました🎉

MicroCMSから受け取ったHTML文字列をElementに変換し、コードタグのシンタックスハイライトを追加しました。
page.tsx
1//省略
2
3const parsedContent = parser(content.content, {
4 replace: (domNode) => {
5 const dom = domNode as CmsElement
6 if (dom.tagName !== 'pre') return domNode
7 const codeTag = dom.children[0] as CmsElement
8 const code = (codeTag.children[0] as CmsElement).data
9 const language = codeTag.attribs.class.replace('language-', '')
10 const parentTag = dom.parent as CmsElement
11 let _fileName: string | null = null
12 if (parentTag !== null) {
13 const fileNameAttribute = parentTag.attributes.find((attr) => attr.name === 'data-filename')
14 if (fileNameAttribute) _fileName = fileNameAttribute.value
15 }
16 return (
17 <div className={styles.codeContainer}>
18 {_fileName ? (
19 <div className={styles.fileNameContainer}>
20 <span className={styles.fileName}>{_fileName}</span>
21 </div>
22 ) : null}
23 <div className={styles.code}>
24 <SyntaxHighlighter language={language} style={monokai} showLineNumbers>
25 {/* TODO この文字列の長さで来ると全然バグる */}
26 {code}
27 </SyntaxHighlighter>
28 </div>
29 </div>
30 )
31 },
32 })
33
34//省略