@zzish/math-rich-input 0.1.26 → 0.1.28
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/dist/index.js +125 -78
- package/package.json +1 -1
- package/src/MathRichInput.jsx +82 -57
- package/src/mathRichInputHelper.js +56 -32
package/dist/index.js
CHANGED
|
@@ -21007,7 +21007,7 @@ function addTextForNode(node, arrayOfText) {
|
|
|
21007
21007
|
arrayOfText.push(useHtmlMath ? RAW_TEXT_MATH_END_TAG_HTML_MATH : RAW_TEXT_MATH_END_TAG_TEX);
|
|
21008
21008
|
if (mark) arrayOfText.push(MARK$1);
|
|
21009
21009
|
} else {
|
|
21010
|
-
console.error("
|
|
21010
|
+
console.error("Can't render node in editable div: Unknown node type");
|
|
21011
21011
|
console.log(node);
|
|
21012
21012
|
console.log("Node.type:" + node.type);
|
|
21013
21013
|
console.log("Node.tagName:" + node.tagName);
|
|
@@ -21032,8 +21032,11 @@ function elementToMarkedRawText(element) {
|
|
|
21032
21032
|
var nodeToMark = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
21033
21033
|
var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
|
|
21034
21034
|
var useHtmlMath = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
|
|
21035
|
-
|
|
21035
|
+
console.log("elementToMarkedRawText");
|
|
21036
|
+
console.log(element.innerHTML);
|
|
21037
|
+
if (element.innerHTML === "<p><br></p>") throw new Error("We are here"); // console.log("Node to mark:")
|
|
21036
21038
|
// console.log(nodeToMark)
|
|
21039
|
+
|
|
21037
21040
|
var nodes = element.childNodes; // console.log(nodes)
|
|
21038
21041
|
|
|
21039
21042
|
var result = [];
|
|
@@ -21348,6 +21351,7 @@ function findNodeAndOffsetForGlobalOffset(node, globalOffset) {
|
|
|
21348
21351
|
|
|
21349
21352
|
if (isTextNode(node)) {
|
|
21350
21353
|
result.node = node;
|
|
21354
|
+
result.lastTextNode = node;
|
|
21351
21355
|
result.offset += node.nodeValue.length;
|
|
21352
21356
|
if (nodeStartsWithSmallSpace(node)) result.offset -= 1; // console.log("result.offset now: "+result.offset)
|
|
21353
21357
|
|
|
@@ -21387,8 +21391,37 @@ function findFirstTextNode(node) {
|
|
|
21387
21391
|
}
|
|
21388
21392
|
|
|
21389
21393
|
return null;
|
|
21394
|
+
}
|
|
21395
|
+
|
|
21396
|
+
function findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, globalOffset) {
|
|
21397
|
+
var result = {
|
|
21398
|
+
offset: 0
|
|
21399
|
+
};
|
|
21400
|
+
findNodeAndOffsetForGlobalOffset(editableDiv, globalOffset, result);
|
|
21401
|
+
console.log(result);
|
|
21402
|
+
|
|
21403
|
+
if (result.node === null) {
|
|
21404
|
+
if (globalOffset > 0 && result.lastTextNode !== null) {
|
|
21405
|
+
result.node = result.lastTextNode;
|
|
21406
|
+
result.offset = result.lastTextNode.nodeValue.length;
|
|
21407
|
+
} else {
|
|
21408
|
+
console.warn("Unable to find node and offset for global offset: " + globalOffset);
|
|
21409
|
+
console.log(editableDiv.innerHTML);
|
|
21410
|
+
console.log(result);
|
|
21411
|
+
result.node = findFirstTextNode(editableDiv);
|
|
21412
|
+
result.offset = 0;
|
|
21413
|
+
}
|
|
21414
|
+
} // if (result.offset === 0 &&
|
|
21415
|
+
// result.node.nodeValue.length > 0 &&
|
|
21416
|
+
// nodeStartsWithSmallSpace(result.node)) {
|
|
21417
|
+
// result.offset = 1
|
|
21418
|
+
// }
|
|
21419
|
+
|
|
21420
|
+
|
|
21421
|
+
return result;
|
|
21390
21422
|
} // https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
|
|
21391
21423
|
|
|
21424
|
+
|
|
21392
21425
|
function getRangeParams(editableDiv) {
|
|
21393
21426
|
// console.log ("getRangeParams")
|
|
21394
21427
|
// console.log("Inner html: "+editableDiv.innerHTML)
|
|
@@ -21469,36 +21502,20 @@ function setRangeParamsFromGlobalOffsets(editableDiv, params) {
|
|
|
21469
21502
|
|
|
21470
21503
|
try {
|
|
21471
21504
|
if (params === null || params === undefined) throw new Error("Can't set range params: params === " + params);
|
|
21472
|
-
var startResult =
|
|
21473
|
-
|
|
21474
|
-
|
|
21475
|
-
|
|
21476
|
-
|
|
21477
|
-
|
|
21478
|
-
|
|
21479
|
-
|
|
21480
|
-
|
|
21481
|
-
|
|
21482
|
-
|
|
21483
|
-
|
|
21484
|
-
if (!startResult.node || !endResult.node || !startResult.offset || !endResult.offset) {
|
|
21485
|
-
console.log("Can't set range with start and end results");
|
|
21486
|
-
console.log(startResult);
|
|
21487
|
-
console.log(endResult);
|
|
21488
|
-
throw new Error("Could not extract valid nodes and offsets from params");
|
|
21489
|
-
}
|
|
21490
|
-
|
|
21491
|
-
if (startResult.offset === 0 && startResult.node.nodeValue.length > 0 && nodeStartsWithSmallSpace(startResult.node)) {
|
|
21492
|
-
startResult.offset = 1;
|
|
21505
|
+
var startResult = findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, params.startGlobalOffset);
|
|
21506
|
+
var endResult = findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, params.endGlobalOffset);
|
|
21507
|
+
|
|
21508
|
+
if (startResult.node !== null) {
|
|
21509
|
+
console.log("Setting range to start in node:");
|
|
21510
|
+
console.log(" node type: " + startResult.node.nodeType);
|
|
21511
|
+
console.log(" tag name: " + startResult.node.tagName);
|
|
21512
|
+
console.log(" node value: " + startResult.node.nodeValue);
|
|
21513
|
+
console.log(" offset:" + startResult.offset);
|
|
21514
|
+
} else {
|
|
21515
|
+
console.warn("Can't set range, null start node returned");
|
|
21516
|
+
return;
|
|
21493
21517
|
}
|
|
21494
21518
|
|
|
21495
|
-
if (endResult.offset === 0 && endResult.node.nodeValue.length > 0 && nodeStartsWithSmallSpace(endResult.node)) {
|
|
21496
|
-
endResult.offset = 1;
|
|
21497
|
-
} // console.log("Setting range to:")
|
|
21498
|
-
// console.log(startResult.node.nodeType+":"+startResult.node.tagName+":"+
|
|
21499
|
-
// startResult.node.nodeValue+":"+startResult.offset)
|
|
21500
|
-
|
|
21501
|
-
|
|
21502
21519
|
new_range = document.createRange();
|
|
21503
21520
|
new_range.setStart(startResult.node, startResult.offset);
|
|
21504
21521
|
new_range.setEnd(endResult.node, endResult.offset);
|
|
@@ -21522,12 +21539,14 @@ function setRangeParams(editableDiv, params) {
|
|
|
21522
21539
|
if (params === null || params === undefined) {
|
|
21523
21540
|
console.error("Can't set range params: params === " + params);
|
|
21524
21541
|
return;
|
|
21525
|
-
}
|
|
21542
|
+
} // New way of doing things
|
|
21543
|
+
|
|
21526
21544
|
|
|
21527
|
-
if (params.startGlobalOffset) {
|
|
21545
|
+
if (params.startGlobalOffset !== null && params.startGlobalOffset !== undefined) {
|
|
21528
21546
|
setRangeParamsFromGlobalOffsets(editableDiv, params);
|
|
21529
21547
|
return;
|
|
21530
|
-
}
|
|
21548
|
+
} // Otherwise use the old way of doing things
|
|
21549
|
+
|
|
21531
21550
|
|
|
21532
21551
|
if (params.startNodeIndex === null || params.startNodeIndex === undefined) {
|
|
21533
21552
|
console.error("Can't set range params: params.startNodeIndex === " + params.startNodeIndex);
|
|
@@ -22068,17 +22087,19 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
22068
22087
|
}
|
|
22069
22088
|
|
|
22070
22089
|
if (deleteToEmpty) {
|
|
22090
|
+
console.log("deleteToEmpty");
|
|
22071
22091
|
var _new_rangeParams = {
|
|
22072
22092
|
startNodeIndex: 0,
|
|
22073
|
-
startOffset:
|
|
22093
|
+
startOffset: 1,
|
|
22074
22094
|
endNodeIndex: 0,
|
|
22075
|
-
endOffset:
|
|
22095
|
+
endOffset: 1,
|
|
22076
22096
|
startGlobalOffset: 0,
|
|
22077
22097
|
endGlobalOffset: 0
|
|
22078
22098
|
};
|
|
22079
22099
|
|
|
22080
22100
|
_this2.applyChangesToComponent("", _this2.getMimeType(false, false), _new_rangeParams, _this2.props.useExpertMode, _this2.props.selectedTab);
|
|
22081
22101
|
|
|
22102
|
+
e.preventDefault();
|
|
22082
22103
|
return;
|
|
22083
22104
|
} // Treat backspace normally in the following situations
|
|
22084
22105
|
|
|
@@ -22164,11 +22185,14 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
22164
22185
|
|
|
22165
22186
|
rangeParams.startNodeIndex;
|
|
22166
22187
|
rangeParams.startOffset;
|
|
22188
|
+
console.log("handleKeyDownArrowLeft");
|
|
22189
|
+
console.log(rangeParams);
|
|
22167
22190
|
var new_globalOffset = rangeParams.startGlobalOffset - 1;
|
|
22168
22191
|
var new_rangeParams = {
|
|
22169
22192
|
startGlobalOffset: new_globalOffset,
|
|
22170
22193
|
endGlobalOffset: new_globalOffset
|
|
22171
22194
|
};
|
|
22195
|
+
console.log(new_rangeParams);
|
|
22172
22196
|
e.preventDefault();
|
|
22173
22197
|
|
|
22174
22198
|
_this2._setRangeParams(new_rangeParams);
|
|
@@ -22540,8 +22564,11 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
22540
22564
|
|
|
22541
22565
|
if (_this2.handleKeyDownAccentHelper(e)) return; // Check if inserting character in element that starts with small space
|
|
22542
22566
|
|
|
22543
|
-
if (e.key.length === 1 &&
|
|
22544
|
-
|
|
22567
|
+
if (e.key.length === 1 && // ie, it's not something like "arrowLeft"
|
|
22568
|
+
params.startOffset === 0 && _this2.nodeStartsWithSmallSpace(startNode)) {
|
|
22569
|
+
console.log("Handling character input at start of text node with small space");
|
|
22570
|
+
|
|
22571
|
+
_this2.insertAfterSmallSpace(e.key, params);
|
|
22545
22572
|
|
|
22546
22573
|
e.preventDefault();
|
|
22547
22574
|
return;
|
|
@@ -22639,8 +22666,9 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
22639
22666
|
|
|
22640
22667
|
_defineProperty(_assertThisInitialized(_this2), "handleInput", function (event) {
|
|
22641
22668
|
try {
|
|
22642
|
-
|
|
22669
|
+
console.log("handleInput");
|
|
22643
22670
|
var raw_text = elementToMarkedRawText(_this2.editableDiv, null, 0, _this2.enableHtml());
|
|
22671
|
+
console.log("handleInput 2");
|
|
22644
22672
|
|
|
22645
22673
|
var params = _this2._getRangeParams();
|
|
22646
22674
|
|
|
@@ -22944,8 +22972,10 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
22944
22972
|
|
|
22945
22973
|
var end_pos = _this2.markedRawText.indexOf(MARK, start_pos + MARK.length);
|
|
22946
22974
|
|
|
22947
|
-
var oldRangeParams = _this2.getOldRangeParams();
|
|
22975
|
+
var oldRangeParams = _this2.getOldRangeParams();
|
|
22948
22976
|
|
|
22977
|
+
console.log("Old range params");
|
|
22978
|
+
console.log(oldRangeParams); // Handle case of empty string returned
|
|
22949
22979
|
|
|
22950
22980
|
if (latex === "") {
|
|
22951
22981
|
// console.log("Empty latex returned from equation editor")
|
|
@@ -23332,15 +23362,14 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
23332
23362
|
|
|
23333
23363
|
var offset = rangeParams.endOffset;
|
|
23334
23364
|
var raw_text = elementToMarkedRawText(_this2.editableDiv, node, offset, _this2.enableHtml());
|
|
23365
|
+
console.log("Raw text before line insert");
|
|
23366
|
+
console.log(raw_text);
|
|
23367
|
+
console.log("Range params before line insert");
|
|
23368
|
+
console.log(rangeParams);
|
|
23335
23369
|
var new_raw_text = null;
|
|
23336
23370
|
|
|
23337
23371
|
var new_rangeParams = _objectSpread2({}, rangeParams);
|
|
23338
23372
|
|
|
23339
|
-
if (new_rangeParams.startGlobalOffset) {
|
|
23340
|
-
new_rangeParams.startGlobalOffset++;
|
|
23341
|
-
new_rangeParams.endGlobalOffset++;
|
|
23342
|
-
}
|
|
23343
|
-
|
|
23344
23373
|
if (_this2.enableHtml()) {
|
|
23345
23374
|
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, "</p><p>"));
|
|
23346
23375
|
if (new_raw_text.substring(0, 3).toLowerCase() !== "<p>") new_raw_text = "<p>" + new_raw_text + "</p>";
|
|
@@ -23348,6 +23377,11 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
23348
23377
|
new_rangeParams.startOffset = 0;
|
|
23349
23378
|
new_rangeParams.endNodeIndex = rangeParams.endNodeIndex + 1;
|
|
23350
23379
|
new_rangeParams.endOffset = 0;
|
|
23380
|
+
|
|
23381
|
+
if (new_rangeParams.startGlobalOffset) {
|
|
23382
|
+
new_rangeParams.startGlobalOffset++;
|
|
23383
|
+
new_rangeParams.endGlobalOffset++;
|
|
23384
|
+
}
|
|
23351
23385
|
} else {
|
|
23352
23386
|
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, "\n"));
|
|
23353
23387
|
new_rangeParams.startOffset++;
|
|
@@ -23355,30 +23389,10 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
23355
23389
|
}
|
|
23356
23390
|
|
|
23357
23391
|
new_raw_text = removeEncodingIfPlainText(new_raw_text, _this2.props.mimeType, _this2.enableHtml());
|
|
23358
|
-
|
|
23359
|
-
|
|
23360
|
-
|
|
23361
|
-
console.
|
|
23362
|
-
}
|
|
23363
|
-
});
|
|
23364
|
-
|
|
23365
|
-
_defineProperty(_assertThisInitialized(_this2), "replaceNextLetter", function (new_char) {
|
|
23366
|
-
try {
|
|
23367
|
-
var rangeParams = _this2._getRangeParams();
|
|
23368
|
-
|
|
23369
|
-
var node = _this2._findNodeWithIndex(rangeParams.endNodeIndex);
|
|
23370
|
-
|
|
23371
|
-
var offset = rangeParams.endOffset + 1; // next letter
|
|
23372
|
-
|
|
23373
|
-
var raw_text = elementToMarkedRawText(_this2.editableDiv, node, offset, _this2.enableHtml());
|
|
23374
|
-
var new_raw_text = null;
|
|
23375
|
-
|
|
23376
|
-
var new_rangeParams = _objectSpread2({}, rangeParams);
|
|
23377
|
-
|
|
23378
|
-
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, new_char));
|
|
23379
|
-
if (rangeParams.startNodeIndex === rangeParams.endNodeIndex && rangeParams.startOffset === rangeParams.endOffset) new_rangeParams.startOffset = new_rangeParams.startOffset + new_char.length + 1;
|
|
23380
|
-
new_rangeParams.endOffset = new_rangeParams.endOffset + new_char.length + 1;
|
|
23381
|
-
new_raw_text = removeEncodingIfPlainText(new_raw_text, _this2.props.mimeType, _this2.enableHtml());
|
|
23392
|
+
console.log("New raw text after line insert");
|
|
23393
|
+
console.log(new_raw_text);
|
|
23394
|
+
console.log("New range params after line insert");
|
|
23395
|
+
console.log(new_rangeParams);
|
|
23382
23396
|
|
|
23383
23397
|
_this2.applyChangesToComponent(new_raw_text, _this2.props.mimeType, new_rangeParams, _this2.props.useExpertMode, _this2.props.selectedTab);
|
|
23384
23398
|
} catch (error) {
|
|
@@ -23390,22 +23404,29 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
23390
23404
|
try {
|
|
23391
23405
|
var rangeParams = _this2._getRangeParams();
|
|
23392
23406
|
|
|
23393
|
-
var node = _this2._findNodeWithIndex(rangeParams.
|
|
23407
|
+
var node = _this2._findNodeWithIndex(rangeParams.startNodeIndex);
|
|
23394
23408
|
|
|
23395
|
-
var offset = rangeParams.
|
|
23409
|
+
var offset = rangeParams.startOffset;
|
|
23396
23410
|
var raw_text = elementToMarkedRawText(_this2.editableDiv, node, offset, _this2.enableHtml());
|
|
23397
23411
|
var new_raw_text = null;
|
|
23398
|
-
|
|
23399
|
-
var new_rangeParams = _objectSpread2({}, rangeParams);
|
|
23400
|
-
|
|
23401
|
-
new_rangeParams.startGlobalOffset++;
|
|
23402
|
-
new_rangeParams.endGlobalOffset++;
|
|
23412
|
+
var new_rangeParams = null;
|
|
23403
23413
|
|
|
23404
23414
|
if (old_char === null) {
|
|
23415
|
+
// insert new char
|
|
23405
23416
|
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, new_char));
|
|
23406
|
-
|
|
23407
|
-
|
|
23408
|
-
|
|
23417
|
+
new_rangeParams = {
|
|
23418
|
+
startNodeIndex: rangeParams.startNodeIndex,
|
|
23419
|
+
startOffset: rangeParams.startOffset + new_char.length,
|
|
23420
|
+
endNodeIndex: rangeParams.startNodeIndex,
|
|
23421
|
+
endOffset: rangeParams.startOffset + new_char.length,
|
|
23422
|
+
startGlobalOffset: rangeParams.startGlobalOffset + new_char.length,
|
|
23423
|
+
endGlobalOffset: rangeParams.startGlobalOffset + new_char.length
|
|
23424
|
+
};
|
|
23425
|
+
} else {
|
|
23426
|
+
// replace old char
|
|
23427
|
+
new_raw_text = removeMarks(replaceCharacterBeforeMarks(raw_text, new_char));
|
|
23428
|
+
new_rangeParams = _objectSpread2({}, rangeParams);
|
|
23429
|
+
}
|
|
23409
23430
|
|
|
23410
23431
|
new_raw_text = removeEncodingIfPlainText(new_raw_text, _this2.props.mimeType, _this2.enableHtml());
|
|
23411
23432
|
|
|
@@ -23645,6 +23666,32 @@ var MathRichInput = /*#__PURE__*/function (_React$Component) {
|
|
|
23645
23666
|
console.error(error);
|
|
23646
23667
|
}
|
|
23647
23668
|
}
|
|
23669
|
+
}, {
|
|
23670
|
+
key: "insertAfterSmallSpace",
|
|
23671
|
+
value: function insertAfterSmallSpace(new_char, rangeParams) {
|
|
23672
|
+
try {
|
|
23673
|
+
if (rangeParams === null || rangeParams === undefined) rangeParams = this._getRangeParams();
|
|
23674
|
+
if (rangeParams.startOffset !== 0) console.warn("Unexpected startOffset " + rangeParams.startOffset + " in insertAfterSmallSpace");
|
|
23675
|
+
|
|
23676
|
+
var node = this._findNodeWithIndex(rangeParams.startNodeIndex);
|
|
23677
|
+
|
|
23678
|
+
var raw_text = elementToMarkedRawText(this.editableDiv, node, 1, // after small space
|
|
23679
|
+
this.enableHtml());
|
|
23680
|
+
var new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, new_char));
|
|
23681
|
+
var new_rangeParams = {
|
|
23682
|
+
startNodeIndex: rangeParams.startNodeIndex,
|
|
23683
|
+
startNodeOffset: 1 + new_char.length,
|
|
23684
|
+
endNodeIndex: rangeParams.startNodeIndex,
|
|
23685
|
+
endNodeOffset: 1 + new_char.length,
|
|
23686
|
+
startGlobalOffset: rangeParams.startGlobalOffset + new_char.length,
|
|
23687
|
+
endGlobalOffset: rangeParams.endGlobalOffset + new_char.length
|
|
23688
|
+
};
|
|
23689
|
+
new_raw_text = removeEncodingIfPlainText(new_raw_text, this.props.mimeType, this.enableHtml());
|
|
23690
|
+
this.applyChangesToComponent(new_raw_text, this.props.mimeType, new_rangeParams, this.props.useExpertMode, this.props.selectedTab);
|
|
23691
|
+
} catch (error) {
|
|
23692
|
+
console.error(error);
|
|
23693
|
+
}
|
|
23694
|
+
}
|
|
23648
23695
|
}, {
|
|
23649
23696
|
key: "render",
|
|
23650
23697
|
value: function render() {
|
package/package.json
CHANGED
package/src/MathRichInput.jsx
CHANGED
|
@@ -461,11 +461,12 @@ export default class MathRichInput extends React.Component {
|
|
|
461
461
|
}
|
|
462
462
|
|
|
463
463
|
if (deleteToEmpty) {
|
|
464
|
+
console.log("deleteToEmpty")
|
|
464
465
|
let new_rangeParams = {
|
|
465
466
|
startNodeIndex: 0,
|
|
466
|
-
startOffset:
|
|
467
|
+
startOffset: 1,
|
|
467
468
|
endNodeIndex: 0,
|
|
468
|
-
endOffset:
|
|
469
|
+
endOffset: 1,
|
|
469
470
|
startGlobalOffset: 0,
|
|
470
471
|
endGlobalOffset: 0,
|
|
471
472
|
};
|
|
@@ -476,6 +477,7 @@ export default class MathRichInput extends React.Component {
|
|
|
476
477
|
this.props.useExpertMode,
|
|
477
478
|
this.props.selectedTab
|
|
478
479
|
);
|
|
480
|
+
e.preventDefault()
|
|
479
481
|
return;
|
|
480
482
|
}
|
|
481
483
|
|
|
@@ -588,11 +590,15 @@ export default class MathRichInput extends React.Component {
|
|
|
588
590
|
let index = rangeParams.startNodeIndex;
|
|
589
591
|
let offset = rangeParams.startOffset;
|
|
590
592
|
|
|
593
|
+
console.log("handleKeyDownArrowLeft")
|
|
594
|
+
console.log(rangeParams)
|
|
591
595
|
let new_globalOffset = rangeParams.startGlobalOffset - 1;
|
|
596
|
+
|
|
592
597
|
let new_rangeParams = {
|
|
593
598
|
startGlobalOffset: new_globalOffset,
|
|
594
599
|
endGlobalOffset: new_globalOffset,
|
|
595
600
|
};
|
|
601
|
+
console.log(new_rangeParams)
|
|
596
602
|
e.preventDefault();
|
|
597
603
|
this._setRangeParams(new_rangeParams);
|
|
598
604
|
return;
|
|
@@ -1193,15 +1199,15 @@ export default class MathRichInput extends React.Component {
|
|
|
1193
1199
|
}
|
|
1194
1200
|
}
|
|
1195
1201
|
|
|
1196
|
-
if (this.handleKeyDownAccentHelper(e))
|
|
1202
|
+
if (this.handleKeyDownAccentHelper(e))
|
|
1203
|
+
return;
|
|
1197
1204
|
|
|
1198
1205
|
// Check if inserting character in element that starts with small space
|
|
1199
|
-
if (
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
this.replaceNextLetter(e.key);
|
|
1206
|
+
if (e.key.length === 1 && // ie, it's not something like "arrowLeft"
|
|
1207
|
+
params.startOffset === 0 &&
|
|
1208
|
+
this.nodeStartsWithSmallSpace(startNode)) {
|
|
1209
|
+
console.log("Handling character input at start of text node with small space")
|
|
1210
|
+
this.insertAfterSmallSpace(e.key, params);
|
|
1205
1211
|
e.preventDefault();
|
|
1206
1212
|
return;
|
|
1207
1213
|
}
|
|
@@ -1305,13 +1311,14 @@ export default class MathRichInput extends React.Component {
|
|
|
1305
1311
|
|
|
1306
1312
|
handleInput = (event) => {
|
|
1307
1313
|
try {
|
|
1308
|
-
|
|
1314
|
+
console.log("handleInput")
|
|
1309
1315
|
let raw_text = elementToMarkedRawText(
|
|
1310
1316
|
this.editableDiv,
|
|
1311
1317
|
null,
|
|
1312
1318
|
0,
|
|
1313
1319
|
this.enableHtml()
|
|
1314
1320
|
);
|
|
1321
|
+
console.log("handleInput 2")
|
|
1315
1322
|
const params = this._getRangeParams();
|
|
1316
1323
|
if (params === null || params === undefined)
|
|
1317
1324
|
console.error("Could not get range params from input field");
|
|
@@ -1658,6 +1665,8 @@ export default class MathRichInput extends React.Component {
|
|
|
1658
1665
|
let start_pos = this.markedRawText.indexOf(MARK);
|
|
1659
1666
|
let end_pos = this.markedRawText.indexOf(MARK, start_pos + MARK.length);
|
|
1660
1667
|
let oldRangeParams = this.getOldRangeParams();
|
|
1668
|
+
console.log("Old range params")
|
|
1669
|
+
console.log(oldRangeParams)
|
|
1661
1670
|
|
|
1662
1671
|
// Handle case of empty string returned
|
|
1663
1672
|
if (latex === "") {
|
|
@@ -1910,6 +1919,7 @@ export default class MathRichInput extends React.Component {
|
|
|
1910
1919
|
console.error(error);
|
|
1911
1920
|
}
|
|
1912
1921
|
};
|
|
1922
|
+
|
|
1913
1923
|
// https://stackoverflow.com/questions/6690752/insert-html-at-caret-in-a-contenteditable-div
|
|
1914
1924
|
pasteHtmlAtCaret = (html, selectPastedContent) => {
|
|
1915
1925
|
var sel, range;
|
|
@@ -1957,6 +1967,7 @@ export default class MathRichInput extends React.Component {
|
|
|
1957
1967
|
}
|
|
1958
1968
|
}
|
|
1959
1969
|
};
|
|
1970
|
+
|
|
1960
1971
|
insertHtml = (new_html) => {
|
|
1961
1972
|
try {
|
|
1962
1973
|
// console.log("New html: "+new_html)
|
|
@@ -2111,14 +2122,15 @@ export default class MathRichInput extends React.Component {
|
|
|
2111
2122
|
offset,
|
|
2112
2123
|
this.enableHtml()
|
|
2113
2124
|
);
|
|
2125
|
+
|
|
2126
|
+
console.log("Raw text before line insert")
|
|
2127
|
+
console.log(raw_text)
|
|
2128
|
+
console.log("Range params before line insert")
|
|
2129
|
+
console.log(rangeParams)
|
|
2130
|
+
|
|
2114
2131
|
let new_raw_text = null;
|
|
2115
2132
|
let new_rangeParams = { ...rangeParams };
|
|
2116
2133
|
|
|
2117
|
-
if (new_rangeParams.startGlobalOffset) {
|
|
2118
|
-
new_rangeParams.startGlobalOffset++;
|
|
2119
|
-
new_rangeParams.endGlobalOffset++;
|
|
2120
|
-
}
|
|
2121
|
-
|
|
2122
2134
|
if (this.enableHtml()) {
|
|
2123
2135
|
new_raw_text = removeMarks(
|
|
2124
2136
|
insertCharacterBeforeMarks(raw_text, "</p><p>")
|
|
@@ -2130,6 +2142,11 @@ export default class MathRichInput extends React.Component {
|
|
|
2130
2142
|
new_rangeParams.startOffset = 0;
|
|
2131
2143
|
new_rangeParams.endNodeIndex = rangeParams.endNodeIndex + 1;
|
|
2132
2144
|
new_rangeParams.endOffset = 0;
|
|
2145
|
+
if (new_rangeParams.startGlobalOffset) {
|
|
2146
|
+
new_rangeParams.startGlobalOffset++;
|
|
2147
|
+
new_rangeParams.endGlobalOffset++;
|
|
2148
|
+
}
|
|
2149
|
+
|
|
2133
2150
|
} else {
|
|
2134
2151
|
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, "\n"));
|
|
2135
2152
|
new_rangeParams.startOffset++;
|
|
@@ -2141,6 +2158,12 @@ export default class MathRichInput extends React.Component {
|
|
|
2141
2158
|
this.props.mimeType,
|
|
2142
2159
|
this.enableHtml()
|
|
2143
2160
|
);
|
|
2161
|
+
|
|
2162
|
+
console.log("New raw text after line insert")
|
|
2163
|
+
console.log(new_raw_text)
|
|
2164
|
+
console.log("New range params after line insert")
|
|
2165
|
+
console.log(new_rangeParams)
|
|
2166
|
+
|
|
2144
2167
|
|
|
2145
2168
|
this.applyChangesToComponent(
|
|
2146
2169
|
new_raw_text,
|
|
@@ -2154,37 +2177,40 @@ export default class MathRichInput extends React.Component {
|
|
|
2154
2177
|
}
|
|
2155
2178
|
};
|
|
2156
2179
|
|
|
2157
|
-
|
|
2180
|
+
insertAfterSmallSpace(new_char, rangeParams) {
|
|
2158
2181
|
try {
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
let offset = rangeParams.endOffset + 1; // next letter
|
|
2182
|
+
if (rangeParams === null || rangeParams === undefined)
|
|
2183
|
+
rangeParams = this._getRangeParams();
|
|
2162
2184
|
|
|
2185
|
+
if (rangeParams.startOffset !== 0)
|
|
2186
|
+
console.warn("Unexpected startOffset "+rangeParams.startOffset+" in insertAfterSmallSpace")
|
|
2187
|
+
|
|
2188
|
+
let node = this._findNodeWithIndex(rangeParams.startNodeIndex);
|
|
2163
2189
|
let raw_text = elementToMarkedRawText(
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
|
|
2167
|
-
|
|
2168
|
-
|
|
2169
|
-
|
|
2170
|
-
let
|
|
2171
|
-
|
|
2172
|
-
insertCharacterBeforeMarks(raw_text, new_char)
|
|
2173
|
-
);
|
|
2174
|
-
if (
|
|
2175
|
-
rangeParams.startNodeIndex === rangeParams.endNodeIndex &&
|
|
2176
|
-
rangeParams.startOffset === rangeParams.endOffset
|
|
2177
|
-
)
|
|
2178
|
-
new_rangeParams.startOffset =
|
|
2179
|
-
new_rangeParams.startOffset + new_char.length + 1;
|
|
2180
|
-
new_rangeParams.endOffset =
|
|
2181
|
-
new_rangeParams.endOffset + new_char.length + 1;
|
|
2190
|
+
this.editableDiv,
|
|
2191
|
+
node,
|
|
2192
|
+
1, // after small space
|
|
2193
|
+
this.enableHtml()
|
|
2194
|
+
);
|
|
2195
|
+
|
|
2196
|
+
let new_raw_text = removeMarks(
|
|
2197
|
+
insertCharacterBeforeMarks(raw_text, new_char))
|
|
2182
2198
|
|
|
2199
|
+
let new_rangeParams = {
|
|
2200
|
+
startNodeIndex:rangeParams.startNodeIndex,
|
|
2201
|
+
startNodeOffset:1+new_char.length,
|
|
2202
|
+
endNodeIndex:rangeParams.startNodeIndex,
|
|
2203
|
+
endNodeOffset:1+new_char.length,
|
|
2204
|
+
startGlobalOffset:rangeParams.startGlobalOffset+new_char.length,
|
|
2205
|
+
endGlobalOffset:rangeParams.endGlobalOffset+new_char.length,
|
|
2206
|
+
}
|
|
2207
|
+
|
|
2183
2208
|
new_raw_text = removeEncodingIfPlainText(
|
|
2184
2209
|
new_raw_text,
|
|
2185
2210
|
this.props.mimeType,
|
|
2186
2211
|
this.enableHtml()
|
|
2187
2212
|
);
|
|
2213
|
+
|
|
2188
2214
|
this.applyChangesToComponent(
|
|
2189
2215
|
new_raw_text,
|
|
2190
2216
|
this.props.mimeType,
|
|
@@ -2200,8 +2226,8 @@ export default class MathRichInput extends React.Component {
|
|
|
2200
2226
|
insertAccentLetter = (event, old_char, new_char) => {
|
|
2201
2227
|
try {
|
|
2202
2228
|
let rangeParams = this._getRangeParams();
|
|
2203
|
-
let node = this._findNodeWithIndex(rangeParams.
|
|
2204
|
-
let offset = rangeParams.
|
|
2229
|
+
let node = this._findNodeWithIndex(rangeParams.startNodeIndex);
|
|
2230
|
+
let offset = rangeParams.startOffset;
|
|
2205
2231
|
|
|
2206
2232
|
let raw_text = elementToMarkedRawText(
|
|
2207
2233
|
this.editableDiv,
|
|
@@ -2209,32 +2235,31 @@ export default class MathRichInput extends React.Component {
|
|
|
2209
2235
|
offset,
|
|
2210
2236
|
this.enableHtml()
|
|
2211
2237
|
);
|
|
2238
|
+
|
|
2212
2239
|
let new_raw_text = null;
|
|
2213
|
-
let new_rangeParams =
|
|
2214
|
-
new_rangeParams.startGlobalOffset++;
|
|
2215
|
-
new_rangeParams.endGlobalOffset++;
|
|
2240
|
+
let new_rangeParams = null;
|
|
2216
2241
|
|
|
2217
|
-
if (old_char === null) {
|
|
2218
|
-
new_raw_text = removeMarks(
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
rangeParams.startNodeIndex
|
|
2223
|
-
rangeParams.startOffset
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
);
|
|
2242
|
+
if (old_char === null) { // insert new char
|
|
2243
|
+
new_raw_text = removeMarks(insertCharacterBeforeMarks(raw_text, new_char));
|
|
2244
|
+
new_rangeParams = {
|
|
2245
|
+
startNodeIndex:rangeParams.startNodeIndex,
|
|
2246
|
+
startOffset:rangeParams.startOffset + new_char.length,
|
|
2247
|
+
endNodeIndex:rangeParams.startNodeIndex,
|
|
2248
|
+
endOffset:rangeParams.startOffset + new_char.length,
|
|
2249
|
+
startGlobalOffset:rangeParams.startGlobalOffset + new_char.length,
|
|
2250
|
+
endGlobalOffset:rangeParams.startGlobalOffset + new_char.length
|
|
2251
|
+
}
|
|
2252
|
+
} else { // replace old char
|
|
2253
|
+
new_raw_text = removeMarks(replaceCharacterBeforeMarks(raw_text, new_char));
|
|
2254
|
+
new_rangeParams = { ...rangeParams };
|
|
2255
|
+
}
|
|
2232
2256
|
|
|
2233
2257
|
new_raw_text = removeEncodingIfPlainText(
|
|
2234
2258
|
new_raw_text,
|
|
2235
2259
|
this.props.mimeType,
|
|
2236
2260
|
this.enableHtml()
|
|
2237
2261
|
);
|
|
2262
|
+
|
|
2238
2263
|
this.applyChangesToComponent(
|
|
2239
2264
|
new_raw_text,
|
|
2240
2265
|
this.props.mimeType,
|
|
@@ -360,7 +360,7 @@ function addTextForNode(node, arrayOfText, nodeToMark=null, offset=0, useHtmlMat
|
|
|
360
360
|
if (mark)
|
|
361
361
|
arrayOfText.push(MARK)
|
|
362
362
|
} else {
|
|
363
|
-
console.error("
|
|
363
|
+
console.error("Can't render node in editable div: Unknown node type")
|
|
364
364
|
console.log(node)
|
|
365
365
|
console.log("Node.type:"+node.type)
|
|
366
366
|
console.log("Node.tagName:"+node.tagName)
|
|
@@ -382,6 +382,10 @@ function addTextForNode(node, arrayOfText, nodeToMark=null, offset=0, useHtmlMat
|
|
|
382
382
|
// Marked nodes are useful if a node may need to be deleted and allows the node to be
|
|
383
383
|
// deleted by stripping it out of the raw text.
|
|
384
384
|
export function elementToMarkedRawText(element, nodeToMark=null, offset=0, useHtmlMath=true) {
|
|
385
|
+
console.log("elementToMarkedRawText")
|
|
386
|
+
console.log(element.innerHTML)
|
|
387
|
+
if (element.innerHTML === "<p><br></p>")
|
|
388
|
+
throw new Error ("We are here")
|
|
385
389
|
// console.log("Node to mark:")
|
|
386
390
|
// console.log(nodeToMark)
|
|
387
391
|
let nodes = element.childNodes
|
|
@@ -729,6 +733,7 @@ function findNodeAndOffsetForGlobalOffset(node, globalOffset, result=null) {
|
|
|
729
733
|
}
|
|
730
734
|
if (isTextNode(node)) {
|
|
731
735
|
result.node = node
|
|
736
|
+
result.lastTextNode = node
|
|
732
737
|
result.offset += node.nodeValue.length
|
|
733
738
|
if (nodeStartsWithSmallSpace(node))
|
|
734
739
|
result.offset -= 1
|
|
@@ -756,7 +761,7 @@ function findNodeAndOffsetForGlobalOffset(node, globalOffset, result=null) {
|
|
|
756
761
|
result.node = null
|
|
757
762
|
result.offset ++
|
|
758
763
|
}
|
|
759
|
-
|
|
764
|
+
return false;
|
|
760
765
|
}
|
|
761
766
|
|
|
762
767
|
export function findFirstTextNode(node) {
|
|
@@ -773,6 +778,33 @@ export function findFirstTextNode(node) {
|
|
|
773
778
|
return null
|
|
774
779
|
}
|
|
775
780
|
|
|
781
|
+
function findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, globalOffset) {
|
|
782
|
+
let result = {offset:0}
|
|
783
|
+
findNodeAndOffsetForGlobalOffset(editableDiv, globalOffset, result)
|
|
784
|
+
console.log(result)
|
|
785
|
+
|
|
786
|
+
if (result.node === null) {
|
|
787
|
+
if (globalOffset > 0 && result.lastTextNode !== null) {
|
|
788
|
+
result.node = result.lastTextNode
|
|
789
|
+
result.offset = result.lastTextNode.nodeValue.length
|
|
790
|
+
} else {
|
|
791
|
+
console.warn("Unable to find node and offset for global offset: "+globalOffset)
|
|
792
|
+
console.log(editableDiv.innerHTML)
|
|
793
|
+
console.log(result)
|
|
794
|
+
result.node = findFirstTextNode(editableDiv)
|
|
795
|
+
result.offset = 0
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// if (result.offset === 0 &&
|
|
800
|
+
// result.node.nodeValue.length > 0 &&
|
|
801
|
+
// nodeStartsWithSmallSpace(result.node)) {
|
|
802
|
+
// result.offset = 1
|
|
803
|
+
// }
|
|
804
|
+
|
|
805
|
+
return result
|
|
806
|
+
}
|
|
807
|
+
|
|
776
808
|
// https://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html
|
|
777
809
|
export function getRangeParams(editableDiv) {
|
|
778
810
|
// console.log ("getRangeParams")
|
|
@@ -851,34 +883,23 @@ function setRangeParamsFromGlobalOffsets(editableDiv, params) {
|
|
|
851
883
|
try {
|
|
852
884
|
if (params === null || params === undefined)
|
|
853
885
|
throw new Error("Can't set range params: params === "+params)
|
|
854
|
-
let startResult =
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
console.log("
|
|
865
|
-
console.log(startResult)
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
if (startResult.offset === 0 &&
|
|
870
|
-
startResult.node.nodeValue.length > 0 &&
|
|
871
|
-
nodeStartsWithSmallSpace(startResult.node)) {
|
|
872
|
-
startResult.offset = 1
|
|
873
|
-
}
|
|
874
|
-
if (endResult.offset === 0 &&
|
|
875
|
-
endResult.node.nodeValue.length > 0 &&
|
|
876
|
-
nodeStartsWithSmallSpace(endResult.node)) {
|
|
877
|
-
endResult.offset = 1
|
|
886
|
+
let startResult =
|
|
887
|
+
findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, params.startGlobalOffset)
|
|
888
|
+
|
|
889
|
+
let endResult =
|
|
890
|
+
findNodeAndOffsetForGlobalOffsetInEditableDiv(editableDiv, params.endGlobalOffset)
|
|
891
|
+
|
|
892
|
+
if (startResult.node !== null) {
|
|
893
|
+
console.log("Setting range to start in node:")
|
|
894
|
+
console.log(" node type: "+startResult.node.nodeType)
|
|
895
|
+
console.log(" tag name: "+startResult.node.tagName)
|
|
896
|
+
console.log(" node value: "+startResult.node.nodeValue)
|
|
897
|
+
console.log(" offset:"+startResult.offset)
|
|
898
|
+
} else {
|
|
899
|
+
console.warn("Can't set range, null start node returned")
|
|
900
|
+
return
|
|
878
901
|
}
|
|
879
|
-
|
|
880
|
-
// console.log(startResult.node.nodeType+":"+startResult.node.tagName+":"+
|
|
881
|
-
// startResult.node.nodeValue+":"+startResult.offset)
|
|
902
|
+
|
|
882
903
|
new_range = document.createRange();
|
|
883
904
|
new_range.setStart(startResult.node, startResult.offset);
|
|
884
905
|
new_range.setEnd(endResult.node, endResult.offset);
|
|
@@ -903,12 +924,15 @@ export function setRangeParams(editableDiv, params) {
|
|
|
903
924
|
console.error("Can't set range params: params === "+params)
|
|
904
925
|
return
|
|
905
926
|
}
|
|
906
|
-
|
|
907
|
-
|
|
927
|
+
|
|
928
|
+
// New way of doing things
|
|
929
|
+
if (params.startGlobalOffset !== null && params.startGlobalOffset !== undefined) {
|
|
908
930
|
setRangeParamsFromGlobalOffsets(editableDiv, params)
|
|
909
931
|
return
|
|
910
932
|
}
|
|
911
|
-
|
|
933
|
+
|
|
934
|
+
// Otherwise use the old way of doing things
|
|
935
|
+
|
|
912
936
|
if (params.startNodeIndex === null || params.startNodeIndex === undefined) {
|
|
913
937
|
console.error("Can't set range params: params.startNodeIndex === "+params.startNodeIndex)
|
|
914
938
|
return
|