@gmb/bitmark-parser-generator 5.34.0 → 5.36.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.
@@ -267,6 +267,7 @@ var BitType2 = {
267
267
  extractorPageNumberCollapsible: "extractor-page-number-collapsible",
268
268
  extractorPageWithBlocks: "extractor-page-with-blocks",
269
269
  extractorPageWithBlocksCollapsible: "extractor-page-with-blocks-collapsible",
270
+ extractorReconcile: "extractor-reconcile",
270
271
  extractorRepeatedText: "extractor-repeated-text",
271
272
  extractorRule: "extractor-rule",
272
273
  extractorTheme: "extractor-theme",
@@ -1350,6 +1351,7 @@ var propertyKeys = {
1350
1351
  property_dateEnd: "@dateEnd",
1351
1352
  property_decimalPlaces: "@decimalPlaces",
1352
1353
  property_deeplink: "@deeplink",
1354
+ property_displayName: "@displayName",
1353
1355
  property_diffContext: "@diffContext",
1354
1356
  property_diffOp: "@diffOp",
1355
1357
  property_diffRef: "@diffRef",
@@ -1505,6 +1507,7 @@ var propertyKeys = {
1505
1507
  property_revealSolutions: "@revealSolutions",
1506
1508
  property_reviewTag: "@reviewTag",
1507
1509
  property_reviewerTag: "@reviewerTag",
1510
+ property_rightsPolicy: "@rightsPolicy",
1508
1511
  property_sampleSolution: "@sampleSolution",
1509
1512
  property_scormSource: "@scormSource",
1510
1513
  property_search: "@search",
@@ -2498,9 +2501,30 @@ var CARDSETS = {
2498
2501
  [CardSetConfigKey.definitionList]: {
2499
2502
  jsonKey: "definitions",
2500
2503
  exportJsonKey: { definitions: "$" },
2504
+ // PLAN-141 F1 (NISO import): each <def-item> is one card; the sides
2505
+ // read <term>/<def>; the enclosing <legend>'s <title> lands on the
2506
+ // term side's heading tag ([#Key] header card).
2507
+ // PLAN-141 F3: a <tbx:langSet> is ALSO one card (a terminology entry —
2508
+ // its enclosing <tbx:termEntry> is a transparent claim wrapper); its
2509
+ // children compose the term/definition sides via the side rules below.
2510
+ mappingKeys: {
2511
+ "xml-niso-iec": [
2512
+ { "@el": "def-item", "@children": "$" },
2513
+ { "@el": "tbx:langSet", "@children": "$" }
2514
+ ]
2515
+ },
2501
2516
  sides: [
2502
2517
  {
2503
2518
  name: "term",
2519
+ // F3: every <tbx:tig>'s <tbx:term> STACKS one-per-line onto the
2520
+ // single term side (the "$\n" template's authored separator; the
2521
+ // trailing one is trimmed) — the PDF's Maus/Mus/M/Müsli stack.
2522
+ mappingKeys: {
2523
+ "xml-niso-iec": [
2524
+ { "@el": "term", "@text": "$" },
2525
+ { "@el": "tbx:tig", "@children": { "@el": "tbx:term", "@text": "$\n" } }
2526
+ ]
2527
+ },
2504
2528
  variants: [
2505
2529
  {
2506
2530
  jsonKey: "term.text",
@@ -2514,8 +2538,10 @@ var CARDSETS = {
2514
2538
  key: ConfigKey.tag_title,
2515
2539
  description: "Title of the definition.",
2516
2540
  format: TagFormat.plainText,
2541
+ nullable: true,
2517
2542
  jsonKey: "^heading.forKeys",
2518
- exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2543
+ exportJsonKey: { "@bit": { heading: { forKeys: "$" } } },
2544
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
2519
2545
  },
2520
2546
  {
2521
2547
  key: ConfigKey.group_resourceIcon,
@@ -2541,6 +2567,24 @@ var CARDSETS = {
2541
2567
  },
2542
2568
  {
2543
2569
  name: "definition",
2570
+ // F3: the definition side COMPOSES from the entry's fields in
2571
+ // document order, with the ES-rendered locale affixes AUTHORED as
2572
+ // value-position templates (never engine text): the subject field
2573
+ // in ⟨⟩ glues (trailing space) onto the definition line; example /
2574
+ // notes / source follow as blank-line-separated lines. The TBX
2575
+ // grammar flags (normativeAuthorization, termType, partOfSpeech,
2576
+ // grammaticalNumber) are unrendered machine-only data — dropped and
2577
+ // recorded (catalog R-2, reviewed under D7 max-preservation).
2578
+ mappingKeys: {
2579
+ "xml-niso-iec": [
2580
+ { "@el": "def", "@children": "$" },
2581
+ { "@el": "tbx:subjectField", "@text": "\u27E8$\u27E9 " },
2582
+ { "@el": "tbx:definition", "@children": "$" },
2583
+ { "@el": "tbx:example", "@children": "BEISPIEL $" },
2584
+ { "@el": "tbx:note", "@children": "Anmerkung zu Begriff: $" },
2585
+ { "@el": "tbx:source", "@text": "[QUELLE: $]" }
2586
+ ]
2587
+ },
2544
2588
  variants: [
2545
2589
  {
2546
2590
  jsonKey: "definition.text",
@@ -2554,6 +2598,7 @@ var CARDSETS = {
2554
2598
  key: ConfigKey.tag_title,
2555
2599
  description: "Title of the definition.",
2556
2600
  format: TagFormat.plainText,
2601
+ nullable: true,
2557
2602
  jsonKey: "^heading.forValues",
2558
2603
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2559
2604
  },
@@ -2632,6 +2677,7 @@ var CARDSETS = {
2632
2677
  key: ConfigKey.tag_title,
2633
2678
  description: "Title of the definition.",
2634
2679
  format: TagFormat.plainText,
2680
+ nullable: true,
2635
2681
  jsonKey: "^heading.forKeys",
2636
2682
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2637
2683
  },
@@ -2673,6 +2719,7 @@ var CARDSETS = {
2673
2719
  key: ConfigKey.tag_title,
2674
2720
  description: "Title of the definition.",
2675
2721
  format: TagFormat.plainText,
2722
+ nullable: true,
2676
2723
  jsonKey: "^heading.forValues",
2677
2724
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2678
2725
  },
@@ -2786,6 +2833,7 @@ var CARDSETS = {
2786
2833
  key: ConfigKey.tag_title,
2787
2834
  description: "Title of the match pair.",
2788
2835
  format: TagFormat.plainText,
2836
+ nullable: true,
2789
2837
  jsonKey: "^heading.forKeys",
2790
2838
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2791
2839
  },
@@ -2915,6 +2963,7 @@ var CARDSETS = {
2915
2963
  key: ConfigKey.tag_title,
2916
2964
  description: "Title of the match pair.",
2917
2965
  format: TagFormat.plainText,
2966
+ nullable: true,
2918
2967
  jsonKey: "^heading.forValues",
2919
2968
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2920
2969
  },
@@ -2961,6 +3010,7 @@ var CARDSETS = {
2961
3010
  key: ConfigKey.tag_title,
2962
3011
  description: "Title of the audio match pair.",
2963
3012
  format: TagFormat.plainText,
3013
+ nullable: true,
2964
3014
  jsonKey: "^heading.forKeys",
2965
3015
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2966
3016
  },
@@ -2992,6 +3042,7 @@ var CARDSETS = {
2992
3042
  key: ConfigKey.tag_title,
2993
3043
  description: "Title of the audio match pair.",
2994
3044
  format: TagFormat.plainText,
3045
+ nullable: true,
2995
3046
  jsonKey: "^heading.forValues",
2996
3047
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2997
3048
  },
@@ -3029,6 +3080,7 @@ var CARDSETS = {
3029
3080
  key: ConfigKey.tag_title,
3030
3081
  description: "Title of the image match pair.",
3031
3082
  format: TagFormat.plainText,
3083
+ nullable: true,
3032
3084
  jsonKey: "^heading.forKeys",
3033
3085
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3034
3086
  },
@@ -3060,6 +3112,7 @@ var CARDSETS = {
3060
3112
  key: ConfigKey.tag_title,
3061
3113
  description: "Title of the image match pair.",
3062
3114
  format: TagFormat.plainText,
3115
+ nullable: true,
3063
3116
  jsonKey: "^heading.forValues",
3064
3117
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
3065
3118
  },
@@ -3135,6 +3188,7 @@ var CARDSETS = {
3135
3188
  key: ConfigKey.tag_title,
3136
3189
  description: "Title of the match matrix.",
3137
3190
  format: TagFormat.plainText,
3191
+ nullable: true,
3138
3192
  jsonKey: "^heading.forKeys",
3139
3193
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3140
3194
  },
@@ -3247,6 +3301,7 @@ var CARDSETS = {
3247
3301
  key: ConfigKey.tag_title,
3248
3302
  description: "Title of the match matrix.",
3249
3303
  format: TagFormat.plainText,
3304
+ nullable: true,
3250
3305
  jsonKey: "^heading.forValues",
3251
3306
  exportJsonKey: [
3252
3307
  { "@keyonly": { "@bit": { heading: { forValues: [""] } } } },
@@ -3529,6 +3584,7 @@ var CARDSETS = {
3529
3584
  key: ConfigKey.tag_title,
3530
3585
  description: "Title of the feedback.",
3531
3586
  format: TagFormat.plainText,
3587
+ nullable: true,
3532
3588
  jsonKey: "^heading.forKeys",
3533
3589
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3534
3590
  }
@@ -3611,6 +3667,7 @@ var CARDSETS = {
3611
3667
  key: ConfigKey.tag_title,
3612
3668
  description: "Title of the feedback.",
3613
3669
  format: TagFormat.plainText,
3670
+ nullable: true,
3614
3671
  jsonKey: "^heading.forValues",
3615
3672
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
3616
3673
  }
@@ -3918,6 +3975,11 @@ var CARDSETS = {
3918
3975
  { table: { header: { rows: ["$"] } } }
3919
3976
  ],
3920
3977
  htmlKey: { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } },
3978
+ // PLAN-141 F2 (NISO import): the XHTML table model NISO uses — a
3979
+ // <thead> SECTION whose <tr> rows are the header cards.
3980
+ mappingKeys: {
3981
+ "xml-niso-iec": { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } }
3982
+ },
3921
3983
  sideJsonKey: "cells[{s}]|set(title=true)",
3922
3984
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3923
3985
  // Header cells are `<th>`. The `width` attribute is contributed by the
@@ -3929,12 +3991,21 @@ var CARDSETS = {
3929
3991
  jsonKey: "table.body.rows",
3930
3992
  exportJsonKey: { table: { body: { rows: "$" } } },
3931
3993
  htmlKey: { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } },
3994
+ // PLAN-141 F2 (NISO import): <tbody> rows are the (default) data cards.
3995
+ mappingKeys: {
3996
+ "xml-niso-iec": { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } }
3997
+ },
3932
3998
  isDefault: true
3933
3999
  },
3934
4000
  "table-footer": {
3935
4001
  jsonKey: "table.footer.rows",
3936
4002
  exportJsonKey: { table: { footer: { rows: "$" } } },
3937
4003
  htmlKey: { "@el": "tfoot", "@children": { "@el": "tr", "@children": "$" } },
4004
+ // PLAN-141 F2 (NISO import): NISO has no <tfoot> — the footer card's
4005
+ // source is the <table-wrap-foot> block (CONTENT-shaped: no rows; its
4006
+ // prose/notes flatten into one footer card — catalog table-wrap-foot
4007
+ // row; a contained <def-list> promotes as a sibling legend bit).
4008
+ mappingKeys: { "xml-niso-iec": { "@el": "table-wrap-foot", "@children": "$" } },
3938
4009
  sideJsonKey: "cells[{s}]|set(title=true)",
3939
4010
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3940
4011
  // Footer cells render as `<th>` (mirrors the header `title: true`
@@ -3951,6 +4022,8 @@ var CARDSETS = {
3951
4022
  // Default (body) cell → `<td>`; the header/footer sections override the
3952
4023
  // side to `<th>` via their sideHtmlKey (HTML.md §8).
3953
4024
  htmlKey: { "@el": "td", "@children": "$" },
4025
+ // PLAN-141 F2 (NISO import): a <td> row child is a body cell side.
4026
+ mappingKeys: { "xml-niso-iec": { "@el": "td", "@children": "$" } },
3954
4027
  variants: [
3955
4028
  {
3956
4029
  jsonKey: "content",
@@ -3968,7 +4041,11 @@ var CARDSETS = {
3968
4041
  // cell with `title: true` automatically.
3969
4042
  jsonKey: "content",
3970
4043
  exportJsonKey: { content: "$" },
3971
- description: "Title text of the table cell (header rows)."
4044
+ description: "Title text of the table cell (header rows).",
4045
+ // PLAN-141 F2 (NISO import): a <th> row child is a TITLE cell —
4046
+ // its content lands in the `[#…]` tag (an empty <th> keeps its
4047
+ // slot as a bare `[#]`).
4048
+ mappingKeys: { "xml-niso-iec": { "@el": "th", "@children": "$" } }
3972
4049
  },
3973
4050
  {
3974
4051
  key: ConfigKey.property_tableCellType,
@@ -3987,6 +4064,9 @@ var CARDSETS = {
3987
4064
  // HTML-C2: contribute a `rowspan` attribute onto the enclosing
3988
4065
  // cell element (`<th>`/`<td>`).
3989
4066
  htmlKey: { "@el": { "@attr": { rowspan: "$" } } },
4067
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4068
+ // `rowspan` attribute (element-scope attr form).
4069
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { rowspan: "$" } } } },
3990
4070
  description: "Number of rows the cell spans.",
3991
4071
  format: TagFormat.number
3992
4072
  },
@@ -3997,6 +4077,9 @@ var CARDSETS = {
3997
4077
  // HTML-C2: contribute a `colspan` attribute onto the enclosing
3998
4078
  // cell element (`<th>`/`<td>`).
3999
4079
  htmlKey: { "@el": { "@attr": { colspan: "$" } } },
4080
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4081
+ // `colspan` attribute (element-scope attr form).
4082
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { colspan: "$" } } } },
4000
4083
  description: "Number of columns the cell spans.",
4001
4084
  format: TagFormat.number
4002
4085
  },
@@ -4018,6 +4101,13 @@ var CARDSETS = {
4018
4101
  // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the
4019
4102
  // enclosing cell element (`<th>`/`<td>`).
4020
4103
  htmlKey: { "@el": { "@attr": { width: "$" } } },
4104
+ // PLAN-141 F2 (NISO import): NISO carries widths as PER-COLUMN
4105
+ // <col width="…"> descriptors at container level, not on cells.
4106
+ // The matched values distribute positionally onto the first
4107
+ // (header) card's sides. Number format ⇒ only an integral
4108
+ // percentage survives ("20.0000%" → 20); a fractional one
4109
+ // (renderer-equalised "4.7619%") is dropped — catalog `col` row.
4110
+ mappingKeys: { "xml-niso-iec": { "@el": "col", "@attr": { width: "$" } } },
4021
4111
  description: "Width for the column.",
4022
4112
  format: TagFormat.number
4023
4113
  }
@@ -4391,13 +4481,44 @@ var GROUPS = {
4391
4481
  key: ConfigKey.property_externalId,
4392
4482
  description: "The external identifier for the bit",
4393
4483
  format: TagFormat.plainText,
4394
- maxCount: Count.infinity
4484
+ maxCount: Count.infinity,
4485
+ // PLAN-140 refs family (NISO import): the machine identifier of a
4486
+ // referenced standard. NESTED content slot — the tag reads (and
4487
+ // consumes) ONLY the <std-id> inside a <std> child; the remaining
4488
+ // designation/title text stays bit body. A <std> without <std-id>
4489
+ // does not fire the key.
4490
+ // PLAN-141 F5: on the [.book] bit, the DATED <std-ref> designation
4491
+ // is the document's external id. Safe rule order: <std-ref> is a
4492
+ // direct bit-element child only under <std-meta> (everywhere else
4493
+ // it nests inside <std>, which the tag spine never reaches).
4494
+ mappingKeys: {
4495
+ "xml-niso-iec": [
4496
+ { "@el": "std", "@children": { "@el": "std-id", "@text": "$" } },
4497
+ { "@el": "std-ref", "@attr": { type: "dated" }, "@text": "$" }
4498
+ ]
4499
+ }
4395
4500
  },
4396
4501
  {
4397
4502
  key: ConfigKey.property_sourceRL,
4398
4503
  description: "The original location of the information in the original source material",
4399
4504
  format: TagFormat.plainText
4400
4505
  },
4506
+ {
4507
+ key: ConfigKey.property_copyright,
4508
+ description: "The copyright information for the bit",
4509
+ format: TagFormat.plainText
4510
+ },
4511
+ {
4512
+ key: ConfigKey.property_license,
4513
+ description: "The license for the bit",
4514
+ format: TagFormat.plainText
4515
+ },
4516
+ {
4517
+ key: ConfigKey.property_rightsPolicy,
4518
+ description: "The rights policy or policies for the bit",
4519
+ format: TagFormat.plainText,
4520
+ maxCount: Count.infinity
4521
+ },
4401
4522
  {
4402
4523
  key: ConfigKey.property_isTemplate,
4403
4524
  description: "If true, the bit is a template",
@@ -4424,7 +4545,8 @@ var GROUPS = {
4424
4545
  {
4425
4546
  key: ConfigKey.property_aiGenerated,
4426
4547
  description: "If true, the bit is AI-generated",
4427
- format: TagFormat.boolean
4548
+ format: TagFormat.boolean,
4549
+ nullable: true
4428
4550
  },
4429
4551
  {
4430
4552
  key: ConfigKey.property_machineTranslated,
@@ -4439,7 +4561,8 @@ var GROUPS = {
4439
4561
  {
4440
4562
  key: ConfigKey.property_spansPageBreak,
4441
4563
  description: "If true, the bit spans a page break",
4442
- format: TagFormat.boolean
4564
+ format: TagFormat.boolean,
4565
+ nullable: true
4443
4566
  },
4444
4567
  {
4445
4568
  key: ConfigKey.property_searchIndex,
@@ -4514,7 +4637,8 @@ var GROUPS = {
4514
4637
  {
4515
4638
  key: ConfigKey.property_diffTime,
4516
4639
  description: "The diff time for the bit",
4517
- format: TagFormat.number
4640
+ format: TagFormat.number,
4641
+ nullable: true
4518
4642
  },
4519
4643
  {
4520
4644
  key: ConfigKey.property_ageRange,
@@ -4525,7 +4649,18 @@ var GROUPS = {
4525
4649
  {
4526
4650
  key: ConfigKey.property_lang,
4527
4651
  description: "The language for the bit",
4528
- format: TagFormat.plainText
4652
+ format: TagFormat.plainText,
4653
+ // PLAN-141 F3 (NISO import): a term-sec's language rides
4654
+ // <tbx:termEntry><tbx:langSet xml:lang> — a nested content slot
4655
+ // whose leaf is a $-in-ATTR-position slot (the nested counterpart
4656
+ // of the value-attr slot). Only termEntry elements match, so the
4657
+ // shared tag is inert everywhere else.
4658
+ mappingKeys: {
4659
+ "xml-niso-iec": {
4660
+ "@el": "tbx:termEntry",
4661
+ "@children": { "@el": "tbx:langSet", "@attr": { "xml:lang": "$" } }
4662
+ }
4663
+ }
4529
4664
  },
4530
4665
  {
4531
4666
  key: ConfigKey.property_publisher,
@@ -4542,6 +4677,7 @@ var GROUPS = {
4542
4677
  key: ConfigKey.property_theme,
4543
4678
  description: "The theme(s) for the bit",
4544
4679
  format: TagFormat.plainText,
4680
+ nullable: true,
4545
4681
  maxCount: Count.infinity
4546
4682
  },
4547
4683
  {
@@ -4560,6 +4696,7 @@ var GROUPS = {
4560
4696
  key: ConfigKey.property_tag,
4561
4697
  description: "The tag(s) for the bit",
4562
4698
  format: TagFormat.plainText,
4699
+ nullable: true,
4563
4700
  maxCount: Count.infinity
4564
4701
  },
4565
4702
  {
@@ -4579,6 +4716,7 @@ var GROUPS = {
4579
4716
  exportJsonKey: { tags: ["$"] },
4580
4717
  description: "The tag(s) for the group",
4581
4718
  format: TagFormat.plainText,
4719
+ nullable: true,
4582
4720
  maxCount: Count.infinity
4583
4721
  }
4584
4722
  ]
@@ -4696,6 +4834,20 @@ var GROUPS = {
4696
4834
  description: "The layer role(s) for the bit",
4697
4835
  format: TagFormat.plainText,
4698
4836
  maxCount: Count.infinity
4837
+ },
4838
+ {
4839
+ // Universal @internalComment — declares in config what Config.ts also
4840
+ // injects programmatically into every bit (its push runs last and wins
4841
+ // the keyed merge, so runtime behaviour is unchanged). Declared here so
4842
+ // the config export (ConfigBuilder → assets/config → configurator →
4843
+ // bitmark.json) carries the tag for downstream parsers. Empty
4844
+ // exportJsonKey: consumed but never emitted to the bit JSON (the value
4845
+ // is routed to parser.internalComments).
4846
+ key: ConfigKey.property_internalComment,
4847
+ description: "Internal comment for the bit.",
4848
+ format: TagFormat.plainText,
4849
+ maxCount: Count.infinity,
4850
+ exportJsonKey: {}
4699
4851
  }
4700
4852
  ]
4701
4853
  },
@@ -4707,6 +4859,9 @@ var GROUPS = {
4707
4859
  key: ConfigKey.tag_item,
4708
4860
  jsonKey: "item",
4709
4861
  exportJsonKey: { item: "$" },
4862
+ // PLAN-140 W3 (NISO import): the clause/note label of a mapped
4863
+ // source element ([%1], [%ANMERKUNG 1]).
4864
+ mappingKeys: { "xml-niso-iec": { "@el": "label", "@text": "$" } },
4710
4865
  description: "The item for the bit",
4711
4866
  chain: [
4712
4867
  {
@@ -4852,7 +5007,8 @@ var GROUPS = {
4852
5007
  {
4853
5008
  key: ConfigKey.property_size,
4854
5009
  description: "The size of the image",
4855
- format: TagFormat.number
5010
+ format: TagFormat.number,
5011
+ nullable: true
4856
5012
  },
4857
5013
  {
4858
5014
  key: ConfigKey.property_format,
@@ -5668,7 +5824,20 @@ var GROUPS = {
5668
5824
  key: ConfigKey.property_language,
5669
5825
  description: "The language of the book",
5670
5826
  format: TagFormat.plainText,
5671
- maxCount: Count.infinity
5827
+ maxCount: Count.infinity,
5828
+ // PLAN-141 F5 (NISO import): only the PRIMARY (first)
5829
+ // <content-language> survives — the maxEmits cap realises the
5830
+ // catalog's document-language rule (extras drop, R-4).
5831
+ mappingKeys: {
5832
+ "xml-niso-iec": [
5833
+ { predicates: [], maxEmits: 1, rule: { "@el": "content-language", "@text": "$" } }
5834
+ ]
5835
+ }
5836
+ },
5837
+ {
5838
+ key: ConfigKey.property_displayName,
5839
+ description: "The display name of the book",
5840
+ format: TagFormat.plainText
5672
5841
  },
5673
5842
  {
5674
5843
  key: ConfigKey.property_customerExternalId,
@@ -5744,7 +5913,18 @@ var GROUPS = {
5744
5913
  description: "The title of the book",
5745
5914
  maxCount: 2,
5746
5915
  jsonKey: "title|multi(count=2, key=subtitle)",
5747
- exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }]
5916
+ exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
5917
+ // PLAN-141 F5 (NISO import): the PRIMARY (first) <title-wrap>'s
5918
+ // assembled <full> title → [#]; the per-language extras drop (R-4).
5919
+ mappingKeys: {
5920
+ "xml-niso-iec": [
5921
+ {
5922
+ predicates: [],
5923
+ maxEmits: 1,
5924
+ rule: { "@el": "title-wrap", "@children": { "@el": "full", "@text": "$" } }
5925
+ }
5926
+ ]
5927
+ }
5748
5928
  },
5749
5929
  {
5750
5930
  key: ConfigKey.property_subtype,
@@ -5755,6 +5935,7 @@ var GROUPS = {
5755
5935
  key: ConfigKey.property_coverImage,
5756
5936
  description: "The cover image(s) of the book",
5757
5937
  format: TagFormat.plainText,
5938
+ nullable: true,
5758
5939
  maxCount: Count.infinity
5759
5940
  },
5760
5941
  {
@@ -6056,22 +6237,26 @@ var GROUPS = {
6056
6237
  {
6057
6238
  key: ConfigKey.property_platformMargin,
6058
6239
  description: "The platform margin",
6059
- format: TagFormat.number
6240
+ format: TagFormat.number,
6241
+ nullable: true
6060
6242
  },
6061
6243
  {
6062
6244
  key: ConfigKey.property_platformBorderRadius,
6063
6245
  description: "The platform border radius",
6064
- format: TagFormat.number
6246
+ format: TagFormat.number,
6247
+ nullable: true
6065
6248
  },
6066
6249
  {
6067
6250
  key: ConfigKey.property_platformSelectionBorderRadius,
6068
6251
  description: "The platform selection border radius",
6069
- format: TagFormat.number
6252
+ format: TagFormat.number,
6253
+ nullable: true
6070
6254
  },
6071
6255
  {
6072
6256
  key: ConfigKey.property_platformNeedsShadow,
6073
6257
  description: "If true, the platform needs shadow",
6074
- format: TagFormat.boolean
6258
+ format: TagFormat.boolean,
6259
+ nullable: true
6075
6260
  }
6076
6261
  ]
6077
6262
  },
@@ -6082,7 +6267,8 @@ var GROUPS = {
6082
6267
  {
6083
6268
  key: ConfigKey.property_revealSolutions,
6084
6269
  description: "If true, the quiz solutions are revealed",
6085
- format: TagFormat.boolean
6270
+ format: TagFormat.boolean,
6271
+ nullable: true
6086
6272
  // defaultValue: 'false',
6087
6273
  },
6088
6274
  {
@@ -6171,7 +6357,13 @@ var GROUPS = {
6171
6357
  {
6172
6358
  key: ConfigKey.property_caption,
6173
6359
  description: "The caption for the resource",
6174
- format: TagFormat.bitmarkText
6360
+ format: TagFormat.bitmarkText,
6361
+ // PLAN-141 F1 (NISO import): a figure's <caption><title> — the
6362
+ // nested content slot reads the title text; the caption rides the
6363
+ // resource chain ([&image:…][@caption:…], catalog D5).
6364
+ mappingKeys: {
6365
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
6366
+ }
6175
6367
  },
6176
6368
  {
6177
6369
  key: ConfigKey.property_showInIndex,
@@ -6229,12 +6421,14 @@ var GROUPS = {
6229
6421
  {
6230
6422
  key: ConfigKey.property_width,
6231
6423
  description: "The width of the image",
6232
- format: TagFormat.number
6424
+ format: TagFormat.number,
6425
+ nullable: true
6233
6426
  },
6234
6427
  {
6235
6428
  key: ConfigKey.property_height,
6236
6429
  description: "The height of the image",
6237
- format: TagFormat.number
6430
+ format: TagFormat.number,
6431
+ nullable: true
6238
6432
  },
6239
6433
  {
6240
6434
  key: ConfigKey.property_alt,
@@ -6279,12 +6473,14 @@ var GROUPS = {
6279
6473
  {
6280
6474
  key: ConfigKey.property_width,
6281
6475
  description: "The width of the image",
6282
- format: TagFormat.number
6476
+ format: TagFormat.number,
6477
+ nullable: true
6283
6478
  },
6284
6479
  {
6285
6480
  key: ConfigKey.property_height,
6286
6481
  description: "The height of the image",
6287
- format: TagFormat.number
6482
+ format: TagFormat.number,
6483
+ nullable: true
6288
6484
  },
6289
6485
  {
6290
6486
  key: ConfigKey.property_alt,
@@ -6336,12 +6532,14 @@ var GROUPS = {
6336
6532
  {
6337
6533
  key: ConfigKey.property_width,
6338
6534
  description: "The width of the video",
6339
- format: TagFormat.number
6535
+ format: TagFormat.number,
6536
+ nullable: true
6340
6537
  },
6341
6538
  {
6342
6539
  key: ConfigKey.property_height,
6343
6540
  description: "The height of the video",
6344
- format: TagFormat.number
6541
+ format: TagFormat.number,
6542
+ nullable: true
6345
6543
  },
6346
6544
  {
6347
6545
  key: ConfigKey.property_duration,
@@ -6439,6 +6637,10 @@ var GROUPS = {
6439
6637
  {
6440
6638
  key: ConfigKey.resource_image,
6441
6639
  exportJsonKey: { resource: { type: "image", image: { src: "$" } } },
6640
+ // PLAN-141 F1 (NISO import): the image URL rides the `$`-in-attr
6641
+ // value slot — a <graphic xlink:href> child of the mapped bit
6642
+ // element roots the [&image:URL] chain.
6643
+ mappingKeys: { "xml-niso-iec": { "@el": "graphic", "@attr": { "xlink:href": "$" } } },
6442
6644
  description: "The image resource",
6443
6645
  chain: [
6444
6646
  {
@@ -7313,6 +7515,8 @@ var BITS = {
7313
7515
  maxCount: 2,
7314
7516
  jsonKey: "title|multi(count=2, key=subtitle)",
7315
7517
  exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
7518
+ // PLAN-140 W3 (NISO import): the title of a mapped source element.
7519
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } },
7316
7520
  key: ConfigKey.tag_title,
7317
7521
  description: "The title of the article"
7318
7522
  }
@@ -7354,12 +7558,56 @@ var BITS = {
7354
7558
  [BitType2.smartStandardArticleNormative]: {
7355
7559
  since: "1.28.0",
7356
7560
  baseBitType: BitType2.standardArticleNormative,
7357
- description: "Smart standard normative article bit"
7561
+ description: "Smart standard normative article bit",
7562
+ // PLAN-140 W3 (NISO import, tranche 1): one article bit per NISO
7563
+ // paragraph (catalog D1). CONTENT keys (@children): the subtree is the
7564
+ // bit's body; nothing inside it promotes. (Ancestor-context normativity
7565
+ // is the non-normative sibling's @ancestor key — plan Q4, resolved.)
7566
+ //
7567
+ // Second rule (catalog D1 push-down): a NUMBERED-PARAGRAPH sec is an
7568
+ // article, not a chapter — the sec-type literal outranks the chapter
7569
+ // key's plain sec|app rule (most-specific-wins). Content key: the sec's
7570
+ // label rides [%] via the label tag key, its inner <p> is the body, its
7571
+ // id is the bit's customerId, and the anchor slot marks it
7572
+ // anchor-bearing.
7573
+ mappingKeys: {
7574
+ "xml-niso-iec": [
7575
+ { "@el": "p", "@attr": { id: "$customerId" }, "@children": "$" },
7576
+ {
7577
+ "@el": "sec",
7578
+ "@attr": { "sec-type": "numbered-paragraph", id: "$customerId" },
7579
+ "@children": "$",
7580
+ "\u25BC": "$anchor"
7581
+ }
7582
+ ]
7583
+ }
7358
7584
  },
7359
7585
  [BitType2.smartStandardArticleNonNormative]: {
7360
7586
  since: "1.28.0",
7361
7587
  baseBitType: BitType2.standardArticleNonNormative,
7362
- description: "Smart standard non-normative article bit"
7588
+ description: "Smart standard non-normative article bit",
7589
+ // PLAN-140 Q4 (normativity inheritance): a <p> is non-normative because
7590
+ // of an ANCESTOR element — a foreword/intro sec or an informative annex.
7591
+ // @ancestor is a reverse-match-only constraint (forward emission ignores
7592
+ // it); the rules are alternatives, first-satisfied wins, and the
7593
+ // @ancestor literals give this key higher specificity than the plain
7594
+ // normative-article <p> key wherever the context applies.
7595
+ mappingKeys: {
7596
+ "xml-niso-iec": [
7597
+ {
7598
+ "@el": "p",
7599
+ "@attr": { id: "$customerId" },
7600
+ "@ancestor": { "@attr": { "sec-type": "foreword|intro" } },
7601
+ "@children": "$"
7602
+ },
7603
+ {
7604
+ "@el": "p",
7605
+ "@attr": { id: "$customerId" },
7606
+ "@ancestor": { "@attr": { "content-type": "informative" } },
7607
+ "@children": "$"
7608
+ }
7609
+ ]
7610
+ }
7363
7611
  },
7364
7612
  [BitType2.smartStandardArticleNormativeCollapsible]: {
7365
7613
  since: "1.28.0",
@@ -7426,7 +7674,8 @@ var BITS = {
7426
7674
  {
7427
7675
  key: ConfigKey.property_coverImage,
7428
7676
  description: "Cover image of the catalog item",
7429
- format: TagFormat.plainText
7677
+ format: TagFormat.plainText,
7678
+ nullable: true
7430
7679
  },
7431
7680
  {
7432
7681
  key: ConfigKey.resource_coverImage,
@@ -7590,7 +7839,8 @@ var BITS = {
7590
7839
  {
7591
7840
  key: ConfigKey.property_coverImage,
7592
7841
  description: "Cover image of the catalog item",
7593
- format: TagFormat.plainText
7842
+ format: TagFormat.plainText,
7843
+ nullable: true
7594
7844
  },
7595
7845
  {
7596
7846
  key: ConfigKey.resource_coverImage,
@@ -7754,7 +8004,8 @@ var BITS = {
7754
8004
  {
7755
8005
  key: ConfigKey.property_coverImage,
7756
8006
  description: "Cover image of the catalog item",
7757
- format: TagFormat.plainText
8007
+ format: TagFormat.plainText,
8008
+ nullable: true
7758
8009
  },
7759
8010
  {
7760
8011
  key: ConfigKey.property_content2Buy,
@@ -7987,7 +8238,8 @@ var BITS = {
7987
8238
  {
7988
8239
  key: ConfigKey.property_maxCreatedBits,
7989
8240
  description: "The maximum number of bits that can be created from this bit",
7990
- format: TagFormat.number
8241
+ format: TagFormat.number,
8242
+ nullable: true
7991
8243
  }
7992
8244
  ],
7993
8245
  textFormatDefault: TextFormat2.plainText
@@ -8117,6 +8369,13 @@ var BITS = {
8117
8369
  since: "1.3.0",
8118
8370
  baseBitType: BitType2._standard,
8119
8371
  description: "Book bit, used to represent a book",
8372
+ // PLAN-141 F5 (NISO import): the <std-meta> front-matter container is
8373
+ // the [.book] bit (STRUCTURAL, first in document order): primary
8374
+ // title-wrap → [#], primary content-language → [@language], dated
8375
+ // std-ref → [@externalId] (tag keys with maxEmits caps — the NISO
8376
+ // convention puts the document language first). std-meta has no id, so
8377
+ // no anchor/customerId. Remaining leaves drop as recorded loss (R-4).
8378
+ mappingKeys: { "xml-niso-iec": { "@el": "std-meta" } },
8120
8379
  tags: [
8121
8380
  {
8122
8381
  key: ConfigKey.group_bookCommon,
@@ -8403,12 +8662,14 @@ var BITS = {
8403
8662
  {
8404
8663
  key: ConfigKey.property_focusX,
8405
8664
  description: "The X coordinate for focusing the image in the browser",
8406
- format: TagFormat.number
8665
+ format: TagFormat.number,
8666
+ nullable: true
8407
8667
  },
8408
8668
  {
8409
8669
  key: ConfigKey.property_focusY,
8410
8670
  description: "The Y coordinate for focusing the image in the browser",
8411
- format: TagFormat.number
8671
+ format: TagFormat.number,
8672
+ nullable: true
8412
8673
  }
8413
8674
  ]
8414
8675
  },
@@ -8439,6 +8700,15 @@ var BITS = {
8439
8700
  since: "1.3.0",
8440
8701
  baseBitType: BitType2._standard,
8441
8702
  description: "Chapter bit, used to define chapters in books or articles",
8703
+ // PLAN-140 W3 (NISO import, tranche 1): recover a chapter from a NISO
8704
+ // section or annex. STRUCTURAL key (no @children content slot): the
8705
+ // element carries no body of its own — tag children (label/title) map
8706
+ // via tag keys, every mapped descendant promotes to a following sibling
8707
+ // bit, and the chapter level derives from nesting depth (catalog D1).
8708
+ // The source id lands as [@customerId] (two-id model, D2).
8709
+ mappingKeys: {
8710
+ "xml-niso-iec": { "@el": "sec|app", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
8711
+ },
8442
8712
  tags: [
8443
8713
  {
8444
8714
  exportJsonKey: { anchor: "$" },
@@ -8450,7 +8720,10 @@ var BITS = {
8450
8720
  key: ConfigKey.tag_title,
8451
8721
  description: "The title of the chapter",
8452
8722
  jsonKey: "title|setMulti(level)",
8453
- exportJsonKey: { title: "$", level: "$level" }
8723
+ exportJsonKey: { title: "$", level: "$level" },
8724
+ // PLAN-140 W3 (NISO import): the section/annex title; the heading
8725
+ // level rides the normalizer-derived nesting depth (plan Q2).
8726
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
8454
8727
  },
8455
8728
  {
8456
8729
  key: ConfigKey.property_toc,
@@ -8540,12 +8813,14 @@ var BITS = {
8540
8813
  {
8541
8814
  key: ConfigKey.property_quizCountItems,
8542
8815
  description: "The number of items in the cloze quiz",
8543
- format: TagFormat.boolean
8816
+ format: TagFormat.boolean,
8817
+ nullable: true
8544
8818
  },
8545
8819
  {
8546
8820
  key: ConfigKey.property_quizStrikethroughSolutions,
8547
8821
  description: "If the cloze solutions should be strikethrough",
8548
- format: TagFormat.boolean
8822
+ format: TagFormat.boolean,
8823
+ nullable: true
8549
8824
  },
8550
8825
  {
8551
8826
  key: ConfigKey.group_gap,
@@ -8654,11 +8929,28 @@ var BITS = {
8654
8929
  since: "1.3.0",
8655
8930
  baseBitType: BitType2._standard,
8656
8931
  description: "Code bit, used for code snippets in articles or documents",
8932
+ // PLAN-141 F4 (NISO import): a <code> block is a CONTENT bit with a
8933
+ // literal text body; @language recovers as [@computerLanguage] (absent
8934
+ // attr → no tag). Anchor = the source id (D2 revised).
8935
+ mappingKeys: {
8936
+ "xml-niso-iec": {
8937
+ "@el": "code",
8938
+ "@attr": { id: "$customerId", language: "$computerLanguage" },
8939
+ "\u25BC": "$anchor",
8940
+ "@text": "$"
8941
+ }
8942
+ },
8657
8943
  tags: [
8658
8944
  {
8659
8945
  key: ConfigKey.property_computerLanguage,
8660
8946
  description: "The programming language of the code snippet",
8661
- format: TagFormat.plainText
8947
+ format: TagFormat.plainText,
8948
+ // PLAN-141 F4 (NISO import): the bit key's `language` sigil recovers
8949
+ // a present attr; this `@absent` rule supplies the AUTHORED default
8950
+ // when the source carries none (catalog code row — an untyped block
8951
+ // is `[@computerLanguage:text]`). Fires only on foreign imports,
8952
+ // never the carrier round-trip.
8953
+ mappingKeys: { "xml-niso-iec": [{ "@absent": "text" }] }
8662
8954
  },
8663
8955
  {
8664
8956
  key: ConfigKey.property_codeLineNumbers,
@@ -8697,7 +8989,20 @@ var BITS = {
8697
8989
  [BitType2.smartStandardFormulaNormative]: {
8698
8990
  since: "3.11.0",
8699
8991
  baseBitType: BitType2.formula,
8700
- description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative"
8992
+ description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative",
8993
+ // PLAN-141 F4 (NISO import): a <disp-formula> is a CONTENT bit whose
8994
+ // latex-format body carries the <mml:math> subtree VERBATIM (G1 — no
8995
+ // MathML↔LaTeX transform; ids stripped); <label> → [%]; a contained
8996
+ // <legend> PROMOTES as a sibling legend bit (cards cannot nest in a
8997
+ // body). Anchor = the source id (D2 revised).
8998
+ mappingKeys: {
8999
+ "xml-niso-iec": {
9000
+ "@el": "disp-formula",
9001
+ "@attr": { id: "$customerId" },
9002
+ "\u25BC": "$anchor",
9003
+ "@children": "$"
9004
+ }
9005
+ }
8701
9006
  },
8702
9007
  [BitType2.smartStandardRemarkFormula]: {
8703
9008
  since: "3.11.0",
@@ -9224,7 +9529,8 @@ var BITS = {
9224
9529
  {
9225
9530
  key: ConfigKey.property_reasonableNumOfChars,
9226
9531
  description: "The reasonable number of characters for the essay",
9227
- format: TagFormat.number
9532
+ format: TagFormat.number,
9533
+ nullable: true
9228
9534
  },
9229
9535
  {
9230
9536
  key: ConfigKey.property_sampleSolution,
@@ -9657,7 +9963,14 @@ var BITS = {
9657
9963
  [BitType2.smartStandardList]: {
9658
9964
  since: "1.28.0",
9659
9965
  baseBitType: BitType2.standardList,
9660
- description: "Smart standard list bit, used to create smart standard lists in articles or books"
9966
+ description: "Smart standard list bit, used to create smart standard lists in articles or books",
9967
+ // PLAN-140 refs family (NISO import): a reference list is a STRUCTURAL
9968
+ // bit (no @children — it takes a path ordinal anchor and its <ref>
9969
+ // children promote to sibling list-item bits); its <title> rides [#]
9970
+ // via the title tag key.
9971
+ mappingKeys: {
9972
+ "xml-niso-iec": { "@el": "ref-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
9973
+ }
9661
9974
  },
9662
9975
  [BitType2.smartStandardListCollapsible]: {
9663
9976
  since: "1.28.0",
@@ -9702,7 +10015,17 @@ var BITS = {
9702
10015
  [BitType2.smartStandardNoteNonNormative]: {
9703
10016
  since: "1.28.0",
9704
10017
  baseBitType: BitType2.standardNoteNonNormative,
9705
- description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards"
10018
+ description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards",
10019
+ // PLAN-140 W3 (NISO import, tranche 1). CONTENT key (@children): a
10020
+ // note's inner paragraphs are note body, never separate bits.
10021
+ mappingKeys: {
10022
+ "xml-niso-iec": {
10023
+ "@el": "non-normative-note",
10024
+ "@attr": { id: "$customerId" },
10025
+ "@children": "$",
10026
+ "\u25BC": "$anchor"
10027
+ }
10028
+ }
9706
10029
  },
9707
10030
  [BitType2.smartStandardNoteNormativeCollapsible]: {
9708
10031
  since: "1.28.0",
@@ -9809,7 +10132,19 @@ var BITS = {
9809
10132
  [BitType2.smartStandardRemarkNonNormative]: {
9810
10133
  since: "1.28.0",
9811
10134
  baseBitType: BitType2.standardRemarkNonNormative,
9812
- description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards"
10135
+ description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards",
10136
+ // PLAN-140 Q4 rider: a warning/caution note routes to the remark bit —
10137
+ // the same element as the note key, distinguished by the content-type
10138
+ // attr literal (alias value: forward emits the first alternative,
10139
+ // reverse accepts any). Most-specific-wins beats the plain note key.
10140
+ mappingKeys: {
10141
+ "xml-niso-iec": {
10142
+ "@el": "non-normative-note",
10143
+ "@attr": { "content-type": "warning|caution", id: "$customerId" },
10144
+ "@children": "$",
10145
+ "\u25BC": "$anchor"
10146
+ }
10147
+ }
9813
10148
  },
9814
10149
  [BitType2.smartStandardRemarkNormativeCollapsible]: {
9815
10150
  since: "1.28.0",
@@ -10241,6 +10576,12 @@ var BITS = {
10241
10576
  description: "Extractor theme bit, used to store design/theme JSON extracted from documents",
10242
10577
  textFormatDefault: TextFormat2.json
10243
10578
  },
10579
+ [BitType2.extractorReconcile]: {
10580
+ since: "5.35.0",
10581
+ baseBitType: BitType2._standard,
10582
+ description: "Extractor reconcile bit, used to store PDF-compare reconciliation decisions (config and issues) in JSON",
10583
+ textFormatDefault: TextFormat2.json
10584
+ },
10244
10585
  [BitType2.extractorAiChat]: {
10245
10586
  since: "3.19.0",
10246
10587
  baseBitType: BitType2._standard,
@@ -10259,32 +10600,38 @@ var BITS = {
10259
10600
  {
10260
10601
  key: ConfigKey.property_pageNo,
10261
10602
  description: "Page number for the block, used to indicate the page on which the block appears",
10262
- format: TagFormat.number
10603
+ format: TagFormat.number,
10604
+ nullable: true
10263
10605
  },
10264
10606
  {
10265
10607
  key: ConfigKey.property_x,
10266
10608
  description: "X-coordinate for the block, used to position the block on the page",
10267
- format: TagFormat.number
10609
+ format: TagFormat.number,
10610
+ nullable: true
10268
10611
  },
10269
10612
  {
10270
10613
  key: ConfigKey.property_y,
10271
10614
  description: "Y-coordinate for the block, used to position the block on the page",
10272
- format: TagFormat.number
10615
+ format: TagFormat.number,
10616
+ nullable: true
10273
10617
  },
10274
10618
  {
10275
10619
  key: ConfigKey.property_width,
10276
10620
  description: "Width of the block, used to define the size of the block on the page",
10277
- format: TagFormat.number
10621
+ format: TagFormat.number,
10622
+ nullable: true
10278
10623
  },
10279
10624
  {
10280
10625
  key: ConfigKey.property_height,
10281
10626
  description: "Height of the block, used to define the size of the block on the page",
10282
- format: TagFormat.number
10627
+ format: TagFormat.number,
10628
+ nullable: true
10283
10629
  },
10284
10630
  {
10285
10631
  key: ConfigKey.property_index,
10286
10632
  description: "Index of the block, used to order blocks within the extractor page",
10287
- format: TagFormat.number
10633
+ format: TagFormat.number,
10634
+ nullable: true
10288
10635
  },
10289
10636
  {
10290
10637
  key: ConfigKey.property_classification,
@@ -10594,7 +10941,20 @@ var BITS = {
10594
10941
  [BitType2.smartStandardLegendNormative]: {
10595
10942
  since: "3.12.0",
10596
10943
  baseBitType: BitType2.legend,
10597
- description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books"
10944
+ description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books",
10945
+ // PLAN-141 F2 (NISO import): a free-standing <legend> (a formula's) or
10946
+ // bare <def-list> (a table footer's — no <legend> wrapper there) that is
10947
+ // NOT the claimed card content of its enclosing bit is a legend bit:
10948
+ // STRUCTURAL-shaped, its <title> and <def-item>s build the
10949
+ // definition-list cards via the card set's authored keys. A <legend>
10950
+ // inside a figure/table bit stays that bit's claimed card content and
10951
+ // never reaches this key. Anchor = the source id (D2 revised).
10952
+ mappingKeys: {
10953
+ "xml-niso-iec": [
10954
+ { "@el": "legend", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" },
10955
+ { "@el": "def-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
10956
+ ]
10957
+ }
10598
10958
  },
10599
10959
  [BitType2.smartStandardRemarkLegend]: {
10600
10960
  since: "3.12.0",
@@ -10649,7 +11009,16 @@ var BITS = {
10649
11009
  [BitType2.smartStandardDefinitionListNormative]: {
10650
11010
  since: "5.24.0",
10651
11011
  baseBitType: BitType2.standardDefinitionListNormative,
10652
- description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books"
11012
+ description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books",
11013
+ // PLAN-141 F3 (NISO import): a terms-and-definitions clause. STRUCTURAL-
11014
+ // shaped: <label> → [%], the tbx:termEntry/langSet subtree builds the
11015
+ // definition-list card via the card set's authored keys (all tig terms
11016
+ // stacked on the term side; definition/example/notes/source composed on
11017
+ // the definition side with authored locale affixes), langSet @xml:lang →
11018
+ // [@lang] (nested attr slot on the tag key). Anchor = the source id.
11019
+ mappingKeys: {
11020
+ "xml-niso-iec": { "@el": "term-sec", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11021
+ }
10653
11022
  },
10654
11023
  [BitType2.smartStandardDefinitionListNonNormative]: {
10655
11024
  since: "5.24.0",
@@ -10718,12 +11087,14 @@ var BITS = {
10718
11087
  {
10719
11088
  key: ConfigKey.property_focusX,
10720
11089
  description: "X-coordinate for the focus point, used to define the focus area in the image",
10721
- format: TagFormat.number
11090
+ format: TagFormat.number,
11091
+ nullable: true
10722
11092
  },
10723
11093
  {
10724
11094
  key: ConfigKey.property_focusY,
10725
11095
  description: "Y-coordinate for the focus point, used to define the focus area in the image",
10726
- format: TagFormat.number
11096
+ format: TagFormat.number,
11097
+ nullable: true
10727
11098
  }
10728
11099
  ]
10729
11100
  },
@@ -10830,7 +11201,15 @@ var BITS = {
10830
11201
  [BitType2.smartStandardImageFigureNormative]: {
10831
11202
  since: "1.28.0",
10832
11203
  baseBitType: BitType2.standardImageFigureNormative,
10833
- description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books"
11204
+ description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books",
11205
+ // PLAN-141 F1 (NISO import): a figure is STRUCTURAL-shaped (no
11206
+ // @children — no body): <label> → [%], <caption>/<graphic> ride the
11207
+ // [&image] resource chain, the <legend> def-list becomes the bit's
11208
+ // definition-list cards, and an inner note PROMOTES as a sibling bit.
11209
+ // Anchor = the source id (D2 revised).
11210
+ mappingKeys: {
11211
+ "xml-niso-iec": { "@el": "fig", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11212
+ }
10834
11213
  },
10835
11214
  [BitType2.smartStandardImageFigureNonNormative]: {
10836
11215
  since: "1.28.0",
@@ -11558,7 +11937,19 @@ var BITS = {
11558
11937
  [BitType2.smartStandardListItem]: {
11559
11938
  since: "1.28.0",
11560
11939
  baseBitType: BitType2.standardListItem,
11561
- description: "Smart standard list item bit, used to create smart standard list items in articles or books"
11940
+ description: "Smart standard list item bit, used to create smart standard list items in articles or books",
11941
+ // PLAN-140 refs family (NISO import): one list-item bit per <ref> —
11942
+ // CONTENT key (its citation subtree is the body), counter anchor scoped
11943
+ // to the containing list, <label> → [%], nested <std-id> → [@externalId]
11944
+ // (the externalId tag key's nested content slot).
11945
+ mappingKeys: {
11946
+ "xml-niso-iec": {
11947
+ "@el": "ref",
11948
+ "@attr": { id: "$customerId" },
11949
+ "@children": "$",
11950
+ "\u25BC": "$anchor"
11951
+ }
11952
+ }
11562
11953
  },
11563
11954
  [BitType2.smartStandardListItemCollapsible]: {
11564
11955
  since: "1.28.0",
@@ -12027,7 +12418,8 @@ var BITS = {
12027
12418
  {
12028
12419
  key: ConfigKey.property_product,
12029
12420
  description: "Product reference for the product page, used to link to the product",
12030
- format: TagFormat.plainText
12421
+ format: TagFormat.plainText,
12422
+ nullable: true
12031
12423
  }
12032
12424
  ]
12033
12425
  },
@@ -12046,6 +12438,7 @@ var BITS = {
12046
12438
  key: ConfigKey.property_product,
12047
12439
  description: "Product reference for the product list, used to link to the product",
12048
12440
  format: TagFormat.plainText,
12441
+ nullable: true,
12049
12442
  maxCount: Count.infinity
12050
12443
  }
12051
12444
  // {
@@ -12607,7 +13000,8 @@ var BITS = {
12607
13000
  {
12608
13001
  key: ConfigKey.property_ratingLevelSelected,
12609
13002
  description: "Selected level for the rating survey, used to define the default rating",
12610
- format: TagFormat.number
13003
+ format: TagFormat.number,
13004
+ nullable: true
12611
13005
  },
12612
13006
  {
12613
13007
  key: ConfigKey.property_buttonCaption,
@@ -12662,7 +13056,13 @@ var BITS = {
12662
13056
  // `<caption>` — placed inside the idiomatic `<table>` container as
12663
13057
  // its first child. Outside a table context it falls back to the
12664
13058
  // residual carrier.
12665
- htmlKey: { "@el": "caption", "@children": "$" }
13059
+ htmlKey: { "@el": "caption", "@children": "$" },
13060
+ // PLAN-141 F2 (NISO import): a table-wrap's <caption><title> — the
13061
+ // nested content slot reads the title text (catalog D5: the caption
13062
+ // is a TOP-LEVEL bit property on table bits).
13063
+ mappingKeys: {
13064
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
13065
+ }
12666
13066
  },
12667
13067
  {
12668
13068
  key: ConfigKey.property_tableFixedHeader,
@@ -12835,7 +13235,16 @@ var BITS = {
12835
13235
  [BitType2.smartStandardTableExtendedNormative]: {
12836
13236
  since: "1.28.0",
12837
13237
  baseBitType: BitType2.standardTableExtendedNormative,
12838
- description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books"
13238
+ description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books",
13239
+ // PLAN-141 F2 (NISO import): a table-wrap is STRUCTURAL-shaped (no
13240
+ // @children — no body): <label> → [%], <caption><title> → the bit-level
13241
+ // [@caption] (D5), the inner <table>/<table-wrap-foot> build the
13242
+ // table-extended card grid via the card set's authored keys, and a
13243
+ // footer <def-list> PROMOTES as a sibling legend bit. Anchor = the
13244
+ // source id (D2 revised).
13245
+ mappingKeys: {
13246
+ "xml-niso-iec": { "@el": "table-wrap", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
13247
+ }
12839
13248
  },
12840
13249
  [BitType2.smartStandardTableExtendedNonNormative]: {
12841
13250
  since: "1.28.0",
@@ -12910,7 +13319,8 @@ var BITS = {
12910
13319
  {
12911
13320
  key: ConfigKey.property_maxDisplayLevel,
12912
13321
  description: "Maximum display level for the chapter in the table of contents",
12913
- format: TagFormat.number
13322
+ format: TagFormat.number,
13323
+ nullable: true
12914
13324
  }
12915
13325
  ]
12916
13326
  },
@@ -12922,7 +13332,8 @@ var BITS = {
12922
13332
  {
12923
13333
  key: ConfigKey.property_maxTocChapterLevel,
12924
13334
  description: "Maximum chapter level for the inline table of contents",
12925
- format: TagFormat.number
13335
+ format: TagFormat.number,
13336
+ nullable: true
12926
13337
  }
12927
13338
  ]
12928
13339
  },
@@ -13345,13 +13756,15 @@ var BITS = {
13345
13756
  key: ConfigKey.property_width,
13346
13757
  // Same as image
13347
13758
  description: "Width for the embedded content, used to define the width in pixels",
13348
- format: TagFormat.number
13759
+ format: TagFormat.number,
13760
+ nullable: true
13349
13761
  },
13350
13762
  {
13351
13763
  key: ConfigKey.property_height,
13352
13764
  // Same as image
13353
13765
  description: "Height for the embedded content, used to define the height in pixels",
13354
- format: TagFormat.number
13766
+ format: TagFormat.number,
13767
+ nullable: true
13355
13768
  },
13356
13769
  {
13357
13770
  key: ConfigKey.property_vendorUrl,
@@ -13389,7 +13802,8 @@ var BITS = {
13389
13802
  {
13390
13803
  key: ConfigKey.property_jupyterExecutionCount,
13391
13804
  description: "Execution count for the Jupyter output, used to define the execution order",
13392
- format: TagFormat.number
13805
+ format: TagFormat.number,
13806
+ nullable: true
13393
13807
  }
13394
13808
  ],
13395
13809
  textFormatDefault: TextFormat2.plainText
@@ -13939,7 +14353,7 @@ var instance2 = new Config();
13939
14353
  // src/generated/package_info.ts
13940
14354
  var PACKAGE_INFO = {
13941
14355
  "name": "@gmb/bitmark-parser-generator",
13942
- "version": "5.34.0",
14356
+ "version": "5.36.0",
13943
14357
  "author": "Get More Brain Ltd",
13944
14358
  "license": "ISC",
13945
14359
  "description": "A bitmark parser and generator using Peggy.js"
@@ -14468,6 +14882,8 @@ var NodeType = {
14468
14882
  definition: "definition",
14469
14883
  definitions: "definitions",
14470
14884
  definitionsValue: "definitionsValue",
14885
+ displayName: "displayName",
14886
+ displayNameValue: "displayNameValue",
14471
14887
  diffContext: "diffContext",
14472
14888
  diffContextValue: "diffContextValue",
14473
14889
  diffOp: "diffOp",
@@ -14864,6 +15280,8 @@ var NodeType = {
14864
15280
  reviewTagValue: "reviewTagValue",
14865
15281
  reviewerTag: "reviewerTag",
14866
15282
  reviewerTagValue: "reviewerTagValue",
15283
+ rightsPolicy: "rightsPolicy",
15284
+ rightsPolicyValue: "rightsPolicyValue",
14867
15285
  root: "root",
14868
15286
  // bit type (root)
14869
15287
  rows: "rows",
@@ -28233,6 +28651,14 @@ var Builder = class extends BaseBuilder {
28233
28651
  data.jupyterExecutionCount,
28234
28652
  options
28235
28653
  ),
28654
+ copyright: this.toAstProperty(bitType, ConfigKey.property_copyright, data.copyright, options),
28655
+ license: this.toAstProperty(bitType, ConfigKey.property_license, data.license, options),
28656
+ rightsPolicy: this.toAstProperty(
28657
+ bitType,
28658
+ ConfigKey.property_rightsPolicy,
28659
+ data.rightsPolicy,
28660
+ options
28661
+ ),
28236
28662
  sourceRL: this.toAstProperty(bitType, ConfigKey.property_sourceRL, data.sourceRL, options),
28237
28663
  isPublic: this.toAstProperty(bitType, ConfigKey.property_isPublic, data.isPublic, options),
28238
28664
  isTemplate: this.toAstProperty(
@@ -28380,6 +28806,12 @@ var Builder = class extends BaseBuilder {
28380
28806
  data.publisherName,
28381
28807
  options
28382
28808
  ),
28809
+ displayName: this.toAstProperty(
28810
+ bitType,
28811
+ ConfigKey.property_displayName,
28812
+ data.displayName,
28813
+ options
28814
+ ),
28383
28815
  theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),
28384
28816
  rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),
28385
28817
  computerLanguage: this.toAstProperty(