SearchResultList.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React from 'react';
  2. import PageBody from '../Page/PageBody.js';
  3. export default class SearchResultList extends React.Component {
  4. constructor(props) {
  5. super(props);
  6. this.getHighlightBody = this.getHighlightBody.bind(this);
  7. }
  8. getHighlightBody(body) {
  9. let returnBody = body;
  10. this.props.searchingKeyword.split(' ').forEach((keyword) => {
  11. if (keyword === '') {
  12. return;
  13. }
  14. const k = keyword
  15. .replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
  16. .replace(/(^"|"$)/g, ''); // for phrase (quoted) keyword
  17. const keywordExp = new RegExp(`(${k}(?!(.*?\]|.*?\\)|.*?"|.*?>)))`, 'ig');
  18. returnBody = returnBody.replace(keywordExp, '<em class="highlighted">$&</em>');
  19. });
  20. //console.log(this.props.searchingKeyword, body);
  21. return returnBody;
  22. }
  23. render() {
  24. var isEnabledLineBreaks = $('#content-main').data('linebreaks-enabled');
  25. // generate options obj
  26. var rendererOptions = {
  27. // see: https://www.npmjs.com/package/marked
  28. marked: {
  29. breaks: isEnabledLineBreaks
  30. }
  31. };
  32. const resultList = this.props.pages.map((page) => {
  33. const pageBody = this.getHighlightBody(page.revision.body);
  34. return (
  35. <div id={page._id} key={page._id} className="search-result-page">
  36. <h2><a href={page.path}>{page.path}</a></h2>
  37. <div className="wiki">
  38. <PageBody className="hige" page={page} pageBody={pageBody} rendererOptions={rendererOptions} />
  39. </div>
  40. </div>
  41. );
  42. });
  43. return (
  44. <div>
  45. {resultList}
  46. </div>
  47. );
  48. }
  49. }
  50. SearchResultList.propTypes = {
  51. pages: React.PropTypes.array.isRequired,
  52. searchingKeyword: React.PropTypes.string.isRequired,
  53. };
  54. SearchResultList.defaultProps = {
  55. pages: [],
  56. searchingKeyword: '',
  57. };