UNPKG

usfm-editor

Version:
247 lines (189 loc) 7.42 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.UsfmMarkers = void 0; require("core-js/modules/es.array.flat-map.js"); require("core-js/modules/es.array.unscopables.flat-map.js"); var _MarkerInfoMap = _interopRequireDefault(require("./MarkerInfoMap")); var _slate = require("slate"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * The order of the identification markers listed here is the * order that they should appear in the usfm document. * The sort order is calculated using the ordering of the enum * values here. */ var IDENTIFICATION; (function (IDENTIFICATION) { IDENTIFICATION["id"] = "id"; IDENTIFICATION["ide"] = "ide"; IDENTIFICATION["h"] = "h"; IDENTIFICATION["toc"] = "toc"; IDENTIFICATION["toca"] = "toca"; IDENTIFICATION["rem"] = "rem"; IDENTIFICATION["usfm"] = "usfm"; })(IDENTIFICATION || (IDENTIFICATION = {})); var TITLES_HEADINGS_LABELS; (function (TITLES_HEADINGS_LABELS) { TITLES_HEADINGS_LABELS["mt"] = "mt"; TITLES_HEADINGS_LABELS["mte"] = "mte"; TITLES_HEADINGS_LABELS["ms"] = "ms"; TITLES_HEADINGS_LABELS["mr"] = "mr"; TITLES_HEADINGS_LABELS["s"] = "s"; TITLES_HEADINGS_LABELS["sr"] = "sr"; TITLES_HEADINGS_LABELS["r"] = "r"; TITLES_HEADINGS_LABELS["rq"] = "rq"; TITLES_HEADINGS_LABELS["d"] = "d"; TITLES_HEADINGS_LABELS["sp"] = "sp"; TITLES_HEADINGS_LABELS["sd"] = "sd"; })(TITLES_HEADINGS_LABELS || (TITLES_HEADINGS_LABELS = {})); var PARAGRAPHS; (function (PARAGRAPHS) { PARAGRAPHS["p"] = "p"; })(PARAGRAPHS || (PARAGRAPHS = {})); var SPECIAL_TEXT; (function (SPECIAL_TEXT) { SPECIAL_TEXT["nd"] = "nd"; SPECIAL_TEXT["bk"] = "bk"; })(SPECIAL_TEXT || (SPECIAL_TEXT = {})); var SPECIAL_FEATURES; (function (SPECIAL_FEATURES) { SPECIAL_FEATURES["w"] = "w"; })(SPECIAL_FEATURES || (SPECIAL_FEATURES = {})); var CHAPTERS_AND_VERSES; (function (CHAPTERS_AND_VERSES) { CHAPTERS_AND_VERSES["c"] = "c"; CHAPTERS_AND_VERSES["v"] = "v"; })(CHAPTERS_AND_VERSES || (CHAPTERS_AND_VERSES = {})); const chapterAndVerseNumbers = [CHAPTERS_AND_VERSES.c, CHAPTERS_AND_VERSES.v]; const CATEGORIES = [IDENTIFICATION, TITLES_HEADINGS_LABELS, PARAGRAPHS, SPECIAL_TEXT, SPECIAL_FEATURES, CHAPTERS_AND_VERSES]; const markerToCategoryMap = (() => { return new Map(CATEGORIES.flatMap(e => Object.entries(e).map(v => [v[0], e]))); })(); class UsfmMarkers { /** https://ubsicap.github.io/usfm/identification */ /** https://ubsicap.github.io/usfm/titles_headings */ /** * Paragraph markers, including poetry-indentation. * https://ubsicap.github.io/usfm/paragraphs */ /** * Character markers that have semantic meaning. * https://ubsicap.github.io/usfm/characters#special-text */ /** https://ubsicap.github.io/usfm/characters#special-features */ /** https://ubsicap.github.io/usfm/chapters_verses */ static compare(markerA, markerB) { const baseA = UsfmMarkers.getBaseMarker(markerA); const baseB = UsfmMarkers.getBaseMarker(markerB); if (!baseA || !baseB) { console.warn("Can't destructure markers for sorting!", markerA, markerB); } else if (markerToCategoryMap.get(baseA) != markerToCategoryMap.get(baseB)) { console.warn("Can't compare markers from different categories!", markerA, markerB); } const sortA = UsfmMarkers.getSortOrder(markerA); const sortB = UsfmMarkers.getSortOrder(markerB); return sortA - sortB; } static isIdentification(markerOrNode) { return UsfmMarkers.isOfCategory(markerOrNode, UsfmMarkers.IDENTIFICATION); } static isVerseOrChapterNumber(markerOrNode) { return UsfmMarkers.isOfCategory(markerOrNode, chapterAndVerseNumbers); } static isParagraphType(markerOrNode) { const marker = UsfmMarkers.marker(markerOrNode); if (!marker) return false; switch (marker) { case "s5": case "ts-s": case "ts-e": return true; // Special cases default: const info = _MarkerInfoMap.default.get(marker); return (info === null || info === void 0 ? void 0 : info.styleType) === "paragraph"; } } static isValid(marker) { return _MarkerInfoMap.default.has(marker) || marker === "s5"; } static destructureMarker(marker) { if (!marker) return undefined; if (UsfmMarkers.isNumberedMilestoneMarker(marker)) { const match = marker.match(/^qt(\d*)(.*)$/); if (!match) return undefined; const [, number, suffix] = match; const pluses = ""; const baseMarker = `qt${suffix}`; const markerWithoutLeadingPlus = baseMarker + number; return { pluses, baseMarker, number, markerWithoutLeadingPlus }; } const match = marker.match(/^(\+*)(.*?)(\d*)$/); if (!match) return undefined; const [, pluses, baseMarker, number] = match; const markerWithoutLeadingPlus = baseMarker + number; return { pluses, baseMarker, number, markerWithoutLeadingPlus }; } static getBaseMarker(marker) { var _UsfmMarkers$destruct; return (_UsfmMarkers$destruct = UsfmMarkers.destructureMarker(marker)) === null || _UsfmMarkers$destruct === void 0 ? void 0 : _UsfmMarkers$destruct.baseMarker; } static isNumberedMilestoneMarker(marker) { return /^qt(\d*)(-[se])$/.test(marker); } /** * The sort order is calculated using the ordering of the markers * in their category enum, as well as the number of the marker, * if applicable. For example, "toc1" should occur before "toc2". */ static getSortOrder(marker) { const destructured = UsfmMarkers.destructureMarker(marker); if (!destructured) return NaN; const { baseMarker, number } = destructured; const markerCategory = markerToCategoryMap.get(baseMarker); if (!markerCategory) return NaN; const baseOrder = Object.keys(markerCategory).indexOf(baseMarker); if (parseInt(number)) { return baseOrder + parseInt(number) * 0.1; } return baseOrder; } static isOfCategory(markerOrNode, category) { const marker = UsfmMarkers.marker(markerOrNode); if (!marker) return false; const baseType = UsfmMarkers.getBaseMarker(marker); return baseType != undefined && (category.hasOwnProperty(baseType) || Array.isArray(category) && category.includes(baseType)); } static marker(markerOrNode) { if (isStringOrNil(markerOrNode)) return markerOrNode; if (_slate.Element.isElement(markerOrNode)) return markerOrNode.type; return undefined; } } /** True iff string or null or undefined (which are all subtypes of string) */ exports.UsfmMarkers = UsfmMarkers; _defineProperty(UsfmMarkers, "IDENTIFICATION", IDENTIFICATION); _defineProperty(UsfmMarkers, "TITLES_HEADINGS_LABELS", TITLES_HEADINGS_LABELS); _defineProperty(UsfmMarkers, "PARAGRAPHS", PARAGRAPHS); _defineProperty(UsfmMarkers, "SPECIAL_TEXT", SPECIAL_TEXT); _defineProperty(UsfmMarkers, "SPECIAL_FEATURES", SPECIAL_FEATURES); _defineProperty(UsfmMarkers, "CHAPTERS_AND_VERSES", CHAPTERS_AND_VERSES); function isStringOrNil(s) { return s === null || s === undefined || typeof s === "string"; }