@helloao/tools 0.0.9 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/generation/api.cjs +126 -0
- package/dist/cjs/generation/api.cjs.map +2 -2
- package/dist/cjs/generation/common-types.cjs.map +1 -1
- package/dist/cjs/generation/dataset.cjs +159 -79
- package/dist/cjs/generation/dataset.cjs.map +2 -2
- package/dist/cjs/parser/codex-parser.cjs +77 -66
- package/dist/cjs/parser/codex-parser.cjs.map +2 -2
- package/dist/cjs/parser/commentary-csv-parser.cjs +133 -0
- package/dist/cjs/parser/commentary-csv-parser.cjs.map +7 -0
- package/dist/cjs/parser/index.cjs +3 -1
- package/dist/cjs/parser/index.cjs.map +2 -2
- package/dist/cjs/parser/types.cjs.map +1 -1
- package/dist/cjs/parser/usx-parser.cjs +13 -1
- package/dist/cjs/parser/usx-parser.cjs.map +2 -2
- package/dist/cjs/utils.cjs +155 -3
- package/dist/cjs/utils.cjs.map +3 -3
- package/dist/esm/generation/api.js +122 -0
- package/dist/esm/generation/api.js.map +2 -2
- package/dist/esm/generation/dataset.js +159 -79
- package/dist/esm/generation/dataset.js.map +2 -2
- package/dist/esm/parser/codex-parser.js +71 -64
- package/dist/esm/parser/codex-parser.js.map +2 -2
- package/dist/esm/parser/commentary-csv-parser.js +107 -0
- package/dist/esm/parser/commentary-csv-parser.js.map +7 -0
- package/dist/esm/parser/index.js +1 -0
- package/dist/esm/parser/index.js.map +2 -2
- package/dist/esm/parser/usx-parser.js +13 -1
- package/dist/esm/parser/usx-parser.js.map +2 -2
- package/dist/esm/utils.js +153 -3
- package/dist/esm/utils.js.map +3 -3
- package/dist/types/generation/api.d.ts +147 -1
- package/dist/types/generation/common-types.d.ts +121 -24
- package/dist/types/generation/dataset.d.ts +23 -1
- package/dist/types/parser/codex-parser.d.ts +50 -7
- package/dist/types/parser/commentary-csv-parser.d.ts +12 -0
- package/dist/types/parser/index.d.ts +1 -0
- package/dist/types/parser/types.d.ts +28 -1
- package/dist/types/parser/usx-parser.d.ts +1 -1
- package/dist/types/utils.d.ts +6 -0
- package/package.json +3 -2
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var commentary_csv_parser_exports = {};
|
|
20
|
+
__export(commentary_csv_parser_exports, {
|
|
21
|
+
CommentaryCsvParser: () => CommentaryCsvParser
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(commentary_csv_parser_exports);
|
|
24
|
+
var import_utils = require("../utils");
|
|
25
|
+
var import_papaparse = require("papaparse");
|
|
26
|
+
class CommentaryCsvParser {
|
|
27
|
+
parse(data) {
|
|
28
|
+
const firstLine = data.indexOf("\n");
|
|
29
|
+
data = data.substring(firstLine + 1);
|
|
30
|
+
const lines = (0, import_papaparse.parse)(data, {
|
|
31
|
+
header: false,
|
|
32
|
+
// transformHeader: (_, index) => {
|
|
33
|
+
// const headers = ['book', 'chapter', 'verse', 'commentaries'];
|
|
34
|
+
// if (index < headers.length) {
|
|
35
|
+
// return headers[index];
|
|
36
|
+
// } else {
|
|
37
|
+
// return '';
|
|
38
|
+
// }
|
|
39
|
+
// },
|
|
40
|
+
delimiter: ",",
|
|
41
|
+
escapeChar: '"',
|
|
42
|
+
quoteChar: '"'
|
|
43
|
+
});
|
|
44
|
+
return this.parseLines(
|
|
45
|
+
lines.data.map((line) => ({
|
|
46
|
+
book: line[0],
|
|
47
|
+
chapter: line[1],
|
|
48
|
+
verse: line[2],
|
|
49
|
+
commentaries: line[3]
|
|
50
|
+
}))
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
parseLines(data) {
|
|
54
|
+
let tree = {
|
|
55
|
+
type: "commentary/root",
|
|
56
|
+
books: []
|
|
57
|
+
};
|
|
58
|
+
let book = null;
|
|
59
|
+
let chapter = null;
|
|
60
|
+
for (let line of data) {
|
|
61
|
+
if (hasValue(line.book)) {
|
|
62
|
+
const id = (0, import_utils.getBookId)(line.book);
|
|
63
|
+
if (!id) {
|
|
64
|
+
throw new Error("Invalid book: " + line.book);
|
|
65
|
+
}
|
|
66
|
+
book = tree.books.find((b) => b.book === id) ?? null;
|
|
67
|
+
if (!book) {
|
|
68
|
+
book = {
|
|
69
|
+
type: "book",
|
|
70
|
+
book: id,
|
|
71
|
+
introduction: null,
|
|
72
|
+
chapters: []
|
|
73
|
+
};
|
|
74
|
+
tree.books.push(book);
|
|
75
|
+
}
|
|
76
|
+
if (!book.introduction) {
|
|
77
|
+
book.introduction = hasValue(line.commentaries) ? line.commentaries : null;
|
|
78
|
+
}
|
|
79
|
+
} else if (hasValue(line.chapter)) {
|
|
80
|
+
const number = parseInt(line.chapter);
|
|
81
|
+
if (isNaN(number)) {
|
|
82
|
+
throw new Error("Invalid chapter number: " + line.chapter);
|
|
83
|
+
}
|
|
84
|
+
if (!book) {
|
|
85
|
+
throw new Error("Chapter without book");
|
|
86
|
+
}
|
|
87
|
+
chapter = {
|
|
88
|
+
type: "chapter",
|
|
89
|
+
number,
|
|
90
|
+
introduction: hasValue(line.commentaries) ? line.commentaries : null,
|
|
91
|
+
verses: []
|
|
92
|
+
};
|
|
93
|
+
book.chapters.push(chapter);
|
|
94
|
+
} else if (hasValue(line.verse)) {
|
|
95
|
+
const ref = (0, import_utils.parseVerseReference)(line.verse);
|
|
96
|
+
if (ref) {
|
|
97
|
+
if (ref.book === book?.book) {
|
|
98
|
+
if (ref.chapter === chapter?.number) {
|
|
99
|
+
chapter.verses.push({
|
|
100
|
+
type: "verse",
|
|
101
|
+
number: ref.verse,
|
|
102
|
+
content: [line.commentaries]
|
|
103
|
+
});
|
|
104
|
+
} else {
|
|
105
|
+
chapter = {
|
|
106
|
+
type: "chapter",
|
|
107
|
+
number: ref.chapter,
|
|
108
|
+
introduction: null,
|
|
109
|
+
verses: [
|
|
110
|
+
{
|
|
111
|
+
type: "verse",
|
|
112
|
+
number: ref.verse,
|
|
113
|
+
content: [line.commentaries]
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
};
|
|
117
|
+
book.chapters.push(chapter);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return tree;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function hasValue(value) {
|
|
127
|
+
return value !== null && value !== void 0 && value !== "" && value.trim() !== "";
|
|
128
|
+
}
|
|
129
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
130
|
+
0 && (module.exports = {
|
|
131
|
+
CommentaryCsvParser
|
|
132
|
+
});
|
|
133
|
+
//# sourceMappingURL=commentary-csv-parser.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../parser/commentary-csv-parser.ts"],
|
|
4
|
+
"sourcesContent": ["import {\r\n CommentaryBookNode,\r\n CommentaryChapterNode,\r\n CommentaryParseTree,\r\n} from './types';\r\nimport { getBookId, parseVerseReference } from '../utils';\r\nimport { parse } from 'papaparse';\r\n\r\nexport interface CsvLine {\r\n book: string;\r\n chapter: string;\r\n verse: string;\r\n commentaries: string;\r\n}\r\n\r\nexport class CommentaryCsvParser {\r\n parse(data: string): CommentaryParseTree {\r\n // remove header automatically\r\n const firstLine = data.indexOf('\\n');\r\n data = data.substring(firstLine + 1);\r\n\r\n const lines = parse<string[]>(data, {\r\n header: false,\r\n // transformHeader: (_, index) => {\r\n // const headers = ['book', 'chapter', 'verse', 'commentaries'];\r\n // if (index < headers.length) {\r\n // return headers[index];\r\n // } else {\r\n // return '';\r\n // }\r\n // },\r\n delimiter: ',',\r\n escapeChar: '\"',\r\n quoteChar: '\"',\r\n });\r\n return this.parseLines(\r\n lines.data.map((line: string[]) => ({\r\n book: line[0],\r\n chapter: line[1],\r\n verse: line[2],\r\n commentaries: line[3],\r\n }))\r\n );\r\n }\r\n\r\n parseLines(data: CsvLine[]): CommentaryParseTree {\r\n let tree: CommentaryParseTree = {\r\n type: 'commentary/root',\r\n books: [],\r\n };\r\n\r\n let book: CommentaryBookNode | null = null;\r\n let chapter: CommentaryChapterNode | null = null;\r\n for (let line of data) {\r\n if (hasValue(line.book)) {\r\n const id = getBookId(line.book);\r\n if (!id) {\r\n throw new Error('Invalid book: ' + line.book);\r\n }\r\n\r\n book = tree.books.find((b) => b.book === id) ?? null;\r\n if (!book) {\r\n book = {\r\n type: 'book',\r\n book: id,\r\n introduction: null,\r\n chapters: [],\r\n };\r\n tree.books.push(book);\r\n }\r\n\r\n if (!book.introduction) {\r\n book.introduction = hasValue(line.commentaries)\r\n ? line.commentaries\r\n : null;\r\n }\r\n } else if (hasValue(line.chapter)) {\r\n const number = parseInt(line.chapter);\r\n if (isNaN(number)) {\r\n throw new Error('Invalid chapter number: ' + line.chapter);\r\n }\r\n\r\n if (!book) {\r\n // console.log(line);\r\n throw new Error('Chapter without book');\r\n }\r\n\r\n chapter = {\r\n type: 'chapter',\r\n number,\r\n introduction: hasValue(line.commentaries)\r\n ? line.commentaries\r\n : null,\r\n verses: [],\r\n };\r\n book.chapters.push(chapter);\r\n } else if (hasValue(line.verse)) {\r\n const ref = parseVerseReference(line.verse);\r\n if (ref) {\r\n if (ref.book === book?.book) {\r\n // @ts-ignore\r\n if (ref.chapter === chapter?.number) {\r\n chapter.verses.push({\r\n type: 'verse',\r\n number: ref.verse,\r\n content: [line.commentaries],\r\n });\r\n } else {\r\n chapter = {\r\n type: 'chapter',\r\n number: ref.chapter,\r\n introduction: null,\r\n verses: [\r\n {\r\n type: 'verse',\r\n number: ref.verse,\r\n content: [line.commentaries],\r\n },\r\n ],\r\n };\r\n\r\n book.chapters.push(chapter);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return tree;\r\n }\r\n}\r\n\r\nfunction hasValue(value: string | null): boolean {\r\n return (\r\n value !== null &&\r\n value !== undefined &&\r\n value !== '' &&\r\n value.trim() !== ''\r\n );\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -36,6 +36,7 @@ __reExport(parser_exports, require("./types.js"), module.exports);
|
|
|
36
36
|
__reExport(parser_exports, require("./usfm-parser.js"), module.exports);
|
|
37
37
|
__reExport(parser_exports, require("./usx-parser.js"), module.exports);
|
|
38
38
|
__reExport(parser_exports, require("./codex-parser.js"), module.exports);
|
|
39
|
+
__reExport(parser_exports, require("./commentary-csv-parser.js"), module.exports);
|
|
39
40
|
var iterators = __toESM(require("./iterators.js"));
|
|
40
41
|
// Annotate the CommonJS export names for ESM import in node:
|
|
41
42
|
0 && (module.exports = {
|
|
@@ -43,6 +44,7 @@ var iterators = __toESM(require("./iterators.js"));
|
|
|
43
44
|
...require("./types.js"),
|
|
44
45
|
...require("./usfm-parser.js"),
|
|
45
46
|
...require("./usx-parser.js"),
|
|
46
|
-
...require("./codex-parser.js")
|
|
47
|
+
...require("./codex-parser.js"),
|
|
48
|
+
...require("./commentary-csv-parser.js")
|
|
47
49
|
});
|
|
48
50
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../parser/index.ts"],
|
|
4
|
-
"sourcesContent": ["export * from './types.js';\r\nexport * from './usfm-parser.js';\r\nexport * from './usx-parser.js';\r\nexport * from './codex-parser.js';\r\nimport * as iterators from './iterators.js';\r\n\r\nexport { iterators };\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAc,uBAAd;AACA,2BAAc,6BADd;AAEA,2BAAc,4BAFd;AAGA,2BAAc,8BAHd;AAIA,gBAA2B;",
|
|
4
|
+
"sourcesContent": ["export * from './types.js';\r\nexport * from './usfm-parser.js';\r\nexport * from './usx-parser.js';\r\nexport * from './codex-parser.js';\r\nexport * from './commentary-csv-parser.js';\r\nimport * as iterators from './iterators.js';\r\n\r\nexport { iterators };\r\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAc,uBAAd;AACA,2BAAc,6BADd;AAEA,2BAAc,4BAFd;AAGA,2BAAc,8BAHd;AAIA,2BAAc,uCAJd;AAKA,gBAA2B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../parser/types.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
4
|
+
"sourcesContent": ["/**\r\n * The parse tree that is gathered.\r\n */\r\nexport interface ParseTree {\r\n type: 'root';\r\n\r\n /**\r\n * The ID of the parse tree.\r\n */\r\n id?: string;\r\n\r\n /**\r\n * The header that was associated with the tree.\r\n */\r\n header?: string;\r\n\r\n /**\r\n * The major title that was associated with the tree.\r\n */\r\n title?: string;\r\n\r\n /**\r\n * The list of chapters for the tree.\r\n */\r\n content: (Heading | Chapter)[];\r\n}\r\n\r\nexport interface Heading {\r\n type: 'heading';\r\n content: string[];\r\n}\r\n\r\nexport type ChapterContent = Heading | Verse | HebrewSubtitle | LineBreak;\r\n\r\nexport type VerseContent = string | FootnoteReference | Text;\r\n\r\n/**\r\n * Defines an interface that represents a chapter.\r\n */\r\nexport interface Chapter {\r\n type: 'chapter';\r\n number: number;\r\n\r\n /**\r\n * The contents of the chapter.\r\n */\r\n content: ChapterContent[];\r\n\r\n /**\r\n * The list of footnotes for the chapter.\r\n */\r\n footnotes: Footnote[];\r\n}\r\n\r\n/**\r\n * Defines an interface that represents a hebrew subtitle.\r\n */\r\nexport interface HebrewSubtitle {\r\n type: 'hebrew_subtitle';\r\n\r\n /**\r\n * The contents of the subtitle.\r\n */\r\n content: (string | Text | FootnoteReference)[];\r\n}\r\n\r\n/**\r\n * Defines an interface that represents a verse.\r\n */\r\nexport interface Verse {\r\n type: 'verse';\r\n\r\n number: number;\r\n\r\n /**\r\n * The contents of the verse.\r\n */\r\n content: (\r\n | string\r\n | Text\r\n | InlineHeading\r\n | InlineLineBreak\r\n | FootnoteReference\r\n )[];\r\n}\r\n\r\n/**\r\n * Defines an interface that represents text that has some markup attributes applied to it.\r\n */\r\nexport interface Text {\r\n /**\r\n * The text that is contained.\r\n */\r\n text: string;\r\n\r\n /**\r\n * Whether the text represents a poem.\r\n * The number indicates the level of indent.\r\n */\r\n poem?: number;\r\n\r\n /**\r\n * Whether the text contains the words of Jesus.\r\n */\r\n wordsOfJesus?: boolean;\r\n\r\n /**\r\n * Whether the text is descriptive.\r\n *\r\n * This is only used for \"hebrew subtitles\" that are included inside the verse markers.\r\n */\r\n descriptive?: boolean;\r\n}\r\n\r\n/**\r\n * Defines an interface that represents a heading that is embedded in a verse.\r\n */\r\nexport interface InlineHeading {\r\n /**\r\n * The text of the heading.\r\n */\r\n heading: string;\r\n}\r\n\r\n/**\r\n * Defines an interface that represents a line break that is embedded in a verse.\r\n */\r\nexport interface InlineLineBreak {\r\n lineBreak: true;\r\n}\r\n\r\nexport interface FootnoteReference {\r\n /**\r\n * The ID of the note that is referenced.\r\n */\r\n noteId: number;\r\n}\r\n\r\nexport interface Footnote {\r\n noteId: number;\r\n\r\n /**\r\n * The text of the footnote.\r\n */\r\n text: string;\r\n\r\n /**\r\n * The caller that should be used for the footnote.\r\n * For footnotes, a \"caller\" is the character that is used in the text to reference to footnote.\r\n *\r\n * For example, in the text:\r\n * Hello (a) World\r\n *\r\n * ----\r\n * (a) This is a footnote.\r\n *\r\n * The \"(a)\" is the caller.\r\n *\r\n * If \"+\", then the caller should be autogenerated.\r\n * If null, then the caller should be empty.\r\n * If a string, then the caller should be that string.\r\n */\r\n caller: '+' | string | null;\r\n\r\n /**\r\n * The verse reference for the footnote.\r\n */\r\n reference?: {\r\n chapter: number;\r\n verse: number;\r\n };\r\n}\r\n\r\nexport interface LineBreak {\r\n type: 'line_break';\r\n}\r\n\r\n/**\r\n * The parse tree that is gathered.\r\n */\r\nexport interface CommentaryParseTree {\r\n type: 'commentary/root';\r\n\r\n /**\r\n * The books that are contained in the commentary.\r\n */\r\n books: CommentaryBookNode[];\r\n}\r\n\r\nexport interface CommentaryBookNode {\r\n type: 'book';\r\n book: string;\r\n introduction: string | null;\r\n chapters: CommentaryChapterNode[];\r\n}\r\n\r\nexport interface CommentaryChapterNode {\r\n type: 'chapter';\r\n number: number;\r\n introduction: string | null;\r\n verses: CommentaryVerseNode[];\r\n}\r\n\r\nexport interface CommentaryVerseNode {\r\n type: 'verse';\r\n number: number;\r\n content: string[];\r\n}\r\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -27,7 +27,7 @@ var NodeType = /* @__PURE__ */ ((NodeType2) => {
|
|
|
27
27
|
NodeType2[NodeType2["Text"] = 3] = "Text";
|
|
28
28
|
return NodeType2;
|
|
29
29
|
})(NodeType || {});
|
|
30
|
-
const PARSER_VERSION = "
|
|
30
|
+
const PARSER_VERSION = "2";
|
|
31
31
|
class USXParser {
|
|
32
32
|
_domParser;
|
|
33
33
|
_noteCounter = 0;
|
|
@@ -146,6 +146,7 @@ class USXParser {
|
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
148
|
*iterateVerseContent(chapter, verse, nodes) {
|
|
149
|
+
let lastParent = null;
|
|
149
150
|
while (true) {
|
|
150
151
|
const { done, value: node } = nodes.next();
|
|
151
152
|
if (done) {
|
|
@@ -161,6 +162,17 @@ class USXParser {
|
|
|
161
162
|
const style = parent.getAttribute("style");
|
|
162
163
|
if (style === "q1" || style === "q2" || style === "q3" || style === "q4") {
|
|
163
164
|
poem = style === "q1" ? 1 : style === "q2" ? 2 : style === "q3" ? 3 : 4;
|
|
165
|
+
if (parent.previousElementSibling?.nodeName === "para") {
|
|
166
|
+
const previousStyle = parent.previousElementSibling?.getAttribute(
|
|
167
|
+
"style"
|
|
168
|
+
);
|
|
169
|
+
if (previousStyle === style && lastParent !== parent) {
|
|
170
|
+
lastParent = parent;
|
|
171
|
+
yield {
|
|
172
|
+
lineBreak: true
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
164
176
|
} else if (style === "d") {
|
|
165
177
|
descriptive = true;
|
|
166
178
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../parser/usx-parser.ts"],
|
|
4
|
-
"sourcesContent": ["import {\r\n Chapter,\r\n ChapterContent,\r\n Footnote,\r\n FootnoteReference,\r\n ParseTree,\r\n Verse,\r\n Text,\r\n HebrewSubtitle,\r\n InlineLineBreak,\r\n InlineHeading,\r\n} from './types.js';\r\nimport {\r\n iterateAll,\r\n children,\r\n RewindableIterator,\r\n isParent,\r\n} from './iterators.js';\r\n\r\nenum NodeType {\r\n Text = 3,\r\n}\r\n\r\n/**\r\n * The version of the parser.\r\n * Used to determine whether input files need to be re-parsed.\r\n */\r\nexport const PARSER_VERSION = '1';\r\n\r\n/**\r\n * Defines a class that is able to parse USX content.\r\n */\r\nexport class USXParser {\r\n private _domParser: DOMParser;\r\n private _noteCounter: number = 0;\r\n\r\n constructor(domParser: DOMParser) {\r\n this._domParser = domParser;\r\n }\r\n\r\n /**\r\n * Parses the specified USX content.\r\n *\r\n * @param usx The USX content to parse.\r\n * @returns The parse tree that was generated.\r\n */\r\n public parse(usx: string): ParseTree {\r\n const parser = this._domParser;\r\n const doc = parser.parseFromString(usx, 'application/xml');\r\n const usxElement = doc.documentElement;\r\n\r\n let root: ParseTree = {\r\n type: 'root',\r\n content: [],\r\n };\r\n\r\n const bookElement = usxElement.querySelector('book[code]');\r\n\r\n if (!bookElement) {\r\n throw new Error('The USX content does not contain a book element.');\r\n }\r\n\r\n const bookCode = bookElement.getAttribute('code') || '';\r\n\r\n if (!bookCode) {\r\n throw new Error(\r\n 'The book element does not contain a code attribute.'\r\n );\r\n }\r\n\r\n root.id = bookCode;\r\n\r\n const header = usxElement.querySelector('para[style=\"h\"]');\r\n if (header) {\r\n root.header = header.textContent || '';\r\n }\r\n\r\n const titles = usxElement.querySelectorAll(\r\n 'para[style=\"mt1\"], para[style=\"mt2\"], para[style=\"mt3\"]'\r\n );\r\n // const title2 = usxElement.querySelector('para[style=\"mt2\"]');\r\n // const title3 = usxElement.querySelector('para[style=\"mt3\"]');\r\n\r\n if (titles.length > 0) {\r\n root.title = [...titles]\r\n .map((t) => t.textContent)\r\n .filter((t) => t)\r\n .join(' ');\r\n }\r\n\r\n for (let content of this.iterateRootContent(usxElement)) {\r\n root.content.push(content);\r\n }\r\n\r\n return root;\r\n }\r\n\r\n *iterateRootContent(\r\n usxElement: Element\r\n ): Generator<ParseTree['content'][0]> {\r\n const iterator = iterateAll(usxElement);\r\n while (true) {\r\n const { done, value: child } = iterator.next();\r\n if (done) {\r\n break;\r\n }\r\n\r\n if (!(child instanceof Element)) {\r\n continue;\r\n }\r\n\r\n if (child.nodeName === 'chapter') {\r\n if (child.hasAttribute('eid')) {\r\n continue;\r\n }\r\n\r\n const chapter: Chapter = {\r\n type: 'chapter',\r\n number: parseInt(child.getAttribute('number') || '0', 10),\r\n content: [],\r\n footnotes: [],\r\n };\r\n\r\n for (let content of this.iterateChapterContent(\r\n chapter,\r\n iterator\r\n )) {\r\n chapter.content.push(content);\r\n }\r\n\r\n yield chapter;\r\n } else if (child.nodeName === 'para') {\r\n const style = child.getAttribute('style');\r\n if (\r\n style === 's1' ||\r\n style === 's2' ||\r\n style === 's3' ||\r\n style === 's4'\r\n ) {\r\n yield {\r\n type: 'heading',\r\n content: child.textContent ? [child.textContent] : [],\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n *iterateChapterContent(\r\n chapter: Chapter,\r\n nodes: RewindableIterator<Node>\r\n ): IterableIterator<ChapterContent> {\r\n while (true) {\r\n const { done, value: element } = nodes.next();\r\n if (done) {\r\n break;\r\n }\r\n\r\n if (!(element instanceof Element)) {\r\n continue;\r\n }\r\n\r\n if (element.nodeName === 'chapter') {\r\n break;\r\n } else if (element.nodeName === 'para') {\r\n const style = element.getAttribute('style');\r\n if (\r\n style === 's1' ||\r\n style === 's2' ||\r\n style === 's3' ||\r\n style === 's4'\r\n ) {\r\n yield {\r\n type: 'heading',\r\n content: element.textContent\r\n ? [element.textContent]\r\n : [],\r\n };\r\n } else if (style === 'b') {\r\n yield {\r\n type: 'line_break',\r\n };\r\n } else if (style === 'd') {\r\n yield* this.parseHebrewSubtitle(element, chapter, nodes);\r\n }\r\n } else if (element.nodeName === 'verse') {\r\n if (element.hasAttribute('eid')) {\r\n continue;\r\n }\r\n\r\n yield this.parseVerse(element, chapter, nodes);\r\n }\r\n }\r\n }\r\n\r\n *iterateVerseContent(\r\n chapter: Chapter,\r\n verse: Verse,\r\n nodes: RewindableIterator<Node>\r\n ): IterableIterator<string | FootnoteReference | Text | InlineLineBreak> {\r\n while (true) {\r\n const { done, value: node } = nodes.next();\r\n if (done) {\r\n break;\r\n }\r\n\r\n if (node.nodeName === 'verse') {\r\n break;\r\n }\r\n\r\n const parent = node.parentElement!;\r\n let poem: number | null = null;\r\n let descriptive: boolean | null = null;\r\n\r\n if (parent.nodeName === 'para') {\r\n const style = parent.getAttribute('style');\r\n if (\r\n style === 'q1' ||\r\n style === 'q2' ||\r\n style === 'q3' ||\r\n style === 'q4'\r\n ) {\r\n poem =\r\n style === 'q1'\r\n ? 1\r\n : style === 'q2'\r\n ? 2\r\n : style === 'q3'\r\n ? 3\r\n : 4;\r\n } else if (style === 'd') {\r\n descriptive = true;\r\n }\r\n }\r\n\r\n for (let content of this.iterateNodeTextContent(\r\n nodes,\r\n node,\r\n chapter,\r\n verse\r\n )) {\r\n if (poem !== null || descriptive !== null) {\r\n if (typeof content === 'string') {\r\n let text: Text = {\r\n text: content,\r\n };\r\n\r\n if (poem !== null) {\r\n text.poem = poem;\r\n }\r\n\r\n if (descriptive !== null) {\r\n text.descriptive = true;\r\n }\r\n\r\n yield text;\r\n } else {\r\n let text:\r\n | InlineLineBreak\r\n | InlineHeading\r\n | FootnoteReference\r\n | Text = {\r\n ...content,\r\n };\r\n\r\n if ('text' in text) {\r\n if (poem !== null) {\r\n text.poem = poem;\r\n }\r\n\r\n if (descriptive !== null) {\r\n text.descriptive = true;\r\n }\r\n }\r\n yield text;\r\n }\r\n } else {\r\n yield content;\r\n }\r\n }\r\n }\r\n }\r\n\r\n parseVerse(\r\n element: Element,\r\n chapter: Chapter,\r\n nodes: RewindableIterator<Node>\r\n ): Verse {\r\n const verse: Verse = {\r\n type: 'verse',\r\n number: parseInt(element.getAttribute('number') || '0', 10),\r\n content: [],\r\n };\r\n\r\n for (let content of this.iterateVerseContent(chapter, verse, nodes)) {\r\n addOrJoin(verse.content, content);\r\n }\r\n\r\n trimContent(verse.content);\r\n return verse;\r\n }\r\n\r\n *parseHebrewSubtitle(\r\n para: Element,\r\n chapter: Chapter,\r\n nodes: RewindableIterator<Node>\r\n ): IterableIterator<HebrewSubtitle | Verse> {\r\n const subtitle: HebrewSubtitle = {\r\n type: 'hebrew_subtitle',\r\n content: [],\r\n };\r\n\r\n for (let content of this.iterateHebrewSubtitleContent(\r\n para,\r\n chapter,\r\n nodes\r\n )) {\r\n if (typeof content === 'object' && 'number' in content) {\r\n yield content;\r\n continue;\r\n }\r\n addOrJoin(subtitle.content, content);\r\n }\r\n\r\n trimContent(subtitle.content);\r\n if (subtitle.content.length > 0) {\r\n yield subtitle;\r\n }\r\n }\r\n\r\n *iterateHebrewSubtitleContent(\r\n element: Element,\r\n chapter: Chapter,\r\n nodes: RewindableIterator<Node>\r\n ): IterableIterator<\r\n Verse | string | Text | FootnoteReference | InlineLineBreak\r\n > {\r\n while (true) {\r\n const { done, value: node } = nodes.next();\r\n if (done) {\r\n break;\r\n }\r\n\r\n if (!isParent(node, element)) {\r\n nodes.rewind(1);\r\n break;\r\n }\r\n\r\n if (node instanceof Element && node.nodeName === 'verse') {\r\n yield this.parseVerse(node, chapter, nodes);\r\n } else {\r\n yield* this.iterateNodeTextContent(nodes, node, chapter);\r\n }\r\n }\r\n }\r\n\r\n *iterateNodeTextContent(\r\n nodes: RewindableIterator<Node>,\r\n node: Node,\r\n chapter: Chapter,\r\n verse?: Verse\r\n ): IterableIterator<string | Text | FootnoteReference | InlineLineBreak> {\r\n if (node instanceof Element && node.nodeName === 'note') {\r\n yield* this.iterateNote(nodes, node, chapter, verse);\r\n } else if (node instanceof Element && node.nodeName === 'char') {\r\n yield* this.iterateChar(nodes, node);\r\n } else if (\r\n node instanceof Element &&\r\n node.nodeName === 'para' &&\r\n node.getAttribute('style') === 'b'\r\n ) {\r\n for (let _ of children(nodes, node)) {\r\n // iterate through all the children to prevent iterating over them multiple times\r\n }\r\n yield {\r\n lineBreak: true,\r\n };\r\n } else if (node.nodeType === NodeType.Text) {\r\n yield node.textContent || '';\r\n }\r\n }\r\n\r\n *iterateCharContent(char: Element): IterableIterator<string | Text> {\r\n const style = char.getAttribute('style');\r\n const text = trimText(char.textContent || '');\r\n if (style === 'wj') {\r\n yield {\r\n text,\r\n wordsOfJesus: true,\r\n };\r\n } else {\r\n yield text;\r\n }\r\n }\r\n\r\n *iterateNote(\r\n nodes: RewindableIterator<Node>,\r\n node: Element,\r\n chapter: Chapter,\r\n verse?: Verse\r\n ): IterableIterator<FootnoteReference> {\r\n const style = node.getAttribute('style');\r\n if (style === 'f') {\r\n const verseReferenceRegex = /^[0-9]{1,3}:[0-9]{1,3}/;\r\n\r\n let text = '';\r\n for (let child of children(nodes, node)) {\r\n if (child.nodeType === NodeType.Text) {\r\n text += child.textContent || '';\r\n }\r\n }\r\n\r\n text = text.trim();\r\n if (verseReferenceRegex.test(text)) {\r\n text = text.replace(verseReferenceRegex, '').trim();\r\n }\r\n\r\n const note: Footnote = {\r\n noteId: this._noteCounter++,\r\n caller: node.getAttribute('caller') || null,\r\n text,\r\n reference: {\r\n chapter: chapter.number,\r\n verse: verse?.number ?? 0,\r\n },\r\n };\r\n\r\n chapter.footnotes.push(note);\r\n\r\n yield {\r\n noteId: note.noteId,\r\n };\r\n } else {\r\n for (let _ of children(nodes, node)) {\r\n // iterate through all the children\r\n // so that we don't end up with duplicates\r\n }\r\n }\r\n }\r\n\r\n *iterateChar(\r\n nodes: RewindableIterator<Node>,\r\n node: Element\r\n ): IterableIterator<string | Text> {\r\n const style = node.getAttribute('style');\r\n let text = '';\r\n\r\n for (let char of children(nodes, node)) {\r\n if (char.nodeType === NodeType.Text) {\r\n text += char.textContent || '';\r\n }\r\n }\r\n\r\n if (style === 'wj') {\r\n yield {\r\n text,\r\n wordsOfJesus: true,\r\n };\r\n } else {\r\n yield text;\r\n }\r\n\r\n // if (!parentChar(node) && !parentNote(node)) {\r\n // yield *iterateCharContent(node);\r\n // }\r\n }\r\n}\r\n\r\n// Taken from https://github.com/gracious-tech/fetch/blob/1576cc4eafb32bf347a09332094cf17c2231c90c/converters/usx-to-json/src/elements.ts#L16\r\nconst ignoredParaStyles = new Set([\r\n // <para> Identification [exclude all] - Running headings & table of contents\r\n 'ide', // See https://github.com/schierlm/BibleMultiConverter/issues/67\r\n 'rem', // Remarks (valid in schema though missed in docs)\r\n 'h',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'toc1',\r\n 'toc2',\r\n 'toc3',\r\n 'toca1',\r\n 'toca2',\r\n 'toca3',\r\n\r\n /* <para> Introductions [exclude all] - Introductionary (non-biblical) content\r\n Which might be helpful in a printed book, but intro material in apps is usually bad UX,\r\n and users that really care can research a translations methodology themselves\r\n */\r\n 'imt',\r\n 'imt1',\r\n 'imt2',\r\n 'imt3',\r\n 'imt4',\r\n 'is',\r\n 'is1',\r\n 'is2',\r\n 'is3',\r\n 'is4',\r\n 'ip',\r\n 'ipi',\r\n 'im',\r\n 'imi',\r\n 'ipq',\r\n 'imq',\r\n 'ipr',\r\n 'iq',\r\n 'iq1',\r\n 'iq2',\r\n 'iq3',\r\n 'iq4',\r\n 'ib',\r\n 'ili',\r\n 'ili1',\r\n 'ili2',\r\n 'ili3',\r\n 'ili4',\r\n 'iot',\r\n 'io',\r\n 'io1',\r\n 'io2',\r\n 'io3',\r\n 'io4',\r\n 'iex',\r\n 'imte',\r\n 'ie',\r\n\r\n /* <para> Headings [exclude some] - Exclude book & chapter headings but keep section headings\r\n Not excluded: ms# | mr | s# | sr | d | sp | sd#\r\n */\r\n 'mt',\r\n 'mt1',\r\n 'mt2',\r\n 'mt3',\r\n 'mt4',\r\n 'mte',\r\n 'mte1',\r\n 'mte2',\r\n 'mte3',\r\n 'mte4',\r\n 'cl',\r\n 'cd', // Non-biblical chapter summary, more than heading\r\n 'r', // Parallels to be provided by external data\r\n]);\r\n\r\nfunction* iterateCharContent(char: Element): IterableIterator<string | Text> {\r\n const style = char.getAttribute('style');\r\n const text = trimText(char.textContent || '');\r\n if (style === 'wj') {\r\n yield {\r\n text,\r\n wordsOfJesus: true,\r\n };\r\n } else {\r\n yield text;\r\n }\r\n}\r\n\r\nfunction trimText(text: string): string {\r\n return text.replace(/\\s+/g, ' ');\r\n}\r\n\r\nfunction trimContent<T extends string | unknown>(content: T[]): T[] {\r\n for (let i = 0; i < content.length; i++) {\r\n const value = content[i];\r\n if (typeof value === 'string') {\r\n content[i] = trimText(value as string).trim() as T;\r\n if (content[i] === '') {\r\n content.splice(i, 1);\r\n i--;\r\n continue;\r\n }\r\n } else if (isVerseText(value)) {\r\n value.text = trimText(value.text).trim();\r\n if (value.text === '') {\r\n content.splice(i, 1);\r\n i--;\r\n continue;\r\n }\r\n }\r\n }\r\n return content;\r\n}\r\n\r\nfunction addOrJoin(array: (string | unknown)[], value: string | unknown) {\r\n if (array.length === 0) {\r\n array.push(value);\r\n } else {\r\n const last = array[array.length - 1];\r\n if (typeof last === 'string' && typeof value === 'string') {\r\n array[array.length - 1] = last + value;\r\n } else if (\r\n isVerseText(last) &&\r\n isVerseText(value) &&\r\n hasSameFormatting(last, value)\r\n ) {\r\n last.text += value.text;\r\n } else {\r\n array.push(value);\r\n }\r\n }\r\n}\r\n\r\nfunction isVerseText(value: unknown): value is Text {\r\n return typeof value === 'object' && value !== null && 'text' in value;\r\n}\r\n\r\nfunction hasSameFormatting(a: Text, b: Text): boolean {\r\n return a.poem === b.poem && a.wordsOfJesus === b.wordsOfJesus;\r\n}\r\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import {\n Chapter,\n ChapterContent,\n Footnote,\n FootnoteReference,\n ParseTree,\n Verse,\n Text,\n HebrewSubtitle,\n InlineLineBreak,\n InlineHeading,\n} from './types.js';\nimport {\n iterateAll,\n children,\n RewindableIterator,\n isParent,\n} from './iterators.js';\n\nenum NodeType {\n Text = 3,\n}\n\n/**\n * The version of the parser.\n * Used to determine whether input files need to be re-parsed.\n */\nexport const PARSER_VERSION = '2';\n\n/**\n * Defines a class that is able to parse USX content.\n */\nexport class USXParser {\n private _domParser: DOMParser;\n private _noteCounter: number = 0;\n\n constructor(domParser: DOMParser) {\n this._domParser = domParser;\n }\n\n /**\n * Parses the specified USX content.\n *\n * @param usx The USX content to parse.\n * @returns The parse tree that was generated.\n */\n public parse(usx: string): ParseTree {\n const parser = this._domParser;\n const doc = parser.parseFromString(usx, 'application/xml');\n const usxElement = doc.documentElement;\n\n let root: ParseTree = {\n type: 'root',\n content: [],\n };\n\n const bookElement = usxElement.querySelector('book[code]');\n\n if (!bookElement) {\n throw new Error('The USX content does not contain a book element.');\n }\n\n const bookCode = bookElement.getAttribute('code') || '';\n\n if (!bookCode) {\n throw new Error(\n 'The book element does not contain a code attribute.'\n );\n }\n\n root.id = bookCode;\n\n const header = usxElement.querySelector('para[style=\"h\"]');\n if (header) {\n root.header = header.textContent || '';\n }\n\n const titles = usxElement.querySelectorAll(\n 'para[style=\"mt1\"], para[style=\"mt2\"], para[style=\"mt3\"]'\n );\n // const title2 = usxElement.querySelector('para[style=\"mt2\"]');\n // const title3 = usxElement.querySelector('para[style=\"mt3\"]');\n\n if (titles.length > 0) {\n root.title = [...titles]\n .map((t) => t.textContent)\n .filter((t) => t)\n .join(' ');\n }\n\n for (let content of this.iterateRootContent(usxElement)) {\n root.content.push(content);\n }\n\n return root;\n }\n\n *iterateRootContent(\n usxElement: Element\n ): Generator<ParseTree['content'][0]> {\n const iterator = iterateAll(usxElement);\n while (true) {\n const { done, value: child } = iterator.next();\n if (done) {\n break;\n }\n\n if (!(child instanceof Element)) {\n continue;\n }\n\n if (child.nodeName === 'chapter') {\n if (child.hasAttribute('eid')) {\n continue;\n }\n\n const chapter: Chapter = {\n type: 'chapter',\n number: parseInt(child.getAttribute('number') || '0', 10),\n content: [],\n footnotes: [],\n };\n\n for (let content of this.iterateChapterContent(\n chapter,\n iterator\n )) {\n chapter.content.push(content);\n }\n\n yield chapter;\n } else if (child.nodeName === 'para') {\n const style = child.getAttribute('style');\n if (\n style === 's1' ||\n style === 's2' ||\n style === 's3' ||\n style === 's4'\n ) {\n yield {\n type: 'heading',\n content: child.textContent ? [child.textContent] : [],\n };\n }\n }\n }\n }\n\n *iterateChapterContent(\n chapter: Chapter,\n nodes: RewindableIterator<Node>\n ): IterableIterator<ChapterContent> {\n while (true) {\n const { done, value: element } = nodes.next();\n if (done) {\n break;\n }\n\n if (!(element instanceof Element)) {\n continue;\n }\n\n if (element.nodeName === 'chapter') {\n break;\n } else if (element.nodeName === 'para') {\n const style = element.getAttribute('style');\n if (\n style === 's1' ||\n style === 's2' ||\n style === 's3' ||\n style === 's4'\n ) {\n yield {\n type: 'heading',\n content: element.textContent\n ? [element.textContent]\n : [],\n };\n } else if (style === 'b') {\n yield {\n type: 'line_break',\n };\n } else if (style === 'd') {\n yield* this.parseHebrewSubtitle(element, chapter, nodes);\n }\n } else if (element.nodeName === 'verse') {\n if (element.hasAttribute('eid')) {\n continue;\n }\n\n yield this.parseVerse(element, chapter, nodes);\n }\n }\n }\n\n *iterateVerseContent(\n chapter: Chapter,\n verse: Verse,\n nodes: RewindableIterator<Node>\n ): IterableIterator<string | FootnoteReference | Text | InlineLineBreak> {\n let lastParent: Element | null = null;\n while (true) {\n const { done, value: node } = nodes.next();\n if (done) {\n break;\n }\n\n if (node.nodeName === 'verse') {\n break;\n }\n\n const parent = node.parentElement!;\n let poem: number | null = null;\n let descriptive: boolean | null = null;\n\n if (parent.nodeName === 'para') {\n const style = parent.getAttribute('style');\n if (\n style === 'q1' ||\n style === 'q2' ||\n style === 'q3' ||\n style === 'q4'\n ) {\n poem =\n style === 'q1'\n ? 1\n : style === 'q2'\n ? 2\n : style === 'q3'\n ? 3\n : 4;\n\n // Send explicit line breaks\n // if we are in a new paragraph but the previous paragraph had the same poem style\n if (parent.previousElementSibling?.nodeName === 'para') {\n const previousStyle =\n parent.previousElementSibling?.getAttribute(\n 'style'\n );\n if (previousStyle === style && lastParent !== parent) {\n lastParent = parent;\n yield {\n lineBreak: true,\n };\n }\n }\n } else if (style === 'd') {\n descriptive = true;\n }\n }\n\n for (let content of this.iterateNodeTextContent(\n nodes,\n node,\n chapter,\n verse\n )) {\n if (poem !== null || descriptive !== null) {\n if (typeof content === 'string') {\n let text: Text = {\n text: content,\n };\n\n if (poem !== null) {\n text.poem = poem;\n }\n\n if (descriptive !== null) {\n text.descriptive = true;\n }\n\n yield text;\n } else {\n let text:\n | InlineLineBreak\n | InlineHeading\n | FootnoteReference\n | Text = {\n ...content,\n };\n\n if ('text' in text) {\n if (poem !== null) {\n text.poem = poem;\n }\n\n if (descriptive !== null) {\n text.descriptive = true;\n }\n }\n yield text;\n }\n } else {\n yield content;\n }\n }\n }\n }\n\n parseVerse(\n element: Element,\n chapter: Chapter,\n nodes: RewindableIterator<Node>\n ): Verse {\n const verse: Verse = {\n type: 'verse',\n number: parseInt(element.getAttribute('number') || '0', 10),\n content: [],\n };\n\n for (let content of this.iterateVerseContent(chapter, verse, nodes)) {\n addOrJoin(verse.content, content);\n }\n\n trimContent(verse.content);\n return verse;\n }\n\n *parseHebrewSubtitle(\n para: Element,\n chapter: Chapter,\n nodes: RewindableIterator<Node>\n ): IterableIterator<HebrewSubtitle | Verse> {\n const subtitle: HebrewSubtitle = {\n type: 'hebrew_subtitle',\n content: [],\n };\n\n for (let content of this.iterateHebrewSubtitleContent(\n para,\n chapter,\n nodes\n )) {\n if (typeof content === 'object' && 'number' in content) {\n yield content;\n continue;\n }\n addOrJoin(subtitle.content, content);\n }\n\n trimContent(subtitle.content);\n if (subtitle.content.length > 0) {\n yield subtitle;\n }\n }\n\n *iterateHebrewSubtitleContent(\n element: Element,\n chapter: Chapter,\n nodes: RewindableIterator<Node>\n ): IterableIterator<\n Verse | string | Text | FootnoteReference | InlineLineBreak\n > {\n while (true) {\n const { done, value: node } = nodes.next();\n if (done) {\n break;\n }\n\n if (!isParent(node, element)) {\n nodes.rewind(1);\n break;\n }\n\n if (node instanceof Element && node.nodeName === 'verse') {\n yield this.parseVerse(node, chapter, nodes);\n } else {\n yield* this.iterateNodeTextContent(nodes, node, chapter);\n }\n }\n }\n\n *iterateNodeTextContent(\n nodes: RewindableIterator<Node>,\n node: Node,\n chapter: Chapter,\n verse?: Verse\n ): IterableIterator<string | Text | FootnoteReference | InlineLineBreak> {\n if (node instanceof Element && node.nodeName === 'note') {\n yield* this.iterateNote(nodes, node, chapter, verse);\n } else if (node instanceof Element && node.nodeName === 'char') {\n yield* this.iterateChar(nodes, node);\n } else if (\n node instanceof Element &&\n node.nodeName === 'para' &&\n node.getAttribute('style') === 'b'\n ) {\n for (let _ of children(nodes, node)) {\n // iterate through all the children to prevent iterating over them multiple times\n }\n yield {\n lineBreak: true,\n };\n } else if (node.nodeType === NodeType.Text) {\n yield node.textContent || '';\n }\n }\n\n *iterateCharContent(char: Element): IterableIterator<string | Text> {\n const style = char.getAttribute('style');\n const text = trimText(char.textContent || '');\n if (style === 'wj') {\n yield {\n text,\n wordsOfJesus: true,\n };\n } else {\n yield text;\n }\n }\n\n *iterateNote(\n nodes: RewindableIterator<Node>,\n node: Element,\n chapter: Chapter,\n verse?: Verse\n ): IterableIterator<FootnoteReference> {\n const style = node.getAttribute('style');\n if (style === 'f') {\n const verseReferenceRegex = /^[0-9]{1,3}:[0-9]{1,3}/;\n\n let text = '';\n for (let child of children(nodes, node)) {\n if (child.nodeType === NodeType.Text) {\n text += child.textContent || '';\n }\n }\n\n text = text.trim();\n if (verseReferenceRegex.test(text)) {\n text = text.replace(verseReferenceRegex, '').trim();\n }\n\n const note: Footnote = {\n noteId: this._noteCounter++,\n caller: node.getAttribute('caller') || null,\n text,\n reference: {\n chapter: chapter.number,\n verse: verse?.number ?? 0,\n },\n };\n\n chapter.footnotes.push(note);\n\n yield {\n noteId: note.noteId,\n };\n } else {\n for (let _ of children(nodes, node)) {\n // iterate through all the children\n // so that we don't end up with duplicates\n }\n }\n }\n\n *iterateChar(\n nodes: RewindableIterator<Node>,\n node: Element\n ): IterableIterator<string | Text> {\n const style = node.getAttribute('style');\n let text = '';\n\n for (let char of children(nodes, node)) {\n if (char.nodeType === NodeType.Text) {\n text += char.textContent || '';\n }\n }\n\n if (style === 'wj') {\n yield {\n text,\n wordsOfJesus: true,\n };\n } else {\n yield text;\n }\n\n // if (!parentChar(node) && !parentNote(node)) {\n // yield *iterateCharContent(node);\n // }\n }\n}\n\n// Taken from https://github.com/gracious-tech/fetch/blob/1576cc4eafb32bf347a09332094cf17c2231c90c/converters/usx-to-json/src/elements.ts#L16\nconst ignoredParaStyles = new Set([\n // <para> Identification [exclude all] - Running headings & table of contents\n 'ide', // See https://github.com/schierlm/BibleMultiConverter/issues/67\n 'rem', // Remarks (valid in schema though missed in docs)\n 'h',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'toc1',\n 'toc2',\n 'toc3',\n 'toca1',\n 'toca2',\n 'toca3',\n\n /* <para> Introductions [exclude all] - Introductionary (non-biblical) content\n Which might be helpful in a printed book, but intro material in apps is usually bad UX,\n and users that really care can research a translations methodology themselves\n */\n 'imt',\n 'imt1',\n 'imt2',\n 'imt3',\n 'imt4',\n 'is',\n 'is1',\n 'is2',\n 'is3',\n 'is4',\n 'ip',\n 'ipi',\n 'im',\n 'imi',\n 'ipq',\n 'imq',\n 'ipr',\n 'iq',\n 'iq1',\n 'iq2',\n 'iq3',\n 'iq4',\n 'ib',\n 'ili',\n 'ili1',\n 'ili2',\n 'ili3',\n 'ili4',\n 'iot',\n 'io',\n 'io1',\n 'io2',\n 'io3',\n 'io4',\n 'iex',\n 'imte',\n 'ie',\n\n /* <para> Headings [exclude some] - Exclude book & chapter headings but keep section headings\n Not excluded: ms# | mr | s# | sr | d | sp | sd#\n */\n 'mt',\n 'mt1',\n 'mt2',\n 'mt3',\n 'mt4',\n 'mte',\n 'mte1',\n 'mte2',\n 'mte3',\n 'mte4',\n 'cl',\n 'cd', // Non-biblical chapter summary, more than heading\n 'r', // Parallels to be provided by external data\n]);\n\nfunction* iterateCharContent(char: Element): IterableIterator<string | Text> {\n const style = char.getAttribute('style');\n const text = trimText(char.textContent || '');\n if (style === 'wj') {\n yield {\n text,\n wordsOfJesus: true,\n };\n } else {\n yield text;\n }\n}\n\nfunction trimText(text: string): string {\n return text.replace(/\\s+/g, ' ');\n}\n\nfunction trimContent<T extends string | unknown>(content: T[]): T[] {\n for (let i = 0; i < content.length; i++) {\n const value = content[i];\n if (typeof value === 'string') {\n content[i] = trimText(value as string).trim() as T;\n if (content[i] === '') {\n content.splice(i, 1);\n i--;\n continue;\n }\n } else if (isVerseText(value)) {\n value.text = trimText(value.text).trim();\n if (value.text === '') {\n content.splice(i, 1);\n i--;\n continue;\n }\n }\n }\n return content;\n}\n\nfunction addOrJoin(array: (string | unknown)[], value: string | unknown) {\n if (array.length === 0) {\n array.push(value);\n } else {\n const last = array[array.length - 1];\n if (typeof last === 'string' && typeof value === 'string') {\n array[array.length - 1] = last + value;\n } else if (\n isVerseText(last) &&\n isVerseText(value) &&\n hasSameFormatting(last, value)\n ) {\n last.text += value.text;\n } else {\n array.push(value);\n }\n }\n}\n\nfunction isVerseText(value: unknown): value is Text {\n return typeof value === 'object' && value !== null && 'text' in value;\n}\n\nfunction hasSameFormatting(a: Text, b: Text): boolean {\n return a.poem === b.poem && a.wordsOfJesus === b.wordsOfJesus;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["NodeType"]
|
|
7
7
|
}
|
package/dist/cjs/utils.cjs
CHANGED
|
@@ -18,6 +18,7 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var utils_exports = {};
|
|
20
20
|
__export(utils_exports, {
|
|
21
|
+
getBookId: () => getBookId,
|
|
21
22
|
getFirstNonEmpty: () => getFirstNonEmpty,
|
|
22
23
|
getTranslationId: () => getTranslationId,
|
|
23
24
|
isEmptyOrWhitespace: () => isEmptyOrWhitespace,
|
|
@@ -50,7 +51,7 @@ function getFirstNonEmpty(...values) {
|
|
|
50
51
|
throw new Error("All values are empty or whitespace!");
|
|
51
52
|
}
|
|
52
53
|
function parseVerseReference(text) {
|
|
53
|
-
const match = text.match(/^\s*([
|
|
54
|
+
const match = text.match(/^\s*([0-9A-Za-z\s]+)\s+(\d+):(\d+)/);
|
|
54
55
|
if (!match) {
|
|
55
56
|
return null;
|
|
56
57
|
}
|
|
@@ -62,20 +63,171 @@ function parseVerseReference(text) {
|
|
|
62
63
|
}
|
|
63
64
|
if (reference.length !== text.length) {
|
|
64
65
|
return {
|
|
65
|
-
book,
|
|
66
|
+
book: getBookId(book) ?? book,
|
|
66
67
|
chapter,
|
|
67
68
|
verse,
|
|
68
69
|
content: text.substring(reference.length).trim()
|
|
69
70
|
};
|
|
70
71
|
}
|
|
71
72
|
return {
|
|
72
|
-
book,
|
|
73
|
+
book: getBookId(book) ?? book,
|
|
73
74
|
chapter,
|
|
74
75
|
verse
|
|
75
76
|
};
|
|
76
77
|
}
|
|
78
|
+
const BOOK_ID_MAP = /* @__PURE__ */ new Map([
|
|
79
|
+
["gen", "GEN"],
|
|
80
|
+
["genesis", "GEN"],
|
|
81
|
+
["exo", "EXO"],
|
|
82
|
+
["exodus", "EXO"],
|
|
83
|
+
["lev", "LEV"],
|
|
84
|
+
["lev", "LEV"],
|
|
85
|
+
["laviticus", "LEV"],
|
|
86
|
+
["num", "NUM"],
|
|
87
|
+
["numbers", "NUM"],
|
|
88
|
+
["deu", "DEU"],
|
|
89
|
+
["deuteronomy", "DEU"],
|
|
90
|
+
["jos", "JOS"],
|
|
91
|
+
["joshua", "JOS"],
|
|
92
|
+
["jdg", "JDG"],
|
|
93
|
+
["judges", "JDG"],
|
|
94
|
+
["rut", "RUT"],
|
|
95
|
+
["ruth", "RUT"],
|
|
96
|
+
["1sa", "1SA"],
|
|
97
|
+
["1samuel", "1SA"],
|
|
98
|
+
["2sa", "2SA"],
|
|
99
|
+
["2samuel", "2SA"],
|
|
100
|
+
["1ki", "1KI"],
|
|
101
|
+
["1kings", "1KI"],
|
|
102
|
+
["2ki", "2KI"],
|
|
103
|
+
["2kings", "2KI"],
|
|
104
|
+
["1ch", "1CH"],
|
|
105
|
+
["1chronicles", "1CH"],
|
|
106
|
+
["chronicles1", "1CH"],
|
|
107
|
+
["2ch", "2CH"],
|
|
108
|
+
["2chronicles", "2CH"],
|
|
109
|
+
["chronicles2", "2CH"],
|
|
110
|
+
["ezr", "EZR"],
|
|
111
|
+
["ezra", "EZR"],
|
|
112
|
+
["neh", "NEH"],
|
|
113
|
+
["nehemiah", "NEH"],
|
|
114
|
+
["est", "EST"],
|
|
115
|
+
["ester", "EST"],
|
|
116
|
+
["job", "JOB"],
|
|
117
|
+
["psa", "PSA"],
|
|
118
|
+
["psalms", "PSA"],
|
|
119
|
+
["psalm", "PSA"],
|
|
120
|
+
["pro", "PRO"],
|
|
121
|
+
["proverbs", "PRO"],
|
|
122
|
+
["ecc", "ECC"],
|
|
123
|
+
["ecclesiastes", "ECC"],
|
|
124
|
+
["sng", "SNG"],
|
|
125
|
+
["songofsolomon", "SNG"],
|
|
126
|
+
["isa", "ISA"],
|
|
127
|
+
["isaiah", "ISA"],
|
|
128
|
+
["jer", "JER"],
|
|
129
|
+
["jeremiah", "JER"],
|
|
130
|
+
["lam", "LAM"],
|
|
131
|
+
["lamentations", "LAM"],
|
|
132
|
+
["ezk", "EZK"],
|
|
133
|
+
["ezekiel", "EZK"],
|
|
134
|
+
["dan", "DAN"],
|
|
135
|
+
["daniel", "DAN"],
|
|
136
|
+
["hos", "HOS"],
|
|
137
|
+
["hosea", "HOS"],
|
|
138
|
+
["jol", "JOL"],
|
|
139
|
+
["joel", "JOL"],
|
|
140
|
+
["amo", "AMO"],
|
|
141
|
+
["amos", "AMO"],
|
|
142
|
+
["oba", "OBA"],
|
|
143
|
+
["obadiah", "OBA"],
|
|
144
|
+
["jon", "JON"],
|
|
145
|
+
["jonah", "JON"],
|
|
146
|
+
["mic", "MIC"],
|
|
147
|
+
["micah", "MIC"],
|
|
148
|
+
["nam", "NAM"],
|
|
149
|
+
["nahum", "NAM"],
|
|
150
|
+
["hab", "HAB"],
|
|
151
|
+
["habakkuk", "HAB"],
|
|
152
|
+
["zep", "ZEP"],
|
|
153
|
+
["zepaniah", "ZEP"],
|
|
154
|
+
["hag", "HAG"],
|
|
155
|
+
["haggai", "HAG"],
|
|
156
|
+
["zec", "ZEC"],
|
|
157
|
+
["zechariah", "ZEC"],
|
|
158
|
+
["mal", "MAL"],
|
|
159
|
+
["malachi", "MAL"],
|
|
160
|
+
["mat", "MAT"],
|
|
161
|
+
["matthew", "MAT"],
|
|
162
|
+
["mrk", "MRK"],
|
|
163
|
+
["mark", "MRK"],
|
|
164
|
+
["luk", "LUK"],
|
|
165
|
+
["luke", "LUK"],
|
|
166
|
+
["jhn", "JHN"],
|
|
167
|
+
["john", "JHN"],
|
|
168
|
+
["act", "ACT"],
|
|
169
|
+
["acts", "ACT"],
|
|
170
|
+
["rom", "ROM"],
|
|
171
|
+
["romans", "ROM"],
|
|
172
|
+
["1co", "1CO"],
|
|
173
|
+
["1corinthians", "1CO"],
|
|
174
|
+
["2co", "2CO"],
|
|
175
|
+
["2corinthians", "2CO"],
|
|
176
|
+
["gal", "GAL"],
|
|
177
|
+
["galatians", "GAL"],
|
|
178
|
+
["eph", "EPH"],
|
|
179
|
+
["ephesians", "EPH"],
|
|
180
|
+
["php", "PHP"],
|
|
181
|
+
["philippians", "PHP"],
|
|
182
|
+
["col", "COL"],
|
|
183
|
+
["colossians", "COL"],
|
|
184
|
+
["1th", "1TH"],
|
|
185
|
+
["1thessalonians", "1TH"],
|
|
186
|
+
["2th", "2TH"],
|
|
187
|
+
["2thessalonians", "2TH"],
|
|
188
|
+
["1ti", "1TI"],
|
|
189
|
+
["1timothy", "1TI"],
|
|
190
|
+
["2ti", "2TI"],
|
|
191
|
+
["2timothy", "2TI"],
|
|
192
|
+
["tit", "TIT"],
|
|
193
|
+
["titus", "TIT"],
|
|
194
|
+
["phm", "PHM"],
|
|
195
|
+
["philemon", "PHM"],
|
|
196
|
+
["heb", "HEB"],
|
|
197
|
+
["hebrews", "HEB"],
|
|
198
|
+
["jas", "JAS"],
|
|
199
|
+
["james", "JAS"],
|
|
200
|
+
["1pe", "1PE"],
|
|
201
|
+
["1peter", "1PE"],
|
|
202
|
+
["2pe", "2PE"],
|
|
203
|
+
["2peter", "2PE"],
|
|
204
|
+
["1jn", "1JN"],
|
|
205
|
+
["1john", "1JN"],
|
|
206
|
+
["2jn", "2JN"],
|
|
207
|
+
["2john", "2JN"],
|
|
208
|
+
["3jn", "3JN"],
|
|
209
|
+
["3john", "3JN"],
|
|
210
|
+
["jud", "JUD"],
|
|
211
|
+
["jude", "JUD"],
|
|
212
|
+
["rev", "REV"],
|
|
213
|
+
["revelation", "REV"]
|
|
214
|
+
]);
|
|
215
|
+
function getBookId(book) {
|
|
216
|
+
const bookLower = book.toLowerCase().replaceAll(/\s+/g, "");
|
|
217
|
+
const id = BOOK_ID_MAP.get(bookLower);
|
|
218
|
+
if (id) {
|
|
219
|
+
return id;
|
|
220
|
+
}
|
|
221
|
+
for (let [key, id2] of BOOK_ID_MAP) {
|
|
222
|
+
if (bookLower.startsWith(key)) {
|
|
223
|
+
return id2;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
77
228
|
// Annotate the CommonJS export names for ESM import in node:
|
|
78
229
|
0 && (module.exports = {
|
|
230
|
+
getBookId,
|
|
79
231
|
getFirstNonEmpty,
|
|
80
232
|
getTranslationId,
|
|
81
233
|
isEmptyOrWhitespace,
|
package/dist/cjs/utils.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../utils.ts"],
|
|
4
|
-
"sourcesContent": ["
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["/**\r\n * Normalizes the given language code into a ISO 639 code.\r\n * @param language The language code to normalize.\r\n */\r\nexport function normalizeLanguage(language: string): string {\r\n return language;\r\n}\r\n\r\n/**\r\n * The map of translation IDs from fetch.bible to their translation ID in the API.\r\n */\r\nconst TRANSLATION_ID_MAP: Map<string, string> = new Map([\r\n ['eng_bsb', 'BSB'],\r\n ['arb_nav', 'ARBNAV'],\r\n ['eng_webp', 'ENGWEBP'],\r\n ['hin_irv', 'HINIRV'],\r\n ['hbo_mas', 'HBOMAS'],\r\n]);\r\n\r\n/**\r\n * Gets the ID of the translation.\r\n * @param translation The translation to get the ID for.\r\n */\r\nexport function getTranslationId(translationId: string): string {\r\n return TRANSLATION_ID_MAP.get(translationId) ?? translationId;\r\n}\r\n\r\nexport function isEmptyOrWhitespace(str: string | null | undefined): boolean {\r\n return !str || /^\\s*$/.test(str);\r\n}\r\n\r\nexport function getFirstNonEmpty<T extends string>(...values: T[]): T {\r\n for (let value of values) {\r\n if (!isEmptyOrWhitespace(value)) {\r\n return value;\r\n }\r\n }\r\n\r\n throw new Error('All values are empty or whitespace!');\r\n}\r\n\r\nexport interface VerseRef {\r\n book: string;\r\n chapter: number;\r\n verse: number;\r\n\r\n /**\r\n * The rest of the content of the verse.\r\n */\r\n content?: string;\r\n}\r\n\r\n/**\r\n * Parses the given verse reference.\r\n * Formatted like \"GEN 1:1\".\r\n *\r\n * @param text The reference to parse.\r\n */\r\nexport function parseVerseReference(text: string): VerseRef | null {\r\n const match = text.match(/^\\s*([0-9A-Za-z\\s]+)\\s+(\\d+):(\\d+)/);\r\n\r\n if (!match) {\r\n return null;\r\n }\r\n\r\n const [reference, book, chapterStr, verseStr] = match;\r\n\r\n const chapter = parseInt(chapterStr);\r\n const verse = parseInt(verseStr);\r\n\r\n if (isNaN(chapter) || isNaN(verse)) {\r\n return null;\r\n }\r\n\r\n if (reference.length !== text.length) {\r\n return {\r\n book: getBookId(book) ?? book,\r\n chapter,\r\n verse,\r\n content: text.substring(reference.length).trim(),\r\n };\r\n }\r\n\r\n return {\r\n book: getBookId(book) ?? book,\r\n chapter,\r\n verse,\r\n };\r\n}\r\n\r\n/**\r\n * Defines a map that maps the book ID to the numerical order of the book.\r\n */\r\nconst BOOK_ID_MAP: Map<string, string> = new Map([\r\n ['gen', 'GEN'],\r\n ['genesis', 'GEN'],\r\n ['exo', 'EXO'],\r\n ['exodus', 'EXO'],\r\n ['lev', 'LEV'],\r\n ['lev', 'LEV'],\r\n ['laviticus', 'LEV'],\r\n ['num', 'NUM'],\r\n ['numbers', 'NUM'],\r\n ['deu', 'DEU'],\r\n ['deuteronomy', 'DEU'],\r\n ['jos', 'JOS'],\r\n ['joshua', 'JOS'],\r\n ['jdg', 'JDG'],\r\n ['judges', 'JDG'],\r\n ['rut', 'RUT'],\r\n ['ruth', 'RUT'],\r\n ['1sa', '1SA'],\r\n ['1samuel', '1SA'],\r\n ['2sa', '2SA'],\r\n ['2samuel', '2SA'],\r\n ['1ki', '1KI'],\r\n ['1kings', '1KI'],\r\n ['2ki', '2KI'],\r\n ['2kings', '2KI'],\r\n ['1ch', '1CH'],\r\n ['1chronicles', '1CH'],\r\n ['chronicles1', '1CH'],\r\n ['2ch', '2CH'],\r\n ['2chronicles', '2CH'],\r\n ['chronicles2', '2CH'],\r\n ['ezr', 'EZR'],\r\n ['ezra', 'EZR'],\r\n ['neh', 'NEH'],\r\n ['nehemiah', 'NEH'],\r\n ['est', 'EST'],\r\n ['ester', 'EST'],\r\n ['job', 'JOB'],\r\n ['psa', 'PSA'],\r\n ['psalms', 'PSA'],\r\n ['psalm', 'PSA'],\r\n ['pro', 'PRO'],\r\n ['proverbs', 'PRO'],\r\n ['ecc', 'ECC'],\r\n ['ecclesiastes', 'ECC'],\r\n ['sng', 'SNG'],\r\n ['songofsolomon', 'SNG'],\r\n ['isa', 'ISA'],\r\n ['isaiah', 'ISA'],\r\n ['jer', 'JER'],\r\n ['jeremiah', 'JER'],\r\n ['lam', 'LAM'],\r\n ['lamentations', 'LAM'],\r\n ['ezk', 'EZK'],\r\n ['ezekiel', 'EZK'],\r\n ['dan', 'DAN'],\r\n ['daniel', 'DAN'],\r\n ['hos', 'HOS'],\r\n ['hosea', 'HOS'],\r\n ['jol', 'JOL'],\r\n ['joel', 'JOL'],\r\n ['amo', 'AMO'],\r\n ['amos', 'AMO'],\r\n ['oba', 'OBA'],\r\n ['obadiah', 'OBA'],\r\n ['jon', 'JON'],\r\n ['jonah', 'JON'],\r\n ['mic', 'MIC'],\r\n ['micah', 'MIC'],\r\n ['nam', 'NAM'],\r\n ['nahum', 'NAM'],\r\n ['hab', 'HAB'],\r\n ['habakkuk', 'HAB'],\r\n ['zep', 'ZEP'],\r\n ['zepaniah', 'ZEP'],\r\n ['hag', 'HAG'],\r\n ['haggai', 'HAG'],\r\n ['zec', 'ZEC'],\r\n ['zechariah', 'ZEC'],\r\n ['mal', 'MAL'],\r\n ['malachi', 'MAL'],\r\n ['mat', 'MAT'],\r\n ['matthew', 'MAT'],\r\n ['mrk', 'MRK'],\r\n ['mark', 'MRK'],\r\n ['luk', 'LUK'],\r\n ['luke', 'LUK'],\r\n ['jhn', 'JHN'],\r\n ['john', 'JHN'],\r\n ['act', 'ACT'],\r\n ['acts', 'ACT'],\r\n ['rom', 'ROM'],\r\n ['romans', 'ROM'],\r\n ['1co', '1CO'],\r\n ['1corinthians', '1CO'],\r\n ['2co', '2CO'],\r\n ['2corinthians', '2CO'],\r\n ['gal', 'GAL'],\r\n ['galatians', 'GAL'],\r\n ['eph', 'EPH'],\r\n ['ephesians', 'EPH'],\r\n ['php', 'PHP'],\r\n ['philippians', 'PHP'],\r\n ['col', 'COL'],\r\n ['colossians', 'COL'],\r\n ['1th', '1TH'],\r\n ['1thessalonians', '1TH'],\r\n ['2th', '2TH'],\r\n ['2thessalonians', '2TH'],\r\n ['1ti', '1TI'],\r\n ['1timothy', '1TI'],\r\n ['2ti', '2TI'],\r\n ['2timothy', '2TI'],\r\n ['tit', 'TIT'],\r\n ['titus', 'TIT'],\r\n ['phm', 'PHM'],\r\n ['philemon', 'PHM'],\r\n ['heb', 'HEB'],\r\n ['hebrews', 'HEB'],\r\n ['jas', 'JAS'],\r\n ['james', 'JAS'],\r\n ['1pe', '1PE'],\r\n ['1peter', '1PE'],\r\n ['2pe', '2PE'],\r\n ['2peter', '2PE'],\r\n ['1jn', '1JN'],\r\n ['1john', '1JN'],\r\n ['2jn', '2JN'],\r\n ['2john', '2JN'],\r\n ['3jn', '3JN'],\r\n ['3john', '3JN'],\r\n ['jud', 'JUD'],\r\n ['jude', 'JUD'],\r\n ['rev', 'REV'],\r\n ['revelation', 'REV'],\r\n]);\r\n\r\n/**\r\n * Gets the ID of the given book.\r\n * Returns null if the ID could not be found.\r\n * @param book The name/ID of the book.\r\n */\r\nexport function getBookId(book: string): string | null {\r\n const bookLower = book.toLowerCase().replaceAll(/\\s+/g, '');\r\n\r\n const id = BOOK_ID_MAP.get(bookLower);\r\n if (id) {\r\n return id;\r\n }\r\n\r\n for (let [key, id] of BOOK_ID_MAP) {\r\n if (bookLower.startsWith(key)) {\r\n return id;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["id"]
|
|
7
7
|
}
|