src/search_result.js
// @flow
import Strategy from "./strategy"
/**
* Encapsulate an result of each search results.
*/
export default class SearchResult {
data: Object
term: string
strategy: Strategy
/**
* @param {object} data - An element of array callbacked by search function.
*/
constructor(data: Object, term: string, strategy: Strategy) {
this.data = data
this.term = term
this.strategy = strategy
}
replace(beforeCursor: string, afterCursor: string) {
let replacement = this.strategy.replace(this.data)
if (replacement !== null) {
if (Array.isArray(replacement)) {
afterCursor = replacement[1] + afterCursor
replacement = replacement[0]
}
const match = this.strategy.matchText(beforeCursor)
if (match) {
replacement = replacement
.replace(/\$&/g, match[0])
.replace(/\$(\d)/g, (_, p1) => match[parseInt(p1, 10)])
return [
[
beforeCursor.slice(0, match.index),
replacement,
beforeCursor.slice(match.index + match[0].length),
].join(""),
afterCursor,
]
}
}
}
render(): string {
return this.strategy.template(this.data, this.term)
}
}