1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
const GitBook = require('gitbook-core');
const { React } = GitBook;
const Highlight = require('react-highlighter');
const MAX_DESCRIPTION_SIZE = 500;
const Result = React.createClass({
propTypes: {
result: React.PropTypes.object,
query: React.PropTypes.string
},
render() {
const { result, query } = this.props;
let summary = result.body.trim();
if (summary.length > MAX_DESCRIPTION_SIZE) {
summary = summary.slice(0, MAX_DESCRIPTION_SIZE).trim() + '...';
}
return (
<div className="Search-ResultContainer">
<GitBook.InjectedComponent matching={{ role: 'search:result' }} props={{ result, query }}>
<div className="Search-Result">
<h3>
<GitBook.Link to={result.url}>{result.title}</GitBook.Link>
</h3>
<p>
<Highlight
matchElement="span"
matchClass="Search-MatchSpan"
search={query}>
{summary}
</Highlight>
</p>
</div>
</GitBook.InjectedComponent>
</div>
);
}
});
const SearchResults = React.createClass({
propTypes: {
i18n: GitBook.Shapes.I18n,
results: GitBook.Shapes.list,
query: React.PropTypes.string,
children: React.PropTypes.node
},
render() {
const { i18n, query, results, children } = this.props;
if (!query) {
return React.Children.only(children);
}
return (
<div className="Search-ResultsContainer">
<GitBook.InjectedComponent matching={{ role: 'search:results' }} props={{ results, query }}>
<div className="Search-Results">
<h1>{i18n.t('SEARCH_RESULTS_TITLE', { query, count: results.size })}</h1>
<div className="Search-Results">
{results.map((result, i) => {
return <Result key={i} result={result} query={query} />;
})}
</div>
</div>
</GitBook.InjectedComponent>
</div>
);
}
});
const mapStateToProps = (state) => {
const { results, query } = state.search;
return { results, query };
};
module.exports = GitBook.connect(SearchResults, mapStateToProps);
|