@covalent/highlight 6.3.0 → 7.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/esm2022/lib/copy-code-button/copy-code-button.component.mjs +94 -0
- package/esm2022/lib/highlight.component.mjs +222 -0
- package/{esm2020 → esm2022}/lib/highlight.module.mjs +17 -17
- package/{fesm2020 → fesm2022}/covalent-highlight.mjs +79 -67
- package/{fesm2020 → fesm2022}/covalent-highlight.mjs.map +1 -1
- package/lib/copy-code-button/copy-code-button.component.d.ts +1 -1
- package/lib/highlight.component.d.ts +1 -1
- package/package.json +10 -16
- package/esm2020/lib/copy-code-button/copy-code-button.component.mjs +0 -91
- package/esm2020/lib/highlight.component.mjs +0 -213
- package/fesm2015/covalent-highlight.mjs +0 -345
- package/fesm2015/covalent-highlight.mjs.map +0 -1
- /package/{esm2020 → esm2022}/covalent-highlight.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
import { Component, ElementRef, Input, Output, EventEmitter, Renderer2, SecurityContext, ViewChild, ChangeDetectorRef, } from '@angular/core';
|
|
2
|
-
import { DomSanitizer } from '@angular/platform-browser';
|
|
3
|
-
import { MatTooltip } from '@angular/material/tooltip';
|
|
4
|
-
import hljs from 'highlight.js';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/platform-browser";
|
|
7
|
-
import * as i2 from "@angular/common";
|
|
8
|
-
import * as i3 from "./copy-code-button/copy-code-button.component";
|
|
9
|
-
export class TdHighlightComponent {
|
|
10
|
-
/**
|
|
11
|
-
* content?: string
|
|
12
|
-
*
|
|
13
|
-
* Code content to be parsed as highlighted html.
|
|
14
|
-
* Used to load data dynamically.
|
|
15
|
-
*
|
|
16
|
-
* e.g. `.html`, `.ts` , etc.
|
|
17
|
-
*/
|
|
18
|
-
set content(content) {
|
|
19
|
-
this._content = content;
|
|
20
|
-
console.log(this._content);
|
|
21
|
-
if (this._initialized) {
|
|
22
|
-
this._loadContent(this._content);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* lang?: string
|
|
27
|
-
*
|
|
28
|
-
* Language of the code content to be parsed as highlighted html.
|
|
29
|
-
* Defaults to `typescript`
|
|
30
|
-
*
|
|
31
|
-
* e.g. `typescript`, `html` , etc.
|
|
32
|
-
*/
|
|
33
|
-
set codeLang(lang) {
|
|
34
|
-
this.setLanguage(lang);
|
|
35
|
-
}
|
|
36
|
-
/** @deprecated - removed completely @4.0.0 */
|
|
37
|
-
set lang(lang) {
|
|
38
|
-
// tslint:disable-next-line: no-console
|
|
39
|
-
console.warn('DEPRECATION WARNING: switch to codeLang attribute as lang attribute is deprecated.');
|
|
40
|
-
this.setLanguage(lang);
|
|
41
|
-
}
|
|
42
|
-
constructor(_renderer, _elementRef, _domSanitizer, cdr) {
|
|
43
|
-
this._renderer = _renderer;
|
|
44
|
-
this._elementRef = _elementRef;
|
|
45
|
-
this._domSanitizer = _domSanitizer;
|
|
46
|
-
this.cdr = cdr;
|
|
47
|
-
this._initialized = false;
|
|
48
|
-
this._lang = 'typescript';
|
|
49
|
-
this._showRaw = false;
|
|
50
|
-
/**
|
|
51
|
-
* copyCodeToClipboard?: boolean
|
|
52
|
-
*
|
|
53
|
-
* Display copy button on code snippets to copy code to clipboard.
|
|
54
|
-
*/
|
|
55
|
-
this.copyCodeToClipboard = false;
|
|
56
|
-
/**
|
|
57
|
-
* copyCodeTooltips?: ICopyCodeTooltips
|
|
58
|
-
*
|
|
59
|
-
* Tooltips for copy button to copy and upon copying.
|
|
60
|
-
*/
|
|
61
|
-
this.copyCodeTooltips = {};
|
|
62
|
-
/**
|
|
63
|
-
* toggleRawButton?: boolean
|
|
64
|
-
*
|
|
65
|
-
* Display button to toggle raw code.
|
|
66
|
-
*/
|
|
67
|
-
this.toggleRawButton = false;
|
|
68
|
-
/**
|
|
69
|
-
* rawToggleLabels?: IRawToggleLabels
|
|
70
|
-
*
|
|
71
|
-
* Labels for raw toggle button.
|
|
72
|
-
*/
|
|
73
|
-
this.rawToggleLabels = {};
|
|
74
|
-
/**
|
|
75
|
-
* contentReady?: function
|
|
76
|
-
* Event emitted after the highlight content rendering is finished.
|
|
77
|
-
*/
|
|
78
|
-
this.contentReady = new EventEmitter();
|
|
79
|
-
}
|
|
80
|
-
ngAfterViewChecked() {
|
|
81
|
-
this.cdr.detectChanges();
|
|
82
|
-
}
|
|
83
|
-
ngAfterViewInit() {
|
|
84
|
-
if (!this._content) {
|
|
85
|
-
this._content =
|
|
86
|
-
this.highlightComp.nativeElement.textContent || '';
|
|
87
|
-
}
|
|
88
|
-
this._loadContent(this._content);
|
|
89
|
-
this._initialized = true;
|
|
90
|
-
}
|
|
91
|
-
setLanguage(lang) {
|
|
92
|
-
if (!lang) {
|
|
93
|
-
throw new Error('Error: language attribute must be defined in TdHighlightComponent.');
|
|
94
|
-
}
|
|
95
|
-
this._lang = lang;
|
|
96
|
-
if (this._initialized) {
|
|
97
|
-
this._loadContent(this._content);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
toggleRawClicked() {
|
|
101
|
-
this._showRaw = !this._showRaw;
|
|
102
|
-
this._elementRef.nativeElement.querySelector('pre').style.display = this
|
|
103
|
-
._showRaw
|
|
104
|
-
? 'none'
|
|
105
|
-
: 'block';
|
|
106
|
-
this._elementRef.nativeElement.querySelector('.raw').style.display = this
|
|
107
|
-
._showRaw
|
|
108
|
-
? 'block'
|
|
109
|
-
: 'none';
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* General method to parse a string of code into HTML Elements and load them into the container
|
|
113
|
-
*/
|
|
114
|
-
_loadContent(code) {
|
|
115
|
-
if (code && code.trim().length > 0) {
|
|
116
|
-
// Clean container
|
|
117
|
-
this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');
|
|
118
|
-
this._elementFromString(code);
|
|
119
|
-
if (this.copyCodeToClipboard) {
|
|
120
|
-
this._renderer.appendChild(this._elementRef.nativeElement, this.copyComp.nativeElement);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
this.contentReady.emit();
|
|
124
|
-
}
|
|
125
|
-
_elementFromString(codeStr) {
|
|
126
|
-
// Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]
|
|
127
|
-
// to parse the string into DOM element for now.
|
|
128
|
-
const preElement = this._renderer.createElement('pre');
|
|
129
|
-
this._renderer.appendChild(this._elementRef.nativeElement, preElement);
|
|
130
|
-
const codeElement = this._renderer.createElement('code');
|
|
131
|
-
this._renderer.appendChild(preElement, codeElement);
|
|
132
|
-
// Set .highlight class into <code> element
|
|
133
|
-
this._renderer.addClass(codeElement, 'highlight');
|
|
134
|
-
const highlightedCode = this._render(codeStr);
|
|
135
|
-
codeElement.innerHTML =
|
|
136
|
-
this._domSanitizer.sanitize(SecurityContext.HTML, highlightedCode) ?? '';
|
|
137
|
-
if (this.toggleRawButton) {
|
|
138
|
-
const divElement = this._renderer.createElement('div');
|
|
139
|
-
divElement.className = 'raw';
|
|
140
|
-
this._renderer.appendChild(this._elementRef.nativeElement, divElement);
|
|
141
|
-
divElement.innerHTML =
|
|
142
|
-
this._domSanitizer.sanitize(SecurityContext.HTML, codeStr) ?? '';
|
|
143
|
-
this._renderer.setStyle(divElement, 'display', 'none');
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
_render(contents) {
|
|
147
|
-
// Trim leading and trailing newlines
|
|
148
|
-
contents = contents
|
|
149
|
-
.replace(/^(\s|\t)*\n+/g, '')
|
|
150
|
-
.replace(/(\s|\t)*\n+(\s|\t)*$/g, '');
|
|
151
|
-
// Split markup by line characters
|
|
152
|
-
let lines = contents.split('\n');
|
|
153
|
-
// check how much indentation is used by the first actual code line
|
|
154
|
-
const firstLineWhitespaceMatch = lines[0].match(/^(\s|\t)*/);
|
|
155
|
-
const firstLineWhitespace = firstLineWhitespaceMatch
|
|
156
|
-
? firstLineWhitespaceMatch[0]
|
|
157
|
-
: null;
|
|
158
|
-
// Remove all indentation spaces so code can be parsed correctly
|
|
159
|
-
const startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);
|
|
160
|
-
lines = lines.map(function (line) {
|
|
161
|
-
return line
|
|
162
|
-
.replace('=""', '') // remove empty values
|
|
163
|
-
.replace(startingWhitespaceRegex, '')
|
|
164
|
-
.replace(/\s+$/, ''); // remove trailing white spaces
|
|
165
|
-
});
|
|
166
|
-
const codeToParse = lines
|
|
167
|
-
.join('\n')
|
|
168
|
-
.replace(/\{ \{/gi, '{{')
|
|
169
|
-
.replace(/\} \}/gi, '}}')
|
|
170
|
-
.replace(/</gi, '<')
|
|
171
|
-
.replace(/>/gi, '>'); // replace with < and > to render HTML in Angular
|
|
172
|
-
this.copyContent = codeToParse;
|
|
173
|
-
// Parse code with highlight.js depending on language
|
|
174
|
-
const highlightedCode = hljs.highlight(this._lang, codeToParse, true);
|
|
175
|
-
highlightedCode.value = highlightedCode.value
|
|
176
|
-
.replace(/=<span class="hljs-value">""<\/span>/gi, '')
|
|
177
|
-
.replace('<head>', '')
|
|
178
|
-
.replace('<head/>', '');
|
|
179
|
-
return highlightedCode.value;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
TdHighlightComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdHighlightComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
183
|
-
TdHighlightComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: TdHighlightComponent, selector: "td-highlight", inputs: { content: "content", copyCodeToClipboard: "copyCodeToClipboard", copyCodeTooltips: "copyCodeTooltips", toggleRawButton: "toggleRawButton", rawToggleLabels: "rawToggleLabels", codeLang: "codeLang", lang: "lang" }, outputs: { contentReady: "contentReady" }, viewQueries: [{ propertyName: "highlightComp", first: true, predicate: ["highlightComponent"], descendants: true }, { propertyName: "copyComp", first: true, predicate: ["copyComponent"], descendants: true }, { propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }], ngImport: i0, template: "<div>\n <div #highlightComponent>\n <ng-content></ng-content>\n </div>\n\n <div #copyComponent *ngIf=\"copyCodeToClipboard\">\n <td-copy-code-button\n [toggleRawButton]=\"toggleRawButton\"\n [rawToggleLabels]=\"rawToggleLabels\"\n (toggleRaw)=\"toggleRawClicked()\"\n [copiedContent]=\"copyContent\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n ></td-copy-code-button>\n </div>\n</div>\n", styles: [":host ::ng-deep{overflow-x:auto;padding:16px;display:flex;position:relative}:host ::ng-deep pre,:host ::ng-deep code,:host ::ng-deep .highlight{font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace}:host ::ng-deep pre{display:block;overflow-x:auto;padding:0;margin:0;background:transparent;font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace;line-height:1.45;tab-size:2;-webkit-font-smoothing:auto;-webkit-text-size-adjust:none;text-size-adjust:none;position:relative;border-radius:2px;font-size:.8rem;width:100%}:host ::ng-deep code{margin:0;padding:0;overflow-wrap:break-word;white-space:pre-wrap}:host ::ng-deep div.raw{flex-grow:1}:host ::ng-deep .highlight{display:block;overflow-wrap:break-word;line-height:1.5;margin:0}:host ::ng-deep .copy-button{border:none;background:inherit;margin-top:-8px;margin-right:-8px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.TdCopyCodeButtonComponent, selector: "td-copy-code-button", inputs: ["copiedContent", "copyCodeToClipboard", "copyCodeTooltips", "toggleRawButton", "rawToggleLabels"], outputs: ["toggleRaw"] }] });
|
|
184
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdHighlightComponent, decorators: [{
|
|
185
|
-
type: Component,
|
|
186
|
-
args: [{ selector: 'td-highlight', template: "<div>\n <div #highlightComponent>\n <ng-content></ng-content>\n </div>\n\n <div #copyComponent *ngIf=\"copyCodeToClipboard\">\n <td-copy-code-button\n [toggleRawButton]=\"toggleRawButton\"\n [rawToggleLabels]=\"rawToggleLabels\"\n (toggleRaw)=\"toggleRawClicked()\"\n [copiedContent]=\"copyContent\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n ></td-copy-code-button>\n </div>\n</div>\n", styles: [":host ::ng-deep{overflow-x:auto;padding:16px;display:flex;position:relative}:host ::ng-deep pre,:host ::ng-deep code,:host ::ng-deep .highlight{font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace}:host ::ng-deep pre{display:block;overflow-x:auto;padding:0;margin:0;background:transparent;font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace;line-height:1.45;tab-size:2;-webkit-font-smoothing:auto;-webkit-text-size-adjust:none;text-size-adjust:none;position:relative;border-radius:2px;font-size:.8rem;width:100%}:host ::ng-deep code{margin:0;padding:0;overflow-wrap:break-word;white-space:pre-wrap}:host ::ng-deep div.raw{flex-grow:1}:host ::ng-deep .highlight{display:block;overflow-wrap:break-word;line-height:1.5;margin:0}:host ::ng-deep .copy-button{border:none;background:inherit;margin-top:-8px;margin-right:-8px}\n"] }]
|
|
187
|
-
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { content: [{
|
|
188
|
-
type: Input
|
|
189
|
-
}], copyCodeToClipboard: [{
|
|
190
|
-
type: Input
|
|
191
|
-
}], copyCodeTooltips: [{
|
|
192
|
-
type: Input
|
|
193
|
-
}], toggleRawButton: [{
|
|
194
|
-
type: Input
|
|
195
|
-
}], rawToggleLabels: [{
|
|
196
|
-
type: Input
|
|
197
|
-
}], codeLang: [{
|
|
198
|
-
type: Input
|
|
199
|
-
}], lang: [{
|
|
200
|
-
type: Input
|
|
201
|
-
}], contentReady: [{
|
|
202
|
-
type: Output
|
|
203
|
-
}], highlightComp: [{
|
|
204
|
-
type: ViewChild,
|
|
205
|
-
args: ['highlightComponent']
|
|
206
|
-
}], copyComp: [{
|
|
207
|
-
type: ViewChild,
|
|
208
|
-
args: ['copyComponent']
|
|
209
|
-
}], tooltip: [{
|
|
210
|
-
type: ViewChild,
|
|
211
|
-
args: ['tooltip']
|
|
212
|
-
}] } });
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlnaGxpZ2h0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci1oaWdobGlnaHQvc3JjL2xpYi9oaWdobGlnaHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLWhpZ2hsaWdodC9zcmMvbGliL2hpZ2hsaWdodC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFDVCxpQkFBaUIsR0FFbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU12RCxPQUFPLElBQUksTUFBTSxjQUFjLENBQUM7Ozs7O0FBT2hDLE1BQU0sT0FBTyxvQkFBb0I7SUFRL0I7Ozs7Ozs7T0FPRztJQUNILElBQ0ksT0FBTyxDQUFDLE9BQWU7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xDO0lBQ0gsQ0FBQztJQThCRDs7Ozs7OztPQU9HO0lBRUgsSUFDSSxRQUFRLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCw4Q0FBOEM7SUFDOUMsSUFDSSxJQUFJLENBQUMsSUFBWTtRQUNuQix1Q0FBdUM7UUFDdkMsT0FBTyxDQUFDLElBQUks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QUMsU0FBUyxFQUFFLElBQUksQ0FBQzthQUN4QixPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQzthQUN0QixPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsaURBQWlEO1FBQzVFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLHFEQUFxRDtRQUNyRCxNQUFNLGVBQWUsR0FBUSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNFLGVBQWUsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLEtBQUs7YUFDMUMsT0FBTyxDQUFDLHdDQUF3QyxFQUFFLEVBQUUsQ0FBQzthQUNyRCxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzthQUNyQixPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFCLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQztJQUMvQixDQUFDOztpSEEzTlUsb0JBQW9CO3FHQUFwQixvQkFBb0IsbW1CQzNCakMsK2RBZ0JBOzJGRFdhLG9CQUFvQjtrQkFMaEMsU0FBUzsrQkFDRSxjQUFjO29MQXFCcEIsT0FBTztzQkFEVixLQUFLO2dCQWNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFPRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBT0csZUFBZTtzQkFBdkIsS0FBSztnQkFPRyxlQUFlO3NCQUF2QixLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkFNRixJQUFJO3NCQURQLEtBQUs7Z0JBZUksWUFBWTtzQkFBckIsTUFBTTtnQkFDMEIsYUFBYTtzQkFBN0MsU0FBUzt1QkFBQyxvQkFBb0I7Z0JBQ0gsUUFBUTtzQkFBbkMsU0FBUzt1QkFBQyxlQUFlO2dCQUVKLE9BQU87c0JBQTVCLFNBQVM7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBSZW5kZXJlcjIsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgVmlld0NoaWxkLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IE1hdFRvb2x0aXAgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7XG4gIElDb3B5Q29kZVRvb2x0aXBzLFxuICBJUmF3VG9nZ2xlTGFiZWxzLFxufSBmcm9tICcuL2NvcHktY29kZS1idXR0b24vY29weS1jb2RlLWJ1dHRvbi5jb21wb25lbnQnO1xuXG5pbXBvcnQgaGxqcyBmcm9tICdoaWdobGlnaHQuanMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0ZC1oaWdobGlnaHQnLFxuICBzdHlsZVVybHM6IFsnLi9oaWdobGlnaHQuY29tcG9uZW50LnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2hpZ2hsaWdodC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFRkSGlnaGxpZ2h0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XG4gIHByaXZhdGUgX2luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfY29udGVudCE6IHN0cmluZztcbiAgcHJpdmF0ZSBfbGFuZyA9ICd0eXBlc2NyaXB0JztcblxuICBwcml2YXRlIF9zaG93UmF3ID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIGNvbnRlbnQ/OiBzdHJpbmdcbiAgICpcbiAgICogQ29kZSBjb250ZW50IHRvIGJlIHBhcnNlZCBhcyBoaWdobGlnaHRlZCBodG1sLlxuICAgKiBVc2VkIHRvIGxvYWQgZGF0YSBkeW5hbWljYWxseS5cbiAgICpcbiAgICogZS5nLiBgLmh0bWxgLCBgLnRzYCAsIGV0Yy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBjb250ZW50KGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgIGNvbnNvbGUubG9nKHRoaXMuX2NvbnRlbnQpO1xuICAgIGlmICh0aGlzLl9pbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fbG9hZENvbnRlbnQodGhpcy5fY29udGVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGNvcHlDb2RlVG9DbGlwYm9hcmQ/OiBib29sZWFuXG4gICAqXG4gICAqIERpc3BsYXkgY29weSBidXR0b24gb24gY29kZSBzbmlwcGV0cyB0byBjb3B5IGNvZGUgdG8gY2xpcGJvYXJkLlxuICAgKi9cbiAgQElucHV0KCkgY29weUNvZGVUb0NsaXBib2FyZD8gPSBmYWxzZTtcblxuICAvKipcbiAgICogY29weUNvZGVUb29sdGlwcz86IElDb3B5Q29kZVRvb2x0aXBzXG4gICAqXG4gICAqIFRvb2x0aXBzIGZvciBjb3B5IGJ1dHRvbiB0byBjb3B5IGFuZCB1cG9uIGNvcHlpbmcuXG4gICAqL1xuICBASW5wdXQoKSBjb3B5Q29kZVRvb2x0aXBzPzogSUNvcHlDb2RlVG9vbHRpcHMgPSB7fTtcblxuICAvKipcbiAgICogdG9nZ2xlUmF3QnV0dG9uPzogYm9vbGVhblxuICAgKlxuICAgKiBEaXNwbGF5IGJ1dHRvbiB0byB0b2dnbGUgcmF3IGNvZGUuXG4gICAqL1xuICBASW5wdXQoKSB0b2dnbGVSYXdCdXR0b24gPSBmYWxzZTtcblxuICAvKipcbiAgICogcmF3VG9nZ2xlTGFiZWxzPzogSVJhd1RvZ2dsZUxhYmVsc1xuICAgKlxuICAgKiBMYWJlbHMgZm9yIHJhdyB0b2dnbGUgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgcmF3VG9nZ2xlTGFiZWxzPzogSVJhd1RvZ2dsZUxhYmVscyA9IHt9O1xuXG4gIC8qKlxuICAgKiBsYW5nPzogc3RyaW5nXG4gICAqXG4gICAqIExhbmd1YWdlIG9mIHRoZSBjb2RlIGNvbnRlbnQgdG8gYmUgcGFyc2VkIGFzIGhpZ2hsaWdodGVkIGh0bWwuXG4gICAqIERlZmF1bHRzIHRvIGB0eXBlc2NyaXB0YFxuICAgKlxuICAgKiBlLmcuIGB0eXBlc2NyaXB0YCwgYGh0bWxgICwgZXRjLlxuICAgKi9cblxuICBASW5wdXQoKVxuICBzZXQgY29kZUxhbmcobGFuZzogc3RyaW5nKSB7XG4gICAgdGhpcy5zZXRMYW5ndWFnZShsYW5nKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgLSByZW1vdmVkIGNvbXBsZXRlbHkgQDQuMC4wICovXG4gIEBJbnB1dCgpXG4gIHNldCBsYW5nKGxhbmc6IHN0cmluZykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdERVBSRUNBVElPTiBXQVJOSU5HOiBzd2l0Y2ggdG8gY29kZUxhbmcgYXR0cmlidXRlIGFzIGxhbmcgYXR0cmlidXRlIGlzIGRlcHJlY2F0ZWQuJ1xuICAgICk7XG4gICAgdGhpcy5zZXRMYW5ndWFnZShsYW5nKTtcbiAgfVxuXG4gIGNvcHlDb250ZW50ITogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBjb250ZW50UmVhZHk/OiBmdW5jdGlvblxuICAgKiBFdmVudCBlbWl0dGVkIGFmdGVyIHRoZSBoaWdobGlnaHQgY29udGVudCByZW5kZXJpbmcgaXMgZmluaXNoZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgY29udGVudFJlYWR5OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2hpZ2hsaWdodENvbXBvbmVudCcpIGhpZ2hsaWdodENvbXAhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdjb3B5Q29tcG9uZW50JykgY29weUNvbXAhOiBFbGVtZW50UmVmO1xuXG4gIEBWaWV3Q2hpbGQoJ3Rvb2x0aXAnKSB0b29sdGlwITogTWF0VG9vbHRpcDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSBfZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge31cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fY29udGVudCkge1xuICAgICAgdGhpcy5fY29udGVudCA9XG4gICAgICAgICg8SFRNTEVsZW1lbnQ+dGhpcy5oaWdobGlnaHRDb21wLm5hdGl2ZUVsZW1lbnQpLnRleHRDb250ZW50IHx8ICcnO1xuICAgIH1cbiAgICB0aGlzLl9sb2FkQ29udGVudCh0aGlzLl9jb250ZW50KTtcblxuICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcbiAgfVxuXG4gIHNldExhbmd1YWdlKGxhbmc6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghbGFuZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRXJyb3I6IGxhbmd1YWdlIGF0dHJpYnV0ZSBtdXN0IGJlIGRlZmluZWQgaW4gVGRIaWdobGlnaHRDb21wb25lbnQuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5fbGFuZyA9IGxhbmc7XG4gICAgaWYgKHRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9sb2FkQ29udGVudCh0aGlzLl9jb250ZW50KTtcbiAgICB9XG4gIH1cblxuICB0b2dnbGVSYXdDbGlja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuX3Nob3dSYXcgPSAhdGhpcy5fc2hvd1JhdztcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigncHJlJykuc3R5bGUuZGlzcGxheSA9IHRoaXNcbiAgICAgIC5fc2hvd1Jhd1xuICAgICAgPyAnbm9uZSdcbiAgICAgIDogJ2Jsb2NrJztcbiAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignLnJhdycpLnN0eWxlLmRpc3BsYXkgPSB0aGlzXG4gICAgICAuX3Nob3dSYXdcbiAgICAgID8gJ2Jsb2NrJ1xuICAgICAgOiAnbm9uZSc7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhbCBtZXRob2QgdG8gcGFyc2UgYSBzdHJpbmcgb2YgY29kZSBpbnRvIEhUTUwgRWxlbWVudHMgYW5kIGxvYWQgdGhlbSBpbnRvIHRoZSBjb250YWluZXJcbiAgICovXG4gIHByaXZhdGUgX2xvYWRDb250ZW50KGNvZGU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoY29kZSAmJiBjb2RlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBDbGVhbiBjb250YWluZXJcbiAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KFxuICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICdpbm5lckhUTUwnLFxuICAgICAgICAnJ1xuICAgICAgKTtcblxuICAgICAgdGhpcy5fZWxlbWVudEZyb21TdHJpbmcoY29kZSk7XG5cbiAgICAgIGlmICh0aGlzLmNvcHlDb2RlVG9DbGlwYm9hcmQpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyZXIuYXBwZW5kQ2hpbGQoXG4gICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgIHRoaXMuY29weUNvbXAubmF0aXZlRWxlbWVudFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRSZWFkeS5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIF9lbGVtZW50RnJvbVN0cmluZyhjb2RlU3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBSZW5kZXJlcjIgZG9lc250IGhhdmUgYSBwYXJzaW5nIG1ldGhvZCwgc28gd2UgaGF2ZSB0byBzYW5pdGl6ZSBhbmQgdXNlIFtpbm5lckhUTUxdXG4gICAgLy8gdG8gcGFyc2UgdGhlIHN0cmluZyBpbnRvIERPTSBlbGVtZW50IGZvciBub3cuXG4gICAgY29uc3QgcHJlRWxlbWVudDogSFRNTFByZUVsZW1lbnQgPSB0aGlzLl9yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdwcmUnKTtcbiAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHByZUVsZW1lbnQpO1xuICAgIGNvbnN0IGNvZGVFbGVtZW50OiBIVE1MRWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2NvZGUnKTtcbiAgICB0aGlzLl9yZW5kZXJlci5hcHBlbmRDaGlsZChwcmVFbGVtZW50LCBjb2RlRWxlbWVudCk7XG4gICAgLy8gU2V0IC5oaWdobGlnaHQgY2xhc3MgaW50byA8Y29kZT4gZWxlbWVudFxuICAgIHRoaXMuX3JlbmRlcmVyLmFkZENsYXNzKGNvZGVFbGVtZW50LCAnaGlnaGxpZ2h0Jyk7XG5cbiAgICBjb25zdCBoaWdobGlnaHRlZENvZGUgPSB0aGlzLl9yZW5kZXIoY29kZVN0cik7XG5cbiAgICBjb2RlRWxlbWVudC5pbm5lckhUTUwgPVxuICAgICAgdGhpcy5fZG9tU2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBoaWdobGlnaHRlZENvZGUpID8/ICcnO1xuXG4gICAgaWYgKHRoaXMudG9nZ2xlUmF3QnV0dG9uKSB7XG4gICAgICBjb25zdCBkaXZFbGVtZW50OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZGl2RWxlbWVudC5jbGFzc05hbWUgPSAncmF3JztcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZGl2RWxlbWVudCk7XG4gICAgICBkaXZFbGVtZW50LmlubmVySFRNTCA9XG4gICAgICAgIHRoaXMuX2RvbVNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuSFRNTCwgY29kZVN0cikgPz8gJyc7XG4gICAgICB0aGlzLl9yZW5kZXJlci5zZXRTdHlsZShkaXZFbGVtZW50LCAnZGlzcGxheScsICdub25lJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVuZGVyKGNvbnRlbnRzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFRyaW0gbGVhZGluZyBhbmQgdHJhaWxpbmcgbmV3bGluZXNcbiAgICBjb250ZW50cyA9IGNvbnRlbnRzXG4gICAgICAucmVwbGFjZSgvXihcXHN8XFx0KSpcXG4rL2csICcnKVxuICAgICAgLnJlcGxhY2UoLyhcXHN8XFx0KSpcXG4rKFxcc3xcXHQpKiQvZywgJycpO1xuICAgIC8vIFNwbGl0IG1hcmt1cCBieSBsaW5lIGNoYXJhY3RlcnNcbiAgICBsZXQgbGluZXM6IHN0cmluZ1tdID0gY29udGVudHMuc3BsaXQoJ1xcbicpO1xuXG4gICAgLy8gY2hlY2sgaG93IG11Y2ggaW5kZW50YXRpb24gaXMgdXNlZCBieSB0aGUgZmlyc3QgYWN0dWFsIGNvZGUgbGluZVxuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2VNYXRjaCA9IGxpbmVzWzBdLm1hdGNoKC9eKFxcc3xcXHQpKi8pO1xuICAgIGNvbnN0IGZpcnN0TGluZVdoaXRlc3BhY2UgPSBmaXJzdExpbmVXaGl0ZXNwYWNlTWF0Y2hcbiAgICAgID8gZmlyc3RMaW5lV2hpdGVzcGFjZU1hdGNoWzBdXG4gICAgICA6IG51bGw7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGluZGVudGF0aW9uIHNwYWNlcyBzbyBjb2RlIGNhbiBiZSBwYXJzZWQgY29ycmVjdGx5XG4gICAgY29uc3Qgc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGZpcnN0TGluZVdoaXRlc3BhY2UpO1xuICAgIGxpbmVzID0gbGluZXMubWFwKGZ1bmN0aW9uIChsaW5lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGxpbmVcbiAgICAgICAgLnJlcGxhY2UoJz1cIlwiJywgJycpIC8vIHJlbW92ZSBlbXB0eSB2YWx1ZXNcbiAgICAgICAgLnJlcGxhY2Uoc3RhcnRpbmdXaGl0ZXNwYWNlUmVnZXgsICcnKVxuICAgICAgICAucmVwbGFjZSgvXFxzKyQvLCAnJyk7IC8vIHJlbW92ZSB0cmFpbGluZyB3aGl0ZSBzcGFjZXNcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvZGVUb1BhcnNlOiBzdHJpbmcgPSBsaW5lc1xuICAgICAgLmpvaW4oJ1xcbicpXG4gICAgICAucmVwbGFjZSgvXFx7IFxcey9naSwgJ3t7JylcbiAgICAgIC5yZXBsYWNlKC9cXH0gXFx9L2dpLCAnfX0nKVxuICAgICAgLnJlcGxhY2UoLyZsdDsvZ2ksICc8JylcbiAgICAgIC5yZXBsYWNlKC8mZ3Q7L2dpLCAnPicpOyAvLyByZXBsYWNlIHdpdGggPCBhbmQgPiB0byByZW5kZXIgSFRNTCBpbiBBbmd1bGFyXG4gICAgdGhpcy5jb3B5Q29udGVudCA9IGNvZGVUb1BhcnNlO1xuICAgIC8vIFBhcnNlIGNvZGUgd2l0aCBoaWdobGlnaHQuanMgZGVwZW5kaW5nIG9uIGxhbmd1YWdlXG4gICAgY29uc3QgaGlnaGxpZ2h0ZWRDb2RlOiBhbnkgPSBobGpzLmhpZ2hsaWdodCh0aGlzLl9sYW5nLCBjb2RlVG9QYXJzZSwgdHJ1ZSk7XG4gICAgaGlnaGxpZ2h0ZWRDb2RlLnZhbHVlID0gaGlnaGxpZ2h0ZWRDb2RlLnZhbHVlXG4gICAgICAucmVwbGFjZSgvPTxzcGFuIGNsYXNzPVwiaGxqcy12YWx1ZVwiPlwiXCI8XFwvc3Bhbj4vZ2ksICcnKVxuICAgICAgLnJlcGxhY2UoJzxoZWFkPicsICcnKVxuICAgICAgLnJlcGxhY2UoJzxoZWFkLz4nLCAnJyk7XG4gICAgcmV0dXJuIGhpZ2hsaWdodGVkQ29kZS52YWx1ZTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgPGRpdiAjaGlnaGxpZ2h0Q29tcG9uZW50PlxuICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgPC9kaXY+XG5cbiAgPGRpdiAjY29weUNvbXBvbmVudCAqbmdJZj1cImNvcHlDb2RlVG9DbGlwYm9hcmRcIj5cbiAgICA8dGQtY29weS1jb2RlLWJ1dHRvblxuICAgICAgW3RvZ2dsZVJhd0J1dHRvbl09XCJ0b2dnbGVSYXdCdXR0b25cIlxuICAgICAgW3Jhd1RvZ2dsZUxhYmVsc109XCJyYXdUb2dnbGVMYWJlbHNcIlxuICAgICAgKHRvZ2dsZVJhdyk9XCJ0b2dnbGVSYXdDbGlja2VkKClcIlxuICAgICAgW2NvcGllZENvbnRlbnRdPVwiY29weUNvbnRlbnRcIlxuICAgICAgW2NvcHlDb2RlVG9DbGlwYm9hcmRdPVwiY29weUNvZGVUb0NsaXBib2FyZFwiXG4gICAgICBbY29weUNvZGVUb29sdGlwc109XCJjb3B5Q29kZVRvb2x0aXBzXCJcbiAgICA+PC90ZC1jb3B5LWNvZGUtYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
@@ -1,345 +0,0 @@
|
|
|
1
|
-
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Component, Input, Output, ViewChild, HostListener, SecurityContext, NgModule } from '@angular/core';
|
|
3
|
-
import hljs from 'highlight.js';
|
|
4
|
-
import * as i1$1 from '@angular/platform-browser';
|
|
5
|
-
import * as i1 from '@angular/common';
|
|
6
|
-
import { CommonModule } from '@angular/common';
|
|
7
|
-
import * as i2 from '@angular/cdk/clipboard';
|
|
8
|
-
import { ClipboardModule } from '@angular/cdk/clipboard';
|
|
9
|
-
import * as i3 from '@angular/material/icon';
|
|
10
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
11
|
-
import * as i4 from '@angular/material/button-toggle';
|
|
12
|
-
import { MatButtonToggleModule } from '@angular/material/button-toggle';
|
|
13
|
-
import * as i5 from '@angular/material/button';
|
|
14
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
15
|
-
import * as i6 from '@angular/material/tooltip';
|
|
16
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
17
|
-
|
|
18
|
-
class TdCopyCodeButtonComponent {
|
|
19
|
-
constructor() {
|
|
20
|
-
this.copyCodeToClipboard = false;
|
|
21
|
-
/**
|
|
22
|
-
* copyCodeTooltips?: ICopyCodeTooltips
|
|
23
|
-
*
|
|
24
|
-
* Tooltips for copy button to copy and upon copying.
|
|
25
|
-
*/
|
|
26
|
-
this.copyCodeTooltips = {};
|
|
27
|
-
this.toggleRawButton = false;
|
|
28
|
-
this.rawToggleLabels = {};
|
|
29
|
-
this.rawToggle = false;
|
|
30
|
-
this.toggleRaw = new EventEmitter();
|
|
31
|
-
}
|
|
32
|
-
get copyTooltip() {
|
|
33
|
-
return (this.copyCodeTooltips && this.copyCodeTooltips.copy) || 'Copy';
|
|
34
|
-
}
|
|
35
|
-
get copiedTooltip() {
|
|
36
|
-
return (this.copyCodeTooltips && this.copyCodeTooltips.copied) || 'Copied';
|
|
37
|
-
}
|
|
38
|
-
get rawToggleText() {
|
|
39
|
-
var _a, _b;
|
|
40
|
-
if (this.rawToggle) {
|
|
41
|
-
return ((_a = this.rawToggleLabels) === null || _a === void 0 ? void 0 : _a.viewCode) || 'View code';
|
|
42
|
-
}
|
|
43
|
-
else {
|
|
44
|
-
return ((_b = this.rawToggleLabels) === null || _b === void 0 ? void 0 : _b.viewRaw) || 'Raw';
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
textCopied(event) {
|
|
48
|
-
if (event) {
|
|
49
|
-
this.tooltip.hide();
|
|
50
|
-
this.tooltip.message = this.copiedTooltip;
|
|
51
|
-
this.tooltip.show();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
initializeTooltip() {
|
|
55
|
-
setTimeout(() => {
|
|
56
|
-
this.tooltip.message = this.copyTooltip;
|
|
57
|
-
}, 200);
|
|
58
|
-
}
|
|
59
|
-
toggleRawClicked() {
|
|
60
|
-
this.rawToggle = !this.rawToggle;
|
|
61
|
-
this.toggleRaw.emit();
|
|
62
|
-
this.rawButton.checked = false;
|
|
63
|
-
}
|
|
64
|
-
copyClicked() {
|
|
65
|
-
console.log('copyClicked');
|
|
66
|
-
this.copyButton.checked = false;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
TdCopyCodeButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdCopyCodeButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
70
|
-
TdCopyCodeButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: TdCopyCodeButtonComponent, selector: "td-copy-code-button", inputs: { copiedContent: "copiedContent", copyCodeToClipboard: "copyCodeToClipboard", copyCodeTooltips: "copyCodeTooltips", toggleRawButton: "toggleRawButton", rawToggleLabels: "rawToggleLabels" }, outputs: { toggleRaw: "toggleRaw" }, host: { listeners: { "mouseleave": "initializeTooltip()" } }, viewQueries: [{ propertyName: "copyButton", first: true, predicate: ["copyButton"], descendants: true }, { propertyName: "rawButton", first: true, predicate: ["rawButton"], descendants: true }, { propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }], ngImport: i0, template: "<mat-button-toggle-group\n multiple\n class=\"raw-and-copy-buttons\"\n *ngIf=\"toggleRawButton; else button\"\n>\n <mat-button-toggle (click)=\"toggleRawClicked()\" #rawButton>{{\n rawToggleText\n }}</mat-button-toggle>\n <mat-button-toggle\n [cdkCopyToClipboard]=\"copiedContent\"\n [matTooltip]=\"copyTooltip\"\n #tooltip=\"matTooltip\"\n #copyButton\n (click)=\"copyClicked()\"\n (cdkCopyToClipboardCopied)=\"textCopied($event)\"\n >\n <mat-icon width>content_copy</mat-icon>\n </mat-button-toggle>\n</mat-button-toggle-group>\n\n<ng-template #button>\n <button\n mat-icon-button\n [cdkCopyToClipboard]=\"copiedContent\"\n class=\"copy-button\"\n [matTooltip]=\"copyTooltip\"\n #tooltip=\"matTooltip\"\n (cdkCopyToClipboardCopied)=\"textCopied($event)\"\n >\n <mat-icon role=\"img\">content_copy</mat-icon>\n </button>\n</ng-template>\n", styles: ["mat-button-toggle-group.raw-and-copy-buttons{margin-top:-8px;margin-right:-8px;margin-left:8px}mat-button-toggle-group.raw-and-copy-buttons ::ng-deep .mat-button-toggle-label-content{font-size:12px;line-height:28px}mat-button-toggle-group.raw-and-copy-buttons ::ng-deep .mat-button-toggle-label-content mat-icon{width:16px;height:16px;font-size:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i4.MatButtonToggle, selector: "mat-button-toggle", inputs: ["disableRipple", "aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i6.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }] });
|
|
71
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdCopyCodeButtonComponent, decorators: [{
|
|
72
|
-
type: Component,
|
|
73
|
-
args: [{ selector: 'td-copy-code-button', template: "<mat-button-toggle-group\n multiple\n class=\"raw-and-copy-buttons\"\n *ngIf=\"toggleRawButton; else button\"\n>\n <mat-button-toggle (click)=\"toggleRawClicked()\" #rawButton>{{\n rawToggleText\n }}</mat-button-toggle>\n <mat-button-toggle\n [cdkCopyToClipboard]=\"copiedContent\"\n [matTooltip]=\"copyTooltip\"\n #tooltip=\"matTooltip\"\n #copyButton\n (click)=\"copyClicked()\"\n (cdkCopyToClipboardCopied)=\"textCopied($event)\"\n >\n <mat-icon width>content_copy</mat-icon>\n </mat-button-toggle>\n</mat-button-toggle-group>\n\n<ng-template #button>\n <button\n mat-icon-button\n [cdkCopyToClipboard]=\"copiedContent\"\n class=\"copy-button\"\n [matTooltip]=\"copyTooltip\"\n #tooltip=\"matTooltip\"\n (cdkCopyToClipboardCopied)=\"textCopied($event)\"\n >\n <mat-icon role=\"img\">content_copy</mat-icon>\n </button>\n</ng-template>\n", styles: ["mat-button-toggle-group.raw-and-copy-buttons{margin-top:-8px;margin-right:-8px;margin-left:8px}mat-button-toggle-group.raw-and-copy-buttons ::ng-deep .mat-button-toggle-label-content{font-size:12px;line-height:28px}mat-button-toggle-group.raw-and-copy-buttons ::ng-deep .mat-button-toggle-label-content mat-icon{width:16px;height:16px;font-size:16px}\n"] }]
|
|
74
|
-
}], propDecorators: { copiedContent: [{
|
|
75
|
-
type: Input
|
|
76
|
-
}], copyCodeToClipboard: [{
|
|
77
|
-
type: Input
|
|
78
|
-
}], copyCodeTooltips: [{
|
|
79
|
-
type: Input
|
|
80
|
-
}], toggleRawButton: [{
|
|
81
|
-
type: Input
|
|
82
|
-
}], rawToggleLabels: [{
|
|
83
|
-
type: Input
|
|
84
|
-
}], toggleRaw: [{
|
|
85
|
-
type: Output
|
|
86
|
-
}], copyButton: [{
|
|
87
|
-
type: ViewChild,
|
|
88
|
-
args: ['copyButton']
|
|
89
|
-
}], rawButton: [{
|
|
90
|
-
type: ViewChild,
|
|
91
|
-
args: ['rawButton']
|
|
92
|
-
}], tooltip: [{
|
|
93
|
-
type: ViewChild,
|
|
94
|
-
args: ['tooltip']
|
|
95
|
-
}], initializeTooltip: [{
|
|
96
|
-
type: HostListener,
|
|
97
|
-
args: ['mouseleave']
|
|
98
|
-
}] } });
|
|
99
|
-
|
|
100
|
-
class TdHighlightComponent {
|
|
101
|
-
/**
|
|
102
|
-
* content?: string
|
|
103
|
-
*
|
|
104
|
-
* Code content to be parsed as highlighted html.
|
|
105
|
-
* Used to load data dynamically.
|
|
106
|
-
*
|
|
107
|
-
* e.g. `.html`, `.ts` , etc.
|
|
108
|
-
*/
|
|
109
|
-
set content(content) {
|
|
110
|
-
this._content = content;
|
|
111
|
-
console.log(this._content);
|
|
112
|
-
if (this._initialized) {
|
|
113
|
-
this._loadContent(this._content);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* lang?: string
|
|
118
|
-
*
|
|
119
|
-
* Language of the code content to be parsed as highlighted html.
|
|
120
|
-
* Defaults to `typescript`
|
|
121
|
-
*
|
|
122
|
-
* e.g. `typescript`, `html` , etc.
|
|
123
|
-
*/
|
|
124
|
-
set codeLang(lang) {
|
|
125
|
-
this.setLanguage(lang);
|
|
126
|
-
}
|
|
127
|
-
/** @deprecated - removed completely @4.0.0 */
|
|
128
|
-
set lang(lang) {
|
|
129
|
-
// tslint:disable-next-line: no-console
|
|
130
|
-
console.warn('DEPRECATION WARNING: switch to codeLang attribute as lang attribute is deprecated.');
|
|
131
|
-
this.setLanguage(lang);
|
|
132
|
-
}
|
|
133
|
-
constructor(_renderer, _elementRef, _domSanitizer, cdr) {
|
|
134
|
-
this._renderer = _renderer;
|
|
135
|
-
this._elementRef = _elementRef;
|
|
136
|
-
this._domSanitizer = _domSanitizer;
|
|
137
|
-
this.cdr = cdr;
|
|
138
|
-
this._initialized = false;
|
|
139
|
-
this._lang = 'typescript';
|
|
140
|
-
this._showRaw = false;
|
|
141
|
-
/**
|
|
142
|
-
* copyCodeToClipboard?: boolean
|
|
143
|
-
*
|
|
144
|
-
* Display copy button on code snippets to copy code to clipboard.
|
|
145
|
-
*/
|
|
146
|
-
this.copyCodeToClipboard = false;
|
|
147
|
-
/**
|
|
148
|
-
* copyCodeTooltips?: ICopyCodeTooltips
|
|
149
|
-
*
|
|
150
|
-
* Tooltips for copy button to copy and upon copying.
|
|
151
|
-
*/
|
|
152
|
-
this.copyCodeTooltips = {};
|
|
153
|
-
/**
|
|
154
|
-
* toggleRawButton?: boolean
|
|
155
|
-
*
|
|
156
|
-
* Display button to toggle raw code.
|
|
157
|
-
*/
|
|
158
|
-
this.toggleRawButton = false;
|
|
159
|
-
/**
|
|
160
|
-
* rawToggleLabels?: IRawToggleLabels
|
|
161
|
-
*
|
|
162
|
-
* Labels for raw toggle button.
|
|
163
|
-
*/
|
|
164
|
-
this.rawToggleLabels = {};
|
|
165
|
-
/**
|
|
166
|
-
* contentReady?: function
|
|
167
|
-
* Event emitted after the highlight content rendering is finished.
|
|
168
|
-
*/
|
|
169
|
-
this.contentReady = new EventEmitter();
|
|
170
|
-
}
|
|
171
|
-
ngAfterViewChecked() {
|
|
172
|
-
this.cdr.detectChanges();
|
|
173
|
-
}
|
|
174
|
-
ngAfterViewInit() {
|
|
175
|
-
if (!this._content) {
|
|
176
|
-
this._content =
|
|
177
|
-
this.highlightComp.nativeElement.textContent || '';
|
|
178
|
-
}
|
|
179
|
-
this._loadContent(this._content);
|
|
180
|
-
this._initialized = true;
|
|
181
|
-
}
|
|
182
|
-
setLanguage(lang) {
|
|
183
|
-
if (!lang) {
|
|
184
|
-
throw new Error('Error: language attribute must be defined in TdHighlightComponent.');
|
|
185
|
-
}
|
|
186
|
-
this._lang = lang;
|
|
187
|
-
if (this._initialized) {
|
|
188
|
-
this._loadContent(this._content);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
toggleRawClicked() {
|
|
192
|
-
this._showRaw = !this._showRaw;
|
|
193
|
-
this._elementRef.nativeElement.querySelector('pre').style.display = this
|
|
194
|
-
._showRaw
|
|
195
|
-
? 'none'
|
|
196
|
-
: 'block';
|
|
197
|
-
this._elementRef.nativeElement.querySelector('.raw').style.display = this
|
|
198
|
-
._showRaw
|
|
199
|
-
? 'block'
|
|
200
|
-
: 'none';
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* General method to parse a string of code into HTML Elements and load them into the container
|
|
204
|
-
*/
|
|
205
|
-
_loadContent(code) {
|
|
206
|
-
if (code && code.trim().length > 0) {
|
|
207
|
-
// Clean container
|
|
208
|
-
this._renderer.setProperty(this._elementRef.nativeElement, 'innerHTML', '');
|
|
209
|
-
this._elementFromString(code);
|
|
210
|
-
if (this.copyCodeToClipboard) {
|
|
211
|
-
this._renderer.appendChild(this._elementRef.nativeElement, this.copyComp.nativeElement);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
this.contentReady.emit();
|
|
215
|
-
}
|
|
216
|
-
_elementFromString(codeStr) {
|
|
217
|
-
var _a, _b;
|
|
218
|
-
// Renderer2 doesnt have a parsing method, so we have to sanitize and use [innerHTML]
|
|
219
|
-
// to parse the string into DOM element for now.
|
|
220
|
-
const preElement = this._renderer.createElement('pre');
|
|
221
|
-
this._renderer.appendChild(this._elementRef.nativeElement, preElement);
|
|
222
|
-
const codeElement = this._renderer.createElement('code');
|
|
223
|
-
this._renderer.appendChild(preElement, codeElement);
|
|
224
|
-
// Set .highlight class into <code> element
|
|
225
|
-
this._renderer.addClass(codeElement, 'highlight');
|
|
226
|
-
const highlightedCode = this._render(codeStr);
|
|
227
|
-
codeElement.innerHTML =
|
|
228
|
-
(_a = this._domSanitizer.sanitize(SecurityContext.HTML, highlightedCode)) !== null && _a !== void 0 ? _a : '';
|
|
229
|
-
if (this.toggleRawButton) {
|
|
230
|
-
const divElement = this._renderer.createElement('div');
|
|
231
|
-
divElement.className = 'raw';
|
|
232
|
-
this._renderer.appendChild(this._elementRef.nativeElement, divElement);
|
|
233
|
-
divElement.innerHTML =
|
|
234
|
-
(_b = this._domSanitizer.sanitize(SecurityContext.HTML, codeStr)) !== null && _b !== void 0 ? _b : '';
|
|
235
|
-
this._renderer.setStyle(divElement, 'display', 'none');
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
_render(contents) {
|
|
239
|
-
// Trim leading and trailing newlines
|
|
240
|
-
contents = contents
|
|
241
|
-
.replace(/^(\s|\t)*\n+/g, '')
|
|
242
|
-
.replace(/(\s|\t)*\n+(\s|\t)*$/g, '');
|
|
243
|
-
// Split markup by line characters
|
|
244
|
-
let lines = contents.split('\n');
|
|
245
|
-
// check how much indentation is used by the first actual code line
|
|
246
|
-
const firstLineWhitespaceMatch = lines[0].match(/^(\s|\t)*/);
|
|
247
|
-
const firstLineWhitespace = firstLineWhitespaceMatch
|
|
248
|
-
? firstLineWhitespaceMatch[0]
|
|
249
|
-
: null;
|
|
250
|
-
// Remove all indentation spaces so code can be parsed correctly
|
|
251
|
-
const startingWhitespaceRegex = new RegExp('^' + firstLineWhitespace);
|
|
252
|
-
lines = lines.map(function (line) {
|
|
253
|
-
return line
|
|
254
|
-
.replace('=""', '') // remove empty values
|
|
255
|
-
.replace(startingWhitespaceRegex, '')
|
|
256
|
-
.replace(/\s+$/, ''); // remove trailing white spaces
|
|
257
|
-
});
|
|
258
|
-
const codeToParse = lines
|
|
259
|
-
.join('\n')
|
|
260
|
-
.replace(/\{ \{/gi, '{{')
|
|
261
|
-
.replace(/\} \}/gi, '}}')
|
|
262
|
-
.replace(/</gi, '<')
|
|
263
|
-
.replace(/>/gi, '>'); // replace with < and > to render HTML in Angular
|
|
264
|
-
this.copyContent = codeToParse;
|
|
265
|
-
// Parse code with highlight.js depending on language
|
|
266
|
-
const highlightedCode = hljs.highlight(this._lang, codeToParse, true);
|
|
267
|
-
highlightedCode.value = highlightedCode.value
|
|
268
|
-
.replace(/=<span class="hljs-value">""<\/span>/gi, '')
|
|
269
|
-
.replace('<head>', '')
|
|
270
|
-
.replace('<head/>', '');
|
|
271
|
-
return highlightedCode.value;
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
TdHighlightComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdHighlightComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: i1$1.DomSanitizer }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
275
|
-
TdHighlightComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.5", type: TdHighlightComponent, selector: "td-highlight", inputs: { content: "content", copyCodeToClipboard: "copyCodeToClipboard", copyCodeTooltips: "copyCodeTooltips", toggleRawButton: "toggleRawButton", rawToggleLabels: "rawToggleLabels", codeLang: "codeLang", lang: "lang" }, outputs: { contentReady: "contentReady" }, viewQueries: [{ propertyName: "highlightComp", first: true, predicate: ["highlightComponent"], descendants: true }, { propertyName: "copyComp", first: true, predicate: ["copyComponent"], descendants: true }, { propertyName: "tooltip", first: true, predicate: ["tooltip"], descendants: true }], ngImport: i0, template: "<div>\n <div #highlightComponent>\n <ng-content></ng-content>\n </div>\n\n <div #copyComponent *ngIf=\"copyCodeToClipboard\">\n <td-copy-code-button\n [toggleRawButton]=\"toggleRawButton\"\n [rawToggleLabels]=\"rawToggleLabels\"\n (toggleRaw)=\"toggleRawClicked()\"\n [copiedContent]=\"copyContent\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n ></td-copy-code-button>\n </div>\n</div>\n", styles: [":host ::ng-deep{overflow-x:auto;padding:16px;display:flex;position:relative}:host ::ng-deep pre,:host ::ng-deep code,:host ::ng-deep .highlight{font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace}:host ::ng-deep pre{display:block;overflow-x:auto;padding:0;margin:0;background:transparent;font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace;line-height:1.45;tab-size:2;-webkit-font-smoothing:auto;-webkit-text-size-adjust:none;text-size-adjust:none;position:relative;border-radius:2px;font-size:.8rem;width:100%}:host ::ng-deep code{margin:0;padding:0;overflow-wrap:break-word;white-space:pre-wrap}:host ::ng-deep div.raw{flex-grow:1}:host ::ng-deep .highlight{display:block;overflow-wrap:break-word;line-height:1.5;margin:0}:host ::ng-deep .copy-button{border:none;background:inherit;margin-top:-8px;margin-right:-8px}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: TdCopyCodeButtonComponent, selector: "td-copy-code-button", inputs: ["copiedContent", "copyCodeToClipboard", "copyCodeTooltips", "toggleRawButton", "rawToggleLabels"], outputs: ["toggleRaw"] }] });
|
|
276
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: TdHighlightComponent, decorators: [{
|
|
277
|
-
type: Component,
|
|
278
|
-
args: [{ selector: 'td-highlight', template: "<div>\n <div #highlightComponent>\n <ng-content></ng-content>\n </div>\n\n <div #copyComponent *ngIf=\"copyCodeToClipboard\">\n <td-copy-code-button\n [toggleRawButton]=\"toggleRawButton\"\n [rawToggleLabels]=\"rawToggleLabels\"\n (toggleRaw)=\"toggleRawClicked()\"\n [copiedContent]=\"copyContent\"\n [copyCodeToClipboard]=\"copyCodeToClipboard\"\n [copyCodeTooltips]=\"copyCodeTooltips\"\n ></td-copy-code-button>\n </div>\n</div>\n", styles: [":host ::ng-deep{overflow-x:auto;padding:16px;display:flex;position:relative}:host ::ng-deep pre,:host ::ng-deep code,:host ::ng-deep .highlight{font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace}:host ::ng-deep pre{display:block;overflow-x:auto;padding:0;margin:0;background:transparent;font-family:Menlo,Monaco,Andale Mono,lucida console,Courier New,monospace;line-height:1.45;tab-size:2;-webkit-font-smoothing:auto;-webkit-text-size-adjust:none;text-size-adjust:none;position:relative;border-radius:2px;font-size:.8rem;width:100%}:host ::ng-deep code{margin:0;padding:0;overflow-wrap:break-word;white-space:pre-wrap}:host ::ng-deep div.raw{flex-grow:1}:host ::ng-deep .highlight{display:block;overflow-wrap:break-word;line-height:1.5;margin:0}:host ::ng-deep .copy-button{border:none;background:inherit;margin-top:-8px;margin-right:-8px}\n"] }]
|
|
279
|
-
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i1$1.DomSanitizer }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { content: [{
|
|
280
|
-
type: Input
|
|
281
|
-
}], copyCodeToClipboard: [{
|
|
282
|
-
type: Input
|
|
283
|
-
}], copyCodeTooltips: [{
|
|
284
|
-
type: Input
|
|
285
|
-
}], toggleRawButton: [{
|
|
286
|
-
type: Input
|
|
287
|
-
}], rawToggleLabels: [{
|
|
288
|
-
type: Input
|
|
289
|
-
}], codeLang: [{
|
|
290
|
-
type: Input
|
|
291
|
-
}], lang: [{
|
|
292
|
-
type: Input
|
|
293
|
-
}], contentReady: [{
|
|
294
|
-
type: Output
|
|
295
|
-
}], highlightComp: [{
|
|
296
|
-
type: ViewChild,
|
|
297
|
-
args: ['highlightComponent']
|
|
298
|
-
}], copyComp: [{
|
|
299
|
-
type: ViewChild,
|
|
300
|
-
args: ['copyComponent']
|
|
301
|
-
}], tooltip: [{
|
|
302
|
-
type: ViewChild,
|
|
303
|
-
args: ['tooltip']
|
|
304
|
-
}] } });
|
|
305
|
-
|
|
306
|
-
class CovalentHighlightModule {
|
|
307
|
-
}
|
|
308
|
-
CovalentHighlightModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: CovalentHighlightModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
309
|
-
CovalentHighlightModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.5", ngImport: i0, type: CovalentHighlightModule, declarations: [TdHighlightComponent, TdCopyCodeButtonComponent], imports: [CommonModule,
|
|
310
|
-
ClipboardModule,
|
|
311
|
-
MatIconModule,
|
|
312
|
-
MatButtonToggleModule,
|
|
313
|
-
MatButtonModule,
|
|
314
|
-
MatTooltipModule,
|
|
315
|
-
MatButtonModule], exports: [TdHighlightComponent] });
|
|
316
|
-
CovalentHighlightModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: CovalentHighlightModule, imports: [CommonModule,
|
|
317
|
-
ClipboardModule,
|
|
318
|
-
MatIconModule,
|
|
319
|
-
MatButtonToggleModule,
|
|
320
|
-
MatButtonModule,
|
|
321
|
-
MatTooltipModule,
|
|
322
|
-
MatButtonModule] });
|
|
323
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.5", ngImport: i0, type: CovalentHighlightModule, decorators: [{
|
|
324
|
-
type: NgModule,
|
|
325
|
-
args: [{
|
|
326
|
-
imports: [
|
|
327
|
-
CommonModule,
|
|
328
|
-
ClipboardModule,
|
|
329
|
-
MatIconModule,
|
|
330
|
-
MatButtonToggleModule,
|
|
331
|
-
MatButtonModule,
|
|
332
|
-
MatTooltipModule,
|
|
333
|
-
MatButtonModule,
|
|
334
|
-
],
|
|
335
|
-
declarations: [TdHighlightComponent, TdCopyCodeButtonComponent],
|
|
336
|
-
exports: [TdHighlightComponent],
|
|
337
|
-
}]
|
|
338
|
-
}] });
|
|
339
|
-
|
|
340
|
-
/**
|
|
341
|
-
* Generated bundle index. Do not edit.
|
|
342
|
-
*/
|
|
343
|
-
|
|
344
|
-
export { CovalentHighlightModule, TdCopyCodeButtonComponent, TdHighlightComponent };
|
|
345
|
-
//# sourceMappingURL=covalent-highlight.mjs.map
|