@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 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("Cant render node in editable div: Unknown node type");
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
- // console.log("Node to mark:")
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
- offset: 0
21474
- };
21475
- findNodeAndOffsetForGlobalOffset(editableDiv, params.startGlobalOffset, startResult); // console.log(startResult.node.nodeType+":"+startResult.node.tagName+":"+
21476
- // startResult.node.nodeValue+":"+startResult.offset)
21477
-
21478
- var endResult = {
21479
- offset: 0
21480
- };
21481
- findNodeAndOffsetForGlobalOffset(editableDiv, params.endGlobalOffset, endResult); // console.log(endResult.node.nodeType+":"+endResult.node.tagName+":"+
21482
- // endResult.node.nodeValue+":"+endResult.offset)
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: 0,
22093
+ startOffset: 1,
22074
22094
  endNodeIndex: 0,
22075
- endOffset: 0,
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 && params.startOffset === 0 && _this2.nodeStartsWithSmallSpace(startNode)) {
22544
- _this2.replaceNextLetter(e.key);
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
- // console.log("handleInput")
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(); // Handle case of empty string returned
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
- _this2.applyChangesToComponent(new_raw_text, _this2.props.mimeType, new_rangeParams, _this2.props.useExpertMode, _this2.props.selectedTab);
23360
- } catch (error) {
23361
- console.error(error);
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.endNodeIndex);
23407
+ var node = _this2._findNodeWithIndex(rangeParams.startNodeIndex);
23394
23408
 
23395
- var offset = rangeParams.endOffset;
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
- if (rangeParams.startNodeIndex === rangeParams.endNodeIndex && rangeParams.startOffset === rangeParams.endOffset) new_rangeParams.startOffset = new_rangeParams.startOffset + new_char.length;
23407
- new_rangeParams.endOffset = new_rangeParams.endOffset + new_char.length;
23408
- } else new_raw_text = removeMarks(replaceCharacterBeforeMarks(raw_text, new_char));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zzish/math-rich-input",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "description": "React component for user to enter rich text with embedded math equations.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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: 0,
467
+ startOffset: 1,
467
468
  endNodeIndex: 0,
468
- endOffset: 0,
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)) return;
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
- e.key.length === 1 &&
1201
- params.startOffset === 0 &&
1202
- this.nodeStartsWithSmallSpace(startNode)
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
- // console.log("handleInput")
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
- replaceNextLetter = (new_char) => {
2180
+ insertAfterSmallSpace(new_char, rangeParams) {
2158
2181
  try {
2159
- let rangeParams = this._getRangeParams();
2160
- let node = this._findNodeWithIndex(rangeParams.endNodeIndex);
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
- this.editableDiv,
2165
- node,
2166
- offset,
2167
- this.enableHtml()
2168
- );
2169
- let new_raw_text = null;
2170
- let new_rangeParams = { ...rangeParams };
2171
- new_raw_text = removeMarks(
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.endNodeIndex);
2204
- let offset = rangeParams.endOffset;
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 = { ...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
- insertCharacterBeforeMarks(raw_text, new_char)
2220
- );
2221
- if (
2222
- rangeParams.startNodeIndex === rangeParams.endNodeIndex &&
2223
- rangeParams.startOffset === rangeParams.endOffset
2224
- )
2225
- new_rangeParams.startOffset =
2226
- new_rangeParams.startOffset + new_char.length;
2227
- new_rangeParams.endOffset = new_rangeParams.endOffset + new_char.length;
2228
- } else
2229
- new_raw_text = removeMarks(
2230
- replaceCharacterBeforeMarks(raw_text, new_char)
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("Cant render node in editable div: Unknown node type")
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
- return false;
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 = {offset:0}
855
- findNodeAndOffsetForGlobalOffset(editableDiv, params.startGlobalOffset, startResult)
856
- // console.log(startResult.node.nodeType+":"+startResult.node.tagName+":"+
857
- // startResult.node.nodeValue+":"+startResult.offset)
858
- let endResult = {offset:0}
859
- findNodeAndOffsetForGlobalOffset(editableDiv, params.endGlobalOffset, endResult)
860
- // console.log(endResult.node.nodeType+":"+endResult.node.tagName+":"+
861
- // endResult.node.nodeValue+":"+endResult.offset)
862
- if (!startResult.node || !endResult.node ||
863
- !startResult.offset || !endResult.offset) {
864
- console.log("Can't set range with start and end results")
865
- console.log(startResult)
866
- console.log(endResult)
867
- throw new Error("Could not extract valid nodes and offsets from params")
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
- // console.log("Setting range to:")
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
- if (params.startGlobalOffset) {
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