Renders highlighted Prism output using React
npm install custom-prism-react-renderer[![Maintenance Status][maintenance-image]](#maintenance-status)
A lean Prism highlighter component for React
Comes with everything to render Prismjs highlighted code directly to React (Native) elements, global-pollution-free!
getLineProps
getTokenProps
dependencies:
sh
npm
npm install --save prism-react-renderer
yarn
yarn add prism-react-renderer
`
> This package also depends on react. Please make sure you
> have those installed as well.
Usage
> Try it out in the browser
`jsx
import React from "react";
import { render } from "react-dom";
import Highlight, { defaultProps } from "prism-react-renderer";
const exampleCode =
;
render((
{({ className, style, tokens, getLineProps, getTokenProps }) => (
{tokens.map((line, i) => (
{line.map((token, key) => (
))}
))}
)}
,
document.getElementById('root')
);
`
is the only component exposed by this package, as inspired by
downshift.
It also exports a defaultProps object which for basic usage can simply be spread
onto the component. It also provides some default theming.
It doesn't render anything itself, it just calls the render function and renders that.
"Use a render prop!"!
/ your JSX here! /}
Basic Props
This is the list of props that you should probably know about. There are some
advanced props below as well.
Most of these advanced props are included in the defaultProps.
$3
> function({}) | _required_
This is called with an object. Read more about the properties of this object in
the section "Children Function".
$3
> string | _required_
This is the language that your code will be highlighted as. You can see a list
of all languages that are supported out of the box here.
$3
> string | _required_
This is the code that will be highlighted.
Advanced Props
$3
> PrismTheme | _required; default is provided in defaultProps export_
If a theme is passed, it is used to generate style props which can be retrieved
via the prop-getters which are described in "Children Function".
A default theme is provided by the defaultProps object.
Read more about how to theme react-prism-renderer in
the section "Theming".
$3
> PrismLib | _required; default is provided in defaultProps export_
This is the Prismjs library itself.
A vendored version of Prism is provided (and also exported) as part of this library.
This vendored version doesn't pollute the global namespace, is slimmed down,
and doesn't conflict with any installation of prismjs you might have.
If you're only using Prism.highlight you can choose to use prism-react-renderer's
exported, vendored version of Prism instead.
But if you choose to use your own Prism setup, simply pass Prism as a prop:
`jsx
// Whichever way you're retrieving Prism here:
import Prism from 'prismjs/components/prism-core';
... /} />
`
Children Function
This is where you render whatever you want to based on the output of .
You use it like so:
`js
const ui = (
{highlight => (
// use utilities and prop getters here, like highlight.className, highlight.getTokenProps, etc.
{/ more jsx here /}
)}
);
`
The properties of this highlight object can be split into two categories as indicated below:
$3
These properties are the flat output of . They're generally "state" and are what
you'd usually expect from a render-props-based API.
| property | type | description |
| ----------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------- |
| tokens | Token[][] | This is a doubly nested array of tokens. The outer array is for separate lines, the inner for tokens, so the actual content. |
| className | string | This is the class you should apply to your wrapping element, typically a |types
A "Token" is an object that represents a piece of content for Prism. It has aproperty, which is an arraycontent
of types that indicate the purpose and styling of a piece of text, and aproperty, which is the actualtokens
text.
You'd typically iterate over, rendering each line, and iterate over its items, rendering out each token, which is a piece ofgetLineProps
this line.
$3
> See
> Kent C. Dodds' blog post about prop getters
These functions are used to apply props to the elements that you render. This
gives you maximum flexibility to render what, when, and wherever you like.
You'd typically call these functions with some dictated input and add on all other
props that it should pass through. It'll correctly override and modify the props
that it returns to you, so passing props to it instead of adding them directly is
advisable.
| property | type | description |
| --------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
||function({})| returns the props you should apply to any list of tokens, i.e. the element that contains your tokens. |getTokenProps
||function({})| returns the props you should apply to the elements displaying tokens that you render. |getLineProps
####line
You need to add aproperty (type:Token[]) to the object you're passing togetLineProps; It's also advisable to add akey.
This getter will return you props to spread onto your line elements (typicallys).className
It will typically return a(if you pass one it'll be appended),children,style(if you pass one it'll be merged). It also passes on all other props you passclassName
to the input.
Thewill always contain.token-line.getTokenProps
####token
You need to add aproperty (type:Token) to the object you're passing togetTokenProps; It's also advisable to add akey.s
This getter will return you props to spread onto your token elements (typically).className
It will typically return a(if you pass one it'll be appended),children,style(if you pass one it'll be merged). It also passes on all other props you passclassName
to the input.
Thewill always contain.token. This also provides full compatibility withdefaultProps
your old Prism CSS-file themes.
Theming
Theyou'd typically apply in a basic use-case, contain a default theme.className
This theme is duotoneDark.
While alls are provided with, so that you could use your goodreact-prism-renderer
old Prism CSS-file themes, you can also choose to use's themes.`
These themes are JSON-based and are heavily inspired by VSCode's theme format.
Their syntax, expressed in Flow looks like the following:
js`
{
plain: StyleObj,
styles: Array<{
types: string[],
languages?: string[],
style: StyleObj
}>
}plain
Theproperty provides a base style-object. This style object is directly usedstyle
in theprops that you'll receive from the prop getters, if athemeprop has
been passed to.styles
Theproperty contains an array of definitions. Each definition contains astyletypes
property, that is also just a style object. These styles are limited by thelanguages
andproperties.types
Theproperties is an array of token types that Prism outputs. Thelanguagestypes
property limits styles to highlighted languages.
When converting a Prism CSS theme it's mostly just necessary to use classes asand convert the declarations to object-style-syntax and put them onstyle.prism-react-renderer
FAQ
How do I use my old Prism css themes?
still returns you all properclassNames via the prop getters,style
when you use it. By default however it uses its new theming system, which output a
couple ofprops as well.theme
If you don't passto thecomponent it will default to notstyle
outputting anyprops, while still returning you theclassNameprops, like`
so:
js`{...defaultProps}
code={exampleCode}
language="jsx"
theme={undefined}
>
{highlight => null / ... /}
prism-react-renderer
How do I prevent a theme and the vendored Prism to be bundled?
Since the default theme and the vendored Prism library indefaultProps
come from, if you wish to pass your own Prism library in, and not`
use the built-in theming, you simply need to leave it out to allow your bundler
to tree-shake those:
js`
import Highlight from "prism-react-renderer";
import Prism from "prismjs"; // Different source
;
{highlight => null / ... /}`
You can also import the vendored Prism library on its own:
js``
import { Prism } from "prism-react-renderer";
// or
import Prism from "prism-react-renderer/prism";
LICENSE
MIT
Maintenance Status
Active: Formidable is actively working on this project, and we expect to continue for work for the foreseeable future. Bug reports, feature requests and pull requests are welcome.
[maintenance-image]: https://img.shields.io/badge/maintenance-active-green.svg