Page.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import RevisionBody from './Page/RevisionBody';
  4. export default class Page extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.state = {};
  8. this.renderHtml = this.renderHtml.bind(this);
  9. // this.getHighlightBody = this.getHighlightBody.bind(this);
  10. }
  11. componentWillMount() {
  12. this.renderHtml(this.props.markdown);
  13. }
  14. // getHighlightBody(body, keywords) {
  15. // let returnBody = body;
  16. // keywords.replace(/"/g, '').split(' ').forEach((keyword) => {
  17. // if (keyword === '') {
  18. // return;
  19. // }
  20. // const k = keyword
  21. // .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
  22. // .replace(/(^"|"$)/g, ''); // for phrase (quoted) keyword
  23. // const keywordExp = new RegExp(`(${k}(?!(.*?")))`, 'ig');
  24. // returnBody = returnBody.replace(keywordExp, '<em class="highlighted">$&</em>');
  25. // });
  26. // return returnBody;
  27. // }
  28. renderHtml(markdown) {
  29. var context = {
  30. markdown,
  31. dom: this.previewElement,
  32. currentPagePath: this.props.pagePath,
  33. };
  34. const crowiRenderer = this.props.crowiRenderer;
  35. const interceptorManager = this.props.crowi.interceptorManager;
  36. interceptorManager.process('preRenderPreview', context)
  37. .then(() => interceptorManager.process('prePreProcess', context))
  38. .then(() => {
  39. context.markdown = crowiRenderer.preProcess(context.markdown);
  40. })
  41. .then(() => interceptorManager.process('postPreProcess', context))
  42. .then(() => {
  43. var parsedHTML = crowiRenderer.process(context.markdown);
  44. context['parsedHTML'] = parsedHTML;
  45. })
  46. .then(() => interceptorManager.process('prePostProcess', context))
  47. .then(() => {
  48. context.markdown = crowiRenderer.postProcess(context.parsedHTML, context.dom);
  49. })
  50. .then(() => interceptorManager.process('postPostProcess', context))
  51. .then(() => interceptorManager.process('preRenderPreviewHtml', context))
  52. .then(() => {
  53. this.setState({ html: context.parsedHTML });
  54. })
  55. // process interceptors for post rendering
  56. .then(() => interceptorManager.process('postRenderPreviewHtml', context));
  57. }
  58. render() {
  59. const config = this.props.crowi.getConfig();
  60. const isMathJaxEnabled = !!config.env.MATHJAX;
  61. return (
  62. <RevisionBody html={this.state.html}
  63. inputRef={el => this.previewElement = el}
  64. isMathJaxEnabled={isMathJaxEnabled}
  65. renderMathJaxOnInit={true}
  66. />
  67. )
  68. }
  69. }
  70. Page.propTypes = {
  71. crowi: PropTypes.object.isRequired,
  72. crowiRenderer: PropTypes.object.isRequired,
  73. markdown: PropTypes.string.isRequired,
  74. pagePath: PropTypes.string.isRequired,
  75. highlightKeywords: PropTypes.string,
  76. };