A react components package that helps you use Markdown easily.
Writing in Markdown is an amazing experience. Setting up all components and parser is kind of a pain.
- Install with
npm install --save react-marked-markdown
- Import component(s) you want
import { MarkdownPreview } from 'react-marked-markdown';
Display Markdown is really easy with MarkdownPreview component.
Here is a simple example :
import React from 'react';
import { MarkdownPreview } from 'react-marked-markdown';
const Post = ({ post }) => (
<div>
<h1>{ post.title }</h1>
<MarkdownPreview value={ post.content }/>
</div>
);
export default Post;
Behind the scenes, react-marked-markdown uses marked as Markdown parser. So all marked options are available here.
Here is an example with default options :
<MarkdownPreview
value="# Hey !"
markedOptions={{
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: true,
smartLists: true,
smartypants: false
}} />
A list of options can be found here.
react-marked-markdown supports syntax highlighting with highlight.js
All react-marked-markdown components are unstyled, meaning that you can style them as you want like every others React elements.
<MarkdownPreview className="ui post content" value="#Hey !" />
LiveMarkdownTextarea allows you to write Markdown in a textarea and see a preview of what you are writing.
<LiveMarkdownTextarea
placeholder="Enter your comment here."
className="row"
inputClassName="field column"
previewClassName="column comment-preview"
/>
You can even create your own Markdown Editor with MarkdownPreview and MarkdownInput components.
As an example here is the code of LiveMarkdownTextarea component. Note that there is also a clear() method that we can call from parent component to clear the editor.
class LiveMarkdownTextarea extends React.Component {
constructor(props) {
super(props);
this.state = {
value: props.defaultValue ? props.defaultValue : '',
};
}
handleTextChange(e) {
this.setState({ value: e.target.value });
if (this.props.onTextChange) {
this.props.onTextChange(e.target.value);
}
}
clear() {
this.setState({ value: '' });
}
render() {
const {
placeholder,
className,
inputClassName,
previewClassName,
} = this.props;
const { value } = this.state;
return (
<section className={ className }>
<MarkdownInput
placeholder={ placeholder }
onChange={ this.handleTextChange.bind(this) }
value={ value }
className={ inputClassName }
/>
<MarkdownPreview
value={ value }
className={ previewClassName }
/>
</section>
);
}
}