PageEditor.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Editor from './PageEditor/Editor';
  4. import Preview from './PageEditor/Preview';
  5. export default class PageEditor extends React.Component {
  6. constructor(props) {
  7. super(props);
  8. this.state = {
  9. markdown: this.props.markdown,
  10. };
  11. // initial preview
  12. this.renderPreview();
  13. this.onMarkdownChanged = this.onMarkdownChanged.bind(this);
  14. }
  15. /**
  16. * the change event handler for `markdown` state
  17. * @param {string} value
  18. */
  19. onMarkdownChanged(value) {
  20. this.setState({
  21. markdown: value,
  22. html: '',
  23. });
  24. this.renderPreview();
  25. }
  26. renderPreview() {
  27. // generate options obj
  28. const rendererOptions = {
  29. // see: https://www.npmjs.com/package/marked
  30. marked: {
  31. breaks: false
  32. }
  33. };
  34. // render html
  35. var context = {
  36. markdown: this.state.markdown,
  37. dom: this.previewElement,
  38. currentPagePath: decodeURIComponent(location.pathname)
  39. };
  40. this.props.crowi.interceptorManager.process('preRenderPreview', context)
  41. .then(() => crowi.interceptorManager.process('prePreProcess', context))
  42. .then(() => {
  43. context.markdown = crowiRenderer.preProcess(context.markdown, context.dom);
  44. })
  45. .then(() => crowi.interceptorManager.process('postPreProcess', context))
  46. .then(() => {
  47. var parsedHTML = crowiRenderer.render(context.markdown, context.dom, rendererOptions);
  48. context['parsedHTML'] = parsedHTML;
  49. })
  50. .then(() => crowi.interceptorManager.process('postRenderPreview', context))
  51. .then(() => crowi.interceptorManager.process('preRenderPreviewHtml', context))
  52. .then(() => {
  53. this.setState({html: context.parsedHTML});
  54. // set html to the hidden input (for submitting to save)
  55. $('#form-body').val(this.state.markdown);
  56. })
  57. // process interceptors for post rendering
  58. .then(() => crowi.interceptorManager.process('postRenderPreviewHtml', context));
  59. }
  60. render() {
  61. return (
  62. <div className="row">
  63. <div className="col-md-6 col-sm-12 page-editor-editor-container">
  64. <Editor value={this.state.markdown} onChange={this.onMarkdownChanged} />
  65. </div>
  66. <div className="col-md-6 hidden-sm hidden-xs page-editor-preview-container">
  67. <Preview html={this.state.html} inputRef={el => this.previewElement = el} />
  68. </div>
  69. </div>
  70. )
  71. }
  72. }
  73. PageEditor.propTypes = {
  74. crowi: PropTypes.object.isRequired,
  75. markdown: PropTypes.string,
  76. };