import React from 'react'; import PropTypes from 'prop-types'; import Editor from './PageEditor/Editor'; import Preview from './PageEditor/Preview'; export default class PageEditor extends React.Component { constructor(props) { super(props); this.state = { markdown: this.props.markdown, }; // initial preview this.renderPreview(); this.setCaretLine = this.setCaretLine.bind(this); this.focusToEditor = this.focusToEditor.bind(this); this.onMarkdownChanged = this.onMarkdownChanged.bind(this); } focusToEditor() { this.refs.editor.forceToFocus(); } /** * set caret position of editor * @param {number} line */ setCaretLine(line) { this.refs.editor.setCaretLine(line); } /** * the change event handler for `markdown` state * @param {string} value */ onMarkdownChanged(value) { this.setState({ markdown: value, html: '', }); this.renderPreview(); } renderPreview() { const config = this.props.crowi.config; // generate options obj const rendererOptions = { // see: https://www.npmjs.com/package/marked marked: { breaks: config.isEnabledLineBreaks, } }; // render html var context = { markdown: this.state.markdown, dom: this.previewElement, currentPagePath: decodeURIComponent(location.pathname) }; this.props.crowi.interceptorManager.process('preRenderPreview', context) .then(() => crowi.interceptorManager.process('prePreProcess', context)) .then(() => { context.markdown = crowiRenderer.preProcess(context.markdown, context.dom); }) .then(() => crowi.interceptorManager.process('postPreProcess', context)) .then(() => { var parsedHTML = crowiRenderer.render(context.markdown, context.dom, rendererOptions); context['parsedHTML'] = parsedHTML; }) .then(() => crowi.interceptorManager.process('postRenderPreview', context)) .then(() => crowi.interceptorManager.process('preRenderPreviewHtml', context)) .then(() => { this.setState({html: context.parsedHTML}); // set html to the hidden input (for submitting to save) $('#form-body').val(this.state.markdown); }) // process interceptors for post rendering .then(() => crowi.interceptorManager.process('postRenderPreviewHtml', context)); } render() { return (
this.previewElement = el} />
) } } PageEditor.propTypes = { crowi: PropTypes.object.isRequired, markdown: PropTypes.string, };