usfm-editor
Version:
A WYSIWYG editor component for USFM
174 lines (120 loc) • 5.92 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.VerseTransforms = void 0;
var _slate = require("slate");
var _MyTransforms = require("./MyTransforms");
var _MyEditor = require("./MyEditor");
var _lodash = require("lodash");
var _basicSlateNodeFactory = require("../../transforms/basicSlateNodeFactory");
var _NodeRules = _interopRequireDefault(require("../../utils/NodeRules"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const VerseTransforms = {
joinWithPreviousVerse,
unjoinVerses,
removeVerseAndConcatenateContentsWithPrevious,
addVerse
};
exports.VerseTransforms = VerseTransforms;
function joinWithPreviousVerse(editor, path) {
const thisVerseNodeEntry = _MyEditor.MyEditor.getVerseNode(editor, path);
const previousVerseEntry = _MyEditor.MyEditor.getPreviousVerse(editor, path);
if (!thisVerseNodeEntry || !previousVerseEntry) return;
const [thisVerse, thisVersePath] = thisVerseNodeEntry;
const [prevVerse, prevVersePath] = previousVerseEntry;
const thisVerseNumPath = thisVersePath.concat(0);
const prevVerseNumPath = prevVersePath.concat(0);
const thisNumOrRange = _slate.Node.string(thisVerse.children[0]);
const prevNumOrRange = _slate.Node.string(prevVerse.children[0]);
const [thisStart, thisEndOrNull] = thisNumOrRange.split("-");
const thisEnd = thisEndOrNull ? thisEndOrNull : thisStart;
const [prevStart, _prevEnd] = prevNumOrRange.split("-");
_insertLeadingSpaceIfNecessary(editor, thisVersePath);
_slate.Transforms.removeNodes(editor, {
at: thisVerseNumPath
});
_MyTransforms.MyTransforms.replaceNodes(editor, prevVerseNumPath, (0, _basicSlateNodeFactory.verseNumber)(`${prevStart}-${thisEnd}`));
_slate.Transforms.mergeNodes(editor, {
at: thisVersePath
});
_MyTransforms.MyTransforms.moveToEndOfLastLeaf(editor, prevVersePath);
}
function removeVerseAndConcatenateContentsWithPrevious(editor, path) {
const thisVerseEntry = _MyEditor.MyEditor.getVerseNode(editor, path);
if (!thisVerseEntry) return;
const [_thisVerse, thisVersePath] = thisVerseEntry;
const thisVerseNumPath = thisVersePath.concat(0);
_insertLeadingSpaceIfNecessary(editor, thisVersePath);
_slate.Transforms.removeNodes(editor, {
at: thisVerseNumPath
});
_slate.Transforms.mergeNodes(editor, {
at: thisVersePath
});
_MyTransforms.MyTransforms.moveToEndOfLastLeaf(editor, _slate.Path.previous(thisVersePath));
}
function unjoinVerses(editor, path) {
const thisVerseEntry = _MyEditor.MyEditor.getVerseNode(editor, path);
if (!thisVerseEntry) return;
const [verse, versePath] = thisVerseEntry;
const verseNumPath = versePath.concat(0);
const verseRange = _slate.Node.string(verse.children[0]);
const [thisStart, thisEnd] = verseRange.split("-"); // Use replaceNodes() rather than replaceText() so that the
// verse number is re-rendered, triggering effect hooks.
_MyTransforms.MyTransforms.replaceNodes(editor, verseNumPath, (0, _basicSlateNodeFactory.verseNumber)(thisStart));
const newVerses = (0, _lodash.range)(parseInt(thisStart) + 1, parseInt(thisEnd) + 1, 1).map(num => (0, _basicSlateNodeFactory.emptyVerseWithVerseNumber)(num.toString()));
_slate.Transforms.insertNodes(editor, newVerses, {
at: _slate.Path.next(versePath)
});
_MyTransforms.MyTransforms.moveToEndOfLastLeaf(editor, _slate.Path.next(versePath));
}
function addVerse(editor, path) {
const thisVerseEntry = _MyEditor.MyEditor.getVerseNode(editor, path);
if (!thisVerseEntry) return;
const [verse, versePath] = thisVerseEntry;
const verseNumPath = versePath.concat(0);
const verseNumberOrRange = _slate.Node.string(verse.children[0]);
const [rangeStart, rangeEnd] = verseNumberOrRange.split("-");
const newVerseNum = rangeEnd ? parseInt(rangeEnd) + 1 : parseInt(rangeStart) + 1;
const newVerse = (0, _basicSlateNodeFactory.emptyVerseWithVerseNumber)(newVerseNum.toString());
_slate.Transforms.insertNodes(editor, newVerse, {
at: _slate.Path.next(versePath)
});
_MyTransforms.MyTransforms.moveToEndOfLastLeaf(editor, _slate.Path.next(versePath)); // Replace the original verse number with a clone of itself,
// forcing the verse number to be re-rendered which will
// trigger its effect hooks.
_MyTransforms.MyTransforms.replaceNodes(editor, verseNumPath, (0, _basicSlateNodeFactory.verseNumber)(verseNumberOrRange));
}
/**
* When a verse (verse N) is about to be joined to its preceding verse
* (verse N-1), we check whether the inline container of verse N is
* 1) nonempty and 2) mergeable into the last node of verse N-1.
* If these two conditions are met, a space will be inserted at the
* beginning of verse N's inline container.
*/
function _insertLeadingSpaceIfNecessary(editor, versePath) {
const inlineContainerPath = versePath.concat(1);
const [inlineContainer, _icPath] = _slate.Editor.node(editor, inlineContainerPath);
const inlineContainerText = _slate.Node.string(inlineContainer);
if (!inlineContainerText.trim()) {
return;
}
const previousVerseEntry = _MyEditor.MyEditor.getPreviousVerse(editor, inlineContainerPath);
if (!previousVerseEntry) return;
const [prevVerse, prevVersePath] = previousVerseEntry;
if (!_slate.Element.isElement(prevVerse)) return;
const [lastChildOfPreviousVerse, _lcPath] = _slate.Editor.node(editor, prevVersePath.concat(prevVerse.children.length - 1));
if (_NodeRules.default.canMergeAIntoB(inlineContainer, lastChildOfPreviousVerse)) {
_insertLeadingSpace(editor, inlineContainerPath);
}
}
function _insertLeadingSpace(editor, path) {
const [node, _path] = _slate.Editor.node(editor, path);
const currentText = _slate.Node.string(node);
if (currentText.trim()) {
_slate.Transforms.insertNodes(editor, (0, _basicSlateNodeFactory.textNode)(" "), {
at: path.concat(0)
});
}
}