angular自定义管道记录-高亮管道

128 阅读1分钟

实现效果

image.png

tips:这里是大小写都匹配了 可以自己加一个属性来判断是否要区分大小写 根据大佬写的管道继续修改==

使用方法

<span [innerHTML]="item?.title | highlightSearchResult: searchValue : 2 : true | safe: 'html'"></span>

safe管道

代码如下

enum IHightType {
  Deafult = 0, // 默认字体红色
  YellowBackGround = 1, // 黄色背景
  BlueFontGround = 2, // 蓝色字体
}
@Pipe({
  name: 'highlightSearchResult',
})

export class HighlightSearchPipe implements PipeTransform {

  /**
   *
   *
   * @param {string} value 值
   * @param {string} [args] 搜索值
   * @param {number} [type] 类型(颜色不同) 0 红色高亮(默认) 1 黄色背景色 2 蓝色高亮
   * @param {boolean} [isMultiple] 是否匹配多个 true为多个匹配 false为单一匹配
   * @return {*}  {string}
   * @memberof HighlightSearchPipe
   */
  public transform(value: string, args?: string, type?: number, isMultiple?: boolean): string {
    const argsArr = args && args.split('.'); // 是以点来分割需要搜索的值
    const needSearchValue = argsArr && argsArr[argsArr.length - 1];
    let endValue = value;
    const isEnglishReg = new RegExp('^[a-zA-Z]+$');
    if (isEnglishReg.test(needSearchValue)) {     // 输入拼音的情况
      endValue = this.getEndValue(value, needSearchValue, value, type, isMultiple);
    } else {
      const searchValue = needSearchValue;
      const regExp = new RegExp(searchValue, 'gi'); // 全局匹配忽略大小写
      if (regExp.test(value)) {
        endValue = this.getEndValue(value, needSearchValue, value, type, isMultiple);
      }
    }
    return endValue;
  }

  public getEndValue(
    value: string, searchValue: string,
    oriValue: string, type: number = 0, isMultiple: boolean = false): string {
    if (searchValue) {
      let endValue = oriValue;
      const upperValue = value.toUpperCase();
      const upperSearch = searchValue.toUpperCase();
      const matchIndex = upperValue.indexOf(upperSearch);
      if (matchIndex !== -1) {
        let afterValue = oriValue.substring(matchIndex + searchValue.length);
        // 增加多个匹配
        afterValue = isMultiple ? this.getEndValue(afterValue, searchValue, afterValue, type, isMultiple) : afterValue;
        switch (type) {
          case IHightType.YellowBackGround:
            endValue = oriValue.substring(0, matchIndex) +
            `<span style="background-color: #FFC900">${oriValue.substring(matchIndex, matchIndex + searchValue.length)}</span>`
            + afterValue;
            break;
          case IHightType.BlueFontGround:
            endValue = oriValue.substring(0, matchIndex) +
            `<span style="color: #009FFF">${oriValue.substring(matchIndex, matchIndex + searchValue.length)}</span>`
            + afterValue;
            break;
          default:
            endValue = oriValue.substring(0, matchIndex) +
            `<span style="color: red">${oriValue.substring(matchIndex, matchIndex + searchValue.length)}</span>`
            + afterValue;
            break;
        }
      }
      return endValue;
    } else {
      return oriValue;
    }
  }
}