1
0
Fork 0
freesewing/sites/shared/components/mdx/highlight.mjs

49 lines
1.5 KiB
JavaScript
Raw Normal View History

import { CopyToClipboard } from 'shared/components/copy-to-clipboard.mjs'
import { HttpStatusCode } from './http.mjs'
import { Mermaid } from './mermaid.mjs'
const names = {
js: 'Javascript',
bash: 'Bash prompt',
sh: 'Shell prompt',
2022-11-19 18:11:04 +01:00
json: 'JSON',
yaml: 'file.yaml',
}
export const Highlight = (props) => {
let language = 'txt'
2022-11-19 18:11:04 +01:00
let status = false
if (props.language) language = props.language
if (props.children?.props?.className) {
language = props.children.props.className.split('-').pop()
2022-11-19 18:11:04 +01:00
if (language.indexOf('.') !== -1) {
2023-05-16 08:49:35 +02:00
;[status, language] = language.split('.')
2022-11-19 18:11:04 +01:00
}
}
// Mermaid should not be highlighted, but rendered
if (language === 'mermaid') return <Mermaid>{props.children}</Mermaid>
2022-01-28 16:57:07 +01:00
const preProps = {
2023-05-23 13:16:32 +02:00
className: `language-${language} hljs text-base lg:text-lg whitespace-break-spaces overflow-scroll pr-4`,
2022-01-28 16:57:07 +01:00
}
if (props.raw) preProps.dangerouslySetInnerHTML = { __html: props.raw }
return (
2021-12-21 20:47:13 +01:00
<div className="hljs my-4">
2022-10-03 15:08:11 +02:00
<div
className={`
2022-11-19 18:11:04 +01:00
flex flex-row justify-between items-center
text-xs font-medium text-warning
mt-1 border-b border-neutral-content border-opacity-25
px-4 py-1 mb-2 lg:text-sm
2022-10-03 15:08:11 +02:00
`}
>
<span>{props.title ? props.title : names[language] ? names[language] : language}</span>
{status ? <HttpStatusCode status={status} /> : <CopyToClipboard content={props.children} />}
</div>
2022-10-03 15:08:11 +02:00
<pre {...preProps}>{props.children}</pre>
</div>
)
}