@gracious.tech/bible-references
Version:
Bible reference detection, parsing, and rendering that supports any language.
82 lines (81 loc) • 2.83 kB
JavaScript
import { PassageReference } from "./passage.js";
import { books_ordered } from "./data.js";
function sort_references(refs, canonical = true) {
const book_first_index = /* @__PURE__ */ new Map();
if (!canonical) {
refs.forEach((ref, i) => {
if (!book_first_index.has(ref.book)) {
book_first_index.set(ref.book, i);
}
});
}
return refs.slice().sort((a, b) => {
const book_diff = canonical ? books_ordered.indexOf(a.book) - books_ordered.indexOf(b.book) : book_first_index.get(a.book) - book_first_index.get(b.book);
if (book_diff !== 0) {
return book_diff;
}
if (a.start_chapter !== b.start_chapter) {
return a.start_chapter - b.start_chapter;
}
if (a.start_verse !== b.start_verse) {
return a.start_verse - b.start_verse;
}
if (a.end_chapter !== b.end_chapter) {
return a.end_chapter - b.end_chapter;
}
return a.end_verse - b.end_verse;
});
}
function simplify_references(refs) {
const result = [];
for (const ref of refs) {
const merge_i = result.findIndex((prev2) => {
var _a, _b;
return prev2.overlaps(ref) || ((_a = ref.get_prev_verse()) == null ? void 0 : _a.overlaps(prev2)) || ((_b = prev2.get_prev_verse()) == null ? void 0 : _b.overlaps(ref));
});
if (merge_i === -1) {
result.push(ref.simplify());
continue;
}
const prev = result[merge_i];
const start_ref = prev.get_start().is_after(ref.get_start()) ? ref : prev;
const end_ref = ref.get_end().is_after(prev) ? ref : prev;
result[merge_i] = PassageReference.from_refs(start_ref, end_ref).simplify();
}
return result;
}
function references_to_string(refs, book_names = {}, verse_sep = ":", range_sep = "-", chapter_sep = "; ") {
let result = "";
let current_book = null;
let current_chapter = null;
for (const ref of refs) {
const same_book = ref.book === current_book;
const verse_level = ref.type === "verse" || ref.type === "range_verses";
const same_chapter = same_book && ref.start_chapter === current_chapter && verse_level;
let sep;
let display;
if (result === "") {
sep = "";
display = ref.toString(book_names, verse_sep, range_sep);
} else if (same_chapter) {
sep = ", ";
display = ref.type === "verse" ? `${ref.start_verse}` : `${ref.start_verse}${range_sep}${ref.end_verse}`;
} else if (same_book) {
sep = chapter_sep;
display = ref.get_verses_string(verse_sep, range_sep);
} else {
sep = chapter_sep;
display = ref.toString(book_names, verse_sep, range_sep);
}
result += sep + display;
current_book = ref.book;
current_chapter = ref.start_chapter;
}
return result;
}
export {
references_to_string,
simplify_references,
sort_references
};
//# sourceMappingURL=lists.js.map