import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'dsEmphasize' })
/**
 * Pipe for emphasizing a part of a string by surrounding it with <em> tags
 */
export class EmphasizePipe implements PipeTransform {
  /**
   * Characters that should be escaped
   */
  specials = [
    // order matters for these
    '-'
    , '['
    , ']'
    // order doesn't matter for any of these
    , '/'
    , '{'
    , '}'
    , '('
    , ')'
    , '*'
    , '+'
    , '?'
    , '.'
    , '\\'
    , '^'
    , '$'
    , '|'
  ];
  /**
   * Regular expression for escaping the string we're trying to find
   */
  regex = RegExp('[' + this.specials.join('\\') + ']', 'g');

  /**
   *
   * @param haystack The string which we want to partly highlight
   * @param needle The string that should become emphasized in the haystack string
   * @returns {any} Transformed haystack with the needle emphasized
   */
  transform(haystack, needle): any {
    const escaped = this.escapeRegExp(needle);
    const reg = new RegExp(escaped, 'gi');
    return haystack.replace(reg, '<em>$&</em>');
  }

  /**
   *
   * @param str Escape special characters in the string we're looking for
   * @returns {any} The escaped version of the input string
   */
   escapeRegExp(str) {
    return str.replace(this.regex, '\\$&');
  }
}