A syntax highlighting component based on [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer) that works seamlessly with Theme UI.
npm install @theme-ui/prismA syntax highlighting component based on
prism-react-renderer
that works seamlessly with Theme UI.
```
npm i @theme-ui/prism
The syntax highlighting component needs to be passed to Theme UI context via the
ThemeProvider.
`js
// src/components/layout.js
import { ThemeUIProvider } from 'theme-ui'
import { MDXProvider } from '@mdx-js/react'
import { useThemedStylesWithMdx } from '@theme-ui/mdx'
import Prism from '@theme-ui/prism'
import theme from './theme'
const components = {
pre: ({ children }) => <>{children}>,
code: Prism,
}
function Provider({ children }) {
const componentsWithStyles = useThemedStylesWithMdx(
useMDXComponents(components)
)
return (
)
}
export default Provider
`
Then, all code blocks in MDX documents wrapped by Layout will be syntax
highlighted.
When using gatsby-plugin-theme-ui, shadow thesrc/gatsby-plugin-theme-ui/components.js module to add the Prism component to
MDX scope.
`js
// src/gatsby-plugin-theme-ui/components.js
import Prism from '@theme-ui/prism'
export default {
pre: (props) => props.children,
code: Prism,
}
`
This package includes the default syntax color themes from the prismjs andprism-react-renderer packages. To add these to your Theme UI theme object,theme.styles.code
import a preset and add the styles to .
`js
// theme.js
import nightOwl from '@theme-ui/prism/presets/night-owl.json'
const theme = {
// ...theme
styles: {
code: {
...nightOwl,
},
},
}
`
The following themes are available and can be found in the
presets/
directory.
- dracula.jsonduotone-dark.json
- duotone-light.json
- github.json
- night-owl-light.json
- night-owl.json
- oceanic-next.json
- prism-coy.json
- prism-dark.json
- prism-funky.json
- prism-okaidia.json
- prism-solarizedlight.json
- prism-tomorrow.json
- prism-twilight.json
- prism.json
- shades-of-purple.json
- ultramin.json
- vs-dark.json
-
To theme the prism styles based on the colors defined in your theme.colorstheme-ui
object, use the preset, which will use the following color keys for
syntax highlight.
- grayprimary
- secondary
- accent
-
`js
// src/gatsby-plugin-theme-ui/index.js
import prism from '@theme-ui/prism/presets/theme-ui'
export default {
colors: {
text: '#000',
background: '#fff',
primary: '#33e',
secondary: '#119',
accent: '#639',
gray: '#666',
},
styles: {
code: {
...prism,
},
},
}
`
This package supports highlighting inside code blocks. The following two
syntaxes are supported:
Single-line highlight by placing // highlight-line at the end of the line.
`js`
let singleLineHighlight = 'there is a // highlight-line comment here ->' // highlight-line
Multi-line highlights by wrapping lines with // highlight-start and// highlight-end. Multiple highlight wrappers are supported in a single code
block.
`js
// highlight-start
let multiLineHighlight =
this multiline string is wrapped by
// highlight-start and // highlight-end
comments`
// highlight-end
The highlight styling is controlled in styles.pre under .highlight. For
example:
`json`
".highlight": {
"background": "hsla(0, 0%, 30%, .5)"
}
Please note that @theme-ui/prism usesprism-react-renderer,
which does not include all languages supported in Prism
by default. So, if you happen to use one of the missing languages, your code
block simply won't show up as highlighted.
For example, to add support for the R language, import the language and pass aPrism
custom instance to the Theme UI component:
`js
// src/gatsby-plugin-theme-ui/components.js
import ThemeUIPrism from '@theme-ui/prism'
import PrismCore from 'prismjs/components/prism-core'
import 'prismjs/components/prism-r'
export default {
pre: (props) => props.children,
code: (props) =>
}
``