@theme-ui/prism
Version:
A syntax highlighting component based on [prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer) that works seamlessly with Theme UI.
197 lines (156 loc) • 4.52 kB
Markdown
# @theme-ui/prism
A syntax highlighting component based on
[prism-react-renderer](https://github.com/FormidableLabs/prism-react-renderer)
that works seamlessly with Theme UI.
## Installation
```
npm i @theme-ui/prism
```
## Usage
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 (
<ThemeProvider theme={theme}>
<MDXProvider components={componentsWithStyles}>{children}</MDXProvider>
</ThemeProvider>
)
}
export default Provider
```
Then, all code blocks in MDX documents wrapped by Layout will be syntax
highlighted.
### Gatsby plugin
When using `gatsby-plugin-theme-ui`, shadow the
`src/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,
}
```
## Syntax themes
This package includes the default syntax color themes from the `prismjs` and
`prism-react-renderer` packages. To add these to your Theme UI `theme` object,
import a preset and add the styles to `theme.styles.code`.
```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/`](https://github.com/system-ui/theme-ui/tree/stable/packages/prism/presets)
directory.
- `dracula.json`
- `duotone-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`
### Theme UI colors
To theme the prism styles based on the colors defined in your `theme.colors`
object, use the `theme-ui` preset, which will use the following color keys for
syntax highlight.
- `gray`
- `primary`
- `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,
},
},
}
```
## Highlight support
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)"
}
```
## Additional languages
Please note that `@theme-ui/prism` uses
[`prism-react-renderer`](https://github.com/FormidableLabs/prism-react-renderer),
[which does not include all languages supported in Prism](https://github.com/FormidableLabs/prism-react-renderer/blob/master/src/vendor/prism/includeLangs.js)
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 a
custom `Prism` 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) => <ThemeUIPrism {...props} Prism={PrismCore} />,
}
```