nxt-highlightjs 19.0.5
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/README.md +64 -0
- package/extras/code-file-location.d.ts +12 -0
- package/extras/code-from-url.d.ts +10 -0
- package/extras/code-loader.d.ts +22 -0
- package/extras/gist.d.ts +20 -0
- package/extras/gist.model.d.ts +95 -0
- package/extras/highlight-extras.module.d.ts +8 -0
- package/extras/index.d.ts +5 -0
- package/extras/public_api.d.ts +5 -0
- package/fesm2022/nxt-highlightjs-extras.mjs +203 -0
- package/fesm2022/nxt-highlightjs-extras.mjs.map +1 -0
- package/fesm2022/nxt-highlightjs-line-numbers.mjs +311 -0
- package/fesm2022/nxt-highlightjs-line-numbers.mjs.map +1 -0
- package/fesm2022/nxt-highlightjs.mjs +389 -0
- package/fesm2022/nxt-highlightjs.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/highlight-auto.d.ts +27 -0
- package/lib/highlight-base.d.ts +27 -0
- package/lib/highlight.d.ts +30 -0
- package/lib/highlight.loader.d.ts +28 -0
- package/lib/highlight.model.d.ts +22 -0
- package/lib/highlight.module.d.ts +8 -0
- package/lib/highlight.service.d.ts +64 -0
- package/lib/loader-errors.d.ts +7 -0
- package/lib/trusted-types.d.ts +1 -0
- package/line-numbers/index.d.ts +5 -0
- package/line-numbers/line-numbers-lib.d.ts +6 -0
- package/line-numbers/line-numbers.d.ts +12 -0
- package/line-numbers/public_api.d.ts +2 -0
- package/package.json +52 -0
- package/public-api.d.ts +7 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, ElementRef, input, numberAttribute, booleanAttribute, effect, Directive } from '@angular/core';
|
|
3
|
+
import { NXT_HIGHLIGHT_OPTIONS, HighlightJS, HighlightBase } from 'nxt-highlightjs';
|
|
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
|
+
function activateLineNumbers(document) {
|
|
47
|
+
const TABLE_NAME = 'hljs-ln';
|
|
48
|
+
const LINE_NAME = 'hljs-ln-line';
|
|
49
|
+
const CODE_BLOCK_NAME = 'hljs-ln-code';
|
|
50
|
+
const NUMBERS_BLOCK_NAME = 'hljs-ln-numbers';
|
|
51
|
+
const NUMBER_LINE_NAME = 'hljs-ln-n';
|
|
52
|
+
const DATA_ATTR_NAME = 'data-line-number';
|
|
53
|
+
const BREAK_LINE_REGEXP = /\r\n|\r|\n/g;
|
|
54
|
+
addStyles();
|
|
55
|
+
function isHljsLnCodeDescendant(domElt) {
|
|
56
|
+
let curElt = domElt;
|
|
57
|
+
while (curElt) {
|
|
58
|
+
if (curElt.className && curElt.className.indexOf('hljs-ln-code') !== -1) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
curElt = curElt.parentNode;
|
|
62
|
+
}
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
function getHljsLnTable(hljsLnDomElt) {
|
|
66
|
+
let curElt = hljsLnDomElt;
|
|
67
|
+
while (curElt && curElt.nodeName !== 'TABLE') {
|
|
68
|
+
curElt = curElt.parentNode;
|
|
69
|
+
}
|
|
70
|
+
return curElt;
|
|
71
|
+
}
|
|
72
|
+
// Function to workaround a copy issue with Microsoft Edge.
|
|
73
|
+
// Due to hljs-ln wrapping the lines of code inside a <table> element,
|
|
74
|
+
// itself wrapped inside a <pre> element, window.getSelection().toString()
|
|
75
|
+
// does not contain any line breaks. So we need to get them back using the
|
|
76
|
+
// rendered code in the DOM as reference.
|
|
77
|
+
function edgeGetSelectedCodeLines(selection) {
|
|
78
|
+
// current selected text without line breaks
|
|
79
|
+
const selectionText = selection.toString();
|
|
80
|
+
// get the <td> element wrapping the first line of selected code
|
|
81
|
+
let tdAnchor = selection.anchorNode;
|
|
82
|
+
while (tdAnchor?.nodeName !== 'TD') {
|
|
83
|
+
tdAnchor = tdAnchor?.parentNode || null;
|
|
84
|
+
}
|
|
85
|
+
// get the <td> element wrapping the last line of selected code
|
|
86
|
+
let tdFocus = selection.focusNode;
|
|
87
|
+
while (tdFocus?.nodeName !== 'TD') {
|
|
88
|
+
tdFocus = tdFocus?.parentNode || null;
|
|
89
|
+
}
|
|
90
|
+
// extract line numbers
|
|
91
|
+
let firstLineNumber = parseInt(tdAnchor?.dataset['lineNumber'] || '0', 10);
|
|
92
|
+
let lastLineNumber = parseInt(tdFocus?.dataset['lineNumber'] || '0', 10);
|
|
93
|
+
// multi-lines copied case
|
|
94
|
+
if (firstLineNumber != lastLineNumber) {
|
|
95
|
+
let firstLineText = tdAnchor.textContent;
|
|
96
|
+
let lastLineText = tdFocus.textContent;
|
|
97
|
+
// if the selection was made backward, swap values
|
|
98
|
+
if (firstLineNumber > lastLineNumber) {
|
|
99
|
+
const tmp = firstLineNumber;
|
|
100
|
+
firstLineNumber = lastLineNumber;
|
|
101
|
+
lastLineNumber = tmp;
|
|
102
|
+
const tmp2 = firstLineText;
|
|
103
|
+
firstLineText = lastLineText;
|
|
104
|
+
lastLineText = tmp2;
|
|
105
|
+
}
|
|
106
|
+
// discard not copied characters in first line
|
|
107
|
+
while (selectionText.indexOf(firstLineText || '') !== 0) {
|
|
108
|
+
firstLineText = firstLineText.slice(1);
|
|
109
|
+
}
|
|
110
|
+
// discard not copied characters in last line
|
|
111
|
+
while (selectionText.lastIndexOf(lastLineText || '') === -1) {
|
|
112
|
+
lastLineText = lastLineText.slice(0, -1);
|
|
113
|
+
}
|
|
114
|
+
// reconstruct and return the real copied text
|
|
115
|
+
let selectedText = firstLineText;
|
|
116
|
+
const hljsLnTable = getHljsLnTable(tdAnchor);
|
|
117
|
+
for (let i = firstLineNumber + 1; i < lastLineNumber; ++i) {
|
|
118
|
+
const codeLineSel = format('.{0}[{1}="{2}"]', [CODE_BLOCK_NAME, DATA_ATTR_NAME, i]);
|
|
119
|
+
const codeLineElt = hljsLnTable?.querySelector(codeLineSel);
|
|
120
|
+
selectedText += '\n' + (codeLineElt?.textContent || '');
|
|
121
|
+
}
|
|
122
|
+
selectedText += '\n' + lastLineText;
|
|
123
|
+
return selectedText;
|
|
124
|
+
// single copied line case
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
return selectionText;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// ensure consistent code copy/paste behavior across all browsers
|
|
131
|
+
// (see https://github.com/wcoder/highlightjs-line-numbers.js/issues/51)
|
|
132
|
+
document.addEventListener('copy', (e) => {
|
|
133
|
+
// get current selection
|
|
134
|
+
const selection = window.getSelection();
|
|
135
|
+
// override behavior when one wants to copy line of codes
|
|
136
|
+
if (isHljsLnCodeDescendant(selection?.anchorNode)) {
|
|
137
|
+
let selectionText;
|
|
138
|
+
// workaround an issue with Microsoft Edge as copied line breaks
|
|
139
|
+
// are removed otherwise from the selection string
|
|
140
|
+
if (window.navigator.userAgent.indexOf('Edge') !== -1 && selection) {
|
|
141
|
+
selectionText = edgeGetSelectedCodeLines(selection);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
// other browsers can directly use the selection string
|
|
145
|
+
selectionText = selection?.toString();
|
|
146
|
+
}
|
|
147
|
+
if (selectionText) {
|
|
148
|
+
e.clipboardData?.setData('text/plain', selectionText);
|
|
149
|
+
e.preventDefault();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
function addStyles() {
|
|
154
|
+
const css = document.createElement('style');
|
|
155
|
+
css.innerHTML = format('.{0}{border-collapse:collapse}' +
|
|
156
|
+
'.{0} td{padding:0}' +
|
|
157
|
+
'.{1}:before{content:attr({2})}', [
|
|
158
|
+
TABLE_NAME,
|
|
159
|
+
NUMBER_LINE_NAME,
|
|
160
|
+
DATA_ATTR_NAME
|
|
161
|
+
]);
|
|
162
|
+
document.getElementsByTagName('head')[0].appendChild(css);
|
|
163
|
+
}
|
|
164
|
+
function lineNumbersBlock(element, options) {
|
|
165
|
+
if (typeof element !== 'object')
|
|
166
|
+
return;
|
|
167
|
+
element.innerHTML = lineNumbersInternal(element, options);
|
|
168
|
+
}
|
|
169
|
+
function lineNumbersInternal(element, options) {
|
|
170
|
+
const internalOptions = mapOptions(element, options);
|
|
171
|
+
duplicateMultilineNodes(element);
|
|
172
|
+
return addLineNumbersBlockFor(element.innerHTML, internalOptions);
|
|
173
|
+
}
|
|
174
|
+
function addLineNumbersBlockFor(inputHtml, options) {
|
|
175
|
+
const lines = getLines(inputHtml);
|
|
176
|
+
// if last line contains only carriage return remove it
|
|
177
|
+
if (lines[lines.length - 1].trim() === '') {
|
|
178
|
+
lines.pop();
|
|
179
|
+
}
|
|
180
|
+
if (lines.length > 1 || options?.singleLine) {
|
|
181
|
+
let html = '';
|
|
182
|
+
for (let i = 0, l = lines.length; i < l; i++) {
|
|
183
|
+
html += format('<tr>' +
|
|
184
|
+
'<td class="{0} {1}" {3}="{5}">' +
|
|
185
|
+
'<div class="{2}" {3}="{5}"></div>' +
|
|
186
|
+
'</td>' +
|
|
187
|
+
'<td class="{0} {4}" {3}="{5}">' +
|
|
188
|
+
'{6}' +
|
|
189
|
+
'</td>' +
|
|
190
|
+
'</tr>', [
|
|
191
|
+
LINE_NAME,
|
|
192
|
+
NUMBERS_BLOCK_NAME,
|
|
193
|
+
NUMBER_LINE_NAME,
|
|
194
|
+
DATA_ATTR_NAME,
|
|
195
|
+
CODE_BLOCK_NAME,
|
|
196
|
+
i + Number(!!(options?.startFrom)),
|
|
197
|
+
lines[i].length > 0 ? lines[i] : ' '
|
|
198
|
+
]);
|
|
199
|
+
}
|
|
200
|
+
return format('<table class="{0}">{1}</table>', [TABLE_NAME, html]);
|
|
201
|
+
}
|
|
202
|
+
return inputHtml;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* @param element Code block.
|
|
206
|
+
* @param options External API options.
|
|
207
|
+
* @returns Internal API options.
|
|
208
|
+
*/
|
|
209
|
+
function mapOptions(element, options) {
|
|
210
|
+
options = options || {};
|
|
211
|
+
return {
|
|
212
|
+
singleLine: getSingleLineOption(options),
|
|
213
|
+
startFrom: getStartFromOption(element, options)
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
function getSingleLineOption(options) {
|
|
217
|
+
const defaultValue = false;
|
|
218
|
+
if (!!options?.singleLine) {
|
|
219
|
+
return options.singleLine;
|
|
220
|
+
}
|
|
221
|
+
return defaultValue;
|
|
222
|
+
}
|
|
223
|
+
function getStartFromOption(element, options) {
|
|
224
|
+
const defaultValue = 1;
|
|
225
|
+
let startFrom = defaultValue;
|
|
226
|
+
if (isFinite(options?.startFrom ?? NaN)) {
|
|
227
|
+
startFrom = options.startFrom;
|
|
228
|
+
}
|
|
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
|
+
return startFrom;
|
|
235
|
+
}
|
|
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
|
+
function getLines(text) {
|
|
265
|
+
if (text.length === 0)
|
|
266
|
+
return [];
|
|
267
|
+
return text.split(BREAK_LINE_REGEXP);
|
|
268
|
+
}
|
|
269
|
+
function getLinesCount(text) {
|
|
270
|
+
return (text?.trim().match(BREAK_LINE_REGEXP) || []).length;
|
|
271
|
+
}
|
|
272
|
+
///
|
|
273
|
+
/// HELPERS
|
|
274
|
+
///
|
|
275
|
+
/**
|
|
276
|
+
* {@link https://wcoder.github.io/notes/string-format-for-string-formating-in-javascript}
|
|
277
|
+
*
|
|
278
|
+
* @param formatString
|
|
279
|
+
* @param args
|
|
280
|
+
*/
|
|
281
|
+
function format(formatString, args) {
|
|
282
|
+
return formatString.replace(/\{(\d+)\}/g, (m, n) => args[n] !== null && args[n] !== undefined ? args[n] : m);
|
|
283
|
+
}
|
|
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
|
+
return lineNumbersBlock;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Generated bundle index. Do not edit.
|
|
308
|
+
*/
|
|
309
|
+
|
|
310
|
+
export { HighlightLineNumbersDirective, activateLineNumbers };
|
|
311
|
+
//# sourceMappingURL=nxt-highlightjs-line-numbers.mjs.map
|
|
@@ -0,0 +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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"}
|