@gmb/bitmark-parser-generator 5.11.0 → 5.13.0

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/index.cjs CHANGED
@@ -309,6 +309,8 @@ var BitType = {
309
309
  exampleList: "example-list",
310
310
  extractorAiChat: "extractor-ai-chat",
311
311
  extractorBlock: "extractor-block",
312
+ extractorBlueprint: "extractor-blueprint",
313
+ extractorBlueprintConfiguration: "extractor-blueprint-configuration",
312
314
  extractorConfiguration: "extractor-configuration",
313
315
  extractorImage: "extractor-image",
314
316
  extractorImageCollapsible: "extractor-image-collapsible",
@@ -492,6 +494,7 @@ var BitType = {
492
494
  pageOpenBookList: "page-open-book-list",
493
495
  printBook: "print-book",
494
496
  openBookChapter: "open-book-chapter",
497
+ openBookChapterTeaser: "open-book-chapter-teaser",
495
498
  pagePerson: "page-person",
496
499
  pageProduct: "page-product",
497
500
  pageProductList: "page-product-list",
@@ -655,6 +658,7 @@ var BitType = {
655
658
  table: "table",
656
659
  tableAlt: "table-alt",
657
660
  tableExtended: "table-extended",
661
+ tableExtendedImage: "table-extended-image",
658
662
  tableImage: "table-image",
659
663
  tableImageAlt: "table-image-alt",
660
664
  takePicture: "take-picture",
@@ -841,6 +845,8 @@ var AbstractTagConfig = class {
841
845
  __publicField(this, "chain");
842
846
  __publicField(this, "jsonKey");
843
847
  // If the json key is different from the tag
848
+ __publicField(this, "secondaryJsonKey");
849
+ // Heading card alternate path
844
850
  __publicField(this, "deprecated");
845
851
  this.type = params.type;
846
852
  this.configKey = params.configKey;
@@ -849,6 +855,7 @@ var AbstractTagConfig = class {
849
855
  this.minCount = params.minCount;
850
856
  this.chain = params.chain;
851
857
  this.jsonKey = params.jsonKey;
858
+ this.secondaryJsonKey = params.secondaryJsonKey;
852
859
  this.deprecated = params.deprecated;
853
860
  }
854
861
  };
@@ -970,18 +977,22 @@ var ResourceTagConfig = class extends AbstractTagConfig {
970
977
 
971
978
  // src/model/config/CardVariantConfig.ts
972
979
  var CardVariantConfig = class {
973
- // Default: 1
974
- constructor(tags2, bodyAllowed, bodyRequired, repeatCount) {
980
+ // JSON path for body text
981
+ constructor(tags2, bodyAllowed, bodyRequired, repeatCount, jsonKey) {
975
982
  __publicField(this, "tags");
976
983
  __publicField(this, "bodyAllowed");
977
984
  // Default: true
978
985
  __publicField(this, "bodyRequired");
979
986
  // Default: false
980
987
  __publicField(this, "repeatCount");
988
+ // Default: 1
989
+ // JSON mapping fields
990
+ __publicField(this, "jsonKey");
981
991
  this.tags = tags2;
982
992
  this.bodyAllowed = bodyAllowed == null ? true : bodyAllowed;
983
993
  this.bodyRequired = bodyRequired;
984
994
  this.repeatCount = repeatCount;
995
+ this.jsonKey = jsonKey;
985
996
  }
986
997
  toString(options) {
987
998
  const opts = Object.assign({}, options);
@@ -1003,27 +1014,63 @@ ${tag.toString(opts)}`;
1003
1014
  }
1004
1015
  };
1005
1016
 
1017
+ // src/model/config/CardSideConfig.ts
1018
+ var CardSideConfig = class {
1019
+ constructor(name, repeat, variants) {
1020
+ __publicField(this, "name");
1021
+ __publicField(this, "repeat");
1022
+ __publicField(this, "variants");
1023
+ this.name = name;
1024
+ this.repeat = repeat;
1025
+ this.variants = variants;
1026
+ }
1027
+ toString(options) {
1028
+ const opts = Object.assign({}, options);
1029
+ let s = "";
1030
+ s += `[Side: ${this.name}]`;
1031
+ if (this.repeat) s += " (repeat)";
1032
+ let variantNo = 0;
1033
+ for (const variant of this.variants) {
1034
+ s += `
1035
+ [Variant ${variantNo}]`;
1036
+ s += `
1037
+ ${variant.toString(opts)}`;
1038
+ variantNo++;
1039
+ }
1040
+ return s;
1041
+ }
1042
+ };
1043
+
1006
1044
  // src/model/config/CardSetConfig.ts
1007
1045
  var CardSetConfig = class {
1008
- constructor(configKey, variants) {
1046
+ constructor(configKey, jsonKey, itemType, sections, sides) {
1009
1047
  __publicField(this, "configKey");
1010
- __publicField(this, "variants");
1048
+ __publicField(this, "jsonKey");
1049
+ __publicField(this, "itemType");
1050
+ __publicField(this, "sections");
1051
+ __publicField(this, "sides");
1011
1052
  this.configKey = configKey;
1012
- this.variants = variants;
1053
+ this.jsonKey = jsonKey;
1054
+ this.itemType = itemType;
1055
+ this.sections = sections;
1056
+ this.sides = sides;
1057
+ }
1058
+ // Legacy accessor — provides the same shape as the old `variants: CardVariantConfig[][]`
1059
+ // so downstream consumers (Config.getCardSetVariantConfig, etc.) continue to work.
1060
+ get variants() {
1061
+ return this.sides.map((side) => side.variants);
1013
1062
  }
1014
1063
  toString(options) {
1015
1064
  const opts = Object.assign({}, options);
1016
1065
  let s = "";
1017
- let sideNo = 0;
1018
- let variantNo = 0;
1019
- for (const sides of this.variants) {
1020
- for (const variant of sides) {
1021
- s += `[Card - Side ${sideNo}, Variant ${variantNo}]`;
1022
- s += `
1023
- ${variant.toString(opts)}`;
1024
- variantNo++;
1025
- }
1026
- sideNo++;
1066
+ s += `[CardSet: ${this.configKey}]`;
1067
+ s += `
1068
+ jsonKey: ${this.jsonKey}`;
1069
+ s += `
1070
+ itemType: ${this.itemType}`;
1071
+ for (const side of this.sides) {
1072
+ s += `
1073
+ ${side.toString(opts)}`;
1027
1074
  }
1028
1075
  return s;
1029
1076
  }
@@ -2176,589 +2223,947 @@ var import_superenum15 = require("@ncoderz/superenum");
2176
2223
 
2177
2224
  // src/config/raw/cardSets.ts
2178
2225
  var CARDSETS = {
2179
- [CardSetConfigKey.definitionList]: {
2180
- variants: [
2181
- [
2182
- {
2183
- tags: [
2184
- {
2185
- key: ConfigKey.group_standardItemLeadInstructionHint,
2186
- description: "Standard tags for lead, instruction, and hint."
2187
- },
2188
- {
2189
- key: ConfigKey.property_example,
2190
- description: "Example text for the definition.",
2191
- format: TagFormat.plainText
2192
- },
2193
- {
2194
- key: ConfigKey.tag_title,
2195
- description: "Title of the definition."
2196
- },
2197
- {
2198
- key: ConfigKey.group_resourceIcon,
2199
- description: "Icon resource for the definition."
2200
- }
2201
- ],
2202
- repeatCount: Count.infinity
2203
- }
2204
- ]
2226
+ //
2227
+ // flashcard
2228
+ //
2229
+ [CardSetConfigKey.flashcard]: {
2230
+ jsonKey: "cards",
2231
+ sides: [
2232
+ {
2233
+ name: "question",
2234
+ variants: [
2235
+ {
2236
+ jsonKey: "question.text",
2237
+ tags: [
2238
+ {
2239
+ key: ConfigKey.group_standardTags,
2240
+ description: "Standard tags for the flashcard."
2241
+ },
2242
+ {
2243
+ key: ConfigKey.tag_title,
2244
+ description: "Title of the flashcard."
2245
+ },
2246
+ {
2247
+ key: ConfigKey.group_resourceIcon,
2248
+ description: "Icon resource for the flashcard.",
2249
+ jsonKey: "question.icon"
2250
+ }
2251
+ ]
2252
+ }
2253
+ ]
2254
+ },
2255
+ {
2256
+ name: "answer",
2257
+ variants: [
2258
+ {
2259
+ jsonKey: "answer.text",
2260
+ tags: [
2261
+ {
2262
+ key: ConfigKey.group_standardTags,
2263
+ description: "Standard tags for the flashcard."
2264
+ },
2265
+ {
2266
+ key: ConfigKey.tag_title,
2267
+ description: "Title of the flashcard."
2268
+ },
2269
+ {
2270
+ key: ConfigKey.group_resourceIcon,
2271
+ description: "Icon resource for the flashcard.",
2272
+ jsonKey: "answer.icon"
2273
+ }
2274
+ ]
2275
+ },
2276
+ {
2277
+ jsonKey: "alternativeAnswers[].text",
2278
+ tags: [
2279
+ {
2280
+ key: ConfigKey.group_standardTags,
2281
+ description: "Standard tags for the flashcard."
2282
+ },
2283
+ {
2284
+ key: ConfigKey.tag_title,
2285
+ description: "Title of the flashcard."
2286
+ },
2287
+ {
2288
+ key: ConfigKey.group_resourceIcon,
2289
+ description: "Icon resource for the flashcard."
2290
+ }
2291
+ ],
2292
+ repeatCount: Count.infinity
2293
+ }
2294
+ ]
2295
+ }
2205
2296
  ]
2206
2297
  },
2207
- [CardSetConfigKey.flashcard]: {
2208
- variants: [
2209
- [
2210
- {
2211
- tags: [
2212
- {
2213
- key: ConfigKey.group_standardItemLeadInstructionHint,
2214
- description: "Standard tags for lead, instruction, and hint."
2215
- },
2216
- {
2217
- key: ConfigKey.property_example,
2218
- description: "Example text for the flashcard.",
2219
- format: TagFormat.plainText
2220
- },
2221
- {
2222
- key: ConfigKey.tag_title,
2223
- description: "Title of the flashcard."
2224
- },
2225
- {
2226
- key: ConfigKey.group_resourceIcon,
2227
- description: "Icon resource for the flashcard."
2228
- }
2229
- ],
2230
- repeatCount: Count.infinity
2231
- }
2232
- ]
2298
+ //
2299
+ // definition-list
2300
+ //
2301
+ [CardSetConfigKey.definitionList]: {
2302
+ jsonKey: "definitions",
2303
+ sides: [
2304
+ {
2305
+ name: "term",
2306
+ variants: [
2307
+ {
2308
+ jsonKey: "term.text",
2309
+ tags: [
2310
+ {
2311
+ key: ConfigKey.group_standardTags,
2312
+ description: "Standard tags for the definition."
2313
+ },
2314
+ {
2315
+ key: ConfigKey.tag_title,
2316
+ description: "Title of the definition.",
2317
+ secondaryJsonKey: "heading.forKeys"
2318
+ },
2319
+ {
2320
+ key: ConfigKey.group_resourceIcon,
2321
+ description: "Icon resource for the definition.",
2322
+ jsonKey: "term.icon"
2323
+ }
2324
+ ]
2325
+ }
2326
+ ]
2327
+ },
2328
+ {
2329
+ name: "definition",
2330
+ variants: [
2331
+ {
2332
+ jsonKey: "definition.text",
2333
+ tags: [
2334
+ {
2335
+ key: ConfigKey.group_standardTags,
2336
+ description: "Standard tags for the definition."
2337
+ },
2338
+ {
2339
+ key: ConfigKey.tag_title,
2340
+ description: "Title of the definition.",
2341
+ secondaryJsonKey: "heading.forValues"
2342
+ },
2343
+ {
2344
+ key: ConfigKey.group_resourceIcon,
2345
+ description: "Icon resource for the definition.",
2346
+ jsonKey: "definition.icon"
2347
+ }
2348
+ ]
2349
+ },
2350
+ {
2351
+ jsonKey: "alternativeDefinitions[].text",
2352
+ tags: [
2353
+ {
2354
+ key: ConfigKey.group_standardTags,
2355
+ description: "Standard tags for the definition."
2356
+ },
2357
+ {
2358
+ key: ConfigKey.tag_title,
2359
+ description: "Title of the definition."
2360
+ },
2361
+ {
2362
+ key: ConfigKey.group_resourceIcon,
2363
+ description: "Icon resource for the definition."
2364
+ }
2365
+ ],
2366
+ repeatCount: Count.infinity
2367
+ }
2368
+ ]
2369
+ }
2233
2370
  ]
2234
2371
  },
2235
- [CardSetConfigKey.elements]: {
2236
- variants: [
2237
- [
2238
- {
2239
- tags: [
2240
- {
2241
- key: ConfigKey.group_standardItemLeadInstructionHint,
2242
- description: "Standard tags for lead, instruction, and hint."
2243
- },
2244
- {
2245
- key: ConfigKey.property_example,
2246
- description: "Example text for the element.",
2247
- format: TagFormat.plainText
2248
- }
2249
- ],
2250
- repeatCount: Count.infinity
2251
- }
2252
- ]
2372
+ //
2373
+ // match-pairs
2374
+ //
2375
+ [CardSetConfigKey.matchPairs]: {
2376
+ jsonKey: "pairs",
2377
+ sides: [
2378
+ {
2379
+ name: "key",
2380
+ variants: [
2381
+ {
2382
+ jsonKey: "key",
2383
+ tags: [
2384
+ {
2385
+ key: ConfigKey.group_standardTags,
2386
+ description: "Standard tags for the match pair."
2387
+ },
2388
+ {
2389
+ key: ConfigKey.tag_title,
2390
+ description: "Title of the match pair.",
2391
+ secondaryJsonKey: "heading.forKeys"
2392
+ },
2393
+ {
2394
+ key: ConfigKey.property_isCaseSensitive,
2395
+ description: "Property to indicate if the match is case sensitive.",
2396
+ format: TagFormat.boolean
2397
+ },
2398
+ {
2399
+ key: ConfigKey.resource_audio,
2400
+ description: "Audio resource for the match pair.",
2401
+ jsonKey: "keyAudio"
2402
+ },
2403
+ {
2404
+ key: ConfigKey.resource_image,
2405
+ description: "Image resource for the match pair.",
2406
+ jsonKey: "keyImage"
2407
+ }
2408
+ ]
2409
+ }
2410
+ ]
2411
+ },
2412
+ {
2413
+ name: "values",
2414
+ repeat: true,
2415
+ variants: [
2416
+ {
2417
+ jsonKey: "values[]",
2418
+ tags: [
2419
+ {
2420
+ key: ConfigKey.group_standardTags,
2421
+ description: "Standard tags for the match pair."
2422
+ },
2423
+ {
2424
+ key: ConfigKey.tag_title,
2425
+ description: "Title of the match pair.",
2426
+ secondaryJsonKey: "heading.forValues"
2427
+ },
2428
+ {
2429
+ key: ConfigKey.property_isCaseSensitive,
2430
+ description: "Property to indicate if the match is case sensitive.",
2431
+ format: TagFormat.boolean
2432
+ }
2433
+ ],
2434
+ repeatCount: Count.infinity
2435
+ }
2436
+ ]
2437
+ }
2253
2438
  ]
2254
2439
  },
2255
- [CardSetConfigKey.statements]: {
2256
- variants: [
2257
- [
2258
- {
2259
- tags: [
2260
- {
2261
- key: ConfigKey.tag_true,
2262
- description: "Tag for true statements.",
2263
- maxCount: 1
2264
- },
2265
- {
2266
- key: ConfigKey.tag_false,
2267
- description: "Tag for false statements.",
2268
- maxCount: 1
2269
- },
2270
- {
2271
- key: ConfigKey.group_standardItemLeadInstructionHint,
2272
- description: "Standard tags for lead, instruction, and hint."
2273
- },
2274
- {
2275
- key: ConfigKey.property_example,
2276
- description: "Example text for the statement.",
2277
- format: TagFormat.plainText
2278
- }
2279
- ],
2280
- bodyAllowed: false
2281
- }
2282
- ]
2440
+ //
2441
+ // match-audio-pairs
2442
+ //
2443
+ [CardSetConfigKey.matchAudioPairs]: {
2444
+ jsonKey: "pairs",
2445
+ sides: [
2446
+ {
2447
+ name: "key",
2448
+ variants: [
2449
+ {
2450
+ jsonKey: "key",
2451
+ tags: [
2452
+ {
2453
+ key: ConfigKey.group_standardTags,
2454
+ description: "Standard tags for the audio match pair."
2455
+ },
2456
+ {
2457
+ key: ConfigKey.tag_title,
2458
+ description: "Title of the audio match pair.",
2459
+ secondaryJsonKey: "heading.forKeys"
2460
+ },
2461
+ {
2462
+ key: ConfigKey.resource_audio,
2463
+ description: "Audio resource for the match pair.",
2464
+ jsonKey: "keyAudio"
2465
+ }
2466
+ ]
2467
+ }
2468
+ ]
2469
+ },
2470
+ {
2471
+ name: "values",
2472
+ repeat: true,
2473
+ variants: [
2474
+ {
2475
+ jsonKey: "values[]",
2476
+ tags: [
2477
+ {
2478
+ key: ConfigKey.group_standardTags,
2479
+ description: "Standard tags for the audio match pair."
2480
+ },
2481
+ {
2482
+ key: ConfigKey.tag_title,
2483
+ description: "Title of the audio match pair.",
2484
+ secondaryJsonKey: "heading.forValues"
2485
+ },
2486
+ {
2487
+ key: ConfigKey.resource_audio,
2488
+ description: "Audio resource for the match pair."
2489
+ }
2490
+ ],
2491
+ repeatCount: Count.infinity
2492
+ }
2493
+ ]
2494
+ }
2283
2495
  ]
2284
2496
  },
2285
- [CardSetConfigKey.quiz]: {
2286
- variants: [
2287
- [
2288
- {
2289
- tags: [
2290
- {
2291
- key: ConfigKey.group_trueFalse,
2292
- description: "Group for true/false questions."
2293
- },
2294
- {
2295
- key: ConfigKey.group_standardItemLeadInstructionHint,
2296
- description: "Standard tags for lead, instruction, and hint."
2297
- },
2298
- {
2299
- key: ConfigKey.property_example,
2300
- description: "Example text for the quiz question.",
2301
- format: TagFormat.plainText
2302
- }
2303
- ],
2304
- bodyAllowed: false
2305
- }
2306
- ]
2497
+ //
2498
+ // match-image-pairs
2499
+ //
2500
+ [CardSetConfigKey.matchImagePairs]: {
2501
+ jsonKey: "pairs",
2502
+ sides: [
2503
+ {
2504
+ name: "key",
2505
+ variants: [
2506
+ {
2507
+ jsonKey: "key",
2508
+ tags: [
2509
+ {
2510
+ key: ConfigKey.group_standardTags,
2511
+ description: "Standard tags for the image match pair."
2512
+ },
2513
+ {
2514
+ key: ConfigKey.tag_title,
2515
+ description: "Title of the image match pair.",
2516
+ secondaryJsonKey: "heading.forKeys"
2517
+ },
2518
+ {
2519
+ key: ConfigKey.resource_image,
2520
+ description: "Image resource for the match pair.",
2521
+ jsonKey: "keyImage"
2522
+ }
2523
+ ]
2524
+ }
2525
+ ]
2526
+ },
2527
+ {
2528
+ name: "values",
2529
+ repeat: true,
2530
+ variants: [
2531
+ {
2532
+ jsonKey: "values[]",
2533
+ tags: [
2534
+ {
2535
+ key: ConfigKey.group_standardTags,
2536
+ description: "Standard tags for the image match pair."
2537
+ },
2538
+ {
2539
+ key: ConfigKey.tag_title,
2540
+ description: "Title of the image match pair.",
2541
+ secondaryJsonKey: "heading.forValues"
2542
+ },
2543
+ {
2544
+ key: ConfigKey.resource_image,
2545
+ description: "Image resource for the match pair."
2546
+ }
2547
+ ],
2548
+ repeatCount: Count.infinity
2549
+ }
2550
+ ]
2551
+ }
2307
2552
  ]
2308
2553
  },
2309
- [CardSetConfigKey.feedback]: {
2310
- variants: [
2311
- // Side 1
2312
- [
2313
- // Variant 1..N
2314
- {
2315
- tags: [
2316
- {
2317
- key: ConfigKey.group_standardItemLeadInstructionHint,
2318
- description: "Standard tags for lead, instruction, and hint."
2319
- },
2320
- {
2321
- key: ConfigKey.group_trueFalse,
2322
- description: "Group for true/false feedback."
2323
- },
2324
- {
2325
- key: ConfigKey.tag_title,
2326
- description: "Title of the feedback."
2327
- }
2328
- ],
2329
- bodyAllowed: false
2330
- }
2331
- ],
2332
- // Side 2
2333
- [
2334
- // Variant 1..N
2335
- {
2336
- tags: [
2337
- {
2338
- key: ConfigKey.group_standardItemLeadInstructionHint,
2339
- description: "Standard tags for lead, instruction, and hint."
2340
- },
2341
- {
2342
- key: ConfigKey.property_reasonableNumOfChars,
2343
- description: "Property for reasonable number of characters.",
2344
- format: TagFormat.number
2345
- },
2346
- {
2347
- key: ConfigKey.property_example,
2348
- description: "Example text for the feedback.",
2349
- format: TagFormat.plainText
2350
- },
2351
- {
2352
- key: ConfigKey.tag_title,
2353
- description: "Title of the feedback."
2354
- }
2355
- ],
2356
- bodyAllowed: true
2357
- }
2358
- ]
2554
+ //
2555
+ // match-matrix
2556
+ //
2557
+ [CardSetConfigKey.matchMatrix]: {
2558
+ jsonKey: "matrix",
2559
+ sides: [
2560
+ {
2561
+ name: "key",
2562
+ variants: [
2563
+ {
2564
+ jsonKey: "key",
2565
+ tags: [
2566
+ {
2567
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2568
+ description: "Standard tags for lead, instruction, and hint."
2569
+ },
2570
+ {
2571
+ key: ConfigKey.property_example,
2572
+ description: "Example text for the match matrix.",
2573
+ format: TagFormat.plainText
2574
+ },
2575
+ {
2576
+ key: ConfigKey.tag_title,
2577
+ description: "Title of the match matrix.",
2578
+ secondaryJsonKey: "heading.forKeys"
2579
+ },
2580
+ {
2581
+ key: ConfigKey.property_isCaseSensitive,
2582
+ description: "Property to indicate if the match is case sensitive.",
2583
+ format: TagFormat.boolean
2584
+ }
2585
+ ]
2586
+ }
2587
+ ]
2588
+ },
2589
+ {
2590
+ name: "cell",
2591
+ repeat: true,
2592
+ variants: [
2593
+ {
2594
+ jsonKey: "cells[{s}].values[]",
2595
+ tags: [
2596
+ {
2597
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2598
+ description: "Standard tags for lead, instruction, and hint."
2599
+ },
2600
+ {
2601
+ key: ConfigKey.property_example,
2602
+ description: "Example text for the match matrix.",
2603
+ format: TagFormat.plainText
2604
+ },
2605
+ {
2606
+ key: ConfigKey.tag_title,
2607
+ description: "Title of the match matrix.",
2608
+ secondaryJsonKey: "heading.forValues"
2609
+ },
2610
+ {
2611
+ key: ConfigKey.property_isCaseSensitive,
2612
+ description: "Property to indicate if the match is case sensitive.",
2613
+ format: TagFormat.boolean
2614
+ }
2615
+ ],
2616
+ repeatCount: Count.infinity
2617
+ }
2618
+ ]
2619
+ }
2359
2620
  ]
2360
2621
  },
2361
- [CardSetConfigKey.questions]: {
2362
- variants: [
2363
- [
2364
- {
2365
- tags: [
2366
- {
2367
- key: ConfigKey.property_reasonableNumOfChars,
2368
- description: "Property for reasonable number of characters.",
2369
- format: TagFormat.number
2370
- },
2371
- {
2372
- key: ConfigKey.tag_sampleSolution,
2373
- description: "Sample solution for the question."
2374
- },
2375
- {
2376
- key: ConfigKey.property_sampleSolution,
2377
- description: "Property for sample solution text.",
2378
- format: TagFormat.plainText
2379
- },
2380
- {
2381
- key: ConfigKey.property_additionalSolutions,
2382
- description: "Property for additional solutions.",
2383
- format: TagFormat.plainText,
2384
- maxCount: Count.infinity
2385
- },
2386
- {
2387
- key: ConfigKey.property_partialAnswer,
2388
- description: "Property for partial answer text.",
2389
- format: TagFormat.plainText
2390
- },
2391
- {
2392
- key: ConfigKey.group_standardItemLeadInstructionHint,
2393
- description: "Standard tags for lead, instruction, and hint."
2394
- },
2395
- {
2396
- key: ConfigKey.property_example,
2397
- description: "Example text for the question.",
2398
- format: TagFormat.plainText
2399
- }
2400
- ],
2401
- repeatCount: Count.infinity
2402
- }
2403
- ]
2622
+ //
2623
+ // statements
2624
+ //
2625
+ [CardSetConfigKey.statements]: {
2626
+ jsonKey: "statements",
2627
+ sides: [
2628
+ {
2629
+ name: "statement",
2630
+ variants: [
2631
+ {
2632
+ jsonKey: "statement",
2633
+ tags: [
2634
+ {
2635
+ key: ConfigKey.tag_true,
2636
+ description: "Tag for true statements.",
2637
+ maxCount: 1
2638
+ },
2639
+ {
2640
+ key: ConfigKey.tag_false,
2641
+ description: "Tag for false statements.",
2642
+ maxCount: 1
2643
+ },
2644
+ {
2645
+ key: ConfigKey.group_standardTags,
2646
+ description: "Standard tags for the statement."
2647
+ }
2648
+ ],
2649
+ bodyAllowed: false
2650
+ }
2651
+ ]
2652
+ }
2404
2653
  ]
2405
2654
  },
2406
- // matchPairs
2407
- // TODO: We actually need to allow for different card configurations, because titles are valid on the first card only.
2408
- // For now we allow them to be valid on all cards, but we need to change this.
2409
- [CardSetConfigKey.matchPairs]: {
2410
- variants: [
2411
- // Side 1
2412
- [
2413
- // Variant 1..N
2414
- {
2415
- tags: [
2416
- {
2417
- key: ConfigKey.group_standardItemLeadInstructionHint,
2418
- description: "Standard tags for lead, instruction, and hint."
2419
- },
2420
- {
2421
- key: ConfigKey.property_example,
2422
- description: "Example text for the match pair.",
2423
- format: TagFormat.plainText
2424
- },
2425
- {
2426
- key: ConfigKey.tag_title,
2427
- description: "Title of the match pair."
2428
- },
2429
- {
2430
- key: ConfigKey.property_isCaseSensitive,
2431
- description: "Property to indicate if the match is case sensitive.",
2432
- format: TagFormat.boolean
2433
- }
2434
- ],
2435
- repeatCount: Count.infinity
2436
- }
2437
- ]
2655
+ //
2656
+ // quiz
2657
+ //
2658
+ [CardSetConfigKey.quiz]: {
2659
+ jsonKey: "quizzes",
2660
+ sides: [
2661
+ {
2662
+ name: "choices",
2663
+ variants: [
2664
+ {
2665
+ jsonKey: null,
2666
+ tags: [
2667
+ {
2668
+ key: ConfigKey.group_trueFalse,
2669
+ description: "Group for true/false questions."
2670
+ },
2671
+ {
2672
+ key: ConfigKey.group_standardTags,
2673
+ description: "Standard tags for the quiz."
2674
+ }
2675
+ ],
2676
+ bodyAllowed: false
2677
+ }
2678
+ ]
2679
+ }
2438
2680
  ]
2439
2681
  },
2440
- [CardSetConfigKey.matchAudioPairs]: {
2441
- variants: [
2442
- // Side 1
2443
- [
2444
- // Variant 1..N
2445
- {
2446
- tags: [
2447
- {
2448
- key: ConfigKey.group_standardItemLeadInstructionHint,
2449
- description: "Standard tags for lead, instruction, and hint."
2450
- },
2451
- {
2452
- key: ConfigKey.property_example,
2453
- description: "Example text for the audio match pair.",
2454
- format: TagFormat.plainText
2455
- },
2456
- {
2457
- key: ConfigKey.tag_title,
2458
- description: "Title of the audio match pair."
2459
- },
2460
- {
2461
- key: ConfigKey.resource_audio,
2462
- description: "Audio resource for the match pair."
2463
- }
2464
- ],
2465
- repeatCount: Count.infinity
2466
- }
2467
- ]
2682
+ //
2683
+ // feedback
2684
+ //
2685
+ [CardSetConfigKey.feedback]: {
2686
+ jsonKey: "feedbacks",
2687
+ sides: [
2688
+ {
2689
+ name: "choices",
2690
+ variants: [
2691
+ {
2692
+ jsonKey: null,
2693
+ tags: [
2694
+ {
2695
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2696
+ description: "Standard tags for lead, instruction, and hint."
2697
+ },
2698
+ {
2699
+ key: ConfigKey.group_trueFalse,
2700
+ description: "Group for true/false feedback."
2701
+ },
2702
+ {
2703
+ key: ConfigKey.tag_title,
2704
+ description: "Title of the feedback.",
2705
+ secondaryJsonKey: "heading.forKeys"
2706
+ }
2707
+ ],
2708
+ bodyAllowed: false
2709
+ }
2710
+ ]
2711
+ },
2712
+ {
2713
+ name: "reason",
2714
+ variants: [
2715
+ {
2716
+ jsonKey: "reason.text",
2717
+ tags: [
2718
+ {
2719
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2720
+ description: "Standard tags for lead, instruction, and hint."
2721
+ },
2722
+ {
2723
+ key: ConfigKey.property_reasonableNumOfChars,
2724
+ description: "Property for reasonable number of characters.",
2725
+ format: TagFormat.number
2726
+ },
2727
+ {
2728
+ key: ConfigKey.property_example,
2729
+ description: "Example text for the feedback.",
2730
+ format: TagFormat.plainText
2731
+ },
2732
+ {
2733
+ key: ConfigKey.tag_title,
2734
+ description: "Title of the feedback.",
2735
+ secondaryJsonKey: "heading.forValues"
2736
+ }
2737
+ ],
2738
+ bodyAllowed: true
2739
+ }
2740
+ ]
2741
+ }
2468
2742
  ]
2469
2743
  },
2470
- [CardSetConfigKey.matchImagePairs]: {
2471
- variants: [
2472
- // Side 1
2473
- [
2474
- // Variant 1..N
2475
- {
2476
- tags: [
2477
- {
2478
- key: ConfigKey.group_standardItemLeadInstructionHint,
2479
- description: "Standard tags for lead, instruction, and hint."
2480
- },
2481
- {
2482
- key: ConfigKey.property_example,
2483
- description: "Example text for the image match pair.",
2484
- format: TagFormat.plainText
2485
- },
2486
- {
2487
- key: ConfigKey.tag_title,
2488
- description: "Title of the image match pair."
2489
- },
2490
- {
2491
- key: ConfigKey.resource_image,
2492
- description: "Image resource for the match pair."
2493
- }
2494
- ],
2495
- repeatCount: Count.infinity
2496
- }
2497
- ]
2744
+ //
2745
+ // questions
2746
+ //
2747
+ [CardSetConfigKey.questions]: {
2748
+ jsonKey: "questions",
2749
+ sides: [
2750
+ {
2751
+ name: "question",
2752
+ variants: [
2753
+ {
2754
+ jsonKey: "question",
2755
+ tags: [
2756
+ {
2757
+ key: ConfigKey.property_reasonableNumOfChars,
2758
+ description: "Property for reasonable number of characters.",
2759
+ format: TagFormat.number
2760
+ },
2761
+ {
2762
+ key: ConfigKey.tag_sampleSolution,
2763
+ description: "Sample solution for the question."
2764
+ },
2765
+ {
2766
+ key: ConfigKey.property_sampleSolution,
2767
+ description: "Property for sample solution text.",
2768
+ format: TagFormat.plainText
2769
+ },
2770
+ {
2771
+ key: ConfigKey.property_additionalSolutions,
2772
+ description: "Property for additional solutions.",
2773
+ format: TagFormat.plainText,
2774
+ maxCount: Count.infinity
2775
+ },
2776
+ {
2777
+ key: ConfigKey.property_partialAnswer,
2778
+ description: "Property for partial answer text.",
2779
+ format: TagFormat.plainText
2780
+ },
2781
+ {
2782
+ key: ConfigKey.group_standardTags,
2783
+ description: "Standard tags for the question."
2784
+ }
2785
+ ]
2786
+ }
2787
+ ]
2788
+ }
2498
2789
  ]
2499
2790
  },
2500
- [CardSetConfigKey.matchMatrix]: {
2501
- variants: [
2502
- // Side 1
2503
- [
2504
- // Variant 1..N
2505
- {
2506
- tags: [
2507
- {
2508
- key: ConfigKey.group_standardItemLeadInstructionHint,
2509
- description: "Standard tags for lead, instruction, and hint."
2510
- },
2511
- {
2512
- key: ConfigKey.property_example,
2513
- description: "Example text for the match matrix.",
2514
- format: TagFormat.plainText
2515
- },
2516
- {
2517
- key: ConfigKey.tag_title,
2518
- description: "Title of the match matrix."
2519
- },
2520
- {
2521
- key: ConfigKey.property_isCaseSensitive,
2522
- description: "Property to indicate if the match is case sensitive.",
2523
- format: TagFormat.boolean
2524
- }
2525
- ],
2526
- repeatCount: Count.infinity
2527
- }
2528
- ]
2791
+ //
2792
+ // elements
2793
+ //
2794
+ [CardSetConfigKey.elements]: {
2795
+ jsonKey: null,
2796
+ sides: [
2797
+ {
2798
+ name: "element",
2799
+ repeat: true,
2800
+ variants: [
2801
+ {
2802
+ jsonKey: "elements[]",
2803
+ tags: [
2804
+ {
2805
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2806
+ description: "Standard tags for lead, instruction, and hint."
2807
+ },
2808
+ {
2809
+ key: ConfigKey.property_example,
2810
+ description: "Example text for the element.",
2811
+ format: TagFormat.plainText
2812
+ }
2813
+ ],
2814
+ repeatCount: Count.infinity
2815
+ }
2816
+ ]
2817
+ }
2529
2818
  ]
2530
2819
  },
2820
+ //
2821
+ // table
2822
+ //
2531
2823
  [CardSetConfigKey.table]: {
2532
- variants: [
2533
- // Side 1
2534
- [
2535
- // Variant 1..N
2536
- {
2537
- tags: [
2538
- {
2539
- key: ConfigKey.group_standardItemLeadInstructionHint,
2540
- description: "Standard tags for lead, instruction, and hint."
2541
- },
2542
- {
2543
- key: ConfigKey.tag_title,
2544
- description: "Title of the table."
2545
- },
2546
- {
2547
- key: ConfigKey.property_tableCellType,
2548
- description: "Table cell type (th/td).",
2549
- format: TagFormat.plainText
2550
- },
2551
- {
2552
- key: ConfigKey.property_tableRowSpan,
2553
- description: "Number of rows the cell spans.",
2554
- format: TagFormat.number
2555
- },
2556
- {
2557
- key: ConfigKey.property_tableColSpan,
2558
- description: "Number of columns the cell spans.",
2559
- format: TagFormat.number
2560
- },
2561
- {
2562
- key: ConfigKey.property_tableScope,
2563
- description: "Scope attribute for header cells.",
2564
- format: TagFormat.plainText
2565
- }
2566
- ],
2567
- repeatCount: Count.infinity
2568
- }
2569
- ]
2824
+ jsonKey: "table.data",
2825
+ itemType: "array",
2826
+ sides: [
2827
+ {
2828
+ name: "cell",
2829
+ repeat: true,
2830
+ variants: [
2831
+ {
2832
+ jsonKey: null,
2833
+ tags: [
2834
+ {
2835
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2836
+ description: "Standard tags for lead, instruction, and hint."
2837
+ },
2838
+ {
2839
+ key: ConfigKey.tag_title,
2840
+ description: "Title of the table.",
2841
+ secondaryJsonKey: "table.columns[]"
2842
+ },
2843
+ {
2844
+ key: ConfigKey.property_tableCellType,
2845
+ description: "Table cell type (th/td).",
2846
+ format: TagFormat.plainText
2847
+ },
2848
+ {
2849
+ key: ConfigKey.property_tableRowSpan,
2850
+ description: "Number of rows the cell spans.",
2851
+ format: TagFormat.number
2852
+ },
2853
+ {
2854
+ key: ConfigKey.property_tableColSpan,
2855
+ description: "Number of columns the cell spans.",
2856
+ format: TagFormat.number
2857
+ },
2858
+ {
2859
+ key: ConfigKey.property_tableScope,
2860
+ description: "Scope attribute for header cells.",
2861
+ format: TagFormat.plainText
2862
+ }
2863
+ ],
2864
+ repeatCount: Count.infinity
2865
+ }
2866
+ ]
2867
+ }
2570
2868
  ]
2571
2869
  },
2870
+ //
2871
+ // table-extended
2872
+ //
2873
+ [CardSetConfigKey.tableExtended]: {
2874
+ jsonKey: null,
2875
+ sections: {
2876
+ default: { jsonKey: "tableExtended.body.rows" },
2877
+ "table-header": { jsonKey: "tableExtended.header.rows" },
2878
+ "table-footer": { jsonKey: "tableExtended.footer.rows" }
2879
+ },
2880
+ sides: [
2881
+ {
2882
+ name: "cell",
2883
+ repeat: true,
2884
+ variants: [
2885
+ {
2886
+ jsonKey: "content",
2887
+ tags: [
2888
+ {
2889
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2890
+ description: "Standard tags for lead, instruction, and hint."
2891
+ },
2892
+ {
2893
+ key: ConfigKey.tag_title,
2894
+ description: "Title of the table cell."
2895
+ },
2896
+ {
2897
+ key: ConfigKey.property_tableCellType,
2898
+ description: "Table cell type (th/td).",
2899
+ format: TagFormat.plainText
2900
+ },
2901
+ {
2902
+ key: ConfigKey.property_tableRowSpan,
2903
+ description: "Number of rows the cell spans.",
2904
+ format: TagFormat.number
2905
+ },
2906
+ {
2907
+ key: ConfigKey.property_tableColSpan,
2908
+ description: "Number of columns the cell spans.",
2909
+ format: TagFormat.number
2910
+ },
2911
+ {
2912
+ key: ConfigKey.property_tableScope,
2913
+ description: "Scope attribute for header cells.",
2914
+ format: TagFormat.plainText
2915
+ }
2916
+ ],
2917
+ repeatCount: Count.infinity
2918
+ }
2919
+ ]
2920
+ }
2921
+ ]
2922
+ },
2923
+ //
2924
+ // pronunciation-table
2925
+ //
2572
2926
  [CardSetConfigKey.pronunciationTable]: {
2573
- variants: [
2574
- // Side 1
2575
- [
2576
- // Variant 1..N
2577
- {
2578
- tags: [
2579
- {
2580
- key: ConfigKey.group_standardItemLeadInstructionHint,
2581
- description: "Standard tags for lead, instruction, and hint."
2582
- },
2583
- {
2584
- key: ConfigKey.tag_title,
2585
- description: "Title of the pronunciation table."
2586
- },
2587
- {
2588
- key: ConfigKey.resource_audio,
2589
- description: "Audio resource for the pronunciation table."
2590
- }
2591
- ],
2592
- repeatCount: Count.infinity
2593
- }
2594
- ]
2927
+ jsonKey: "pronunciationTable.data",
2928
+ itemType: "array",
2929
+ sides: [
2930
+ {
2931
+ name: "cell",
2932
+ repeat: true,
2933
+ variants: [
2934
+ {
2935
+ jsonKey: "body",
2936
+ tags: [
2937
+ {
2938
+ key: ConfigKey.group_standardItemLeadInstructionHint,
2939
+ description: "Standard tags for lead, instruction, and hint."
2940
+ },
2941
+ {
2942
+ key: ConfigKey.tag_title,
2943
+ description: "Title of the pronunciation table."
2944
+ },
2945
+ {
2946
+ key: ConfigKey.resource_audio,
2947
+ description: "Audio resource for the pronunciation table.",
2948
+ jsonKey: "audio"
2949
+ }
2950
+ ],
2951
+ repeatCount: Count.infinity
2952
+ }
2953
+ ]
2954
+ }
2595
2955
  ]
2596
2956
  },
2957
+ //
2958
+ // bot-action-responses
2959
+ //
2597
2960
  [CardSetConfigKey.botActionResponses]: {
2598
- variants: [
2599
- [
2600
- {
2601
- tags: [
2602
- {
2603
- key: ConfigKey.property_reaction,
2604
- description: "Reaction to the bot action.",
2605
- format: TagFormat.plainText
2606
- },
2607
- {
2608
- key: ConfigKey.group_standardItemLeadInstructionHint,
2609
- description: "Standard tags for lead, instruction, and hint."
2610
- },
2611
- {
2612
- key: ConfigKey.property_example,
2613
- description: "Example text for the bot action response.",
2614
- format: TagFormat.plainText
2615
- }
2616
- ]
2617
- }
2618
- ]
2961
+ jsonKey: "responses",
2962
+ sides: [
2963
+ {
2964
+ name: "response",
2965
+ variants: [
2966
+ {
2967
+ jsonKey: "feedback",
2968
+ tags: [
2969
+ {
2970
+ key: ConfigKey.property_reaction,
2971
+ description: "Reaction to the bot action.",
2972
+ format: TagFormat.plainText
2973
+ },
2974
+ {
2975
+ key: ConfigKey.tag_item,
2976
+ description: "The item for the bot action response.",
2977
+ chain: [
2978
+ {
2979
+ key: ConfigKey.tag_item,
2980
+ description: "The lead, page number, source page number, and margin number.",
2981
+ maxCount: 4
2982
+ }
2983
+ ]
2984
+ },
2985
+ {
2986
+ key: ConfigKey.tag_instruction,
2987
+ description: "The response label for the bot action.",
2988
+ jsonKey: "response"
2989
+ },
2990
+ {
2991
+ key: ConfigKey.property_example,
2992
+ description: "Example text for the bot action response.",
2993
+ format: TagFormat.plainText
2994
+ }
2995
+ ]
2996
+ }
2997
+ ]
2998
+ }
2619
2999
  ]
2620
3000
  },
3001
+ //
3002
+ // cloze-list
3003
+ //
2621
3004
  [CardSetConfigKey.clozeList]: {
2622
- variants: [
2623
- [
2624
- {
2625
- tags: [
2626
- {
2627
- key: ConfigKey.group_standardTags,
2628
- description: "Standard tags for cloze items."
2629
- },
2630
- {
2631
- key: ConfigKey.group_gap,
2632
- description: "Group for gap tags in cloze items."
2633
- }
2634
- ]
2635
- }
2636
- ]
3005
+ jsonKey: "listItems",
3006
+ sides: [
3007
+ {
3008
+ name: "content",
3009
+ variants: [
3010
+ {
3011
+ jsonKey: "body",
3012
+ tags: [
3013
+ {
3014
+ key: ConfigKey.group_standardTags,
3015
+ description: "Standard tags for cloze items."
3016
+ },
3017
+ {
3018
+ key: ConfigKey.group_gap,
3019
+ description: "Group for gap tags in cloze items."
3020
+ }
3021
+ ]
3022
+ }
3023
+ ]
3024
+ }
2637
3025
  ]
2638
3026
  },
3027
+ //
3028
+ // example-bit-list
3029
+ //
2639
3030
  [CardSetConfigKey.exampleBitList]: {
2640
- variants: [
2641
- [
2642
- {
2643
- tags: [
2644
- {
2645
- key: ConfigKey.group_standardTags,
2646
- description: "Standard tags for example bits."
2647
- },
2648
- {
2649
- key: ConfigKey.tag_title,
2650
- description: "Title of the example bit."
2651
- }
2652
- ],
2653
- repeatCount: Count.infinity
2654
- }
2655
- ]
3031
+ jsonKey: "listItems",
3032
+ sides: [
3033
+ {
3034
+ name: "item",
3035
+ variants: [
3036
+ {
3037
+ jsonKey: "body",
3038
+ tags: [
3039
+ {
3040
+ key: ConfigKey.group_standardTags,
3041
+ description: "Standard tags for example bits."
3042
+ },
3043
+ {
3044
+ key: ConfigKey.tag_title,
3045
+ description: "Title of the example bit."
3046
+ }
3047
+ ]
3048
+ }
3049
+ ]
3050
+ }
2656
3051
  ]
2657
3052
  },
3053
+ //
3054
+ // ingredients
3055
+ //
2658
3056
  [CardSetConfigKey.ingredients]: {
2659
- variants: [
2660
- [
2661
- {
2662
- tags: [
2663
- {
2664
- key: ConfigKey.tag_title,
2665
- description: "Title of the ingredient."
2666
- },
2667
- {
2668
- key: ConfigKey.group_trueFalse,
2669
- description: "Group for true/false properties of the ingredient."
2670
- },
2671
- {
2672
- key: ConfigKey.group_standardItemLeadInstructionHint,
2673
- description: "Standard tags for lead, instruction, and hint."
2674
- },
2675
- {
2676
- key: ConfigKey.property_unit,
2677
- description: "Unit of measurement for the ingredient.",
2678
- format: TagFormat.plainText
2679
- },
2680
- {
2681
- key: ConfigKey.property_unitAbbr,
2682
- description: "Abbreviation for the unit of measurement.",
2683
- format: TagFormat.plainText
2684
- },
2685
- {
2686
- key: ConfigKey.property_decimalPlaces,
2687
- description: "Number of decimal places for the ingredient quantity.",
2688
- format: TagFormat.number,
2689
- defaultValue: "1"
2690
- },
2691
- {
2692
- key: ConfigKey.property_disableCalculation,
2693
- description: "Disable calculation for the ingredient.",
2694
- format: TagFormat.boolean
2695
- }
2696
- ],
2697
- repeatCount: Count.infinity
2698
- }
2699
- ]
3057
+ jsonKey: "ingredients",
3058
+ sides: [
3059
+ {
3060
+ name: "ingredient",
3061
+ variants: [
3062
+ {
3063
+ jsonKey: "ingredient",
3064
+ tags: [
3065
+ {
3066
+ key: ConfigKey.tag_title,
3067
+ description: "Title of the ingredient."
3068
+ },
3069
+ {
3070
+ key: ConfigKey.group_trueFalse,
3071
+ description: "Group for true/false properties of the ingredient."
3072
+ },
3073
+ {
3074
+ key: ConfigKey.tag_item,
3075
+ description: "The item for the ingredient.",
3076
+ chain: [
3077
+ {
3078
+ key: ConfigKey.tag_item,
3079
+ description: "Lead, page number, source page number, and margin number.",
3080
+ maxCount: 4
3081
+ }
3082
+ ]
3083
+ },
3084
+ {
3085
+ key: ConfigKey.tag_instruction,
3086
+ description: "The quantity of the ingredient.",
3087
+ jsonKey: "quantity"
3088
+ },
3089
+ {
3090
+ key: ConfigKey.tag_hint,
3091
+ description: "The hint for the ingredient."
3092
+ },
3093
+ {
3094
+ key: ConfigKey.property_unit,
3095
+ description: "Unit of measurement for the ingredient.",
3096
+ format: TagFormat.plainText
3097
+ },
3098
+ {
3099
+ key: ConfigKey.property_unitAbbr,
3100
+ description: "Abbreviation for the unit of measurement.",
3101
+ format: TagFormat.plainText
3102
+ },
3103
+ {
3104
+ key: ConfigKey.property_decimalPlaces,
3105
+ description: "Number of decimal places for the ingredient quantity.",
3106
+ format: TagFormat.number,
3107
+ defaultValue: "1"
3108
+ },
3109
+ {
3110
+ key: ConfigKey.property_disableCalculation,
3111
+ description: "Disable calculation for the ingredient.",
3112
+ format: TagFormat.boolean
3113
+ }
3114
+ ]
3115
+ }
3116
+ ]
3117
+ }
2700
3118
  ]
2701
3119
  },
2702
- // DEPRECATED - TO BE REMOVED IN THE FUTURE
2703
- // [CardSetConfigKey._captionDefinitionsList]: {
2704
- // variants: [
2705
- // // Side 1
2706
- // [
2707
- // // Variant 1..N
2708
- // {
2709
- // tags: [
2710
- // {
2711
- // type: BitTagType.tag,
2712
- // configKey: TagConfigKey.title,
2713
- // },
2714
- // ],
2715
- // repeatCount: Count.infinity,
2716
- // },
2717
- // ],
2718
- // ],
2719
- // },
3120
+ //
3121
+ // book-reference-list
3122
+ //
2720
3123
  [CardSetConfigKey.bookReferenceList]: {
2721
- variants: [
2722
- // Side 1
2723
- [
2724
- // Variant 1..N
2725
- {
2726
- tags: [
2727
- {
2728
- key: ConfigKey.group_standardTags,
2729
- description: "Standard tags for book references."
2730
- },
2731
- {
2732
- key: ConfigKey.property_refAuthor,
2733
- description: "Author of the book.",
2734
- format: TagFormat.plainText,
2735
- maxCount: Count.infinity
2736
- },
2737
- {
2738
- key: ConfigKey.property_refBookTitle,
2739
- description: "Title of the book.",
2740
- format: TagFormat.plainText
2741
- },
2742
- {
2743
- key: ConfigKey.property_refPublisher,
2744
- description: "Publisher of the book.",
2745
- format: TagFormat.plainText,
2746
- maxCount: Count.infinity
2747
- },
2748
- {
2749
- key: ConfigKey.property_refPublicationYear,
2750
- description: "Year of publication of the book.",
2751
- format: TagFormat.plainText
2752
- },
2753
- {
2754
- key: ConfigKey.property_citationStyle,
2755
- description: "Citation style for the book reference.",
2756
- format: TagFormat.plainText
2757
- }
2758
- ],
2759
- repeatCount: Count.infinity
2760
- }
2761
- ]
3124
+ jsonKey: "bookReferences",
3125
+ sides: [
3126
+ {
3127
+ name: "reference",
3128
+ variants: [
3129
+ {
3130
+ jsonKey: null,
3131
+ tags: [
3132
+ {
3133
+ key: ConfigKey.group_standardTags,
3134
+ description: "Standard tags for book references."
3135
+ },
3136
+ {
3137
+ key: ConfigKey.property_refAuthor,
3138
+ description: "Author of the book.",
3139
+ format: TagFormat.plainText,
3140
+ maxCount: Count.infinity
3141
+ },
3142
+ {
3143
+ key: ConfigKey.property_refBookTitle,
3144
+ description: "Title of the book.",
3145
+ format: TagFormat.plainText
3146
+ },
3147
+ {
3148
+ key: ConfigKey.property_refPublisher,
3149
+ description: "Publisher of the book.",
3150
+ format: TagFormat.plainText,
3151
+ maxCount: Count.infinity
3152
+ },
3153
+ {
3154
+ key: ConfigKey.property_refPublicationYear,
3155
+ description: "Year of publication of the book.",
3156
+ format: TagFormat.plainText
3157
+ },
3158
+ {
3159
+ key: ConfigKey.property_citationStyle,
3160
+ description: "Citation style for the book reference.",
3161
+ format: TagFormat.plainText
3162
+ }
3163
+ ]
3164
+ }
3165
+ ]
3166
+ }
2762
3167
  ]
2763
3168
  }
2764
3169
  };
@@ -4424,20 +4829,34 @@ var ConfigHydrator = class {
4424
4829
  if (!_cardSet) return void 0;
4425
4830
  const _cardSetConfig = CARDSETS[_cardSet];
4426
4831
  if (!_cardSetConfig) throw new Error(`No config found for card set config key '${_cardSet}'`);
4427
- const variants = [];
4428
- for (const _variants of _cardSetConfig.variants) {
4832
+ const sides = [];
4833
+ for (const _side of _cardSetConfig.sides) {
4429
4834
  const variantsOfSide = [];
4430
- for (const _variant of _variants) {
4835
+ for (const _variant of _side.variants) {
4431
4836
  const v = this.hydrateCardVariantConfig(_variant);
4432
4837
  variantsOfSide.push(v);
4433
4838
  }
4434
- variants.push(variantsOfSide);
4839
+ const sideConfig = new CardSideConfig(_side.name, _side.repeat ?? false, variantsOfSide);
4840
+ sides.push(sideConfig);
4435
4841
  }
4436
- const cardSetConfig = new CardSetConfig(_cardSet, variants);
4842
+ const cardSetConfig = new CardSetConfig(
4843
+ _cardSet,
4844
+ _cardSetConfig.jsonKey,
4845
+ _cardSetConfig.itemType ?? "object",
4846
+ _cardSetConfig.sections,
4847
+ sides
4848
+ );
4437
4849
  return cardSetConfig;
4438
4850
  }
4439
4851
  hydrateTagConfig(_tag) {
4440
- const { key: _configKey, maxCount, minCount, chain: _chain, deprecated } = _tag;
4852
+ const {
4853
+ key: _configKey,
4854
+ maxCount,
4855
+ minCount,
4856
+ chain: _chain,
4857
+ secondaryJsonKey,
4858
+ deprecated
4859
+ } = _tag;
4441
4860
  const configKey = (0, import_superenum15.Enum)(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;
4442
4861
  if (!configKey) throw new Error(`No tag key found for config key '${configKey}'`);
4443
4862
  const tag = (0, import_superenum15.Enum)(Tag).fromValue(configKey);
@@ -4452,6 +4871,7 @@ var ConfigHydrator = class {
4452
4871
  maxCount: maxCount ?? MAX_COUNT_DEFAULT,
4453
4872
  minCount: minCount ?? MIN_COUNT_DEFAULT,
4454
4873
  chain,
4874
+ secondaryJsonKey,
4455
4875
  deprecated
4456
4876
  });
4457
4877
  return {
@@ -4470,7 +4890,8 @@ var ConfigHydrator = class {
4470
4890
  format,
4471
4891
  values,
4472
4892
  defaultValue,
4473
- jsonKey
4893
+ jsonKey,
4894
+ secondaryJsonKey
4474
4895
  } = _tag;
4475
4896
  const configKey = (0, import_superenum15.Enum)(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;
4476
4897
  if (!configKey) throw new Error(`No property key found for config key '${configKey}'`);
@@ -4486,6 +4907,7 @@ var ConfigHydrator = class {
4486
4907
  minCount: minCount ?? MIN_COUNT_DEFAULT,
4487
4908
  chain,
4488
4909
  jsonKey,
4910
+ secondaryJsonKey,
4489
4911
  format,
4490
4912
  values,
4491
4913
  defaultValue,
@@ -4498,7 +4920,15 @@ var ConfigHydrator = class {
4498
4920
  };
4499
4921
  }
4500
4922
  hydrateResourceTagConfig(_tag) {
4501
- const { key: _configKey, maxCount, minCount, chain: _chain, deprecated, jsonKey } = _tag;
4923
+ const {
4924
+ key: _configKey,
4925
+ maxCount,
4926
+ minCount,
4927
+ chain: _chain,
4928
+ deprecated,
4929
+ jsonKey,
4930
+ secondaryJsonKey
4931
+ } = _tag;
4502
4932
  const configKey = (0, import_superenum15.Enum)(ConfigKey).fromValue(_configKey) || ConfigKey._unknown;
4503
4933
  if (!configKey) throw new Error(`No resource key found for config key '${configKey}'`);
4504
4934
  const tag = _configKey.substring(1);
@@ -4513,6 +4943,7 @@ var ConfigHydrator = class {
4513
4943
  minCount: minCount ?? MIN_COUNT_DEFAULT,
4514
4944
  chain,
4515
4945
  jsonKey,
4946
+ secondaryJsonKey,
4516
4947
  deprecated
4517
4948
  });
4518
4949
  return {
@@ -4544,9 +4975,15 @@ var ConfigHydrator = class {
4544
4975
  };
4545
4976
  }
4546
4977
  hydrateCardVariantConfig(_variant) {
4547
- const { tags: _tags, bodyAllowed, bodyRequired, repeatCount } = _variant;
4978
+ const { tags: _tags, bodyAllowed, bodyRequired, repeatCount, jsonKey } = _variant;
4548
4979
  const tags2 = this.hydrateTagsConfig(_tags);
4549
- const cardSetConfig = new CardVariantConfig(tags2.tags, bodyAllowed, bodyRequired, repeatCount);
4980
+ const cardSetConfig = new CardVariantConfig(
4981
+ tags2.tags,
4982
+ bodyAllowed,
4983
+ bodyRequired,
4984
+ repeatCount,
4985
+ jsonKey
4986
+ );
4550
4987
  return cardSetConfig;
4551
4988
  }
4552
4989
  };
@@ -7312,6 +7749,12 @@ var BITS = {
7312
7749
  description: "Extractor configuration bit, used to configure extractors in articles or books",
7313
7750
  textFormatDefault: TextFormat.plainText
7314
7751
  },
7752
+ [BitType.extractorBlueprintConfiguration]: {
7753
+ since: "5.11.0",
7754
+ baseBitType: BitType._standard,
7755
+ description: "Extractor blueprint configuration bit, used to specify extractor blueprint configuration when extracting from blueprints",
7756
+ textFormatDefault: TextFormat.plainText
7757
+ },
7315
7758
  [BitType.extractorImage]: {
7316
7759
  since: "4.3.0",
7317
7760
  baseBitType: BitType._standard,
@@ -7337,6 +7780,12 @@ var BITS = {
7337
7780
  baseBitType: BitType.extractorImage,
7338
7781
  description: "Collapsible extractor images bit, used for images extracted from PDFs"
7339
7782
  },
7783
+ [BitType.extractorBlueprint]: {
7784
+ since: "5.12.0",
7785
+ baseBitType: BitType._standard,
7786
+ description: "Extractor blueprint bit, used to provide blueprint information about extractors",
7787
+ textFormatDefault: TextFormat.json
7788
+ },
7340
7789
  [BitType.extractorInformation]: {
7341
7790
  since: "3.8.0",
7342
7791
  baseBitType: BitType._standard,
@@ -7539,6 +7988,11 @@ var BITS = {
7539
7988
  baseBitType: BitType.pageOpenBook,
7540
7989
  description: "Open book chapter bit, derived from page-open-book, used to create chapter pages that open books"
7541
7990
  },
7991
+ [BitType.openBookChapterTeaser]: {
7992
+ since: "4.16.0",
7993
+ baseBitType: BitType.openBookChapter,
7994
+ description: "Open book chapter teaser bit, equal to open-book-chapter, used to create teaser chapter pages that open books"
7995
+ },
7542
7996
  [BitType.pageOpenBookList]: {
7543
7997
  since: "2.1.0",
7544
7998
  baseBitType: BitType.article,
@@ -9441,6 +9895,38 @@ var BITS = {
9441
9895
  baseBitType: BitType.table,
9442
9896
  description: "Extended table bit, used to create complex tables with all HTML table features"
9443
9897
  },
9898
+ [BitType.tableExtendedImage]: {
9899
+ since: "5.13.0",
9900
+ baseBitType: BitType.tableExtended,
9901
+ description: "Extended table image bit, used to create complex tables with images and all HTML table features",
9902
+ tags: [
9903
+ {
9904
+ key: ConfigKey.property_caption,
9905
+ description: "Caption for the table image, used to provide a description for the image",
9906
+ format: TagFormat.bitmarkText
9907
+ },
9908
+ {
9909
+ key: ConfigKey.resource_backgroundWallpaper,
9910
+ description: "Background wallpaper for the image, used to set a background for the image",
9911
+ chain: [
9912
+ {
9913
+ key: ConfigKey.group_resourceImageCommon,
9914
+ description: "Common resource image tags for images"
9915
+ }
9916
+ ]
9917
+ },
9918
+ {
9919
+ key: ConfigKey.group_resourceBitTags,
9920
+ description: "Resource bit tags for images, used to define additional properties for images"
9921
+ },
9922
+ {
9923
+ key: ConfigKey.group_resourceImage,
9924
+ description: "Resource image tags for images, used to attach images to the bit",
9925
+ minCount: 1
9926
+ }
9927
+ ],
9928
+ resourceAttachmentAllowed: false
9929
+ },
9444
9930
  [BitType.tableAlt]: {
9445
9931
  since: "1.16.0",
9446
9932
  baseBitType: BitType.table,
@@ -10359,6 +10845,7 @@ var Config = class {
10359
10845
  maxCount: 1,
10360
10846
  chain: tag.chain,
10361
10847
  jsonKey: tag.jsonKey,
10848
+ secondaryJsonKey: tag.secondaryJsonKey,
10362
10849
  deprecated: tag.deprecated
10363
10850
  });
10364
10851
  finalResourceTags[k] = newTag;
@@ -10463,7 +10950,7 @@ var instance2 = new Config();
10463
10950
  // src/generated/package_info.ts
10464
10951
  var PACKAGE_INFO = {
10465
10952
  "name": "@gmb/bitmark-parser-generator",
10466
- "version": "5.11.0",
10953
+ "version": "5.13.0",
10467
10954
  "author": "Get More Brain Ltd",
10468
10955
  "license": "ISC",
10469
10956
  "description": "A bitmark parser and generator using Peggy.js"
@@ -12367,6 +12854,7 @@ var TextGenerator = class _TextGenerator extends AstWalkerGenerator {
12367
12854
  * @param ast bitmark text AST
12368
12855
  */
12369
12856
  generateSync(ast, textFormat, textLocation, options) {
12857
+ if (!ast || !Array.isArray(ast)) return "";
12370
12858
  this.generateOptions = Object.assign({}, options);
12371
12859
  this.validateGenerateOptions(ast);
12372
12860
  if (!this.generateOptions.plainTextDividerAllowed) {
@@ -34474,6 +34962,7 @@ function propertyContentProcessor(context, contentDepth, tagsConfig, content, ta
34474
34962
  minCount: 1,
34475
34963
  chain: void 0,
34476
34964
  jsonKey: void 0,
34965
+ secondaryJsonKey: void 0,
34477
34966
  format: TagFormat.bitmarkText,
34478
34967
  values: void 0,
34479
34968
  defaultValue: void 0,
@@ -39327,7 +39816,7 @@ var ConfigBuilder = class {
39327
39816
  const processTagEntries = (tag, tagNameChain) => {
39328
39817
  const tags2 = [];
39329
39818
  let tagName = tag.key;
39330
- const jsonKey = keyToJsonKey(tagName, tagNameChain);
39819
+ const jsonKey = tag.jsonKey ?? keyToJsonKey(tagName, tagNameChain);
39331
39820
  const tagType = typeFromConfigKey(tag.key);
39332
39821
  let format = "";
39333
39822
  let chain = void 0;
@@ -39356,7 +39845,8 @@ var ConfigBuilder = class {
39356
39845
  for (const groupKey of resolvedGroups) {
39357
39846
  tags2.push({
39358
39847
  type: "group",
39359
- key: groupKey
39848
+ key: groupKey,
39849
+ ...tag.jsonKey ? { jsonKey: tag.jsonKey } : {}
39360
39850
  });
39361
39851
  }
39362
39852
  return tags2;
@@ -39372,6 +39862,7 @@ var ConfigBuilder = class {
39372
39862
  type: "tag",
39373
39863
  key: tagName,
39374
39864
  jsonKey,
39865
+ ...tag.secondaryJsonKey ? { secondaryJsonKey: tag.secondaryJsonKey } : {},
39375
39866
  format,
39376
39867
  default: null,
39377
39868
  alwaysInclude: false,
@@ -39390,8 +39881,8 @@ var ConfigBuilder = class {
39390
39881
  const cardSetConfig = CARDSETS[cardSetKey];
39391
39882
  if (!cardSetConfig) return void 0;
39392
39883
  const normalizedKey = normalizeCardKey(cardSetKey);
39393
- const sides = cardSetConfig.variants.map((variantList) => {
39394
- const variants = variantList.map((variant) => {
39884
+ const sides = cardSetConfig.sides.map((side) => {
39885
+ const variants = side.variants.map((variant) => {
39395
39886
  const variantTags = [];
39396
39887
  const variantTagEntries = Object.entries(variant.tags ?? []).sort((a, b) => {
39397
39888
  const tagA = a[1];
@@ -39405,16 +39896,24 @@ var ConfigBuilder = class {
39405
39896
  variantTags.push(...processTagEntries(variantTag, []));
39406
39897
  }
39407
39898
  return {
39899
+ ...variant.jsonKey !== void 0 ? { jsonKey: variant.jsonKey } : {},
39408
39900
  tags: variantTags,
39409
39901
  repeatCount: variant.repeatCount ?? 1,
39410
39902
  bodyAllowed: variant.bodyAllowed ?? true,
39411
39903
  bodyRequired: variant.bodyRequired ?? false
39412
39904
  };
39413
39905
  });
39414
- return { variants };
39906
+ return {
39907
+ name: side.name,
39908
+ ...side.repeat ? { repeat: side.repeat } : {},
39909
+ variants
39910
+ };
39415
39911
  });
39416
39912
  return {
39417
39913
  key: normalizedKey,
39914
+ jsonKey: cardSetConfig.jsonKey,
39915
+ ...cardSetConfig.itemType && cardSetConfig.itemType !== "object" ? { itemType: cardSetConfig.itemType } : {},
39916
+ ...cardSetConfig.sections ? { sections: cardSetConfig.sections } : {},
39418
39917
  sides
39419
39918
  };
39420
39919
  };