2
0

SearchResultList.js 1.8 KB

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