@qrsln/highlighter
Version:
Based on highlighter.js
115 lines • 14.3 kB
JavaScript
import { Directive, Input } from '@angular/core';
import { HighlighterComponent } from './Components/highlighter/highlighter.component';
import * as i0 from "@angular/core";
export class HighlighterDirective {
elementRef;
viewContainerRef;
Options;
Theme = 'stackoverflow-dark'; // Stackoverflow Dark
Lang;
Code = '<html lang="en"></html>';
LineNumbers = false;
// @Input() theme: string;
el;
componentRef;
constructor(elementRef, // private appRef: ApplicationRef,
viewContainerRef) {
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.el = this.elementRef.nativeElement;
}
ngOnChanges(changes) {
if (!!changes['Theme'] && !changes['Theme'].firstChange) {
// console.log(changes);
this.Destroy();
this.SetComponent().then();
}
if (!!changes['LineNumbers'] && !changes['LineNumbers'].firstChange) {
// console.log(changes);
this.Destroy();
this.SetComponent().then();
}
if (!!changes['Code'] && !changes['Code'].firstChange) {
// console.log(changes);
this.Destroy();
this.SetComponent().then();
}
}
ngOnInit() {
this.SetComponent().then();
}
async SetComponent() {
if (this.Code === undefined || this.Code === '<html lang="en"></html>') {
this.Code = await this.GetContent();
}
// console.log(this.code);
this.componentRef = this.GetComponentRef();
this.componentRef.instance.Lang = this.Lang;
this.componentRef.instance.ClassName = this.el.className;
this.componentRef.instance.LineNumbers = this.LineNumbers;
if (this.Theme) {
this.componentRef.instance.Theme = this.Theme;
}
this.componentRef.instance.Code = this.Code;
this.componentRef.instance.Options = this.Options;
// Clear the evidence
// this.el.parentNode.removeChild(this.el);
this.el.style.display = 'none';
}
async GetContent() {
try {
const childNode = await this.el.childNodes[0]; // TextNode
// console.log('GetContent() ChildNode', childNode.textContent);
return childNode.textContent || '';
}
catch (e) {
return 'couldn\'t get innerHTML';
}
}
GetComponentRef() {
// 1. Create a component reference from the component
const componentRef = this.viewContainerRef.createComponent(HighlighterComponent);
// 2. Attach component to the appRef so that it's inside the ng component tree
// this.appRef.attachView(componentRef.hostView);
// TODO: Causes Error: NG0902: This view is already attached to a ViewContainer!
// 3. Get DOM element from component
const domElem = componentRef.hostView.rootNodes[0];
// 4. Append DOM element to the body
if (this.el.parentNode) {
this.el.parentNode.insertBefore(domElem, this.el.nextSibling);
// console.log('append as Sibling', domElem);
}
else {
this.el.appendChild(domElem);
// console.log('appendChild', domElem);
}
return componentRef;
}
Destroy() {
if (this.componentRef) {
this.componentRef.destroy();
}
}
ngOnDestroy() {
this.Destroy();
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: HighlighterDirective, deps: [{ token: i0.ElementRef }, { token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.1.3", type: HighlighterDirective, selector: "[qlHighlighter], [Highlighter]", inputs: { Options: "Options", Theme: "Theme", Lang: "Lang", Code: "Code", LineNumbers: "LineNumbers" }, usesOnChanges: true, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.1.3", ngImport: i0, type: HighlighterDirective, decorators: [{
type: Directive,
args: [{
selector: '[qlHighlighter], [Highlighter]',
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ViewContainerRef }], propDecorators: { Options: [{
type: Input
}], Theme: [{
type: Input
}], Lang: [{
type: Input
}], Code: [{
type: Input
}], LineNumbers: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0ZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvaGlnaGxpZ2h0ZXIvc3JjL2xpYi9oaWdobGlnaHRlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFBRSxLQUFLLEVBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGdEQUFnRCxDQUFDOztBQUtwRixNQUFNLE9BQU8sb0JBQW9CO0lBV1g7SUFDQTtJQVhYLE9BQU8sQ0FBMkI7SUFDbEMsS0FBSyxHQUFHLG9CQUFvQixDQUFDLENBQUMscUJBQXFCO0lBQ25ELElBQUksQ0FBcUI7SUFDekIsSUFBSSxHQUFHLHlCQUF5QixDQUFDO0lBQ2pDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFFN0IsMEJBQTBCO0lBQ1QsRUFBRSxDQUFjO0lBQ3pCLFlBQVksQ0FBaUQ7SUFFckUsWUFBb0IsVUFBbUMsRUFBRSxrQ0FBa0M7SUFDdkUsZ0JBQWtDO1FBRGxDLGVBQVUsR0FBVixVQUFVLENBQXlCO1FBQ25DLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDcEQsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4RCx3QkFBd0I7WUFDeEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxP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QztRQUMvQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdCLHVDQUF1QztRQUN6QyxDQUFDO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVPLE9BQU87UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO3VHQXJHVSxvQkFBb0I7MkZBQXBCLG9CQUFvQjs7MkZBQXBCLG9CQUFvQjtrQkFIaEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZ0NBQWdDO2lCQUMzQzs4R0FFVSxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50UmVmLCBFbGVtZW50UmVmLCBFbWJlZGRlZFZpZXdSZWYsXHJcbiAgRGlyZWN0aXZlLCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgVmlld0NvbnRhaW5lclJlZlxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0hpZ2hsaWdodGVyQ29tcG9uZW50fSBmcm9tICcuL0NvbXBvbmVudHMvaGlnaGxpZ2h0ZXIvaGlnaGxpZ2h0ZXIuY29tcG9uZW50JztcclxuXHJcbkBEaXJlY3RpdmUoe1xyXG4gIHNlbGVjdG9yOiAnW3FsSGlnaGxpZ2h0ZXJdLCBbSGlnaGxpZ2h0ZXJdJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhpZ2hsaWdodGVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgT3B0aW9uczogUGFydGlhbDxhbnk+IHwgdW5kZWZpbmVkO1xyXG4gIEBJbnB1dCgpIFRoZW1lID0gJ3N0YWNrb3ZlcmZsb3ctZGFyayc7IC8vIFN0YWNrb3ZlcmZsb3cgRGFya1xyXG4gIEBJbnB1dCgpIExhbmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBDb2RlID0gJzxodG1sIGxhbmc9XCJlblwiPjwvaHRtbD4nO1xyXG4gIEBJbnB1dCgpIExpbmVOdW1iZXJzID0gZmFsc2U7XHJcblxyXG4gIC8vIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBlbDogSFRNTEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxIaWdobGlnaHRlckNvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sIC8vIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcclxuICAgIHRoaXMuZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghIWNoYW5nZXNbJ1RoZW1lJ10gJiYgIWNoYW5nZXNbJ1RoZW1lJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coY2hhbmdlcyk7XHJcbiAgICAgIHRoaXMuRGVzdHJveSgpO1xyXG4gICAgICB0aGlzLlNldENvbXBvbmVudCgpLnRoZW4oKTtcclxuICAgIH1cclxuICAgIGlmICghIWNoYW5nZXNbJ0xpbmVOdW1iZXJzJ10gJiYgIWNoYW5nZXNbJ0xpbmVOdW1iZXJzJ10uZmlyc3RDaGFuZ2UpIHtcclxuICAgICAgLy8gY29uc29sZS5sb2coY2hhbmdlcyk7XHJcbiAgICAgIHRoaXMuRGVzdHJveSgpO1xyXG4gICAgICB0aGlzLlNldENvbXBvbmVudCgpLnRoZW4oKTtcclxuICAgIH1cclxuICAgIGlmICghIWNoYW5nZXNbJ0NvZGUnXSAmJiAhY2hhbmdlc1snQ29kZSddLmZpcnN0Q2hhbmdlKSB7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKGNoYW5nZXMpO1xyXG4gICAgICB0aGlzLkRlc3Ryb3koKTtcclxuICAgICAgdGhpcy5TZXRDb21wb25lbnQoKS50aGVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuU2V0Q29tcG9uZW50KCkudGhlbigpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBTZXRDb21wb25lbnQoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAodGhpcy5Db2RlID09PSB1bmRlZmluZWQgfHwgdGhpcy5Db2RlID09PSAnPGh0bWwgbGFuZz1cImVuXCI+PC9odG1sPicpIHtcclxuICAgICAgdGhpcy5Db2RlID0gYXdhaXQgdGhpcy5HZXRDb250ZW50KCk7XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmNvZGUpO1xyXG5cclxuICAgIHRoaXMuY29tcG9uZW50UmVmID0gdGhpcy5HZXRDb21wb25lbnRSZWYoKTtcclxuXHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5MYW5nID0gdGhpcy5MYW5nO1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuQ2xhc3NOYW1lID0gdGhpcy5lbC5jbGFzc05hbWU7XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5MaW5lTnVtYmVycyA9IHRoaXMuTGluZU51bWJlcnM7XHJcbiAgICBpZiAodGhpcy5UaGVtZSkge1xyXG4gICAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5UaGVtZSA9IHRoaXMuVGhlbWU7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbnN0YW5jZS5Db2RlID0gdGhpcy5Db2RlO1xyXG4gICAgdGhpcy5jb21wb25lbnRSZWYuaW5zdGFuY2UuT3B0aW9ucyA9IHRoaXMuT3B0aW9ucztcclxuXHJcbiAgICAvLyBDbGVhciB0aGUgZXZpZGVuY2VcclxuICAgIC8vIHRoaXMuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsKTtcclxuICAgIHRoaXMuZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgR2V0Q29udGVudCgpOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY2hpbGROb2RlID0gYXdhaXQgdGhpcy5lbC5jaGlsZE5vZGVzWzBdIGFzIENoaWxkTm9kZTsgLy8gVGV4dE5vZGVcclxuICAgICAgLy8gY29uc29sZS5sb2coJ0dldENvbnRlbnQoKSBDaGlsZE5vZGUnLCBjaGlsZE5vZGUudGV4dENvbnRlbnQpO1xyXG4gICAgICByZXR1cm4gY2hpbGROb2RlLnRleHRDb250ZW50IHx8ICcnO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICByZXR1cm4gJ2NvdWxkblxcJ3QgZ2V0IGlubmVySFRNTCc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIEdldENvbXBvbmVudFJlZigpOiBDb21wb25lbnRSZWY8SGlnaGxpZ2h0ZXJDb21wb25lbnQ+IHtcclxuICAgIC8vIDEuIENyZWF0ZSBhIGNvbXBvbmVudCByZWZlcmVuY2UgZnJvbSB0aGUgY29tcG9uZW50XHJcbiAgICBjb25zdCBjb21wb25lbnRSZWYgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KEhpZ2hsaWdodGVyQ29tcG9uZW50KTtcclxuXHJcbiAgICAvLyAyLiBBdHRhY2ggY29tcG9uZW50IHRvIHRoZSBhcHBSZWYgc28gdGhhdCBpdCdzIGluc2lkZSB0aGUgbmcgY29tcG9uZW50IHRyZWVcclxuICAgIC8vIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTtcclxuICAgIC8vIFRPRE86IENhdXNlcyBFcnJvcjogTkcwOTAyOiBUaGlzIHZpZXcgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhIFZpZXdDb250YWluZXIhXHJcblxyXG4gICAgLy8gMy4gR2V0IERPTSBlbGVtZW50IGZyb20gY29tcG9uZW50XHJcbiAgICBjb25zdCBkb21FbGVtID0gKGNvbXBvbmVudFJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8vIDQuIEFwcGVuZCBET00gZWxlbWVudCB0byB0aGUgYm9keVxyXG4gICAgaWYgKHRoaXMuZWwucGFyZW50Tm9kZSkge1xyXG4gICAgICB0aGlzLmVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRvbUVsZW0sIHRoaXMuZWwubmV4dFNpYmxpbmcpO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZygnYXBwZW5kIGFzIFNpYmxpbmcnLCBkb21FbGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZWwuYXBwZW5kQ2hpbGQoZG9tRWxlbSk7XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdhcHBlbmRDaGlsZCcsIGRvbUVsZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb21wb25lbnRSZWY7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIERlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5jb21wb25lbnRSZWYpIHtcclxuICAgICAgdGhpcy5jb21wb25lbnRSZWYuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLkRlc3Ryb3koKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==