UNPKG

2.78 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports["default"] = void 0;
9
10var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/inheritsLoose"));
11
12var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
14var _propTypes = _interopRequireDefault(require("prop-types"));
15
16var _react = _interopRequireDefault(require("react"));
17
18var _utils = require("../utils");
19
20var propTypes = {
21 children: _propTypes["default"].string.isRequired,
22 highlightClassName: _propTypes["default"].string,
23 search: _propTypes["default"].string.isRequired
24};
25var defaultProps = {
26 highlightClassName: 'rbt-highlight-text'
27};
28
29/**
30 * Stripped-down version of https://github.com/helior/react-highlighter
31 *
32 * Results are already filtered by the time the component is used internally so
33 * we can safely ignore case and diacritical marks for the purposes of matching.
34 */
35var Highlighter = /*#__PURE__*/function (_React$PureComponent) {
36 (0, _inheritsLoose2["default"])(Highlighter, _React$PureComponent);
37
38 function Highlighter() {
39 return _React$PureComponent.apply(this, arguments) || this;
40 }
41
42 var _proto = Highlighter.prototype;
43
44 _proto.render = function render() {
45 var _this$props = this.props,
46 children = _this$props.children,
47 highlightClassName = _this$props.highlightClassName,
48 search = _this$props.search;
49
50 if (!search || !children) {
51 return children;
52 }
53
54 var matchCount = 0;
55 var remaining = children;
56 var highlighterChildren = [];
57
58 while (remaining) {
59 var bounds = (0, _utils.getMatchBounds)(remaining, search); // No match anywhere in the remaining string, stop.
60
61 if (!bounds) {
62 highlighterChildren.push(remaining);
63 break;
64 } // Capture the string that leads up to a match.
65
66
67 var nonMatch = remaining.slice(0, bounds.start);
68
69 if (nonMatch) {
70 highlighterChildren.push(nonMatch);
71 } // Capture the matching string.
72
73
74 var match = remaining.slice(bounds.start, bounds.end);
75 highlighterChildren.push( /*#__PURE__*/_react["default"].createElement("mark", {
76 className: highlightClassName,
77 key: matchCount
78 }, match));
79 matchCount += 1; // And if there's anything left over, continue the loop.
80
81 remaining = remaining.slice(bounds.end);
82 }
83
84 return highlighterChildren;
85 };
86
87 return Highlighter;
88}(_react["default"].PureComponent);
89
90(0, _defineProperty2["default"])(Highlighter, "propTypes", propTypes);
91(0, _defineProperty2["default"])(Highlighter, "defaultProps", defaultProps);
92var _default = Highlighter;
93exports["default"] = _default;
\No newline at end of file