PageBody.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import React from 'react';
  2. import marked from 'marked';
  3. import hljs from 'highlight.js';
  4. export default class PageBody extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.getMarkupHTML = this.getMarkupHTML.bind(this);
  8. }
  9. getMarkupHTML() {
  10. let body = this.props.pageBody;
  11. if (body === '') {
  12. body = this.props.page.revision.body;
  13. }
  14. let parsed = '<b>...</b>';
  15. try {
  16. // TODO
  17. marked.setOptions({
  18. gfm: true,
  19. highlight: function (code, lang) {
  20. let result, hl;
  21. if (lang) {
  22. try {
  23. hl = hljs.highlight(lang, code);
  24. result = hl.value;
  25. } catch (e) {
  26. result = code;
  27. }
  28. } else {
  29. result = code;
  30. }
  31. return result;
  32. },
  33. tables: true,
  34. breaks: true,
  35. pedantic: false,
  36. sanitize: false,
  37. smartLists: true,
  38. smartypants: false,
  39. langPrefix: 'lang-'
  40. });
  41. parsed = marked(body);
  42. } catch (e) { console.log(e, e.stack); }
  43. return { __html: parsed };
  44. }
  45. render() {
  46. const parsedBody = this.getMarkupHTML();
  47. return (
  48. <div
  49. className="content"
  50. dangerouslySetInnerHTML={parsedBody}
  51. />
  52. );
  53. }
  54. }
  55. PageBody.propTypes = {
  56. page: React.PropTypes.object.isRequired,
  57. pageBody: React.PropTypes.string,
  58. };
  59. PageBody.defaultProps = {
  60. page: {},
  61. pageBody: '',
  62. };