ngx-highlightjs
Version:
Instant code highlighting, auto-detect language, super easy to use.
104 lines • 15.2 kB
JavaScript
import { Directive, Input, Output, Inject, Optional, EventEmitter, SecurityContext } from '@angular/core';
import { animationFrameScheduler } from 'rxjs';
import { HIGHLIGHT_OPTIONS } from './highlight.model';
import { trustedHTMLFromStringBypass } from './trusted-types';
import * as i0 from "@angular/core";
import * as i1 from "./highlight.service";
import * as i2 from "@angular/platform-browser";
export class Highlight {
constructor(el, _hljs, _sanitizer, _options) {
this._hljs = _hljs;
this._sanitizer = _sanitizer;
this._options = _options;
// Stream that emits when code string is highlighted
this.highlighted = new EventEmitter();
this._nativeElement = el.nativeElement;
}
ngOnChanges(changes) {
if (changes?.code?.currentValue !== null &&
changes.code.currentValue !== changes.code.previousValue) {
if (this.code) {
this.highlightElement(this.code, this.languages);
}
else {
// If string is empty, set the text content to empty
this.setTextContent('');
}
}
}
/**
* Highlighting with language detection and fix markup.
* @param code Accepts a string with the code to highlight
* @param languages An optional array of language names and aliases restricting detection to only those languages.
* The subset can also be set with configure, but the local parameter overrides the option if set.
*/
highlightElement(code, languages) {
// Set code text before highlighting
this.setTextContent(code);
this._hljs.highlightAuto(code, languages).subscribe((res) => {
// Set highlighted code
this.setInnerHTML(res?.value);
// Check if user want to show line numbers
if (this.lineNumbers && this._options && this._options.lineNumbersLoader) {
this.addLineNumbers();
}
// Forward highlight response to the highlighted output
this.highlighted.emit(res);
});
}
addLineNumbers() {
// Clean up line numbers observer
this.destroyLineNumbersObserver();
animationFrameScheduler.schedule(() => {
// Add line numbers
this._hljs.lineNumbersBlock(this._nativeElement).subscribe();
// If lines count is 1, the line numbers library will not add numbers
// Observe changes to add 'hljs-line-numbers' class only when line numbers is added to the code element
this._lineNumbersObs = new MutationObserver(() => {
if (this._nativeElement.firstElementChild && this._nativeElement.firstElementChild.tagName.toUpperCase() === 'TABLE') {
this._nativeElement.classList.add('hljs-line-numbers');
}
this.destroyLineNumbersObserver();
});
this._lineNumbersObs.observe(this._nativeElement, { childList: true });
});
}
destroyLineNumbersObserver() {
if (this._lineNumbersObs) {
this._lineNumbersObs.disconnect();
this._lineNumbersObs = null;
}
}
setTextContent(content) {
animationFrameScheduler.schedule(() => this._nativeElement.textContent = content);
}
setInnerHTML(content) {
animationFrameScheduler.schedule(() => this._nativeElement.innerHTML = trustedHTMLFromStringBypass(this._sanitizer.sanitize(SecurityContext.HTML, content) || ''));
}
}
Highlight.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: Highlight, deps: [{ token: i0.ElementRef }, { token: i1.HighlightJS }, { token: i2.DomSanitizer }, { token: HIGHLIGHT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Directive });
Highlight.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.0", type: Highlight, selector: "[highlight]", inputs: { code: ["highlight", "code"], languages: "languages", lineNumbers: "lineNumbers" }, outputs: { highlighted: "highlighted" }, host: { properties: { "class.hljs": "true" } }, usesOnChanges: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: Highlight, decorators: [{
type: Directive,
args: [{
host: {
'[class.hljs]': 'true'
},
selector: '[highlight]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.HighlightJS }, { type: i2.DomSanitizer }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: [HIGHLIGHT_OPTIONS]
}] }]; }, propDecorators: { code: [{
type: Input,
args: ['highlight']
}], languages: [{
type: Input
}], lineNumbers: [{
type: Input
}], highlighted: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWhpZ2hsaWdodGpzL3NyYy9saWIvaGlnaGxpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sUUFBUSxFQUNSLFlBQVksRUFJWixlQUFlLEVBQ2hCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQyxPQUFPLEVBQUUsaUJBQWlCLEVBQXlDLE1BQU0sbUJBQW1CLENBQUM7QUFDN0YsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUJBQWlCLENBQUM7Ozs7QUFROUQsTUFBTSxPQUFPLFNBQVM7SUFxQnBCLFlBQVksRUFBYyxFQUNOLEtBQWtCLEVBQ2xCLFVBQXdCLEVBQ2UsUUFBMEI7UUFGakUsVUFBSyxHQUFMLEtBQUssQ0FBYTtRQUNsQixlQUFVLEdBQVYsVUFBVSxDQUFjO1FBQ2UsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7UUFOckYsb0RBQW9EO1FBQzFDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFNOUQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFDRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksS0FBSyxJQUFJO1lBQ3BDLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUN4RDtZQUNBLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDYixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbEQ7aUJBQU07Z0JBQ0wsb0RB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QkFBQyxpQkFBaUI7NENBZjdCLElBQUk7c0JBQXZCLEtBQUs7dUJBQUMsV0FBVztnQkFJVCxTQUFTO3NCQUFqQixLQUFLO2dCQUdHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgRGlyZWN0aXZlLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBJbmplY3QsXHJcbiAgT3B0aW9uYWwsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgU2VjdXJpdHlDb250ZXh0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZVNjaGVkdWxlciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBIaWdobGlnaHRKUyB9IGZyb20gJy4vaGlnaGxpZ2h0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBISUdITElHSFRfT1BUSU9OUywgSGlnaGxpZ2h0T3B0aW9ucywgSGlnaGxpZ2h0QXV0b1Jlc3VsdCB9IGZyb20gJy4vaGlnaGxpZ2h0Lm1vZGVsJztcclxuaW1wb3J0IHsgdHJ1c3RlZEhUTUxGcm9tU3RyaW5nQnlwYXNzIH0gZnJvbSAnLi90cnVzdGVkLXR5cGVzJztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIGhvc3Q6IHtcclxuICAgICdbY2xhc3MuaGxqc10nOiAndHJ1ZSdcclxuICB9LFxyXG4gIHNlbGVjdG9yOiAnW2hpZ2hsaWdodF0nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIaWdobGlnaHQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG5cclxuICAvLyBIaWdobGlnaHRlZCBDb2RlXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQ7XHJcblxyXG4gIC8vIFRlbXAgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZSB3aGVuIGxpbmUgbnVtYmVycyBoYXMgYmVlbiBhZGRlZCB0byBjb2RlIGVsZW1lbnRcclxuICBwcml2YXRlIF9saW5lTnVtYmVyc09iczogYW55O1xyXG5cclxuICAvLyBIaWdobGlnaHQgY29kZSBpbnB1dFxyXG4gIEBJbnB1dCgnaGlnaGxpZ2h0JykgY29kZTogc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgLy8gQW4gb3B0aW9uYWwgYXJyYXkgb2YgbGFuZ3VhZ2UgbmFtZXMgYW5kIGFsaWFzZXMgcmVzdHJpY3RpbmcgZGV0ZWN0aW9uIHRvIG9ubHkgdGhvc2UgbGFuZ3VhZ2VzLlxyXG4gIC8vIFRoZSBzdWJzZXQgY2FuIGFsc28gYmUgc2V0IHdpdGggY29uZmlndXJlLCBidXQgdGhlIGxvY2FsIHBhcmFtZXRlciBvdmVycmlkZXMgdGhlIG9wdGlvbiBpZiBzZXQuXHJcbiAgQElucHV0KCkgbGFuZ3VhZ2VzITogc3RyaW5nW107XHJcblxyXG4gIC8vIFNob3cgbGluZSBudW1iZXJzXHJcbiAgQElucHV0KCkgbGluZU51bWJlcnMhOiBib29sZWFuO1xyXG5cclxuICAvLyBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGNvZGUgc3RyaW5nIGlzIGhpZ2hsaWdodGVkXHJcbiAgQE91dHB1dCgpIGhpZ2hsaWdodGVkID0gbmV3IEV2ZW50RW1pdHRlcjxIaWdobGlnaHRBdXRvUmVzdWx0PigpO1xyXG5cclxuICBjb25zdHJ1Y3RvcihlbDogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9obGpzOiBIaWdobGlnaHRKUyxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9zYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEhJR0hMSUdIVF9PUFRJT05TKSBwcml2YXRlIF9vcHRpb25zOiBIaWdobGlnaHRPcHRpb25zKSB7XHJcbiAgICB0aGlzLl9uYXRpdmVFbGVtZW50ID0gZWwubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChcclxuICAgICAgY2hhbmdlcz8uY29kZT8uY3VycmVudFZhbHVlICE9PSBudWxsICYmXHJcbiAgICAgIGNoYW5nZXMuY29kZS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuY29kZS5wcmV2aW91c1ZhbHVlXHJcbiAgICApIHtcclxuICAgICAgaWYgKHRoaXMuY29kZSkge1xyXG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0RWxlbWVudCh0aGlzLmNvZGUsIHRoaXMubGFuZ3VhZ2VzKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBJZiBzdHJpbmcgaXMgZW1wdHksIHNldCB0aGUgdGV4dCBjb250ZW50IHRvIGVtcHR5XHJcbiAgICAgICAgdGhpcy5zZXRUZXh0Q29udGVudCgnJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhpZ2hsaWdodGluZyB3aXRoIGxhbmd1YWdlIGRldGVjdGlvbiBhbmQgZml4IG1hcmt1cC5cclxuICAgKiBAcGFyYW0gY29kZSBBY2NlcHRzIGEgc3RyaW5nIHdpdGggdGhlIGNvZGUgdG8gaGlnaGxpZ2h0XHJcbiAgICogQHBhcmFtIGxhbmd1YWdlcyBBbiBvcHRpb25hbCBhcnJheSBvZiBsYW5ndWFnZSBuYW1lcyBhbmQgYWxpYXNlcyByZXN0cmljdGluZyBkZXRlY3Rpb24gdG8gb25seSB0aG9zZSBsYW5ndWFnZXMuXHJcbiAgICogVGhlIHN1YnNldCBjYW4gYWxzbyBiZSBzZXQgd2l0aCBjb25maWd1cmUsIGJ1dCB0aGUgbG9jYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyB0aGUgb3B0aW9uIGlmIHNldC5cclxuICAgKi9cclxuICBoaWdobGlnaHRFbGVtZW50KGNvZGU6IHN0cmluZywgbGFuZ3VhZ2VzOiBzdHJpbmdbXSk6IHZvaWQge1xyXG4gICAgLy8gU2V0IGNvZGUgdGV4dCBiZWZvcmUgaGlnaGxpZ2h0aW5nXHJcbiAgICB0aGlzLnNldFRleHRDb250ZW50KGNvZGUpO1xyXG4gICAgdGhpcy5faGxqcy5oaWdobGlnaHRBdXRvKGNvZGUsIGxhbmd1YWdlcykuc3Vic2NyaWJlKChyZXM6IEhpZ2hsaWdodEF1dG9SZXN1bHQpID0+IHtcclxuICAgICAgLy8gU2V0IGhpZ2hsaWdodGVkIGNvZGVcclxuICAgICAgdGhpcy5zZXRJbm5lckhUTUwocmVzPy52YWx1ZSk7XHJcbiAgICAgIC8vIENoZWNrIGlmIHVzZXIgd2FudCB0byBzaG93IGxpbmUgbnVtYmVyc1xyXG4gICAgICBpZiAodGhpcy5saW5lTnVtYmVycyAmJiB0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubGluZU51bWJlcnNMb2FkZXIpIHtcclxuICAgICAgICB0aGlzLmFkZExpbmVOdW1iZXJzKCk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gRm9yd2FyZCBoaWdobGlnaHQgcmVzcG9uc2UgdG8gdGhlIGhpZ2hsaWdodGVkIG91dHB1dFxyXG4gICAgICB0aGlzLmhpZ2hsaWdodGVkLmVtaXQocmVzKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRMaW5lTnVtYmVycygpIHtcclxuICAgIC8vIENsZWFuIHVwIGxpbmUgbnVtYmVycyBvYnNlcnZlclxyXG4gICAgdGhpcy5kZXN0cm95TGluZU51bWJlcnNPYnNlcnZlcigpO1xyXG4gICAgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4ge1xyXG4gICAgICAvLyBBZGQgbGluZSBudW1iZXJzXHJcbiAgICAgIHRoaXMuX2hsanMubGluZU51bWJlcnNCbG9jayh0aGlzLl9uYXRpdmVFbGVtZW50KS5zdWJzY3JpYmUoKTtcclxuICAgICAgLy8gSWYgbGluZXMgY291bnQgaXMgMSwgdGhlIGxpbmUgbnVtYmVycyBsaWJyYXJ5IHdpbGwgbm90IGFkZCBudW1iZXJzXHJcbiAgICAgIC8vIE9ic2VydmUgY2hhbmdlcyB0byBhZGQgJ2hsanMtbGluZS1udW1iZXJzJyBjbGFzcyBvbmx5IHdoZW4gbGluZSBudW1iZXJzIGlzIGFkZGVkIHRvIHRoZSBjb2RlIGVsZW1lbnRcclxuICAgICAgdGhpcy5fbGluZU51bWJlcnNPYnMgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuX25hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgJiYgdGhpcy5fbmF0aXZlRWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdUQUJMRScpIHtcclxuICAgICAgICAgIHRoaXMuX25hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaGxqcy1saW5lLW51bWJlcnMnKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5kZXN0cm95TGluZU51bWJlcnNPYnNlcnZlcigpO1xyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5fbGluZU51bWJlcnNPYnMub2JzZXJ2ZSh0aGlzLl9uYXRpdmVFbGVtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95TGluZU51bWJlcnNPYnNlcnZlcigpIHtcclxuICAgIGlmICh0aGlzLl9saW5lTnVtYmVyc09icykge1xyXG4gICAgICB0aGlzLl9saW5lTnVtYmVyc09icy5kaXNjb25uZWN0KCk7XHJcbiAgICAgIHRoaXMuX2xpbmVOdW1iZXJzT2JzID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0VGV4dENvbnRlbnQoY29udGVudDogc3RyaW5nKSB7XHJcbiAgICBhbmltYXRpb25GcmFtZVNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PlxyXG4gICAgICB0aGlzLl9uYXRpdmVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0SW5uZXJIVE1MKGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+XHJcbiAgICAgIHRoaXMuX25hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MID0gdHJ1c3RlZEhUTUxGcm9tU3RyaW5nQnlwYXNzKFxyXG4gICAgICAgIHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgY29udGVudCkgfHwgJydcclxuICAgICAgKVxyXG4gICAgKTtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==