Page.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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.appendEditSectionButtons = this.appendEditSectionButtons.bind(this);
  9. this.renderHtml = this.renderHtml.bind(this);
  10. // this.getHighlightBody = this.getHighlightBody.bind(this);
  11. }
  12. componentWillMount() {
  13. this.renderHtml(this.props.markdown);
  14. }
  15. // getHighlightBody(body, keywords) {
  16. // let returnBody = body;
  17. // keywords.replace(/"/g, '').split(' ').forEach((keyword) => {
  18. // if (keyword === '') {
  19. // return;
  20. // }
  21. // const k = keyword
  22. // .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
  23. // .replace(/(^"|"$)/g, ''); // for phrase (quoted) keyword
  24. // const keywordExp = new RegExp(`(${k}(?!(.*?")))`, 'ig');
  25. // returnBody = returnBody.replace(keywordExp, '<em class="highlighted">$&</em>');
  26. // });
  27. // return returnBody;
  28. // }
  29. componentDidUpdate() {
  30. this.appendEditSectionButtons();
  31. }
  32. /**
  33. * Add edit section buttons to headers
  34. * This invoke `appendEditSectionButtons` method of `legacy/crowi.js`
  35. */
  36. appendEditSectionButtons(parentElement) {
  37. if (this.props.showHeadEditButton) {
  38. const crowiForJquery = this.props.crowi.getCrowiForJquery();
  39. crowiForJquery.appendEditSectionButtons(this.previewElement);
  40. }
  41. }
  42. renderHtml(markdown) {
  43. var context = {
  44. markdown,
  45. dom: this.previewElement,
  46. currentPagePath: this.props.pagePath,
  47. };
  48. const crowiRenderer = this.props.crowiRenderer;
  49. const interceptorManager = this.props.crowi.interceptorManager;
  50. interceptorManager.process('preRenderPreview', context)
  51. .then(() => interceptorManager.process('prePreProcess', context))
  52. .then(() => {
  53. context.markdown = crowiRenderer.preProcess(context.markdown);
  54. })
  55. .then(() => interceptorManager.process('postPreProcess', context))
  56. .then(() => {
  57. var parsedHTML = crowiRenderer.process(context.markdown);
  58. context['parsedHTML'] = parsedHTML;
  59. })
  60. .then(() => interceptorManager.process('prePostProcess', context))
  61. .then(() => {
  62. context.parsedHTML = crowiRenderer.postProcess(context.parsedHTML, context.dom);
  63. })
  64. .then(() => interceptorManager.process('postPostProcess', context))
  65. .then(() => interceptorManager.process('preRenderPreviewHtml', context))
  66. .then(() => {
  67. this.setState({ html: context.parsedHTML });
  68. })
  69. // process interceptors for post rendering
  70. .then(() => interceptorManager.process('postRenderPreviewHtml', context));
  71. }
  72. render() {
  73. const config = this.props.crowi.getConfig();
  74. const isMathJaxEnabled = !!config.env.MATHJAX;
  75. return (
  76. <RevisionBody html={this.state.html}
  77. inputRef={el => this.previewElement = el}
  78. isMathJaxEnabled={isMathJaxEnabled}
  79. renderMathJaxOnInit={true}
  80. />
  81. )
  82. }
  83. }
  84. Page.propTypes = {
  85. crowi: PropTypes.object.isRequired,
  86. crowiRenderer: PropTypes.object.isRequired,
  87. markdown: PropTypes.string.isRequired,
  88. pagePath: PropTypes.string.isRequired,
  89. showHeadEditButton: PropTypes.bool,
  90. highlightKeywords: PropTypes.string,
  91. };