UNPKG

ngx-highlightjs

Version:

Instant code highlighting, auto-detect language, super easy to use.

104 lines 15.2 kB
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==