@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
73 lines • 9.98 kB
JavaScript
import { Directive, Input } from '@angular/core';
import { Utils } from '../../utils/utils.util';
import * as i0 from "@angular/core";
export class HighlightDirective {
constructor(el) {
this.el = el;
/**
* Whether to escape accents or no
*/
this.escapeAccents = true;
/**
* Whether to take into account case or no
*/
this.caseSensitive = false;
this.OPENING_TAG = '<mark class="nj-highlight">';
this.CLOSING_TAG = '</mark>';
}
ngOnChanges(changes) {
this.highlightText();
}
highlightText() {
if (Utils.isUndefinedOrNull(this.content) || Utils.isUndefinedOrNull(this.el?.nativeElement)) {
return;
}
const regexFlags = this.caseSensitive ? 'g' : 'gi';
let innerHtml;
if (Utils.isUndefinedOrNull(this.textToHighlight)) {
innerHtml = this.content;
}
else {
if (this.escapeAccents) {
const regExp = new RegExp(Utils.normalizeString(this.textToHighlight), regexFlags);
const matches = Utils.normalizeString(this.content).matchAll(regExp);
let finalText = this.content;
let buffer = 0;
if (!Utils.isUndefinedOrNull(matches)) {
for (const match of matches) {
const updatedIndex = buffer + match.index;
const textBeforeOccurrence = finalText.slice(0, updatedIndex);
const occurrence = finalText.slice(updatedIndex, updatedIndex + this.textToHighlight.length);
const textAfterOccurrence = finalText.slice(updatedIndex + this.textToHighlight.length, finalText.length);
finalText = `${textBeforeOccurrence}${this.OPENING_TAG}${occurrence}${this.CLOSING_TAG}${textAfterOccurrence}`;
buffer = buffer + this.OPENING_TAG.length + this.CLOSING_TAG.length;
}
}
innerHtml = finalText;
}
else {
const regExp = new RegExp(this.textToHighlight, regexFlags);
innerHtml = this.content.replace(regExp, `${this.OPENING_TAG}$&${this.CLOSING_TAG}`);
}
}
this.el.nativeElement.innerHTML = innerHtml;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HighlightDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: HighlightDirective, isStandalone: true, selector: "[njHighlight]", inputs: { content: "content", textToHighlight: "textToHighlight", escapeAccents: "escapeAccents", caseSensitive: "caseSensitive" }, usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: HighlightDirective, decorators: [{
type: Directive,
args: [{
selector: '[njHighlight]',
standalone: true
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { content: [{
type: Input
}], textToHighlight: [{
type: Input
}], escapeAccents: [{
type: Input
}], caseSensitive: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2hpZ2hsaWdodC9oaWdobGlnaHQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQWMsS0FBSyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUNyRixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7O0FBTTdDLE1BQU0sT0FBTyxrQkFBa0I7SUE0QjdCLFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBZmxDOztXQUVHO1FBRUksa0JBQWEsR0FBRyxJQUFJLENBQUM7UUFFNUI7O1dBRUc7UUFFSSxrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUVaLGdCQUFXLEdBQUcsNkJBQTZCLENBQUM7UUFDNUMsZ0JBQVcsR0FBRyxTQUFTLENBQUM7SUFFSixDQUFDO0lBRXRDLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVPLGFBQWE7UUFDbkIsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQyxFQUFFO1lBQzVGLE9BQU87U0FDUjtRQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25ELElBQUksU0FBaUIsQ0FBQztRQUN0QixJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDakQsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDMUI7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDdEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ25GLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDckUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQkFDN0IsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3JDLEtBQUssTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFO3dCQUMzQixNQUFNLFlBQVksR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQzt3QkFDMUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDOUQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQzdGLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUMxRyxTQUFTLEdBQUcsR0FBRyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLG1CQUFtQixFQUFFLENBQUM7d0JBQy9HLE1BQU0sR0FBRyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7cUJBQ3JFO2lCQUNGO2dCQUNELFNBQVMsR0FBRyxTQUFTLENBQUM7YUFDdkI7aUJBQU07Z0JBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDNUQsU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7YUFDdEY7U0FDRjtRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7SUFDOUMsQ0FBQzsrR0FqRVUsa0JBQWtCO21HQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjtpR0FNUSxPQUFPO3NCQURiLEtBQUs7Z0JBT0MsZUFBZTtzQkFEckIsS0FBSztnQkFPQyxhQUFhO3NCQURuQixLQUFLO2dCQU9DLGFBQWE7c0JBRG5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlc30gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1V0aWxzfSBmcm9tICcuLi8uLi91dGlscy91dGlscy51dGlsJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25qSGlnaGxpZ2h0XScsXG4gIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgSGlnaGxpZ2h0RGlyZWN0aXZlIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqXG4gICAqIENvbnRlbnQgd2Ugd2FudCB0byBoaWdobGlnaHRcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb250ZW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRleHQgdG8gaGlnaGxpZ2h0IGluIHRoZSBjb250ZW50XG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgdGV4dFRvSGlnaGxpZ2h0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIGFjY2VudHMgb3Igbm9cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlc2NhcGVBY2NlbnRzID0gdHJ1ZTtcblxuICAvKipcbiAgICogV2hldGhlciB0byB0YWtlIGludG8gYWNjb3VudCBjYXNlIG9yIG5vXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgY2FzZVNlbnNpdGl2ZSA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgT1BFTklOR19UQUcgPSAnPG1hcmsgY2xhc3M9XCJuai1oaWdobGlnaHRcIj4nO1xuICBwcml2YXRlIHJlYWRvbmx5IENMT1NJTkdfVEFHID0gJzwvbWFyaz4nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIHRoaXMuaGlnaGxpZ2h0VGV4dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBoaWdobGlnaHRUZXh0KCk6IHZvaWQge1xuICAgIGlmIChVdGlscy5pc1VuZGVmaW5lZE9yTnVsbCh0aGlzLmNvbnRlbnQpIHx8IFV0aWxzLmlzVW5kZWZpbmVkT3JOdWxsKHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlZ2V4RmxhZ3MgPSB0aGlzLmNhc2VTZW5zaXRpdmUgPyAnZycgOiAnZ2knO1xuICAgIGxldCBpbm5lckh0bWw6IHN0cmluZztcbiAgICBpZiAoVXRpbHMuaXNVbmRlZmluZWRPck51bGwodGhpcy50ZXh0VG9IaWdobGlnaHQpKSB7XG4gICAgICBpbm5lckh0bWwgPSB0aGlzLmNvbnRlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmVzY2FwZUFjY2VudHMpIHtcbiAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChVdGlscy5ub3JtYWxpemVTdHJpbmcodGhpcy50ZXh0VG9IaWdobGlnaHQpLCByZWdleEZsYWdzKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IFV0aWxzLm5vcm1hbGl6ZVN0cmluZyh0aGlzLmNvbnRlbnQpLm1hdGNoQWxsKHJlZ0V4cCk7XG4gICAgICAgIGxldCBmaW5hbFRleHQgPSB0aGlzLmNvbnRlbnQ7XG4gICAgICAgIGxldCBidWZmZXIgPSAwO1xuICAgICAgICBpZiAoIVV0aWxzLmlzVW5kZWZpbmVkT3JOdWxsKG1hdGNoZXMpKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSW5kZXggPSBidWZmZXIgKyBtYXRjaC5pbmRleDtcbiAgICAgICAgICAgIGNvbnN0IHRleHRCZWZvcmVPY2N1cnJlbmNlID0gZmluYWxUZXh0LnNsaWNlKDAsIHVwZGF0ZWRJbmRleCk7XG4gICAgICAgICAgICBjb25zdCBvY2N1cnJlbmNlID0gZmluYWxUZXh0LnNsaWNlKHVwZGF0ZWRJbmRleCwgdXBkYXRlZEluZGV4ICsgdGhpcy50ZXh0VG9IaWdobGlnaHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGNvbnN0IHRleHRBZnRlck9jY3VycmVuY2UgPSBmaW5hbFRleHQuc2xpY2UodXBkYXRlZEluZGV4ICsgdGhpcy50ZXh0VG9IaWdobGlnaHQubGVuZ3RoLCBmaW5hbFRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGAke3RleHRCZWZvcmVPY2N1cnJlbmNlfSR7dGhpcy5PUEVOSU5HX1RBR30ke29jY3VycmVuY2V9JHt0aGlzLkNMT1NJTkdfVEFHfSR7dGV4dEFmdGVyT2NjdXJyZW5jZX1gO1xuICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyICsgdGhpcy5PUEVOSU5HX1RBRy5sZW5ndGggKyB0aGlzLkNMT1NJTkdfVEFHLmxlbmd0aDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaW5uZXJIdG1sID0gZmluYWxUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLnRleHRUb0hpZ2hsaWdodCwgcmVnZXhGbGFncyk7XG4gICAgICAgIGlubmVySHRtbCA9IHRoaXMuY29udGVudC5yZXBsYWNlKHJlZ0V4cCwgYCR7dGhpcy5PUEVOSU5HX1RBR30kJiR7dGhpcy5DTE9TSU5HX1RBR31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LmlubmVySFRNTCA9IGlubmVySHRtbDtcbiAgfVxufVxuIl19