proskomma-core 0.9.7 → 0.9.12

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 (300) hide show
  1. package/.eslintrc.json +79 -0
  2. package/.gitattributes +2 -0
  3. package/babel.config.js +18 -0
  4. package/docs/_config.yml +1 -0
  5. package/docs/index.md +3 -0
  6. package/docs/pk_edit_0_9.odt +0 -0
  7. package/docs/pk_edit_0_9.pdf +0 -0
  8. package/docs/proskomma_101_slideshow.odp +0 -0
  9. package/docs/proskomma_101_slideshow.pdf +0 -0
  10. package/docs/proskomma_edit_html.png +0 -0
  11. package/docs/proskomma_edit_html.svg +451 -0
  12. package/docs/proskomma_edit_reference.png +0 -0
  13. package/docs/proskomma_edit_reference.svg +349 -0
  14. package/docs/repo_logo.png +0 -0
  15. package/esm/package.json +3 -0
  16. package/esm/wrapper.mjs +5 -0
  17. package/index.js +6 -0
  18. package/package.json +19 -17
  19. package/src/graph/index.cjs +201 -0
  20. package/src/graph/lib/do_cv.cjs +249 -0
  21. package/src/graph/lib/dump.cjs +40 -0
  22. package/src/graph/lib/remake_blocks.cjs +57 -0
  23. package/src/graph/lib/sequence_chars.cjs +84 -0
  24. package/src/graph/lib/sort.cjs +39 -0
  25. package/src/graph/lib/tribos.cjs +97 -0
  26. package/src/graph/lib/tribos_expression.cjs +556 -0
  27. package/src/graph/lib/tribos_ohm_UNUSED.cjs +37 -0
  28. package/src/graph/lib/tribos_step.cjs +434 -0
  29. package/src/graph/mutations/add.cjs +91 -0
  30. package/src/graph/mutations/delete.cjs +61 -0
  31. package/src/graph/mutations/index.cjs +54 -0
  32. package/src/graph/mutations/rehash.cjs +17 -0
  33. package/src/graph/mutations/tags.cjs +120 -0
  34. package/src/graph/mutations/update.cjs +210 -0
  35. package/src/graph/mutations/versification.cjs +96 -0
  36. package/src/graph/queries/block.cjs +228 -0
  37. package/src/graph/queries/cIndex.cjs +87 -0
  38. package/src/graph/queries/cell.cjs +42 -0
  39. package/src/graph/queries/cv.cjs +19 -0
  40. package/src/graph/queries/cvBook.cjs +16 -0
  41. package/src/graph/queries/cvChapter.cjs +16 -0
  42. package/src/graph/queries/cvIndex.cjs +47 -0
  43. package/src/graph/queries/cvNavigation.cjs +116 -0
  44. package/src/graph/queries/cvVerseElement.cjs +84 -0
  45. package/src/graph/queries/cvVerses.cjs +14 -0
  46. package/src/graph/queries/doc_set.cjs +220 -0
  47. package/src/graph/queries/document.cjs +555 -0
  48. package/src/graph/queries/idParts.cjs +30 -0
  49. package/src/graph/queries/index.cjs +151 -0
  50. package/src/graph/queries/inputBlockSpec.cjs +17 -0
  51. package/src/graph/queries/inputItemObject.cjs +12 -0
  52. package/src/graph/queries/input_att_spec.cjs +14 -0
  53. package/src/graph/queries/input_key_matches.cjs +11 -0
  54. package/src/graph/queries/input_key_value.cjs +11 -0
  55. package/src/graph/queries/input_key_values.cjs +11 -0
  56. package/src/graph/queries/input_selector_spec.cjs +19 -0
  57. package/src/graph/queries/item.cjs +71 -0
  58. package/src/graph/queries/itemGroup.cjs +75 -0
  59. package/src/graph/queries/key_value.cjs +18 -0
  60. package/src/graph/queries/kv_entry.cjs +21 -0
  61. package/src/graph/queries/kv_sequence.cjs +151 -0
  62. package/src/graph/queries/node.cjs +44 -0
  63. package/src/graph/queries/orig.cjs +11 -0
  64. package/src/graph/queries/regex_index.cjs +18 -0
  65. package/src/graph/queries/row_equals_spec.cjs +11 -0
  66. package/src/graph/queries/row_match_spec.cjs +11 -0
  67. package/src/graph/queries/selector_spec.cjs +29 -0
  68. package/src/graph/queries/sequence.cjs +314 -0
  69. package/src/graph/queries/table_sequence.cjs +192 -0
  70. package/src/graph/queries/tree_sequence.cjs +58 -0
  71. package/src/graph/queries/verseNumber.cjs +44 -0
  72. package/src/graph/queries/verseRange.cjs +11 -0
  73. package/src/graph/queries/versification.cjs +25 -0
  74. package/src/index.cjs +583 -0
  75. package/src/model/doc_set.cjs +389 -0
  76. package/src/model/doc_set_helpers/block.cjs +232 -0
  77. package/src/model/doc_set_helpers/enum.cjs +87 -0
  78. package/src/model/doc_set_helpers/item.cjs +198 -0
  79. package/src/model/doc_set_helpers/rehash.cjs +53 -0
  80. package/src/model/doc_set_helpers/selectors.cjs +58 -0
  81. package/src/model/doc_set_helpers/serialize.cjs +22 -0
  82. package/src/model/doc_set_helpers/unsuccinctify.cjs +288 -0
  83. package/src/model/doc_set_helpers/update.cjs +290 -0
  84. package/src/model/document.cjs +369 -0
  85. package/src/model/document_helpers/blocks.cjs +135 -0
  86. package/src/model/document_helpers/chapter_verse.cjs +291 -0
  87. package/src/model/document_helpers/pre_enums.cjs +67 -0
  88. package/src/model/document_helpers/sequences.cjs +205 -0
  89. package/src/model/document_helpers/serialize_succinct.cjs +55 -0
  90. package/src/model/document_helpers/succinct_filter.cjs +102 -0
  91. package/src/model/versifications/eng_vrs.cjs +455 -0
  92. package/src/model/versifications/index.cjs +38 -0
  93. package/src/model/versifications/lxx_vrs.cjs +950 -0
  94. package/src/model/versifications/org_vrs.cjs +155 -0
  95. package/src/model/versifications/rsc_vrs.cjs +342 -0
  96. package/src/model/versifications/rso_vrs.cjs +541 -0
  97. package/src/model/versifications/vul_vrs.cjs +835 -0
  98. package/src/parser/index.cjs +506 -0
  99. package/src/parser/lexers/index.cjs +11 -0
  100. package/src/parser/lexers/lexingRegexes.cjs +45 -0
  101. package/src/parser/lexers/nodes.cjs +123 -0
  102. package/src/parser/lexers/object_for_fragment.cjs +123 -0
  103. package/src/parser/lexers/tsv.cjs +45 -0
  104. package/src/parser/lexers/usfm.cjs +17 -0
  105. package/src/parser/lexers/usx/index.cjs +7 -0
  106. package/src/parser/lexers/usx/usx_lexer.cjs +321 -0
  107. package/src/parser/lib/tokenize.cjs +37 -0
  108. package/src/parser/model/index.cjs +637 -0
  109. package/src/parser/parser_specs.cjs +781 -0
  110. package/src/pipelines/perf2x/index.cjs +7 -0
  111. package/src/pipelines/perf2x/perf2PkJsonPipeline.json +41 -0
  112. package/src/pipelines/perf2x/perf2usfmPipeline.json +65 -0
  113. package/src/transforms/calculateUsfmChapterPositions.cjs +106 -0
  114. package/src/transforms/index.cjs +9 -0
  115. package/src/transforms/perf2PkJson.cjs +534 -0
  116. package/src/transforms/perf2usfm.cjs +294 -0
  117. package/src/util/byteArray.cjs +251 -0
  118. package/src/util/canons.cjs +117 -0
  119. package/src/util/enums.cjs +41 -0
  120. package/src/util/generateId.cjs +6 -0
  121. package/src/util/graftDefs.cjs +15 -0
  122. package/src/util/index.cjs +29 -0
  123. package/src/util/inspectSuccinct.cjs +59 -0
  124. package/src/util/itemDefs.cjs +33 -0
  125. package/src/util/parserConstantDefs.cjs +30 -0
  126. package/src/util/scopeDefs.cjs +173 -0
  127. package/src/util/scriptlike/blocksSpec.cjs +192 -0
  128. package/src/util/scriptlike/dodson_lexicon.xsl +19 -0
  129. package/src/util/scriptlike/dodson_lexicon_to_entries.cjs +85 -0
  130. package/src/util/scriptlike/open_scriptures_hebrew_lexicon.xsl +28 -0
  131. package/src/util/scriptlike/open_scriptures_hebrew_lexicon_to_entries.cjs +85 -0
  132. package/src/util/succinct.cjs +159 -0
  133. package/src/util/tags.cjs +28 -0
  134. package/src/util/tokenDefs.cjs +27 -0
  135. package/src/util/versification.cjs +364 -0
  136. package/test/code/main/bad.cjs +79 -0
  137. package/test/code/main/basics.cjs +534 -0
  138. package/test/code/main/block.cjs +586 -0
  139. package/test/code/main/block_scope_numbers.cjs +31 -0
  140. package/test/code/main/blocks_with_atts.cjs +150 -0
  141. package/test/code/main/blocks_with_cv.cjs +250 -0
  142. package/test/code/main/break.cjs +73 -0
  143. package/test/code/main/checksum.cjs +36 -0
  144. package/test/code/main/cl_global.cjs +35 -0
  145. package/test/code/main/class_for_fragment.cjs +18 -0
  146. package/test/code/main/clean_usfm.cjs +46 -0
  147. package/test/code/main/cp_vp.cjs +158 -0
  148. package/test/code/main/custom.cjs +124 -0
  149. package/test/code/main/cv.cjs +249 -0
  150. package/test/code/main/cvMatching.cjs +155 -0
  151. package/test/code/main/cv_indexes.cjs +189 -0
  152. package/test/code/main/cv_navigation.cjs +124 -0
  153. package/test/code/main/document.cjs +382 -0
  154. package/test/code/main/empty_blocks.cjs +71 -0
  155. package/test/code/main/entries.cjs +402 -0
  156. package/test/code/main/export_lexing_regexes.cjs +19 -0
  157. package/test/code/main/fig.cjs +67 -0
  158. package/test/code/main/filter.cjs +222 -0
  159. package/test/code/main/glossary.cjs +36 -0
  160. package/test/code/main/graft_headings.cjs +36 -0
  161. package/test/code/main/graft_introduction.cjs +96 -0
  162. package/test/code/main/graft_note.cjs +104 -0
  163. package/test/code/main/graft_rems.cjs +34 -0
  164. package/test/code/main/graft_sidebars.cjs +62 -0
  165. package/test/code/main/graft_title.cjs +36 -0
  166. package/test/code/main/hello.cjs +105 -0
  167. package/test/code/main/import_document.cjs +22 -0
  168. package/test/code/main/import_usfm_int.cjs +48 -0
  169. package/test/code/main/item_groups.cjs +133 -0
  170. package/test/code/main/items_with_cv.cjs +311 -0
  171. package/test/code/main/milestone_attributes.cjs +163 -0
  172. package/test/code/main/mixed_sequence_documents.cjs +137 -0
  173. package/test/code/main/mixed_sequences.cjs +217 -0
  174. package/test/code/main/modify_sequence.cjs +29 -0
  175. package/test/code/main/multiple_chapters.cjs +58 -0
  176. package/test/code/main/multiple_content.cjs +105 -0
  177. package/test/code/main/mutate_add.cjs +180 -0
  178. package/test/code/main/mutate_delete.cjs +236 -0
  179. package/test/code/main/mutate_rehash.cjs +68 -0
  180. package/test/code/main/mutate_tags.cjs +90 -0
  181. package/test/code/main/mutate_update.cjs +538 -0
  182. package/test/code/main/selectors.cjs +289 -0
  183. package/test/code/main/sequence.cjs +361 -0
  184. package/test/code/main/serialize.cjs +104 -0
  185. package/test/code/main/spans.cjs +51 -0
  186. package/test/code/main/split_long_tokens.cjs +30 -0
  187. package/test/code/main/standard_vrs.cjs +76 -0
  188. package/test/code/main/subclass.cjs +25 -0
  189. package/test/code/main/table.cjs +119 -0
  190. package/test/code/main/tags.cjs +248 -0
  191. package/test/code/main/token_alignment.cjs +84 -0
  192. package/test/code/main/trees.cjs +211 -0
  193. package/test/code/main/tribos.cjs +865 -0
  194. package/test/code/main/tsv.cjs +385 -0
  195. package/test/code/main/usx_ref.cjs +65 -0
  196. package/test/code/main/verse_mapping.cjs +252 -0
  197. package/test/code/main/verse_range.cjs +31 -0
  198. package/test/code/main/word_likes.cjs +41 -0
  199. package/test/code/utils/byte_array.cjs +271 -0
  200. package/test/code/utils/canons.cjs +20 -0
  201. package/test/code/utils/generate_id.cjs +17 -0
  202. package/test/code/utils/graft_defs.cjs +16 -0
  203. package/test/code/utils/inspect.cjs +130 -0
  204. package/test/code/utils/items.cjs +56 -0
  205. package/test/code/utils/push_succinct.cjs +69 -0
  206. package/test/code/utils/scope_defs.cjs +79 -0
  207. package/test/code/utils/serialize.cjs +28 -0
  208. package/test/code/utils/splice.cjs +67 -0
  209. package/test/code/utils/tags.cjs +69 -0
  210. package/test/code/utils/versification.cjs +249 -0
  211. package/test/lib/load.js +110 -0
  212. package/test/skipped_code/diff.js +53 -0
  213. package/test/test_data/inputBlockSpec/dodson.json +1654 -0
  214. package/test/test_data/inputBlockSpec/kv.json +326 -0
  215. package/test/test_data/inputBlockSpec/mk1.json +1019 -0
  216. package/test/test_data/inputBlockSpec/table.json +170 -0
  217. package/test/test_data/tree/genealogy.json +55 -0
  218. package/test/test_data/tree/jude.json +15965 -0
  219. package/test/test_data/tsv/en_tn_66-JUD.tsv +75 -0
  220. package/test/test_data/tsv/twl_JUD.tsv +144 -0
  221. package/test/test_data/usfm/1pe_webbe.usfm +13 -0
  222. package/test/test_data/usfm/66-JUD-ust.usfm +1089 -0
  223. package/test/test_data/usfm/78-GALspavbl.usfm +10 -0
  224. package/test/test_data/usfm/add_test.usfm +15 -0
  225. package/test/test_data/usfm/backslash.usfm +4 -0
  226. package/test/test_data/usfm/cl.usfm +14 -0
  227. package/test/test_data/usfm/cp_vp.usfm +8 -0
  228. package/test/test_data/usfm/custom.usfm +13 -0
  229. package/test/test_data/usfm/en_ust_oba.usfm +875 -0
  230. package/test/test_data/usfm/en_ust_psa_1.usfm +20 -0
  231. package/test/test_data/usfm/fig.usfm +3 -0
  232. package/test/test_data/usfm/filter.usfm +7 -0
  233. package/test/test_data/usfm/footnote.usfm +11 -0
  234. package/test/test_data/usfm/frt.usfm +4 -0
  235. package/test/test_data/usfm/headings.usfm +7 -0
  236. package/test/test_data/usfm/hello.usfm +8 -0
  237. package/test/test_data/usfm/int.usfm +7 -0
  238. package/test/test_data/usfm/milestone_attributes.usfm +7 -0
  239. package/test/test_data/usfm/milestone_attributes_default.usfm +7 -0
  240. package/test/test_data/usfm/no_break_space.usfm +4 -0
  241. package/test/test_data/usfm/no_mt.usfm +6 -0
  242. package/test/test_data/usfm/rems.usfm +6 -0
  243. package/test/test_data/usfm/section_intros.usfm +26 -0
  244. package/test/test_data/usfm/sidebars.usfm +25 -0
  245. package/test/test_data/usfm/slash_in_att.usfm +6 -0
  246. package/test/test_data/usfm/soft_line_break.usfm +4 -0
  247. package/test/test_data/usfm/spans.usfm +5 -0
  248. package/test/test_data/usfm/split_long_tokens.usfm +6 -0
  249. package/test/test_data/usfm/table.usfm +18 -0
  250. package/test/test_data/usfm/table_at_end.usfm +11 -0
  251. package/test/test_data/usfm/table_in_intro.usfm +22 -0
  252. package/test/test_data/usfm/table_no_end_cells.usfm +18 -0
  253. package/test/test_data/usfm/tit_kitchen_sink.usfm +73 -0
  254. package/test/test_data/usfm/titus_template.usfm +58 -0
  255. package/test/test_data/usfm/ugnt_3jn.usfm +265 -0
  256. package/test/test_data/usfm/ult_3jn.usfm +335 -0
  257. package/test/test_data/usfm/unknown.usfm +5 -0
  258. package/test/test_data/usfm/ust_psa.usfm +29 -0
  259. package/test/test_data/usfm/ust_psa_verse_ranges.usfm +24 -0
  260. package/test/test_data/usfm/ust_psa_with_ts.usfm +29 -0
  261. package/test/test_data/usfm/verse_breaks_in_blocks.usfm +20 -0
  262. package/test/test_data/usfm/verse_range.usfm +7 -0
  263. package/test/test_data/usfm/web_ecc.usfm +391 -0
  264. package/test/test_data/usfm/web_psa51.usfm +71 -0
  265. package/test/test_data/usfm/whitespace.usfm +12 -0
  266. package/test/test_data/usfm/xref.usfm +11 -0
  267. package/test/test_data/usx/bad_element.usx +2 -0
  268. package/test/test_data/usx/cp_vp.usx +12 -0
  269. package/test/test_data/usx/diff1.usx +59 -0
  270. package/test/test_data/usx/diff2.usx +74 -0
  271. package/test/test_data/usx/douay_rheims_ecc.usx +58 -0
  272. package/test/test_data/usx/douay_rheims_psa.usx +5366 -0
  273. package/test/test_data/usx/douay_rheims_psa_40_60.usx +666 -0
  274. package/test/test_data/usx/douay_rheims_rut.usx +26 -0
  275. package/test/test_data/usx/esg3.usx +47 -0
  276. package/test/test_data/usx/fig.usx +6 -0
  277. package/test/test_data/usx/milestone_attributes.usx +11 -0
  278. package/test/test_data/usx/not_nfc18_glo.usx +9 -0
  279. package/test/test_data/usx/not_nfc18_phm.usx +24 -0
  280. package/test/test_data/usx/opt_break.usx +10 -0
  281. package/test/test_data/usx/sidebars.usx +29 -0
  282. package/test/test_data/usx/table.usx +23 -0
  283. package/test/test_data/usx/web_psa.usx +8489 -0
  284. package/test/test_data/usx/web_psa150.usx +33 -0
  285. package/test/test_data/usx/web_psa_40_60.usx +1079 -0
  286. package/test/test_data/usx/web_rut.usx +95 -0
  287. package/test/test_data/usx/web_rut_1.usx +17 -0
  288. package/test/test_data/utils/douay_rheims.vrs +520 -0
  289. package/test/test_data/utils/douay_rheims_PSA.usx +5366 -0
  290. package/test/test_data/utils/serialize_example.json +91 -0
  291. package/test/test_data/utils/truncated_versification.vrs +29 -0
  292. package/test/test_data/utils/web_rut_items.json +2977 -0
  293. package/test/test_data/utils/webbe.vrs +395 -0
  294. package/test/test_data/utils/webbe_PSA.usx +8489 -0
  295. package/test/test_data/vrs/douay_rheims.vrs +520 -0
  296. package/test/test_data/vrs/truncated_versification.vrs +27 -0
  297. package/test/test_data/vrs/webbe.vrs +397 -0
  298. package/webpack.prod.js +50 -0
  299. package/dist/index.js +0 -8
  300. package/dist/index.js.LICENSE.txt +0 -23
@@ -0,0 +1,130 @@
1
+ const path = require('path');
2
+ const test = require('tape');
3
+ const fs = require('fs-extra');
4
+ const { utils } = require('../../../src/index.cjs');
5
+ const ByteArray = utils.ByteArray;
6
+ const { unpackEnum } = utils.succinct;
7
+ const { inspectEnum, inspectSuccinct } = utils.inspect;
8
+ const { enumStringIndex, enumRegexIndexTuples } = utils.enums;
9
+
10
+ const testGroup = 'Inspect';
11
+
12
+ const serialized = fs.readJsonSync(path.resolve(__dirname, '../../test_data/utils/serialize_example.json'));
13
+
14
+ test(
15
+ `enum array (${testGroup})`,
16
+ function (t) {
17
+ try {
18
+ t.plan(Object.keys(serialized.enums).length);
19
+
20
+ for (const enumString of Object.values(serialized.enums)) {
21
+ const ba = new ByteArray();
22
+ ba.fromBase64(enumString);
23
+ const enumArray = unpackEnum(ba);
24
+ t.ok(enumArray);
25
+ }
26
+ } catch (err) {
27
+ console.log(err);
28
+ }
29
+ },
30
+ );
31
+
32
+ test(
33
+ `enum entries (${testGroup})`,
34
+ function (t) {
35
+ try {
36
+ t.plan(Object.keys(serialized.enums).length);
37
+
38
+ for (const [category, enumString] of Object.entries(serialized.enums)) {
39
+ const ba = new ByteArray();
40
+ ba.fromBase64(enumString);
41
+ const enumStrings = unpackEnum(ba);
42
+ const inspected = inspectEnum(enumString);
43
+ // console.log("***", category, "***");
44
+ // console.log(inspected);
45
+ t.ok(inspected);
46
+ }
47
+ } catch (err) {
48
+ console.log(err);
49
+ }
50
+ },
51
+ );
52
+
53
+ test(
54
+ `succinct (${testGroup})`,
55
+ function (t) {
56
+ try {
57
+ t.plan(12);
58
+ const doc = Object.values(serialized.docs)[0];
59
+ const mainSequence = doc.sequences[doc.mainId];
60
+
61
+ for (const block of mainSequence.blocks) {
62
+ for (const [category, succinct] of Object.entries(block)) {
63
+ const inspected = inspectSuccinct(succinct, serialized.enums);
64
+ // console.log("***", category, "***");
65
+ // console.log(inspected);
66
+ t.ok(inspected);
67
+ }
68
+ }
69
+ } catch (err) {
70
+ console.log(err);
71
+ }
72
+ },
73
+ );
74
+
75
+ test(
76
+ `enum index (${testGroup})`,
77
+ function (t) {
78
+ try {
79
+ t.plan(Object.entries(serialized.enums).length);
80
+
81
+ for (const [category, enumString] of Object.entries(serialized.enums)) {
82
+ const ba = new ByteArray();
83
+ ba.fromBase64(enumString);
84
+ const enumValues = unpackEnum(ba);
85
+ let allGood = true;
86
+ let count = 0;
87
+
88
+ for (const enumValue of enumValues) {
89
+ const enumIndex = enumStringIndex(ba, enumValue);
90
+
91
+ if (enumIndex < 0) {
92
+ allGood = false;
93
+ break;
94
+ }
95
+
96
+ if (enumIndex !== count) {
97
+ allGood = false;
98
+ break;
99
+ }
100
+ count += 1;
101
+ }
102
+ t.ok(allGood);
103
+ }
104
+ } catch (err) {
105
+ console.log(err);
106
+ }
107
+ },
108
+ );
109
+
110
+ test(
111
+ `enum regex indexes (${testGroup})`,
112
+ function (t) {
113
+ try {
114
+ const expectedTokens = ['you', 'your', 'young', 'yourself', 'You', 'Your'];
115
+ t.plan(1 + expectedTokens.length);
116
+ const enumString = serialized.enums.wordLike;
117
+ const ba = new ByteArray();
118
+ ba.fromBase64(enumString);
119
+ const enumIndexes = enumRegexIndexTuples(ba, 'You');
120
+ const foundTokens = enumIndexes.map(ei => ei[1]);
121
+ t.equal(foundTokens.length, expectedTokens.length);
122
+
123
+ for (const expectedToken of expectedTokens) {
124
+ t.ok(foundTokens.includes(expectedToken));
125
+ }
126
+ } catch (err) {
127
+ console.log(err);
128
+ }
129
+ },
130
+ );
@@ -0,0 +1,56 @@
1
+ const test = require('tape');
2
+ const deepEqual = require('deep-equal');
3
+
4
+ const { utils } = require('../../../src/index.cjs');
5
+ const { itemObjects2Arrays, itemArrays2Objects } = utils.itemDefs;
6
+
7
+ const itemObjects = [
8
+ {
9
+ type: 'token',
10
+ subType: 'wordLike',
11
+ payload: 'Hello',
12
+ },
13
+ {
14
+ type: 'scope',
15
+ subType: 'start',
16
+ payload: 'blockTag/p',
17
+ },
18
+ {
19
+ type: 'graft',
20
+ subType: 'footnote',
21
+ payload: 'abcdefg',
22
+ },
23
+ ];
24
+
25
+ const itemArrays = [
26
+ ['token', 'wordLike', 'Hello'],
27
+ ['scope', 'start', 'blockTag/p'],
28
+ ['graft', 'footnote', 'abcdefg'],
29
+ ];
30
+
31
+ const testGroup = 'item arrays and objects';
32
+
33
+ test(
34
+ `Arrays to Objects (${testGroup})`,
35
+ function (t) {
36
+ try {
37
+ t.plan(1);
38
+ const newObjects = itemArrays2Objects(itemArrays);
39
+ t.ok(deepEqual(itemObjects, newObjects));
40
+ } catch (err) {
41
+ console.log(err);
42
+ }
43
+ },
44
+ );
45
+
46
+ test(
47
+ `Objects to Arrays (${testGroup})`,
48
+ function (t) {
49
+ try {
50
+ t.plan(1);
51
+ t.ok(deepEqual(itemArrays, itemObjects2Arrays(itemObjects)));
52
+ } catch (err) {
53
+ console.log(err);
54
+ }
55
+ },
56
+ );
@@ -0,0 +1,69 @@
1
+ const test = require('tape');
2
+
3
+ const { utils } = require('../../../src/index.cjs');
4
+ const ByteArray = utils.ByteArray;
5
+ const {
6
+ pushSuccinctTokenBytes, pushSuccinctGraftBytes, pushSuccinctScopeBytes,
7
+ } = utils.succinct;
8
+
9
+ const testGroup = 'Push Succinct';
10
+
11
+ test(
12
+ `Token (${testGroup})`,
13
+ function (t) {
14
+ try {
15
+ t.plan(2);
16
+ const ba = new ByteArray(1);
17
+ pushSuccinctTokenBytes(ba, 2, 299);
18
+ t.equal(ba.byte(1), 2);
19
+ t.equal(ba.nByte(2), 299);
20
+ } catch (err) {
21
+ console.log(err);
22
+ }
23
+ },
24
+ );
25
+
26
+ test(
27
+ `Graft (${testGroup})`,
28
+ function (t) {
29
+ try {
30
+ t.plan(2);
31
+ const ba = new ByteArray(1);
32
+ pushSuccinctGraftBytes(ba, 10, 299);
33
+ t.equal(ba.byte(1), 10);
34
+ t.equal(ba.nByte(2), 299);
35
+ } catch (err) {
36
+ console.log(err);
37
+ }
38
+ },
39
+ );
40
+
41
+ test(
42
+ `Scope (${testGroup})`,
43
+ function (t) {
44
+ try {
45
+ t.plan(2);
46
+ const ba = new ByteArray(1);
47
+ pushSuccinctScopeBytes(ba, 3, 2, [567]);
48
+ t.equal(ba.byte(1), 2);
49
+ t.equal(ba.nByte(2), 567);
50
+ } catch (err) {
51
+ console.log(err);
52
+ }
53
+ },
54
+ );
55
+
56
+ test(
57
+ `Scope missing args (${testGroup})`,
58
+ function (t) {
59
+ try {
60
+ t.plan(3);
61
+ const ba = new ByteArray(1);
62
+ t.throws(() => pushSuccinctScopeBytes(ba, undefined, 2, [567]));
63
+ t.throws(() => pushSuccinctScopeBytes(ba, 3, undefined, [567]));
64
+ t.throws(() => pushSuccinctScopeBytes(ba, 3, 2, undefined));
65
+ } catch (err) {
66
+ console.log(err);
67
+ }
68
+ },
69
+ );
@@ -0,0 +1,79 @@
1
+ /* eslint-disable require-await */
2
+ const test = require('tape');
3
+ const { utils } = require('../../../src/index.cjs');
4
+ const {
5
+ scopeEnum, scopeEnumLabels, labelForScope, nComponentsForScope,
6
+ } = utils.scopeDefs;
7
+
8
+ const testGroup = 'Scope Def';
9
+
10
+ test(
11
+ `scopeEnum (${testGroup})`,
12
+ async function (t) {
13
+ try {
14
+ t.plan(1);
15
+ t.equal(scopeEnum['chapter'], 2);
16
+ } catch (err) {
17
+ console.log(err);
18
+ }
19
+ },
20
+ );
21
+
22
+ test(
23
+ `scopeEnumLabels (${testGroup})`,
24
+ async function (t) {
25
+ try {
26
+ t.plan(1);
27
+ t.equal(scopeEnumLabels[2], 'chapter');
28
+ } catch (err) {
29
+ console.log(err);
30
+ }
31
+ },
32
+ );
33
+
34
+ test(
35
+ `labelForScope (${testGroup})`,
36
+ async function (t) {
37
+ try {
38
+ t.plan(19);
39
+ t.equal(labelForScope('blockTag', ['p']), 'blockTag/p');
40
+ t.equal(labelForScope('inline', ['f']), 'inline/f');
41
+ t.equal(labelForScope('chapter', ['1']), 'chapter/1');
42
+ t.equal(labelForScope('verses', ['1-3']), 'verses/1-3');
43
+ t.equal(labelForScope('verse', ['2']), 'verse/2');
44
+ t.equal(labelForScope('span', ['nd']), 'span/nd');
45
+ t.equal(labelForScope('table', []), 'table');
46
+ t.equal(labelForScope('cell', ['thr2-3']), 'cell/colHeading/right/2');
47
+ t.equal(labelForScope('milestone', ['zaln']), 'milestone/zaln');
48
+ t.equal(labelForScope('spanWithAtts', ['w']), 'spanWithAtts/w');
49
+ t.equal(labelForScope('attribute', ['milestone', 'zaln', 'x-content', '0']), 'attribute/milestone/zaln/x-content/0');
50
+ t.equal(labelForScope('orphanTokens'), 'orphanTokens');
51
+ t.equal(labelForScope('hangingGraft'), 'hangingGraft');
52
+ t.equal(labelForScope('pubChapter', ['1']), 'pubChapter/1');
53
+ t.equal(labelForScope('pubVerse', ['1']), 'pubVerse/1');
54
+ t.equal(labelForScope('altChapter', ['1']), 'altChapter/1');
55
+ t.equal(labelForScope('altVerse', ['1']), 'altVerse/1');
56
+ t.equal(labelForScope('esbCat', ['x']), 'esbCat/x');
57
+ t.throws(() => labelForScope('banana'));
58
+ } catch (err) {
59
+ console.log(err);
60
+ }
61
+ },
62
+ );
63
+
64
+ test(
65
+ `nComponentsForScope (${testGroup})`,
66
+ async function (t) {
67
+ try {
68
+ t.plan(5);
69
+ t.equal(nComponentsForScope('table'), 1);
70
+ t.equal(nComponentsForScope('blockTag'), 2);
71
+ t.equal(nComponentsForScope('cell'), 4);
72
+ t.equal(nComponentsForScope('attribute'), 6);
73
+ t.throws(() => nComponentsForScope('banana'));
74
+ } catch (err) {
75
+ console.log(err);
76
+ }
77
+ },
78
+ );
79
+
@@ -0,0 +1,28 @@
1
+ const path = require('path');
2
+ const test = require('tape');
3
+ const fs = require('fs-extra');
4
+ const { Validator } = require('proskomma-json-tools');
5
+
6
+ const { utils } = require('../../../src/index.cjs');
7
+
8
+ const testGroup = 'Validate Schema';
9
+
10
+ test(
11
+ `Validate valid document (${testGroup})`,
12
+ function (t) {
13
+ try {
14
+ t.plan(3);
15
+ const serialized = fs.readJsonSync(path.resolve(__dirname, '..', '..', 'test_data', 'utils', 'serialize_example.json'));
16
+ t.ok(serialized);
17
+ const validationReport = new Validator().validate('proskomma',
18
+ 'succinct',
19
+ '0.2.0',
20
+ serialized
21
+ );
22
+ t.ok(validationReport.isValid);
23
+ t.equal(validationReport.errors, null);
24
+ } catch (err) {
25
+ console.log(err);
26
+ }
27
+ },
28
+ );
@@ -0,0 +1,67 @@
1
+ const test = require('tape');
2
+
3
+ const { utils } = require('../../../src/index.cjs');
4
+ const ByteArray = utils.ByteArray;
5
+ const {
6
+ pushSuccinctTokenBytes, pushSuccinctGraftBytes, pushSuccinctScopeBytes,
7
+ } = utils.succinct;
8
+
9
+ const testGroup = 'Splice';
10
+
11
+ test(
12
+ `Delete Item (${testGroup})`,
13
+ function (t) {
14
+ try {
15
+ t.plan(4);
16
+ const ba = new ByteArray(1);
17
+ pushSuccinctTokenBytes(ba, 1, 299);
18
+ pushSuccinctGraftBytes(ba, 10, 143);
19
+ pushSuccinctScopeBytes(ba, 3, 2, [567]);
20
+ const firstLength = ba.byte(0) & 0x0000003F;
21
+ const secondLength = ba.byte(firstLength) & 0x0000003F;
22
+ const thirdLength = ba.byte(firstLength + secondLength) & 0x0000003F;
23
+ t.equal(firstLength + secondLength + thirdLength, ba.length);
24
+ ba.deleteItem(firstLength);
25
+ const newFirstLength = ba.byte(0) & 0x0000003F;
26
+ const newSecondLength = ba.byte(newFirstLength) & 0x0000003F;
27
+ t.equal(firstLength, newFirstLength);
28
+ t.equal(thirdLength, newSecondLength);
29
+ t.equal(newFirstLength + newSecondLength, ba.length);
30
+ } catch (err) {
31
+ console.log(err);
32
+ }
33
+ },
34
+ );
35
+
36
+ test(
37
+ `Insert (${testGroup})`,
38
+ function (t) {
39
+ try {
40
+ t.plan(7);
41
+ const ba = new ByteArray(8);
42
+ pushSuccinctTokenBytes(ba, 1, 299);
43
+ pushSuccinctScopeBytes(ba, 3, 2, [567]);
44
+ const tokenLength = ba.byte(0) & 0x0000003F;
45
+ const scopeLength = ba.byte(tokenLength) & 0x0000003F;
46
+ t.equal(tokenLength + scopeLength, ba.length);
47
+ const iba = new ByteArray(1);
48
+ pushSuccinctGraftBytes(iba, 10, 143);
49
+ ba.insert(tokenLength, iba);
50
+ const firstLength = ba.byte(0) & 0x0000003F;
51
+ const secondLength = ba.byte(firstLength) & 0x0000003F;
52
+ const thirdLength = ba.byte(firstLength + secondLength) & 0x0000003F;
53
+ t.equal(firstLength, tokenLength);
54
+ t.equal(secondLength, iba.length);
55
+ t.equal(thirdLength, scopeLength);
56
+ t.equal(firstLength + secondLength + thirdLength, ba.length);
57
+ const iba2 = new ByteArray(1);
58
+ pushSuccinctGraftBytes(iba2, 5, 47);
59
+ ba.insert(firstLength + secondLength + thirdLength, iba2);
60
+ const fourthLength = ba.byte(firstLength + secondLength + thirdLength) & 0x0000003F;
61
+ t.equal(fourthLength, iba2.length);
62
+ t.equal(firstLength + secondLength + thirdLength + fourthLength, ba.length);
63
+ } catch (err) {
64
+ console.log(err);
65
+ }
66
+ },
67
+ );
@@ -0,0 +1,69 @@
1
+ /* eslint-disable require-await */
2
+ const test = require('tape');
3
+ const { utils } = require('../../../src/index.cjs');
4
+ const {
5
+ validateTags, validateTag, addTag, removeTag,
6
+ } = utils.tags;
7
+
8
+ const testGroup = 'Tags';
9
+
10
+ test(
11
+ `Validate Tag (${testGroup})`,
12
+ async function (t) {
13
+ try {
14
+ t.plan(2);
15
+ t.doesNotThrow(() => validateTag('foo'));
16
+ t.throws(() => validateTag('foo!'));
17
+ } catch (err) {
18
+ console.log(err);
19
+ }
20
+ },
21
+ );
22
+
23
+ test(
24
+ `Validate Tags (${testGroup})`,
25
+ async function (t) {
26
+ try {
27
+ t.plan(2);
28
+ t.doesNotThrow(() => validateTags(['foo', 'baa']));
29
+ t.throws(() => validateTags(['foo', 'baa!']));
30
+ } catch (err) {
31
+ console.log(err);
32
+ }
33
+ },
34
+ );
35
+
36
+ test(
37
+ `Add Tag (${testGroup})`,
38
+ async function (t) {
39
+ try {
40
+ t.plan(5);
41
+ let tags = new Set(['foo', 'baa']);
42
+ t.doesNotThrow(() => addTag(tags,'frob'));
43
+ t.equal(tags.size, 3);
44
+ t.ok(tags.has('frob'));
45
+ t.throws(() => addTag(tags, 'fooie!'));
46
+ t.equal(tags.size, 3);
47
+ } catch (err) {
48
+ console.log(err);
49
+ }
50
+ },
51
+ );
52
+
53
+ test(
54
+ `Remove Tag (${testGroup})`,
55
+ async function (t) {
56
+ try {
57
+ t.plan(6);
58
+ let tags = new Set(['foo', 'baa']);
59
+ t.doesNotThrow(() => removeTag(tags,'frob'));
60
+ t.equal(tags.size, 2);
61
+ t.doesNotThrow(() => removeTag(tags,'foo'));
62
+ t.equal(tags.size, 1);
63
+ t.throws(() => removeTag(tags, 'fooie!'));
64
+ t.equal(tags.size, 1);
65
+ } catch (err) {
66
+ console.log(err);
67
+ }
68
+ },
69
+ );