@helloao/tools 0.0.9 → 0.0.11
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 +194 -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 +180 -83
- package/dist/cjs/generation/dataset.cjs.map +3 -3
- package/dist/cjs/index.cjs +3 -0
- package/dist/cjs/index.cjs.map +2 -2
- package/dist/cjs/log.cjs +50 -0
- package/dist/cjs/log.cjs.map +7 -0
- package/dist/cjs/parser/codex-parser.cjs +81 -67
- 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/iterators.cjs +17 -6
- package/dist/cjs/parser/iterators.cjs.map +2 -2
- package/dist/cjs/parser/tyndale-xml-parser.cjs +212 -0
- package/dist/cjs/parser/tyndale-xml-parser.cjs.map +7 -0
- package/dist/cjs/parser/types.cjs.map +1 -1
- package/dist/cjs/parser/usfm-parser.cjs +4 -2
- package/dist/cjs/parser/usfm-parser.cjs.map +2 -2
- package/dist/cjs/parser/usx-parser.cjs +13 -1
- package/dist/cjs/parser/usx-parser.cjs.map +2 -2
- package/dist/cjs/utils.cjs +180 -6
- package/dist/cjs/utils.cjs.map +3 -3
- package/dist/esm/generation/api.js +186 -0
- package/dist/esm/generation/api.js.map +2 -2
- package/dist/esm/generation/dataset.js +181 -84
- package/dist/esm/generation/dataset.js.map +2 -2
- package/dist/esm/index.js +2 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/log.js +20 -0
- package/dist/esm/log.js.map +7 -0
- package/dist/esm/parser/codex-parser.js +75 -65
- 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/iterators.js +17 -6
- package/dist/esm/parser/iterators.js.map +2 -2
- package/dist/esm/parser/tyndale-xml-parser.js +184 -0
- package/dist/esm/parser/tyndale-xml-parser.js.map +7 -0
- package/dist/esm/parser/usfm-parser.js +4 -2
- package/dist/esm/parser/usfm-parser.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 +178 -6
- package/dist/esm/utils.js.map +3 -3
- package/dist/types/generation/api.d.ts +222 -1
- package/dist/types/generation/common-types.d.ts +151 -24
- package/dist/types/generation/dataset.d.ts +38 -2
- package/dist/types/index.d.ts +2 -1
- package/dist/types/log.d.ts +23 -0
- 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/tyndale-xml-parser.d.ts +8 -0
- package/dist/types/parser/types.d.ts +53 -1
- package/dist/types/parser/usx-parser.d.ts +1 -1
- package/dist/types/utils.d.ts +14 -0
- package/package.json +37 -14
|
@@ -21,7 +21,9 @@ __export(codex_parser_exports, {
|
|
|
21
21
|
CodexParser: () => CodexParser,
|
|
22
22
|
chapterHeadingSchema: () => chapterHeadingSchema,
|
|
23
23
|
codexSchema: () => codexSchema,
|
|
24
|
-
metadataSchema: () => metadataSchema
|
|
24
|
+
metadataSchema: () => metadataSchema,
|
|
25
|
+
paratextSchema: () => paratextSchema,
|
|
26
|
+
verseSchema: () => verseSchema
|
|
25
27
|
});
|
|
26
28
|
module.exports = __toCommonJS(codex_parser_exports);
|
|
27
29
|
var import_zod = require("zod");
|
|
@@ -32,14 +34,24 @@ const chapterHeadingSchema = import_zod.z.object({
|
|
|
32
34
|
chapter: import_zod.z.coerce.number().int()
|
|
33
35
|
})
|
|
34
36
|
});
|
|
37
|
+
const verseSchema = import_zod.z.object({
|
|
38
|
+
type: import_zod.z.literal("text"),
|
|
39
|
+
id: import_zod.z.string()
|
|
40
|
+
});
|
|
41
|
+
const paratextSchema = import_zod.z.object({
|
|
42
|
+
type: import_zod.z.literal("paratext"),
|
|
43
|
+
id: import_zod.z.string()
|
|
44
|
+
});
|
|
35
45
|
const metadataSchema = import_zod.z.discriminatedUnion("type", [
|
|
36
|
-
chapterHeadingSchema
|
|
46
|
+
chapterHeadingSchema,
|
|
47
|
+
verseSchema,
|
|
48
|
+
paratextSchema
|
|
37
49
|
]);
|
|
38
50
|
const codexSchema = import_zod.z.object({
|
|
39
51
|
cells: import_zod.z.array(
|
|
40
52
|
import_zod.z.object({
|
|
41
|
-
|
|
42
|
-
|
|
53
|
+
kind: import_zod.z.number(),
|
|
54
|
+
languageId: import_zod.z.string(),
|
|
43
55
|
value: import_zod.z.string(),
|
|
44
56
|
metadata: import_zod.z.object({
|
|
45
57
|
type: import_zod.z.string()
|
|
@@ -55,9 +67,9 @@ class CodexParser {
|
|
|
55
67
|
// preserveMarkdown: boolean = true;
|
|
56
68
|
_noteCounter = 0;
|
|
57
69
|
/**
|
|
58
|
-
* Parses the specified
|
|
70
|
+
* Parses the specified codex content.
|
|
59
71
|
*
|
|
60
|
-
* @param
|
|
72
|
+
* @param codex The codex content to parse.
|
|
61
73
|
* @returns The parse tree that was generated.
|
|
62
74
|
*/
|
|
63
75
|
parse(codex) {
|
|
@@ -92,70 +104,70 @@ class CodexParser {
|
|
|
92
104
|
}
|
|
93
105
|
]);
|
|
94
106
|
}
|
|
107
|
+
function stripHTML(value) {
|
|
108
|
+
return value.replace(/<[^>]*>/g, "");
|
|
109
|
+
}
|
|
110
|
+
function toHeading(content) {
|
|
111
|
+
return {
|
|
112
|
+
type: "heading",
|
|
113
|
+
content: [content]
|
|
114
|
+
};
|
|
115
|
+
}
|
|
95
116
|
for (let cell of data.cells) {
|
|
96
|
-
if (cell.
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
117
|
+
if (cell.languageId === "html" && cell.value) {
|
|
118
|
+
if (!cell.metadata) continue;
|
|
119
|
+
const metadata = metadataSchema.parse(cell.metadata);
|
|
120
|
+
if (metadata.type === "text") {
|
|
121
|
+
const reference = (0, import_utils.parseVerseReference)(metadata.id);
|
|
122
|
+
if (!reference)
|
|
123
|
+
throw new Error("Could not find verse reference.");
|
|
124
|
+
if (!root.id) root.id = reference.book;
|
|
125
|
+
const content = stripHTML(cell.value);
|
|
126
|
+
const lines = content.split("\n").reduce(
|
|
127
|
+
(prev, current) => {
|
|
128
|
+
if (prev.length === 0) return [current];
|
|
129
|
+
else
|
|
130
|
+
return [
|
|
131
|
+
...prev,
|
|
132
|
+
{
|
|
133
|
+
lineBreak: true
|
|
134
|
+
},
|
|
135
|
+
current
|
|
136
|
+
];
|
|
137
|
+
},
|
|
138
|
+
[]
|
|
139
|
+
);
|
|
140
|
+
addReference(reference, lines);
|
|
141
|
+
} else if (metadata.type === "paratext") {
|
|
142
|
+
const reference = (0, import_utils.parseVerseReference)(`${metadata.id}:1`);
|
|
143
|
+
if (reference) {
|
|
144
|
+
const content = stripHTML(cell.value);
|
|
145
|
+
const lines = content.split("\n").reduce((prev, current) => {
|
|
146
|
+
if (prev.length === 0)
|
|
147
|
+
return [toHeading(current)];
|
|
148
|
+
else
|
|
149
|
+
return [
|
|
150
|
+
...prev,
|
|
151
|
+
{
|
|
152
|
+
type: "line_break"
|
|
153
|
+
},
|
|
154
|
+
toHeading(current)
|
|
155
|
+
];
|
|
156
|
+
}, []);
|
|
157
|
+
lines.forEach(
|
|
158
|
+
(line) => addChapterContent(reference.chapter, [line])
|
|
159
|
+
);
|
|
160
|
+
} else {
|
|
161
|
+
const content = stripHTML(cell.value);
|
|
162
|
+
if (!cell.metadata) {
|
|
163
|
+
if (lastChapter) {
|
|
164
|
+
lastChapter.footnotes.push({
|
|
165
|
+
noteId: this._noteCounter++,
|
|
166
|
+
text: content,
|
|
167
|
+
caller: null
|
|
120
168
|
});
|
|
121
169
|
}
|
|
122
|
-
} else if (ref) {
|
|
123
|
-
content.push(ref);
|
|
124
|
-
}
|
|
125
|
-
} else {
|
|
126
|
-
if (!root.id) {
|
|
127
|
-
root.id = ref.book;
|
|
128
|
-
}
|
|
129
|
-
if (currentRef) {
|
|
130
|
-
currentRef = null;
|
|
131
|
-
content = [];
|
|
132
170
|
}
|
|
133
|
-
currentRef = ref;
|
|
134
|
-
if (ref.content) {
|
|
135
|
-
content.push(ref.content);
|
|
136
|
-
}
|
|
137
|
-
addReference(ref, content);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
} else if (cell.language === "markdown") {
|
|
141
|
-
if (cell.metadata) {
|
|
142
|
-
if (cell.metadata.type === "chapter-heading") {
|
|
143
|
-
const metadata = metadataSchema.parse(cell.metadata);
|
|
144
|
-
const chapter = metadata.data.chapter;
|
|
145
|
-
addChapterContent(chapter, [
|
|
146
|
-
{
|
|
147
|
-
type: "heading",
|
|
148
|
-
content: [cell.value]
|
|
149
|
-
}
|
|
150
|
-
]);
|
|
151
|
-
}
|
|
152
|
-
} else {
|
|
153
|
-
if (lastChapter) {
|
|
154
|
-
lastChapter.footnotes.push({
|
|
155
|
-
noteId: this._noteCounter++,
|
|
156
|
-
text: cell.value,
|
|
157
|
-
caller: null
|
|
158
|
-
});
|
|
159
171
|
}
|
|
160
172
|
}
|
|
161
173
|
}
|
|
@@ -171,6 +183,8 @@ class CodexParser {
|
|
|
171
183
|
CodexParser,
|
|
172
184
|
chapterHeadingSchema,
|
|
173
185
|
codexSchema,
|
|
174
|
-
metadataSchema
|
|
186
|
+
metadataSchema,
|
|
187
|
+
paratextSchema,
|
|
188
|
+
verseSchema
|
|
175
189
|
});
|
|
176
190
|
//# sourceMappingURL=codex-parser.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../parser/codex-parser.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from 'zod';\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAkB;AAQlB,mBAA8C;AAEvC,MAAM,uBAAuB,aAAE,OAAO;AAAA,EACzC,MAAM,aAAE,QAAQ,iBAAiB;AAAA,EACjC,MAAM,aAAE,OAAO;AAAA,IACX,SAAS,aAAE,OAAO,OAAO,EAAE,IAAI;AAAA,EACnC,CAAC;AACL,CAAC;AAEM,MAAM,iBAAiB,aAAE,mBAAmB,QAAQ;AAAA,EACvD;AACJ,CAAC;AAEM,MAAM,cAAc,aAAE,OAAO;AAAA,EAChC,OAAO,aAAE;AAAA,IACL,aAAE,OAAO;AAAA;AAAA,
|
|
4
|
+
"sourcesContent": ["import { z } from 'zod';\nimport {\n Chapter,\n ChapterContent,\n ParseTree,\n Verse,\n VerseContent,\n} from './types.js';\nimport { parseVerseReference, VerseRef } from '../utils.js';\n\nexport const chapterHeadingSchema = z.object({\n type: z.literal('chapter-heading'),\n data: z.object({\n chapter: z.coerce.number().int(),\n }),\n});\n\nexport const verseSchema = z.object({\n type: z.literal('text'),\n id: z.string(),\n});\n\nexport const paratextSchema = z.object({\n type: z.literal('paratext'),\n id: z.string(),\n});\n\nexport const metadataSchema = z.discriminatedUnion('type', [\n chapterHeadingSchema,\n verseSchema,\n paratextSchema,\n]);\n\nexport const codexSchema = z.object({\n cells: z.array(\n z.object({\n kind: z.number(),\n languageId: z.string(),\n value: z.string(),\n metadata: z\n .object({\n type: z.string(),\n })\n .passthrough()\n .nullable()\n .optional(),\n })\n ),\n});\n\n/**\n * Defines a parser for codex files.\n */\nexport class CodexParser {\n // TODO:\n // /**\n // * Whether to preserve markdown in the parsed content.\n // */\n // preserveMarkdown: boolean = true;\n\n private _noteCounter: number = 0;\n\n /**\n * Parses the specified codex content.\n *\n * @param codex The codex content to parse.\n * @returns The parse tree that was generated.\n */\n public parse(codex: string): ParseTree {\n const json = JSON.parse(codex);\n const data = codexSchema.parse(json);\n\n let root: ParseTree = {\n type: 'root',\n content: [],\n };\n\n let chapters: Map<number, Chapter> = new Map();\n let lastChapter: Chapter | null = null;\n\n function addChapterContent(\n chapterNumber: number,\n content: ChapterContent[]\n ) {\n let chapter = chapters.get(chapterNumber);\n if (!chapter) {\n chapter = {\n type: 'chapter',\n number: chapterNumber,\n content: [],\n footnotes: [],\n };\n lastChapter = chapter;\n chapters.set(chapterNumber, chapter);\n }\n\n chapter.content.push(...content);\n }\n\n function addReference(ref: VerseRef, content: Verse['content']) {\n addChapterContent(ref.chapter, [\n {\n type: 'verse',\n number: ref.verse,\n content: content,\n },\n ]);\n }\n\n function stripHTML(value: string) {\n return value.replace(/<[^>]*>/g, '');\n }\n\n function toHeading(content: string) {\n return {\n type: 'heading',\n content: [content],\n } satisfies ChapterContent;\n }\n\n for (let cell of data.cells) {\n if (cell.languageId === 'html' && cell.value) {\n if (!cell.metadata) continue; // ignore html cells without metadata\n const metadata = metadataSchema.parse(cell.metadata);\n if (metadata.type === 'text') {\n const reference = parseVerseReference(metadata.id);\n if (!reference)\n throw new Error('Could not find verse reference.');\n\n if (!root.id) root.id = reference.book; // set book id if not already set\n\n const content = stripHTML(cell.value);\n\n // add line breaks in heading if there are multiple lines\n const lines = content.split('\\n').reduce(\n (prev, current) => {\n if (prev.length === 0) return [current];\n else\n return [\n ...prev,\n {\n lineBreak: true,\n },\n current,\n ] satisfies Verse['content'];\n },\n [] as Verse['content']\n );\n\n addReference(reference, lines);\n } else if (metadata.type === 'paratext') {\n const reference = parseVerseReference(`${metadata.id}:1`); // chapter headings do not have a verse reference always default to 1\n if (reference) {\n const content = stripHTML(cell.value);\n\n // add line breaks in heading if there are multiple lines\n const lines = content\n .split('\\n')\n .reduce<ChapterContent[]>((prev, current) => {\n if (prev.length === 0)\n return [toHeading(current)];\n else\n return [\n ...prev,\n {\n type: 'line_break',\n },\n toHeading(current),\n ] satisfies ChapterContent[];\n }, []);\n\n lines.forEach((line) =>\n addChapterContent(reference.chapter, [line])\n );\n } else {\n // parse paratext that isn't a chapter reference as footnote\n const content = stripHTML(cell.value);\n if (!cell.metadata) {\n if (lastChapter) {\n (lastChapter as Chapter).footnotes.push({\n noteId: this._noteCounter++,\n text: content,\n caller: null,\n });\n }\n }\n }\n }\n }\n }\n\n for (let chapter of chapters.values()) {\n root.content.push(chapter);\n }\n\n return root;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -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 {\n CommentaryBookNode,\n CommentaryChapterNode,\n CommentaryParseTree,\n} from './types';\nimport { getBookId, parseVerseReference } from '../utils';\nimport { parse } from 'papaparse';\n\nexport interface CsvLine {\n book: string;\n chapter: string;\n verse: string;\n commentaries: string;\n}\n\nexport class CommentaryCsvParser {\n parse(data: string): CommentaryParseTree {\n // remove header automatically\n const firstLine = data.indexOf('\\n');\n data = data.substring(firstLine + 1);\n\n const lines = parse<string[]>(data, {\n header: false,\n // transformHeader: (_, index) => {\n // const headers = ['book', 'chapter', 'verse', 'commentaries'];\n // if (index < headers.length) {\n // return headers[index];\n // } else {\n // return '';\n // }\n // },\n delimiter: ',',\n escapeChar: '\"',\n quoteChar: '\"',\n });\n return this.parseLines(\n lines.data.map((line: string[]) => ({\n book: line[0],\n chapter: line[1],\n verse: line[2],\n commentaries: line[3],\n }))\n );\n }\n\n parseLines(data: CsvLine[]): CommentaryParseTree {\n let tree: CommentaryParseTree = {\n type: 'commentary/root',\n books: [],\n };\n\n let book: CommentaryBookNode | null = null;\n let chapter: CommentaryChapterNode | null = null;\n for (let line of data) {\n if (hasValue(line.book)) {\n const id = getBookId(line.book);\n if (!id) {\n throw new Error('Invalid book: ' + line.book);\n }\n\n book = tree.books.find((b) => b.book === id) ?? null;\n if (!book) {\n book = {\n type: 'book',\n book: id,\n introduction: null,\n chapters: [],\n };\n tree.books.push(book);\n }\n\n if (!book.introduction) {\n book.introduction = hasValue(line.commentaries)\n ? line.commentaries\n : null;\n }\n } else if (hasValue(line.chapter)) {\n const number = parseInt(line.chapter);\n if (isNaN(number)) {\n throw new Error('Invalid chapter number: ' + line.chapter);\n }\n\n if (!book) {\n throw new Error('Chapter without book');\n }\n\n chapter = {\n type: 'chapter',\n number,\n introduction: hasValue(line.commentaries)\n ? line.commentaries\n : null,\n verses: [],\n };\n book.chapters.push(chapter);\n } else if (hasValue(line.verse)) {\n const ref = parseVerseReference(line.verse);\n if (ref) {\n if (ref.book === book?.book) {\n // @ts-ignore\n if (ref.chapter === chapter?.number) {\n chapter.verses.push({\n type: 'verse',\n number: ref.verse,\n content: [line.commentaries],\n });\n } else {\n chapter = {\n type: 'chapter',\n number: ref.chapter,\n introduction: null,\n verses: [\n {\n type: 'verse',\n number: ref.verse,\n content: [line.commentaries],\n },\n ],\n };\n\n book.chapters.push(chapter);\n }\n }\n }\n }\n }\n\n return tree;\n }\n}\n\nfunction hasValue(value: string | null): boolean {\n return (\n value !== null &&\n value !== undefined &&\n value !== '' &&\n value.trim() !== ''\n );\n}\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
|
}
|
|
@@ -34,6 +34,7 @@ __export(iterators_exports, {
|
|
|
34
34
|
uncompletable: () => uncompletable
|
|
35
35
|
});
|
|
36
36
|
module.exports = __toCommonJS(iterators_exports);
|
|
37
|
+
var import_log = require("../log.js");
|
|
37
38
|
class Rewindable {
|
|
38
39
|
buffer = [];
|
|
39
40
|
_bufferSize = 0;
|
|
@@ -71,19 +72,23 @@ class Rewindable {
|
|
|
71
72
|
let result = this._iterator.next(...args);
|
|
72
73
|
this.buffer.unshift(result.value);
|
|
73
74
|
if (this.buffer.length > this._bufferSize) {
|
|
74
|
-
this.buffer.splice(
|
|
75
|
+
this.buffer.splice(
|
|
76
|
+
this._bufferSize,
|
|
77
|
+
this.buffer.length - this._bufferSize
|
|
78
|
+
);
|
|
75
79
|
}
|
|
76
80
|
return result;
|
|
77
81
|
}
|
|
78
82
|
}
|
|
79
83
|
function* debug(label, iterator) {
|
|
84
|
+
const logger = (0, import_log.getLogger)();
|
|
80
85
|
for (let value of uncompletable(iterator)) {
|
|
81
86
|
if (value instanceof Element) {
|
|
82
|
-
|
|
87
|
+
logger.log(label, value.outerHTML);
|
|
83
88
|
} else if (value instanceof Node) {
|
|
84
|
-
|
|
89
|
+
logger.log(label, value.textContent);
|
|
85
90
|
} else {
|
|
86
|
-
|
|
91
|
+
logger.log(label, value);
|
|
87
92
|
}
|
|
88
93
|
yield value;
|
|
89
94
|
}
|
|
@@ -97,10 +102,16 @@ function* iterateNodes(node) {
|
|
|
97
102
|
}
|
|
98
103
|
}
|
|
99
104
|
function parentChar(node) {
|
|
100
|
-
return matchingParent(
|
|
105
|
+
return matchingParent(
|
|
106
|
+
node,
|
|
107
|
+
(n) => n instanceof Element && n.nodeName === "char"
|
|
108
|
+
);
|
|
101
109
|
}
|
|
102
110
|
function parentNote(node) {
|
|
103
|
-
return matchingParent(
|
|
111
|
+
return matchingParent(
|
|
112
|
+
node,
|
|
113
|
+
(n) => n instanceof Element && n.nodeName === "note"
|
|
114
|
+
);
|
|
104
115
|
}
|
|
105
116
|
function matchingParent(node, filter) {
|
|
106
117
|
let parent = node.parentNode;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../parser/iterators.ts"],
|
|
4
|
-
"sourcesContent": ["\
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["import { getLogger } from '../log.js';\n\n/**\n * Defines an interface that represents an iterator that can be rewound.\n */\nexport interface RewindableIterator<T> extends IterableIterator<T> {\n /**\n * Rewinds the iterator by the specified number of elements.\n * @param number The number of elements to rewind.\n */\n rewind(number: number): void;\n}\n\n/**\n * Defines a class that implements an iterator that can be rewound.\n */\nexport class Rewindable<T> implements RewindableIterator<T> {\n buffer: T[] = [];\n\n private _bufferSize: number = 0;\n private _position: number = -1;\n private _iterator: IterableIterator<T>;\n\n constructor(iterator: IterableIterator<T>, bufferSize: number = 2) {\n this._iterator = iterator;\n this._bufferSize = bufferSize;\n\n if (this._iterator.return) {\n this.return = (value?: any) => {\n return this._iterator.return!(value);\n };\n }\n if (this._iterator.throw) {\n this.throw = (value?: any) => {\n return this._iterator.throw!(value);\n };\n }\n }\n\n rewind(number: number): void {\n this._position += number;\n }\n\n [Symbol.iterator](): IterableIterator<T> {\n return this;\n }\n\n next(...args: [] | [undefined]): IteratorResult<T, any> {\n if (this._position >= 0) {\n let item = this.buffer[this._position];\n this._position--;\n return {\n value: item,\n done: false,\n };\n }\n\n let result = this._iterator.next(...args);\n this.buffer.unshift(result.value);\n if (this.buffer.length > this._bufferSize) {\n this.buffer.splice(\n this._bufferSize,\n this.buffer.length - this._bufferSize\n );\n }\n return result;\n }\n\n return?(value?: any): IteratorResult<T, any>;\n throw?(e?: any): IteratorResult<T, any>;\n}\n\nexport function* debug(label: string, iterator: IterableIterator<any>) {\n const logger = getLogger();\n for (let value of uncompletable(iterator)) {\n if (value instanceof Element) {\n logger.log(label, value.outerHTML);\n } else if (value instanceof Node) {\n logger.log(label, value.textContent);\n } else {\n logger.log(label, value);\n }\n yield value;\n }\n}\n\n/**\n * Creates a new rewindable iterator from the given iterator.\n * @param iterator The iterator.\n * @param bufferSize The size of the buffer.\n */\nexport function rewindable<T>(\n iterator: IterableIterator<T>,\n bufferSize: number = 2\n): Rewindable<T> {\n return new Rewindable(iterator, bufferSize);\n}\n\nfunction* iterateNodes(node: Node) {\n for (let i = 0; i < node.childNodes.length; i++) {\n yield node.childNodes[i];\n }\n}\n\n/**\n * Gets the char element that is the parent of the given node.\n * @param node The node.\n */\nexport function parentChar(node: Node): Element | null {\n return matchingParent(\n node,\n (n) => n instanceof Element && n.nodeName === 'char'\n ) as Element | null;\n}\n\n/**\n * Gets the note element that is the parent of the given node.\n * @param node The node.\n */\nexport function parentNote(node: Node): Element | null {\n return matchingParent(\n node,\n (n) => n instanceof Element && n.nodeName === 'note'\n ) as Element | null;\n}\n\n/**\n * Gets the parent node that matches the given filter.\n * @param node The node to start the search from.\n * @param filter The filter that should be used.\n */\nexport function matchingParent(\n node: Node,\n filter: (node: Node) => boolean\n): Node | null {\n let parent = node.parentNode;\n while (parent) {\n if (filter(parent)) {\n return parent;\n }\n parent = parent.parentNode;\n }\n return null;\n}\n\n/**\n * Determines if the given node is a child of the parent node.\n * @param node The node to test.\n * @param parent The parent.\n * @returns\n */\nexport function isParent(node: Node, parent: Node): boolean {\n let parentNode = node.parentNode;\n while (parentNode) {\n if (parentNode === parent) {\n return true;\n }\n parentNode = parentNode.parentNode;\n }\n return false;\n}\n\n/**\n * Iterates through all of the nodes in the tree in a depth-first traversal.\n * @param node The node to start the traversal from.\n */\nexport function iterateAll(node: Node): RewindableIterator<Node> {\n return rewindable(_iterateAll(node));\n}\n\nexport function* iterateUntil<T>(\n iterator: IterableIterator<T>,\n predicate: (value: T) => boolean\n): IterableIterator<T> {\n for (let value of iterator) {\n if (predicate(value)) {\n return;\n }\n yield value;\n }\n}\n\nfunction* _iterateAll(node: Node): IterableIterator<Node> {\n for (let child of node.childNodes) {\n yield child;\n yield* iterateAll(child);\n }\n}\n\n/**\n * Iterates only the elements in the iterator.\n * @param iterator The iterator that should be used.\n */\nexport function* elements(\n iterator: IterableIterator<Node>\n): IterableIterator<Element> {\n for (let node of uncompletable(iterator)) {\n if (node instanceof Element) {\n yield node;\n }\n }\n}\n\n/**\n * Iterates only the children of the given node in the iterator.\n * @param iterator The iterator that should be used.\n * @param parent The parent node.\n */\nexport function* children(\n iterator: RewindableIterator<Node>,\n parent: Node\n): IterableIterator<Node> {\n for (let node of uncompletable(iterator)) {\n if (!isParent(node, parent)) {\n iterator.rewind(1);\n return;\n }\n\n yield node;\n }\n}\n\n/**\n * Wraps the given iterable in a generator that will prevent consumers from calling return() on the iterator.\n * @param iterable The iterable.\n */\nexport function* uncompletable<T>(\n iterable: IterableIterator<T>\n): IterableIterator<T> {\n while (true) {\n const { done, value } = iterable.next();\n if (done) {\n return;\n }\n yield value;\n }\n}\n\n/**\n * Converts the given iterable into an async iterable.\n * @param input The input iterable.\n */\nexport async function* toAsyncIterable<T>(\n input: Iterable<T>\n): AsyncIterable<T> {\n for (let item of input) {\n yield item;\n }\n}\n\n/**\n * Batches items from the given iterator.\n * @param input The input iterator.\n * @param batchSize The size of each batch.\n */\nexport function* batch<T>(\n input: Iterable<T>,\n batchSize: number\n): Iterable<T[]> {\n while (true) {\n let batch = [] as T[];\n for (let item of input) {\n batch.push(item);\n if (batch.length >= batchSize) {\n break;\n }\n }\n\n if (batch.length === 0) {\n return;\n }\n\n yield batch;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["batch"]
|
|
7
7
|
}
|