editable.ts 0.0.1

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 (153) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +571 -0
  3. package/dist/editable.umd.cjs +2 -0
  4. package/dist/editable.umd.cjs.map +1 -0
  5. package/lib/block.d.ts +13 -0
  6. package/lib/block.d.ts.map +1 -0
  7. package/lib/block.js +58 -0
  8. package/lib/block.js.map +1 -0
  9. package/lib/clipboard.d.ts +22 -0
  10. package/lib/clipboard.d.ts.map +1 -0
  11. package/lib/clipboard.js +154 -0
  12. package/lib/clipboard.js.map +1 -0
  13. package/lib/config.d.ts +37 -0
  14. package/lib/config.d.ts.map +1 -0
  15. package/lib/config.js +64 -0
  16. package/lib/config.js.map +1 -0
  17. package/lib/content.d.ts +37 -0
  18. package/lib/content.d.ts.map +1 -0
  19. package/lib/content.js +526 -0
  20. package/lib/content.js.map +1 -0
  21. package/lib/core.d.ts +97 -0
  22. package/lib/core.d.ts.map +1 -0
  23. package/lib/core.js +261 -0
  24. package/lib/core.js.map +1 -0
  25. package/lib/create-default-behavior.d.ts +31 -0
  26. package/lib/create-default-behavior.d.ts.map +1 -0
  27. package/lib/create-default-behavior.js +178 -0
  28. package/lib/create-default-behavior.js.map +1 -0
  29. package/lib/create-default-events.d.ts +152 -0
  30. package/lib/create-default-events.d.ts.map +1 -0
  31. package/lib/create-default-events.js +183 -0
  32. package/lib/create-default-events.js.map +1 -0
  33. package/lib/cursor.d.ts +68 -0
  34. package/lib/cursor.d.ts.map +1 -0
  35. package/lib/cursor.js +354 -0
  36. package/lib/cursor.js.map +1 -0
  37. package/lib/dispatcher.d.ts +78 -0
  38. package/lib/dispatcher.d.ts.map +1 -0
  39. package/lib/dispatcher.js +416 -0
  40. package/lib/dispatcher.js.map +1 -0
  41. package/lib/eventable.d.ts +2 -0
  42. package/lib/eventable.d.ts.map +1 -0
  43. package/lib/eventable.js +104 -0
  44. package/lib/eventable.js.map +1 -0
  45. package/lib/feature-detection.d.ts +12 -0
  46. package/lib/feature-detection.d.ts.map +1 -0
  47. package/lib/feature-detection.js +42 -0
  48. package/lib/feature-detection.js.map +1 -0
  49. package/lib/highlight-support.d.ts +24 -0
  50. package/lib/highlight-support.d.ts.map +1 -0
  51. package/lib/highlight-support.js +172 -0
  52. package/lib/highlight-support.js.map +1 -0
  53. package/lib/highlight-text.d.ts +21 -0
  54. package/lib/highlight-text.d.ts.map +1 -0
  55. package/lib/highlight-text.js +147 -0
  56. package/lib/highlight-text.js.map +1 -0
  57. package/lib/keyboard.d.ts +33 -0
  58. package/lib/keyboard.d.ts.map +1 -0
  59. package/lib/keyboard.js +189 -0
  60. package/lib/keyboard.js.map +1 -0
  61. package/lib/monitored-highlighting.d.ts +28 -0
  62. package/lib/monitored-highlighting.d.ts.map +1 -0
  63. package/lib/monitored-highlighting.js +194 -0
  64. package/lib/monitored-highlighting.js.map +1 -0
  65. package/lib/node-iterator.d.ts +16 -0
  66. package/lib/node-iterator.d.ts.map +1 -0
  67. package/lib/node-iterator.js +97 -0
  68. package/lib/node-iterator.js.map +1 -0
  69. package/lib/node-type.d.ts +13 -0
  70. package/lib/node-type.d.ts.map +1 -0
  71. package/lib/node-type.js +15 -0
  72. package/lib/node-type.js.map +1 -0
  73. package/lib/parser.d.ts +89 -0
  74. package/lib/parser.d.ts.map +1 -0
  75. package/lib/parser.js +251 -0
  76. package/lib/parser.js.map +1 -0
  77. package/lib/plugins/highlighting/match-collection.d.ts +7 -0
  78. package/lib/plugins/highlighting/match-collection.d.ts.map +1 -0
  79. package/lib/plugins/highlighting/match-collection.js +62 -0
  80. package/lib/plugins/highlighting/match-collection.js.map +1 -0
  81. package/lib/plugins/highlighting/spellcheck-service.d.ts +12 -0
  82. package/lib/plugins/highlighting/spellcheck-service.d.ts.map +1 -0
  83. package/lib/plugins/highlighting/spellcheck-service.js +24 -0
  84. package/lib/plugins/highlighting/spellcheck-service.js.map +1 -0
  85. package/lib/plugins/highlighting/text-search.d.ts +10 -0
  86. package/lib/plugins/highlighting/text-search.d.ts.map +1 -0
  87. package/lib/plugins/highlighting/text-search.js +92 -0
  88. package/lib/plugins/highlighting/text-search.js.map +1 -0
  89. package/lib/plugins/highlighting/whitespace-highlighting.d.ts +14 -0
  90. package/lib/plugins/highlighting/whitespace-highlighting.d.ts.map +1 -0
  91. package/lib/plugins/highlighting/whitespace-highlighting.js +52 -0
  92. package/lib/plugins/highlighting/whitespace-highlighting.js.map +1 -0
  93. package/lib/quotes.d.ts +8 -0
  94. package/lib/quotes.d.ts.map +1 -0
  95. package/lib/quotes.js +170 -0
  96. package/lib/quotes.js.map +1 -0
  97. package/lib/range-container.d.ts +22 -0
  98. package/lib/range-container.d.ts.map +1 -0
  99. package/lib/range-container.js +52 -0
  100. package/lib/range-container.js.map +1 -0
  101. package/lib/range-save-restore.d.ts +13 -0
  102. package/lib/range-save-restore.d.ts.map +1 -0
  103. package/lib/range-save-restore.js +153 -0
  104. package/lib/range-save-restore.js.map +1 -0
  105. package/lib/selection-watcher.d.ts +55 -0
  106. package/lib/selection-watcher.d.ts.map +1 -0
  107. package/lib/selection-watcher.js +126 -0
  108. package/lib/selection-watcher.js.map +1 -0
  109. package/lib/selection.d.ts +74 -0
  110. package/lib/selection.d.ts.map +1 -0
  111. package/lib/selection.js +341 -0
  112. package/lib/selection.js.map +1 -0
  113. package/lib/smartQuotes.d.ts +16 -0
  114. package/lib/smartQuotes.d.ts.map +1 -0
  115. package/lib/smartQuotes.js +92 -0
  116. package/lib/smartQuotes.js.map +1 -0
  117. package/lib/util/binary_search.d.ts +23 -0
  118. package/lib/util/binary_search.d.ts.map +1 -0
  119. package/lib/util/binary_search.js +137 -0
  120. package/lib/util/binary_search.js.map +1 -0
  121. package/lib/util/clone-deep.d.ts +8 -0
  122. package/lib/util/clone-deep.d.ts.map +1 -0
  123. package/lib/util/clone-deep.js +10 -0
  124. package/lib/util/clone-deep.js.map +1 -0
  125. package/lib/util/dom.d.ts +43 -0
  126. package/lib/util/dom.d.ts.map +1 -0
  127. package/lib/util/dom.js +272 -0
  128. package/lib/util/dom.js.map +1 -0
  129. package/lib/util/element.d.ts +10 -0
  130. package/lib/util/element.d.ts.map +1 -0
  131. package/lib/util/element.js +29 -0
  132. package/lib/util/element.js.map +1 -0
  133. package/lib/util/error.d.ts +2 -0
  134. package/lib/util/error.d.ts.map +1 -0
  135. package/lib/util/error.js +16 -0
  136. package/lib/util/error.js.map +1 -0
  137. package/lib/util/log.d.ts +2 -0
  138. package/lib/util/log.d.ts.map +1 -0
  139. package/lib/util/log.js +18 -0
  140. package/lib/util/log.js.map +1 -0
  141. package/lib/util/merge.d.ts +6 -0
  142. package/lib/util/merge.d.ts.map +1 -0
  143. package/lib/util/merge.js +31 -0
  144. package/lib/util/merge.js.map +1 -0
  145. package/lib/util/string.d.ts +25 -0
  146. package/lib/util/string.d.ts.map +1 -0
  147. package/lib/util/string.js +68 -0
  148. package/lib/util/string.js.map +1 -0
  149. package/lib/util/viewport.d.ts +6 -0
  150. package/lib/util/viewport.d.ts.map +1 -0
  151. package/lib/util/viewport.js +8 -0
  152. package/lib/util/viewport.js.map +1 -0
  153. package/package.json +86 -0
@@ -0,0 +1,126 @@
1
+ import * as parser from './parser.js';
2
+ import RangeContainer from './range-container.js';
3
+ import Cursor from './cursor.js';
4
+ import Selection from './selection.js';
5
+ import { getSelection } from './util/dom.js';
6
+ /**
7
+ * The SelectionWatcher module watches for selection changes inside
8
+ * of editable blocks.
9
+ *
10
+ * @module core
11
+ * @submodule selectionWatcher
12
+ */
13
+ export default class SelectionWatcher {
14
+ constructor(dispatcher, win) {
15
+ this.dispatcher = dispatcher;
16
+ this.win = win || window;
17
+ this.selection = undefined;
18
+ this.currentSelection = undefined;
19
+ this.currentRange = undefined;
20
+ }
21
+ /**
22
+ * Updates the internal selection pointer to the current selection.
23
+ * Returns true if no exception occurred.
24
+ */
25
+ syncSelection() {
26
+ // Note: the try catch was introduced because of rangy exceptions with nativeSelections
27
+ try {
28
+ this.selection = getSelection(this.win);
29
+ }
30
+ catch (err) {
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ /**
36
+ * Return a RangeContainer if the current selection is within an editable
37
+ * otherwise return an empty RangeContainer
38
+ */
39
+ getRangeContainer() {
40
+ const successfulSync = this.syncSelection();
41
+ // rangeCount is 0 or 1 in all browsers except firefox
42
+ // firefox can work with multiple ranges
43
+ // (on a mac hold down the command key to select multiple ranges)
44
+ if (this.selection?.rangeCount && successfulSync) {
45
+ try {
46
+ const range = this.selection.getRangeAt(0);
47
+ // Check if range is still valid (not detached)
48
+ if (range && range.commonAncestorContainer) {
49
+ const hostNode = parser.getHost(range.commonAncestorContainer);
50
+ if (hostNode)
51
+ return new RangeContainer(hostNode, range);
52
+ }
53
+ }
54
+ catch (err) {
55
+ // Range might be detached, return empty container
56
+ }
57
+ }
58
+ // return an empty range container
59
+ return new RangeContainer();
60
+ }
61
+ /**
62
+ * Gets a fresh RangeContainer with the current selection or cursor.
63
+ *
64
+ * @return RangeContainer instance
65
+ */
66
+ getFreshRange() {
67
+ return this.getRangeContainer();
68
+ }
69
+ /**
70
+ * Gets a fresh RangeContainer with the current selection or cursor.
71
+ *
72
+ * @return Either a Cursor or Selection instance or undefined if
73
+ * there is neither a selection or cursor.
74
+ */
75
+ getFreshSelection() {
76
+ const rangeContainer = this.getRangeContainer();
77
+ return rangeContainer.isCursor
78
+ ? rangeContainer.getCursor()
79
+ : rangeContainer.getSelection();
80
+ }
81
+ /**
82
+ * Get the selection set by the last selectionChanged event.
83
+ * Sometimes the event does not fire fast enough and the selection
84
+ * you get is not the one the user sees.
85
+ * In those cases use #getFreshSelection()
86
+ *
87
+ * @return Either a Cursor or Selection instance or undefined if
88
+ * there is neither a selection or cursor.
89
+ */
90
+ getSelection() {
91
+ return this.currentSelection;
92
+ }
93
+ forceCursor() {
94
+ const rangeContainer = this.getRangeContainer();
95
+ return rangeContainer.forceCursor();
96
+ }
97
+ selectionChanged() {
98
+ const newRangeContainer = this.getRangeContainer();
99
+ if (newRangeContainer.isDifferentFrom(this.currentRange)) {
100
+ const lastSelection = this.currentSelection;
101
+ this.currentRange = newRangeContainer;
102
+ // empty selection or cursor
103
+ if (lastSelection) {
104
+ if (lastSelection.isCursor && !this.currentRange.isCursor) {
105
+ this.dispatcher.notify('cursor', lastSelection.host);
106
+ }
107
+ else if (lastSelection.isSelection && !this.currentRange.isSelection) {
108
+ this.dispatcher.notify('selection', lastSelection.host);
109
+ }
110
+ }
111
+ // set new selection or cursor and fire event
112
+ if (this.currentRange.isCursor && this.currentRange.host && this.currentRange.range) {
113
+ this.currentSelection = new Cursor(this.currentRange.host, this.currentRange.range);
114
+ this.dispatcher.notify('cursor', this.currentSelection.host, this.currentSelection);
115
+ }
116
+ else if (this.currentRange.isSelection && this.currentRange.host && this.currentRange.range) {
117
+ this.currentSelection = new Selection(this.currentRange.host, this.currentRange.range);
118
+ this.dispatcher.notify('selection', this.currentSelection.host, this.currentSelection);
119
+ }
120
+ else {
121
+ this.currentSelection = undefined;
122
+ }
123
+ }
124
+ }
125
+ }
126
+ //# sourceMappingURL=selection-watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection-watcher.js","sourceRoot":"","sources":["../src/selection-watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import Cursor from './cursor.js';
2
+ /**
3
+ * The Selection module provides a cross-browser abstraction layer for range
4
+ * and selection.
5
+ *
6
+ * @module core
7
+ * @submodule selection
8
+ */
9
+ /**
10
+ * Class that represents a selection and provides functionality to access or
11
+ * modify the selection.
12
+ *
13
+ * @class Selection
14
+ * @constructor
15
+ */
16
+ export default class Selection extends Cursor {
17
+ constructor(editableHost: HTMLElement, range: Range);
18
+ text(): string;
19
+ html(): string;
20
+ isAllSelected(): boolean;
21
+ getTextRange(): import("./util/dom.js").CharacterRange;
22
+ toString(): string;
23
+ isWrappable(): boolean;
24
+ getRects(): DOMRectList;
25
+ link(href: string, attrs?: Record<string, string | null | undefined>): void;
26
+ trimRange(): void;
27
+ unlink(): void;
28
+ toggleLink(href: string, attrs?: Record<string, string | null | undefined>): void;
29
+ highlightComment({ highlightId, textRange }: {
30
+ highlightId: string;
31
+ textRange: {
32
+ text: string;
33
+ start: number;
34
+ end: number;
35
+ };
36
+ }): void;
37
+ highlight({ highlightId }: {
38
+ highlightId: string;
39
+ }): void;
40
+ toggle(elem: Node): void;
41
+ toggleCustom({ tagName, attributes, trim }: {
42
+ tagName: string;
43
+ attributes: Record<string, any>;
44
+ trim?: boolean;
45
+ }): void;
46
+ makeCustom({ tagName, attributes, trim }: {
47
+ tagName: string;
48
+ attributes: Record<string, any>;
49
+ trim?: boolean;
50
+ }): void;
51
+ makeBold(): void;
52
+ toggleBold(): void;
53
+ giveEmphasis(): void;
54
+ toggleEmphasis(): void;
55
+ makeUnderline(): void;
56
+ toggleUnderline(): void;
57
+ insertCharacter(character: string): Cursor;
58
+ surround(startCharacter: string, endCharacter: string): void;
59
+ removeSurround(startCharacter: string, endCharacter: string): void;
60
+ removeChars(chars?: string[]): void;
61
+ toggleSurround(startCharacter: string, endCharacter: string): void;
62
+ removeFormatting(selector?: string): void;
63
+ deleteExactSurroundingTags(): Selection;
64
+ deleteContainedTags(): Selection;
65
+ deleteContent(): Cursor;
66
+ expandTo(elem: Node): void;
67
+ collapseAtBeginning(elem?: Node): Cursor;
68
+ collapseAtEnd(elem?: Node): Cursor;
69
+ forceWrap(elem: Node): void;
70
+ isExactSelection(elem: Node, onlyVisible?: string | undefined): boolean;
71
+ containsString(str: string): boolean;
72
+ deleteCharacter(character: string): void;
73
+ }
74
+ //# sourceMappingURL=selection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAchC;;;;;;GAMG;AACH;;;;;;GAMG;AAEH,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,MAAM;gBAC9B,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK;IAOpD,IAAI;IAKJ,IAAI;IAIJ,aAAa;IAYb,YAAY;IAKZ,QAAQ;IAMR,WAAW;IAMX,QAAQ;IAMR,IAAI,CAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAM,GAAG,IAAI;IAkBhF,SAAS;IAyBT,MAAM;IAIN,UAAU,CAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAM,GAAG,IAAI;IActF,gBAAgB,CAAE,EAAC,WAAW,EAAE,SAAS,EAAC,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAC,CAAA;KAAC,GAAG,IAAI;IAe/H,SAAS,CAAE,EAAC,WAAW,EAAC,EAAE;QAAC,WAAW,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI;IAsBtD,MAAM,CAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAWzB,YAAY,CAAE,EAAC,OAAO,EAAE,UAAU,EAAE,IAAY,EAAC,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAC,GAAG,IAAI;IAM5H,UAAU,CAAE,EAAC,OAAO,EAAE,UAAU,EAAE,IAAY,EAAC,EAAE;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAC,GAAG,IAAI;IAM1H,QAAQ;IAMR,UAAU;IAMV,YAAY;IAMZ,cAAc;IAMd,aAAa;IAMb,eAAe;IAMf,eAAe,CAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAY3C,QAAQ,CAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAK7D,cAAc,CAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAMnE,WAAW,CAAE,KAAK,GAAE,MAAM,EAAO,GAAG,IAAI;IAQxC,cAAc,CAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAYnE,gBAAgB,CAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAW1C,0BAA0B,IAAK,SAAS;IAcxC,mBAAmB,IAAK,SAAS;IAUjC,aAAa;IAQb,QAAQ,CAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAQ3B,mBAAmB,CAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM;IASzC,aAAa,CAAE,IAAI,CAAC,EAAE,IAAI,GAAG,MAAM;IASnC,SAAS,CAAE,IAAI,EAAE,IAAI,GAAG,IAAI;IAmB5B,gBAAgB,CAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO;IAQxE,cAAc,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAMrC,eAAe,CAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAI1C"}
@@ -0,0 +1,341 @@
1
+ import Cursor from './cursor.js';
2
+ import * as content from './content.js';
3
+ import * as parser from './parser.js';
4
+ import * as block from './block.js';
5
+ import config from './config.js';
6
+ import highlightSupport from './highlight-support.js';
7
+ import highlightText from './highlight-text.js';
8
+ import { toCharacterRange, rangeToHtml, findStartExcludingWhitespace, findEndExcludingWhitespace } from './util/dom.js';
9
+ /**
10
+ * The Selection module provides a cross-browser abstraction layer for range
11
+ * and selection.
12
+ *
13
+ * @module core
14
+ * @submodule selection
15
+ */
16
+ /**
17
+ * Class that represents a selection and provides functionality to access or
18
+ * modify the selection.
19
+ *
20
+ * @class Selection
21
+ * @constructor
22
+ */
23
+ export default class Selection extends Cursor {
24
+ constructor(editableHost, range) {
25
+ super(editableHost, range);
26
+ delete this.isCursor;
27
+ this.isSelection = true;
28
+ }
29
+ // Get the text inside the selection.
30
+ text() {
31
+ return this.range.toString();
32
+ }
33
+ // Get the html inside the selection.
34
+ html() {
35
+ return rangeToHtml(this.range);
36
+ }
37
+ isAllSelected() {
38
+ return parser.isBeginningOfHost(this.host, this.range.startContainer, this.range.startOffset) && parser.isTextEndOfHost(this.host, this.range.endContainer, this.range.endOffset);
39
+ }
40
+ getTextRange() {
41
+ return toCharacterRange(this.range, this.host);
42
+ }
43
+ // Return a plain string of the current selection content.
44
+ toString() {
45
+ return this.range.toString();
46
+ }
47
+ // Return true if the selection can be wrapped, i.e. all open nodes
48
+ // are closed within this selection.
49
+ isWrappable() {
50
+ return content.isWrappable(this.range);
51
+ }
52
+ // Get the ClientRects of this selection.
53
+ // Use this if you want more precision than getBoundingClientRect can give.
54
+ getRects() {
55
+ // consider: translate into absolute positions
56
+ // just like Cursor#getCoordinates()
57
+ return this.range.getClientRects();
58
+ }
59
+ link(href, attrs = {}) {
60
+ if (href)
61
+ attrs.href = href;
62
+ const link = this.createElement(config.linkMarkup.name, config.linkMarkup.attribs);
63
+ for (const key in attrs) {
64
+ const value = attrs[key];
65
+ if (value === undefined)
66
+ continue;
67
+ if (value === null) {
68
+ link.removeAttribute(key);
69
+ }
70
+ else {
71
+ link.setAttribute(key, value);
72
+ }
73
+ }
74
+ if (config.linkMarkup.trim)
75
+ this.trimRange();
76
+ this.forceWrap(link);
77
+ }
78
+ // trims whitespaces on the left and right of a selection, i.e. what you want in case of links
79
+ trimRange() {
80
+ const textToTrim = this.range.toString();
81
+ const whitespacesOnTheLeft = textToTrim.search(/\S|$/);
82
+ const lastNonWhitespace = textToTrim.search(/\S[\s]+$/);
83
+ const whitespacesOnTheRight = lastNonWhitespace === -1
84
+ ? 0
85
+ : textToTrim.length - (lastNonWhitespace + 1);
86
+ const [startContainer, startOffset] = findStartExcludingWhitespace({
87
+ root: this.range.commonAncestorContainer,
88
+ startContainer: this.range.startContainer,
89
+ startOffset: this.range.startOffset,
90
+ whitespacesOnTheLeft
91
+ });
92
+ this.range.setStart(startContainer, startOffset);
93
+ const [endContainer, endOffset] = findEndExcludingWhitespace({
94
+ root: this.range.commonAncestorContainer,
95
+ endContainer: this.range.endContainer,
96
+ endOffset: this.range.endOffset,
97
+ whitespacesOnTheRight
98
+ });
99
+ this.range.setEnd(endContainer, endOffset);
100
+ }
101
+ unlink() {
102
+ this.removeFormatting(config.linkMarkup.name);
103
+ }
104
+ toggleLink(href, attrs = {}) {
105
+ const links = this.getTagsByName(config.linkMarkup.name);
106
+ if (links.length >= 1) {
107
+ const firstLink = links[0];
108
+ if (this.isExactSelection(firstLink, 'visible')) {
109
+ this.unlink();
110
+ }
111
+ else {
112
+ this.expandTo(firstLink);
113
+ }
114
+ }
115
+ else {
116
+ this.link(href, attrs);
117
+ }
118
+ }
119
+ highlightComment({ highlightId, textRange }) {
120
+ highlightSupport.highlightRange(this.host, textRange.text, highlightId, textRange.start, textRange.end, undefined, // dispatcher
121
+ this.win, 'comment');
122
+ }
123
+ // Manually add a highlight
124
+ // Note: the current code does not work with newlines (LP)
125
+ highlight({ highlightId }) {
126
+ const textBefore = this.textBefore();
127
+ const currentTextContent = this.text();
128
+ const marker = '<span class="highlight-comment"></span>';
129
+ const markerNode = highlightSupport.createMarkerNode(marker, 'comment', this.win);
130
+ if (!markerNode)
131
+ return;
132
+ markerNode.setAttribute('data-match', currentTextContent);
133
+ const match = {
134
+ startIndex: textBefore.length,
135
+ endIndex: textBefore.length + currentTextContent.length,
136
+ match: currentTextContent,
137
+ marker: markerNode
138
+ };
139
+ // Note: highlighting won't retain the selection
140
+ highlightText.highlightMatches(this.host, [match]);
141
+ }
142
+ // e.g. toggle('<em>')
143
+ toggle(elem) {
144
+ if (block.isPlainTextBlock(this.host))
145
+ return;
146
+ if (this.range.collapsed)
147
+ return;
148
+ elem = this.adoptElement(elem);
149
+ const newRange = content.toggleTag(this.host, this.range, elem);
150
+ if (newRange) {
151
+ this.range = newRange;
152
+ this.setVisibleSelection();
153
+ }
154
+ }
155
+ toggleCustom({ tagName, attributes, trim = false }) {
156
+ const customElem = this.createElement(tagName, attributes);
157
+ if (trim)
158
+ this.trimRange();
159
+ this.toggle(customElem);
160
+ }
161
+ makeCustom({ tagName, attributes, trim = false }) {
162
+ const customElem = this.createElement(tagName, attributes);
163
+ if (trim)
164
+ this.trimRange();
165
+ this.forceWrap(customElem);
166
+ }
167
+ makeBold() {
168
+ const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs);
169
+ if (config.boldMarkup.trim)
170
+ this.trimRange();
171
+ this.forceWrap(bold);
172
+ }
173
+ toggleBold() {
174
+ const bold = this.createElement(config.boldMarkup.name, config.boldMarkup.attribs);
175
+ if (config.boldMarkup.trim)
176
+ this.trimRange();
177
+ this.toggle(bold);
178
+ }
179
+ giveEmphasis() {
180
+ const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs);
181
+ if (config.italicMarkup.trim)
182
+ this.trimRange();
183
+ this.forceWrap(em);
184
+ }
185
+ toggleEmphasis() {
186
+ const em = this.createElement(config.italicMarkup.name, config.italicMarkup.attribs);
187
+ if (config.italicMarkup.trim)
188
+ this.trimRange();
189
+ this.toggle(em);
190
+ }
191
+ makeUnderline() {
192
+ const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs);
193
+ if (config.underlineMarkup.trim)
194
+ this.trimRange();
195
+ this.forceWrap(u);
196
+ }
197
+ toggleUnderline() {
198
+ const u = this.createElement(config.underlineMarkup.name, config.underlineMarkup.attribs);
199
+ if (config.underlineMarkup.trim)
200
+ this.trimRange();
201
+ this.toggle(u);
202
+ }
203
+ insertCharacter(character) {
204
+ const cursor = this.deleteContent();
205
+ const textNode = cursor.createTextNode(character);
206
+ cursor.insertBefore(textNode);
207
+ cursor.setVisibleSelection();
208
+ return cursor;
209
+ }
210
+ // Surround the selection with characters like quotes.
211
+ //
212
+ // @param {String} E.g. '«'
213
+ // @param {String} E.g. '»'
214
+ surround(startCharacter, endCharacter) {
215
+ this.range = content.surround(this.host, this.range, startCharacter, endCharacter);
216
+ this.setVisibleSelection();
217
+ }
218
+ removeSurround(startCharacter, endCharacter) {
219
+ this.range = content.deleteCharacter(this.host, this.range, startCharacter);
220
+ this.range = content.deleteCharacter(this.host, this.range, endCharacter);
221
+ this.setVisibleSelection();
222
+ }
223
+ removeChars(chars = []) {
224
+ for (let i = 0; i < chars.length; i++) {
225
+ const char = chars[i];
226
+ this.range = content.deleteCharacter(this.host, this.range, char);
227
+ }
228
+ this.setVisibleSelection();
229
+ }
230
+ toggleSurround(startCharacter, endCharacter) {
231
+ if (this.containsString(startCharacter) &&
232
+ this.containsString(endCharacter)) {
233
+ this.removeSurround(startCharacter, endCharacter);
234
+ }
235
+ else {
236
+ this.surround(startCharacter, endCharacter);
237
+ }
238
+ }
239
+ // @param {String} selector. An element selector, e.g. 'a' or 'span.some-class'
240
+ // that represents elements to be removed; if undefined,
241
+ // remove all.
242
+ removeFormatting(selector) {
243
+ const newRange = content.removeFormatting(this.host, this.range, selector || null);
244
+ if (newRange) {
245
+ this.range = newRange;
246
+ this.setVisibleSelection();
247
+ }
248
+ }
249
+ // Delete the farest ancestor that is an exact selection
250
+ //
251
+ // @return Selection instance
252
+ deleteExactSurroundingTags() {
253
+ const ancestorTags = this.getAncestorTags().reverse();
254
+ for (const ancestorTag of ancestorTags) {
255
+ if (this.isExactSelection(ancestorTag, undefined)) {
256
+ ancestorTag.remove();
257
+ break;
258
+ }
259
+ }
260
+ return new Selection(this.host, this.range);
261
+ }
262
+ // Delete all the tags whose text is completely within the current selection.
263
+ //
264
+ // @return Selection instance
265
+ deleteContainedTags() {
266
+ const containedTags = this.getContainedTags();
267
+ containedTags.forEach(containedTag => containedTag.remove());
268
+ return new Selection(this.host, this.range);
269
+ }
270
+ // Delete the contents inside the range and exact surrounding markups.
271
+ // After that the selection will be a cursor.
272
+ //
273
+ // @return Cursor instance
274
+ deleteContent() {
275
+ this.range.deleteContents();
276
+ return new Cursor(this.host, this.range);
277
+ }
278
+ // Expand the current selection.
279
+ //
280
+ // @param {DOM Node}
281
+ expandTo(elem) {
282
+ this.range = content.expandTo(this.host, this.range, elem);
283
+ this.setVisibleSelection();
284
+ }
285
+ // Collapse the selection at the beginning of the selection
286
+ //
287
+ // @return Cursor instance
288
+ collapseAtBeginning(elem) {
289
+ this.range.collapse(true);
290
+ this.setVisibleSelection();
291
+ return new Cursor(this.host, this.range);
292
+ }
293
+ // Collapse the selection at the end of the selection
294
+ //
295
+ // @return Cursor instance
296
+ collapseAtEnd(elem) {
297
+ this.range.collapse(false);
298
+ this.setVisibleSelection();
299
+ return new Cursor(this.host, this.range);
300
+ }
301
+ // Wrap the selection with the specified tag. If any other tag with
302
+ // the same tagName is affecting the selection this tag will be
303
+ // remove first.
304
+ forceWrap(elem) {
305
+ if (block.isPlainTextBlock(this.host))
306
+ return;
307
+ if (this.range.collapsed)
308
+ return;
309
+ elem = this.adoptElement(elem);
310
+ const newRange = content.forceWrap(this.host, this.range, elem);
311
+ if (newRange) {
312
+ this.range = newRange;
313
+ this.setVisibleSelection();
314
+ }
315
+ }
316
+ // Check if the selection is the same as the elements contents.
317
+ //
318
+ // @method isExactSelection
319
+ // @param {DOM Node}
320
+ // @param {flag: undefined or 'visible'} if 'visible' is passed
321
+ // whitespaces at the beginning or end of the selection will
322
+ // be ignored.
323
+ // @return {Boolean}
324
+ isExactSelection(elem, onlyVisible) {
325
+ return content.isExactSelection(this.range, elem, onlyVisible === 'visible');
326
+ }
327
+ // Check if the selection contains the passed string.
328
+ //
329
+ // @method containsString
330
+ // @return {Boolean}
331
+ containsString(str) {
332
+ return content.containsString(this.range, str);
333
+ }
334
+ // Delete all occurrences of the specified character from the
335
+ // selection.
336
+ deleteCharacter(character) {
337
+ this.range = content.deleteCharacter(this.host, this.range, character);
338
+ this.setVisibleSelection();
339
+ }
340
+ }
341
+ //# sourceMappingURL=selection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selection.js","sourceRoot":"","sources":["../src/selection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare const shouldApplySmartQuotes: (config: {
2
+ smartQuotes?: boolean;
3
+ quotes?: any;
4
+ singleQuotes?: any;
5
+ }, target: HTMLElement) => boolean;
6
+ export declare const isDoubleQuote: (char: string) => boolean;
7
+ export declare const isSingleQuote: (char: string) => boolean;
8
+ export declare const isApostrophe: (char: string) => boolean;
9
+ export declare const isWhitespace: (char: string) => boolean;
10
+ export declare const isSeparatorOrWhitespace: (char: string) => boolean;
11
+ export declare const replaceQuote: (range: Range, index: number, quoteType: string) => Text | null;
12
+ export declare const applySmartQuotes: (range: Range, config: {
13
+ quotes: string[];
14
+ singleQuotes: string[];
15
+ }, char: string, target: HTMLElement, cursorOffset?: number) => void;
16
+ //# sourceMappingURL=smartQuotes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smartQuotes.d.ts","sourceRoot":"","sources":["../src/smartQuotes.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,GAAI,QAAQ;IAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,GAAG,CAAC;IAAC,YAAY,CAAC,EAAE,GAAG,CAAA;CAAC,EAAE,QAAQ,WAAW,KAAG,OAG/H,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,OAAgE,CAAA;AAC7G,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,KAAG,OAAgE,CAAA;AAC7G,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAAwC,CAAA;AACpF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAA4B,CAAA;AACxE,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,KAAG,OAAkC,CAAA;AAOzF,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,EAAE,OAAO,MAAM,EAAE,WAAW,MAAM,KAAG,IAAI,GAAG,IAcpF,CAAA;AAcD,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,EAAE,QAAQ;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAC,EAAE,MAAM,MAAM,EAAE,QAAQ,WAAW,EAAE,eAAe,MAAM,KAAG,IAmD7J,CAAA"}