@theia/preview 1.67.0-next.56 → 1.67.0-next.59
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/lib/browser/index.d.ts +4 -0
- package/lib/browser/index.d.ts.map +1 -0
- package/lib/browser/index.js +21 -0
- package/lib/browser/index.js.map +1 -0
- package/lib/browser/markdown/index.d.ts +2 -0
- package/lib/browser/markdown/index.d.ts.map +1 -0
- package/lib/browser/markdown/index.js +20 -0
- package/lib/browser/markdown/index.js.map +1 -0
- package/lib/browser/markdown/markdown-preview-handler.d.ts +29 -0
- package/lib/browser/markdown/markdown-preview-handler.d.ts.map +1 -0
- package/lib/browser/markdown/markdown-preview-handler.js +294 -0
- package/lib/browser/markdown/markdown-preview-handler.js.map +1 -0
- package/lib/browser/markdown/markdown-preview-handler.spec.d.ts +2 -0
- package/lib/browser/markdown/markdown-preview-handler.spec.d.ts.map +1 -0
- package/lib/browser/markdown/markdown-preview-handler.spec.js +194 -0
- package/lib/browser/markdown/markdown-preview-handler.spec.js.map +1 -0
- package/lib/browser/preview-contribution.d.ts +51 -0
- package/lib/browser/preview-contribution.d.ts.map +1 -0
- package/lib/browser/preview-contribution.js +256 -0
- package/lib/browser/preview-contribution.js.map +1 -0
- package/lib/browser/preview-frontend-module.d.ts +6 -0
- package/lib/browser/preview-frontend-module.d.ts.map +1 -0
- package/lib/browser/preview-frontend-module.js +53 -0
- package/lib/browser/preview-frontend-module.js.map +1 -0
- package/lib/browser/preview-handler.d.ts +105 -0
- package/lib/browser/preview-handler.d.ts.map +1 -0
- package/lib/browser/preview-handler.js +66 -0
- package/lib/browser/preview-handler.js.map +1 -0
- package/lib/browser/preview-link-normalizer.d.ts +8 -0
- package/lib/browser/preview-link-normalizer.d.ts.map +1 -0
- package/lib/browser/preview-link-normalizer.js +47 -0
- package/lib/browser/preview-link-normalizer.js.map +1 -0
- package/lib/browser/preview-uri.d.ts +9 -0
- package/lib/browser/preview-uri.d.ts.map +1 -0
- package/lib/browser/preview-uri.js +48 -0
- package/lib/browser/preview-uri.js.map +1 -0
- package/lib/browser/preview-widget.d.ts +55 -0
- package/lib/browser/preview-widget.d.ts.map +1 -0
- package/lib/browser/preview-widget.js +251 -0
- package/lib/browser/preview-widget.js.map +1 -0
- package/lib/common/preview-preferences.d.ts +14 -0
- package/lib/common/preview-preferences.d.ts.map +1 -0
- package/lib/common/preview-preferences.js +48 -0
- package/lib/common/preview-preferences.js.map +1 -0
- package/lib/node/preview-backend-module.d.ts +4 -0
- package/lib/node/preview-backend-module.d.ts.map +1 -0
- package/lib/node/preview-backend-module.js +23 -0
- package/lib/node/preview-backend-module.js.map +1 -0
- package/lib/package.spec.d.ts +1 -0
- package/lib/package.spec.d.ts.map +1 -0
- package/lib/package.spec.js +26 -0
- package/lib/package.spec.js.map +1 -0
- package/package.json +6 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAgBA,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2018 TypeFox and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const tslib_1 = require("tslib");
|
|
19
|
+
tslib_1.__exportStar(require("./preview-uri"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./preview-handler"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,wDAA8B;AAC9B,4DAAkC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/browser/markdown/index.ts"],"names":[],"mappings":"AAgBA,cAAc,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2018 TypeFox and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const tslib_1 = require("tslib");
|
|
19
|
+
tslib_1.__exportStar(require("./markdown-preview-handler"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/browser/markdown/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAEhF,qEAA2C"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import URI from '@theia/core/lib/common/uri';
|
|
2
|
+
import { OpenerService } from '@theia/core/lib/browser';
|
|
3
|
+
import * as markdownit from '@theia/core/shared/markdown-it';
|
|
4
|
+
import { PreviewHandler, RenderContentParams } from '../preview-handler';
|
|
5
|
+
import { PreviewLinkNormalizer } from '../preview-link-normalizer';
|
|
6
|
+
export declare class MarkdownPreviewHandler implements PreviewHandler {
|
|
7
|
+
readonly iconClass: string;
|
|
8
|
+
readonly contentClass: string;
|
|
9
|
+
protected readonly openerService: OpenerService;
|
|
10
|
+
protected readonly linkNormalizer: PreviewLinkNormalizer;
|
|
11
|
+
canHandle(uri: URI): number;
|
|
12
|
+
renderContent(params: RenderContentParams): HTMLElement;
|
|
13
|
+
protected addLinkClickedListener(contentElement: HTMLElement, params: RenderContentParams): void;
|
|
14
|
+
protected findLink(element: HTMLElement, container: HTMLElement): string | undefined;
|
|
15
|
+
protected openLink(uri: URI, originUri: URI): Promise<void>;
|
|
16
|
+
protected resolveUri(link: string, uri: URI, preview: boolean): URI;
|
|
17
|
+
protected revealFragment(contentElement: HTMLElement, fragment: string): void;
|
|
18
|
+
findElementForFragment(content: HTMLElement, link: string): HTMLElement | undefined;
|
|
19
|
+
findElementForSourceLine(content: HTMLElement, sourceLine: number): HTMLElement | undefined;
|
|
20
|
+
getSourceLineForOffset(content: HTMLElement, offset: number): number | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* returns two significant line elements for the given offset.
|
|
23
|
+
*/
|
|
24
|
+
protected getLineElementsAtOffset(content: HTMLElement, offset: number): HTMLElement[];
|
|
25
|
+
protected getLineNumberFromAttribute(element: HTMLElement): number | undefined;
|
|
26
|
+
protected engine: markdownit | undefined;
|
|
27
|
+
protected getEngine(): markdownit;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=markdown-preview-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-preview-handler.d.ts","sourceRoot":"","sources":["../../../src/browser/markdown/markdown-preview-handler.ts"],"names":[],"mappings":"AAiBA,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAKxD,OAAO,KAAK,UAAU,MAAM,gCAAgC,CAAC;AAK7D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,qBACa,sBAAuB,YAAW,cAAc;IAEzD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAA6B;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAsB;IAGnD,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAGhD,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,qBAAqB,CAAC;IAEzD,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAQ3B,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,WAAW;IAUvD,SAAS,CAAC,sBAAsB,CAAC,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAiBhG,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;cAcpE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjE,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,GAAG,GAAG;IAanE,SAAS,CAAC,cAAc,CAAC,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQ7E,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAqBnF,wBAAwB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAc3F,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAwBhF;;OAEG;IACH,SAAS,CAAC,uBAAuB,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IA4BtF,SAAS,CAAC,0BAA0B,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS;IAK9E,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IACzC,SAAS,CAAC,SAAS,IAAI,UAAU;CA4FpC"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2018 TypeFox and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.MarkdownPreviewHandler = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
22
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
23
|
+
const common_1 = require("@theia/core/lib/common");
|
|
24
|
+
const path_1 = require("@theia/core/lib/common/path");
|
|
25
|
+
const hljs = require("highlight.js");
|
|
26
|
+
const markdownit = require("@theia/core/shared/markdown-it");
|
|
27
|
+
const markdownitemoji = require("@theia/core/shared/markdown-it-emoji");
|
|
28
|
+
const anchor = require("@theia/core/shared/markdown-it-anchor");
|
|
29
|
+
const DOMPurify = require("@theia/core/shared/dompurify");
|
|
30
|
+
const preview_uri_1 = require("../preview-uri");
|
|
31
|
+
const preview_handler_1 = require("../preview-handler");
|
|
32
|
+
const preview_link_normalizer_1 = require("../preview-link-normalizer");
|
|
33
|
+
let MarkdownPreviewHandler = class MarkdownPreviewHandler {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.iconClass = 'markdown-icon file-icon';
|
|
36
|
+
this.contentClass = 'markdown-preview';
|
|
37
|
+
}
|
|
38
|
+
canHandle(uri) {
|
|
39
|
+
return uri.scheme === 'file'
|
|
40
|
+
&& (uri.path.ext.toLowerCase() === '.md' ||
|
|
41
|
+
uri.path.ext.toLowerCase() === '.markdown') ? 500 : 0;
|
|
42
|
+
}
|
|
43
|
+
renderContent(params) {
|
|
44
|
+
const content = params.content;
|
|
45
|
+
const renderedContent = this.getEngine().render(content, params);
|
|
46
|
+
const contentElement = document.createElement('div');
|
|
47
|
+
contentElement.classList.add(this.contentClass);
|
|
48
|
+
contentElement.innerHTML = DOMPurify.sanitize(renderedContent);
|
|
49
|
+
this.addLinkClickedListener(contentElement, params);
|
|
50
|
+
return contentElement;
|
|
51
|
+
}
|
|
52
|
+
addLinkClickedListener(contentElement, params) {
|
|
53
|
+
contentElement.addEventListener('click', (event) => {
|
|
54
|
+
const candidate = (event.target || event.srcElement);
|
|
55
|
+
const link = this.findLink(candidate, contentElement);
|
|
56
|
+
if (link) {
|
|
57
|
+
event.preventDefault();
|
|
58
|
+
if (link.startsWith('#')) {
|
|
59
|
+
this.revealFragment(contentElement, link);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
const preview = !(common_1.isOSX ? event.metaKey : event.ctrlKey);
|
|
63
|
+
const uri = this.resolveUri(link, params.originUri, preview);
|
|
64
|
+
this.openLink(uri, params.originUri);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
findLink(element, container) {
|
|
70
|
+
let candidate = element;
|
|
71
|
+
while (candidate.tagName !== 'A') {
|
|
72
|
+
if (candidate === container) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
candidate = candidate.parentElement;
|
|
76
|
+
if (!candidate) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return candidate.getAttribute('href') || undefined;
|
|
81
|
+
}
|
|
82
|
+
async openLink(uri, originUri) {
|
|
83
|
+
const opener = await this.openerService.getOpener(uri);
|
|
84
|
+
opener.open(uri, { originUri });
|
|
85
|
+
}
|
|
86
|
+
resolveUri(link, uri, preview) {
|
|
87
|
+
const linkURI = new uri_1.default(link);
|
|
88
|
+
// URIs are always absolute, check link as a path whether it is relative
|
|
89
|
+
if (!new path_1.Path(link).isAbsolute && linkURI.scheme === uri.scheme &&
|
|
90
|
+
(!linkURI.authority || linkURI.authority === uri.authority)) {
|
|
91
|
+
// get a relative path from URI by trimming leading `/`
|
|
92
|
+
const relativePath = linkURI.path.toString().substring(1);
|
|
93
|
+
const resolvedUri = uri.parent.resolve(relativePath).withFragment(linkURI.fragment).withQuery(linkURI.query);
|
|
94
|
+
return preview ? preview_uri_1.PreviewUri.encode(resolvedUri) : resolvedUri;
|
|
95
|
+
}
|
|
96
|
+
return linkURI;
|
|
97
|
+
}
|
|
98
|
+
revealFragment(contentElement, fragment) {
|
|
99
|
+
const elementToReveal = this.findElementForFragment(contentElement, fragment);
|
|
100
|
+
if (!elementToReveal) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
elementToReveal.scrollIntoView();
|
|
104
|
+
}
|
|
105
|
+
findElementForFragment(content, link) {
|
|
106
|
+
const fragment = link.startsWith('#') ? link.substring(1) : link;
|
|
107
|
+
const filter = {
|
|
108
|
+
acceptNode: (node) => {
|
|
109
|
+
if (node instanceof HTMLHeadingElement) {
|
|
110
|
+
if (node.tagName.toLowerCase().startsWith('h') && node.id === fragment) {
|
|
111
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
112
|
+
}
|
|
113
|
+
return NodeFilter.FILTER_SKIP;
|
|
114
|
+
}
|
|
115
|
+
return NodeFilter.FILTER_SKIP;
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const treeWalker = document.createTreeWalker(content, NodeFilter.SHOW_ELEMENT, filter);
|
|
119
|
+
if (treeWalker.nextNode()) {
|
|
120
|
+
const element = treeWalker.currentNode;
|
|
121
|
+
return element;
|
|
122
|
+
}
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
findElementForSourceLine(content, sourceLine) {
|
|
126
|
+
const markedElements = content.getElementsByClassName('line');
|
|
127
|
+
let matchedElement;
|
|
128
|
+
for (let i = 0; i < markedElements.length; i++) {
|
|
129
|
+
const element = markedElements[i];
|
|
130
|
+
const line = Number.parseInt(element.getAttribute('data-line') || '0');
|
|
131
|
+
if (line > sourceLine) {
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
matchedElement = element;
|
|
135
|
+
}
|
|
136
|
+
return matchedElement;
|
|
137
|
+
}
|
|
138
|
+
getSourceLineForOffset(content, offset) {
|
|
139
|
+
const lineElements = this.getLineElementsAtOffset(content, offset);
|
|
140
|
+
if (lineElements.length < 1) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
const firstLineNumber = this.getLineNumberFromAttribute(lineElements[0]);
|
|
144
|
+
if (firstLineNumber === undefined) {
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
if (lineElements.length === 1) {
|
|
148
|
+
return firstLineNumber;
|
|
149
|
+
}
|
|
150
|
+
const secondLineNumber = this.getLineNumberFromAttribute(lineElements[1]);
|
|
151
|
+
if (secondLineNumber === undefined) {
|
|
152
|
+
return firstLineNumber;
|
|
153
|
+
}
|
|
154
|
+
const y1 = lineElements[0].offsetTop;
|
|
155
|
+
const y2 = lineElements[1].offsetTop;
|
|
156
|
+
const dY = (offset - y1) / (y2 - y1);
|
|
157
|
+
const dL = (secondLineNumber - firstLineNumber) * dY;
|
|
158
|
+
const line = firstLineNumber + Math.floor(dL);
|
|
159
|
+
return line;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* returns two significant line elements for the given offset.
|
|
163
|
+
*/
|
|
164
|
+
getLineElementsAtOffset(content, offset) {
|
|
165
|
+
let skipNext = false;
|
|
166
|
+
const filter = {
|
|
167
|
+
acceptNode: (node) => {
|
|
168
|
+
if (node instanceof HTMLElement) {
|
|
169
|
+
if (node.classList.contains('line')) {
|
|
170
|
+
if (skipNext) {
|
|
171
|
+
return NodeFilter.FILTER_SKIP;
|
|
172
|
+
}
|
|
173
|
+
if (node.offsetTop > offset) {
|
|
174
|
+
skipNext = true;
|
|
175
|
+
}
|
|
176
|
+
return NodeFilter.FILTER_ACCEPT;
|
|
177
|
+
}
|
|
178
|
+
return NodeFilter.FILTER_SKIP;
|
|
179
|
+
}
|
|
180
|
+
return NodeFilter.FILTER_REJECT;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const treeWalker = document.createTreeWalker(content, NodeFilter.SHOW_ELEMENT, filter);
|
|
184
|
+
const lineElements = [];
|
|
185
|
+
while (treeWalker.nextNode()) {
|
|
186
|
+
const element = treeWalker.currentNode;
|
|
187
|
+
lineElements.push(element);
|
|
188
|
+
}
|
|
189
|
+
return lineElements.slice(-2);
|
|
190
|
+
}
|
|
191
|
+
getLineNumberFromAttribute(element) {
|
|
192
|
+
const attribute = element.getAttribute('data-line');
|
|
193
|
+
return attribute ? Number.parseInt(attribute) : undefined;
|
|
194
|
+
}
|
|
195
|
+
getEngine() {
|
|
196
|
+
if (!this.engine) {
|
|
197
|
+
const engine = this.engine = markdownit({
|
|
198
|
+
html: true,
|
|
199
|
+
linkify: true,
|
|
200
|
+
highlight: (str, lang) => {
|
|
201
|
+
if (lang && hljs.getLanguage(lang)) {
|
|
202
|
+
try {
|
|
203
|
+
return '<pre class="hljs"><code><div>' + hljs.highlight(lang, str, true).value + '</div></code></pre>';
|
|
204
|
+
}
|
|
205
|
+
catch { }
|
|
206
|
+
}
|
|
207
|
+
return '<pre class="hljs"><code><div>' + engine.utils.escapeHtml(str) + '</div></code></pre>';
|
|
208
|
+
}
|
|
209
|
+
}).use(markdownitemoji.full).use(anchor.default, {});
|
|
210
|
+
const renderers = ['heading_open', 'paragraph_open', 'list_item_open', 'blockquote_open', 'code_block', 'image', 'fence'];
|
|
211
|
+
for (const renderer of renderers) {
|
|
212
|
+
const originalRenderer = engine.renderer.rules[renderer];
|
|
213
|
+
engine.renderer.rules[renderer] = (tokens, index, options, env, self) => {
|
|
214
|
+
const token = tokens[index];
|
|
215
|
+
if (token.map) {
|
|
216
|
+
const line = token.map[0];
|
|
217
|
+
token.attrJoin('class', 'line');
|
|
218
|
+
token.attrSet('data-line', line.toString());
|
|
219
|
+
}
|
|
220
|
+
return (originalRenderer)
|
|
221
|
+
// tslint:disable-next-line:no-void-expression
|
|
222
|
+
? originalRenderer(tokens, index, options, env, self)
|
|
223
|
+
: self.renderToken(tokens, index, options);
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const originalImageRenderer = engine.renderer.rules.image;
|
|
227
|
+
if (originalImageRenderer) {
|
|
228
|
+
engine.renderer.rules.image = (tokens, index, options, env, self) => {
|
|
229
|
+
if (preview_handler_1.RenderContentParams.is(env)) {
|
|
230
|
+
const documentUri = env.originUri;
|
|
231
|
+
const token = tokens[index];
|
|
232
|
+
if (token.attrs) {
|
|
233
|
+
const srcAttr = token.attrs.find(a => a[0] === 'src');
|
|
234
|
+
if (srcAttr) {
|
|
235
|
+
const href = srcAttr[1];
|
|
236
|
+
srcAttr[1] = this.linkNormalizer.normalizeLink(documentUri, href);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return originalImageRenderer(tokens, index, options, env, self);
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
const domParser = new DOMParser();
|
|
244
|
+
const parseDOM = (html) => domParser.parseFromString(html, 'text/html').getElementsByTagName('body')[0];
|
|
245
|
+
const modifyDOM = (body, tag, procedure) => {
|
|
246
|
+
const elements = body.getElementsByTagName(tag);
|
|
247
|
+
for (let i = 0; i < elements.length; i++) {
|
|
248
|
+
const element = elements.item(i);
|
|
249
|
+
if (element) {
|
|
250
|
+
procedure(element);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
};
|
|
254
|
+
const normalizeAllImgSrcInHTML = (html, normalizeLink) => {
|
|
255
|
+
const body = parseDOM(html);
|
|
256
|
+
modifyDOM(body, 'img', img => {
|
|
257
|
+
const src = img.getAttributeNode('src');
|
|
258
|
+
if (src) {
|
|
259
|
+
src.nodeValue = normalizeLink(src.nodeValue || '');
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
return body.innerHTML;
|
|
263
|
+
};
|
|
264
|
+
for (const name of ['html_block', 'html_inline']) {
|
|
265
|
+
const originalRenderer = engine.renderer.rules[name];
|
|
266
|
+
if (originalRenderer) {
|
|
267
|
+
engine.renderer.rules[name] = (tokens, index, options, env, self) => {
|
|
268
|
+
const currentToken = tokens[index];
|
|
269
|
+
const content = currentToken.content;
|
|
270
|
+
if (content.includes('<img') && preview_handler_1.RenderContentParams.is(env)) {
|
|
271
|
+
const documentUri = env.originUri;
|
|
272
|
+
currentToken.content = normalizeAllImgSrcInHTML(content, link => this.linkNormalizer.normalizeLink(documentUri, link));
|
|
273
|
+
}
|
|
274
|
+
return originalRenderer(tokens, index, options, env, self);
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return this.engine;
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
exports.MarkdownPreviewHandler = MarkdownPreviewHandler;
|
|
283
|
+
tslib_1.__decorate([
|
|
284
|
+
(0, inversify_1.inject)(browser_1.OpenerService),
|
|
285
|
+
tslib_1.__metadata("design:type", Object)
|
|
286
|
+
], MarkdownPreviewHandler.prototype, "openerService", void 0);
|
|
287
|
+
tslib_1.__decorate([
|
|
288
|
+
(0, inversify_1.inject)(preview_link_normalizer_1.PreviewLinkNormalizer),
|
|
289
|
+
tslib_1.__metadata("design:type", preview_link_normalizer_1.PreviewLinkNormalizer)
|
|
290
|
+
], MarkdownPreviewHandler.prototype, "linkNormalizer", void 0);
|
|
291
|
+
exports.MarkdownPreviewHandler = MarkdownPreviewHandler = tslib_1.__decorate([
|
|
292
|
+
(0, inversify_1.injectable)()
|
|
293
|
+
], MarkdownPreviewHandler);
|
|
294
|
+
//# sourceMappingURL=markdown-preview-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-preview-handler.js","sourceRoot":"","sources":["../../../src/browser/markdown/markdown-preview-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-preview-handler.spec.d.ts","sourceRoot":"","sources":["../../../src/browser/markdown/markdown-preview-handler.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2018 TypeFox and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
/* eslint-disable no-unsanitized/property */
|
|
19
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
20
|
+
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
21
|
+
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
22
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
23
|
+
const chai = require("chai");
|
|
24
|
+
const chai_1 = require("chai");
|
|
25
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
26
|
+
const markdown_preview_handler_1 = require("./markdown-preview-handler");
|
|
27
|
+
disableJSDOM();
|
|
28
|
+
chai.use(require('chai-string'));
|
|
29
|
+
let previewHandler;
|
|
30
|
+
before(() => {
|
|
31
|
+
previewHandler = new markdown_preview_handler_1.MarkdownPreviewHandler();
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
previewHandler.linkNormalizer = {
|
|
34
|
+
normalizeLink: (documentUri, link) => 'endpoint/' + documentUri.parent.resolve(link).path.toString().substring(1)
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
describe('markdown-preview-handler', () => {
|
|
38
|
+
before(() => {
|
|
39
|
+
disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
40
|
+
});
|
|
41
|
+
after(() => {
|
|
42
|
+
disableJSDOM();
|
|
43
|
+
});
|
|
44
|
+
it('renders html with line information', async () => {
|
|
45
|
+
await assertRenderedContent(exampleMarkdown1, exampleHtml1);
|
|
46
|
+
});
|
|
47
|
+
it('renders images', async () => {
|
|
48
|
+
await assertRenderedContent(exampleMarkdown2, exampleHtml2);
|
|
49
|
+
});
|
|
50
|
+
it('renders HTML image as block', async () => {
|
|
51
|
+
await assertRenderedContent(exampleMarkdown3, exampleHtml3);
|
|
52
|
+
});
|
|
53
|
+
it('renders HTML images inlined', async () => {
|
|
54
|
+
await assertRenderedContent(exampleMarkdown4, exampleHtml4);
|
|
55
|
+
});
|
|
56
|
+
it('renders multiple HTML images in a html block', async () => {
|
|
57
|
+
await assertRenderedContent(exampleMarkdown5, exampleHtml5);
|
|
58
|
+
});
|
|
59
|
+
it('finds element for source line', () => {
|
|
60
|
+
document.body.innerHTML = exampleHtml1;
|
|
61
|
+
const element = previewHandler.findElementForSourceLine(document.body, 4);
|
|
62
|
+
(0, chai_1.expect)(element).not.to.be.equal(undefined);
|
|
63
|
+
(0, chai_1.expect)(element.tagName).to.be.equal('H2');
|
|
64
|
+
(0, chai_1.expect)(element.textContent).to.be.equal('License');
|
|
65
|
+
});
|
|
66
|
+
it('finds previous element for empty source line', () => {
|
|
67
|
+
document.body.innerHTML = exampleHtml1;
|
|
68
|
+
const element = previewHandler.findElementForSourceLine(document.body, 3);
|
|
69
|
+
(0, chai_1.expect)(element).not.to.be.equal(undefined);
|
|
70
|
+
(0, chai_1.expect)(element.tagName).to.be.equal('P');
|
|
71
|
+
(0, chai_1.expect)(element.textContent).that.startWith('Shows a preview of supported resources.');
|
|
72
|
+
});
|
|
73
|
+
it('finds source line for offset in html', () => {
|
|
74
|
+
mockOffsetProperties();
|
|
75
|
+
document.body.innerHTML = exampleHtml1;
|
|
76
|
+
for (const expectedLine of [0, 1, 4, 5]) {
|
|
77
|
+
const line = previewHandler.getSourceLineForOffset(document.body, offsetForLine(expectedLine));
|
|
78
|
+
(0, chai_1.expect)(line).to.be.equal(expectedLine);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
it('interpolates source lines for offset in html', () => {
|
|
82
|
+
mockOffsetProperties();
|
|
83
|
+
document.body.innerHTML = exampleHtml1;
|
|
84
|
+
const expectedLines = [1, 2, 3, 4];
|
|
85
|
+
const offsets = expectedLines.map(l => offsetForLine(l));
|
|
86
|
+
for (let i = 0; i < expectedLines.length; i++) {
|
|
87
|
+
const expectedLine = expectedLines[i];
|
|
88
|
+
const offset = offsets[i];
|
|
89
|
+
const line = previewHandler.getSourceLineForOffset(document.body, offset);
|
|
90
|
+
(0, chai_1.expect)(line).to.be.equal(expectedLine);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
it('can handle \'.md\' files', () => {
|
|
94
|
+
(0, chai_1.expect)(previewHandler.canHandle(new uri_1.default('a.md'))).greaterThan(0);
|
|
95
|
+
});
|
|
96
|
+
it('can handle \'.markdown\' files', () => {
|
|
97
|
+
(0, chai_1.expect)(previewHandler.canHandle(new uri_1.default('a.markdown'))).greaterThan(0);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
async function assertRenderedContent(source, expectation) {
|
|
101
|
+
const contentElement = previewHandler.renderContent({ content: source, originUri: new uri_1.default('file:///workspace/DEMO.md') });
|
|
102
|
+
(0, chai_1.expect)(contentElement.innerHTML).equals(expectation);
|
|
103
|
+
}
|
|
104
|
+
const exampleMarkdown1 = //
|
|
105
|
+
`# Theia - Preview Extension
|
|
106
|
+
Shows a preview of supported resources.
|
|
107
|
+
See [here](https://github.com/eclipse-theia/theia).
|
|
108
|
+
|
|
109
|
+
## License
|
|
110
|
+
[Apache-2.0](https://github.com/eclipse-theia/theia/blob/master/LICENSE)
|
|
111
|
+
`;
|
|
112
|
+
const exampleHtml1 = //
|
|
113
|
+
`<h1 id="theia---preview-extension" tabindex="-1" class="line" data-line="0">Theia - Preview Extension</h1>
|
|
114
|
+
<p class="line" data-line="1">Shows a preview of supported resources.
|
|
115
|
+
See <a href="https://github.com/eclipse-theia/theia">here</a>.</p>
|
|
116
|
+
<h2 id="license" tabindex="-1" class="line" data-line="4">License</h2>
|
|
117
|
+
<p class="line" data-line="5"><a href="https://github.com/eclipse-theia/theia/blob/master/LICENSE">Apache-2.0</a></p>
|
|
118
|
+
`;
|
|
119
|
+
const exampleMarkdown2 = //
|
|
120
|
+
`# Heading
|
|
121
|
+

|
|
122
|
+
`;
|
|
123
|
+
const exampleHtml2 = //
|
|
124
|
+
`<h1 id="heading" tabindex="-1" class="line" data-line="0">Heading</h1>
|
|
125
|
+
<p class="line" data-line="1"><img src="endpoint/workspace/subfolder/image.png" alt="alternativetext"></p>
|
|
126
|
+
`;
|
|
127
|
+
const exampleMarkdown3 = //
|
|
128
|
+
`# Block HTML Image
|
|
129
|
+
<img src="subfolder/image1.png" alt="tada"/>
|
|
130
|
+
|
|
131
|
+
# Block HTML Image
|
|
132
|
+
<img src="subfolder/image3.png" alt="tada"/>
|
|
133
|
+
`;
|
|
134
|
+
const exampleHtml3 = //
|
|
135
|
+
`<h1 id="block-html-image" tabindex="-1" class="line" data-line="0">Block HTML Image</h1>
|
|
136
|
+
<img src="endpoint/workspace/subfolder/image1.png" alt="tada">
|
|
137
|
+
<h1 id="block-html-image-1" tabindex="-1" class="line" data-line="3">Block HTML Image</h1>
|
|
138
|
+
<img src="endpoint/workspace/subfolder/image3.png" alt="tada">
|
|
139
|
+
`;
|
|
140
|
+
const exampleMarkdown4 = //
|
|
141
|
+
`# Inlined HTML Image
|
|
142
|
+
text in paragraph <img src="subfolder/image2.png" alt="tada"/>
|
|
143
|
+
`;
|
|
144
|
+
const exampleHtml4 = //
|
|
145
|
+
`<h1 id="inlined-html-image" tabindex="-1" class="line" data-line="0">Inlined HTML Image</h1>
|
|
146
|
+
<p class="line" data-line="1">text in paragraph <img src="endpoint/workspace/subfolder/image2.png" alt="tada"></p>
|
|
147
|
+
`;
|
|
148
|
+
const exampleMarkdown5 = //
|
|
149
|
+
`# Multiple HTML Images nested in blocks
|
|
150
|
+
word <p>
|
|
151
|
+
<img src="subfolder/image2.png" alt="tada"/>
|
|
152
|
+
</p>
|
|
153
|
+
|
|
154
|
+
<p>
|
|
155
|
+
<img src="subfolder/image2.png" alt="tada"/>
|
|
156
|
+
</p>
|
|
157
|
+
`;
|
|
158
|
+
const exampleHtml5 = //
|
|
159
|
+
`<h1 id="multiple-html-images-nested-in-blocks" tabindex="-1" class="line" data-line="0">Multiple HTML Images nested in blocks</h1>
|
|
160
|
+
<p class="line" data-line="1">word </p><p>
|
|
161
|
+
<img src="endpoint/workspace/subfolder/image2.png" alt="tada"></p>
|
|
162
|
+
<p></p>
|
|
163
|
+
<p>
|
|
164
|
+
<img src="endpoint/workspace/subfolder/image2.png" alt="tada">
|
|
165
|
+
</p>
|
|
166
|
+
`;
|
|
167
|
+
/**
|
|
168
|
+
* `offsetTop` of elements to be `sourceLine` number times `20`.
|
|
169
|
+
*/
|
|
170
|
+
function mockOffsetProperties() {
|
|
171
|
+
Object.defineProperties(HTMLElement.prototype, {
|
|
172
|
+
offsetLeft: {
|
|
173
|
+
get: () => 0
|
|
174
|
+
},
|
|
175
|
+
offsetTop: {
|
|
176
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
177
|
+
get: function () {
|
|
178
|
+
const element = this;
|
|
179
|
+
const line = Number.parseInt(element.getAttribute('data-line') || '0');
|
|
180
|
+
return offsetForLine(line);
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
offsetHeight: {
|
|
184
|
+
get: () => 0
|
|
185
|
+
},
|
|
186
|
+
offsetWidth: {
|
|
187
|
+
get: () => 0
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function offsetForLine(line) {
|
|
192
|
+
return line * 20;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=markdown-preview-handler.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-preview-handler.spec.js","sourceRoot":"","sources":["../../../src/browser/markdown/markdown-preview-handler.spec.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,4CAA4C;AAE5C,8DAAiE;AAEjE,IAAI,YAAY,GAAG,IAAA,mBAAW,GAAE,CAAC;AAEjC,uHAAiH;AACjH,wEAAiC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAE1C,6BAA6B;AAC7B,+BAA8B;AAC9B,oDAA6C;AAC7C,yEAAoE;AAEpE,YAAY,EAAE,CAAC;AAEf,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AAEjC,IAAI,cAAsC,CAAC;AAE3C,MAAM,CAAC,GAAG,EAAE;IACR,cAAc,GAAG,IAAI,iDAAsB,EAAE,CAAC;IAC9C,8DAA8D;IAC7D,cAAsB,CAAC,cAAc,GAAG;QACrC,aAAa,EAAE,CAAC,WAAgB,EAAE,IAAY,EAAE,EAAE,CAC9C,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;KAClF,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IAEtC,MAAM,CAAC,GAAG,EAAE;QACR,YAAY,GAAG,IAAA,mBAAW,GAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,GAAG,EAAE;QACP,YAAY,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gBAAgB,EAAE,KAAK,IAAI,EAAE;QAC5B,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC1D,MAAM,qBAAqB,CAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAA,aAAM,EAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAA,aAAM,EAAC,OAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;QACvC,MAAM,OAAO,GAAG,cAAc,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC1E,IAAA,aAAM,EAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAA,aAAM,EAAC,OAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAA,aAAM,EAAC,OAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,oBAAoB,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;QACvC,KAAK,MAAM,YAAY,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,cAAc,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC;YAC/F,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACpD,oBAAoB,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,IAAI,GAAG,cAAc,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC1E,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAChC,IAAA,aAAM,EAAC,cAAc,CAAC,SAAS,CAAC,IAAI,aAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,IAAA,aAAM,EAAC,cAAc,CAAC,SAAS,CAAC,IAAI,aAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,WAAmB;IACpE,MAAM,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,aAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC;IAC1H,IAAA,aAAM,EAAC,cAAc,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,gBAAgB,GAAG,EAAE;CACvB;;;;;;CAMH,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE;CACnB;;;;;CAKH,CAAC;AAEF,MAAM,gBAAgB,GAAG,EAAE;CACvB;;CAEH,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE;CACnB;;CAEH,CAAC;AAEF,MAAM,gBAAgB,GAAG,EAAE;CACvB;;;;;CAKH,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE;CACnB;;;;CAIH,CAAC;AAEF,MAAM,gBAAgB,GAAG,EAAE;CACvB;;CAEH,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE;CACnB;;CAEH,CAAC;AAEF,MAAM,gBAAgB,GAAG,EAAE;CACvB;;;;;;;;CAQH,CAAC;AAEF,MAAM,YAAY,GAAG,EAAE;CACnB;;;;;;;CAOH,CAAC;AAEF;;GAEG;AACH,SAAS,oBAAoB;IACzB,MAAM,CAAC,gBAAgB,CAAC,WAAW,CAAC,SAAS,EAAE;QAC3C,UAAU,EAAE;YACR,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;SACf;QACD,SAAS,EAAE;YACP,8DAA8D;YAC9D,GAAG,EAAE;gBACD,MAAM,OAAO,GAAG,IAAmB,CAAC;gBACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC;gBACvE,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;YAC/B,CAAC;SACJ;QACD,YAAY,EAAE;YACV,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;SACf;QACD,WAAW,EAAE;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;SACf;KACJ,CAAC,CAAC;AACP,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IAC/B,OAAO,IAAI,GAAG,EAAE,CAAC;AACrB,CAAC"}
|