@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.
Files changed (102) hide show
  1. package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +21 -9
  2. package/esm2022/lib/apart-components/editor-toolbar/components/base-toolbar.component.mjs +8 -2
  3. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +2 -2
  4. package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font-size/font-size.component.mjs +3 -3
  5. package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +2 -2
  6. package/esm2022/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.mjs +1 -8
  7. package/esm2022/lib/editor/components/edges/edge.component.mjs +2 -2
  8. package/esm2022/lib/editor/components/edges/edges.mjs +21 -2
  9. package/esm2022/lib/editor/components/image/input-handler/image-input.handler.mjs +18 -1
  10. package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +22 -56
  11. package/esm2022/lib/editor/components/table/components/table-cell.component.mjs +6 -6
  12. package/esm2022/lib/editor/components/table/components/table.component.mjs +13 -4
  13. package/esm2022/lib/editor/components/table/models/cell-data.model.mjs +3 -4
  14. package/esm2022/lib/editor/components/table/selection/table-selection.mjs +15 -5
  15. package/esm2022/lib/editor/content/constants/editor.const.mjs +9 -1
  16. package/esm2022/lib/editor/content/display-data/display-data.mjs +839 -0
  17. package/esm2022/lib/editor/content/display-data/general-properties.model.mjs +1 -1
  18. package/esm2022/lib/editor/content/display-data/models/paragraph-info.model.mjs +8 -0
  19. package/esm2022/lib/editor/content/display-data/paragraph.mjs +5 -1
  20. package/esm2022/lib/editor/content/display-data/text-line-info.mjs +2 -1
  21. package/esm2022/lib/editor/content/display-data/toolbar-styles.interface.mjs +1 -1
  22. package/esm2022/lib/editor/content/helpers/content-style.helper.mjs +12 -30
  23. package/esm2022/lib/editor/content/helpers/display-token.helper.mjs +62 -0
  24. package/esm2022/lib/editor/content/helpers/link.helper.mjs +6 -0
  25. package/esm2022/lib/editor/display/layers/cursor.layer.mjs +9 -8
  26. package/esm2022/lib/editor/display/layers/pages.layer.mjs +5 -5
  27. package/esm2022/lib/editor/display/layers/print.text.layer.mjs +2 -2
  28. package/esm2022/lib/editor/display/layers/selection.layer.mjs +15 -9
  29. package/esm2022/lib/editor/display/layers/text.layer.mjs +29 -32
  30. package/esm2022/lib/editor/display/print/print.renderer.mjs +8 -8
  31. package/esm2022/lib/editor/display/renderer.mjs +10 -10
  32. package/esm2022/lib/editor/display/rendering.helper.mjs +2 -4
  33. package/esm2022/lib/editor/display/virtual.renderer.mjs +5 -5
  34. package/esm2022/lib/editor/execution/edit.session.mjs +211 -754
  35. package/esm2022/lib/editor/execution/editor.mjs +119 -77
  36. package/esm2022/lib/editor/execution/helpers/format-style.helper.mjs +41 -32
  37. package/esm2022/lib/editor/execution/helpers/image.helpet.mjs +12 -0
  38. package/esm2022/lib/editor/execution/helpers/paragraph.helper.mjs +11 -3
  39. package/esm2022/lib/editor/execution/regulator.service.mjs +28 -20
  40. package/esm2022/lib/editor/gadgets/numbering/numbering-paragraph-style.model.mjs +13 -0
  41. package/esm2022/lib/editor/gadgets/numbering/numbering.helper.mjs +77 -10
  42. package/esm2022/lib/editor/gadgets/search/search.mjs +6 -6
  43. package/esm2022/lib/editor/interaction/editor.service.mjs +27 -6
  44. package/esm2022/lib/editor/interaction/input.handler.mjs +8 -5
  45. package/esm2022/lib/editor/interaction/mouse.handler.mjs +2 -1
  46. package/esm2022/lib/editor/operations/helpers/format-operations.helper.mjs +32 -2
  47. package/esm2022/lib/editor/operations/helpers/link-operations.helper.mjs +67 -14
  48. package/esm2022/lib/editor/operations/operations-helper.helper.mjs +27 -20
  49. package/esm2022/lib/editor/operations/save-commands.helper.mjs +2 -2
  50. package/esm2022/lib/editor/positioning/content.helper.mjs +15 -15
  51. package/esm2022/lib/editor/positioning/line-width.helper.mjs +5 -5
  52. package/esm2022/lib/editor/positioning/position.helper.mjs +34 -32
  53. package/esm2022/lib/editor/positioning/selection.mjs +42 -32
  54. package/esm2022/lib/editor/revision.helper.mjs +4 -3
  55. package/esm2022/lib/models/generated/link.model.mjs +1 -1
  56. package/esm2022/public-api.mjs +2 -1
  57. package/fesm2022/talrace-ngx-noder.mjs +3863 -3558
  58. package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
  59. package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +0 -1
  60. package/lib/apart-components/editor-toolbar/shared/toolbar-styles.helper.d.ts +0 -2
  61. package/lib/editor/components/image/input-handler/image-input.handler.d.ts +3 -0
  62. package/lib/editor/components/shared/services/custom-content.service.d.ts +3 -5
  63. package/lib/editor/components/table/components/table-cell.component.d.ts +1 -1
  64. package/lib/editor/components/table/components/table.component.d.ts +1 -0
  65. package/lib/editor/components/table/models/cell-data.model.d.ts +1 -1
  66. package/lib/editor/components/table/selection/table-selection.d.ts +2 -0
  67. package/lib/editor/content/constants/editor.const.d.ts +2 -0
  68. package/lib/editor/content/display-data/display-data.d.ts +103 -0
  69. package/lib/editor/content/display-data/general-properties.model.d.ts +5 -0
  70. package/lib/editor/content/display-data/models/paragraph-info.model.d.ts +9 -0
  71. package/lib/editor/content/display-data/paragraph.d.ts +1 -0
  72. package/lib/editor/content/display-data/text-line-info.d.ts +1 -0
  73. package/lib/editor/content/display-data/toolbar-styles.interface.d.ts +1 -1
  74. package/lib/editor/content/helpers/content-style.helper.d.ts +1 -2
  75. package/lib/editor/content/helpers/display-token.helper.d.ts +6 -0
  76. package/lib/editor/content/helpers/link.helper.d.ts +4 -0
  77. package/lib/editor/display/layers/text.layer.d.ts +2 -3
  78. package/lib/editor/display/print/print.renderer.d.ts +0 -2
  79. package/lib/editor/execution/edit.session.d.ts +12 -59
  80. package/lib/editor/execution/editor.d.ts +9 -6
  81. package/lib/editor/execution/helpers/format-style.helper.d.ts +2 -2
  82. package/lib/editor/execution/helpers/image.helpet.d.ts +4 -0
  83. package/lib/editor/execution/regulator.service.d.ts +1 -1
  84. package/lib/editor/gadgets/numbering/numbering-paragraph-style.model.d.ts +6 -0
  85. package/lib/editor/gadgets/numbering/numbering.helper.d.ts +10 -3
  86. package/lib/editor/interaction/editor.service.d.ts +12 -3
  87. package/lib/editor/operations/helpers/link-operations.helper.d.ts +6 -3
  88. package/lib/editor/positioning/content.helper.d.ts +6 -5
  89. package/lib/editor/positioning/position.helper.d.ts +3 -3
  90. package/lib/editor/positioning/selection.d.ts +3 -0
  91. package/lib/models/generated/link.model.d.ts +3 -1
  92. package/package.json +8 -8
  93. package/public-api.d.ts +1 -0
  94. package/src/_ngx-noder.theme.scss +31 -2
  95. package/src/styles.scss +0 -1
  96. package/esm2022/lib/editor/content/display-data/document.mjs +0 -134
  97. package/esm2022/lib/editor/content/display-data/pages.wrap.mjs +0 -226
  98. package/esm2022/lib/editor/execution/helpers/delta.helper.mjs +0 -18
  99. package/lib/editor/content/display-data/document.d.ts +0 -56
  100. package/lib/editor/content/display-data/pages.wrap.d.ts +0 -42
  101. package/lib/editor/execution/helpers/delta.helper.d.ts +0 -6
  102. 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 clearSelection$(): Observable<void>;
80
- private _clearSelection$;
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
- clearSelection(): void;
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 insertContent(links: LinkModel[], link: string, insertIndex: number, endIndex: number): void;
4
- static insertTextIntoLink(links: LinkModel[], text: string, insertIndex: number): void;
5
- static removeTextFromLink(links: LinkModel[], startIndex: number, endIndex: number): void;
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(wrapParagraphIndex: number[], indexInDocument: number): CursorParagraph;
6
- static documentIndexToParagraphWithOffset(wrapParagraphIndex: number[], lines: string[], indexInDocument: number): CursorParagraph;
7
- static paragraphPositionToDocumentIndex(wrapParagraphIndex: number[], paragraph: CursorParagraph): number;
8
- static getSelectedPartDocumentIndexes(wrapParagraphIndex: number[], range: Range): {
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(wrapParagraphIndex: number[], paragraph: number, index: number): number;
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: Paragraph[], row: number): ParagraphInfo;
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: Paragraph[], documentLine: number): {
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;
@@ -1,7 +1,9 @@
1
+ import { FormatModel } from './format.model';
1
2
  export declare class LinkModel {
2
3
  endIndex: number;
3
- insertIndex: number;
4
+ formats: FormatModel[];
4
5
  link: string;
5
6
  sourceId: string;
7
+ startIndex: number;
6
8
  constructor(fields?: Partial<LinkModel>);
7
9
  }
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@talrace/ngx-noder",
3
- "version": "0.0.8",
3
+ "version": "0.0.10",
4
4
  "license": "MIT",
5
5
  "peerDependencies": {
6
- "@angular/common": "^17.0.4",
7
- "@angular/core": "^17.0.4",
8
- "@angular/forms": "^17.0.4",
9
- "@angular/material": "^17.0.1",
10
- "@angular/router": "^17.0.4",
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.5.2",
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.0"
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
- @include editor-theme($theme);
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,3 +1,2 @@
1
- @import './scss/fonts';
2
1
  @import './scss/base-editor';
3
2
  @import './assets/fonts/nc-iconfont';
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9lZGl0b3IvY29udGVudC9kaXNwbGF5LWRhdGEvZG9jdW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBRXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFFbkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUVoRCxNQUFNLE9BQU8sUUFBUTtJQUdqQjs7UUFFSTtJQUNKLElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsQ0FBQztJQUVELFlBQ1ksS0FBd0IsRUFDekIsVUFBdUIsRUFDdkIsVUFBa0IsRUFDbEIsU0FBaUIsRUFDakIsVUFBbUI7UUFKbEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDekIsZUFBVSxHQUFWLFVBQVUsQ0FBYTtRQUN2QixlQUFVLEdBQVYsVUFBVSxDQUFRO1FBQ2xCLGNBQVMsR0FBVCxTQUFTLENBQVE7UUFDakIsZUFBVSxHQUFWLFVBQVUsQ0FBUztRQWxCOUIsVUFBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFvQlQsSUFBSSxDQUFDLEtBQUssR0FBRyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQs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QUFDO0lBQzFCLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUF5QixFQUFFLFNBQXFCO1FBQ2xFLElBQUksU0FBUyxLQUFLLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDdkMsT0FBTyxRQUFRLENBQUM7U0FDbkI7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6RSxNQUFNLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMvRCxPQUFPLFlBQVksSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUNsRyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCcmVha1R5cGVzIH0gZnJvbSAnLi4vLi4vZ2FkZ2V0cy9wYWdlLWJyZWFrL2JyZWFrLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgQ29udGVudHNJbnRlcmZhY2UgfSBmcm9tICcuLi9jb250ZW50cy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ3Vyc29yUGFyYWdyYXBoIH0gZnJvbSAnLi4vLi4vcG9zaXRpb25pbmcvY3Vyc29yLXBhcmFncmFwaCc7XG5pbXBvcnQgeyBEZWx0YUhlbHBlciB9IGZyb20gJy4uLy4uL2V4ZWN1dGlvbi9oZWxwZXJzL2RlbHRhLmhlbHBlcic7XG5pbXBvcnQgeyBNYXJnaW5Nb2RlbCB9IGZyb20gJy4uL21hcmdpbi5tb2RlbCc7XG5pbXBvcnQgeyBORVdfTElORV9NQVJLVVAgfSBmcm9tICcuLi9jb25zdGFudHMvZWRpdG9yLmNvbnN0JztcbmltcG9ydCB7IFJhbmdlIH0gZnJvbSAnLi4vLi4vcG9zaXRpb25pbmcvcmFuZ2UnO1xuXG5leHBvcnQgY2xhc3MgRG9jdW1lbnQge1xuICAgIGxpbmVzID0gWycnXTtcblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYWxsIHRoZSBsaW5lcyBpbiB0aGUgZG9jdW1lbnQgYXMgYSBzaW5nbGUgc3RyaW5nLCBqb2luZWQgYnkgdGhlIG5ldyBsaW5lIGNoYXJhY3Rlci5cbiAgICAgKiovXG4gICAgZ2V0IHRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMuam9pbihORVdfTElORV9NQVJLVVApO1xuICAgIH1cblxuICAgIGdldCBsZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMubGVuZ3RoO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIG1vZGVsOiBDb250ZW50c0ludGVyZmFjZSxcbiAgICAgICAgcHVibGljIHBhZ2VNYXJnaW46IE1hcmdpbk1vZGVsLFxuICAgICAgICBwdWJsaWMgcGFnZXNTcGFjZTogbnVtYmVyLFxuICAgICAgICBwdWJsaWMgcGFnZVdpZHRoOiBudW1iZXIsXG4gICAgICAgIHB1YmxpYyBwYWdlSGVpZ2h0PzogbnVtYmVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMubGluZXMgPSBEZWx0YUhlbHBlci5zcGxpdEJ5UGFyYWdyYXBocyh0aGlzLm1vZGVsLmNvbnRlbnQpO1xuICAgIH1cblxuICAgIGluc2VydFRleHQocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgdGV4dDogc3RyaW5nKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgY29uc3QgZW5kUG9pbnQgPSBEZWx0YUhlbHBlci5pbnNlcnRUZXh0QW5kUmV0dXJuRW5kQ3Vyc29yUG9zaXRpb24odGhpcy5saW5lcywgdGV4dCwgcG9zaXRpb24pO1xuICAgICAgICByZXR1cm4gZW5kUG9pbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYHJhbmdlYCBmcm9tIHRoZSBkb2N1bWVudC5cbiAgICAgKiovXG4gICAgcmVtb3ZlUmFuZ2UocmFuZ2U6IFJhbmdlKTogdm9pZCB7XG4gICAgICAgIERlbHRhSGVscGVyLnJlbW92ZSh0aGlzLmxpbmVzLCByYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTtcbiAgICB9XG5cbiAgICBnZXRMaW5lKGxpbmVzOiBzdHJpbmdbXSwgaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBsaW5lc1tpbmRleF0gfHwgJyc7XG4gICAgfVxuXG4gICAgZ2V0QWxsTGluZXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExpbmVzQ291bnQoKSk7XG4gICAgfVxuXG4gICAgZ2V0TGluZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGggLSAxO1xuICAgIH1cblxuICAgIGdldExpbmVzKGZpcnN0Um93OiBudW1iZXIsIGxhc3RSb3c6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGFsbCB0aGUgdGV4dCB3aXRoaW4gYHJhbmdlYCBhcyBhbiBhcnJheSBvZiBsaW5lcy5cbiAgICAgKiovXG4gICAgZ2V0TGluZXNGb3JSYW5nZShyYW5nZTogUmFuZ2UpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChyYW5nZS5pc1NpbmdsZUxpbmUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmUgPSB0aGlzLmdldExpbmUodGhpcy5saW5lcywgcmFuZ2Uuc3RhcnQucm93KTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmVQYXJ0SW5SYW5nZSA9IGxpbmUuc2xpY2UocmFuZ2Uuc3RhcnQuY29sdW1uLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICAgICAgcmV0dXJuIFtsaW5lUGFydEluUmFuZ2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7XG4gICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICcnKS5zbGljZShyYW5nZS5zdGFydC5jb2x1bW4pO1xuICAgICAgICBjb25zdCBsYXN0SW5kZXggPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgICAgICBsaW5lc1tsYXN0SW5kZXhdID0gbGluZXNbbGFzdEluZGV4XS5zbGljZSgwLCByYW5nZS5lbmQuY29sdW1uKTtcblxuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgdGhlIHRleHQgd2l0aGluIGByYW5nZWAgYXMgYSBzaW5nbGUgc3RyaW5nLlxuICAgICAqKi9cbiAgICBnZXRUZXh0UmFuZ2UocmFuZ2U6IFJhbmdlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZXNGb3JSYW5nZShyYW5nZSkuam9pbihORVdfTElORV9NQVJLVVApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHRoZSBwb3NpdGlvbiBpbiBhIGRvY3VtZW50IHRvIHRoZSBjaGFyYWN0ZXIncyBpbmRleC5cbiAgICAgKi9cbiAgICBwb3NpdGlvblRvSW5kZXgocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgc3RhcnRSb3cgPSAwKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgICAgY29uc3QgZW5kUm93ID0gTWF0aC5taW4ocG9zaXRpb24ucm93LCB0aGlzLmxpbmVzLmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydFJvdyB8fCAwOyBpIDwgZW5kUm93OyBpKyspIHtcbiAgICAgICAgICAgIGluZGV4ICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbmRleCArIHBvc2l0aW9uLmNvbHVtbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBhbiBpbmRleCBwb3NpdGlvbiBpbiBhIGRvY3VtZW50IHRvIHRoZSBwb3NpdGlvbi5cbiAgICAgKiBTZWUgJ3Bvc2l0aW9uVG9JbmRleCcgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgaW5kZXhUb1Bvc2l0aW9uKHBvc2l0aW9uSW5kZXg6IG51bWJlciwgc3RhcnRSb3c6IG51bWJlcik6IEN1cnNvclBhcmFncmFwaCB7XG4gICAgICAgIGNvbnN0IG5ld2xpbmVMZW5ndGggPSBORVdfTElORV9NQVJLVVAubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBsaW5lSW5kZXggPSBzdGFydFJvdyB8fCAwOyBsaW5lSW5kZXggPCB0aGlzLmxpbmVzLmxlbmd0aDsgbGluZUluZGV4KyspIHtcbiAgICAgICAgICAgIHBvc2l0aW9uSW5kZXggLT0gdGhpcy5saW5lc1tsaW5lSW5kZXhdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG4gICAgICAgICAgICBpZiAocG9zaXRpb25JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5saW5lc1tsaW5lSW5kZXhdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEN1cnNvclBhcmFncmFwaChsaW5lSW5kZXgsIGNvbHVtbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2x1bW4gPSBwb3NpdGlvbkluZGV4ICsgdGhpcy5saW5lc1t0aGlzLmxpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBDdXJzb3JQYXJhZ3JhcGgodGhpcy5saW5lcy5sZW5ndGggLSAxLCBjb2x1bW4pO1xuICAgIH1cblxuICAgIGluZGV4ZXNUb1JhbmdlKHN0YXJ0SW5kZXg6IG51bWJlciwgZW5kSW5kZXg6IG51bWJlcik6IFJhbmdlIHtcbiAgICAgICAgY29uc3Qgc3RhcnRQb2ludCA9IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKHN0YXJ0SW5kZXgsIDApO1xuICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXMuaW5kZXhUb1Bvc2l0aW9uKGVuZEluZGV4LCAwKTtcblxuICAgICAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICB9XG5cbiAgICBpc05ld0xpbmVTeW1ib2woaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0O1xuXG4gICAgICAgIHJldHVybiAhdGV4dCB8fCAhdGV4dFtpbmRleF0gfHwgdGV4dFtpbmRleF0gPT09IE5FV19MSU5FX01BUktVUDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyB0aGUgc2VsZWN0aW9uIHJhbmdlIGluIGEgZG9jdW1lbnQgdG8gdGhlIHNlbGVjdGVkIHBhcmFncmFwaHMgaW5kZXhlcyAoc3RhcnQgYW5kIGVuZCBvZiBwYXJhZ3JhcGhzKS5cbiAgICAgKiBzdGFydC9lbmQgcmVmZXJzIHRvIHRoZSBcImFic29sdXRlIHBvc2l0aW9uXCIgb2YgYSBjaGFyYWN0ZXIgaW4gdGhlIGRvY3VtZW50LlxuICAgICAqL1xuICAgIGdldFNlbGVjdGVkUGFyYWdyYXBoc0J5UmFuZ2UocmFuZ2U6IFJhbmdlKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9IHtcbiAgICAgICAgY29uc3QgbmV3bGluZUxlbmd0aCA9IE5FV19MSU5FX01BUktVUC5sZW5ndGg7XG4gICAgICAgIGxldCBzdGFydCA9IDA7XG4gICAgICAgIGxldCBlbmQgPSAwO1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgY29uc3Qgcm93ID0gTWF0aC5taW4ocmFuZ2UuZW5kLnJvdywgdGhpcy5saW5lcy5sZW5ndGggLSAxKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHJvdzsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSA8IHJhbmdlLnN0YXJ0LnJvdykge1xuICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZW5kICs9IHRoaXMubGluZXNbaV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpIDwgdGhpcy5saW5lcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVuZCArPSB0aGlzLmxpbmVzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHN0YXJ0LCBlbmQgfTtcbiAgICB9XG5cbiAgICBnZXRQb3NpdGlvbkFmdGVyQnJlYWsocG9zaXRpb246IEN1cnNvclBhcmFncmFwaCwgYnJlYWtUeXBlOiBCcmVha1R5cGVzKTogQ3Vyc29yUGFyYWdyYXBoIHtcbiAgICAgICAgaWYgKGJyZWFrVHlwZSA9PT0gQnJlYWtUeXBlcy5UZXh0V3JhcHBpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTGFzdENvbHVtbiA9IHBvc2l0aW9uLmNvbHVtbiA9PT0gdGhpcy5saW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXNMYXN0UGFyYWdyYXBoID0gcG9zaXRpb24ucm93ID09PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDE7XG4gICAgICAgIHJldHVybiBpc0xhc3RDb2x1bW4gJiYgIWlzTGFzdFBhcmFncmFwaCA/IG5ldyBDdXJzb3JQYXJhZ3JhcGgocG9zaXRpb24ucm93ICsgMSwgMCkgOiBwb3NpdGlvbjtcbiAgICB9XG59XG4iXX0=