yuku-t/textcomplete

View on GitHub
src/search_result.js

Summary

Maintainability
A
0 mins
Test Coverage
// @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)
  }
}