proskomma-core 0.9.18 → 0.9.19

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.
Files changed (126) hide show
  1. package/dist/bundle.js +1 -0
  2. package/dist/index.cjs +1 -0
  3. package/dist/module.mjs +15888 -0
  4. package/package.json +23 -34
  5. package/dist/index.js +0 -8
  6. package/dist/index.js.LICENSE.txt +0 -23
  7. package/esm/package.json +0 -3
  8. package/esm/wrapper.mjs +0 -7
  9. package/informations/meeting_01_march_2023.md +0 -38
  10. package/src/graph/index.cjs +0 -201
  11. package/src/graph/lib/do_cv.cjs +0 -249
  12. package/src/graph/lib/dump.cjs +0 -40
  13. package/src/graph/lib/remake_blocks.cjs +0 -57
  14. package/src/graph/lib/sequence_chars.cjs +0 -84
  15. package/src/graph/lib/sort.cjs +0 -39
  16. package/src/graph/lib/tribos.cjs +0 -97
  17. package/src/graph/lib/tribos_expression.cjs +0 -556
  18. package/src/graph/lib/tribos_ohm_UNUSED.cjs +0 -37
  19. package/src/graph/lib/tribos_step.cjs +0 -434
  20. package/src/graph/mutations/add.cjs +0 -91
  21. package/src/graph/mutations/delete.cjs +0 -61
  22. package/src/graph/mutations/index.cjs +0 -54
  23. package/src/graph/mutations/rehash.cjs +0 -17
  24. package/src/graph/mutations/tags.cjs +0 -120
  25. package/src/graph/mutations/update.cjs +0 -210
  26. package/src/graph/mutations/versification.cjs +0 -96
  27. package/src/graph/queries/block.cjs +0 -228
  28. package/src/graph/queries/cIndex.cjs +0 -87
  29. package/src/graph/queries/cell.cjs +0 -42
  30. package/src/graph/queries/cv.cjs +0 -19
  31. package/src/graph/queries/cvBook.cjs +0 -16
  32. package/src/graph/queries/cvChapter.cjs +0 -16
  33. package/src/graph/queries/cvIndex.cjs +0 -47
  34. package/src/graph/queries/cvNavigation.cjs +0 -116
  35. package/src/graph/queries/cvVerseElement.cjs +0 -84
  36. package/src/graph/queries/cvVerses.cjs +0 -14
  37. package/src/graph/queries/doc_set.cjs +0 -220
  38. package/src/graph/queries/document.cjs +0 -555
  39. package/src/graph/queries/idParts.cjs +0 -30
  40. package/src/graph/queries/index.cjs +0 -151
  41. package/src/graph/queries/inputBlockSpec.cjs +0 -17
  42. package/src/graph/queries/inputItemObject.cjs +0 -12
  43. package/src/graph/queries/input_att_spec.cjs +0 -14
  44. package/src/graph/queries/input_key_matches.cjs +0 -11
  45. package/src/graph/queries/input_key_value.cjs +0 -11
  46. package/src/graph/queries/input_key_values.cjs +0 -11
  47. package/src/graph/queries/input_selector_spec.cjs +0 -19
  48. package/src/graph/queries/item.cjs +0 -71
  49. package/src/graph/queries/itemGroup.cjs +0 -75
  50. package/src/graph/queries/key_value.cjs +0 -18
  51. package/src/graph/queries/kv_entry.cjs +0 -21
  52. package/src/graph/queries/kv_sequence.cjs +0 -151
  53. package/src/graph/queries/node.cjs +0 -44
  54. package/src/graph/queries/orig.cjs +0 -11
  55. package/src/graph/queries/regex_index.cjs +0 -18
  56. package/src/graph/queries/row_equals_spec.cjs +0 -11
  57. package/src/graph/queries/row_match_spec.cjs +0 -11
  58. package/src/graph/queries/selector_spec.cjs +0 -29
  59. package/src/graph/queries/sequence.cjs +0 -314
  60. package/src/graph/queries/table_sequence.cjs +0 -192
  61. package/src/graph/queries/tree_sequence.cjs +0 -58
  62. package/src/graph/queries/verseNumber.cjs +0 -44
  63. package/src/graph/queries/verseRange.cjs +0 -11
  64. package/src/graph/queries/versification.cjs +0 -25
  65. package/src/index.cjs +0 -583
  66. package/src/model/doc_set.cjs +0 -389
  67. package/src/model/doc_set_helpers/block.cjs +0 -232
  68. package/src/model/doc_set_helpers/enum.cjs +0 -87
  69. package/src/model/doc_set_helpers/item.cjs +0 -198
  70. package/src/model/doc_set_helpers/rehash.cjs +0 -53
  71. package/src/model/doc_set_helpers/selectors.cjs +0 -58
  72. package/src/model/doc_set_helpers/serialize.cjs +0 -22
  73. package/src/model/doc_set_helpers/unsuccinctify.cjs +0 -288
  74. package/src/model/doc_set_helpers/update.cjs +0 -290
  75. package/src/model/document.cjs +0 -369
  76. package/src/model/document_helpers/blocks.cjs +0 -135
  77. package/src/model/document_helpers/chapter_verse.cjs +0 -291
  78. package/src/model/document_helpers/pre_enums.cjs +0 -67
  79. package/src/model/document_helpers/sequences.cjs +0 -205
  80. package/src/model/document_helpers/serialize_succinct.cjs +0 -55
  81. package/src/model/document_helpers/succinct_filter.cjs +0 -102
  82. package/src/model/versifications/eng_vrs.cjs +0 -455
  83. package/src/model/versifications/index.cjs +0 -38
  84. package/src/model/versifications/lxx_vrs.cjs +0 -950
  85. package/src/model/versifications/org_vrs.cjs +0 -155
  86. package/src/model/versifications/rsc_vrs.cjs +0 -342
  87. package/src/model/versifications/rso_vrs.cjs +0 -541
  88. package/src/model/versifications/vul_vrs.cjs +0 -835
  89. package/src/parser/index.cjs +0 -504
  90. package/src/parser/lexers/index.cjs +0 -11
  91. package/src/parser/lexers/lexingRegexes.cjs +0 -45
  92. package/src/parser/lexers/nodes.cjs +0 -123
  93. package/src/parser/lexers/object_for_fragment.cjs +0 -123
  94. package/src/parser/lexers/tsv.cjs +0 -45
  95. package/src/parser/lexers/usfm.cjs +0 -17
  96. package/src/parser/lexers/usx/index.cjs +0 -7
  97. package/src/parser/lexers/usx/usx_lexer.cjs +0 -321
  98. package/src/parser/lib/tokenize.cjs +0 -37
  99. package/src/parser/model/index.cjs +0 -637
  100. package/src/parser/parser_specs.cjs +0 -781
  101. package/src/pipelines/perf2x/index.cjs +0 -7
  102. package/src/pipelines/perf2x/perf2PkJsonPipeline.json +0 -41
  103. package/src/pipelines/perf2x/perf2usfmPipeline.json +0 -65
  104. package/src/transforms/calculateUsfmChapterPositions.cjs +0 -106
  105. package/src/transforms/index.cjs +0 -9
  106. package/src/transforms/perf2PkJson.cjs +0 -534
  107. package/src/transforms/perf2usfm.cjs +0 -294
  108. package/src/util/byteArray.cjs +0 -251
  109. package/src/util/canons.cjs +0 -117
  110. package/src/util/enums.cjs +0 -41
  111. package/src/util/generateId.cjs +0 -6
  112. package/src/util/graftDefs.cjs +0 -15
  113. package/src/util/index.cjs +0 -29
  114. package/src/util/inspectSuccinct.cjs +0 -59
  115. package/src/util/itemDefs.cjs +0 -33
  116. package/src/util/parserConstantDefs.cjs +0 -30
  117. package/src/util/scopeDefs.cjs +0 -173
  118. package/src/util/scriptlike/blocksSpec.cjs +0 -192
  119. package/src/util/scriptlike/dodson_lexicon.xsl +0 -19
  120. package/src/util/scriptlike/dodson_lexicon_to_entries.cjs +0 -85
  121. package/src/util/scriptlike/open_scriptures_hebrew_lexicon.xsl +0 -28
  122. package/src/util/scriptlike/open_scriptures_hebrew_lexicon_to_entries.cjs +0 -85
  123. package/src/util/succinct.cjs +0 -159
  124. package/src/util/tags.cjs +0 -28
  125. package/src/util/tokenDefs.cjs +0 -27
  126. package/src/util/versification.cjs +0 -364
@@ -1,85 +0,0 @@
1
- const fse = require('fs-extra');
2
- const { tokenizeString } = require('../../parser/lib/tokenize.cjs');
3
-
4
- const itemTokens = str => tokenizeString(str).map(tr => ({
5
- type: 'token',
6
- subType: tr[1],
7
- payload: tr[0],
8
- }));
9
-
10
- const rowRecord = rowArray => ({
11
- 'bs': {
12
- 'type': 'scope',
13
- 'subType': 'start',
14
- 'payload': `kvPrimary/${rowArray[0]}`,
15
- },
16
- 'bg': [],
17
- 'os': [],
18
- 'is': [
19
- {
20
- 'type': 'scope',
21
- 'subType': 'start',
22
- 'payload': `kvSecondary/strong/${rowArray[1]}`,
23
- },
24
- {
25
- 'type': 'scope',
26
- 'subType': 'start',
27
- 'payload': 'kvField/briefDef',
28
- },
29
- {
30
- 'type': 'scope',
31
- 'subType': 'start',
32
- 'payload': 'kvField/fullDef',
33
- },
34
- ],
35
- 'items': [
36
- {
37
- 'type': 'scope',
38
- 'subType': 'start',
39
- 'payload': `kvSecondary/strong/${rowArray[1]}`,
40
- },
41
- {
42
- 'type': 'scope',
43
- 'subType': 'start',
44
- 'payload': 'kvField/briefDef',
45
- },
46
- ...itemTokens(rowArray[4].length > 0 ? rowArray[4].replace(/; $/, '') : rowArray[5]),
47
- {
48
- 'type': 'scope',
49
- 'subType': 'end',
50
- 'payload': 'kvField/briefDef',
51
- },
52
- {
53
- 'type': 'scope',
54
- 'subType': 'start',
55
- 'payload': 'kvField/fullDef',
56
- },
57
- ...itemTokens(rowArray[3]),
58
- {
59
- 'type': 'scope',
60
- 'subType': 'end',
61
- 'payload': 'kvField/fullDef',
62
- },
63
- {
64
- 'type': 'scope',
65
- 'subType': 'end',
66
- 'payload': `kvSecondary/strong/${rowArray[1]}`,
67
- },
68
- ],
69
- });
70
-
71
- const lexicon_tsv = fse.readFileSync(process ?? process.argv[2])
72
- .toString()
73
- .split('\n')
74
- .map(row => row.split('\t'))
75
- .filter(row => row.length > 1);
76
-
77
- console.log(
78
- JSON.stringify(
79
- lexicon_tsv.map(
80
- row => rowRecord(row),
81
- ),
82
- null,
83
- 2,
84
- ),
85
- );
@@ -1,159 +0,0 @@
1
- const tokenDefs = require('./tokenDefs.cjs');
2
- const scopeDefs = require('./scopeDefs.cjs');
3
- const itemDefs = require('./itemDefs.cjs');
4
-
5
- const headerBytes = (succinct, pos) =>{
6
- const headerByte = succinct.byte(pos);
7
- const itemType = headerByte >> 6;
8
- const itemLength = headerByte & 0x0000003F;
9
- const itemSubtype = succinct.byte(pos + 1);
10
- return [itemLength, itemType, itemSubtype];
11
- };
12
-
13
- const succinctTokenChars = (enums, enumIndexes, succinct, itemSubtype, pos) => {
14
- const itemCategory = tokenDefs.tokenCategory[tokenDefs.tokenEnumLabels[itemSubtype]];
15
- const itemIndex = enumIndexes[itemCategory][succinct.nByte(pos + 2)];
16
- return enums[itemCategory].countedString(itemIndex);
17
- };
18
-
19
- const succinctScopeLabel = (enums, enumIndexes, succinct, itemSubtype, pos) => {
20
- const scopeType = scopeDefs.scopeEnumLabels[itemSubtype];
21
- let nScopeBits = scopeDefs.nComponentsForScope(scopeType);
22
- let offset = 2;
23
- let scopeBits = '';
24
-
25
- while (nScopeBits > 1) {
26
- const itemIndexIndex = succinct.nByte(pos + offset);
27
- const itemIndex = enumIndexes.scopeBits[itemIndexIndex];
28
- const scopeBitString = enums.scopeBits.countedString(itemIndex);
29
- scopeBits += `/${scopeBitString}`;
30
- offset += succinct.nByteLength(itemIndexIndex);
31
- nScopeBits--;
32
- }
33
- return `${scopeType}${scopeBits}`;
34
- };
35
-
36
- const succinctGraftName = (enums, enumIndexes, itemSubtype) => {
37
- const graftIndex = enumIndexes.graftTypes[itemSubtype];
38
- return enums.graftTypes.countedString(graftIndex);
39
- };
40
-
41
- const succinctGraftSeqId = (enums, enumIndexes, succinct, pos) => {
42
- const seqIndex = enumIndexes.ids[succinct.nByte(pos + 2)];
43
- return enums.ids.countedString(seqIndex);
44
- };
45
-
46
- const enumIndexes = (enums) => {
47
- const ret = {};
48
-
49
- for (const [category, succinct] of Object.entries(enums)) {
50
- ret[category] = enumIndex(category, succinct);
51
- }
52
- return ret;
53
- };
54
-
55
- const enumIndex = (category, enumSuccinct) => {
56
- const indexSuccinct = new Uint32Array(enumSuccinct.length);
57
- let pos = 0;
58
- let count = 0;
59
-
60
- while (pos < enumSuccinct.length) {
61
- indexSuccinct[count] = pos;
62
- const stringLength = enumSuccinct.byte(pos);
63
- pos += (stringLength + 1);
64
- count += 1;
65
- }
66
- return indexSuccinct;
67
- };
68
-
69
- const unpackEnum = (succinct, includeIndex) => {
70
- if (!includeIndex) {
71
- includeIndex = false;
72
- }
73
-
74
- let pos = 0;
75
- let count = 0;
76
- const ret = [];
77
-
78
- while (pos < succinct.length) {
79
- const stringLength = succinct.byte(pos);
80
- const unpacked = succinct.countedString(pos);
81
- ret.push(includeIndex ? [count, unpacked] : unpacked);
82
- pos += stringLength + 1;
83
- count++;
84
- }
85
- return ret;
86
- };
87
-
88
- const undefinedArgError = (func, field) => {
89
- throw new Error(`Undefined or null argument '${field}' in '${func}'`);
90
- };
91
-
92
- const pushSuccinctTokenBytes = (bA, tokenEnumIndex, charsEnumIndex) => {
93
- if (tokenEnumIndex === undefined || tokenEnumIndex === null) {
94
- undefinedArgError('pushSuccinctTokenBytes', 'tokenEnumIndex');
95
- }
96
-
97
- if (charsEnumIndex === undefined || charsEnumIndex === null) {
98
- undefinedArgError('pushSuccinctTokenBytes', 'charsEnumIndex');
99
- }
100
-
101
- const lengthPos = bA.length;
102
- bA.pushByte(0);
103
- bA.pushByte(tokenEnumIndex);
104
- bA.pushNByte(charsEnumIndex);
105
- bA.setByte(lengthPos, (bA.length - lengthPos) | itemDefs.itemEnum.token << 6);
106
- };
107
-
108
- const pushSuccinctGraftBytes = (bA, graftTypeEnumIndex, seqEnumIndex) => {
109
- if (graftTypeEnumIndex === undefined || graftTypeEnumIndex === null) {
110
- undefinedArgError('pushSuccinctGraftBytes', 'graftTypeEnumIndex');
111
- }
112
-
113
- if (seqEnumIndex === undefined || seqEnumIndex === null) {
114
- undefinedArgError('pushSuccinctGraftBytes', 'seqEnumIndex');
115
- }
116
-
117
- const lengthPos = bA.length;
118
- bA.pushByte(0);
119
- bA.pushByte(graftTypeEnumIndex);
120
- bA.pushNByte(seqEnumIndex);
121
- bA.setByte(lengthPos, (bA.length - lengthPos) | itemDefs.itemEnum.graft << 6);
122
- };
123
-
124
- const pushSuccinctScopeBytes = (bA, itemTypeByte, scopeTypeByte, scopeBitBytes) => {
125
- if (itemTypeByte === undefined || itemTypeByte === null) {
126
- undefinedArgError('pushSuccinctScopeBytes', 'itemTypeByte');
127
- }
128
-
129
- if (scopeTypeByte === undefined || scopeTypeByte === null) {
130
- undefinedArgError('pushSuccinctScopeBytes', 'scopeTypeByte');
131
- }
132
-
133
- if (scopeBitBytes === undefined || scopeBitBytes === null) {
134
- undefinedArgError('pushSuccinctScopeBytes', 'scopeBitBytes');
135
- }
136
-
137
- const lengthPos = bA.length;
138
- bA.pushByte(0);
139
- bA.pushByte(scopeTypeByte);
140
-
141
- for (const sbb of scopeBitBytes) {
142
- bA.pushNByte(sbb);
143
- }
144
- bA.setByte(lengthPos, (bA.length - lengthPos) | itemTypeByte << 6);
145
- };
146
-
147
- module.exports = {
148
- enumIndex,
149
- enumIndexes,
150
- headerBytes,
151
- pushSuccinctTokenBytes,
152
- pushSuccinctGraftBytes,
153
- pushSuccinctScopeBytes,
154
- succinctTokenChars,
155
- succinctScopeLabel,
156
- succinctGraftName,
157
- succinctGraftSeqId,
158
- unpackEnum,
159
- };
package/src/util/tags.cjs DELETED
@@ -1,28 +0,0 @@
1
- const xre = require('xregexp');
2
-
3
- const validateTags = tags => {
4
- for (const tag of tags) {
5
- validateTag(tag);
6
- }
7
- };
8
-
9
- const validateTag = tag => {
10
- if (!xre.exec(tag, /^[a-z][A-za-z0-9]*(:.+)?$/)) {
11
- throw new Error(`Tag '${tag}' is not valid (should be [a-z][A-za-z0-9]*(:.+)?)`);
12
- }
13
- };
14
-
15
- const addTag = (tags, tag) => {
16
- validateTag(tag);
17
- tags.add(tag);
18
- };
19
-
20
- const removeTag = (tags, tag) => {
21
- validateTag(tag);
22
- tags.delete(tag);
23
- };
24
-
25
- module.exports = {
26
- validateTags, validateTag, addTag, removeTag,
27
- };
28
-
@@ -1,27 +0,0 @@
1
- const tokenEnum = {
2
- wordLike: 0,
3
- punctuation: 1,
4
- lineSpace: 2,
5
- eol: 3,
6
- softLineBreak: 4,
7
- noBreakSpace: 5,
8
- bareSlash: 6,
9
- unknown: 7,
10
- };
11
-
12
- const tokenEnumLabels = Object.entries(tokenEnum).sort((a, b) => a[1] - b[1]).map(kv => kv[0]);
13
-
14
- const tokenCategory = {
15
- wordLike: 'wordLike',
16
- punctuation: 'notWordLike',
17
- lineSpace: 'notWordLike',
18
- eol: 'notWordLike',
19
- softLineBreak: 'notWordLike',
20
- noBreakSpace: 'notWordLike',
21
- bareSlash: 'notWordLike',
22
- unknown: 'notWordLike',
23
- };
24
-
25
- module.exports = {
26
- tokenEnum, tokenEnumLabels, tokenCategory,
27
- };
@@ -1,364 +0,0 @@
1
- const xre = require('xregexp');
2
-
3
- const ByteArray = require('./byteArray.cjs');
4
-
5
- const cvMappingType = 2;
6
- const bcvMappingType = 3;
7
-
8
- const bookCodes = [ // From Paratext via Scripture Burrito
9
- 'GEN',
10
- 'EXO',
11
- 'LEV',
12
- 'NUM',
13
- 'DEU',
14
- 'JOS',
15
- 'JDG',
16
- 'RUT',
17
- '1SA',
18
- '2SA',
19
- '1KI',
20
- '2KI',
21
- '1CH',
22
- '2CH',
23
- 'EZR',
24
- 'NEH',
25
- 'EST',
26
- 'JOB',
27
- 'PSA',
28
- 'PRO',
29
- 'ECC',
30
- 'SNG',
31
- 'ISA',
32
- 'JER',
33
- 'LAM',
34
- 'EZK',
35
- 'DAN',
36
- 'HOS',
37
- 'JOL',
38
- 'AMO',
39
- 'OBA',
40
- 'JON',
41
- 'MIC',
42
- 'NAM',
43
- 'HAB',
44
- 'ZEP',
45
- 'HAG',
46
- 'ZEC',
47
- 'MAL',
48
- 'MAT',
49
- 'MRK',
50
- 'LUK',
51
- 'JHN',
52
- 'ACT',
53
- 'ROM',
54
- '1CO',
55
- '2CO',
56
- 'GAL',
57
- 'EPH',
58
- 'PHP',
59
- 'COL',
60
- '1TH',
61
- '2TH',
62
- '1TI',
63
- '2TI',
64
- 'TIT',
65
- 'PHM',
66
- 'HEB',
67
- 'JAS',
68
- '1PE',
69
- '2PE',
70
- '1JN',
71
- '2JN',
72
- '3JN',
73
- 'JUD',
74
- 'REV',
75
- 'TOB',
76
- 'JDT',
77
- 'ESG',
78
- 'WIS',
79
- 'SIR',
80
- 'BAR',
81
- 'LJE',
82
- 'S3Y',
83
- 'SUS',
84
- 'BEL',
85
- '1MA',
86
- '2MA',
87
- '3MA',
88
- '4MA',
89
- '1ES',
90
- '2ES',
91
- 'MAN',
92
- 'PS2',
93
- 'ODA',
94
- 'PSS',
95
- 'JSA',
96
- 'JDB',
97
- 'TBS',
98
- 'SST',
99
- 'DNT',
100
- 'BLT',
101
- 'EZA',
102
- '5EZ',
103
- '6EZ',
104
- 'DAG',
105
- 'PS3',
106
- '2BA',
107
- 'LBA',
108
- 'JUB',
109
- 'ENO',
110
- '1MQ',
111
- '2MQ',
112
- '3MQ',
113
- 'REP',
114
- '4BA',
115
- 'LAO',
116
- ];
117
-
118
- const bookCodeIndex = () => {
119
- const ret = {};
120
-
121
- for (const [bookN, book] of Object.entries(bookCodes)) {
122
- ret[book] = parseInt(bookN);
123
- }
124
- return ret;
125
- };
126
-
127
- const vrs2json = vrsString => {
128
- const ret = {};
129
-
130
- for (
131
- const vrsLineBits of
132
- vrsString
133
- .split(/[\n\r]+/)
134
- .map(l => l.trim())
135
- .map(l => xre.exec(l, xre('^([A-Z1-6]{3} [0-9]+:[0-9]+(-[0-9]+)?) = ([A-Z1-6]{3} [0-9]+:[0-9]+[a-z]?(-[0-9]+)?)$')))
136
- ) {
137
- if (!vrsLineBits) {
138
- continue;
139
- }
140
-
141
- if (!(vrsLineBits[1] in ret)) {
142
- ret[vrsLineBits[1]] = [];
143
- }
144
- ret[vrsLineBits[1]].push(vrsLineBits[3]);
145
- }
146
- return { mappedVerses: ret };
147
- };
148
-
149
- const reverseVersification = vrsJson => {
150
- // Assumes each verse is only mapped from once
151
- const ret = {};
152
-
153
- for (const [fromSpec, toSpecs] of Object.entries(vrsJson.mappedVerses)) {
154
- for (const toSpec of toSpecs) {
155
- if (toSpec in ret) {
156
- ret[toSpec].push(fromSpec);
157
- } else {
158
- ret[toSpec] = [fromSpec];
159
- }
160
- }
161
- }
162
- return { reverseMappedVerses: ret };
163
- };
164
-
165
- const preSuccinctVerseMapping = mappingJson => {
166
- const ret = {};
167
-
168
- for (let [fromSpec, toSpecs] of Object.entries(mappingJson)) {
169
- if (typeof toSpecs === 'string') {
170
- toSpecs = [toSpecs];
171
- }
172
-
173
- const [fromBook, fromCVV] = fromSpec.split(' ');
174
- const toBook = toSpecs[0].split(' ')[0];
175
- const record = toBook === fromBook ? ['cv'] : ['bcv'];
176
- let [fromCh, fromV] = fromCVV.split(':');
177
- let toV = fromV;
178
-
179
- if (fromV.includes('-')) {
180
- const vBits = fromV.split('-');
181
- fromV = vBits[0];
182
- toV = vBits[1];
183
- }
184
- record.push([parseInt(fromV), parseInt(toV)]);
185
- record.push([]);
186
-
187
- for (const toCVV of toSpecs.map(ts => ts.split(' ')[1])) {
188
- let [toCh, fromV] = toCVV.split(':');
189
- let toV = fromV;
190
-
191
- if (fromV.includes('-')) {
192
- const vBits = fromV.split('-');
193
- fromV = vBits[0];
194
- toV = vBits[1];
195
- }
196
-
197
- if (record[0] === 'cv') {
198
- record[2].push([parseInt(toCh), parseInt(fromV), parseInt(toV)]);
199
- } else {
200
- record[2].push([parseInt(toCh), parseInt(fromV), parseInt(toV), toBook]);
201
- }
202
- }
203
-
204
- if (!(fromBook in ret)) {
205
- ret[fromBook] = {};
206
- }
207
-
208
- if (!(fromCh in ret[fromBook])) {
209
- ret[fromBook][fromCh] = [];
210
- }
211
- ret[fromBook][fromCh].push(record);
212
- }
213
- return ret;
214
- };
215
-
216
- const succinctifyVerseMappings = preSuccinct => {
217
- const ret = {};
218
- const bci = bookCodeIndex();
219
-
220
- for (const [book, chapters] of Object.entries(preSuccinctVerseMapping(preSuccinct))) {
221
- ret[book] = {};
222
-
223
- for (const [chapter, mappings] of Object.entries(chapters)) {
224
- ret[book][chapter] = succinctifyVerseMapping(mappings, bci);
225
- }
226
- }
227
- return ret;
228
- };
229
-
230
- const succinctifyVerseMapping = (preSuccinctBC, bci) => {
231
- const makeMappingLengthByte = (recordType, length) =>
232
- length + (recordType * 64);
233
-
234
- const ret = new ByteArray(64);
235
-
236
- for (const [recordTypeStr, [fromVerseStart, fromVerseEnd], mappings] of preSuccinctBC) {
237
- const pos = ret.length;
238
- const recordType = recordTypeStr === 'bcv' ? bcvMappingType : cvMappingType;
239
- ret.pushNBytes([0, fromVerseStart, fromVerseEnd]);
240
-
241
- if (recordType === bcvMappingType) {
242
- const bookIndex = bci[mappings[0][3]];
243
- ret.pushNByte(bookIndex);
244
- }
245
- ret.pushNByte(mappings.length);
246
-
247
- for (const [ch, fromV] of mappings) {
248
- ret.pushNBytes([ch, fromV]);
249
- }
250
-
251
- const recordLength = ret.length - pos;
252
-
253
- if (recordLength > 63) {
254
- throw new Error(`Mapping in succinctifyVerseMapping ${JSON.stringify(mappings)} is too long (${recordLength} bytes)`);
255
- }
256
- ret.setByte(pos, makeMappingLengthByte(recordType, recordLength));
257
- }
258
- ret.trim();
259
- return ret;
260
- };
261
-
262
- const mappingLengthByte = (succinct, pos) => {
263
- const sByte = succinct.byte(pos);
264
- return [
265
- sByte >> 6,
266
- sByte % 64,
267
- ];
268
- };
269
-
270
- // eslint-disable-next-line no-unused-vars
271
- const unsuccinctifyVerseMapping = (succinctBC, fromBookCode, bci) => {
272
- const ret = [];
273
- let pos = 0;
274
-
275
- while (pos < succinctBC.length) {
276
- let recordPos = pos;
277
- const unsuccinctRecord = {};
278
- const [recordType, recordLength] = mappingLengthByte(succinctBC, pos);
279
- recordPos++;
280
- unsuccinctRecord.fromVerseStart = succinctBC.nByte(recordPos);
281
- recordPos += succinctBC.nByteLength(unsuccinctRecord.fromVerseStart);
282
- unsuccinctRecord.fromVerseEnd = succinctBC.nByte(recordPos);
283
- recordPos += succinctBC.nByteLength(unsuccinctRecord.fromVerseEnd);
284
- unsuccinctRecord.bookCode = fromBookCode;
285
-
286
- if (recordType === bcvMappingType) {
287
- const bookIndex = succinctBC.nByte(recordPos);
288
- unsuccinctRecord.bookCode = bookCodes[bookIndex];
289
- recordPos += succinctBC.nByteLength(bookIndex);
290
- }
291
-
292
- const nMappings = succinctBC.nByte(recordPos);
293
- recordPos += succinctBC.nByteLength(nMappings);
294
- const mappings = [];
295
-
296
- while (mappings.length < nMappings) {
297
- const mapping = {};
298
- mapping.ch = succinctBC.nByte(recordPos);
299
- recordPos += succinctBC.nByteLength(mapping.ch);
300
- mapping.verseStart = succinctBC.nByte(recordPos);
301
- recordPos += succinctBC.nByteLength(mapping.verseStart);
302
- mappings.push(mapping);
303
- }
304
- unsuccinctRecord.mapping = mappings;
305
- ret.push(unsuccinctRecord);
306
- pos += recordLength;
307
- }
308
- return ret;
309
- };
310
-
311
- const mapVerse = (succinct, b, c, v) => {
312
- // Succinct for one chapter.
313
- // Pass book and chapter to provide complete response in each case.
314
- let ret = null;
315
- let pos = 0;
316
-
317
- while (pos < succinct.length) {
318
- let recordPos = pos;
319
- const [recordType, recordLength] = mappingLengthByte(succinct, pos);
320
- recordPos++;
321
- const fromVerseStart = succinct.nByte(recordPos);
322
- recordPos += succinct.nByteLength(fromVerseStart);
323
- const fromVerseEnd = succinct.nByte(recordPos);
324
- recordPos += succinct.nByteLength(fromVerseEnd);
325
-
326
- if (v < fromVerseStart || v > fromVerseEnd) {
327
- pos += recordLength;
328
- continue;
329
- }
330
-
331
- let bookCode = b;
332
-
333
- if (recordType === bcvMappingType) {
334
- const bookIndex = succinct.nByte(recordPos);
335
- bookCode = bookCodes[bookIndex];
336
- recordPos += succinct.nByteLength(bookIndex);
337
- }
338
- ret = [bookCode, []];
339
- const nMappings = succinct.nByte(recordPos);
340
- recordPos += succinct.nByteLength(nMappings);
341
-
342
- while (ret[1].length < nMappings) {
343
- const ch = succinct.nByte(recordPos);
344
- recordPos += succinct.nByteLength(ch);
345
- const verseStart = succinct.nByte(recordPos);
346
- recordPos += succinct.nByteLength(verseStart);
347
- ret[1].push([ch, (v - fromVerseStart) + verseStart]);
348
- }
349
- break;
350
- }
351
- return ret || [b, [[c, v]]];
352
- };
353
-
354
- module.exports = {
355
- vrs2json,
356
- reverseVersification,
357
- preSuccinctVerseMapping,
358
- bookCodes,
359
- succinctifyVerseMapping,
360
- succinctifyVerseMappings,
361
- unsuccinctifyVerseMapping,
362
- bookCodeIndex,
363
- mapVerse,
364
- };