@elyra/canvas 12.12.3 → 12.15.0
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/.stylelintrc.json +17 -16
- package/README.md +1 -1
- package/dist/_baseForOwn-7d4e8506.js.map +1 -1
- package/dist/_baseForOwn-d38b560e.js.map +1 -1
- package/dist/canvas-constants-34cdb7df.js.map +1 -1
- package/dist/canvas-constants-3c09c7f6.js.map +1 -1
- package/dist/{canvas-controller-e91d037b.js → canvas-controller-720a509c.js} +2 -2
- package/dist/canvas-controller-720a509c.js.map +1 -0
- package/dist/canvas-controller-73113a1b.js +2 -0
- package/dist/canvas-controller-73113a1b.js.map +1 -0
- package/dist/common-canvas-21b6ab50.js +2 -0
- package/dist/common-canvas-21b6ab50.js.map +1 -0
- package/dist/common-canvas-baef2726.js +2 -0
- package/dist/common-canvas-baef2726.js.map +1 -0
- package/dist/common-canvas.es.js +1 -1
- package/dist/common-canvas.es.js.map +1 -1
- package/dist/common-canvas.js +1 -1
- package/dist/common-canvas.js.map +1 -1
- package/dist/common-properties-86de4c9f.js +2 -0
- package/dist/common-properties-86de4c9f.js.map +1 -0
- package/dist/common-properties-9e579309.js +2 -0
- package/dist/common-properties-9e579309.js.map +1 -0
- package/dist/createClass-32a0cf0f.js.map +1 -1
- package/dist/createClass-6db89a23.js.map +1 -1
- package/dist/datarecord-metadata-v3-schema-6b6384ff.js.map +1 -1
- package/dist/datarecord-metadata-v3-schema-81228a9a.js.map +1 -1
- package/dist/en-7a0f1db1.js.map +1 -1
- package/dist/en-8647c347.js.map +1 -1
- package/dist/{extends-7fdcdc52.js → extends-1139e06f.js} +2 -2
- package/dist/{extends-7fdcdc52.js.map → extends-1139e06f.js.map} +1 -1
- package/dist/extends-8d17c85c.js.map +1 -1
- package/dist/{flexible-table-a13cb7d0.js → flexible-table-d3598aa8.js} +2 -2
- package/dist/flexible-table-d3598aa8.js.map +1 -0
- package/dist/{flexible-table-50ce600a.js → flexible-table-fe7fbc13.js} +2 -2
- package/dist/flexible-table-fe7fbc13.js.map +1 -0
- package/dist/getPrototypeOf-a1c3fe64.js.map +1 -1
- package/dist/getPrototypeOf-bf88242f.js.map +1 -1
- package/dist/{icon-bf77b2aa.js → icon-918d2dd3.js} +2 -2
- package/dist/{icon-bf77b2aa.js.map → icon-918d2dd3.js.map} +1 -1
- package/dist/{index-f2c306ba.js → index-669f95a7.js} +2 -2
- package/dist/{index-f2c306ba.js.map → index-669f95a7.js.map} +1 -1
- package/dist/{index-0e6c8b9c.js → index-6d3404e1.js} +2 -2
- package/dist/{index-0e6c8b9c.js.map → index-6d3404e1.js.map} +1 -1
- package/dist/isArrayLikeObject-a9c7973b.js.map +1 -1
- package/dist/isArrayLikeObject-f3b27f64.js.map +1 -1
- package/dist/lib/canvas-controller.es.js +1 -1
- package/dist/lib/canvas-controller.js +1 -1
- package/dist/lib/canvas.es.js +1 -1
- package/dist/lib/canvas.js +1 -1
- package/dist/lib/context-menu.es.js +1 -1
- package/dist/lib/properties/field-picker.es.js +1 -1
- package/dist/lib/properties/field-picker.js +1 -1
- package/dist/lib/properties/flexible-table.es.js +1 -1
- package/dist/lib/properties/flexible-table.js +1 -1
- package/dist/lib/properties.es.js +1 -1
- package/dist/lib/properties.js +1 -1
- package/dist/lib/tooltip.es.js +1 -1
- package/dist/lib/tooltip.es.js.map +1 -1
- package/dist/lib/tooltip.js +1 -1
- package/dist/lib/tooltip.js.map +1 -1
- package/dist/styles/common-canvas.min.css +1 -1
- package/dist/styles/common-canvas.min.css.map +1 -1
- package/dist/toolbar-29ec7983.js +2 -0
- package/dist/toolbar-29ec7983.js.map +1 -0
- package/dist/toolbar-3f4b173f.js +2 -0
- package/dist/toolbar-3f4b173f.js.map +1 -0
- package/locales/command-actions/locales/de.json +50 -8
- package/locales/command-actions/locales/en.json +1 -1
- package/locales/command-actions/locales/es.json +50 -8
- package/locales/command-actions/locales/fr.json +50 -8
- package/locales/command-actions/locales/index.js +2 -2
- package/locales/command-actions/locales/it.json +50 -8
- package/locales/command-actions/locales/ja.json +50 -8
- package/locales/command-actions/locales/ko.json +42 -0
- package/locales/command-actions/locales/pt-br.json +50 -8
- package/locales/command-actions/locales/zh-CN.json +51 -0
- package/locales/command-actions/locales/zh-TW.json +51 -0
- package/locales/common-canvas/locales/de.json +36 -26
- package/locales/common-canvas/locales/en.json +14 -1
- package/locales/common-canvas/locales/eo.json +14 -1
- package/locales/common-canvas/locales/es.json +36 -26
- package/locales/common-canvas/locales/fr.json +36 -26
- package/locales/common-canvas/locales/index.js +2 -2
- package/locales/common-canvas/locales/it.json +36 -26
- package/locales/common-canvas/locales/ja.json +36 -26
- package/locales/common-canvas/locales/ko.json +7 -2
- package/locales/common-canvas/locales/pt-br.json +36 -26
- package/locales/common-canvas/locales/zh-CN.json +37 -0
- package/locales/common-canvas/locales/zh-TW.json +37 -0
- package/locales/common-properties/locales/de.json +92 -92
- package/locales/common-properties/locales/en.json +1 -1
- package/locales/common-properties/locales/es.json +92 -92
- package/locales/common-properties/locales/fr.json +92 -92
- package/locales/common-properties/locales/index.js +2 -2
- package/locales/common-properties/locales/it.json +92 -92
- package/locales/common-properties/locales/ja.json +92 -92
- package/locales/common-properties/locales/ko.json +1 -1
- package/locales/common-properties/locales/pt-br.json +92 -92
- package/locales/common-properties/locales/zh-CN.json +93 -0
- package/locales/common-properties/locales/zh-TW.json +93 -0
- package/locales/palette/locales/de.json +9 -9
- package/locales/palette/locales/en.json +6 -6
- package/locales/palette/locales/es.json +9 -9
- package/locales/palette/locales/fr.json +9 -9
- package/locales/palette/locales/index.js +2 -2
- package/locales/palette/locales/it.json +9 -9
- package/locales/palette/locales/ja.json +9 -9
- package/locales/palette/locales/pt-br.json +9 -9
- package/locales/palette/locales/zh-CN.json +10 -0
- package/locales/palette/locales/zh-TW.json +10 -0
- package/locales/toolbar/locales/de.json +7 -7
- package/locales/toolbar/locales/en.json +1 -1
- package/locales/toolbar/locales/es.json +7 -7
- package/locales/toolbar/locales/fr.json +7 -7
- package/locales/toolbar/locales/index.js +2 -2
- package/locales/toolbar/locales/it.json +7 -7
- package/locales/toolbar/locales/ja.json +7 -7
- package/locales/toolbar/locales/pt-br.json +7 -7
- package/locales/toolbar/locales/zh-CN.json +8 -0
- package/locales/toolbar/locales/zh-TW.json +8 -0
- package/package.json +3 -2
- package/src/common-canvas/canvas-controller.js +19 -3
- package/src/common-canvas/cc-bottom-panel.jsx +37 -21
- package/src/common-canvas/cc-central-items.jsx +1 -1
- package/src/common-canvas/cc-contents.jsx +10 -3
- package/src/common-canvas/cc-text-toolbar.jsx +141 -0
- package/src/common-canvas/cc-toolbar.jsx +8 -6
- package/src/common-canvas/common-canvas-utils.js +37 -4
- package/src/common-canvas/common-canvas.scss +52 -5
- package/src/common-canvas/svg-canvas-d3.scss +172 -23
- package/src/common-canvas/svg-canvas-pipeline.js +10 -3
- package/src/common-canvas/svg-canvas-renderer.js +93 -341
- package/src/common-canvas/svg-canvas-utils-decs.js +0 -5
- package/src/common-canvas/svg-canvas-utils-markdown.js +515 -0
- package/src/common-canvas/svg-canvas-utils-nodes.js +0 -5
- package/src/common-canvas/svg-canvas-utils-textarea.js +472 -0
- package/src/common-properties/components/control-item/control-item.scss +1 -1
- package/src/common-properties/components/flexible-table/flexible-table.jsx +14 -3
- package/src/common-properties/components/flexible-table/flexible-table.scss +20 -0
- package/src/common-properties/components/title-editor/title-editor.jsx +2 -2
- package/src/common-properties/components/title-editor/title-editor.scss +1 -16
- package/src/common-properties/controls/abstract-table.jsx +2 -0
- package/src/common-properties/controls/checkbox/checkbox.jsx +1 -1
- package/src/common-properties/controls/checkboxset/checkboxset.jsx +36 -11
- package/src/common-properties/controls/checkboxset/checkboxset.scss +6 -0
- package/src/common-properties/controls/list/list.jsx +1 -0
- package/src/common-properties/controls/radioset/radioset.jsx +25 -1
- package/src/common-properties/controls/radioset/radioset.scss +19 -0
- package/src/common-properties/controls/selectcolumns/selectcolumns.jsx +1 -0
- package/src/common-properties/controls/someofselect/someofselect.jsx +1 -0
- package/src/common-properties/form/ControlInfo.js +3 -0
- package/src/common-properties/form/EditorForm.js +45 -3
- package/src/common-properties/panels/action-panel/action-panel.jsx +38 -3
- package/src/common-properties/panels/action-panel/action-panel.scss +3 -0
- package/src/common-properties/panels/text-panel/text-panel.jsx +38 -7
- package/src/common-properties/panels/text-panel/text-panel.scss +4 -3
- package/src/common-properties/properties-controller.js +39 -12
- package/src/common-properties/ui-conditions/conditions-utils.js +14 -8
- package/src/common-properties/util/L10nProvider.js +6 -0
- package/src/object-model/config-utils.js +1 -0
- package/src/object-model/layout-dimensions.js +14 -2
- package/src/object-model/object-model.js +12 -0
- package/src/object-model/redux/canvas-store.js +4 -1
- package/src/object-model/redux/reducers/bottompanel.js +1 -3
- package/src/object-model/redux/reducers/texttoolbar.js +29 -0
- package/src/palette/palette-content-list-item.jsx +12 -2
- package/src/palette/palette-content-list.jsx +11 -19
- package/src/palette/palette-dialog-content-grid.jsx +1 -6
- package/src/palette/palette-dialog-content.jsx +13 -11
- package/src/palette/palette-flyout-content-category.jsx +90 -57
- package/src/palette/palette-flyout-content.jsx +4 -24
- package/src/palette/palette.scss +72 -44
- package/src/toolbar/toolbar-action-item.jsx +9 -6
- package/src/toolbar/toolbar-overflow-item.jsx +1 -0
- package/src/toolbar/toolbar.jsx +12 -15
- package/src/tooltip/tooltip.jsx +14 -5
- package/stats.html +1 -1
- package/dist/canvas-controller-de76a796.js +0 -2
- package/dist/canvas-controller-de76a796.js.map +0 -1
- package/dist/canvas-controller-e91d037b.js.map +0 -1
- package/dist/common-canvas-522f6263.js +0 -2
- package/dist/common-canvas-522f6263.js.map +0 -1
- package/dist/common-canvas-90539c97.js +0 -2
- package/dist/common-canvas-90539c97.js.map +0 -1
- package/dist/common-properties-245c4711.js +0 -2
- package/dist/common-properties-245c4711.js.map +0 -1
- package/dist/common-properties-49e6bb67.js +0 -2
- package/dist/common-properties-49e6bb67.js.map +0 -1
- package/dist/flexible-table-50ce600a.js.map +0 -1
- package/dist/flexible-table-a13cb7d0.js.map +0 -1
- package/dist/toolbar-1c181339.js +0 -2
- package/dist/toolbar-1c181339.js.map +0 -1
- package/dist/toolbar-c6fa3cdb.js +0 -2
- package/dist/toolbar-c6fa3cdb.js.map +0 -1
- package/locales/command-actions/locales/zh-cn.json +0 -9
- package/locales/command-actions/locales/zh-tw.json +0 -9
- package/locales/common-canvas/locales/zh-cn.json +0 -27
- package/locales/common-canvas/locales/zh-tw.json +0 -27
- package/locales/common-properties/locales/zh-cn.json +0 -93
- package/locales/common-properties/locales/zh-tw.json +0 -93
- package/locales/palette/locales/zh-cn.json +0 -10
- package/locales/palette/locales/zh-tw.json +0 -10
- package/locales/toolbar/locales/zh-cn.json +0 -8
- package/locales/toolbar/locales/zh-tw.json +0 -8
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2022 Elyra Authors
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export default class SvgCanvasUtilsComments {
|
|
18
|
+
|
|
19
|
+
// Processes the action passed in and returns an object containing:
|
|
20
|
+
// newText - new text based on the input text passed in with markdown
|
|
21
|
+
// characters added based on the selected part of the text
|
|
22
|
+
// newStart - a new starting point for selection highlighting
|
|
23
|
+
// newEnd - a new ending point for selection highlighting
|
|
24
|
+
static processMarkdownAction(action, text, inStart, inEnd) {
|
|
25
|
+
let start = inStart;
|
|
26
|
+
let end = inEnd;
|
|
27
|
+
let mdObj = null;
|
|
28
|
+
|
|
29
|
+
if (start === end) {
|
|
30
|
+
start = this.findFirstSpace(text, start);
|
|
31
|
+
end = this.findLastSpace(text, end);
|
|
32
|
+
|
|
33
|
+
} else if (this.allWhiteSpace(text, start, end)) {
|
|
34
|
+
start = end;
|
|
35
|
+
|
|
36
|
+
} else {
|
|
37
|
+
start = this.findFirstNonSpace(text, start, end);
|
|
38
|
+
end = this.findLastNonSpace(text, start, end);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
switch (action) {
|
|
42
|
+
case "title":
|
|
43
|
+
case "header":
|
|
44
|
+
case "subheader":
|
|
45
|
+
case "body":
|
|
46
|
+
case "increaseHashes":
|
|
47
|
+
case "decreaseHashes": {
|
|
48
|
+
mdObj = this.processHeaderCommand(text, start, end, action);
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
case "bold": {
|
|
52
|
+
mdObj = this.processWrapCommand(text, start, end, "**");
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
case "italics": {
|
|
56
|
+
mdObj = this.processWrapCommand(text, start, end, "_");
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case "strikethrough": {
|
|
60
|
+
mdObj = this.processWrapCommand(text, start, end, "~~");
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
case "code": {
|
|
64
|
+
mdObj = this.processCodeCommand(text, start, end);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case "link": {
|
|
68
|
+
mdObj = this.processLinkCommand(text, start, end);
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
case "quote":
|
|
72
|
+
case "numberedList":
|
|
73
|
+
case "bulletedList": {
|
|
74
|
+
mdObj = this.processMultiLineCommand(text, start, end, action);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
case "return": {
|
|
78
|
+
mdObj = this.processReturnCommand(text, start, end, inStart, inEnd);
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
default: {
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return mdObj;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
static findFirstSpace(text, start) {
|
|
89
|
+
const spacePos = text.lastIndexOf(" ", start - 1) + 1;
|
|
90
|
+
const newLinePos = text.lastIndexOf("\n", start - 1) + 1;
|
|
91
|
+
return Math.max(spacePos, newLinePos, 0);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static findLastSpace(text, end) {
|
|
95
|
+
let spacePos = text.indexOf(" ", end);
|
|
96
|
+
let newLinePos = text.indexOf("\n", end);
|
|
97
|
+
spacePos = spacePos === -1 ? text.length : spacePos;
|
|
98
|
+
newLinePos = newLinePos === -1 ? text.length : newLinePos;
|
|
99
|
+
return Math.min(spacePos, newLinePos, text.length);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
static allWhiteSpace(text, start, end) {
|
|
103
|
+
return text.slice(start, end).trim().length === 0;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static findFirstNonSpace(text, start, end) {
|
|
107
|
+
let newStart = start;
|
|
108
|
+
while ((text[newStart] === " " || text[newStart] === "\n") && newStart <= end) {
|
|
109
|
+
newStart++;
|
|
110
|
+
}
|
|
111
|
+
return newStart;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static findLastNonSpace(text, start, end) {
|
|
115
|
+
let newEnd = end;
|
|
116
|
+
while ((text[newEnd - 1] === " " || text[newEnd - 1] === "\n") && newEnd >= start) {
|
|
117
|
+
newEnd--;
|
|
118
|
+
}
|
|
119
|
+
return newEnd;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static processHeaderCommand(text, inStart, inEnd, action) {
|
|
123
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
124
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
125
|
+
|
|
126
|
+
const startText = text.slice(0, start);
|
|
127
|
+
const selectedText = text.slice(start, end);
|
|
128
|
+
const endText = text.slice(end);
|
|
129
|
+
|
|
130
|
+
let newStart = start;
|
|
131
|
+
let newEnd = end;
|
|
132
|
+
let newText = "";
|
|
133
|
+
let tempText = selectedText;
|
|
134
|
+
|
|
135
|
+
// Remove all hashes if any from the line.
|
|
136
|
+
const hashCount = this.getHashCount(selectedText);
|
|
137
|
+
if (hashCount > 0) {
|
|
138
|
+
const firstSpace = selectedText.indexOf(" ");
|
|
139
|
+
tempText = selectedText.slice(firstSpace + 1);
|
|
140
|
+
newText = startText + tempText + endText;
|
|
141
|
+
newEnd -= firstSpace + 1;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Add as many hashes as appropriate for the action.
|
|
145
|
+
const headerSyntax = this.getHeaderSyntax(action, hashCount);
|
|
146
|
+
if (headerSyntax) {
|
|
147
|
+
newText = startText + headerSyntax + tempText + endText;
|
|
148
|
+
newStart += headerSyntax.length;
|
|
149
|
+
newEnd += headerSyntax.length;
|
|
150
|
+
}
|
|
151
|
+
return { newText, newStart, newEnd };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
static getHeaderSyntax(action, hashCount) {
|
|
155
|
+
switch (action) {
|
|
156
|
+
case "title": return "# ";
|
|
157
|
+
case "header": return "## ";
|
|
158
|
+
case "subheader": return "### ";
|
|
159
|
+
case "body": return false;
|
|
160
|
+
case "increaseHashes": {
|
|
161
|
+
if (hashCount === 0) {
|
|
162
|
+
return "# ";
|
|
163
|
+
} else if (hashCount === 1) {
|
|
164
|
+
return "## ";
|
|
165
|
+
} else if (hashCount === 2) {
|
|
166
|
+
return "### ";
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
case "decreaseHashes": {
|
|
171
|
+
if (hashCount === 0) {
|
|
172
|
+
return "### ";
|
|
173
|
+
} else if (hashCount === 1) {
|
|
174
|
+
return false;
|
|
175
|
+
} else if (hashCount === 2) {
|
|
176
|
+
return "# ";
|
|
177
|
+
} else if (hashCount === 3) {
|
|
178
|
+
return "## ";
|
|
179
|
+
}
|
|
180
|
+
return "### ";
|
|
181
|
+
}
|
|
182
|
+
default:
|
|
183
|
+
}
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
static getHashCount(text) {
|
|
188
|
+
if (text.startsWith("# ")) {
|
|
189
|
+
return 1;
|
|
190
|
+
} else if (text.startsWith("## ")) {
|
|
191
|
+
return 2;
|
|
192
|
+
} else if (text.startsWith("### ")) {
|
|
193
|
+
return 3;
|
|
194
|
+
} else if (text.startsWith("#### ")) {
|
|
195
|
+
return 4;
|
|
196
|
+
} else if (text.startsWith("##### ")) {
|
|
197
|
+
return 5;
|
|
198
|
+
} else if (text.startsWith("###### ")) {
|
|
199
|
+
return 6;
|
|
200
|
+
}
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
static processWrapCommand(text, start, end, chars) {
|
|
205
|
+
let newText = "";
|
|
206
|
+
let newStart = start;
|
|
207
|
+
let newEnd = end;
|
|
208
|
+
|
|
209
|
+
const startText = text.slice(0, start);
|
|
210
|
+
const selectedText = text.slice(start, end);
|
|
211
|
+
const endText = text.slice(end);
|
|
212
|
+
const charsCount = chars.length;
|
|
213
|
+
|
|
214
|
+
if (startText.endsWith(chars) && endText.startsWith(chars)) {
|
|
215
|
+
newText = startText.slice(0, startText.length - charsCount) +
|
|
216
|
+
selectedText +
|
|
217
|
+
endText.slice(charsCount);
|
|
218
|
+
newStart = start - charsCount;
|
|
219
|
+
newEnd = end - charsCount;
|
|
220
|
+
|
|
221
|
+
} else if (selectedText.startsWith(chars) && selectedText.endsWith(chars)) {
|
|
222
|
+
newText = startText +
|
|
223
|
+
selectedText
|
|
224
|
+
.slice(0, selectedText.length - charsCount) // Remove ending chars
|
|
225
|
+
.slice(charsCount) + // Remove beginning chars
|
|
226
|
+
endText;
|
|
227
|
+
newStart = start;
|
|
228
|
+
newEnd = end - (2 * charsCount);
|
|
229
|
+
|
|
230
|
+
} else {
|
|
231
|
+
newText = startText + chars + selectedText + chars + endText;
|
|
232
|
+
newStart = start + charsCount;
|
|
233
|
+
newEnd = end + charsCount;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return { newText, newStart, newEnd };
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
static processCodeCommand(text, start, end) {
|
|
240
|
+
const selText = text.slice(start, end);
|
|
241
|
+
if (selText.indexOf("\n") > -1) {
|
|
242
|
+
return this.processTripleBackTicks(text, start, end);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
return this.processWrapCommand(text, start, end, "`");
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
static processTripleBackTicks(text, inStart, inEnd) {
|
|
249
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
250
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
251
|
+
|
|
252
|
+
const startText = text.slice(0, start);
|
|
253
|
+
const selectedText = text.slice(start, end);
|
|
254
|
+
const endText = text.slice(end);
|
|
255
|
+
|
|
256
|
+
let newStart = start;
|
|
257
|
+
let newEnd = end;
|
|
258
|
+
let newText = "";
|
|
259
|
+
|
|
260
|
+
if (startText.endsWith("```\n") && endText.startsWith("\n```")) {
|
|
261
|
+
newText = startText.slice(0, start - 4) + selectedText + endText.slice(4);
|
|
262
|
+
newStart -= 4;
|
|
263
|
+
newEnd -= 4;
|
|
264
|
+
|
|
265
|
+
} else {
|
|
266
|
+
newText = startText + "```\n" + selectedText + "\n```" + endText;
|
|
267
|
+
newStart += 4;
|
|
268
|
+
newEnd += 4;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return { newText, newStart, newEnd };
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
static processLinkCommand(text, start, end) {
|
|
275
|
+
let newText = "";
|
|
276
|
+
let newStart = start;
|
|
277
|
+
let newEnd = end;
|
|
278
|
+
|
|
279
|
+
const startText = text.slice(0, start);
|
|
280
|
+
const selectedText = text.slice(start, end);
|
|
281
|
+
const endText = text.slice(end);
|
|
282
|
+
|
|
283
|
+
if (startText.endsWith("[") && endText.startsWith("](url)")) {
|
|
284
|
+
newText = startText.slice(0, startText.length - 1) + selectedText + endText.slice(6);
|
|
285
|
+
newStart = start - 1;
|
|
286
|
+
newEnd = end - 1;
|
|
287
|
+
|
|
288
|
+
} else if (selectedText === "[](url)") {
|
|
289
|
+
newText = startText + endText;
|
|
290
|
+
newStart = start;
|
|
291
|
+
newEnd = newStart;
|
|
292
|
+
|
|
293
|
+
} else if (start === end) {
|
|
294
|
+
newText = startText + "[](url)" + endText;
|
|
295
|
+
newStart = start + 1;
|
|
296
|
+
newEnd = start + 1;
|
|
297
|
+
|
|
298
|
+
} else {
|
|
299
|
+
newText = startText + "[" + selectedText + "](url)" + endText;
|
|
300
|
+
newStart = start + 1;
|
|
301
|
+
newEnd = end + 1;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return { newText, newStart, newEnd };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
static processMultiLineCommand(text, start, end, action) {
|
|
308
|
+
if (this.isMultiLineMarkdown(text, start, end, action)) {
|
|
309
|
+
return this.removeMultiLineMarkdown(text, start, end, action);
|
|
310
|
+
}
|
|
311
|
+
return this.addMultiLineMarkdown(text, start, end, action);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
static isMultiLineMarkdown(text, inStart, inEnd, action) {
|
|
315
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
316
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
317
|
+
const selectedText = text.slice(start, end);
|
|
318
|
+
|
|
319
|
+
const lines = selectedText.split("\n");
|
|
320
|
+
return lines.every((line) => this.isMultiLineItem(line, action));
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
static isMultiLineItem(text, action) {
|
|
324
|
+
switch (action) {
|
|
325
|
+
case "quote":
|
|
326
|
+
return text.startsWith("> ");
|
|
327
|
+
case "bulletedList":
|
|
328
|
+
return text.startsWith("* ");
|
|
329
|
+
case "numberedList": {
|
|
330
|
+
const number = this.getPrefixNumber(text);
|
|
331
|
+
return (!isNaN(number) && number > 0);
|
|
332
|
+
}
|
|
333
|
+
default:
|
|
334
|
+
}
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
static getPrefixNumber(text) {
|
|
339
|
+
const firstSpace = text.indexOf(". ");
|
|
340
|
+
const firstText = text.slice(0, firstSpace);
|
|
341
|
+
return Number(firstText);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
static removeMultiLineMarkdown(text, inStart, inEnd, action) {
|
|
345
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
346
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
347
|
+
|
|
348
|
+
const startText = text.slice(0, start);
|
|
349
|
+
const selectedText = text.slice(start, end);
|
|
350
|
+
const endText = text.slice(end);
|
|
351
|
+
|
|
352
|
+
const newStart = start;
|
|
353
|
+
let newEnd = end;
|
|
354
|
+
let newText = startText;
|
|
355
|
+
|
|
356
|
+
const lines = selectedText.split("\n");
|
|
357
|
+
lines.forEach((line, i) => {
|
|
358
|
+
const newLine = this.removeListPrefix(line, action);
|
|
359
|
+
newEnd -= (line.length - newLine.length);
|
|
360
|
+
newText += newLine;
|
|
361
|
+
if (i < lines.length - 1) {
|
|
362
|
+
newText += "\n";
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
newText += endText;
|
|
366
|
+
|
|
367
|
+
return { newText, newStart, newEnd };
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
static removeListPrefix(text, action) {
|
|
371
|
+
switch (action) {
|
|
372
|
+
case "quote":
|
|
373
|
+
return text.slice(2); // Remove 2 characters: "> "
|
|
374
|
+
case "bulletedList":
|
|
375
|
+
return text.slice(2); // Remove 2 characters: "* "
|
|
376
|
+
case "numberedList": {
|
|
377
|
+
const firstSpace = text.indexOf(". "); // Remove characters: "5. " or "10. "
|
|
378
|
+
return text.slice(firstSpace + 2);
|
|
379
|
+
}
|
|
380
|
+
default:
|
|
381
|
+
}
|
|
382
|
+
return "";
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
static addMultiLineMarkdown(text, inStart, inEnd, action) {
|
|
386
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
387
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
388
|
+
|
|
389
|
+
const startText = text.slice(0, start);
|
|
390
|
+
const selectedText = text.slice(start, end);
|
|
391
|
+
const endText = text.slice(end);
|
|
392
|
+
|
|
393
|
+
let newStart = start;
|
|
394
|
+
let newEnd = end;
|
|
395
|
+
let newText = startText;
|
|
396
|
+
|
|
397
|
+
if (selectedText === "") {
|
|
398
|
+
const itemText = this.getListPrefix(action, 1);
|
|
399
|
+
newText = startText + itemText + endText;
|
|
400
|
+
newStart = start + itemText.length;
|
|
401
|
+
newEnd = newStart;
|
|
402
|
+
|
|
403
|
+
} else {
|
|
404
|
+
const lines = selectedText.split("\n");
|
|
405
|
+
lines.forEach((line, i) => {
|
|
406
|
+
const newLine = this.getListPrefix(action, i + 1, line);
|
|
407
|
+
newEnd += (newLine.length - line.length);
|
|
408
|
+
newText += newLine;
|
|
409
|
+
|
|
410
|
+
if (i === lines.length - 1) {
|
|
411
|
+
if (text[end] !== "\n" || text[end + 1] !== "\n") {
|
|
412
|
+
newText += "\n";
|
|
413
|
+
}
|
|
414
|
+
} else {
|
|
415
|
+
newText += "\n";
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
newText += endText;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
return { newText, newStart, newEnd };
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
static getListPrefix(action, i, suffixText = "") {
|
|
425
|
+
switch (action) {
|
|
426
|
+
case "quote":
|
|
427
|
+
return "> " + suffixText;
|
|
428
|
+
case "bulletedList":
|
|
429
|
+
return "* " + suffixText;
|
|
430
|
+
case "numberedList":
|
|
431
|
+
return i + ". " + suffixText;
|
|
432
|
+
default:
|
|
433
|
+
}
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
static findPrecedingNewLine(text, start) {
|
|
438
|
+
let preStart = start;
|
|
439
|
+
while (preStart > 0 && text[preStart - 1] !== "\n") {
|
|
440
|
+
preStart--;
|
|
441
|
+
}
|
|
442
|
+
return preStart;
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
static findSuceedingNewLine(text, end) {
|
|
446
|
+
let sucEnd = end;
|
|
447
|
+
while (sucEnd < text.length && text[sucEnd] !== "\n") {
|
|
448
|
+
sucEnd++;
|
|
449
|
+
}
|
|
450
|
+
return sucEnd;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
static processReturnCommand(text, inStart, inEnd, originalStart, originalEnd) {
|
|
454
|
+
const start = this.findPrecedingNewLine(text, inStart);
|
|
455
|
+
const end = this.findSuceedingNewLine(text, inEnd);
|
|
456
|
+
|
|
457
|
+
const startText = text.slice(0, start);
|
|
458
|
+
const selectedText = text.slice(start, end);
|
|
459
|
+
const endText = text.slice(end);
|
|
460
|
+
|
|
461
|
+
// If cursor is at the beginning of the line we just let it insert the
|
|
462
|
+
// newline by default, if not we insert a new multi-line element.
|
|
463
|
+
if (!this.isCursorAtBeginningOfLine(start, originalStart, originalEnd)) {
|
|
464
|
+
if (this.isMultiLineItem(selectedText, "quote")) {
|
|
465
|
+
return this.insertMultiLineItem(">", startText, selectedText, endText, end);
|
|
466
|
+
|
|
467
|
+
} else if (this.isMultiLineItem(selectedText, "bulletedList")) {
|
|
468
|
+
return this.insertMultiLineItem("*", startText, selectedText, endText, end);
|
|
469
|
+
|
|
470
|
+
} else if (this.isMultiLineItem(selectedText, "numberedList")) {
|
|
471
|
+
const number = this.getPrefixNumber(selectedText) + 1; // Increment for next multi-line item
|
|
472
|
+
const newEndText = this.renumberEndText(endText, number);
|
|
473
|
+
return this.insertMultiLineItem(number + ".", startText, selectedText, newEndText, end);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return null; // Return null is there is nothing to do so key processing is ignored.
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
static isCursorAtBeginningOfLine(start, originalStart, originalEnd) {
|
|
481
|
+
return (originalStart === originalEnd && originalStart === start);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
static insertMultiLineItem(char, startText, selectedText, endText, end) {
|
|
485
|
+
const newText = startText + selectedText + "\n" + char + " " + endText;
|
|
486
|
+
const newStart = end + 2 + char.length; // Add 2 for newline and space plus length of the char.
|
|
487
|
+
const newEnd = newStart;
|
|
488
|
+
return { newText, newStart, newEnd };
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
static renumberEndText(text, startIndex) {
|
|
492
|
+
const lines = text.split("\n");
|
|
493
|
+
let newText = "";
|
|
494
|
+
let finished = false;
|
|
495
|
+
|
|
496
|
+
lines.forEach((line, i) => {
|
|
497
|
+
if (this.isMultiLineItem(line, "numberedList") && finished === false) {
|
|
498
|
+
newText += this.renumberLine(line, startIndex + i);
|
|
499
|
+
} else {
|
|
500
|
+
newText += line;
|
|
501
|
+
if (i > 0) {
|
|
502
|
+
finished = true; // As soon as we hit a line without a number we finished renumbering
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
newText += "\n";
|
|
507
|
+
});
|
|
508
|
+
return newText;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
static renumberLine(text, number) {
|
|
512
|
+
const firstSpace = text.indexOf(". ");
|
|
513
|
+
return number + ". " + text.slice(firstSpace + 2);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
@@ -27,11 +27,6 @@ export default class SvgCanvasNodes {
|
|
|
27
27
|
return "d3-node-image";
|
|
28
28
|
}
|
|
29
29
|
|
|
30
|
-
getNodeLabelForeignClass(node) {
|
|
31
|
-
const outlineClass = node.layout.labelOutline ? " d3-node-label-outline" : "";
|
|
32
|
-
return "d3-foreign-object" + outlineClass;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
30
|
getNodeLabelClass(node) {
|
|
36
31
|
if (CanvasUtils.isExpandedSupernode(node)) {
|
|
37
32
|
return "d3-node-label d3-label-single-line " + this.getMessageLabelClass(node.messages);
|