@talrace/ngx-noder 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +21 -9
- package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +8 -2
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +2 -2
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +3 -3
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +2 -2
- package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +1 -8
- package/esm2022/lib/editor/components/edges/edge.component.mjs +2 -2
- package/esm2022/lib/editor/components/edges/edges.mjs +21 -2
- package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +18 -1
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +22 -56
- package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +6 -6
- package/esm2022/lib/editor/components/table/components/table.component.mjs +13 -4
- package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +3 -4
- package/esm2022/lib/editor/components/table/selection/table-selection.mjs +15 -5
- package/esm2022/lib/editor/content/constants/editor.const.mjs +9 -1
- package/esm2022/lib/editor/content/display-data/display-data.mjs +839 -0
- package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +1 -1
- package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +8 -0
- package/esm2022/lib/editor/content/display-data/paragraph.mjs +5 -1
- package/esm2022/lib/editor/content/display-data/text-line-info.mjs +2 -1
- package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +1 -1
- package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +12 -30
- package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +62 -0
- package/esm2022/lib/editor/content/helpers/link.helper.mjs +6 -0
- package/esm2022/lib/editor/display/layers/cursor.layer.mjs +9 -8
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +5 -5
- package/esm2022/lib/editor/display/layers/print.text.layer.mjs +2 -2
- package/esm2022/lib/editor/display/layers/selection.layer.mjs +15 -9
- package/esm2022/lib/editor/display/layers/text.layer.mjs +29 -32
- package/esm2022/lib/editor/display/print/print.renderer.mjs +8 -8
- package/esm2022/lib/editor/display/renderer.mjs +10 -10
- package/esm2022/lib/editor/display/rendering.helper.mjs +2 -4
- package/esm2022/lib/editor/display/virtual.renderer.mjs +5 -5
- package/esm2022/lib/editor/execution/edit.session.mjs +211 -754
- package/esm2022/lib/editor/execution/editor.mjs +119 -77
- package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +41 -32
- package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +12 -0
- package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +11 -3
- package/esm2022/lib/editor/execution/regulator.service.mjs +28 -20
- package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +13 -0
- package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +77 -10
- package/esm2022/lib/editor/gadgets/search/search.mjs +6 -6
- package/esm2022/lib/editor/interaction/editor.service.mjs +27 -6
- package/esm2022/lib/editor/interaction/input.handler.mjs +8 -5
- package/esm2022/lib/editor/interaction/mouse.handler.mjs +2 -1
- package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +32 -2
- package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +67 -14
- package/esm2022/lib/editor/operations/operations-helper.helper.mjs +27 -20
- package/esm2022/lib/editor/operations/save-commands.helper.mjs +2 -2
- package/esm2022/lib/editor/positioning/content.helper.mjs +15 -15
- package/esm2022/lib/editor/positioning/line-width.helper.mjs +5 -5
- package/esm2022/lib/editor/positioning/position.helper.mjs +34 -32
- package/esm2022/lib/editor/positioning/selection.mjs +42 -32
- package/esm2022/lib/editor/revision.helper.mjs +4 -3
- package/esm2022/lib/models/generated/link.model.mjs +1 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/talrace-ngx-noder.mjs +3863 -3558
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +0 -1
- package/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.d.ts +0 -2
- package/lib/editor/components/image/input-handler/image-input.handler.d.ts +3 -0
- package/lib/editor/components/shared/services/custom-content.service.d.ts +3 -5
- package/lib/editor/components/table/components/table-cell.component.d.ts +1 -1
- package/lib/editor/components/table/components/table.component.d.ts +1 -0
- package/lib/editor/components/table/models/cell-data.model.d.ts +1 -1
- package/lib/editor/components/table/selection/table-selection.d.ts +2 -0
- package/lib/editor/content/constants/editor.const.d.ts +2 -0
- package/lib/editor/content/display-data/display-data.d.ts +103 -0
- package/lib/editor/content/display-data/general-properties.model.d.ts +5 -0
- package/lib/editor/content/display-data/models/paragraph-info.model.d.ts +9 -0
- package/lib/editor/content/display-data/paragraph.d.ts +1 -0
- package/lib/editor/content/display-data/text-line-info.d.ts +1 -0
- package/lib/editor/content/display-data/toolbar-styles.interface.d.ts +1 -1
- package/lib/editor/content/helpers/content-style.helper.d.ts +1 -2
- package/lib/editor/content/helpers/display-token.helper.d.ts +6 -0
- package/lib/editor/content/helpers/link.helper.d.ts +4 -0
- package/lib/editor/display/layers/text.layer.d.ts +2 -3
- package/lib/editor/display/print/print.renderer.d.ts +0 -2
- package/lib/editor/execution/edit.session.d.ts +12 -59
- package/lib/editor/execution/editor.d.ts +9 -6
- package/lib/editor/execution/helpers/format-style.helper.d.ts +2 -2
- package/lib/editor/execution/helpers/image.helpet.d.ts +4 -0
- package/lib/editor/execution/regulator.service.d.ts +1 -1
- package/lib/editor/gadgets/numbering/numbering-paragraph-style.model.d.ts +6 -0
- package/lib/editor/gadgets/numbering/numbering.helper.d.ts +10 -3
- package/lib/editor/interaction/editor.service.d.ts +12 -3
- package/lib/editor/operations/helpers/link-operations.helper.d.ts +6 -3
- package/lib/editor/positioning/content.helper.d.ts +6 -5
- package/lib/editor/positioning/position.helper.d.ts +3 -3
- package/lib/editor/positioning/selection.d.ts +3 -0
- package/lib/models/generated/link.model.d.ts +3 -1
- package/package.json +8 -8
- package/public-api.d.ts +1 -0
- package/src/_ngx-noder.theme.scss +31 -2
- package/src/styles.scss +0 -1
- package/esm2022/lib/editor/content/display-data/document.mjs +0 -134
- package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +0 -226
- package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +0 -18
- package/lib/editor/content/display-data/document.d.ts +0 -56
- package/lib/editor/content/display-data/pages.wrap.d.ts +0 -42
- package/lib/editor/execution/helpers/delta.helper.d.ts +0 -6
- package/src/scss/_fonts.scss +0 -3
|
@@ -76,8 +76,8 @@ export declare class EditorService {
|
|
|
76
76
|
private _insertLink$;
|
|
77
77
|
get endMousePress$(): Observable<void>;
|
|
78
78
|
private _endMousePress$;
|
|
79
|
-
get
|
|
80
|
-
private
|
|
79
|
+
get disableSelection$(): Observable<void>;
|
|
80
|
+
private _disableSelection$;
|
|
81
81
|
get changedTableSize$(): Observable<{
|
|
82
82
|
insertIndex: number;
|
|
83
83
|
sessionId: number;
|
|
@@ -154,6 +154,12 @@ export declare class EditorService {
|
|
|
154
154
|
private _removeSelected$;
|
|
155
155
|
get keyDown$(): Observable<KeyboardEvent>;
|
|
156
156
|
private _keyDown$;
|
|
157
|
+
get updateEdges$(): Observable<number>;
|
|
158
|
+
private _updateEdges$;
|
|
159
|
+
get insertText$(): Observable<string>;
|
|
160
|
+
private _insertText$;
|
|
161
|
+
get blurCustomComponent$(): Observable<void>;
|
|
162
|
+
private _blurCustomComponent$;
|
|
157
163
|
setIsViewOnly(value: boolean): void;
|
|
158
164
|
setHasSelection(value: boolean): void;
|
|
159
165
|
setClipboardData(value: string): void;
|
|
@@ -168,7 +174,7 @@ export declare class EditorService {
|
|
|
168
174
|
insertImage(imageData: ImageDataModel): void;
|
|
169
175
|
insertLink(text: string, link: string): void;
|
|
170
176
|
endMousePress(): void;
|
|
171
|
-
|
|
177
|
+
disableSelection(): void;
|
|
172
178
|
openElementSidenav(component: Type<ExternalSidenavInterface>, model: ElementModel, contentWidth: number): void;
|
|
173
179
|
openSidenav(component: Type<any>): void;
|
|
174
180
|
closeSidenav(): void;
|
|
@@ -195,6 +201,9 @@ export declare class EditorService {
|
|
|
195
201
|
selectAll(): void;
|
|
196
202
|
removeSelected(): void;
|
|
197
203
|
keyDown(event: KeyboardEvent): void;
|
|
204
|
+
updateEdges(sessionId: number): void;
|
|
205
|
+
insertText(text: string): void;
|
|
206
|
+
blurCustomComponent(): void;
|
|
198
207
|
static ɵfac: i0.ɵɵFactoryDeclaration<EditorService, never>;
|
|
199
208
|
static ɵprov: i0.ɵɵInjectableDeclaration<EditorService>;
|
|
200
209
|
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { LinkModel } from '../../../models/generated/link.model';
|
|
2
|
+
import { TextStyleModel } from '../../../models/generated/text-style.model';
|
|
2
3
|
export declare class LinkOperationsHelper {
|
|
3
|
-
static
|
|
4
|
-
static
|
|
5
|
-
static
|
|
4
|
+
static insert(links: LinkModel[], link: string, startIndex: number, endIndex: number, textStyle: TextStyleModel): void;
|
|
5
|
+
static insertContent(links: LinkModel[], insertIndex: number, textLength: number): void;
|
|
6
|
+
static removeContent(links: LinkModel[], startIndex: number, endIndex: number): void;
|
|
7
|
+
static restore(links: LinkModel[], startIndex: number, contentLength: number, newlinks: LinkModel[]): void;
|
|
8
|
+
static replaceContent(links: LinkModel[], startIndex: number, endIndex: number, length: number): void;
|
|
6
9
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { CursorParagraph } from './cursor-paragraph';
|
|
2
2
|
import { InsertIndexInterface } from './insert-index.interface';
|
|
3
|
+
import { ParagraphInfoModel } from '../content/display-data/models/paragraph-info.model';
|
|
3
4
|
import { Range } from './range';
|
|
4
5
|
export declare class ContentHelper {
|
|
5
|
-
static documentIndexToParagraphIndex(
|
|
6
|
-
static documentIndexToParagraphWithOffset(
|
|
7
|
-
static paragraphPositionToDocumentIndex(
|
|
8
|
-
static getSelectedPartDocumentIndexes(
|
|
6
|
+
static documentIndexToParagraphIndex(paragraphs: ParagraphInfoModel[], indexInDocument: number): CursorParagraph;
|
|
7
|
+
static documentIndexToParagraphWithOffset(paragraphs: ParagraphInfoModel[], indexInDocument: number): CursorParagraph;
|
|
8
|
+
static paragraphPositionToDocumentIndex(paragraphs: ParagraphInfoModel[], paragraph: CursorParagraph): number;
|
|
9
|
+
static getSelectedPartDocumentIndexes(paragraphs: ParagraphInfoModel[], range: Range): {
|
|
9
10
|
startIndex: number;
|
|
10
11
|
endIndex: number;
|
|
11
12
|
};
|
|
12
|
-
static paragraphToDocumentIndex(
|
|
13
|
+
static paragraphToDocumentIndex(paragraphs: ParagraphInfoModel[], paragraph: number, index: number): number;
|
|
13
14
|
static setIndexesElementsInInterval<T extends InsertIndexInterface>(elements: T[], elementIndexes: number[], startIndex: number, endIndex: number): void;
|
|
14
15
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { CursorParagraph } from './cursor-paragraph';
|
|
2
2
|
import { CursorPosition } from './cursor-position.interface';
|
|
3
3
|
import { EditSession } from '../execution/edit.session';
|
|
4
|
-
import { Paragraph } from '../content/display-data/paragraph';
|
|
5
4
|
import { ParagraphInfo } from '../content/display-data/paragraph-info.interface';
|
|
5
|
+
import { ParagraphInfoModel } from '../content/display-data/models/paragraph-info.model';
|
|
6
6
|
export declare class PositionHelper {
|
|
7
7
|
/**
|
|
8
8
|
* Returns an object containing the `pageX` and `pageY` coordinates of the document position.
|
|
@@ -11,7 +11,7 @@ export declare class PositionHelper {
|
|
|
11
11
|
/**
|
|
12
12
|
* Get paragraph info (paragraph index, paragraph line index, line top offset and others) by row index
|
|
13
13
|
**/
|
|
14
|
-
static getParagraphInfoByRow(paragraphs:
|
|
14
|
+
static getParagraphInfoByRow(paragraphs: ParagraphInfoModel[], row: number): ParagraphInfo;
|
|
15
15
|
static documentToScreen(session: EditSession, paragraph: number, indexInParagraph: number): CursorParagraph;
|
|
16
16
|
static screenToDocument(session: EditSession, line: number, indexInLine: number): CursorParagraph;
|
|
17
17
|
/**
|
|
@@ -25,7 +25,7 @@ export declare class PositionHelper {
|
|
|
25
25
|
top: number;
|
|
26
26
|
left: number;
|
|
27
27
|
}): CursorParagraph;
|
|
28
|
-
static findLineInParagraphs(paragraphs:
|
|
28
|
+
static findLineInParagraphs(paragraphs: ParagraphInfoModel[], documentLine: number): {
|
|
29
29
|
paragraphIndex: number;
|
|
30
30
|
lineIndex: number;
|
|
31
31
|
};
|
|
@@ -5,6 +5,7 @@ import { Range } from './range';
|
|
|
5
5
|
export declare class Selection {
|
|
6
6
|
anchor: CursorParagraph | null;
|
|
7
7
|
cursor: CursorParagraph;
|
|
8
|
+
isDisabled: boolean;
|
|
8
9
|
private keepLinePositionX;
|
|
9
10
|
get isEmpty(): boolean;
|
|
10
11
|
get isBackwards(): boolean;
|
|
@@ -14,6 +15,8 @@ export declare class Selection {
|
|
|
14
15
|
placeSelection(cursor: CursorParagraph, anchor: CursorParagraph): void;
|
|
15
16
|
moveSelection(position: CursorParagraph): void;
|
|
16
17
|
clearSelection(): void;
|
|
18
|
+
disableSelection(): void;
|
|
19
|
+
enableSelection(): void;
|
|
17
20
|
selectAll(model: ContentsInterface): void;
|
|
18
21
|
selectUp(session: EditSession): void;
|
|
19
22
|
navigateUp(session: EditSession): void;
|
package/package.json
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talrace/ngx-noder",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.10",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@angular/common": "^17.
|
|
7
|
-
"@angular/core": "^17.
|
|
8
|
-
"@angular/forms": "^17.
|
|
9
|
-
"@angular/material": "^17.
|
|
10
|
-
"@angular/router": "^17.
|
|
6
|
+
"@angular/common": "^17.3.12",
|
|
7
|
+
"@angular/core": "^17.3.12",
|
|
8
|
+
"@angular/forms": "^17.3.12",
|
|
9
|
+
"@angular/material": "^17.3.6",
|
|
10
|
+
"@angular/router": "^17.3.12",
|
|
11
11
|
"@ngxs/router-plugin": "^3.8.2",
|
|
12
12
|
"@ngxs/store": "^3.8.2",
|
|
13
13
|
"material-icons": "^1.13.12",
|
|
14
|
-
"ngx-colors": "^3.
|
|
14
|
+
"ngx-colors": "^3.6.0",
|
|
15
15
|
"ngx-toastr": "^18.0.0",
|
|
16
16
|
"roboto-fontface": "0.10.0"
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"tslib": "^2.3
|
|
19
|
+
"tslib": "^2.6.3"
|
|
20
20
|
},
|
|
21
21
|
"sideEffects": false,
|
|
22
22
|
"module": "fesm2022/talrace-ngx-noder.mjs",
|
package/public-api.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export * from './lib/apart-components/editor-toolbar/editor-toolbar/editor-toolb
|
|
|
27
27
|
export * from './lib/apart-components/editor-toolbar/shared/enums/alignment.enum';
|
|
28
28
|
export * from './lib/apart-components/editor-toolbar/shared/enums/editor-toolbar-mode.enum';
|
|
29
29
|
export * from './lib/apart-components/editor-toolbar/shared/services/editor-toolbar.service';
|
|
30
|
+
export * from './lib/apart-components/text-format-mobile/text-format-mobile.component';
|
|
30
31
|
export * from './lib/editor/interaction/mode.enum';
|
|
31
32
|
export * from './lib/editor/revision.helper';
|
|
32
33
|
export * from './lib/apart-components/add-link-dialog/add-link-dialog.component';
|
|
@@ -11,19 +11,48 @@
|
|
|
11
11
|
@import 'lib/editor/theme';
|
|
12
12
|
|
|
13
13
|
@mixin ngx-noder-theme($theme) {
|
|
14
|
+
@include ngx-noder-add-link-theme($theme);
|
|
15
|
+
@include ngx-noder-text-format-theme($theme);
|
|
16
|
+
@include ngx-noder-confirm-theme($theme);
|
|
17
|
+
@include ngx-noder-title-theme($theme);
|
|
18
|
+
@include ngx-noder-toolbar-theme($theme);
|
|
19
|
+
@include ngx-noder-insert-table-theme($theme);
|
|
20
|
+
@include ngx-noder-editor-theme($theme);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@mixin ngx-noder-editor-theme($theme) {
|
|
24
|
+
@include editor-theme($theme);
|
|
25
|
+
|
|
14
26
|
$font-family: roboto, helvetica, neue, 'Helvetica', Arial, sans-serif;
|
|
15
27
|
$custom-typography: mat.define-typography-config(
|
|
16
28
|
$font-family: $font-family
|
|
17
29
|
);
|
|
30
|
+
@include mat.all-component-typographies($custom-typography);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@mixin ngx-noder-add-link-theme($theme) {
|
|
18
34
|
@include add-link-dialog-component($theme);
|
|
19
35
|
@include add-link-mobile-component($theme);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@mixin ngx-noder-text-format-theme($theme) {
|
|
20
39
|
@include text-format-mobile-component($theme);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@mixin ngx-noder-confirm-theme($theme) {
|
|
21
43
|
@include confirm-dialog-theme($theme);
|
|
22
|
-
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@mixin ngx-noder-title-theme($theme) {
|
|
23
47
|
@include editor-title-component-theme($theme);
|
|
24
48
|
@include editor-title-mobile-component-theme($theme);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@mixin ngx-noder-toolbar-theme($theme) {
|
|
25
52
|
@include editor-toolbar-theme($theme);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@mixin ngx-noder-insert-table-theme($theme) {
|
|
26
56
|
@include insert-table-component($theme);
|
|
27
57
|
@include insert-table-mobile-component($theme);
|
|
28
|
-
@include mat.all-component-typographies($custom-typography);
|
|
29
58
|
}
|
package/src/styles.scss
CHANGED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { BreakTypes } from '../../gadgets/page-break/break-types.enum';
|
|
2
|
-
import { CursorParagraph } from '../../positioning/cursor-paragraph';
|
|
3
|
-
import { DeltaHelper } from '../../execution/helpers/delta.helper';
|
|
4
|
-
import { NEW_LINE_MARKUP } from '../constants/editor.const';
|
|
5
|
-
import { Range } from '../../positioning/range';
|
|
6
|
-
export class Document {
|
|
7
|
-
/**
|
|
8
|
-
* Returns all the lines in the document as a single string, joined by the new line character.
|
|
9
|
-
**/
|
|
10
|
-
get text() {
|
|
11
|
-
return this.lines.join(NEW_LINE_MARKUP);
|
|
12
|
-
}
|
|
13
|
-
get length() {
|
|
14
|
-
return this.lines.length;
|
|
15
|
-
}
|
|
16
|
-
constructor(model, pageMargin, pagesSpace, pageWidth, pageHeight) {
|
|
17
|
-
this.model = model;
|
|
18
|
-
this.pageMargin = pageMargin;
|
|
19
|
-
this.pagesSpace = pagesSpace;
|
|
20
|
-
this.pageWidth = pageWidth;
|
|
21
|
-
this.pageHeight = pageHeight;
|
|
22
|
-
this.lines = [''];
|
|
23
|
-
this.lines = DeltaHelper.splitByParagraphs(this.model.content);
|
|
24
|
-
}
|
|
25
|
-
insertText(position, text) {
|
|
26
|
-
const endPoint = DeltaHelper.insertTextAndReturnEndCursorPosition(this.lines, text, position);
|
|
27
|
-
return endPoint;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Removes the `range` from the document.
|
|
31
|
-
**/
|
|
32
|
-
removeRange(range) {
|
|
33
|
-
DeltaHelper.remove(this.lines, range.start, range.end);
|
|
34
|
-
}
|
|
35
|
-
getLine(lines, index) {
|
|
36
|
-
return lines[index] || '';
|
|
37
|
-
}
|
|
38
|
-
getAllLines() {
|
|
39
|
-
return this.getLines(0, this.getLinesCount());
|
|
40
|
-
}
|
|
41
|
-
getLinesCount() {
|
|
42
|
-
return this.lines.length - 1;
|
|
43
|
-
}
|
|
44
|
-
getLines(firstRow, lastRow) {
|
|
45
|
-
return this.lines.slice(firstRow, lastRow + 1);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Returns all the text within `range` as an array of lines.
|
|
49
|
-
**/
|
|
50
|
-
getLinesForRange(range) {
|
|
51
|
-
if (range.isSingleLine) {
|
|
52
|
-
const line = this.getLine(this.lines, range.start.row);
|
|
53
|
-
const linePartInRange = line.slice(range.start.column, range.end.column);
|
|
54
|
-
return [linePartInRange];
|
|
55
|
-
}
|
|
56
|
-
const lines = this.getLines(range.start.row, range.end.row);
|
|
57
|
-
lines[0] = (lines[0] || '').slice(range.start.column);
|
|
58
|
-
const lastIndex = lines.length - 1;
|
|
59
|
-
lines[lastIndex] = lines[lastIndex].slice(0, range.end.column);
|
|
60
|
-
return lines;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Returns all the text within `range` as a single string.
|
|
64
|
-
**/
|
|
65
|
-
getTextRange(range) {
|
|
66
|
-
return this.getLinesForRange(range).join(NEW_LINE_MARKUP);
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* Converts the position in a document to the character's index.
|
|
70
|
-
*/
|
|
71
|
-
positionToIndex(position, startRow = 0) {
|
|
72
|
-
let index = 0;
|
|
73
|
-
const endRow = Math.min(position.row, this.lines.length);
|
|
74
|
-
for (let i = startRow || 0; i < endRow; i++) {
|
|
75
|
-
index += this.lines[i].length + 1;
|
|
76
|
-
}
|
|
77
|
-
return index + position.column;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Converts an index position in a document to the position.
|
|
81
|
-
* See 'positionToIndex' for more information.
|
|
82
|
-
*/
|
|
83
|
-
indexToPosition(positionIndex, startRow) {
|
|
84
|
-
const newlineLength = NEW_LINE_MARKUP.length;
|
|
85
|
-
for (let lineIndex = startRow || 0; lineIndex < this.lines.length; lineIndex++) {
|
|
86
|
-
positionIndex -= this.lines[lineIndex].length + newlineLength;
|
|
87
|
-
if (positionIndex < 0) {
|
|
88
|
-
const column = positionIndex + this.lines[lineIndex].length + newlineLength;
|
|
89
|
-
return new CursorParagraph(lineIndex, column);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
const column = positionIndex + this.lines[this.lines.length - 1].length + newlineLength;
|
|
93
|
-
return new CursorParagraph(this.lines.length - 1, column);
|
|
94
|
-
}
|
|
95
|
-
indexesToRange(startIndex, endIndex) {
|
|
96
|
-
const startPoint = this.indexToPosition(startIndex, 0);
|
|
97
|
-
const endPoint = this.indexToPosition(endIndex, 0);
|
|
98
|
-
return new Range(startPoint, endPoint);
|
|
99
|
-
}
|
|
100
|
-
isNewLineSymbol(index) {
|
|
101
|
-
const text = this.text;
|
|
102
|
-
return !text || !text[index] || text[index] === NEW_LINE_MARKUP;
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Converts the selection range in a document to the selected paragraphs indexes (start and end of paragraphs).
|
|
106
|
-
* start/end refers to the "absolute position" of a character in the document.
|
|
107
|
-
*/
|
|
108
|
-
getSelectedParagraphsByRange(range) {
|
|
109
|
-
const newlineLength = NEW_LINE_MARKUP.length;
|
|
110
|
-
let start = 0;
|
|
111
|
-
let end = 0;
|
|
112
|
-
let i;
|
|
113
|
-
const row = Math.min(range.end.row, this.lines.length - 1);
|
|
114
|
-
for (i = 0; i < row; i++) {
|
|
115
|
-
if (i < range.start.row) {
|
|
116
|
-
start += this.lines[i].length + newlineLength;
|
|
117
|
-
}
|
|
118
|
-
end += this.lines[i].length + newlineLength;
|
|
119
|
-
}
|
|
120
|
-
if (i < this.lines.length) {
|
|
121
|
-
end += this.lines[i].length;
|
|
122
|
-
}
|
|
123
|
-
return { start, end };
|
|
124
|
-
}
|
|
125
|
-
getPositionAfterBreak(position, breakType) {
|
|
126
|
-
if (breakType === BreakTypes.TextWrapping) {
|
|
127
|
-
return position;
|
|
128
|
-
}
|
|
129
|
-
const isLastColumn = position.column === this.lines[position.row].length;
|
|
130
|
-
const isLastParagraph = position.row === this.lines.length - 1;
|
|
131
|
-
return isLastColumn && !isLastParagraph ? new CursorParagraph(position.row + 1, 0) : position;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9lZGl0b3IvY29udGVudC9kaXNwbGF5LWRhdGEvZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRCxNQUFNLE9BQU8sUUFBUTtJQUdqQjs7UUFFSTtJQUNKLElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUVELFlBQ1ksS0FBd0IsRUFDekIsVUFBdUIsRUFDdkIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsVUFBbUI7UUFKbEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQWxCOUIsVUFBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFvQlQsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsVUFBVSxDQUFDLFFBQXlCLEVBQUUsSUFBWTtRQUM5QyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsb0NBQW9DLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDOUYsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOztRQUVJO0lBQ0osV0FBVyxDQUFDLEtBQVk7UUFDcEIsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxPQUFPLENBQUMsS0FBZSxFQUFFLEtBQWE7UUFDbEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsYUFBYTtRQUNULE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRLENBQUMsUUFBZ0IsRUFBRSxPQUFlO1FBQ3RDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7O1FBRUk7SUFDSixnQkFBZ0IsQ0FBQyxLQUFZO1FBQ3pCLElBQUksS0FBSyxDQUFDLFlBQVksRUFBRTtZQUNwQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2RCxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFekUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzVCO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVELEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNuQyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUUvRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7O1FBRUk7SUFDSixZQUFZLENBQUMsS0FBWTtRQUNyQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsZUFBZSxDQUFDLFFBQXlCLEVBQUUsUUFBUSxHQUFHLENBQUM7UUFDbkQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekQsS0FBSyxJQUFJLENBQUMsR0FBRyxRQUFRLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDekMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNyQztRQUVELE9BQU8sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGVBQWUsQ0FBQyxhQUFxQixFQUFFLFFBQWdCO1FBQ25ELE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFDN0MsS0FBSyxJQUFJLFNBQVMsR0FBRyxRQUFRLElBQUksQ0FBQyxFQUFFLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRTtZQUM1RSxhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDO1lBQzlELElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtnQkFDbkIsTUFBTSxNQUFNLEdBQUcsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQztnQkFFNUUsT0FBTyxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7YUFDakQ7U0FDSjtRQUVELE1BQU0sTUFBTSxHQUFHLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7UUFFeEYsT0FBTyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxVQUFrQixFQUFFLFFBQWdCO1FBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRW5ELE9BQU8sSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYTtRQUN6QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBRXZCLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGVBQWUsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsNEJBQTRCLENBQUMsS0FBWTtRQUNyQyxNQUFNLGFBQWEsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO1FBQzdDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxDQUFDO1FBQ04sTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QixJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDckIsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLGFBQWEsQ0FBQzthQUNqRDtZQUVELEdBQUcsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUM7U0FDL0M7UUFFRCxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUN2QixHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDL0I7UUFFRCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUF5QixFQUFFLFNBQXFCO1FBQ2xFLElBQUksU0FBUyxLQUFLLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDdkMsT0FBTyxRQUFRLENBQUM7U0FDbkI7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6RSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvRCxPQUFPLFlBQVksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNsRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3Vyc29yUGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vcG9zaXRpb25pbmcvY3Vyc29yLXBhcmFncmFwaCc7XG5pbXBvcnQgeyBEZWx0YUhlbHBlciB9IGZyb20gJy4uLy4uL2V4ZWN1dGlvbi9oZWxwZXJzL2RlbHRhLmhlbHBlcic7XG5pbXBvcnQgeyBNYXJnaW5Nb2RlbCB9IGZyb20gJy4uL21hcmdpbi5tb2RlbCc7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuLi9jb25zdGFudHMvZWRpdG9yLmNvbnN0JztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vLi4vcG9zaXRpb25pbmcvcmFuZ2UnO1xuXG5leHBvcnQgY2xhc3MgRG9jdW1lbnQge1xuICAgIGxpbmVzID0gWycnXTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHRoZSBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgYSBzaW5nbGUgc3RyaW5nLCBqb2luZWQgYnkgdGhlIG5ldyBsaW5lIGNoYXJhY3Rlci5cbiAgICAgKiovXG4gICAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMuam9pbihORVdfTElORV9NQVJLVVApO1xuICAgIH1cblxuICAgIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHBhZ2VNYXJnaW46IE1hcmdpbk1vZGVsLFxuICAgICAgICBwdWJsaWMgcGFnZXNTcGFjZTogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcGFnZVdpZHRoOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBwYWdlSGVpZ2h0PzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMubGluZXMgPSBEZWx0YUhlbHBlci5zcGxpdEJ5UGFyYWdyYXBocyh0aGlzLm1vZGVsLmNvbnRlbnQpO1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGV4dDogc3RyaW5nKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBEZWx0YUhlbHBlci5pbnNlcnRUZXh0QW5kUmV0dXJuRW5kQ3Vyc29yUG9zaXRpb24odGhpcy5saW5lcywgdGV4dCwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYHJhbmdlYCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiovXG4gICAgcmVtb3ZlUmFuZ2UocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgICAgIERlbHRhSGVscGVyLnJlbW92ZSh0aGlzLmxpbmVzLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICB9XG5cbiAgICBnZXRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBsaW5lc1tpbmRleF0gfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0QWxsTGluZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExpbmVzQ291bnQoKSk7XG4gICAgfVxuXG4gICAgZ2V0TGluZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGdldExpbmVzKGZpcnN0Um93OiBudW1iZXIsIGxhc3RSb3c6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgdGV4dCB3aXRoaW4gYHJhbmdlYCBhcyBhbiBhcnJheSBvZiBsaW5lcy5cbiAgICAgKiovXG4gICAgZ2V0TGluZXNGb3JSYW5nZShyYW5nZTogUmFuZ2UpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChyYW5nZS5pc1NpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUodGhpcy5saW5lcywgcmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQYXJ0SW5SYW5nZSA9IGxpbmUuc2xpY2UocmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICAgICAgcmV0dXJuIFtsaW5lUGFydEluUmFuZ2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7XG4gICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICcnKS5zbGljZShyYW5nZS5zdGFydC5jb2x1bW4pO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICBsaW5lc1tsYXN0SW5kZXhdID0gbGluZXNbbGFzdEluZGV4XS5zbGljZSgwLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgdGhlIHRleHQgd2l0aGluIGByYW5nZWAgYXMgYSBzaW5nbGUgc3RyaW5nLlxuICAgICAqKi9cbiAgICBnZXRUZXh0UmFuZ2UocmFuZ2U6IFJhbmdlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXNGb3JSYW5nZShyYW5nZSkuam9pbihORVdfTElORV9NQVJLVVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBwb3NpdGlvbiBpbiBhIGRvY3VtZW50IHRvIHRoZSBjaGFyYWN0ZXIncyBpbmRleC5cbiAgICAgKi9cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgc3RhcnRSb3cgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4ocG9zaXRpb24ucm93LCB0aGlzLmxpbmVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFJvdyB8fCAwOyBpIDwgZW5kUm93OyBpKyspIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmRleCArIHBvc2l0aW9uLmNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBpbmRleCBwb3NpdGlvbiBpbiBhIGRvY3VtZW50IHRvIHRoZSBwb3NpdGlvbi5cbiAgICAgKiBTZWUgJ3Bvc2l0aW9uVG9JbmRleCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgaW5kZXhUb1Bvc2l0aW9uKHBvc2l0aW9uSW5kZXg6IG51bWJlciwgc3RhcnRSb3c6IG51bWJlcik6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IG5ld2xpbmVMZW5ndGggPSBORVdfTElORV9NQVJLVVAubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBsaW5lSW5kZXggPSBzdGFydFJvdyB8fCAwOyBsaW5lSW5kZXggPCB0aGlzLmxpbmVzLmxlbmd0aDsgbGluZUluZGV4KyspIHtcbiAgICAgICAgICAgIHBvc2l0aW9uSW5kZXggLT0gdGhpcy5saW5lc1tsaW5lSW5kZXhdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zaXRpb25JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5saW5lc1tsaW5lSW5kZXhdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvclBhcmFncmFwaChsaW5lSW5kZXgsIGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5saW5lc1t0aGlzLmxpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3JQYXJhZ3JhcGgodGhpcy5saW5lcy5sZW5ndGggLSAxLCBjb2x1bW4pO1xuICAgIH1cblxuICAgIGluZGV4ZXNUb1JhbmdlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IFJhbmdlIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb2ludCA9IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHN0YXJ0SW5kZXgsIDApO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKGVuZEluZGV4LCAwKTtcblxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICB9XG5cbiAgICBpc05ld0xpbmVTeW1ib2woaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0O1xuXG4gICAgICAgIHJldHVybiAhdGV4dCB8fCAhdGV4dFtpbmRleF0gfHwgdGV4dFtpbmRleF0gPT09IE5FV19MSU5FX01BUktVUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHJhbmdlIGluIGEgZG9jdW1lbnQgdG8gdGhlIHNlbGVjdGVkIHBhcmFncmFwaHMgaW5kZXhlcyAoc3RhcnQgYW5kIGVuZCBvZiBwYXJhZ3JhcGhzKS5cbiAgICAgKiBzdGFydC9lbmQgcmVmZXJzIHRvIHRoZSBcImFic29sdXRlIHBvc2l0aW9uXCIgb2YgYSBjaGFyYWN0ZXIgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGdldFNlbGVjdGVkUGFyYWdyYXBoc0J5UmFuZ2UocmFuZ2U6IFJhbmdlKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5taW4ocmFuZ2UuZW5kLnJvdywgdGhpcy5saW5lcy5sZW5ndGggLSAxKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvdzsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHJhbmdlLnN0YXJ0LnJvdykge1xuICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5kICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpIDwgdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCArPSB0aGlzLmxpbmVzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG5cbiAgICBnZXRQb3NpdGlvbkFmdGVyQnJlYWsocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgYnJlYWtUeXBlOiBCcmVha1R5cGVzKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgaWYgKGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTGFzdENvbHVtbiA9IHBvc2l0aW9uLmNvbHVtbiA9PT0gdGhpcy5saW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXNMYXN0UGFyYWdyYXBoID0gcG9zaXRpb24ucm93ID09PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBpc0xhc3RDb2x1bW4gJiYgIWlzTGFzdFBhcmFncmFwaCA/IG5ldyBDdXJzb3JQYXJhZ3JhcGgocG9zaXRpb24ucm93ICsgMSwgMCkgOiBwb3NpdGlvbjtcbiAgICB9XG59XG4iXX0=
|