nxt-highlightjs 19.0.5 → 20.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/extras/index.d.ts +152 -5
- package/fesm2022/nxt-highlightjs-extras.mjs +18 -18
- package/fesm2022/nxt-highlightjs-extras.mjs.map +1 -1
- package/fesm2022/nxt-highlightjs-line-numbers.mjs +51 -107
- package/fesm2022/nxt-highlightjs-line-numbers.mjs.map +1 -1
- package/fesm2022/nxt-highlightjs.mjs +324 -49
- package/fesm2022/nxt-highlightjs.mjs.map +1 -1
- package/index.d.ts +196 -3
- package/line-numbers/index.d.ts +21 -5
- package/package.json +7 -7
- package/extras/code-file-location.d.ts +0 -12
- package/extras/code-from-url.d.ts +0 -10
- package/extras/code-loader.d.ts +0 -22
- package/extras/gist.d.ts +0 -20
- package/extras/gist.model.d.ts +0 -95
- package/extras/highlight-extras.module.d.ts +0 -8
- package/extras/public_api.d.ts +0 -5
- package/lib/highlight-auto.d.ts +0 -27
- package/lib/highlight-base.d.ts +0 -27
- package/lib/highlight.d.ts +0 -30
- package/lib/highlight.loader.d.ts +0 -28
- package/lib/highlight.model.d.ts +0 -22
- package/lib/highlight.module.d.ts +0 -8
- package/lib/highlight.service.d.ts +0 -64
- package/lib/loader-errors.d.ts +0 -7
- package/lib/trusted-types.d.ts +0 -1
- package/line-numbers/line-numbers-lib.d.ts +0 -6
- package/line-numbers/line-numbers.d.ts +0 -12
- package/line-numbers/public_api.d.ts +0 -2
- package/public-api.d.ts +0 -7
package/extras/index.d.ts
CHANGED
|
@@ -1,5 +1,152 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { PipeTransform, InjectionToken, Provider, OnDestroy, EventEmitter } from '@angular/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
|
|
5
|
+
declare class CodeFromUrlPipe implements PipeTransform {
|
|
6
|
+
private readonly location;
|
|
7
|
+
private readonly loader;
|
|
8
|
+
transform(url: string): Observable<string>;
|
|
9
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CodeFromUrlPipe, never>;
|
|
10
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<CodeFromUrlPipe, "codeFromUrl", true>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare function isUrl(url: string): boolean;
|
|
14
|
+
interface GistOptions {
|
|
15
|
+
clientId: string;
|
|
16
|
+
clientSecret: string;
|
|
17
|
+
}
|
|
18
|
+
declare const NXT_GIST_OPTIONS: InjectionToken<GistOptions>;
|
|
19
|
+
declare function provideGistOptions(options: GistOptions): Provider[];
|
|
20
|
+
interface Owner {
|
|
21
|
+
login: string;
|
|
22
|
+
id: number;
|
|
23
|
+
node_id: string;
|
|
24
|
+
avatar_url: string;
|
|
25
|
+
gravatar_id: string;
|
|
26
|
+
url: string;
|
|
27
|
+
html_url: string;
|
|
28
|
+
followers_url: string;
|
|
29
|
+
following_url: string;
|
|
30
|
+
gists_url: string;
|
|
31
|
+
starred_url: string;
|
|
32
|
+
subscriptions_url: string;
|
|
33
|
+
organizations_url: string;
|
|
34
|
+
repos_url: string;
|
|
35
|
+
events_url: string;
|
|
36
|
+
received_events_url: string;
|
|
37
|
+
type: string;
|
|
38
|
+
site_admin: boolean;
|
|
39
|
+
}
|
|
40
|
+
interface User {
|
|
41
|
+
login: string;
|
|
42
|
+
id: number;
|
|
43
|
+
node_id: string;
|
|
44
|
+
avatar_url: string;
|
|
45
|
+
gravatar_id: string;
|
|
46
|
+
url: string;
|
|
47
|
+
html_url: string;
|
|
48
|
+
followers_url: string;
|
|
49
|
+
following_url: string;
|
|
50
|
+
gists_url: string;
|
|
51
|
+
starred_url: string;
|
|
52
|
+
subscriptions_url: string;
|
|
53
|
+
organizations_url: string;
|
|
54
|
+
repos_url: string;
|
|
55
|
+
events_url: string;
|
|
56
|
+
received_events_url: string;
|
|
57
|
+
type: string;
|
|
58
|
+
site_admin: boolean;
|
|
59
|
+
}
|
|
60
|
+
interface ChangeStatus {
|
|
61
|
+
total: number;
|
|
62
|
+
additions: number;
|
|
63
|
+
deletions: number;
|
|
64
|
+
}
|
|
65
|
+
interface History {
|
|
66
|
+
user: User;
|
|
67
|
+
version: string;
|
|
68
|
+
committed_at: Date;
|
|
69
|
+
change_status: ChangeStatus;
|
|
70
|
+
url: string;
|
|
71
|
+
}
|
|
72
|
+
interface GistFile {
|
|
73
|
+
filename: string;
|
|
74
|
+
type: string;
|
|
75
|
+
language: string;
|
|
76
|
+
raw_url: string;
|
|
77
|
+
size: number;
|
|
78
|
+
truncated: boolean;
|
|
79
|
+
content: string;
|
|
80
|
+
}
|
|
81
|
+
interface Files {
|
|
82
|
+
[fileName: string]: GistFile;
|
|
83
|
+
}
|
|
84
|
+
interface Gist {
|
|
85
|
+
url: string;
|
|
86
|
+
forks_url: string;
|
|
87
|
+
commits_url: string;
|
|
88
|
+
id: string;
|
|
89
|
+
node_id: string;
|
|
90
|
+
git_pull_url: string;
|
|
91
|
+
git_push_url: string;
|
|
92
|
+
html_url: string;
|
|
93
|
+
files: Files;
|
|
94
|
+
public: boolean;
|
|
95
|
+
created_at: Date;
|
|
96
|
+
updated_at: Date;
|
|
97
|
+
description: string;
|
|
98
|
+
comments: number;
|
|
99
|
+
user?: any;
|
|
100
|
+
comments_url: string;
|
|
101
|
+
owner: Owner;
|
|
102
|
+
forks: any[];
|
|
103
|
+
history: History[];
|
|
104
|
+
truncated: boolean;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
declare class CodeLoader {
|
|
108
|
+
private readonly http;
|
|
109
|
+
private readonly options;
|
|
110
|
+
/**
|
|
111
|
+
* Get plus code
|
|
112
|
+
*
|
|
113
|
+
* @param id Gist ID
|
|
114
|
+
*/
|
|
115
|
+
getCodeFromGist(id: string): Observable<Gist>;
|
|
116
|
+
/**
|
|
117
|
+
* Get code by URL
|
|
118
|
+
*
|
|
119
|
+
* @param url File raw link
|
|
120
|
+
*/
|
|
121
|
+
getCodeFromUrl(url: string): Observable<string>;
|
|
122
|
+
private fetchFile;
|
|
123
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<CodeLoader, never>;
|
|
124
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<CodeLoader>;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
declare class GistDirective implements OnDestroy {
|
|
128
|
+
private readonly loader;
|
|
129
|
+
private readonly pendingTasks;
|
|
130
|
+
private readonly cdRef;
|
|
131
|
+
private subscription?;
|
|
132
|
+
set gist(value: string);
|
|
133
|
+
gistLoad: EventEmitter<Gist>;
|
|
134
|
+
gistError: EventEmitter<any>;
|
|
135
|
+
ngOnDestroy(): void;
|
|
136
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GistDirective, never>;
|
|
137
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<GistDirective, "[nxtGist]", never, { "gist": { "alias": "nxtGist"; "required": false; }; }, { "gistLoad": "gistLoad"; "gistError": "gistError"; }, never, never, true, never>;
|
|
138
|
+
}
|
|
139
|
+
declare class GistFilePipe implements PipeTransform {
|
|
140
|
+
transform(gist?: Gist | null, fileName?: string | null): GistFile | undefined;
|
|
141
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GistFilePipe, never>;
|
|
142
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<GistFilePipe, "gistFile", true>;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
declare class HighlightExstrasModule {
|
|
146
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<HighlightExstrasModule, never>;
|
|
147
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<HighlightExstrasModule, never, [typeof GistDirective, typeof GistFilePipe, typeof CodeFromUrlPipe], [typeof GistDirective, typeof GistFilePipe, typeof CodeFromUrlPipe]>;
|
|
148
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<HighlightExstrasModule>;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
export { CodeFromUrlPipe, CodeLoader, GistDirective, GistFilePipe, HighlightExstrasModule, NXT_GIST_OPTIONS, isUrl, provideGistOptions };
|
|
152
|
+
export type { Gist, GistFile, GistOptions };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable, Pipe, PendingTasks, ChangeDetectorRef, EventEmitter,
|
|
3
|
-
import {
|
|
2
|
+
import { InjectionToken, inject, DOCUMENT, Injectable, Pipe, PendingTasks, ChangeDetectorRef, EventEmitter, Output, Input, Directive, NgModule } from '@angular/core';
|
|
3
|
+
import { APP_BASE_HREF } from '@angular/common';
|
|
4
4
|
import { HttpClient, HttpParams } from '@angular/common/http';
|
|
5
5
|
import { shareReplay, EMPTY } from 'rxjs';
|
|
6
6
|
|
|
@@ -79,10 +79,10 @@ class CodeLoader {
|
|
|
79
79
|
}
|
|
80
80
|
return EMPTY;
|
|
81
81
|
}
|
|
82
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
83
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
82
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: CodeLoader, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
83
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: CodeLoader, providedIn: 'root' }); }
|
|
84
84
|
}
|
|
85
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
85
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: CodeLoader, decorators: [{
|
|
86
86
|
type: Injectable,
|
|
87
87
|
args: [{
|
|
88
88
|
providedIn: 'root'
|
|
@@ -97,10 +97,10 @@ class CodeFromUrlPipe {
|
|
|
97
97
|
transform(url) {
|
|
98
98
|
return this.loader.getCodeFromUrl(isUrl(url) ? url : this.location.formatPathname(url));
|
|
99
99
|
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
101
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
100
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: CodeFromUrlPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
101
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.0.5", ngImport: i0, type: CodeFromUrlPipe, isStandalone: true, name: "codeFromUrl" }); }
|
|
102
102
|
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
103
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: CodeFromUrlPipe, decorators: [{
|
|
104
104
|
type: Pipe,
|
|
105
105
|
args: [{
|
|
106
106
|
name: 'codeFromUrl'
|
|
@@ -138,10 +138,10 @@ class GistDirective {
|
|
|
138
138
|
this.subscription?.unsubscribe();
|
|
139
139
|
this.subscription = undefined;
|
|
140
140
|
}
|
|
141
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
142
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
141
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: GistDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
142
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.5", type: GistDirective, isStandalone: true, selector: "[nxtGist]", inputs: { gist: ["nxtGist", "gist"] }, outputs: { gistLoad: "gistLoad", gistError: "gistError" }, ngImport: i0 }); }
|
|
143
143
|
}
|
|
144
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
144
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: GistDirective, decorators: [{
|
|
145
145
|
type: Directive,
|
|
146
146
|
args: [{
|
|
147
147
|
selector: '[nxtGist]'
|
|
@@ -160,10 +160,10 @@ class GistFilePipe {
|
|
|
160
160
|
return;
|
|
161
161
|
return gist?.files?.[fileName];
|
|
162
162
|
}
|
|
163
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
164
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "
|
|
163
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: GistFilePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
164
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.0.5", ngImport: i0, type: GistFilePipe, isStandalone: true, name: "gistFile" }); }
|
|
165
165
|
}
|
|
166
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
166
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: GistFilePipe, decorators: [{
|
|
167
167
|
type: Pipe,
|
|
168
168
|
args: [{
|
|
169
169
|
name: 'gistFile'
|
|
@@ -171,15 +171,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImpor
|
|
|
171
171
|
}] });
|
|
172
172
|
|
|
173
173
|
class HighlightExstrasModule {
|
|
174
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
175
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "
|
|
174
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: HighlightExstrasModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
175
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.0.5", ngImport: i0, type: HighlightExstrasModule, imports: [GistDirective,
|
|
176
176
|
GistFilePipe,
|
|
177
177
|
CodeFromUrlPipe], exports: [GistDirective,
|
|
178
178
|
GistFilePipe,
|
|
179
179
|
CodeFromUrlPipe] }); }
|
|
180
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "
|
|
180
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: HighlightExstrasModule }); }
|
|
181
181
|
}
|
|
182
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
182
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: HighlightExstrasModule, decorators: [{
|
|
183
183
|
type: NgModule,
|
|
184
184
|
args: [{
|
|
185
185
|
imports: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nxt-highlightjs-extras.mjs","sources":["../../../packages/highlightjs/extras/src/code-file-location.ts","../../../packages/highlightjs/extras/src/gist.model.ts","../../../packages/highlightjs/extras/src/code-loader.ts","../../../packages/highlightjs/extras/src/code-from-url.ts","../../../packages/highlightjs/extras/src/gist.ts","../../../packages/highlightjs/extras/src/highlight-extras.module.ts","../../../packages/highlightjs/extras/src/nxt-highlightjs-extras.ts"],"sourcesContent":["import { APP_BASE_HREF, DOCUMENT } from '@angular/common'\r\nimport { inject, InjectionToken } from '@angular/core'\r\n\r\n/**\r\n * Injection token used to provide the current location to `codeFromUrl` pipe.\r\n * Used to handle server-side rendering and to stub out during unit tests.\r\n */\r\nexport const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken<CodeFileLocation>('NXT_HIGHLIGHT_FILE_LOCATION', {\r\n providedIn: 'root',\r\n factory: CODE_FILE_LOCATION_FACTORY\r\n})\r\n\r\nexport interface CodeFileLocation {\r\n formatPathname: (path: string) => string\r\n}\r\n\r\nexport function CODE_FILE_LOCATION_FACTORY() {\r\n const location = inject(DOCUMENT)?.location\r\n const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\\/+$/igm, '')\r\n\r\n return {\r\n // Note that this needs to be a function, rather than a property, because Angular\r\n // will only resolve it once, but we want the current path on each call.\r\n // getPathname: () => (location ? location.pathname + location.search : ''),\r\n formatPathname: (path: string) => {\r\n const origin = (location ? location.origin : '').replace(/\\/+$/igm, '')\r\n if (path.startsWith('/'))\r\n return origin + path\r\n\r\n let prefix = base ?? origin\r\n if (prefix)\r\n prefix += '/'\r\n\r\n return prefix + path\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core'\r\n\r\nexport function isUrl(url: string): boolean {\r\n const regExp: RegExp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!]))?/\r\n return regExp.test(url)\r\n}\r\n\r\nexport interface GistOptions {\r\n clientId: string\r\n clientSecret: string\r\n}\r\n\r\nexport const NXT_GIST_OPTIONS = new InjectionToken<GistOptions>('NXT_GIST_OPTIONS')\r\n\r\nexport function provideGistOptions(options: GistOptions): Provider[] {\r\n return [\r\n {\r\n provide: NXT_GIST_OPTIONS,\r\n useValue: options\r\n }\r\n ]\r\n}\r\n\r\ninterface Owner {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface User {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface ChangeStatus {\r\n total: number\r\n additions: number\r\n deletions: number\r\n}\r\n\r\ninterface History {\r\n user: User\r\n version: string\r\n committed_at: Date\r\n change_status: ChangeStatus\r\n url: string\r\n}\r\n\r\nexport interface GistFile {\r\n filename: string\r\n type: string\r\n language: string\r\n raw_url: string\r\n size: number\r\n truncated: boolean\r\n content: string\r\n}\r\n\r\ninterface Files {\r\n [fileName: string]: GistFile\r\n}\r\n\r\nexport interface Gist {\r\n url: string\r\n forks_url: string\r\n commits_url: string\r\n id: string\r\n node_id: string\r\n git_pull_url: string\r\n git_push_url: string\r\n html_url: string\r\n files: Files\r\n public: boolean\r\n created_at: Date\r\n updated_at: Date\r\n description: string\r\n comments: number\r\n user?: any\r\n comments_url: string\r\n owner: Owner\r\n forks: any[]\r\n history: History[]\r\n truncated: boolean\r\n}\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http'\r\nimport { inject, Injectable } from '@angular/core'\r\nimport { EMPTY, Observable, shareReplay } from 'rxjs'\r\nimport { Gist, isUrl, NXT_GIST_OPTIONS } from './gist.model'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CodeLoader {\r\n\r\n private readonly http = inject(HttpClient)\r\n private readonly options = inject(NXT_GIST_OPTIONS, { optional: true })\r\n\r\n /**\r\n * Get plus code\r\n *\r\n * @param id Gist ID\r\n */\r\n getCodeFromGist(id: string): Observable<Gist> {\r\n let params: HttpParams | undefined\r\n if (this.options?.clientId && this.options?.clientSecret) {\r\n params = new HttpParams().set('client_id', this.options.clientId).set('client_secret', this.options.clientSecret)\r\n }\r\n return this.fetchFile(`https://api.github.com/gists/${id}`, { params, responseType: 'json' })\r\n }\r\n\r\n /**\r\n * Get code by URL\r\n *\r\n * @param url File raw link\r\n */\r\n getCodeFromUrl(url: string): Observable<string> {\r\n return this.fetchFile(url, { responseType: 'text' })\r\n }\r\n\r\n private fetchFile(url: string, options: any): Observable<any> {\r\n // Check if URL is valid\r\n if (isUrl(url)) {\r\n return this.http.get(url, options).pipe(\r\n // Catch response\r\n shareReplay(1)\r\n )\r\n }\r\n return EMPTY\r\n }\r\n\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core'\r\nimport { Observable } from 'rxjs'\r\nimport { NXT_HIGHLIGHT_FILE_LOCATION } from './code-file-location'\r\nimport { CodeLoader } from './code-loader'\r\nimport { isUrl } from './gist.model'\r\n\r\n@Pipe({\r\n name: 'codeFromUrl'\r\n})\r\nexport class CodeFromUrlPipe implements PipeTransform {\r\n\r\n private readonly location = inject(NXT_HIGHLIGHT_FILE_LOCATION)\r\n private readonly loader = inject(CodeLoader)\r\n\r\n transform(url: string): Observable<string> {\r\n return this.loader.getCodeFromUrl(isUrl(url) ? url : this.location.formatPathname(url))\r\n }\r\n}\r\n","import { ChangeDetectorRef, Directive, EventEmitter, inject, Input, OnDestroy, Output, PendingTasks, Pipe, PipeTransform } from '@angular/core'\r\nimport { Subscription } from 'rxjs'\r\nimport { CodeLoader } from './code-loader'\r\nimport { Gist, GistFile } from './gist.model'\r\n\r\n@Directive({\r\n selector: '[nxtGist]'\r\n})\r\nexport class GistDirective implements OnDestroy {\r\n\r\n private readonly loader = inject(CodeLoader)\r\n private readonly pendingTasks = inject(PendingTasks)\r\n private readonly cdRef = inject(ChangeDetectorRef)\r\n private subscription?: Subscription\r\n\r\n @Input('nxtGist')\r\n set gist(value: string) {\r\n this.subscription?.unsubscribe()\r\n this.subscription = undefined\r\n\r\n if (value) {\r\n const done = this.pendingTasks.add()\r\n this.subscription = this.loader.getCodeFromGist(value).subscribe({\r\n next: (gist: Gist) => {\r\n this.gistLoad.emit(gist)\r\n this.cdRef.detectChanges()\r\n done()\r\n },\r\n error: (err) => {\r\n this.gistError.emit(err)\r\n this.cdRef.detectChanges()\r\n done()\r\n }\r\n })\r\n }\r\n }\r\n\r\n @Output() gistLoad: EventEmitter<Gist> = new EventEmitter<Gist>()\r\n\r\n @Output() gistError: EventEmitter<any> = new EventEmitter<any>()\r\n\r\n ngOnDestroy(): void {\r\n this.subscription?.unsubscribe()\r\n this.subscription = undefined\r\n }\r\n}\r\n\r\n@Pipe({\r\n name: 'gistFile'\r\n})\r\nexport class GistFilePipe implements PipeTransform {\r\n transform(gist?: Gist | null, fileName?: string | null): GistFile | undefined {\r\n if (!fileName)\r\n return\r\n return gist?.files?.[fileName]\r\n }\r\n}\r\n","import { NgModule } from '@angular/core'\r\nimport { CodeFromUrlPipe } from './code-from-url'\r\nimport { GistDirective, GistFilePipe } from './gist'\r\n\r\n@NgModule({\r\n imports: [\r\n GistDirective,\r\n GistFilePipe,\r\n CodeFromUrlPipe\r\n ],\r\n exports: [\r\n GistDirective,\r\n GistFilePipe,\r\n CodeFromUrlPipe\r\n ]\r\n})\r\nexport class HighlightExstrasModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nxt-highlightjs-extras.mjs","sources":["../../../packages/highlightjs/extras/src/code-file-location.ts","../../../packages/highlightjs/extras/src/gist.model.ts","../../../packages/highlightjs/extras/src/code-loader.ts","../../../packages/highlightjs/extras/src/code-from-url.ts","../../../packages/highlightjs/extras/src/gist.ts","../../../packages/highlightjs/extras/src/highlight-extras.module.ts","../../../packages/highlightjs/extras/src/nxt-highlightjs-extras.ts"],"sourcesContent":["import { APP_BASE_HREF } from '@angular/common'\r\nimport { inject, InjectionToken, DOCUMENT } from '@angular/core'\r\n\r\n/**\r\n * Injection token used to provide the current location to `codeFromUrl` pipe.\r\n * Used to handle server-side rendering and to stub out during unit tests.\r\n */\r\nexport const NXT_HIGHLIGHT_FILE_LOCATION = new InjectionToken<CodeFileLocation>('NXT_HIGHLIGHT_FILE_LOCATION', {\r\n providedIn: 'root',\r\n factory: CODE_FILE_LOCATION_FACTORY\r\n})\r\n\r\nexport interface CodeFileLocation {\r\n formatPathname: (path: string) => string\r\n}\r\n\r\nexport function CODE_FILE_LOCATION_FACTORY() {\r\n const location = inject(DOCUMENT)?.location\r\n const base = inject(APP_BASE_HREF, { optional: true })?.replace(/\\/+$/igm, '')\r\n\r\n return {\r\n // Note that this needs to be a function, rather than a property, because Angular\r\n // will only resolve it once, but we want the current path on each call.\r\n // getPathname: () => (location ? location.pathname + location.search : ''),\r\n formatPathname: (path: string) => {\r\n const origin = (location ? location.origin : '').replace(/\\/+$/igm, '')\r\n if (path.startsWith('/'))\r\n return origin + path\r\n\r\n let prefix = base ?? origin\r\n if (prefix)\r\n prefix += '/'\r\n\r\n return prefix + path\r\n }\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core'\r\n\r\nexport function isUrl(url: string): boolean {\r\n const regExp: RegExp = /(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!]))?/\r\n return regExp.test(url)\r\n}\r\n\r\nexport interface GistOptions {\r\n clientId: string\r\n clientSecret: string\r\n}\r\n\r\nexport const NXT_GIST_OPTIONS = new InjectionToken<GistOptions>('NXT_GIST_OPTIONS')\r\n\r\nexport function provideGistOptions(options: GistOptions): Provider[] {\r\n return [\r\n {\r\n provide: NXT_GIST_OPTIONS,\r\n useValue: options\r\n }\r\n ]\r\n}\r\n\r\ninterface Owner {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface User {\r\n login: string\r\n id: number\r\n node_id: string\r\n avatar_url: string\r\n gravatar_id: string\r\n url: string\r\n html_url: string\r\n followers_url: string\r\n following_url: string\r\n gists_url: string\r\n starred_url: string\r\n subscriptions_url: string\r\n organizations_url: string\r\n repos_url: string\r\n events_url: string\r\n received_events_url: string\r\n type: string\r\n site_admin: boolean\r\n}\r\n\r\ninterface ChangeStatus {\r\n total: number\r\n additions: number\r\n deletions: number\r\n}\r\n\r\ninterface History {\r\n user: User\r\n version: string\r\n committed_at: Date\r\n change_status: ChangeStatus\r\n url: string\r\n}\r\n\r\nexport interface GistFile {\r\n filename: string\r\n type: string\r\n language: string\r\n raw_url: string\r\n size: number\r\n truncated: boolean\r\n content: string\r\n}\r\n\r\ninterface Files {\r\n [fileName: string]: GistFile\r\n}\r\n\r\nexport interface Gist {\r\n url: string\r\n forks_url: string\r\n commits_url: string\r\n id: string\r\n node_id: string\r\n git_pull_url: string\r\n git_push_url: string\r\n html_url: string\r\n files: Files\r\n public: boolean\r\n created_at: Date\r\n updated_at: Date\r\n description: string\r\n comments: number\r\n user?: any\r\n comments_url: string\r\n owner: Owner\r\n forks: any[]\r\n history: History[]\r\n truncated: boolean\r\n}\r\n\r\n","import { HttpClient, HttpParams } from '@angular/common/http'\r\nimport { inject, Injectable } from '@angular/core'\r\nimport { EMPTY, Observable, shareReplay } from 'rxjs'\r\nimport { Gist, isUrl, NXT_GIST_OPTIONS } from './gist.model'\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class CodeLoader {\r\n\r\n private readonly http = inject(HttpClient)\r\n private readonly options = inject(NXT_GIST_OPTIONS, { optional: true })\r\n\r\n /**\r\n * Get plus code\r\n *\r\n * @param id Gist ID\r\n */\r\n getCodeFromGist(id: string): Observable<Gist> {\r\n let params: HttpParams | undefined\r\n if (this.options?.clientId && this.options?.clientSecret) {\r\n params = new HttpParams().set('client_id', this.options.clientId).set('client_secret', this.options.clientSecret)\r\n }\r\n return this.fetchFile(`https://api.github.com/gists/${id}`, { params, responseType: 'json' })\r\n }\r\n\r\n /**\r\n * Get code by URL\r\n *\r\n * @param url File raw link\r\n */\r\n getCodeFromUrl(url: string): Observable<string> {\r\n return this.fetchFile(url, { responseType: 'text' })\r\n }\r\n\r\n private fetchFile(url: string, options: any): Observable<any> {\r\n // Check if URL is valid\r\n if (isUrl(url)) {\r\n return this.http.get(url, options).pipe(\r\n // Catch response\r\n shareReplay(1)\r\n )\r\n }\r\n return EMPTY\r\n }\r\n\r\n}\r\n","import { inject, Pipe, PipeTransform } from '@angular/core'\r\nimport { Observable } from 'rxjs'\r\nimport { NXT_HIGHLIGHT_FILE_LOCATION } from './code-file-location'\r\nimport { CodeLoader } from './code-loader'\r\nimport { isUrl } from './gist.model'\r\n\r\n@Pipe({\r\n name: 'codeFromUrl'\r\n})\r\nexport class CodeFromUrlPipe implements PipeTransform {\r\n\r\n private readonly location = inject(NXT_HIGHLIGHT_FILE_LOCATION)\r\n private readonly loader = inject(CodeLoader)\r\n\r\n transform(url: string): Observable<string> {\r\n return this.loader.getCodeFromUrl(isUrl(url) ? url : this.location.formatPathname(url))\r\n }\r\n}\r\n","import { ChangeDetectorRef, Directive, EventEmitter, inject, Input, OnDestroy, Output, PendingTasks, Pipe, PipeTransform } from '@angular/core'\r\nimport { Subscription } from 'rxjs'\r\nimport { CodeLoader } from './code-loader'\r\nimport { Gist, GistFile } from './gist.model'\r\n\r\n@Directive({\r\n selector: '[nxtGist]'\r\n})\r\nexport class GistDirective implements OnDestroy {\r\n\r\n private readonly loader = inject(CodeLoader)\r\n private readonly pendingTasks = inject(PendingTasks)\r\n private readonly cdRef = inject(ChangeDetectorRef)\r\n private subscription?: Subscription\r\n\r\n @Input('nxtGist')\r\n set gist(value: string) {\r\n this.subscription?.unsubscribe()\r\n this.subscription = undefined\r\n\r\n if (value) {\r\n const done = this.pendingTasks.add()\r\n this.subscription = this.loader.getCodeFromGist(value).subscribe({\r\n next: (gist: Gist) => {\r\n this.gistLoad.emit(gist)\r\n this.cdRef.detectChanges()\r\n done()\r\n },\r\n error: (err) => {\r\n this.gistError.emit(err)\r\n this.cdRef.detectChanges()\r\n done()\r\n }\r\n })\r\n }\r\n }\r\n\r\n @Output() gistLoad: EventEmitter<Gist> = new EventEmitter<Gist>()\r\n\r\n @Output() gistError: EventEmitter<any> = new EventEmitter<any>()\r\n\r\n ngOnDestroy(): void {\r\n this.subscription?.unsubscribe()\r\n this.subscription = undefined\r\n }\r\n}\r\n\r\n@Pipe({\r\n name: 'gistFile'\r\n})\r\nexport class GistFilePipe implements PipeTransform {\r\n transform(gist?: Gist | null, fileName?: string | null): GistFile | undefined {\r\n if (!fileName)\r\n return\r\n return gist?.files?.[fileName]\r\n }\r\n}\r\n","import { NgModule } from '@angular/core'\r\nimport { CodeFromUrlPipe } from './code-from-url'\r\nimport { GistDirective, GistFilePipe } from './gist'\r\n\r\n@NgModule({\r\n imports: [\r\n GistDirective,\r\n GistFilePipe,\r\n CodeFromUrlPipe\r\n ],\r\n exports: [\r\n GistDirective,\r\n GistFilePipe,\r\n CodeFromUrlPipe\r\n ]\r\n})\r\nexport class HighlightExstrasModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -2,47 +2,6 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { inject, ElementRef, input, numberAttribute, booleanAttribute, effect, Directive } from '@angular/core';
|
|
3
3
|
import { NXT_HIGHLIGHT_OPTIONS, HighlightJS, HighlightBase } from 'nxt-highlightjs';
|
|
4
4
|
|
|
5
|
-
class HighlightLineNumbersDirective {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.options = inject(NXT_HIGHLIGHT_OPTIONS)?.lineNumbersOptions;
|
|
8
|
-
this.hljs = inject(HighlightJS);
|
|
9
|
-
this.highlight = inject(HighlightBase);
|
|
10
|
-
this.nativeElement = inject((ElementRef)).nativeElement;
|
|
11
|
-
this.startFrom = input(this.options?.startFrom, {
|
|
12
|
-
transform: numberAttribute
|
|
13
|
-
});
|
|
14
|
-
this.singleLine = input(this.options?.singleLine, {
|
|
15
|
-
transform: booleanAttribute
|
|
16
|
-
});
|
|
17
|
-
effect(() => {
|
|
18
|
-
const hljs = this.hljs.hljs();
|
|
19
|
-
if (this.highlight.highlightResult()) {
|
|
20
|
-
if (hljs.lineNumbersBlock) {
|
|
21
|
-
hljs.lineNumbersBlock(this.nativeElement, {
|
|
22
|
-
startFrom: this.startFrom(),
|
|
23
|
-
singleLine: this.singleLine()
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
// If lines count is 1, the line numbers library will not add numbers
|
|
27
|
-
if (this.nativeElement.firstElementChild?.tagName.toUpperCase() === 'TABLE') {
|
|
28
|
-
this.nativeElement.classList.add('hljs-line-numbers');
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
this.nativeElement.classList.remove('hljs-line-numbers');
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: HighlightLineNumbersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
37
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.1.3", type: HighlightLineNumbersDirective, isStandalone: true, selector: "[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]", inputs: { startFrom: { classPropertyName: "startFrom", publicName: "startFrom", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
38
|
-
}
|
|
39
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.3", ngImport: i0, type: HighlightLineNumbersDirective, decorators: [{
|
|
40
|
-
type: Directive,
|
|
41
|
-
args: [{
|
|
42
|
-
selector: '[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]'
|
|
43
|
-
}]
|
|
44
|
-
}], ctorParameters: () => [] });
|
|
45
|
-
|
|
46
5
|
function activateLineNumbers(document) {
|
|
47
6
|
const TABLE_NAME = 'hljs-ln';
|
|
48
7
|
const LINE_NAME = 'hljs-ln-line';
|
|
@@ -161,15 +120,12 @@ function activateLineNumbers(document) {
|
|
|
161
120
|
]);
|
|
162
121
|
document.getElementsByTagName('head')[0].appendChild(css);
|
|
163
122
|
}
|
|
164
|
-
function lineNumbersBlock(
|
|
165
|
-
|
|
166
|
-
return;
|
|
167
|
-
element.innerHTML = lineNumbersInternal(element, options);
|
|
123
|
+
function lineNumbersBlock(code, options) {
|
|
124
|
+
return lineNumbersInternal(code, options);
|
|
168
125
|
}
|
|
169
|
-
function lineNumbersInternal(
|
|
170
|
-
const internalOptions = mapOptions(
|
|
171
|
-
|
|
172
|
-
return addLineNumbersBlockFor(element.innerHTML, internalOptions);
|
|
126
|
+
function lineNumbersInternal(code, options) {
|
|
127
|
+
const internalOptions = mapOptions(options);
|
|
128
|
+
return addLineNumbersBlockFor(code, internalOptions);
|
|
173
129
|
}
|
|
174
130
|
function addLineNumbersBlockFor(inputHtml, options) {
|
|
175
131
|
const lines = getLines(inputHtml);
|
|
@@ -206,11 +162,11 @@ function activateLineNumbers(document) {
|
|
|
206
162
|
* @param options External API options.
|
|
207
163
|
* @returns Internal API options.
|
|
208
164
|
*/
|
|
209
|
-
function mapOptions(
|
|
165
|
+
function mapOptions(options) {
|
|
210
166
|
options = options || {};
|
|
211
167
|
return {
|
|
212
168
|
singleLine: getSingleLineOption(options),
|
|
213
|
-
startFrom: getStartFromOption(
|
|
169
|
+
startFrom: getStartFromOption(options)
|
|
214
170
|
};
|
|
215
171
|
}
|
|
216
172
|
function getSingleLineOption(options) {
|
|
@@ -220,55 +176,19 @@ function activateLineNumbers(document) {
|
|
|
220
176
|
}
|
|
221
177
|
return defaultValue;
|
|
222
178
|
}
|
|
223
|
-
function getStartFromOption(
|
|
179
|
+
function getStartFromOption(options) {
|
|
224
180
|
const defaultValue = 1;
|
|
225
181
|
let startFrom = defaultValue;
|
|
226
182
|
if (isFinite(options?.startFrom ?? NaN)) {
|
|
227
183
|
startFrom = options.startFrom;
|
|
228
184
|
}
|
|
229
|
-
// can be overridden because local option is priority
|
|
230
|
-
const value = getAttribute(element, 'data-ln-start-from');
|
|
231
|
-
if (value !== null) {
|
|
232
|
-
startFrom = toNumber(value, defaultValue);
|
|
233
|
-
}
|
|
234
185
|
return startFrom;
|
|
235
186
|
}
|
|
236
|
-
/**
|
|
237
|
-
* Recursive method for fix multi-line elements implementation in highlight.js
|
|
238
|
-
* Doing deep passage on child nodes.
|
|
239
|
-
*
|
|
240
|
-
* @param element
|
|
241
|
-
*/
|
|
242
|
-
function duplicateMultilineNodes(element) {
|
|
243
|
-
if (getLinesCount(element.textContent) > 0) {
|
|
244
|
-
element.childNodes.forEach(child => duplicateMultilineNodes(child));
|
|
245
|
-
duplicateMultilineNode(element);
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
/**
|
|
249
|
-
* Method for fix multi-line elements implementation in highlight.js
|
|
250
|
-
*
|
|
251
|
-
* @param element
|
|
252
|
-
*/
|
|
253
|
-
function duplicateMultilineNode(element) {
|
|
254
|
-
if (element?.tagName?.toUpperCase() !== 'SPAN')
|
|
255
|
-
return;
|
|
256
|
-
const className = element.className;
|
|
257
|
-
const lines = getLines(element.innerHTML);
|
|
258
|
-
const result = lines.map(line => {
|
|
259
|
-
const lineText = line.length > 0 ? line : ' ';
|
|
260
|
-
return format('<span class="{0}">{1}</span>', [className, lineText]);
|
|
261
|
-
}).join('\n');
|
|
262
|
-
element.outerHTML = result;
|
|
263
|
-
}
|
|
264
187
|
function getLines(text) {
|
|
265
188
|
if (text.length === 0)
|
|
266
189
|
return [];
|
|
267
190
|
return text.split(BREAK_LINE_REGEXP);
|
|
268
191
|
}
|
|
269
|
-
function getLinesCount(text) {
|
|
270
|
-
return (text?.trim().match(BREAK_LINE_REGEXP) || []).length;
|
|
271
|
-
}
|
|
272
192
|
///
|
|
273
193
|
/// HELPERS
|
|
274
194
|
///
|
|
@@ -281,28 +201,52 @@ function activateLineNumbers(document) {
|
|
|
281
201
|
function format(formatString, args) {
|
|
282
202
|
return formatString.replace(/\{(\d+)\}/g, (m, n) => args[n] !== null && args[n] !== undefined ? args[n] : m);
|
|
283
203
|
}
|
|
284
|
-
/**
|
|
285
|
-
* @param element Code block.
|
|
286
|
-
* @param attrName Attribute name.
|
|
287
|
-
* @returns Attribute value or empty.
|
|
288
|
-
*/
|
|
289
|
-
function getAttribute(element, attrName) {
|
|
290
|
-
return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null;
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* @param str Source string.
|
|
294
|
-
* @param fallback Fallback value.
|
|
295
|
-
* @returns Parsed number or fallback value.
|
|
296
|
-
*/
|
|
297
|
-
function toNumber(str, fallback) {
|
|
298
|
-
if (!str)
|
|
299
|
-
return fallback;
|
|
300
|
-
const number = Number(str);
|
|
301
|
-
return isFinite(number) ? number : fallback;
|
|
302
|
-
}
|
|
303
204
|
return lineNumbersBlock;
|
|
304
205
|
}
|
|
305
206
|
|
|
207
|
+
class HighlightLineNumbersDirective {
|
|
208
|
+
constructor() {
|
|
209
|
+
this.options = inject(NXT_HIGHLIGHT_OPTIONS)?.lineNumbersOptions;
|
|
210
|
+
this.hljs = inject(HighlightJS);
|
|
211
|
+
this.highlight = inject(HighlightBase);
|
|
212
|
+
this.nativeElement = inject((ElementRef)).nativeElement;
|
|
213
|
+
this.startFrom = input(this.options?.startFrom, {
|
|
214
|
+
transform: numberAttribute
|
|
215
|
+
});
|
|
216
|
+
this.singleLine = input(this.options?.singleLine, {
|
|
217
|
+
transform: booleanAttribute
|
|
218
|
+
});
|
|
219
|
+
effect(() => {
|
|
220
|
+
const hljs = this.hljs.hljs();
|
|
221
|
+
const result = this.highlight.highlightResult();
|
|
222
|
+
if (result?.value) {
|
|
223
|
+
if (hljs.lineNumbersBlock) {
|
|
224
|
+
const code = hljs.lineNumbersBlock(result.value, {
|
|
225
|
+
startFrom: this.startFrom(),
|
|
226
|
+
singleLine: this.singleLine()
|
|
227
|
+
});
|
|
228
|
+
this.nativeElement.innerHTML = code;
|
|
229
|
+
}
|
|
230
|
+
// If lines count is 1, the line numbers library will not add numbers
|
|
231
|
+
if (this.nativeElement.firstElementChild?.tagName.toUpperCase() === 'TABLE') {
|
|
232
|
+
this.nativeElement.classList.add('hljs-line-numbers');
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
this.nativeElement.classList.remove('hljs-line-numbers');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: HighlightLineNumbersDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
241
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.5", type: HighlightLineNumbersDirective, isStandalone: true, selector: "[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]", inputs: { startFrom: { classPropertyName: "startFrom", publicName: "startFrom", isSignal: true, isRequired: false, transformFunction: null }, singleLine: { classPropertyName: "singleLine", publicName: "singleLine", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 }); }
|
|
242
|
+
}
|
|
243
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.5", ngImport: i0, type: HighlightLineNumbersDirective, decorators: [{
|
|
244
|
+
type: Directive,
|
|
245
|
+
args: [{
|
|
246
|
+
selector: '[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]'
|
|
247
|
+
}]
|
|
248
|
+
}], ctorParameters: () => [] });
|
|
249
|
+
|
|
306
250
|
/**
|
|
307
251
|
* Generated bundle index. Do not edit.
|
|
308
252
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nxt-highlightjs-line-numbers.mjs","sources":["../../../packages/highlightjs/line-numbers/src/line-numbers.ts","../../../packages/highlightjs/line-numbers/src/line-numbers-lib.ts","../../../packages/highlightjs/line-numbers/src/nxt-highlightjs-line-numbers.ts"],"sourcesContent":["import {\r\n Directive,\r\n ElementRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n numberAttribute\r\n} from '@angular/core'\r\nimport { HighlightBase, HighlightJS, NXT_HIGHLIGHT_OPTIONS } from 'nxt-highlightjs'\r\n\r\n@Directive({\r\n selector: '[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]'\r\n})\r\nexport class HighlightLineNumbersDirective {\r\n\r\n private readonly options = inject(NXT_HIGHLIGHT_OPTIONS)?.lineNumbersOptions\r\n private readonly hljs = inject(HighlightJS)\r\n private readonly highlight = inject(HighlightBase)\r\n private readonly nativeElement = inject(ElementRef<HTMLElement>).nativeElement\r\n\r\n readonly startFrom = input(this.options?.startFrom, {\r\n transform: numberAttribute\r\n })\r\n\r\n readonly singleLine = input(this.options?.singleLine, {\r\n transform: booleanAttribute\r\n })\r\n\r\n constructor() {\r\n effect(() => {\r\n const hljs = this.hljs.hljs()\r\n if (this.highlight.highlightResult()) {\r\n if ((hljs as any).lineNumbersBlock) {\r\n (hljs as any).lineNumbersBlock(this.nativeElement, {\r\n startFrom: this.startFrom(),\r\n singleLine: this.singleLine()\r\n })\r\n }\r\n // If lines count is 1, the line numbers library will not add numbers\r\n if (this.nativeElement.firstElementChild?.tagName.toUpperCase() === 'TABLE') {\r\n this.nativeElement.classList.add('hljs-line-numbers')\r\n } else {\r\n this.nativeElement.classList.remove('hljs-line-numbers')\r\n }\r\n }\r\n })\r\n }\r\n}\r\n","interface LineNumbersOptions {\r\n startFrom?: number\r\n singleLine?: boolean\r\n}\r\n\r\nexport function activateLineNumbers(document: Document) {\r\n const TABLE_NAME = 'hljs-ln'\r\n const LINE_NAME = 'hljs-ln-line'\r\n const CODE_BLOCK_NAME = 'hljs-ln-code'\r\n const NUMBERS_BLOCK_NAME = 'hljs-ln-numbers'\r\n const NUMBER_LINE_NAME = 'hljs-ln-n'\r\n const DATA_ATTR_NAME = 'data-line-number'\r\n const BREAK_LINE_REGEXP = /\\r\\n|\\r|\\n/g\r\n\r\n addStyles()\r\n\r\n function isHljsLnCodeDescendant(domElt?: HTMLElement | null) {\r\n let curElt = domElt\r\n while (curElt) {\r\n if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {\r\n return true\r\n }\r\n curElt = curElt.parentNode as HTMLElement\r\n }\r\n return false\r\n }\r\n\r\n function getHljsLnTable(hljsLnDomElt?: HTMLElement) {\r\n let curElt = hljsLnDomElt\r\n while (curElt && curElt.nodeName !== 'TABLE') {\r\n curElt = curElt.parentNode as HTMLElement\r\n }\r\n return curElt\r\n }\r\n\r\n // Function to workaround a copy issue with Microsoft Edge.\r\n // Due to hljs-ln wrapping the lines of code inside a <table> element,\r\n // itself wrapped inside a <pre> element, window.getSelection().toString()\r\n // does not contain any line breaks. So we need to get them back using the\r\n // rendered code in the DOM as reference.\r\n function edgeGetSelectedCodeLines(selection: Selection) {\r\n // current selected text without line breaks\r\n const selectionText = selection.toString()\r\n\r\n // get the <td> element wrapping the first line of selected code\r\n let tdAnchor = selection.anchorNode\r\n while (tdAnchor?.nodeName !== 'TD') {\r\n tdAnchor = tdAnchor?.parentNode || null\r\n }\r\n\r\n // get the <td> element wrapping the last line of selected code\r\n let tdFocus = selection.focusNode\r\n while (tdFocus?.nodeName !== 'TD') {\r\n tdFocus = tdFocus?.parentNode || null\r\n }\r\n\r\n // extract line numbers\r\n let firstLineNumber = parseInt((tdAnchor as HTMLElement | null)?.dataset['lineNumber'] || '0', 10)\r\n let lastLineNumber = parseInt((tdFocus as HTMLElement | null)?.dataset['lineNumber'] || '0', 10)\r\n\r\n // multi-lines copied case\r\n if (firstLineNumber != lastLineNumber) {\r\n\r\n let firstLineText = tdAnchor.textContent\r\n let lastLineText = tdFocus.textContent\r\n\r\n // if the selection was made backward, swap values\r\n if (firstLineNumber > lastLineNumber) {\r\n const tmp = firstLineNumber\r\n firstLineNumber = lastLineNumber\r\n lastLineNumber = tmp\r\n const tmp2 = firstLineText\r\n firstLineText = lastLineText\r\n lastLineText = tmp2\r\n }\r\n\r\n // discard not copied characters in first line\r\n while (selectionText.indexOf(firstLineText || '') !== 0) {\r\n firstLineText = firstLineText!.slice(1)\r\n }\r\n\r\n // discard not copied characters in last line\r\n while (selectionText.lastIndexOf(lastLineText || '') === -1) {\r\n lastLineText = lastLineText!.slice(0, -1)\r\n }\r\n\r\n // reconstruct and return the real copied text\r\n let selectedText = firstLineText\r\n const hljsLnTable = getHljsLnTable(tdAnchor as HTMLElement)\r\n for (let i = firstLineNumber + 1; i < lastLineNumber; ++i) {\r\n const codeLineSel = format('.{0}[{1}=\"{2}\"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i])\r\n const codeLineElt = hljsLnTable?.querySelector(codeLineSel)\r\n selectedText += '\\n' + (codeLineElt?.textContent || '')\r\n }\r\n selectedText += '\\n' + lastLineText\r\n return selectedText\r\n // single copied line case\r\n } else {\r\n return selectionText\r\n }\r\n }\r\n\r\n // ensure consistent code copy/paste behavior across all browsers\r\n // (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)\r\n document.addEventListener('copy', (e) => {\r\n // get current selection\r\n const selection = window.getSelection()\r\n // override behavior when one wants to copy line of codes\r\n if (isHljsLnCodeDescendant(selection?.anchorNode as HTMLElement | null | undefined)) {\r\n let selectionText: string | null | undefined\r\n // workaround an issue with Microsoft Edge as copied line breaks\r\n // are removed otherwise from the selection string\r\n if (window.navigator.userAgent.indexOf('Edge') !== -1 && selection) {\r\n selectionText = edgeGetSelectedCodeLines(selection)\r\n } else {\r\n // other browsers can directly use the selection string\r\n selectionText = selection?.toString()\r\n }\r\n if (selectionText) {\r\n e.clipboardData?.setData('text/plain', selectionText)\r\n e.preventDefault()\r\n }\r\n }\r\n })\r\n\r\n function addStyles() {\r\n const css = document.createElement('style')\r\n css.innerHTML = format(\r\n '.{0}{border-collapse:collapse}' +\r\n '.{0} td{padding:0}' +\r\n '.{1}:before{content:attr({2})}',\r\n [\r\n TABLE_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME\r\n ])\r\n document.getElementsByTagName('head')[0].appendChild(css)\r\n }\r\n\r\n function lineNumbersBlock(element: HTMLElement, options?: LineNumbersOptions) {\r\n if (typeof element !== 'object') return\r\n\r\n element.innerHTML = lineNumbersInternal(element, options)\r\n }\r\n\r\n function lineNumbersInternal(element: HTMLElement, options?: LineNumbersOptions) {\r\n\r\n const internalOptions = mapOptions(element, options)\r\n\r\n duplicateMultilineNodes(element)\r\n\r\n return addLineNumbersBlockFor(element.innerHTML, internalOptions)\r\n }\r\n\r\n function addLineNumbersBlockFor(inputHtml: string, options?: LineNumbersOptions) {\r\n const lines = getLines(inputHtml)\r\n\r\n // if last line contains only carriage return remove it\r\n if (lines[lines.length - 1].trim() === '') {\r\n lines.pop()\r\n }\r\n\r\n if (lines.length > 1 || options?.singleLine) {\r\n let html = ''\r\n\r\n for (let i = 0, l = lines.length; i < l; i++) {\r\n html += format(\r\n '<tr>' +\r\n '<td class=\"{0} {1}\" {3}=\"{5}\">' +\r\n '<div class=\"{2}\" {3}=\"{5}\"></div>' +\r\n '</td>' +\r\n '<td class=\"{0} {4}\" {3}=\"{5}\">' +\r\n '{6}' +\r\n '</td>' +\r\n '</tr>',\r\n [\r\n LINE_NAME,\r\n NUMBERS_BLOCK_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME,\r\n CODE_BLOCK_NAME,\r\n i + Number(!!(options?.startFrom)),\r\n lines[i].length > 0 ? lines[i] : ' '\r\n ])\r\n }\r\n\r\n return format('<table class=\"{0}\">{1}</table>', [TABLE_NAME, html])\r\n }\r\n\r\n return inputHtml\r\n }\r\n\r\n /**\r\n * @param element Code block.\r\n * @param options External API options.\r\n * @returns Internal API options.\r\n */\r\n function mapOptions(element: HTMLElement, options?: LineNumbersOptions) {\r\n options = options || {}\r\n return {\r\n singleLine: getSingleLineOption(options),\r\n startFrom: getStartFromOption(element, options)\r\n }\r\n }\r\n\r\n function getSingleLineOption(options?: LineNumbersOptions) {\r\n const defaultValue = false\r\n if (!!options?.singleLine) {\r\n return options.singleLine\r\n }\r\n return defaultValue\r\n }\r\n\r\n function getStartFromOption(element: HTMLElement, options?: LineNumbersOptions) {\r\n const defaultValue = 1\r\n let startFrom = defaultValue\r\n\r\n if (isFinite(options?.startFrom ?? NaN)) {\r\n startFrom = options!.startFrom!\r\n }\r\n\r\n // can be overridden because local option is priority\r\n const value = getAttribute(element, 'data-ln-start-from')\r\n if (value !== null) {\r\n startFrom = toNumber(value, defaultValue)\r\n }\r\n\r\n return startFrom\r\n }\r\n\r\n /**\r\n * Recursive method for fix multi-line elements implementation in highlight.js\r\n * Doing deep passage on child nodes.\r\n *\r\n * @param element\r\n */\r\n function duplicateMultilineNodes(element: HTMLElement) {\r\n if (getLinesCount(element.textContent) > 0) {\r\n element.childNodes.forEach(child => duplicateMultilineNodes(child as HTMLElement))\r\n duplicateMultilineNode(element as HTMLElement)\r\n }\r\n }\r\n\r\n /**\r\n * Method for fix multi-line elements implementation in highlight.js\r\n *\r\n * @param element\r\n */\r\n function duplicateMultilineNode(element: HTMLElement) {\r\n if (element?.tagName?.toUpperCase() !== 'SPAN') return\r\n\r\n const className = element.className\r\n\r\n const lines = getLines(element.innerHTML)\r\n\r\n const result = lines.map(line => {\r\n const lineText = line.length > 0 ? line : ' '\r\n return format('<span class=\"{0}\">{1}</span>', [className, lineText])\r\n }).join('\\n')\r\n\r\n element.outerHTML = result\r\n }\r\n\r\n function getLines(text: string) {\r\n if (text.length === 0) return []\r\n return text.split(BREAK_LINE_REGEXP)\r\n }\r\n\r\n function getLinesCount(text?: string | null) {\r\n return (text?.trim().match(BREAK_LINE_REGEXP) || []).length\r\n }\r\n\r\n ///\r\n /// HELPERS\r\n ///\r\n\r\n /**\r\n * {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}\r\n *\r\n * @param formatString\r\n * @param args\r\n */\r\n function format(formatString: string, args: any[]) {\r\n return formatString.replace(/\\{(\\d+)\\}/g, (m, n) => args[n] !== null && args[n] !== undefined ? args[n] : m)\r\n }\r\n\r\n /**\r\n * @param element Code block.\r\n * @param attrName Attribute name.\r\n * @returns Attribute value or empty.\r\n */\r\n function getAttribute(element: HTMLElement, attrName: string) {\r\n return element.hasAttribute(attrName) ? element.getAttribute(attrName) : null\r\n }\r\n\r\n /**\r\n * @param str Source string.\r\n * @param fallback Fallback value.\r\n * @returns Parsed number or fallback value.\r\n */\r\n function toNumber(str: string, fallback: number) {\r\n if (!str) return fallback\r\n const number = Number(str)\r\n return isFinite(number) ? number : fallback\r\n }\r\n\r\n return lineNumbersBlock\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nxt-highlightjs-line-numbers.mjs","sources":["../../../packages/highlightjs/line-numbers/src/line-numbers-lib.ts","../../../packages/highlightjs/line-numbers/src/line-numbers.directive.ts","../../../packages/highlightjs/line-numbers/src/nxt-highlightjs-line-numbers.ts"],"sourcesContent":["interface LineNumbersOptions {\r\n startFrom?: number\r\n singleLine?: boolean\r\n}\r\n\r\nexport function activateLineNumbers(document: Document) {\r\n const TABLE_NAME = 'hljs-ln'\r\n const LINE_NAME = 'hljs-ln-line'\r\n const CODE_BLOCK_NAME = 'hljs-ln-code'\r\n const NUMBERS_BLOCK_NAME = 'hljs-ln-numbers'\r\n const NUMBER_LINE_NAME = 'hljs-ln-n'\r\n const DATA_ATTR_NAME = 'data-line-number'\r\n const BREAK_LINE_REGEXP = /\\r\\n|\\r|\\n/g\r\n\r\n addStyles()\r\n\r\n function isHljsLnCodeDescendant(domElt?: HTMLElement | null) {\r\n let curElt = domElt\r\n while (curElt) {\r\n if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {\r\n return true\r\n }\r\n curElt = curElt.parentNode as HTMLElement\r\n }\r\n return false\r\n }\r\n\r\n function getHljsLnTable(hljsLnDomElt?: HTMLElement) {\r\n let curElt = hljsLnDomElt\r\n while (curElt && curElt.nodeName !== 'TABLE') {\r\n curElt = curElt.parentNode as HTMLElement\r\n }\r\n return curElt\r\n }\r\n\r\n // Function to workaround a copy issue with Microsoft Edge.\r\n // Due to hljs-ln wrapping the lines of code inside a <table> element,\r\n // itself wrapped inside a <pre> element, window.getSelection().toString()\r\n // does not contain any line breaks. So we need to get them back using the\r\n // rendered code in the DOM as reference.\r\n function edgeGetSelectedCodeLines(selection: Selection) {\r\n // current selected text without line breaks\r\n const selectionText = selection.toString()\r\n\r\n // get the <td> element wrapping the first line of selected code\r\n let tdAnchor = selection.anchorNode\r\n while (tdAnchor?.nodeName !== 'TD') {\r\n tdAnchor = tdAnchor?.parentNode || null\r\n }\r\n\r\n // get the <td> element wrapping the last line of selected code\r\n let tdFocus = selection.focusNode\r\n while (tdFocus?.nodeName !== 'TD') {\r\n tdFocus = tdFocus?.parentNode || null\r\n }\r\n\r\n // extract line numbers\r\n let firstLineNumber = parseInt((tdAnchor as HTMLElement | null)?.dataset['lineNumber'] || '0', 10)\r\n let lastLineNumber = parseInt((tdFocus as HTMLElement | null)?.dataset['lineNumber'] || '0', 10)\r\n\r\n // multi-lines copied case\r\n if (firstLineNumber != lastLineNumber) {\r\n\r\n let firstLineText = tdAnchor.textContent\r\n let lastLineText = tdFocus.textContent\r\n\r\n // if the selection was made backward, swap values\r\n if (firstLineNumber > lastLineNumber) {\r\n const tmp = firstLineNumber\r\n firstLineNumber = lastLineNumber\r\n lastLineNumber = tmp\r\n const tmp2 = firstLineText\r\n firstLineText = lastLineText\r\n lastLineText = tmp2\r\n }\r\n\r\n // discard not copied characters in first line\r\n while (selectionText.indexOf(firstLineText || '') !== 0) {\r\n firstLineText = firstLineText!.slice(1)\r\n }\r\n\r\n // discard not copied characters in last line\r\n while (selectionText.lastIndexOf(lastLineText || '') === -1) {\r\n lastLineText = lastLineText!.slice(0, -1)\r\n }\r\n\r\n // reconstruct and return the real copied text\r\n let selectedText = firstLineText\r\n const hljsLnTable = getHljsLnTable(tdAnchor as HTMLElement)\r\n for (let i = firstLineNumber + 1; i < lastLineNumber; ++i) {\r\n const codeLineSel = format('.{0}[{1}=\"{2}\"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i])\r\n const codeLineElt = hljsLnTable?.querySelector(codeLineSel)\r\n selectedText += '\\n' + (codeLineElt?.textContent || '')\r\n }\r\n selectedText += '\\n' + lastLineText\r\n return selectedText\r\n // single copied line case\r\n } else {\r\n return selectionText\r\n }\r\n }\r\n\r\n // ensure consistent code copy/paste behavior across all browsers\r\n // (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)\r\n document.addEventListener('copy', (e) => {\r\n // get current selection\r\n const selection = window.getSelection()\r\n // override behavior when one wants to copy line of codes\r\n if (isHljsLnCodeDescendant(selection?.anchorNode as HTMLElement | null | undefined)) {\r\n let selectionText: string | null | undefined\r\n // workaround an issue with Microsoft Edge as copied line breaks\r\n // are removed otherwise from the selection string\r\n if (window.navigator.userAgent.indexOf('Edge') !== -1 && selection) {\r\n selectionText = edgeGetSelectedCodeLines(selection)\r\n } else {\r\n // other browsers can directly use the selection string\r\n selectionText = selection?.toString()\r\n }\r\n if (selectionText) {\r\n e.clipboardData?.setData('text/plain', selectionText)\r\n e.preventDefault()\r\n }\r\n }\r\n })\r\n\r\n function addStyles() {\r\n const css = document.createElement('style')\r\n css.innerHTML = format(\r\n '.{0}{border-collapse:collapse}' +\r\n '.{0} td{padding:0}' +\r\n '.{1}:before{content:attr({2})}',\r\n [\r\n TABLE_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME\r\n ])\r\n document.getElementsByTagName('head')[0].appendChild(css)\r\n }\r\n\r\n function lineNumbersBlock(code: string, options?: LineNumbersOptions) {\r\n return lineNumbersInternal(code, options)\r\n }\r\n\r\n function lineNumbersInternal(code: string, options?: LineNumbersOptions) {\r\n\r\n const internalOptions = mapOptions(options)\r\n\r\n return addLineNumbersBlockFor(code, internalOptions)\r\n }\r\n\r\n function addLineNumbersBlockFor(inputHtml: string, options?: LineNumbersOptions) {\r\n const lines = getLines(inputHtml)\r\n\r\n // if last line contains only carriage return remove it\r\n if (lines[lines.length - 1].trim() === '') {\r\n lines.pop()\r\n }\r\n\r\n if (lines.length > 1 || options?.singleLine) {\r\n let html = ''\r\n\r\n for (let i = 0, l = lines.length; i < l; i++) {\r\n html += format(\r\n '<tr>' +\r\n '<td class=\"{0} {1}\" {3}=\"{5}\">' +\r\n '<div class=\"{2}\" {3}=\"{5}\"></div>' +\r\n '</td>' +\r\n '<td class=\"{0} {4}\" {3}=\"{5}\">' +\r\n '{6}' +\r\n '</td>' +\r\n '</tr>',\r\n [\r\n LINE_NAME,\r\n NUMBERS_BLOCK_NAME,\r\n NUMBER_LINE_NAME,\r\n DATA_ATTR_NAME,\r\n CODE_BLOCK_NAME,\r\n i + Number(!!(options?.startFrom)),\r\n lines[i].length > 0 ? lines[i] : ' '\r\n ])\r\n }\r\n\r\n return format('<table class=\"{0}\">{1}</table>', [TABLE_NAME, html])\r\n }\r\n\r\n return inputHtml\r\n }\r\n\r\n /**\r\n * @param element Code block.\r\n * @param options External API options.\r\n * @returns Internal API options.\r\n */\r\n function mapOptions(options?: LineNumbersOptions) {\r\n options = options || {}\r\n return {\r\n singleLine: getSingleLineOption(options),\r\n startFrom: getStartFromOption(options)\r\n }\r\n }\r\n\r\n function getSingleLineOption(options?: LineNumbersOptions) {\r\n const defaultValue = false\r\n if (!!options?.singleLine) {\r\n return options.singleLine\r\n }\r\n return defaultValue\r\n }\r\n\r\n function getStartFromOption(options?: LineNumbersOptions) {\r\n const defaultValue = 1\r\n let startFrom = defaultValue\r\n\r\n if (isFinite(options?.startFrom ?? NaN)) {\r\n startFrom = options!.startFrom!\r\n }\r\n\r\n return startFrom\r\n }\r\n\r\n function getLines(text: string) {\r\n if (text.length === 0) return []\r\n return text.split(BREAK_LINE_REGEXP)\r\n }\r\n\r\n ///\r\n /// HELPERS\r\n ///\r\n\r\n /**\r\n * {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}\r\n *\r\n * @param formatString\r\n * @param args\r\n */\r\n function format(formatString: string, args: any[]) {\r\n return formatString.replace(/\\{(\\d+)\\}/g, (m, n) => args[n] !== null && args[n] !== undefined ? args[n] : m)\r\n }\r\n\r\n return lineNumbersBlock\r\n}\r\n","import {\r\n Directive,\r\n ElementRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n numberAttribute\r\n} from '@angular/core'\r\nimport { HighlightBase, HighlightJS, NXT_HIGHLIGHT_OPTIONS } from 'nxt-highlightjs'\r\n\r\n@Directive({\r\n selector: '[nxtHighlight][lineNumbers], [nxtHighlightAuto][lineNumbers]'\r\n})\r\nexport class HighlightLineNumbersDirective {\r\n\r\n private readonly options = inject(NXT_HIGHLIGHT_OPTIONS)?.lineNumbersOptions\r\n private readonly hljs = inject(HighlightJS)\r\n private readonly highlight = inject(HighlightBase)\r\n private readonly nativeElement = inject(ElementRef<HTMLElement>).nativeElement\r\n\r\n readonly startFrom = input(this.options?.startFrom, {\r\n transform: numberAttribute\r\n })\r\n\r\n readonly singleLine = input(this.options?.singleLine, {\r\n transform: booleanAttribute\r\n })\r\n\r\n constructor() {\r\n effect(() => {\r\n const hljs = this.hljs.hljs()\r\n const result = this.highlight.highlightResult()\r\n if (result?.value) {\r\n if ((hljs as any).lineNumbersBlock) {\r\n const code = (hljs as any).lineNumbersBlock(result.value, {\r\n startFrom: this.startFrom(),\r\n singleLine: this.singleLine()\r\n })\r\n this.nativeElement.innerHTML = code\r\n }\r\n // If lines count is 1, the line numbers library will not add numbers\r\n if (this.nativeElement.firstElementChild?.tagName.toUpperCase() === 'TABLE') {\r\n this.nativeElement.classList.add('hljs-line-numbers')\r\n } else {\r\n this.nativeElement.classList.remove('hljs-line-numbers')\r\n }\r\n }\r\n })\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|