PageEditor.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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: '',
  10. html: '',
  11. };
  12. this.onMarkdownChanged = this.onMarkdownChanged.bind(this);
  13. }
  14. /**
  15. * the change event handler for `markdown` state
  16. * @param {string} value
  17. */
  18. onMarkdownChanged(value) {
  19. this.setState({
  20. markdown: value,
  21. html: '',
  22. });
  23. this.renderPreview();
  24. }
  25. renderPreview() {
  26. // generate options obj
  27. const rendererOptions = {
  28. // see: https://www.npmjs.com/package/marked
  29. marked: {
  30. breaks: false
  31. }
  32. };
  33. // render html
  34. var context = {
  35. markdown: this.state.markdown,
  36. dom: this.previewElement,
  37. currentPagePath: decodeURIComponent(location.pathname)
  38. };
  39. this.props.crowi.interceptorManager.process('preRenderPreview', context)
  40. .then(() => crowi.interceptorManager.process('prePreProcess', context))
  41. .then(() => {
  42. context.markdown = crowiRenderer.preProcess(context.markdown, context.dom);
  43. })
  44. .then(() => crowi.interceptorManager.process('postPreProcess', context))
  45. .then(() => {
  46. var parsedHTML = crowiRenderer.render(context.markdown, context.dom, rendererOptions);
  47. context['parsedHTML'] = parsedHTML;
  48. })
  49. .then(() => crowi.interceptorManager.process('postRenderPreview', context))
  50. .then(() => crowi.interceptorManager.process('preRenderPreviewHtml', context))
  51. .then(() => {
  52. this.setState({html: context.parsedHTML});
  53. })
  54. // process interceptors for post rendering
  55. .then(() => crowi.interceptorManager.process('postRenderPreviewHtml', context));
  56. }
  57. render() {
  58. return (
  59. <div>
  60. <Editor value={this.state.markdown} onChange={this.onMarkdownChanged} />
  61. <Preview html={this.state.html} inputRef={el => this.previewElement = el} />
  62. </div>
  63. )
  64. }
  65. }
  66. PageEditor.propTypes = {
  67. crowi: PropTypes.object.isRequired,
  68. };