usfm-editor
Version:
A WYSIWYG editor component for USFM
73 lines (63 loc) • 2.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.objectToArrayRules = exports.nextCharRules = void 0;
require("core-js/modules/es.array.sort.js");
var _jsonTransforms = require("json-transforms");
/** json-transforms rules to convert chapter/verse objects to arrays */
const objectToArrayRules = [(0, _jsonTransforms.pathRule)(".chapters", d => Object.assign({}, d.context, {
chapters: Object.entries(d.match).map(e => ({
chapterNumber: e[0],
sort: +e[0] || 0,
verses: Object.entries(e[1]).map(f => ({
source: f[1],
verseNumber: f[0],
sort: parseStartVerseNumber(f[0]),
nodes: f[1].verseObjects
})).sort((a, b) => a.sort - b.sort)
})).sort((a, b) => a.sort - b.sort)
})), _jsonTransforms.identity];
/**
* The 'nextChar' is used by usfm-js to designate the character that should come after
* a usfm tag node. For our purposes, we will apply the nextChar character to the
* front of a text node that follows such a designation, but only if there is an immediately following
* text node.
*/
exports.objectToArrayRules = objectToArrayRules;
const nextCharRules = [(0, _jsonTransforms.pathRule)(".nodes", d => {
let nodes = [];
let nextChar = null;
d.context.nodes.forEach(value => {
const node = shouldAddNextChar(nextChar, value) ? addNextChar(nextChar, value) : value;
nodes = nodes.concat(node);
if (value.hasOwnProperty("nextChar")) {
nextChar = value.nextChar;
} else {
// The nextChar field should only be applied to a text node immediately
// following a node that designates 'nextChar'. Thus we set nextChar to
// null so that it does not affect later nodes, even if not a single node
// was affected.
nextChar = null;
}
});
return Object.assign({}, d.context, {
nodes: nodes
});
}), _jsonTransforms.identity];
/**
* Returns the input if the input is just a verse number (not a range),
* or the starting verse number if the input is a verse range.
*/
exports.nextCharRules = nextCharRules;
function parseStartVerseNumber(verseNumberOrRange) {
return +verseNumberOrRange.match(/^\d*/)[0];
}
function shouldAddNextChar(nextChar, value) {
return nextChar != null && nextChar != "\n" && value.type == "text";
}
function addNextChar(nextChar, value) {
return Object.assign({}, value, {
text: nextChar + value.text
});
}