Skip to content

Instantly share code, notes, and snippets.

@ibrahima
Last active December 3, 2020 10:23
Show Gist options
  • Save ibrahima/d21950a95aee3212e991a8404e238093 to your computer and use it in GitHub Desktop.
Save ibrahima/d21950a95aee3212e991a8404e238093 to your computer and use it in GitHub Desktop.
Syntax highlighting for react-markdown
import React from 'react';
import PropTypes from 'prop-types';
import SyntaxHighlighter from 'react-syntax-highlighter';
export default class CodeBlock extends React.PureComponent {
static propTypes = {
value: PropTypes.string.isRequired,
language: PropTypes.string,
}
static defaultProps = {
language: null,
}
render() {
const { language, value } = this.props;
return (
<SyntaxHighlighter language={language}>
{value}
</SyntaxHighlighter>
);
}
}
import React from 'react';
import PropTypes from 'prop-types';
import ReactMarkdown from 'react-markdown';
import CodeBlock from './CodeBlock';
class Markdown extends React.PureComponent {
render() {
return (
<Container>
<ReactMarkdown
source={value}
renderers={{
code: CodeBlock,
}}
/>
</Container>
);
}
}
Markdown.propTypes = {
value: PropTypes.string.isRequired,
};
export default Markdown;
@aeksco
Copy link

aeksco commented Mar 22, 2020

👍 Works great thanks for sharing!

@blackfalcon
Copy link

Wow! This is exactly the help I needed to get my head wrapped around this. Thanks!

@edqwerty1
Copy link

edqwerty1 commented Jun 10, 2020

Thanks, works great!

Typescript/functional component version

import React from "react";
import SyntaxHighlighter from "react-syntax-highlighter";

interface CodeBlockProps {
  value: string;
  language?: string;
}

export const CodeBlock = ({ language, value }: CodeBlockProps) => (
  <SyntaxHighlighter language={language}>{value}</SyntaxHighlighter>
);

@Prottoy2938
Copy link

Another Version:

Codeblock:

import React from "react";
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { coy } from "react-syntax-highlighter/dist/cjs/styles/prism";

interface Props {
  value: string;
  language: string;
}

const CodeBlock: React.FC<Props> = (props: Props) => {
  const { language, value } = props;
  return (
    <SyntaxHighlighter language={language} style={coy}>
      {value ? value : ""} 
    </SyntaxHighlighter>
  );
};

export default CodeBlock;

ReactMarkdown:

 <ReactMarkdown
    plugins={[gfm]}
    skipHtml={true}
    renderers={{ code: CodeBlock }}
     >
     {value}
  </ReactMarkdown>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment