UNPKG

ngx-highlightjs

Version:

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

138 lines 19.5 kB
import { Injectable, Inject, PLATFORM_ID, Optional } from '@angular/core'; import { DOCUMENT, isPlatformBrowser } from '@angular/common'; import { BehaviorSubject, from, EMPTY, zip, throwError } from 'rxjs'; import { catchError, tap, map, switchMap, filter, take } from 'rxjs/operators'; import { HIGHLIGHT_OPTIONS } from './highlight.model'; import * as i0 from "@angular/core"; // @dynamic export class HighlightLoader { constructor(doc, platformId, _options) { this.doc = doc; this._options = _options; // Stream that emits when hljs library is loaded and ready to use this._ready = new BehaviorSubject(null); this.ready = this._ready.asObservable().pipe(filter((hljs) => !!hljs), map((hljs) => hljs), take(1)); if (isPlatformBrowser(platformId)) { // Check if hljs is already available if (doc.defaultView.hljs) { this._ready.next(doc.defaultView.hljs); } else { // Load hljs library this._loadLibrary().pipe(switchMap((hljs) => { if (this._options && this._options.lineNumbersLoader) { // Make hljs available on window object (required for the line numbers library) doc.defaultView.hljs = hljs; // Load line numbers library return this.loadLineNumbers().pipe(tap(() => this._ready.next(hljs))); } else { this._ready.next(hljs); return EMPTY; } }), catchError((e) => { console.error('[HLJS] ', e); return EMPTY; })).subscribe(); } // Load highlighting theme if (this._options?.themePath) { this.loadTheme(this._options.themePath); } } } /** * Lazy-Load highlight.js library */ _loadLibrary() { if (this._options) { if (this._options.fullLibraryLoader && this._options.coreLibraryLoader) { return throwError(() => 'The full library and the core library were imported, only one of them should be imported!'); } if (this._options.fullLibraryLoader && this._options.languages) { return throwError(() => 'The highlighting languages were imported they are not needed!'); } if (this._options.coreLibraryLoader && !this._options.languages) { return throwError(() => 'The highlighting languages were not imported!'); } if (!this._options.coreLibraryLoader && this._options.languages) { return throwError(() => 'The core library was not imported!'); } if (this._options.fullLibraryLoader) { return this.loadFullLibrary(); } if (this._options.coreLibraryLoader && this._options.languages && Object.keys(this._options.languages).length) { return this.loadCoreLibrary().pipe(switchMap((hljs) => this._loadLanguages(hljs))); } } return throwError(() => 'Highlight.js library was not imported!'); } /** * Lazy-load highlight.js languages */ _loadLanguages(hljs) { const languages = Object.entries(this._options.languages).map(([langName, langLoader]) => importModule(langLoader()).pipe(tap((langFunc) => hljs.registerLanguage(langName, langFunc)))); return zip(...languages).pipe(map(() => hljs)); } /** * Import highlight.js core library */ loadCoreLibrary() { return importModule(this._options.coreLibraryLoader()); } /** * Import highlight.js library with all languages */ loadFullLibrary() { return importModule(this._options.fullLibraryLoader()); } /** * Import line numbers library */ loadLineNumbers() { return importModule(this._options.lineNumbersLoader()); } /** * Reload theme styles */ setTheme(path) { this._themeLinkElement.href = path; } /** * Load theme */ loadTheme(path) { this._themeLinkElement = this.doc.createElement('link'); this._themeLinkElement.href = path; this._themeLinkElement.type = 'text/css'; this._themeLinkElement.rel = 'stylesheet'; this._themeLinkElement.media = 'screen,print'; this.doc.head.appendChild(this._themeLinkElement); } } HighlightLoader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, deps: [{ token: DOCUMENT }, { token: PLATFORM_ID }, { token: HIGHLIGHT_OPTIONS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); HighlightLoader.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: HighlightLoader, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [HIGHLIGHT_OPTIONS] }] }]; } }); /** * Map loader response to module object */ const importModule = (moduleLoader) => { return from(moduleLoader).pipe(filter((module) => !!module && !!module.default), map((module) => module.default)); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LmxvYWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1oaWdobGlnaHRqcy9zcmMvbGliL2hpZ2hsaWdodC5sb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGVBQWUsRUFBYyxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDL0UsT0FBTyxFQUFFLGlCQUFpQixFQUFzQyxNQUFNLG1CQUFtQixDQUFDOztBQUUxRixXQUFXO0FBSVgsTUFBTSxPQUFPLGVBQWU7SUFXMUIsWUFBc0MsR0FBUSxFQUNiLFVBQWtCLEVBQ1EsUUFBMEI7UUFGL0MsUUFBRyxHQUFILEdBQUcsQ0FBSztRQUVhLGFBQVEsR0FBUixRQUFRLENBQWtCO1FBWnJGLGlFQUFpRTtRQUNoRCxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQ3BFLFVBQUssR0FBaUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQzVFLE1BQU0sQ0FBQyxDQUFDLElBQTZCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDakQsR0FBRyxDQUFDLENBQUMsSUFBNkIsRUFBRSxFQUFFLENBQUMsSUFBd0IsQ0FBQyxFQUNoRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FBQztRQU9B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bnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0LCBQTEFURk9STV9JRCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQsIGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBmcm9tLCBFTVBUWSwgemlwLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHRhcCwgbWFwLCBzd2l0Y2hNYXAsIGZpbHRlciwgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgSElHSExJR0hUX09QVElPTlMsIEhpZ2hsaWdodExpYnJhcnksIEhpZ2hsaWdodE9wdGlvbnMgfSBmcm9tICcuL2hpZ2hsaWdodC5tb2RlbCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIaWdobGlnaHRMb2FkZXIge1xyXG4gIC8vIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gaGxqcyBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgcmVhZHkgdG8gdXNlXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfcmVhZHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhpZ2hsaWdodExpYnJhcnkgfCBudWxsPihudWxsKTtcclxuICByZWFkb25seSByZWFkeTogT2JzZXJ2YWJsZTxIaWdobGlnaHRMaWJyYXJ5PiA9IHRoaXMuX3JlYWR5LmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICBmaWx0ZXIoKGhsanM6IEhpZ2hsaWdodExpYnJhcnkgfCBudWxsKSA9PiAhIWhsanMpLFxyXG4gICAgbWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5IHwgbnVsbCkgPT4gaGxqcyBhcyBIaWdobGlnaHRMaWJyYXJ5KSxcclxuICAgIHRha2UoMSlcclxuICApO1xyXG5cclxuICBwcml2YXRlIF90aGVtZUxpbmtFbGVtZW50OiBIVE1MTGlua0VsZW1lbnQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnksXHJcbiAgICAgICAgICAgICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogb2JqZWN0LFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoSElHSExJR0hUX09QVElPTlMpIHByaXZhdGUgX29wdGlvbnM6IEhpZ2hsaWdodE9wdGlvbnMpIHtcclxuICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSkge1xyXG4gICAgICAvLyBDaGVjayBpZiBobGpzIGlzIGFscmVhZHkgYXZhaWxhYmxlXHJcbiAgICAgIGlmIChkb2MuZGVmYXVsdFZpZXcuaGxqcykge1xyXG4gICAgICAgIHRoaXMuX3JlYWR5Lm5leHQoZG9jLmRlZmF1bHRWaWV3LmhsanMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIExvYWQgaGxqcyBsaWJyYXJ5XHJcbiAgICAgICAgdGhpcy5fbG9hZExpYnJhcnkoKS5waXBlKFxyXG4gICAgICAgICAgc3dpdGNoTWFwKChobGpzOiBIaWdobGlnaHRMaWJyYXJ5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubGluZU51bWJlcnNMb2FkZXIpIHtcclxuICAgICAgICAgICAgICAvLyBNYWtlIGhsanMgYXZhaWxhYmxlIG9uIHdpbmRvdyBvYmplY3QgKHJlcXVpcmVkIGZvciB0aGUgbGluZSBudW1iZXJzIGxpYnJhcnkpXHJcbiAgICAgICAgICAgICAgZG9jLmRlZmF1bHRWaWV3LmhsanMgPSBobGpzO1xyXG4gICAgICAgICAgICAgIC8vIExvYWQgbGluZSBudW1iZXJzIGxpYnJhcnlcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkTGluZU51bWJlcnMoKS5waXBlKHRhcCgoKSA9PiB0aGlzLl9yZWFkeS5uZXh0KGhsanMpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcmVhZHkubmV4dChobGpzKTtcclxuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgY2F0Y2hFcnJvcigoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tITEpTXSAnLCBlKTtcclxuICAgICAgICAgICAgcmV0dXJuIEVNUFRZO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBMb2FkIGhpZ2hsaWdodGluZyB0aGVtZVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucz8udGhlbWVQYXRoKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkVGhlbWUodGhpcy5fb3B0aW9ucy50aGVtZVBhdGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXp5LUxvYWQgaGlnaGxpZ2h0LmpzIGxpYnJhcnlcclxuICAgKi9cclxuICBwcml2YXRlIF9sb2FkTGlicmFyeSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgaWYgKHRoaXMuX29wdGlvbnMpIHtcclxuICAgICAgaWYgKHRoaXMuX29wdGlvbnMuZnVsbExpYnJhcnlMb2FkZXIgJiYgdGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlcikge1xyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+ICdUaGUgZnVsbCBsaWJyYXJ5IGFuZCB0aGUgY29yZSBsaWJyYXJ5IHdlcmUgaW1wb3J0ZWQsIG9ubHkgb25lIG9mIHRoZW0gc2hvdWxkIGJlIGltcG9ydGVkIScpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmZ1bGxMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ1RoZSBoaWdobGlnaHRpbmcgbGFuZ3VhZ2VzIHdlcmUgaW1wb3J0ZWQgdGhleSBhcmUgbm90IG5lZWRlZCEnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlciAmJiAhdGhpcy5fb3B0aW9ucy5sYW5ndWFnZXMpIHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnVGhlIGhpZ2hsaWdodGluZyBsYW5ndWFnZXMgd2VyZSBub3QgaW1wb3J0ZWQhJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLl9vcHRpb25zLmNvcmVMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gJ1RoZSBjb3JlIGxpYnJhcnkgd2FzIG5vdCBpbXBvcnRlZCEnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5fb3B0aW9ucy5mdWxsTGlicmFyeUxvYWRlcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRGdWxsTGlicmFyeSgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLl9vcHRpb25zLmNvcmVMaWJyYXJ5TG9hZGVyICYmIHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzICYmIE9iamVjdC5rZXlzKHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKS5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29yZUxpYnJhcnkoKS5waXBlKHN3aXRjaE1hcCgoaGxqczogSGlnaGxpZ2h0TGlicmFyeSkgPT4gdGhpcy5fbG9hZExhbmd1YWdlcyhobGpzKSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiAnSGlnaGxpZ2h0LmpzIGxpYnJhcnkgd2FzIG5vdCBpbXBvcnRlZCEnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExhenktbG9hZCBoaWdobGlnaHQuanMgbGFuZ3VhZ2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfbG9hZExhbmd1YWdlcyhobGpzOiBIaWdobGlnaHRMaWJyYXJ5KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGNvbnN0IGxhbmd1YWdlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX29wdGlvbnMubGFuZ3VhZ2VzKS5tYXAoKFtsYW5nTmFtZSwgbGFuZ0xvYWRlcl06IFtzdHJpbmcsICgpID0+IFByb21pc2U8YW55Pl0pID0+XHJcbiAgICAgIGltcG9ydE1vZHVsZShsYW5nTG9hZGVyKCkpLnBpcGUoXHJcbiAgICAgICAgdGFwKChsYW5nRnVuYzogYW55KSA9PiBobGpzLnJlZ2lzdGVyTGFuZ3VhZ2UobGFuZ05hbWUsIGxhbmdGdW5jKSlcclxuICAgICAgKVxyXG4gICAgKTtcclxuICAgIHJldHVybiB6aXAoLi4ubGFuZ3VhZ2VzKS5waXBlKG1hcCgoKSA9PiBobGpzKSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3J0IGhpZ2hsaWdodC5qcyBjb3JlIGxpYnJhcnlcclxuICAgKi9cclxuICBwcml2YXRlIGxvYWRDb3JlTGlicmFyeSgpOiBPYnNlcnZhYmxlPEhpZ2hsaWdodExpYnJhcnk+IHtcclxuICAgIHJldHVybiBpbXBvcnRNb2R1bGUodGhpcy5fb3B0aW9ucy5jb3JlTGlicmFyeUxvYWRlciEoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbXBvcnQgaGlnaGxpZ2h0LmpzIGxpYnJhcnkgd2l0aCBhbGwgbGFuZ3VhZ2VzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkRnVsbExpYnJhcnkoKTogT2JzZXJ2YWJsZTxIaWdobGlnaHRMaWJyYXJ5PiB7XHJcbiAgICByZXR1cm4gaW1wb3J0TW9kdWxlKHRoaXMuX29wdGlvbnMuZnVsbExpYnJhcnlMb2FkZXIhKCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3J0IGxpbmUgbnVtYmVycyBsaWJyYXJ5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBsb2FkTGluZU51bWJlcnMoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiBpbXBvcnRNb2R1bGUodGhpcy5fb3B0aW9ucy5saW5lTnVtYmVyc0xvYWRlciEoKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWxvYWQgdGhlbWUgc3R5bGVzXHJcbiAgICovXHJcbiAgc2V0VGhlbWUocGF0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50LmhyZWYgPSBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZCB0aGVtZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgbG9hZFRoZW1lKHBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5fdGhlbWVMaW5rRWxlbWVudCA9IHRoaXMuZG9jLmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgIHRoaXMuX3RoZW1lTGlua0VsZW1lbnQuaHJlZiA9IHBhdGg7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50LnR5cGUgPSAndGV4dC9jc3MnO1xyXG4gICAgdGhpcy5fdGhlbWVMaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XHJcbiAgICB0aGlzLl90aGVtZUxpbmtFbGVtZW50Lm1lZGlhID0gJ3NjcmVlbixwcmludCc7XHJcbiAgICB0aGlzLmRvYy5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX3RoZW1lTGlua0VsZW1lbnQpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIE1hcCBsb2FkZXIgcmVzcG9uc2UgdG8gbW9kdWxlIG9iamVjdFxyXG4gKi9cclxuY29uc3QgaW1wb3J0TW9kdWxlID0gKG1vZHVsZUxvYWRlcjogUHJvbWlzZTxhbnk+KTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICByZXR1cm4gZnJvbShtb2R1bGVMb2FkZXIpLnBpcGUoXHJcbiAgICBmaWx0ZXIoKG1vZHVsZTogYW55KSA9PiAhIW1vZHVsZSAmJiAhIW1vZHVsZS5kZWZhdWx0KSxcclxuICAgIG1hcCgobW9kdWxlOiBhbnkpID0+IG1vZHVsZS5kZWZhdWx0KVxyXG4gICk7XHJcbn07XHJcbiJdfQ==