usfm-editor
Version:
A WYSIWYG editor component for USFM
247 lines (189 loc) • 7.42 kB
JavaScript
;
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";
}