Forked from prism-react-renderer, renders highlighted Prism output using React
npm install @valamis/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!
Maybe you need to render some extra UI with your Prismjs-highlighted code,
or maybe you'd like to manipulate what Prism renders completely,
or maybe you're just using Prism with React and are searching for an easier,
global-pollution-free way?
Then you're right where you want to be!
This library tokenises code using Prism and provides a small render-props-driven
component to quickly render it out into React. This is why it even works with
React Native! It's bundled with a modified version of Prism that won't pollute
the global namespace and comes with
a couple of common language syntaxes.
_(There's also an escape-hatch to use your own Prism setup, just in case)_
It also comes with its own VSCode-like theming format, which means by default
you can easily drop in different themes, use the ones this library ships with, or
create new ones programmatically on the fly.
_(If you just want to use your Prism CSS-file themes, that's also no problem)_
- Installation
- Usage
- Basic Props
- children
- language
- code
- Advanced Props
- theme
- Prism
- Children Function
- state
- prop getters
- getLineProps
- getTokenProps
- Theming
- FAQ
- LICENSE
This module is distributed via npm which is bundled with node and
should be installed as one of your project's dependencies:
``sh`npm
npm install --save prism-react-rendereryarn
yarn add prism-react-renderer
> This package also depends on react. Please make sure you
> have those installed as well.
`jsx
import React from "react";
import { render } from "react-dom";
import Highlight, { defaultProps } from "prism-react-renderer";
const exampleCode =
(function someDemo() {
var test = "Hello World!";
console.log(test);
})();
return () => ;
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! /
}
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.
> function({}) | _required_
This is called with an object. Read more about the properties of this object in
the section "Children Function".
> 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.
> string | _required_
This is the code that will be highlighted.
> 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".
> 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';
`
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:
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
|typesA "Token" is an object that represents a piece of content for Prism. It has a
property, 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 gettersThese 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####
lineYou need to add a
property (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 (typically
s).classNameIt 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.The
will always contain.token-line.getTokenProps####
tokenYou need to add a
property (type:Token) to the object you're passing togetTokenProps; It's also advisable to add akey.sThis getter will return you props to spread onto your token elements (typically
).classNameIt 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.The
will always contain.token. This also provides full compatibility withdefaultProps
your old Prism CSS-file themes.Theming
The
you'd typically apply in a basic use-case, contain a default theme.className
This theme is duotoneDark.While all
s 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
}>
}plainThe
property 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.stylesThe
property contains an array of definitions. Each definition contains astyletypes
property, that is also just a style object. These styles are limited by thelanguages
andproperties.typesThe
properties 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 as
and convert the declarations to object-style-syntax and put them onstyle.prism-react-rendererFAQ
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.themeIf you don't pass
to 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 in
defaultProps
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