valtech-components 2.0.284 → 2.0.288
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 +54 -14
- package/esm2022/lib/components/atoms/text/text.component.mjs +46 -10
- package/esm2022/lib/components/atoms/text/types.mjs +1 -1
- package/esm2022/lib/examples/custom-content-demo.component.mjs +291 -0
- package/esm2022/lib/examples/link-processing-example.component.mjs +139 -0
- package/esm2022/lib/services/lang-provider/content.mjs +1 -13
- package/esm2022/lib/services/lang-provider/lang-provider.service.mjs +7 -9
- package/esm2022/lib/services/link-processor.service.mjs +147 -0
- package/esm2022/lib/shared/pipes/process-links.pipe.mjs +69 -0
- package/esm2022/public-api.mjs +5 -4
- package/fesm2022/valtech-components.mjs +418 -935
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/atoms/text/text.component.d.ts +5 -1
- package/lib/components/atoms/text/types.d.ts +5 -0
- package/lib/examples/link-processing-example.component.d.ts +22 -0
- package/lib/services/lang-provider/lang-provider.service.d.ts +5 -7
- package/lib/services/link-processor.service.d.ts +92 -0
- package/lib/shared/pipes/process-links.pipe.d.ts +55 -0
- package/package.json +1 -1
- package/public-api.d.ts +4 -3
- package/esm2022/lib/components/_examples/custom-content-demo.component.mjs +0 -265
- package/esm2022/lib/components/_examples/global-content-example-content.mjs +0 -23
- package/esm2022/lib/components/_examples/global-content-example.component.mjs +0 -504
- package/esm2022/lib/components/_examples/reactive-content-example-content.mjs +0 -43
- package/esm2022/lib/components/_examples/reactive-content-example.component.mjs +0 -347
- package/esm2022/lib/services/lang-provider/components/theme-settings.mjs +0 -15
- package/lib/components/_examples/global-content-example-content.d.ts +0 -9
- package/lib/components/_examples/global-content-example.component.d.ts +0 -73
- package/lib/components/_examples/reactive-content-example-content.d.ts +0 -32
- package/lib/components/_examples/reactive-content-example.component.d.ts +0 -47
- package/lib/services/lang-provider/components/theme-settings.d.ts +0 -3
- /package/lib/{components/_examples → examples}/custom-content-demo.component.d.ts +0 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { TextComponent } from '../components/atoms/text/text.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* LinkProcessingExampleComponent - Componente de ejemplo que demuestra el procesamiento automático de enlaces.
|
|
6
|
+
*
|
|
7
|
+
* Este componente muestra diferentes casos de uso para el procesamiento automático de enlaces
|
|
8
|
+
* en el componente val-text, incluyendo enlaces externos, rutas internas y configuraciones personalizadas.
|
|
9
|
+
*
|
|
10
|
+
* @example Uso en template:
|
|
11
|
+
* ```html
|
|
12
|
+
* <val-link-processing-example></val-link-processing-example>
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export class LinkProcessingExampleComponent {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.basicTextProps = {
|
|
18
|
+
content: 'Este texto contiene https://angular.io y /dashboard pero no se procesan como enlaces.',
|
|
19
|
+
size: 'medium',
|
|
20
|
+
color: 'dark',
|
|
21
|
+
bold: false,
|
|
22
|
+
processLinks: false,
|
|
23
|
+
};
|
|
24
|
+
this.basicLinksProps = {
|
|
25
|
+
content: 'Visita https://angular.io para documentación o ve a /dashboard para el panel principal.',
|
|
26
|
+
size: 'medium',
|
|
27
|
+
color: 'dark',
|
|
28
|
+
bold: false,
|
|
29
|
+
processLinks: true,
|
|
30
|
+
};
|
|
31
|
+
this.customLinksProps = {
|
|
32
|
+
content: 'Enlaces personalizados: https://github.com/angular/angular y /profile/settings',
|
|
33
|
+
size: 'medium',
|
|
34
|
+
color: 'dark',
|
|
35
|
+
bold: false,
|
|
36
|
+
processLinks: true,
|
|
37
|
+
linkConfig: {
|
|
38
|
+
openExternalInNewTab: true,
|
|
39
|
+
openInternalInNewTab: false,
|
|
40
|
+
linkClass: 'custom-link-style',
|
|
41
|
+
externalLinkClass: 'external-custom',
|
|
42
|
+
internalLinkClass: 'internal-custom',
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
this.mixedLinksProps = {
|
|
46
|
+
content: 'Consulta la documentación en https://ionicframework.com/docs, revisa el código en https://github.com/ionic-team/ionic-framework, o navega a /components/buttons para ejemplos internos.',
|
|
47
|
+
size: 'medium',
|
|
48
|
+
color: 'dark',
|
|
49
|
+
bold: false,
|
|
50
|
+
processLinks: true,
|
|
51
|
+
linkConfig: {
|
|
52
|
+
openExternalInNewTab: true,
|
|
53
|
+
openInternalInNewTab: false,
|
|
54
|
+
linkClass: 'processed-link',
|
|
55
|
+
externalLinkClass: 'external-link',
|
|
56
|
+
internalLinkClass: 'internal-link',
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
this.sameTabLinksProps = {
|
|
60
|
+
content: 'Estos enlaces no abren en nueva pestaña: https://example.com y /home',
|
|
61
|
+
size: 'medium',
|
|
62
|
+
color: 'dark',
|
|
63
|
+
bold: false,
|
|
64
|
+
processLinks: true,
|
|
65
|
+
linkConfig: {
|
|
66
|
+
openExternalInNewTab: false,
|
|
67
|
+
openInternalInNewTab: false,
|
|
68
|
+
linkClass: 'same-tab-link',
|
|
69
|
+
externalLinkClass: 'external-same-tab',
|
|
70
|
+
internalLinkClass: 'internal-same-tab',
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
75
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LinkProcessingExampleComponent, isStandalone: true, selector: "val-link-processing-example", ngImport: i0, template: `
|
|
76
|
+
<div class="link-examples">
|
|
77
|
+
<h2>Ejemplos de Procesamiento de Enlaces</h2>
|
|
78
|
+
|
|
79
|
+
<div class="example-section">
|
|
80
|
+
<h3>Texto sin procesamiento de enlaces:</h3>
|
|
81
|
+
<val-text [props]="basicTextProps"></val-text>
|
|
82
|
+
</div>
|
|
83
|
+
|
|
84
|
+
<div class="example-section">
|
|
85
|
+
<h3>Texto con procesamiento básico de enlaces:</h3>
|
|
86
|
+
<val-text [props]="basicLinksProps"></val-text>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<div class="example-section">
|
|
90
|
+
<h3>Enlaces con configuración personalizada:</h3>
|
|
91
|
+
<val-text [props]="customLinksProps"></val-text>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<div class="example-section">
|
|
95
|
+
<h3>Enlaces internos y externos mezclados:</h3>
|
|
96
|
+
<val-text [props]="mixedLinksProps"></val-text>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div class="example-section">
|
|
100
|
+
<h3>Enlaces sin abrir en nueva pestaña:</h3>
|
|
101
|
+
<val-text [props]="sameTabLinksProps"></val-text>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
104
|
+
`, isInline: true, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"], dependencies: [{ kind: "component", type: TextComponent, selector: "val-text", inputs: ["props"] }] }); }
|
|
105
|
+
}
|
|
106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessingExampleComponent, decorators: [{
|
|
107
|
+
type: Component,
|
|
108
|
+
args: [{ selector: 'val-link-processing-example', standalone: true, imports: [TextComponent], template: `
|
|
109
|
+
<div class="link-examples">
|
|
110
|
+
<h2>Ejemplos de Procesamiento de Enlaces</h2>
|
|
111
|
+
|
|
112
|
+
<div class="example-section">
|
|
113
|
+
<h3>Texto sin procesamiento de enlaces:</h3>
|
|
114
|
+
<val-text [props]="basicTextProps"></val-text>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="example-section">
|
|
118
|
+
<h3>Texto con procesamiento básico de enlaces:</h3>
|
|
119
|
+
<val-text [props]="basicLinksProps"></val-text>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<div class="example-section">
|
|
123
|
+
<h3>Enlaces con configuración personalizada:</h3>
|
|
124
|
+
<val-text [props]="customLinksProps"></val-text>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div class="example-section">
|
|
128
|
+
<h3>Enlaces internos y externos mezclados:</h3>
|
|
129
|
+
<val-text [props]="mixedLinksProps"></val-text>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<div class="example-section">
|
|
133
|
+
<h3>Enlaces sin abrir en nueva pestaña:</h3>
|
|
134
|
+
<val-text [props]="sameTabLinksProps"></val-text>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
`, styles: [".link-examples{padding:20px;max-width:800px}.example-section{margin-bottom:24px;padding:16px;border:1px solid var(--ion-color-light, #f4f5f8);border-radius:8px;background:var(--ion-color-light-tint, #f5f6f9)}h2{color:var(--ion-color-primary, #3880ff);margin-bottom:20px}h3{color:var(--ion-color-dark, #222428);margin-bottom:10px;font-size:16px}\n"] }]
|
|
138
|
+
}] });
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvZXhhbXBsZXMvbGluay1wcm9jZXNzaW5nLWV4YW1wbGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDOztBQUV4RTs7Ozs7Ozs7OztHQVVHO0FBK0RILE1BQU0sT0FBTyw4QkFBOEI7SUE5RDNDO1FBK0RFLG1CQUFjLEdBQWlCO1lBQzdCLE9BQU8sRUFBRSx1RkFBdUY7WUFDaEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLEtBQUs7U0FDcEIsQ0FBQztRQUVGLG9CQUFlLEdBQWlCO1lBQzlCLE9BQU8sRUFBRSx5RkFBeUY7WUFDbEcsSUFBSSxFQUFFLFFBQVE7WUFDZCxLQUFLLEVBQUUsTUFBTTtZQUNiLElBQUksRUFBRSxLQUFLO1lBQ1gsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQztRQUVGLHFCQUFnQixHQUFpQjtZQUMvQixPQUFPLEVBQUUsZ0ZBQWdGO1lBQ3pGLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsbUJBQW1CO2dCQUM5QixpQkFBaUIsRUFBRSxpQkFBaUI7Z0JBQ3BDLGlCQUFpQixFQUFFLGlCQUFpQjthQUNyQztTQUNGLENBQUM7UUFFRixvQkFBZSxHQUFpQjtZQUM5QixPQUFPLEVBQ0wseUxBQXlMO1lBQzNMLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZ0JBQWdCO2dCQUMzQixpQkFBaUIsRUFBRSxlQUFlO2dCQUNsQyxpQkFBaUIsRUFBRSxlQUFlO2FBQ25DO1NBQ0YsQ0FBQztRQUVGLHNCQUFpQixHQUFpQjtZQUNoQyxPQUFPLEVBQUUsc0VBQXNFO1lBQy9FLElBQUksRUFBRSxRQUFRO1lBQ2QsS0FBSyxFQUFFLE1BQU07WUFDYixJQUFJLEVBQUUsS0FBSztZQUNYLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRTtnQkFDVixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixvQkFBb0IsRUFBRSxLQUFLO2dCQUMzQixTQUFTLEVBQUUsZUFBZTtnQkFDMUIsaUJBQWlCLEVBQUUsbUJBQW1CO2dCQUN0QyxpQkFBaUIsRUFBRSxtQkFBbUI7YUFDdkM7U0FDRixDQUFDO0tBQ0g7K0dBOURZLDhCQUE4QjttR0FBOUIsOEJBQThCLHVGQTFEL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJULG9hQTlCUyxhQUFhOzs0RkEyRFosOEJBQThCO2tCQTlEMUMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQLENBQUMsYUFBYSxDQUFDLFlBQ2Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9hdG9tcy90ZXh0L3RleHQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRNZXRhZGF0YSB9IGZyb20gJy4uL2NvbXBvbmVudHMvYXRvbXMvdGV4dC90eXBlcyc7XG4vKipcbiAqIExpbmtQcm9jZXNzaW5nRXhhbXBsZUNvbXBvbmVudCAtIENvbXBvbmVudGUgZGUgZWplbXBsbyBxdWUgZGVtdWVzdHJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlcy5cbiAqXG4gKiBFc3RlIGNvbXBvbmVudGUgbXVlc3RyYSBkaWZlcmVudGVzIGNhc29zIGRlIHVzbyBwYXJhIGVsIHByb2Nlc2FtaWVudG8gYXV0b23DoXRpY28gZGUgZW5sYWNlc1xuICogZW4gZWwgY29tcG9uZW50ZSB2YWwtdGV4dCwgaW5jbHV5ZW5kbyBlbmxhY2VzIGV4dGVybm9zLCBydXRhcyBpbnRlcm5hcyB5IGNvbmZpZ3VyYWNpb25lcyBwZXJzb25hbGl6YWRhcy5cbiAqXG4gKiBAZXhhbXBsZSBVc28gZW4gdGVtcGxhdGU6XG4gKiBgYGBodG1sXG4gKiA8dmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPjwvdmFsLWxpbmstcHJvY2Vzc2luZy1leGFtcGxlPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1saW5rLXByb2Nlc3NpbmctZXhhbXBsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtUZXh0Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwibGluay1leGFtcGxlc1wiPlxuICAgICAgPGgyPkVqZW1wbG9zIGRlIFByb2Nlc2FtaWVudG8gZGUgRW5sYWNlczwvaDI+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJleGFtcGxlLXNlY3Rpb25cIj5cbiAgICAgICAgPGgzPlRleHRvIHNpbiBwcm9jZXNhbWllbnRvIGRlIGVubGFjZXM6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJiYXNpY1RleHRQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+VGV4dG8gY29uIHByb2Nlc2FtaWVudG8gYsOhc2ljbyBkZSBlbmxhY2VzOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiYmFzaWNMaW5rc1Byb3BzXCI+PC92YWwtdGV4dD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiZXhhbXBsZS1zZWN0aW9uXCI+XG4gICAgICAgIDxoMz5FbmxhY2VzIGNvbiBjb25maWd1cmFjacOzbiBwZXJzb25hbGl6YWRhOjwvaDM+XG4gICAgICAgIDx2YWwtdGV4dCBbcHJvcHNdPVwiY3VzdG9tTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBpbnRlcm5vcyB5IGV4dGVybm9zIG1lemNsYWRvczo8L2gzPlxuICAgICAgICA8dmFsLXRleHQgW3Byb3BzXT1cIm1peGVkTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cImV4YW1wbGUtc2VjdGlvblwiPlxuICAgICAgICA8aDM+RW5sYWNlcyBzaW4gYWJyaXIgZW4gbnVldmEgcGVzdGHDsWE6PC9oMz5cbiAgICAgICAgPHZhbC10ZXh0IFtwcm9wc109XCJzYW1lVGFiTGlua3NQcm9wc1wiPjwvdmFsLXRleHQ+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmxpbmstZXhhbXBsZXMge1xuICAgICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgICBtYXgtd2lkdGg6IDgwMHB4O1xuICAgICAgfVxuXG4gICAgICAuZXhhbXBsZS1zZWN0aW9uIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgICAgICAgcGFkZGluZzogMTZweDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItbGlnaHQtdGludCwgI2Y1ZjZmOSk7XG4gICAgICB9XG5cbiAgICAgIGgyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5LCAjMzg4MGZmKTtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbiAgICAgIH1cblxuICAgICAgaDMge1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLWRhcmssICMyMjI0MjgpO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4O1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlua1Byb2Nlc3NpbmdFeGFtcGxlQ29tcG9uZW50IHtcbiAgYmFzaWNUZXh0UHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0ZSB0ZXh0byBjb250aWVuZSBodHRwczovL2FuZ3VsYXIuaW8geSAvZGFzaGJvYXJkIHBlcm8gbm8gc2UgcHJvY2VzYW4gY29tbyBlbmxhY2VzLicsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IGZhbHNlLFxuICB9O1xuXG4gIGJhc2ljTGlua3NQcm9wczogVGV4dE1ldGFkYXRhID0ge1xuICAgIGNvbnRlbnQ6ICdWaXNpdGEgaHR0cHM6Ly9hbmd1bGFyLmlvIHBhcmEgZG9jdW1lbnRhY2nDs24gbyB2ZSBhIC9kYXNoYm9hcmQgcGFyYSBlbCBwYW5lbCBwcmluY2lwYWwuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgfTtcblxuICBjdXN0b21MaW5rc1Byb3BzOiBUZXh0TWV0YWRhdGEgPSB7XG4gICAgY29udGVudDogJ0VubGFjZXMgcGVyc29uYWxpemFkb3M6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIgeSAvcHJvZmlsZS9zZXR0aW5ncycsXG4gICAgc2l6ZTogJ21lZGl1bScsXG4gICAgY29sb3I6ICdkYXJrJyxcbiAgICBib2xkOiBmYWxzZSxcbiAgICBwcm9jZXNzTGlua3M6IHRydWUsXG4gICAgbGlua0NvbmZpZzoge1xuICAgICAgb3BlbkV4dGVybmFsSW5OZXdUYWI6IHRydWUsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdjdXN0b20tbGluay1zdHlsZScsXG4gICAgICBleHRlcm5hbExpbmtDbGFzczogJ2V4dGVybmFsLWN1c3RvbScsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWN1c3RvbScsXG4gICAgfSxcbiAgfTtcblxuICBtaXhlZExpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OlxuICAgICAgJ0NvbnN1bHRhIGxhIGRvY3VtZW50YWNpw7NuIGVuIGh0dHBzOi8vaW9uaWNmcmFtZXdvcmsuY29tL2RvY3MsIHJldmlzYSBlbCBjw7NkaWdvIGVuIGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2lvbmljLWZyYW1ld29yaywgbyBuYXZlZ2EgYSAvY29tcG9uZW50cy9idXR0b25zIHBhcmEgZWplbXBsb3MgaW50ZXJub3MuJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogdHJ1ZSxcbiAgICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAgICAgIGxpbmtDbGFzczogJ3Byb2Nlc3NlZC1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtbGluaycsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsLWxpbmsnLFxuICAgIH0sXG4gIH07XG5cbiAgc2FtZVRhYkxpbmtzUHJvcHM6IFRleHRNZXRhZGF0YSA9IHtcbiAgICBjb250ZW50OiAnRXN0b3MgZW5sYWNlcyBubyBhYnJlbiBlbiBudWV2YSBwZXN0YcOxYTogaHR0cHM6Ly9leGFtcGxlLmNvbSB5IC9ob21lJyxcbiAgICBzaXplOiAnbWVkaXVtJyxcbiAgICBjb2xvcjogJ2RhcmsnLFxuICAgIGJvbGQ6IGZhbHNlLFxuICAgIHByb2Nlc3NMaW5rczogdHJ1ZSxcbiAgICBsaW5rQ29uZmlnOiB7XG4gICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBvcGVuSW50ZXJuYWxJbk5ld1RhYjogZmFsc2UsXG4gICAgICBsaW5rQ2xhc3M6ICdzYW1lLXRhYi1saW5rJyxcbiAgICAgIGV4dGVybmFsTGlua0NsYXNzOiAnZXh0ZXJuYWwtc2FtZS10YWInLFxuICAgICAgaW50ZXJuYWxMaW5rQ2xhc3M6ICdpbnRlcm5hbC1zYW1lLXRhYicsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
import GlobalContentExample from '../../components/_examples/global-content-example-content';
|
|
2
|
-
import ReactiveContentExample from '../../components/_examples/reactive-content-example-content';
|
|
3
1
|
import LangSettings from './components/lang-settings';
|
|
4
|
-
import ThemeSettings from './components/theme-settings';
|
|
5
2
|
import { TextContent } from './types';
|
|
6
3
|
/**
|
|
7
4
|
* Global content that can be used across all components.
|
|
@@ -40,9 +37,6 @@ const globalContentData = {
|
|
|
40
37
|
areYouSure: '¿Estás seguro?',
|
|
41
38
|
deleteConfirmation: '¿Estás seguro de que deseas eliminar {itemName}?',
|
|
42
39
|
unsavedChanges: 'Tienes cambios sin guardar. ¿Deseas continuar?',
|
|
43
|
-
// Common form labels
|
|
44
|
-
required: 'Requerido',
|
|
45
|
-
optional: 'Opcional',
|
|
46
40
|
// Common placeholders
|
|
47
41
|
searchPlaceholder: 'Buscar...',
|
|
48
42
|
},
|
|
@@ -77,9 +71,6 @@ const globalContentData = {
|
|
|
77
71
|
areYouSure: 'Are you sure?',
|
|
78
72
|
deleteConfirmation: 'Are you sure you want to delete {itemName}?',
|
|
79
73
|
unsavedChanges: 'You have unsaved changes. Do you want to continue?',
|
|
80
|
-
// Common form labels
|
|
81
|
-
required: 'Required',
|
|
82
|
-
optional: 'Optional',
|
|
83
74
|
// Common placeholders
|
|
84
75
|
searchPlaceholder: 'Search...',
|
|
85
76
|
},
|
|
@@ -88,11 +79,8 @@ const GlobalContent = new TextContent(globalContentData);
|
|
|
88
79
|
const content = {
|
|
89
80
|
_global: GlobalContent,
|
|
90
81
|
LangSettings,
|
|
91
|
-
ThemeSettings,
|
|
92
|
-
ReactiveContentExample,
|
|
93
|
-
GlobalContentExample,
|
|
94
82
|
};
|
|
95
83
|
export default content;
|
|
96
84
|
// Export named exports for user convenience
|
|
97
85
|
export { content, GlobalContent, globalContentData };
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xhbmctcHJvdmlkZXIvY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFlBQVksTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQW9CLFdBQVcsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQU14RDs7OztHQUlHO0FBQ0gsTUFBTSxpQkFBaUIsR0FBcUI7SUFDMUMsRUFBRSxFQUFFO1FBQ0YsaUJBQWlCO1FBQ2pCLEVBQUUsRUFBRSxTQUFTO1FBQ2IsTUFBTSxFQUFFLFVBQVU7UUFDbEIsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsVUFBVTtRQUNsQixJQUFJLEVBQUUsUUFBUTtRQUNkLEtBQUssRUFBRSxRQUFRO1FBQ2YsSUFBSSxFQUFFLFFBQVE7UUFDZCxJQUFJLEVBQUUsV0FBVztRQUNqQixRQUFRLEVBQUUsVUFBVTtRQUNwQixNQUFNLEVBQUUsV0FBVztRQUNuQixRQUFRLEVBQUUsV0FBVztRQUVyQixpQkFBaUI7UUFDakIsR0FBRyxFQUFFLFNBQVM7UUFDZCxNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsUUFBUTtRQUNoQixNQUFNLEVBQUUsU0FBUztRQUNqQixJQUFJLEVBQUUsU0FBUztRQUNmLE9BQU8sRUFBRSxZQUFZO1FBRXJCLDZCQUE2QjtRQUM3QixPQUFPLEVBQUUsYUFBYTtRQUN0QixNQUFNLEVBQUUsMEJBQTBCO1FBQ2xDLEtBQUssRUFBRSxPQUFPO1FBQ2QsT0FBTyxFQUFFLE9BQU87UUFDaEIsT0FBTyxFQUFFLGFBQWE7UUFDdEIsSUFBSSxFQUFFLGFBQWE7UUFFbkIsdUJBQXVCO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsa0JBQWtCLEVBQUUsa0RBQWtEO1FBQ3RFLGNBQWMsRUFBRSxnREFBZ0Q7UUFFaEUsc0JBQXNCO1FBQ3RCLGlCQUFpQixFQUFFLFdBQVc7S0FDL0I7SUFDRCxFQUFFLEVBQUU7UUFDRixpQkFBaUI7UUFDakIsRUFBRSxFQUFFLElBQUk7UUFDUixNQUFNLEVBQUUsUUFBUTtRQUNoQixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLElBQUksRUFBRSxNQUFNO1FBQ1osS0FBSyxFQUFFLE9BQU87UUFDZCxJQUFJLEVBQUUsTUFBTTtRQUNaLElBQUksRUFBRSxNQUFNO1FBQ1osUUFBUSxFQUFFLFVBQVU7UUFDcEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsUUFBUSxFQUFFLFVBQVU7UUFFcEIsaUJBQWlCO1FBQ2pCLEdBQUcsRUFBRSxLQUFLO1FBQ1YsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsTUFBTSxFQUFFLFFBQVE7UUFDaEIsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsU0FBUztRQUVsQiw2QkFBNkI7UUFDN0IsT0FBTyxFQUFFLFlBQVk7UUFDckIsTUFBTSxFQUFFLG1CQUFtQjtRQUMzQixLQUFLLEVBQUUsT0FBTztRQUNkLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLElBQUksRUFBRSxhQUFhO1FBRW5CLHVCQUF1QjtRQUN2QixVQUFVLEVBQUUsZUFBZTtRQUMzQixrQkFBa0IsRUFBRSw2Q0FBNkM7UUFDakUsY0FBYyxFQUFFLG9EQUFvRDtRQUVwRSxzQkFBc0I7UUFDdEIsaUJBQWlCLEVBQUUsV0FBVztLQUMvQjtDQUNGLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBRXpELE1BQU0sT0FBTyxHQUFhO0lBQ3hCLE9BQU8sRUFBRSxhQUFhO0lBQ3RCLFlBQVk7Q0FDYixDQUFDO0FBRUYsZUFBZSxPQUFPLENBQUM7QUFFdkIsNENBQTRDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGFuZ1NldHRpbmdzIGZyb20gJy4vY29tcG9uZW50cy9sYW5nLXNldHRpbmdzJztcbmltcG9ydCB7IExhbmd1YWdlc0NvbnRlbnQsIFRleHRDb250ZW50IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlkZXIge1xuICBbeDogc3RyaW5nXTogVGV4dENvbnRlbnQ7XG59XG5cbi8qKlxuICogR2xvYmFsIGNvbnRlbnQgdGhhdCBjYW4gYmUgdXNlZCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMuXG4gKiBUaGVzZSBhcmUgY29tbW9uIHRleHRzIGxpa2UgYnV0dG9ucywgYWN0aW9ucywgc3RhdGVzLCBldGMuXG4gKiBTdHJ1Y3R1cmU6IHtlczoge2tleTE6ICd2YWx1ZTEnLCBrZXkyOiAndmFsdWUyJ30sIGVuOiB7a2V5MTogJ3ZhbHVlMScsIGtleTI6ICd2YWx1ZTInfX1cbiAqL1xuY29uc3QgZ2xvYmFsQ29udGVudERhdGE6IExhbmd1YWdlc0NvbnRlbnQgPSB7XG4gIGVzOiB7XG4gICAgLy8gQ29tbW9uIGJ1dHRvbnNcbiAgICBvazogJ0FjZXB0YXInLFxuICAgIGNhbmNlbDogJ0NhbmNlbGFyJyxcbiAgICBzYXZlOiAnR3VhcmRhcicsXG4gICAgZGVsZXRlOiAnRWxpbWluYXInLFxuICAgIGVkaXQ6ICdFZGl0YXInLFxuICAgIGNsb3NlOiAnQ2VycmFyJyxcbiAgICBiYWNrOiAnVm9sdmVyJyxcbiAgICBuZXh0OiAnU2lndWllbnRlJyxcbiAgICBwcmV2aW91czogJ0FudGVyaW9yJyxcbiAgICBmaW5pc2g6ICdGaW5hbGl6YXInLFxuICAgIGNvbnRpbnVlOiAnQ29udGludWFyJyxcblxuICAgIC8vIENvbW1vbiBhY3Rpb25zXG4gICAgYWRkOiAnQWdyZWdhcicsXG4gICAgcmVtb3ZlOiAnUXVpdGFyJyxcbiAgICBzZWFyY2g6ICdCdXNjYXInLFxuICAgIGZpbHRlcjogJ0ZpbHRyYXInLFxuICAgIHNvcnQ6ICdPcmRlbmFyJyxcbiAgICByZWZyZXNoOiAnQWN0dWFsaXphcicsXG5cbiAgICAvLyBDb21tb24gc3RhdGVzIGFuZCBtZXNzYWdlc1xuICAgIGxvYWRpbmc6ICdDYXJnYW5kby4uLicsXG4gICAgbm9EYXRhOiAnTm8gaGF5IGRhdG9zIGRpc3BvbmlibGVzJyxcbiAgICBlcnJvcjogJ0Vycm9yJyxcbiAgICBzdWNjZXNzOiAnw4l4aXRvJyxcbiAgICB3YXJuaW5nOiAnQWR2ZXJ0ZW5jaWEnLFxuICAgIGluZm86ICdJbmZvcm1hY2nDs24nLFxuXG4gICAgLy8gQ29tbW9uIGNvbmZpcm1hdGlvbnNcbiAgICBhcmVZb3VTdXJlOiAnwr9Fc3TDoXMgc2VndXJvPycsXG4gICAgZGVsZXRlQ29uZmlybWF0aW9uOiAnwr9Fc3TDoXMgc2VndXJvIGRlIHF1ZSBkZXNlYXMgZWxpbWluYXIge2l0ZW1OYW1lfT8nLFxuICAgIHVuc2F2ZWRDaGFuZ2VzOiAnVGllbmVzIGNhbWJpb3Mgc2luIGd1YXJkYXIuIMK/RGVzZWFzIGNvbnRpbnVhcj8nLFxuXG4gICAgLy8gQ29tbW9uIHBsYWNlaG9sZGVyc1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnQnVzY2FyLi4uJyxcbiAgfSxcbiAgZW46IHtcbiAgICAvLyBDb21tb24gYnV0dG9uc1xuICAgIG9rOiAnT0snLFxuICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gICAgc2F2ZTogJ1NhdmUnLFxuICAgIGRlbGV0ZTogJ0RlbGV0ZScsXG4gICAgZWRpdDogJ0VkaXQnLFxuICAgIGNsb3NlOiAnQ2xvc2UnLFxuICAgIGJhY2s6ICdCYWNrJyxcbiAgICBuZXh0OiAnTmV4dCcsXG4gICAgcHJldmlvdXM6ICdQcmV2aW91cycsXG4gICAgZmluaXNoOiAnRmluaXNoJyxcbiAgICBjb250aW51ZTogJ0NvbnRpbnVlJyxcblxuICAgIC8vIENvbW1vbiBhY3Rpb25zXG4gICAgYWRkOiAnQWRkJyxcbiAgICByZW1vdmU6ICdSZW1vdmUnLFxuICAgIHNlYXJjaDogJ1NlYXJjaCcsXG4gICAgZmlsdGVyOiAnRmlsdGVyJyxcbiAgICBzb3J0OiAnU29ydCcsXG4gICAgcmVmcmVzaDogJ1JlZnJlc2gnLFxuXG4gICAgLy8gQ29tbW9uIHN0YXRlcyBhbmQgbWVzc2FnZXNcbiAgICBsb2FkaW5nOiAnTG9hZGluZy4uLicsXG4gICAgbm9EYXRhOiAnTm8gZGF0YSBhdmFpbGFibGUnLFxuICAgIGVycm9yOiAnRXJyb3InLFxuICAgIHN1Y2Nlc3M6ICdTdWNjZXNzJyxcbiAgICB3YXJuaW5nOiAnV2FybmluZycsXG4gICAgaW5mbzogJ0luZm9ybWF0aW9uJyxcblxuICAgIC8vIENvbW1vbiBjb25maXJtYXRpb25zXG4gICAgYXJlWW91U3VyZTogJ0FyZSB5b3Ugc3VyZT8nLFxuICAgIGRlbGV0ZUNvbmZpcm1hdGlvbjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUge2l0ZW1OYW1lfT8nLFxuICAgIHVuc2F2ZWRDaGFuZ2VzOiAnWW91IGhhdmUgdW5zYXZlZCBjaGFuZ2VzLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8nLFxuXG4gICAgLy8gQ29tbW9uIHBsYWNlaG9sZGVyc1xuICAgIHNlYXJjaFBsYWNlaG9sZGVyOiAnU2VhcmNoLi4uJyxcbiAgfSxcbn07XG5cbmNvbnN0IEdsb2JhbENvbnRlbnQgPSBuZXcgVGV4dENvbnRlbnQoZ2xvYmFsQ29udGVudERhdGEpO1xuXG5jb25zdCBjb250ZW50OiBQcm92aWRlciA9IHtcbiAgX2dsb2JhbDogR2xvYmFsQ29udGVudCxcbiAgTGFuZ1NldHRpbmdzLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgY29udGVudDtcblxuLy8gRXhwb3J0IG5hbWVkIGV4cG9ydHMgZm9yIHVzZXIgY29udmVuaWVuY2VcbmV4cG9ydCB7IGNvbnRlbnQsIEdsb2JhbENvbnRlbnQsIGdsb2JhbENvbnRlbnREYXRhIH07XG4iXX0=
|
|
@@ -39,7 +39,7 @@ export class LangService {
|
|
|
39
39
|
}
|
|
40
40
|
/**
|
|
41
41
|
* Observable that emits the current language whenever it changes.
|
|
42
|
-
* Use this to
|
|
42
|
+
* Use this to subscribe to language changes in components.
|
|
43
43
|
*/
|
|
44
44
|
get currentLang$() {
|
|
45
45
|
return this.selectedLang.asObservable().pipe(distinctUntilChanged());
|
|
@@ -51,8 +51,8 @@ export class LangService {
|
|
|
51
51
|
return this.selectedLang.value;
|
|
52
52
|
}
|
|
53
53
|
/**
|
|
54
|
-
* Set the current language and persist it to
|
|
55
|
-
* This will trigger updates in all
|
|
54
|
+
* Set the current language and persist it to localStorage.
|
|
55
|
+
* This will trigger updates in all reactive content subscriptions.
|
|
56
56
|
*
|
|
57
57
|
* @param lang - The language to set
|
|
58
58
|
*/
|
|
@@ -61,17 +61,15 @@ export class LangService {
|
|
|
61
61
|
LocalStorageService.set(LANG, lang);
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Get
|
|
64
|
+
* Get content for a component class and key (legacy method).
|
|
65
65
|
*
|
|
66
|
-
* @param className - The component class name
|
|
67
|
-
* @returns The language text object for the current language
|
|
68
66
|
* @deprecated Use getText() or getContent() for better type safety
|
|
69
67
|
*/
|
|
70
68
|
Text(className) {
|
|
71
|
-
return this.content[className]
|
|
69
|
+
return this.content[className].Content[this.selectedLang.value];
|
|
72
70
|
}
|
|
73
71
|
/**
|
|
74
|
-
* Get a
|
|
72
|
+
* Get a single content string synchronously for the current language.
|
|
75
73
|
*
|
|
76
74
|
* @param className - The component class name
|
|
77
75
|
* @param key - The text key
|
|
@@ -146,4 +144,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
146
144
|
type: Inject,
|
|
147
145
|
args: [ValtechConfigService]
|
|
148
146
|
}] }] });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZy1wcm92aWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxTQUFTLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBSUgsTUFBTSxPQUFPLFdBQVc7SUFNdEIsWUFBMEMsTUFBcUI7UUFKdkQsWUFBTyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFLOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFhLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWEsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxZ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QVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQzdDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxJQUFJLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFnQjtRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7K0dBL0hVLFdBQVcsa0JBTUYsb0JBQW9CO21IQU43QixXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU9jLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExBTkcgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzL3N0b3JhZ2UnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2xvY2FsLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBWYWx0ZWNoQ29uZmlnLCBWYWx0ZWNoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnLi9jb250ZW50JztcbmltcG9ydCB7IExhbmdPcHRpb24sIExhbmd1YWdlVGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIExhbmdTZXJ2aWNlIC0gUmVhY3RpdmUgbGFuZ3VhZ2UgYW5kIGNvbnRlbnQgbWFuYWdlbWVudCBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyByZWFjdGl2ZSBjb250ZW50IG1hbmFnZW1lbnQgd2l0aCBPYnNlcnZhYmxlLWJhc2VkIGxhbmd1YWdlIHN3aXRjaGluZy5cbiAqIENvbXBvbmVudHMgY2FuIHN1YnNjcmliZSB0byBjb250ZW50IGNoYW5nZXMgYW5kIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHdoZW4gdGhlIGxhbmd1YWdlIGNoYW5nZXMuXG4gKlxuICogQGV4YW1wbGUgQmFzaWMgdXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSkge31cbiAqXG4gKiAvLyBHZXQgY3VycmVudCBsYW5ndWFnZVxuICogY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byBsYW5ndWFnZSBjaGFuZ2VzXG4gKiB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nJC5zdWJzY3JpYmUobGFuZyA9PiBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY2hhbmdlZDonLCBsYW5nKSk7XG4gKlxuICogLy8gR2V0IHN0YXRpYyB0ZXh0XG4gKiBjb25zdCB0ZXh0ID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdDb21wb25lbnROYW1lJywgJ3RleHRLZXknKTtcbiAqXG4gKiAvLyBHZXQgcmVhY3RpdmUgdGV4dFxuICogY29uc3QgdGV4dCQgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldENvbnRlbnQoJ0NvbXBvbmVudE5hbWUnLCAndGV4dEtleScpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMYW5nU2VydmljZSB7XG4gIHByaXZhdGUgY29udGVudDogUHJvdmlkZXI7XG4gIHByaXZhdGUgZGVmYXVsdCA9IExhbmdPcHRpb24uRVM7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYW5nOiBCZWhhdmlvclN1YmplY3Q8TGFuZ09wdGlvbj47XG4gIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoVmFsdGVjaENvbmZpZ1NlcnZpY2UpIGNvbmZpZzogVmFsdGVjaENvbmZpZykge1xuICAgIGNvbnNvbGUubG9nKCdpbmplY3RlZCBjb25maWc6ICcsIGNvbmZpZyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgY29uc3QgY3VycmVudCA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0PExhbmdPcHRpb24+KExBTkcpO1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYW5nT3B0aW9uPihjdXJyZW50IHx8IHRoaXMuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHdoZW5ldmVyIGl0IGNoYW5nZXMuXG4gICAqIFVzZSB0aGlzIHRvIHJlYWN0IHRvIGxhbmd1YWdlIGNoYW5nZXMgaW4gY29tcG9uZW50cy5cbiAgICovXG4gIGdldCBjdXJyZW50TGFuZyQoKTogT2JzZXJ2YWJsZTxMYW5nT3B0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYW5nLmFzT2JzZXJ2YWJsZSgpLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IGxhbmd1YWdlIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBnZXQgY3VycmVudExhbmcoKTogTGFuZ09wdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBsYW5ndWFnZSBhbmQgcGVyc2lzdCBpdCB0byBsb2NhbCBzdG9yYWdlLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB1cGRhdGVzIGluIGFsbCBjb21wb25lbnRzIHN1YnNjcmliZWQgdG8gcmVhY3RpdmUgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIGxhbmcgLSBUaGUgbGFuZ3VhZ2UgdG8gc2V0XG4gICAqL1xuICBzZXRMYW5nKGxhbmc6IExhbmdPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkTGFuZy5uZXh0KGxhbmcpO1xuICAgIExvY2FsU3RvcmFnZVNlcnZpY2Uuc2V0PExhbmdPcHRpb24+KExBTkcsIGxhbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGV4dCBjb250ZW50IGZvciBhIGNvbXBvbmVudCBjbGFzcyAobGVnYWN5IG1ldGhvZCBmb3IgY29tcGF0aWJpbGl0eSkuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHJldHVybnMgVGhlIGxhbmd1YWdlIHRleHQgb2JqZWN0IGZvciB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgKiBAZGVwcmVjYXRlZCBVc2UgZ2V0VGV4dCgpIG9yIGdldENvbnRlbnQoKSBmb3IgYmV0dGVyIHR5cGUgc2FmZXR5XG4gICAqL1xuICBUZXh0KGNsYXNzTmFtZTogc3RyaW5nKTogTGFuZ3VhZ2VUZXh0IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50W2NsYXNzTmFtZV0/LkNvbnRlbnRbdGhpcy5zZWxlY3RlZExhbmcudmFsdWVdIHx8IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNwZWNpZmljIHRleHQgdmFsdWUgc3luY2hyb25vdXNseSBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBPcHRpb25hbCBmYWxsYmFjayB0ZXh0IGlmIGtleSBpcyBub3QgZm91bmRcbiAgICogQHJldHVybnMgVGhlIHRleHQgc3RyaW5nIG9yIGZhbGxiYWNrXG4gICAqL1xuICBnZXRUZXh0KGNsYXNzTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W3RoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlXTtcbiAgICByZXR1cm4gY2xhc3NDb250ZW50Py5ba2V5XSB8fCBmYWxsYmFjayB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWFjdGl2ZSBPYnNlcnZhYmxlIGZvciBhIHNwZWNpZmljIHRleHQga2V5IHRoYXQgdXBkYXRlcyB3aGVuIGxhbmd1YWdlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBmb3IgY29tcG9uZW50cyB0aGF0IG5lZWQgcmVhY3RpdmUgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHRleHQga2V5XG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIE9wdGlvbmFsIGZhbGxiYWNrIHRleHQgaWYga2V5IGlzIG5vdCBmb3VuZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHRleHQgc3RyaW5nIHdoZW5ldmVyIGxhbmd1YWdlIGNoYW5nZXNcbiAgICovXG4gIGdldENvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmckLnBpcGUoXG4gICAgICBtYXAobGFuZyA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W2xhbmddO1xuICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50Py5ba2V5XSB8fCBmYWxsYmFjayB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlYWN0aXZlIGNvbnRlbnQgZm9yIG11bHRpcGxlIGtleXMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIHRleHQga2V5cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggYWxsIHJlcXVlc3RlZCBrZXlzXG4gICAqL1xuICBnZXRNdWx0aXBsZUNvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmckLnBpcGUoXG4gICAgICBtYXAobGFuZyA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W2xhbmddIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBjbGFzc0NvbnRlbnRba2V5XSB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2KSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbnRlbnQga2V5IGV4aXN0cyBmb3IgYSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBrZXkgZXhpc3RzIGluIGFueSBsYW5ndWFnZVxuICAgKi9cbiAgaGFzQ29udGVudChjbGFzc05hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSB0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXTtcbiAgICBpZiAoIWNsYXNzQ29udGVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY2xhc3NDb250ZW50LkNvbnRlbnQpLnNvbWUoXG4gICAgICBsYW5nQ29udGVudCA9PiBsYW5nQ29udGVudCAmJiB0eXBlb2YgbGFuZ0NvbnRlbnRba2V5XSA9PT0gJ3N0cmluZydcbiAgICApO1xuICB9XG5cbiAgLy8gTGVnYWN5IGdldHRlcnMvc2V0dGVycyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBnZXQgTGFuZygpOiBMYW5nT3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGFuZztcbiAgfVxuXG4gIHNldCBMYW5nKGxhbmc6IExhbmdPcHRpb24pIHtcbiAgICB0aGlzLnNldExhbmcobGFuZyk7XG4gIH1cbn1cbiJdfQ==
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZy1wcm92aWRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvc2VydmljZXMvbGFuZy1wcm92aWRlci9sYW5nLXByb3ZpZGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBYyxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDOUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9ELE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxTQUFTLENBQUM7O0FBRW5EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBSUgsTUFBTSxPQUFPLFdBQVc7SUFNdEIsWUFBMEMsTUFBcUI7UUFKdkQsWUFBTyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFLOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDOUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFhLElBQUksQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxlQUFlLENBQWEsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxZ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LENBQUMsQ0FBQyxJQUFJLENBQzdDLFdBQVcsQ0FBQyxFQUFFLENBQUMsV0FBVyxJQUFJLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FDbkUsQ0FBQztJQUNKLENBQUM7SUFFRCxvREFBb0Q7SUFDcEQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLElBQUksQ0FBQyxJQUFnQjtRQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JCLENBQUM7K0dBN0hVLFdBQVcsa0JBTUYsb0JBQW9CO21IQU43QixXQUFXLGNBRlYsTUFBTTs7NEZBRVAsV0FBVztrQkFIdkIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQU9jLE1BQU07MkJBQUMsb0JBQW9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExBTkcgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzL3N0b3JhZ2UnO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL2xvY2FsLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBWYWx0ZWNoQ29uZmlnLCBWYWx0ZWNoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFByb3ZpZGVyIH0gZnJvbSAnLi9jb250ZW50JztcbmltcG9ydCB7IExhbmdPcHRpb24sIExhbmd1YWdlVGV4dCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIExhbmdTZXJ2aWNlIC0gUmVhY3RpdmUgbGFuZ3VhZ2UgYW5kIGNvbnRlbnQgbWFuYWdlbWVudCBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyByZWFjdGl2ZSBjb250ZW50IG1hbmFnZW1lbnQgd2l0aCBPYnNlcnZhYmxlLWJhc2VkIGxhbmd1YWdlIHN3aXRjaGluZy5cbiAqIENvbXBvbmVudHMgY2FuIHN1YnNjcmliZSB0byBjb250ZW50IGNoYW5nZXMgYW5kIGF1dG9tYXRpY2FsbHkgdXBkYXRlIHdoZW4gdGhlIGxhbmd1YWdlIGNoYW5nZXMuXG4gKlxuICogQGV4YW1wbGUgQmFzaWMgdXNhZ2U6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGxhbmdTZXJ2aWNlOiBMYW5nU2VydmljZSkge31cbiAqXG4gKiAvLyBHZXQgY3VycmVudCBsYW5ndWFnZVxuICogY29uc3QgY3VycmVudExhbmcgPSB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nO1xuICpcbiAqIC8vIFN1YnNjcmliZSB0byBsYW5ndWFnZSBjaGFuZ2VzXG4gKiB0aGlzLmxhbmdTZXJ2aWNlLmN1cnJlbnRMYW5nJC5zdWJzY3JpYmUobGFuZyA9PiBjb25zb2xlLmxvZygnTGFuZ3VhZ2UgY2hhbmdlZDonLCBsYW5nKSk7XG4gKlxuICogLy8gR2V0IHN0YXRpYyB0ZXh0XG4gKiBjb25zdCB0ZXh0ID0gdGhpcy5sYW5nU2VydmljZS5nZXRUZXh0KCdDb21wb25lbnROYW1lJywgJ3RleHRLZXknKTtcbiAqXG4gKiAvLyBHZXQgcmVhY3RpdmUgdGV4dFxuICogY29uc3QgdGV4dCQgPSB0aGlzLmxhbmdTZXJ2aWNlLmdldENvbnRlbnQoJ0NvbXBvbmVudE5hbWUnLCAndGV4dEtleScpO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBMYW5nU2VydmljZSB7XG4gIHByaXZhdGUgY29udGVudDogUHJvdmlkZXI7XG4gIHByaXZhdGUgZGVmYXVsdCA9IExhbmdPcHRpb24uRVM7XG4gIHByaXZhdGUgc2VsZWN0ZWRMYW5nOiBCZWhhdmlvclN1YmplY3Q8TGFuZ09wdGlvbj47XG4gIHByaXZhdGUgY29uZmlnOiBWYWx0ZWNoQ29uZmlnO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoVmFsdGVjaENvbmZpZ1NlcnZpY2UpIGNvbmZpZzogVmFsdGVjaENvbmZpZykge1xuICAgIGNvbnNvbGUubG9nKCdpbmplY3RlZCBjb25maWc6ICcsIGNvbmZpZyk7XG4gICAgdGhpcy5jb250ZW50ID0gY29uZmlnLmNvbnRlbnQ7XG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgY29uc3QgY3VycmVudCA9IExvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0PExhbmdPcHRpb24+KExBTkcpO1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5nID0gbmV3IEJlaGF2aW9yU3ViamVjdDxMYW5nT3B0aW9uPihjdXJyZW50IHx8IHRoaXMuZGVmYXVsdCk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSBjdXJyZW50IGxhbmd1YWdlIHdoZW5ldmVyIGl0IGNoYW5nZXMuXG4gICAqIFVzZSB0aGlzIHRvIHN1YnNjcmliZSB0byBsYW5ndWFnZSBjaGFuZ2VzIGluIGNvbXBvbmVudHMuXG4gICAqL1xuICBnZXQgY3VycmVudExhbmckKCk6IE9ic2VydmFibGU8TGFuZ09wdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZy5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY3VycmVudCBsYW5ndWFnZSBzeW5jaHJvbm91c2x5LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRMYW5nKCk6IExhbmdPcHRpb24ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkTGFuZy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgYW5kIHBlcnNpc3QgaXQgdG8gbG9jYWxTdG9yYWdlLlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB1cGRhdGVzIGluIGFsbCByZWFjdGl2ZSBjb250ZW50IHN1YnNjcmlwdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBsYW5nIC0gVGhlIGxhbmd1YWdlIHRvIHNldFxuICAgKi9cbiAgc2V0TGFuZyhsYW5nOiBMYW5nT3B0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZExhbmcubmV4dChsYW5nKTtcbiAgICBMb2NhbFN0b3JhZ2VTZXJ2aWNlLnNldDxMYW5nT3B0aW9uPihMQU5HLCBsYW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29udGVudCBmb3IgYSBjb21wb25lbnQgY2xhc3MgYW5kIGtleSAobGVnYWN5IG1ldGhvZCkuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSBnZXRUZXh0KCkgb3IgZ2V0Q29udGVudCgpIGZvciBiZXR0ZXIgdHlwZSBzYWZldHlcbiAgICovXG4gIFRleHQoY2xhc3NOYW1lOiBzdHJpbmcpOiBMYW5ndWFnZVRleHQge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXS5Db250ZW50W3RoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzaW5nbGUgY29udGVudCBzdHJpbmcgc3luY2hyb25vdXNseSBmb3IgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcGFyYW0gZmFsbGJhY2sgLSBPcHRpb25hbCBmYWxsYmFjayB0ZXh0IGlmIGtleSBpcyBub3QgZm91bmRcbiAgICogQHJldHVybnMgVGhlIHRleHQgc3RyaW5nIG9yIGZhbGxiYWNrXG4gICAqL1xuICBnZXRUZXh0KGNsYXNzTmFtZTogc3RyaW5nLCBrZXk6IHN0cmluZywgZmFsbGJhY2s/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W3RoaXMuc2VsZWN0ZWRMYW5nLnZhbHVlXTtcbiAgICByZXR1cm4gY2xhc3NDb250ZW50Py5ba2V5XSB8fCBmYWxsYmFjayB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSByZWFjdGl2ZSBPYnNlcnZhYmxlIGZvciBhIHNwZWNpZmljIHRleHQga2V5IHRoYXQgdXBkYXRlcyB3aGVuIGxhbmd1YWdlIGNoYW5nZXMuXG4gICAqIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIG1ldGhvZCBmb3IgY29tcG9uZW50cyB0aGF0IG5lZWQgcmVhY3RpdmUgY29udGVudC5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5IC0gVGhlIHRleHQga2V5XG4gICAqIEBwYXJhbSBmYWxsYmFjayAtIE9wdGlvbmFsIGZhbGxiYWNrIHRleHQgaWYga2V5IGlzIG5vdCBmb3VuZFxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgdGhlIHRleHQgc3RyaW5nIHdoZW5ldmVyIGxhbmd1YWdlIGNoYW5nZXNcbiAgICovXG4gIGdldENvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCBmYWxsYmFjaz86IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmckLnBpcGUoXG4gICAgICBtYXAobGFuZyA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W2xhbmddO1xuICAgICAgICByZXR1cm4gY2xhc3NDb250ZW50Py5ba2V5XSB8fCBmYWxsYmFjayB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgICAgIH0pLFxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJlYWN0aXZlIGNvbnRlbnQgZm9yIG11bHRpcGxlIGtleXMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIGNsYXNzTmFtZSAtIFRoZSBjb21wb25lbnQgY2xhc3MgbmFtZVxuICAgKiBAcGFyYW0ga2V5cyAtIEFycmF5IG9mIHRleHQga2V5cyB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgYW4gb2JqZWN0IHdpdGggYWxsIHJlcXVlc3RlZCBrZXlzXG4gICAqL1xuICBnZXRNdWx0aXBsZUNvbnRlbnQoY2xhc3NOYW1lOiBzdHJpbmcsIGtleXM6IHN0cmluZ1tdKTogT2JzZXJ2YWJsZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudExhbmckLnBpcGUoXG4gICAgICBtYXAobGFuZyA9PiB7XG4gICAgICAgIGNvbnN0IGNsYXNzQ29udGVudCA9IHRoaXMuY29udGVudFtjbGFzc05hbWVdPy5Db250ZW50W2xhbmddIHx8IHt9O1xuICAgICAgICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgICAga2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgcmVzdWx0W2tleV0gPSBjbGFzc0NvbnRlbnRba2V5XSB8fCBgWyR7Y2xhc3NOYW1lfS4ke2tleX1dYDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKChwcmV2LCBjdXJyKSA9PiBKU09OLnN0cmluZ2lmeShwcmV2KSA9PT0gSlNPTi5zdHJpbmdpZnkoY3VycikpXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbnRlbnQga2V5IGV4aXN0cyBmb3IgYSBjb21wb25lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjbGFzc05hbWUgLSBUaGUgY29tcG9uZW50IGNsYXNzIG5hbWVcbiAgICogQHBhcmFtIGtleSAtIFRoZSB0ZXh0IGtleVxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBrZXkgZXhpc3RzIGluIGFueSBsYW5ndWFnZVxuICAgKi9cbiAgaGFzQ29udGVudChjbGFzc05hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBjbGFzc0NvbnRlbnQgPSB0aGlzLmNvbnRlbnRbY2xhc3NOYW1lXTtcbiAgICBpZiAoIWNsYXNzQ29udGVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoY2xhc3NDb250ZW50LkNvbnRlbnQpLnNvbWUoXG4gICAgICBsYW5nQ29udGVudCA9PiBsYW5nQ29udGVudCAmJiB0eXBlb2YgbGFuZ0NvbnRlbnRba2V5XSA9PT0gJ3N0cmluZydcbiAgICApO1xuICB9XG5cbiAgLy8gTGVnYWN5IGdldHRlcnMvc2V0dGVycyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICBnZXQgTGFuZygpOiBMYW5nT3B0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGFuZztcbiAgfVxuXG4gIHNldCBMYW5nKGxhbmc6IExhbmdPcHRpb24pIHtcbiAgICB0aGlzLnNldExhbmcobGFuZyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/platform-browser";
|
|
4
|
+
/**
|
|
5
|
+
* LinkProcessorService - Service for processing text content to convert URLs and internal routes into clickable links.
|
|
6
|
+
*
|
|
7
|
+
* This service automatically detects external URLs (http/https) and internal routes (starting with /)
|
|
8
|
+
* and converts them into HTML anchor elements with appropriate attributes.
|
|
9
|
+
*
|
|
10
|
+
* @example Basic usage:
|
|
11
|
+
* ```typescript
|
|
12
|
+
* constructor(private linkProcessor: LinkProcessorService) {}
|
|
13
|
+
*
|
|
14
|
+
* processText() {
|
|
15
|
+
* const text = 'Visit https://example.com or go to /profile';
|
|
16
|
+
* const processed = this.linkProcessor.processLinks(text);
|
|
17
|
+
* // Returns SafeHtml with clickable links
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export class LinkProcessorService {
|
|
22
|
+
constructor(sanitizer) {
|
|
23
|
+
this.sanitizer = sanitizer;
|
|
24
|
+
// Regex para detectar URLs completas (http/https)
|
|
25
|
+
this.urlRegex = /(https?:\/\/[^\s]+)/g;
|
|
26
|
+
// Regex para detectar rutas internas (empiezan con / pero no son URLs completas)
|
|
27
|
+
this.internalRouteRegex = /(\s|^)(\/[^\s]*)/g;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Procesa texto para convertir enlaces en elementos <a> clickeables.
|
|
31
|
+
* Detecta automáticamente URLs externas e internas y las convierte en enlaces.
|
|
32
|
+
*
|
|
33
|
+
* @param text - Texto a procesar
|
|
34
|
+
* @param config - Configuración del procesamiento
|
|
35
|
+
* @returns SafeHtml con enlaces procesados o string original
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const result = this.linkProcessor.processLinks(
|
|
40
|
+
* 'Visit https://example.com or /profile',
|
|
41
|
+
* {
|
|
42
|
+
* openExternalInNewTab: true,
|
|
43
|
+
* openInternalInNewTab: false,
|
|
44
|
+
* linkClass: 'custom-link'
|
|
45
|
+
* }
|
|
46
|
+
* );
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
processLinks(text, config = {}) {
|
|
50
|
+
if (!text)
|
|
51
|
+
return '';
|
|
52
|
+
const { openExternalInNewTab = true, openInternalInNewTab = false, linkClass = 'processed-link', externalLinkClass = 'external-link', internalLinkClass = 'internal-link', } = config;
|
|
53
|
+
let hasLinks = false;
|
|
54
|
+
let processedText = text;
|
|
55
|
+
// Procesar URLs externas primero
|
|
56
|
+
if (this.urlRegex.test(text)) {
|
|
57
|
+
hasLinks = true;
|
|
58
|
+
this.urlRegex.lastIndex = 0; // Reset regex
|
|
59
|
+
processedText = processedText.replace(this.urlRegex, url => {
|
|
60
|
+
const target = openExternalInNewTab ? ' target="_blank" rel="noopener noreferrer"' : '';
|
|
61
|
+
const classes = `${linkClass} ${externalLinkClass}`.trim();
|
|
62
|
+
return `<a href="${url}"${target} class="${classes}">${url}</a>`;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Procesar rutas internas después
|
|
66
|
+
if (this.internalRouteRegex.test(processedText)) {
|
|
67
|
+
hasLinks = true;
|
|
68
|
+
this.internalRouteRegex.lastIndex = 0; // Reset regex
|
|
69
|
+
processedText = processedText.replace(this.internalRouteRegex, (match, prefix, route) => {
|
|
70
|
+
// Solo procesar si no está ya dentro de un enlace
|
|
71
|
+
if (processedText.indexOf(`href="${route}"`) === -1) {
|
|
72
|
+
const target = openInternalInNewTab ? ' target="_blank"' : '';
|
|
73
|
+
const classes = `${linkClass} ${internalLinkClass}`.trim();
|
|
74
|
+
return `${prefix}<a href="${route}"${target} class="${classes}">${route}</a>`;
|
|
75
|
+
}
|
|
76
|
+
return match;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Si hay enlaces, sanitizar el HTML
|
|
80
|
+
if (hasLinks) {
|
|
81
|
+
return this.sanitizer.bypassSecurityTrustHtml(processedText);
|
|
82
|
+
}
|
|
83
|
+
return text;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Detecta si un texto contiene enlaces (URLs o rutas internas).
|
|
87
|
+
*
|
|
88
|
+
* @param text - Texto a analizar
|
|
89
|
+
* @returns true si contiene enlaces
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* ```typescript
|
|
93
|
+
* const hasLinks = this.linkProcessor.hasLinks('Visit https://example.com');
|
|
94
|
+
* // Returns: true
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
hasLinks(text) {
|
|
98
|
+
if (!text)
|
|
99
|
+
return false;
|
|
100
|
+
// Reset regex indices
|
|
101
|
+
this.urlRegex.lastIndex = 0;
|
|
102
|
+
this.internalRouteRegex.lastIndex = 0;
|
|
103
|
+
return this.urlRegex.test(text) || this.internalRouteRegex.test(text);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Extrae todos los enlaces de un texto.
|
|
107
|
+
*
|
|
108
|
+
* @param text - Texto a analizar
|
|
109
|
+
* @returns Array de enlaces encontrados con su tipo
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* ```typescript
|
|
113
|
+
* const links = this.linkProcessor.extractLinks('Visit https://example.com or /profile');
|
|
114
|
+
* // Returns: [
|
|
115
|
+
* // { url: 'https://example.com', type: 'external' },
|
|
116
|
+
* // { url: '/profile', type: 'internal' }
|
|
117
|
+
* // ]
|
|
118
|
+
* ```
|
|
119
|
+
*/
|
|
120
|
+
extractLinks(text) {
|
|
121
|
+
if (!text)
|
|
122
|
+
return [];
|
|
123
|
+
const links = [];
|
|
124
|
+
// Reset regex indices
|
|
125
|
+
this.urlRegex.lastIndex = 0;
|
|
126
|
+
this.internalRouteRegex.lastIndex = 0;
|
|
127
|
+
// Extraer URLs externas
|
|
128
|
+
let match;
|
|
129
|
+
while ((match = this.urlRegex.exec(text)) !== null) {
|
|
130
|
+
links.push({ url: match[1], type: 'external' });
|
|
131
|
+
}
|
|
132
|
+
// Extraer rutas internas
|
|
133
|
+
while ((match = this.internalRouteRegex.exec(text)) !== null) {
|
|
134
|
+
links.push({ url: match[2], type: 'internal' });
|
|
135
|
+
}
|
|
136
|
+
return links;
|
|
137
|
+
}
|
|
138
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
139
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, providedIn: 'root' }); }
|
|
140
|
+
}
|
|
141
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LinkProcessorService, decorators: [{
|
|
142
|
+
type: Injectable,
|
|
143
|
+
args: [{
|
|
144
|
+
providedIn: 'root',
|
|
145
|
+
}]
|
|
146
|
+
}], ctorParameters: () => [{ type: i1.DomSanitizer }] });
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1wcm9jZXNzb3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ZhbHRlY2gtY29tcG9uZW50cy9zcmMvbGliL3NlcnZpY2VzL2xpbmstcHJvY2Vzc29yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBZ0IzQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUlILE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQU4zQyxrREFBa0Q7UUFDakMsYUFBUSxHQUFHLHNCQUFzQixDQUFDO1FBRW5ELGlGQUFpRjtRQUNoRSx1QkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztJQUVaLENBQUM7SUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQThCLEVBQUU7UUFDekQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUVyQixNQUFNLEVBQ0osb0JBQW9CLEdBQUcsSUFBSSxFQUMzQixvQkFBb0IsR0FBRyxLQUFLLEVBQzVCLFNBQVMsR0FBRyxnQkFBZ0IsRUFDNUIsaUJBQWlCLEdBQUcsZUFBZSxFQUNuQyxpQkFBaUIsR0FBRyxlQUFlLEdBQ3BDLEdBQUcsTUFBTSxDQUFDO1FBRVgsSUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUV6QixpQ0FBaUM7UUFDakMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdCLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYztZQUUzQyxhQUFhLEdB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Q0FBQztRQUNsRCxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQzdELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7K0dBeklVLG9CQUFvQjttSEFBcEIsb0JBQW9CLGNBRm5CLE1BQU07OzRGQUVQLG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Byb2Nlc3NvckNvbmZpZyB7XG4gIC8qKiBXaGV0aGVyIHRvIG9wZW4gZXh0ZXJuYWwgbGlua3MgaW4gbmV3IHRhYiAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgb3BlbkV4dGVybmFsSW5OZXdUYWI/OiBib29sZWFuO1xuICAvKiogV2hldGhlciB0byBvcGVuIGludGVybmFsIGxpbmtzIGluIG5ldyB0YWIgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuSW50ZXJuYWxJbk5ld1RhYj86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzZXMgZm9yIGxpbmtzICovXG4gIGxpbmtDbGFzcz86IHN0cmluZztcbiAgLyoqIEN1c3RvbSBDU1MgY2xhc3NlcyBmb3IgZXh0ZXJuYWwgbGlua3MgKi9cbiAgZXh0ZXJuYWxMaW5rQ2xhc3M/OiBzdHJpbmc7XG4gIC8qKiBDdXN0b20gQ1NTIGNsYXNzZXMgZm9yIGludGVybmFsIGxpbmtzICovXG4gIGludGVybmFsTGlua0NsYXNzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIExpbmtQcm9jZXNzb3JTZXJ2aWNlIC0gU2VydmljZSBmb3IgcHJvY2Vzc2luZyB0ZXh0IGNvbnRlbnQgdG8gY29udmVydCBVUkxzIGFuZCBpbnRlcm5hbCByb3V0ZXMgaW50byBjbGlja2FibGUgbGlua3MuXG4gKlxuICogVGhpcyBzZXJ2aWNlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBleHRlcm5hbCBVUkxzIChodHRwL2h0dHBzKSBhbmQgaW50ZXJuYWwgcm91dGVzIChzdGFydGluZyB3aXRoIC8pXG4gKiBhbmQgY29udmVydHMgdGhlbSBpbnRvIEhUTUwgYW5jaG9yIGVsZW1lbnRzIHdpdGggYXBwcm9wcmlhdGUgYXR0cmlidXRlcy5cbiAqXG4gKiBAZXhhbXBsZSBCYXNpYyB1c2FnZTpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgbGlua1Byb2Nlc3NvcjogTGlua1Byb2Nlc3NvclNlcnZpY2UpIHt9XG4gKlxuICogcHJvY2Vzc1RleHQoKSB7XG4gKiAgIGNvbnN0IHRleHQgPSAnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbSBvciBnbyB0byAvcHJvZmlsZSc7XG4gKiAgIGNvbnN0IHByb2Nlc3NlZCA9IHRoaXMubGlua1Byb2Nlc3Nvci5wcm9jZXNzTGlua3ModGV4dCk7XG4gKiAgIC8vIFJldHVybnMgU2FmZUh0bWwgd2l0aCBjbGlja2FibGUgbGlua3NcbiAqIH1cbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTGlua1Byb2Nlc3NvclNlcnZpY2Uge1xuICAvLyBSZWdleCBwYXJhIGRldGVjdGFyIFVSTHMgY29tcGxldGFzIChodHRwL2h0dHBzKVxuICBwcml2YXRlIHJlYWRvbmx5IHVybFJlZ2V4ID0gLyhodHRwcz86XFwvXFwvW15cXHNdKykvZztcblxuICAvLyBSZWdleCBwYXJhIGRldGVjdGFyIHJ1dGFzIGludGVybmFzIChlbXBpZXphbiBjb24gLyBwZXJvIG5vIHNvbiBVUkxzIGNvbXBsZXRhcylcbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlcm5hbFJvdXRlUmVnZXggPSAvKFxcc3xeKShcXC9bXlxcc10qKS9nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgLyoqXG4gICAqIFByb2Nlc2EgdGV4dG8gcGFyYSBjb252ZXJ0aXIgZW5sYWNlcyBlbiBlbGVtZW50b3MgPGE+IGNsaWNrZWFibGVzLlxuICAgKiBEZXRlY3RhIGF1dG9tw6F0aWNhbWVudGUgVVJMcyBleHRlcm5hcyBlIGludGVybmFzIHkgbGFzIGNvbnZpZXJ0ZSBlbiBlbmxhY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgcHJvY2VzYXJcbiAgICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYWNpw7NuIGRlbCBwcm9jZXNhbWllbnRvXG4gICAqIEByZXR1cm5zIFNhZmVIdG1sIGNvbiBlbmxhY2VzIHByb2Nlc2Fkb3MgbyBzdHJpbmcgb3JpZ2luYWxcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSB0aGlzLmxpbmtQcm9jZXNzb3IucHJvY2Vzc0xpbmtzKFxuICAgKiAgICdWaXNpdCBodHRwczovL2V4YW1wbGUuY29tIG9yIC9wcm9maWxlJyxcbiAgICogICB7XG4gICAqICAgICBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogdHJ1ZSxcbiAgICogICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAgICogICAgIGxpbmtDbGFzczogJ2N1c3RvbS1saW5rJ1xuICAgKiAgIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwcm9jZXNzTGlua3ModGV4dDogc3RyaW5nLCBjb25maWc6IExpbmtQcm9jZXNzb3JDb25maWcgPSB7fSk6IFNhZmVIdG1sIHwgc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHtcbiAgICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiID0gdHJ1ZSxcbiAgICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiID0gZmFsc2UsXG4gICAgICBsaW5rQ2xhc3MgPSAncHJvY2Vzc2VkLWxpbmsnLFxuICAgICAgZXh0ZXJuYWxMaW5rQ2xhc3MgPSAnZXh0ZXJuYWwtbGluaycsXG4gICAgICBpbnRlcm5hbExpbmtDbGFzcyA9ICdpbnRlcm5hbC1saW5rJyxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgbGV0IGhhc0xpbmtzID0gZmFsc2U7XG4gICAgbGV0IHByb2Nlc3NlZFRleHQgPSB0ZXh0O1xuXG4gICAgLy8gUHJvY2VzYXIgVVJMcyBleHRlcm5hcyBwcmltZXJvXG4gICAgaWYgKHRoaXMudXJsUmVnZXgudGVzdCh0ZXh0KSkge1xuICAgICAgaGFzTGlua3MgPSB0cnVlO1xuICAgICAgdGhpcy51cmxSZWdleC5sYXN0SW5kZXggPSAwOyAvLyBSZXNldCByZWdleFxuXG4gICAgICBwcm9jZXNzZWRUZXh0ID0gcHJvY2Vzc2VkVGV4dC5yZXBsYWNlKHRoaXMudXJsUmVnZXgsIHVybCA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9wZW5FeHRlcm5hbEluTmV3VGFiID8gJyB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub29wZW5lciBub3JlZmVycmVyXCInIDogJyc7XG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBgJHtsaW5rQ2xhc3N9ICR7ZXh0ZXJuYWxMaW5rQ2xhc3N9YC50cmltKCk7XG4gICAgICAgIHJldHVybiBgPGEgaHJlZj1cIiR7dXJsfVwiJHt0YXJnZXR9IGNsYXNzPVwiJHtjbGFzc2VzfVwiPiR7dXJsfTwvYT5gO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUHJvY2VzYXIgcnV0YXMgaW50ZXJuYXMgZGVzcHXDqXNcbiAgICBpZiAodGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgudGVzdChwcm9jZXNzZWRUZXh0KSkge1xuICAgICAgaGFzTGlua3MgPSB0cnVlO1xuICAgICAgdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgubGFzdEluZGV4ID0gMDsgLy8gUmVzZXQgcmVnZXhcblxuICAgICAgcHJvY2Vzc2VkVGV4dCA9IHByb2Nlc3NlZFRleHQucmVwbGFjZSh0aGlzLmludGVybmFsUm91dGVSZWdleCwgKG1hdGNoLCBwcmVmaXgsIHJvdXRlKSA9PiB7XG4gICAgICAgIC8vIFNvbG8gcHJvY2VzYXIgc2kgbm8gZXN0w6EgeWEgZGVudHJvIGRlIHVuIGVubGFjZVxuICAgICAgICBpZiAocHJvY2Vzc2VkVGV4dC5pbmRleE9mKGBocmVmPVwiJHtyb3V0ZX1cImApID09PSAtMSkge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IG9wZW5JbnRlcm5hbEluTmV3VGFiID8gJyB0YXJnZXQ9XCJfYmxhbmtcIicgOiAnJztcbiAgICAgICAgICBjb25zdCBjbGFzc2VzID0gYCR7bGlua0NsYXNzfSAke2ludGVybmFsTGlua0NsYXNzfWAudHJpbSgpO1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9PGEgaHJlZj1cIiR7cm91dGV9XCIke3RhcmdldH0gY2xhc3M9XCIke2NsYXNzZXN9XCI+JHtyb3V0ZX08L2E+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF0Y2g7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTaSBoYXkgZW5sYWNlcywgc2FuaXRpemFyIGVsIEhUTUxcbiAgICBpZiAoaGFzTGlua3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChwcm9jZXNzZWRUZXh0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3RhIHNpIHVuIHRleHRvIGNvbnRpZW5lIGVubGFjZXMgKFVSTHMgbyBydXRhcyBpbnRlcm5hcykuXG4gICAqXG4gICAqIEBwYXJhbSB0ZXh0IC0gVGV4dG8gYSBhbmFsaXphclxuICAgKiBAcmV0dXJucyB0cnVlIHNpIGNvbnRpZW5lIGVubGFjZXNcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoYXNMaW5rcyA9IHRoaXMubGlua1Byb2Nlc3Nvci5oYXNMaW5rcygnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbScpO1xuICAgKiAvLyBSZXR1cm5zOiB0cnVlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzTGlua3ModGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBSZXNldCByZWdleCBpbmRpY2VzXG4gICAgdGhpcy51cmxSZWdleC5sYXN0SW5kZXggPSAwO1xuICAgIHRoaXMuaW50ZXJuYWxSb3V0ZVJlZ2V4Lmxhc3RJbmRleCA9IDA7XG5cbiAgICByZXR1cm4gdGhpcy51cmxSZWdleC50ZXN0KHRleHQpIHx8IHRoaXMuaW50ZXJuYWxSb3V0ZVJlZ2V4LnRlc3QodGV4dCk7XG4gIH1cblxuICAvKipcbiAgICogRXh0cmFlIHRvZG9zIGxvcyBlbmxhY2VzIGRlIHVuIHRleHRvLlxuICAgKlxuICAgKiBAcGFyYW0gdGV4dCAtIFRleHRvIGEgYW5hbGl6YXJcbiAgICogQHJldHVybnMgQXJyYXkgZGUgZW5sYWNlcyBlbmNvbnRyYWRvcyBjb24gc3UgdGlwb1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxpbmtzID0gdGhpcy5saW5rUHJvY2Vzc29yLmV4dHJhY3RMaW5rcygnVmlzaXQgaHR0cHM6Ly9leGFtcGxlLmNvbSBvciAvcHJvZmlsZScpO1xuICAgKiAvLyBSZXR1cm5zOiBbXG4gICAqIC8vICAgeyB1cmw6ICdodHRwczovL2V4YW1wbGUuY29tJywgdHlwZTogJ2V4dGVybmFsJyB9LFxuICAgKiAvLyAgIHsgdXJsOiAnL3Byb2ZpbGUnLCB0eXBlOiAnaW50ZXJuYWwnIH1cbiAgICogLy8gXVxuICAgKiBgYGBcbiAgICovXG4gIGV4dHJhY3RMaW5rcyh0ZXh0OiBzdHJpbmcpOiBBcnJheTx7IHVybDogc3RyaW5nOyB0eXBlOiAnZXh0ZXJuYWwnIHwgJ2ludGVybmFsJyB9PiB7XG4gICAgaWYgKCF0ZXh0KSByZXR1cm4gW107XG5cbiAgICBjb25zdCBsaW5rczogQXJyYXk8eyB1cmw6IHN0cmluZzsgdHlwZTogJ2V4dGVybmFsJyB8ICdpbnRlcm5hbCcgfT4gPSBbXTtcblxuICAgIC8vIFJlc2V0IHJlZ2V4IGluZGljZXNcbiAgICB0aGlzLnVybFJlZ2V4Lmxhc3RJbmRleCA9IDA7XG4gICAgdGhpcy5pbnRlcm5hbFJvdXRlUmVnZXgubGFzdEluZGV4ID0gMDtcblxuICAgIC8vIEV4dHJhZXIgVVJMcyBleHRlcm5hc1xuICAgIGxldCBtYXRjaDtcbiAgICB3aGlsZSAoKG1hdGNoID0gdGhpcy51cmxSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgbGlua3MucHVzaCh7IHVybDogbWF0Y2hbMV0sIHR5cGU6ICdleHRlcm5hbCcgfSk7XG4gICAgfVxuXG4gICAgLy8gRXh0cmFlciBydXRhcyBpbnRlcm5hc1xuICAgIHdoaWxlICgobWF0Y2ggPSB0aGlzLmludGVybmFsUm91dGVSZWdleC5leGVjKHRleHQpKSAhPT0gbnVsbCkge1xuICAgICAgbGlua3MucHVzaCh7IHVybDogbWF0Y2hbMl0sIHR5cGU6ICdpbnRlcm5hbCcgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbmtzO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { Pipe, inject } from '@angular/core';
|
|
2
|
+
import { LinkProcessorService } from '../../services/link-processor.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* ProcessLinksPipe - Pipe para procesar texto y convertir URLs en enlaces clickeables.
|
|
6
|
+
*
|
|
7
|
+
* Este pipe standalone detecta automáticamente URLs externas (http/https) y rutas internas
|
|
8
|
+
* (que empiezan con /) y las convierte en elementos HTML anchor con los atributos apropiados.
|
|
9
|
+
*
|
|
10
|
+
* @example Uso básico:
|
|
11
|
+
* ```html
|
|
12
|
+
* <div [innerHTML]="'Visit https://example.com or go to /profile' | processLinks"></div>
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @example Con configuración personalizada:
|
|
16
|
+
* ```html
|
|
17
|
+
* <div [innerHTML]="text | processLinks:linkConfig"></div>
|
|
18
|
+
* ```
|
|
19
|
+
*
|
|
20
|
+
* @example En TypeScript:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* export class MyComponent {
|
|
23
|
+
* linkConfig: LinkProcessorConfig = {
|
|
24
|
+
* openExternalInNewTab: true,
|
|
25
|
+
* openInternalInNewTab: false,
|
|
26
|
+
* linkClass: 'my-link',
|
|
27
|
+
* externalLinkClass: 'external',
|
|
28
|
+
* internalLinkClass: 'internal'
|
|
29
|
+
* };
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class ProcessLinksPipe {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.linkProcessor = inject(LinkProcessorService);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Transforma texto procesando URLs y rutas internas para convertirlas en enlaces.
|
|
39
|
+
*
|
|
40
|
+
* @param value - El texto a procesar
|
|
41
|
+
* @param config - Configuración opcional para el procesamiento de enlaces
|
|
42
|
+
* @returns SafeHtml con enlaces procesados o string original si no hay enlaces
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```html
|
|
46
|
+
* <!-- Uso básico -->
|
|
47
|
+
* <p [innerHTML]="'Check out https://angular.io' | processLinks"></p>
|
|
48
|
+
*
|
|
49
|
+
* <!-- Con configuración -->
|
|
50
|
+
* <p [innerHTML]="message | processLinks:{ openExternalInNewTab: false }"></p>
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
transform(value, config) {
|
|
54
|
+
if (!value) {
|
|
55
|
+
return '';
|
|
56
|
+
}
|
|
57
|
+
return this.linkProcessor.processLinks(value, config);
|
|
58
|
+
}
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
60
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, isStandalone: true, name: "processLinks" }); }
|
|
61
|
+
}
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProcessLinksPipe, decorators: [{
|
|
63
|
+
type: Pipe,
|
|
64
|
+
args: [{
|
|
65
|
+
name: 'processLinks',
|
|
66
|
+
standalone: true,
|
|
67
|
+
}]
|
|
68
|
+
}] });
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1saW5rcy5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdmFsdGVjaC1jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL3BpcGVzL3Byb2Nlc3MtbGlua3MucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUQsT0FBTyxFQUF1QixvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOztBQUVsRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUtILE1BQU0sT0FBTyxnQkFBZ0I7SUFKN0I7UUFLVSxrQkFBYSxHQUFHLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0tBeUJ0RDtJQXZCQzs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxTQUFTLENBQUMsS0FBYSxFQUFFLE1BQTRCO1FBQ25ELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7K0dBekJVLGdCQUFnQjs2R0FBaEIsZ0JBQWdCOzs0RkFBaEIsZ0JBQWdCO2tCQUo1QixJQUFJO21CQUFDO29CQUNKLElBQUksRUFBRSxjQUFjO29CQUNwQixVQUFVLEVBQUUsSUFBSTtpQkFDakIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNhZmVIdG1sIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBMaW5rUHJvY2Vzc29yQ29uZmlnLCBMaW5rUHJvY2Vzc29yU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xpbmstcHJvY2Vzc29yLnNlcnZpY2UnO1xuXG4vKipcbiAqIFByb2Nlc3NMaW5rc1BpcGUgLSBQaXBlIHBhcmEgcHJvY2VzYXIgdGV4dG8geSBjb252ZXJ0aXIgVVJMcyBlbiBlbmxhY2VzIGNsaWNrZWFibGVzLlxuICpcbiAqIEVzdGUgcGlwZSBzdGFuZGFsb25lIGRldGVjdGEgYXV0b23DoXRpY2FtZW50ZSBVUkxzIGV4dGVybmFzIChodHRwL2h0dHBzKSB5IHJ1dGFzIGludGVybmFzXG4gKiAocXVlIGVtcGllemFuIGNvbiAvKSB5IGxhcyBjb252aWVydGUgZW4gZWxlbWVudG9zIEhUTUwgYW5jaG9yIGNvbiBsb3MgYXRyaWJ1dG9zIGFwcm9waWFkb3MuXG4gKlxuICogQGV4YW1wbGUgVXNvIGLDoXNpY286XG4gKiBgYGBodG1sXG4gKiA8ZGl2IFtpbm5lckhUTUxdPVwiJ1Zpc2l0IGh0dHBzOi8vZXhhbXBsZS5jb20gb3IgZ28gdG8gL3Byb2ZpbGUnIHwgcHJvY2Vzc0xpbmtzXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBDb24gY29uZmlndXJhY2nDs24gcGVyc29uYWxpemFkYTpcbiAqIGBgYGh0bWxcbiAqIDxkaXYgW2lubmVySFRNTF09XCJ0ZXh0IHwgcHJvY2Vzc0xpbmtzOmxpbmtDb25maWdcIj48L2Rpdj5cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEVuIFR5cGVTY3JpcHQ6XG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBsaW5rQ29uZmlnOiBMaW5rUHJvY2Vzc29yQ29uZmlnID0ge1xuICogICAgIG9wZW5FeHRlcm5hbEluTmV3VGFiOiB0cnVlLFxuICogICAgIG9wZW5JbnRlcm5hbEluTmV3VGFiOiBmYWxzZSxcbiAqICAgICBsaW5rQ2xhc3M6ICdteS1saW5rJyxcbiAqICAgICBleHRlcm5hbExpbmtDbGFzczogJ2V4dGVybmFsJyxcbiAqICAgICBpbnRlcm5hbExpbmtDbGFzczogJ2ludGVybmFsJ1xuICogICB9O1xuICogfVxuICogYGBgXG4gKi9cbkBQaXBlKHtcbiAgbmFtZTogJ3Byb2Nlc3NMaW5rcycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFByb2Nlc3NMaW5rc1BpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgcHJpdmF0ZSBsaW5rUHJvY2Vzc29yID0gaW5qZWN0KExpbmtQcm9jZXNzb3JTZXJ2aWNlKTtcblxuICAvKipcbiAgICogVHJhbnNmb3JtYSB0ZXh0byBwcm9jZXNhbmRvIFVSTHMgeSBydXRhcyBpbnRlcm5hcyBwYXJhIGNvbnZlcnRpcmxhcyBlbiBlbmxhY2VzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBFbCB0ZXh0byBhIHByb2Nlc2FyXG4gICAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmFjacOzbiBvcGNpb25hbCBwYXJhIGVsIHByb2Nlc2FtaWVudG8gZGUgZW5sYWNlc1xuICAgKiBAcmV0dXJucyBTYWZlSHRtbCBjb24gZW5sYWNlcyBwcm9jZXNhZG9zIG8gc3RyaW5nIG9yaWdpbmFsIHNpIG5vIGhheSBlbmxhY2VzXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYGh0bWxcbiAgICogPCEtLSBVc28gYsOhc2ljbyAtLT5cbiAgICogPHAgW2lubmVySFRNTF09XCInQ2hlY2sgb3V0IGh0dHBzOi8vYW5ndWxhci5pbycgfCBwcm9jZXNzTGlua3NcIj48L3A+XG4gICAqXG4gICAqIDwhLS0gQ29uIGNvbmZpZ3VyYWNpw7NuIC0tPlxuICAgKiA8cCBbaW5uZXJIVE1MXT1cIm1lc3NhZ2UgfCBwcm9jZXNzTGlua3M6eyBvcGVuRXh0ZXJuYWxJbk5ld1RhYjogZmFsc2UgfVwiPjwvcD5cbiAgICogYGBgXG4gICAqL1xuICB0cmFuc2Zvcm0odmFsdWU6IHN0cmluZywgY29uZmlnPzogTGlua1Byb2Nlc3NvckNvbmZpZyk6IFNhZmVIdG1sIHwgc3RyaW5nIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubGlua1Byb2Nlc3Nvci5wcm9jZXNzTGlua3ModmFsdWUsIGNvbmZpZyk7XG4gIH1cbn1cbiJdfQ==
|