UNPKG

usfm-editor

Version:
174 lines (120 loc) 5.92 kB
"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) }); } }