環境
- Next.js v15
- React v19
- TypeScript v5
- Highlight.js v11
Highlight.js とは
Highlight.js is a syntax highlighter written in JavaScript
技術ブログでよく見かける、
プログラミングコードに色ついてるやつ。
HTML 部分がハイライトされない
以下のサンプルコードでは HTML 部分がハイライトされなかった。
import styles from "./styles.module.scss"
import hljs from "highlight.js/lib/core"
import javascript from "highlight.js/lib/languages/javascript"
import typescript from "highlight.js/lib/languages/typescript"
import "highlight.js/styles/monokai.css"
type Props = {
lang: string
name?: string
value: string
}
export default function Code({ lang, name, value }: Props) {
hljs.registerLanguage("javascript", javascript)
hljs.registerLanguage("typescript", typescript)
const str = name ? `\n\n${value}` : value
const highlightedCode = hljs.highlight(str, { language: lang }).value
return (
<div className={styles.code}>
{name && <div className={styles.name}>{name}</div>}
<pre>
<code className={`hljs`} dangerouslySetInnerHTML={{ __html: highlightedCode }}></code>
</pre>
</div>
)
}
によると、
xml を追加するとハイライトされるらしい。
import styles from "./styles.module.scss"
import hljs from "highlight.js/lib/core"
import javascript from "highlight.js/lib/languages/javascript"
import typescript from "highlight.js/lib/languages/typescript"
import xml from "highlight.js/lib/languages/xml"
import "highlight.js/styles/monokai.css"
type Props = {
lang: string
name?: string
value: string
}
export default function Code({ lang, name, value }: Props) {
hljs.registerLanguage("javascript", javascript)
hljs.registerLanguage("typescript", typescript)
hljs.registerLanguage("xml", xml)
const str = name ? `\n\n${value}` : value
const highlightedCode = hljs.highlight(str, { language: lang }).value
return (
<div className={styles.code}>
{name && <div className={styles.name}>{name}</div>}
<pre>
<code className={`hljs`} dangerouslySetInnerHTML={{ __html: highlightedCode }}></code>
</pre>
</div>
)
}