import Prism from 'prismjs' import 'prismjs/components/prism-bash' import 'prismjs/components/prism-json' import 'prismjs/components/prism-jsx' import 'prismjs/components/prism-yaml' import React, { useEffect } from 'react' /** * 言語 string を表示用に変換して返却 * NOTE: 言語の表示形式で気になるところがあったら case 追加する */ const getLanguageLabel = (language: string) => { let languageLabel = '' switch (language) { case 'javascript': languageLabel = 'JavaScript' break default: languageLabel = language break } return languageLabel } const Code = ({ children, language }) => { useEffect(() => { Prism.highlightAll() }, []) return ( <pre className="relative"> <p className="absolute bottom-0 right-4 text-gray-800 text-xs font-semibold bg-gray-200 mb-0 px-2 py-[2px]"> {getLanguageLabel(language)} </p> <code dangerouslySetInnerHTML={{ __html: Prism.highlight(children, Prism.languages[language]), }} /> <style jsx>{` code { vertical-align: middle; white-space: pre; word-break: break-all; max-width: 100%; display: block; font-size: 0.8rem; line-height: 1.4; padding: 1.25rem 1.5rem; margin: 0.85rem 0; background-color: #282c34; color: #ccc; border-radius: 6px; overflow: auto; } `}</style> </pre> ) } export default Code