@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.
@@ -318,6 +318,7 @@ var BitType2 = {
318
318
  extractorPageNumberCollapsible: "extractor-page-number-collapsible",
319
319
  extractorPageWithBlocks: "extractor-page-with-blocks",
320
320
  extractorPageWithBlocksCollapsible: "extractor-page-with-blocks-collapsible",
321
+ extractorReconcile: "extractor-reconcile",
321
322
  extractorRepeatedText: "extractor-repeated-text",
322
323
  extractorRule: "extractor-rule",
323
324
  extractorTheme: "extractor-theme",
@@ -1401,6 +1402,7 @@ var propertyKeys = {
1401
1402
  property_dateEnd: "@dateEnd",
1402
1403
  property_decimalPlaces: "@decimalPlaces",
1403
1404
  property_deeplink: "@deeplink",
1405
+ property_displayName: "@displayName",
1404
1406
  property_diffContext: "@diffContext",
1405
1407
  property_diffOp: "@diffOp",
1406
1408
  property_diffRef: "@diffRef",
@@ -1556,6 +1558,7 @@ var propertyKeys = {
1556
1558
  property_revealSolutions: "@revealSolutions",
1557
1559
  property_reviewTag: "@reviewTag",
1558
1560
  property_reviewerTag: "@reviewerTag",
1561
+ property_rightsPolicy: "@rightsPolicy",
1559
1562
  property_sampleSolution: "@sampleSolution",
1560
1563
  property_scormSource: "@scormSource",
1561
1564
  property_search: "@search",
@@ -2549,9 +2552,30 @@ var CARDSETS = {
2549
2552
  [CardSetConfigKey.definitionList]: {
2550
2553
  jsonKey: "definitions",
2551
2554
  exportJsonKey: { definitions: "$" },
2555
+ // PLAN-141 F1 (NISO import): each <def-item> is one card; the sides
2556
+ // read <term>/<def>; the enclosing <legend>'s <title> lands on the
2557
+ // term side's heading tag ([#Key] header card).
2558
+ // PLAN-141 F3: a <tbx:langSet> is ALSO one card (a terminology entry —
2559
+ // its enclosing <tbx:termEntry> is a transparent claim wrapper); its
2560
+ // children compose the term/definition sides via the side rules below.
2561
+ mappingKeys: {
2562
+ "xml-niso-iec": [
2563
+ { "@el": "def-item", "@children": "$" },
2564
+ { "@el": "tbx:langSet", "@children": "$" }
2565
+ ]
2566
+ },
2552
2567
  sides: [
2553
2568
  {
2554
2569
  name: "term",
2570
+ // F3: every <tbx:tig>'s <tbx:term> STACKS one-per-line onto the
2571
+ // single term side (the "$\n" template's authored separator; the
2572
+ // trailing one is trimmed) — the PDF's Maus/Mus/M/Müsli stack.
2573
+ mappingKeys: {
2574
+ "xml-niso-iec": [
2575
+ { "@el": "term", "@text": "$" },
2576
+ { "@el": "tbx:tig", "@children": { "@el": "tbx:term", "@text": "$\n" } }
2577
+ ]
2578
+ },
2555
2579
  variants: [
2556
2580
  {
2557
2581
  jsonKey: "term.text",
@@ -2565,8 +2589,10 @@ var CARDSETS = {
2565
2589
  key: ConfigKey.tag_title,
2566
2590
  description: "Title of the definition.",
2567
2591
  format: TagFormat.plainText,
2592
+ nullable: true,
2568
2593
  jsonKey: "^heading.forKeys",
2569
- exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2594
+ exportJsonKey: { "@bit": { heading: { forKeys: "$" } } },
2595
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
2570
2596
  },
2571
2597
  {
2572
2598
  key: ConfigKey.group_resourceIcon,
@@ -2592,6 +2618,24 @@ var CARDSETS = {
2592
2618
  },
2593
2619
  {
2594
2620
  name: "definition",
2621
+ // F3: the definition side COMPOSES from the entry's fields in
2622
+ // document order, with the ES-rendered locale affixes AUTHORED as
2623
+ // value-position templates (never engine text): the subject field
2624
+ // in ⟨⟩ glues (trailing space) onto the definition line; example /
2625
+ // notes / source follow as blank-line-separated lines. The TBX
2626
+ // grammar flags (normativeAuthorization, termType, partOfSpeech,
2627
+ // grammaticalNumber) are unrendered machine-only data — dropped and
2628
+ // recorded (catalog R-2, reviewed under D7 max-preservation).
2629
+ mappingKeys: {
2630
+ "xml-niso-iec": [
2631
+ { "@el": "def", "@children": "$" },
2632
+ { "@el": "tbx:subjectField", "@text": "\u27E8$\u27E9 " },
2633
+ { "@el": "tbx:definition", "@children": "$" },
2634
+ { "@el": "tbx:example", "@children": "BEISPIEL $" },
2635
+ { "@el": "tbx:note", "@children": "Anmerkung zu Begriff: $" },
2636
+ { "@el": "tbx:source", "@text": "[QUELLE: $]" }
2637
+ ]
2638
+ },
2595
2639
  variants: [
2596
2640
  {
2597
2641
  jsonKey: "definition.text",
@@ -2605,6 +2649,7 @@ var CARDSETS = {
2605
2649
  key: ConfigKey.tag_title,
2606
2650
  description: "Title of the definition.",
2607
2651
  format: TagFormat.plainText,
2652
+ nullable: true,
2608
2653
  jsonKey: "^heading.forValues",
2609
2654
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2610
2655
  },
@@ -2683,6 +2728,7 @@ var CARDSETS = {
2683
2728
  key: ConfigKey.tag_title,
2684
2729
  description: "Title of the definition.",
2685
2730
  format: TagFormat.plainText,
2731
+ nullable: true,
2686
2732
  jsonKey: "^heading.forKeys",
2687
2733
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2688
2734
  },
@@ -2724,6 +2770,7 @@ var CARDSETS = {
2724
2770
  key: ConfigKey.tag_title,
2725
2771
  description: "Title of the definition.",
2726
2772
  format: TagFormat.plainText,
2773
+ nullable: true,
2727
2774
  jsonKey: "^heading.forValues",
2728
2775
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2729
2776
  },
@@ -2837,6 +2884,7 @@ var CARDSETS = {
2837
2884
  key: ConfigKey.tag_title,
2838
2885
  description: "Title of the match pair.",
2839
2886
  format: TagFormat.plainText,
2887
+ nullable: true,
2840
2888
  jsonKey: "^heading.forKeys",
2841
2889
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2842
2890
  },
@@ -2966,6 +3014,7 @@ var CARDSETS = {
2966
3014
  key: ConfigKey.tag_title,
2967
3015
  description: "Title of the match pair.",
2968
3016
  format: TagFormat.plainText,
3017
+ nullable: true,
2969
3018
  jsonKey: "^heading.forValues",
2970
3019
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
2971
3020
  },
@@ -3012,6 +3061,7 @@ var CARDSETS = {
3012
3061
  key: ConfigKey.tag_title,
3013
3062
  description: "Title of the audio match pair.",
3014
3063
  format: TagFormat.plainText,
3064
+ nullable: true,
3015
3065
  jsonKey: "^heading.forKeys",
3016
3066
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3017
3067
  },
@@ -3043,6 +3093,7 @@ var CARDSETS = {
3043
3093
  key: ConfigKey.tag_title,
3044
3094
  description: "Title of the audio match pair.",
3045
3095
  format: TagFormat.plainText,
3096
+ nullable: true,
3046
3097
  jsonKey: "^heading.forValues",
3047
3098
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
3048
3099
  },
@@ -3080,6 +3131,7 @@ var CARDSETS = {
3080
3131
  key: ConfigKey.tag_title,
3081
3132
  description: "Title of the image match pair.",
3082
3133
  format: TagFormat.plainText,
3134
+ nullable: true,
3083
3135
  jsonKey: "^heading.forKeys",
3084
3136
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3085
3137
  },
@@ -3111,6 +3163,7 @@ var CARDSETS = {
3111
3163
  key: ConfigKey.tag_title,
3112
3164
  description: "Title of the image match pair.",
3113
3165
  format: TagFormat.plainText,
3166
+ nullable: true,
3114
3167
  jsonKey: "^heading.forValues",
3115
3168
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
3116
3169
  },
@@ -3186,6 +3239,7 @@ var CARDSETS = {
3186
3239
  key: ConfigKey.tag_title,
3187
3240
  description: "Title of the match matrix.",
3188
3241
  format: TagFormat.plainText,
3242
+ nullable: true,
3189
3243
  jsonKey: "^heading.forKeys",
3190
3244
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3191
3245
  },
@@ -3298,6 +3352,7 @@ var CARDSETS = {
3298
3352
  key: ConfigKey.tag_title,
3299
3353
  description: "Title of the match matrix.",
3300
3354
  format: TagFormat.plainText,
3355
+ nullable: true,
3301
3356
  jsonKey: "^heading.forValues",
3302
3357
  exportJsonKey: [
3303
3358
  { "@keyonly": { "@bit": { heading: { forValues: [""] } } } },
@@ -3580,6 +3635,7 @@ var CARDSETS = {
3580
3635
  key: ConfigKey.tag_title,
3581
3636
  description: "Title of the feedback.",
3582
3637
  format: TagFormat.plainText,
3638
+ nullable: true,
3583
3639
  jsonKey: "^heading.forKeys",
3584
3640
  exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
3585
3641
  }
@@ -3662,6 +3718,7 @@ var CARDSETS = {
3662
3718
  key: ConfigKey.tag_title,
3663
3719
  description: "Title of the feedback.",
3664
3720
  format: TagFormat.plainText,
3721
+ nullable: true,
3665
3722
  jsonKey: "^heading.forValues",
3666
3723
  exportJsonKey: { "@bit": { heading: { forValues: "$" } } }
3667
3724
  }
@@ -3969,6 +4026,11 @@ var CARDSETS = {
3969
4026
  { table: { header: { rows: ["$"] } } }
3970
4027
  ],
3971
4028
  htmlKey: { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } },
4029
+ // PLAN-141 F2 (NISO import): the XHTML table model NISO uses — a
4030
+ // <thead> SECTION whose <tr> rows are the header cards.
4031
+ mappingKeys: {
4032
+ "xml-niso-iec": { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } }
4033
+ },
3972
4034
  sideJsonKey: "cells[{s}]|set(title=true)",
3973
4035
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3974
4036
  // Header cells are `<th>`. The `width` attribute is contributed by the
@@ -3980,12 +4042,21 @@ var CARDSETS = {
3980
4042
  jsonKey: "table.body.rows",
3981
4043
  exportJsonKey: { table: { body: { rows: "$" } } },
3982
4044
  htmlKey: { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } },
4045
+ // PLAN-141 F2 (NISO import): <tbody> rows are the (default) data cards.
4046
+ mappingKeys: {
4047
+ "xml-niso-iec": { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } }
4048
+ },
3983
4049
  isDefault: true
3984
4050
  },
3985
4051
  "table-footer": {
3986
4052
  jsonKey: "table.footer.rows",
3987
4053
  exportJsonKey: { table: { footer: { rows: "$" } } },
3988
4054
  htmlKey: { "@el": "tfoot", "@children": { "@el": "tr", "@children": "$" } },
4055
+ // PLAN-141 F2 (NISO import): NISO has no <tfoot> — the footer card's
4056
+ // source is the <table-wrap-foot> block (CONTENT-shaped: no rows; its
4057
+ // prose/notes flatten into one footer card — catalog table-wrap-foot
4058
+ // row; a contained <def-list> promotes as a sibling legend bit).
4059
+ mappingKeys: { "xml-niso-iec": { "@el": "table-wrap-foot", "@children": "$" } },
3989
4060
  sideJsonKey: "cells[{s}]|set(title=true)",
3990
4061
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3991
4062
  // Footer cells render as `<th>` (mirrors the header `title: true`
@@ -4002,6 +4073,8 @@ var CARDSETS = {
4002
4073
  // Default (body) cell → `<td>`; the header/footer sections override the
4003
4074
  // side to `<th>` via their sideHtmlKey (HTML.md §8).
4004
4075
  htmlKey: { "@el": "td", "@children": "$" },
4076
+ // PLAN-141 F2 (NISO import): a <td> row child is a body cell side.
4077
+ mappingKeys: { "xml-niso-iec": { "@el": "td", "@children": "$" } },
4005
4078
  variants: [
4006
4079
  {
4007
4080
  jsonKey: "content",
@@ -4019,7 +4092,11 @@ var CARDSETS = {
4019
4092
  // cell with `title: true` automatically.
4020
4093
  jsonKey: "content",
4021
4094
  exportJsonKey: { content: "$" },
4022
- description: "Title text of the table cell (header rows)."
4095
+ description: "Title text of the table cell (header rows).",
4096
+ // PLAN-141 F2 (NISO import): a <th> row child is a TITLE cell —
4097
+ // its content lands in the `[#…]` tag (an empty <th> keeps its
4098
+ // slot as a bare `[#]`).
4099
+ mappingKeys: { "xml-niso-iec": { "@el": "th", "@children": "$" } }
4023
4100
  },
4024
4101
  {
4025
4102
  key: ConfigKey.property_tableCellType,
@@ -4038,6 +4115,9 @@ var CARDSETS = {
4038
4115
  // HTML-C2: contribute a `rowspan` attribute onto the enclosing
4039
4116
  // cell element (`<th>`/`<td>`).
4040
4117
  htmlKey: { "@el": { "@attr": { rowspan: "$" } } },
4118
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4119
+ // `rowspan` attribute (element-scope attr form).
4120
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { rowspan: "$" } } } },
4041
4121
  description: "Number of rows the cell spans.",
4042
4122
  format: TagFormat.number
4043
4123
  },
@@ -4048,6 +4128,9 @@ var CARDSETS = {
4048
4128
  // HTML-C2: contribute a `colspan` attribute onto the enclosing
4049
4129
  // cell element (`<th>`/`<td>`).
4050
4130
  htmlKey: { "@el": { "@attr": { colspan: "$" } } },
4131
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4132
+ // `colspan` attribute (element-scope attr form).
4133
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { colspan: "$" } } } },
4051
4134
  description: "Number of columns the cell spans.",
4052
4135
  format: TagFormat.number
4053
4136
  },
@@ -4069,6 +4152,13 @@ var CARDSETS = {
4069
4152
  // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the
4070
4153
  // enclosing cell element (`<th>`/`<td>`).
4071
4154
  htmlKey: { "@el": { "@attr": { width: "$" } } },
4155
+ // PLAN-141 F2 (NISO import): NISO carries widths as PER-COLUMN
4156
+ // <col width="…"> descriptors at container level, not on cells.
4157
+ // The matched values distribute positionally onto the first
4158
+ // (header) card's sides. Number format ⇒ only an integral
4159
+ // percentage survives ("20.0000%" → 20); a fractional one
4160
+ // (renderer-equalised "4.7619%") is dropped — catalog `col` row.
4161
+ mappingKeys: { "xml-niso-iec": { "@el": "col", "@attr": { width: "$" } } },
4072
4162
  description: "Width for the column.",
4073
4163
  format: TagFormat.number
4074
4164
  }
@@ -4442,13 +4532,44 @@ var GROUPS = {
4442
4532
  key: ConfigKey.property_externalId,
4443
4533
  description: "The external identifier for the bit",
4444
4534
  format: TagFormat.plainText,
4445
- maxCount: Count.infinity
4535
+ maxCount: Count.infinity,
4536
+ // PLAN-140 refs family (NISO import): the machine identifier of a
4537
+ // referenced standard. NESTED content slot — the tag reads (and
4538
+ // consumes) ONLY the <std-id> inside a <std> child; the remaining
4539
+ // designation/title text stays bit body. A <std> without <std-id>
4540
+ // does not fire the key.
4541
+ // PLAN-141 F5: on the [.book] bit, the DATED <std-ref> designation
4542
+ // is the document's external id. Safe rule order: <std-ref> is a
4543
+ // direct bit-element child only under <std-meta> (everywhere else
4544
+ // it nests inside <std>, which the tag spine never reaches).
4545
+ mappingKeys: {
4546
+ "xml-niso-iec": [
4547
+ { "@el": "std", "@children": { "@el": "std-id", "@text": "$" } },
4548
+ { "@el": "std-ref", "@attr": { type: "dated" }, "@text": "$" }
4549
+ ]
4550
+ }
4446
4551
  },
4447
4552
  {
4448
4553
  key: ConfigKey.property_sourceRL,
4449
4554
  description: "The original location of the information in the original source material",
4450
4555
  format: TagFormat.plainText
4451
4556
  },
4557
+ {
4558
+ key: ConfigKey.property_copyright,
4559
+ description: "The copyright information for the bit",
4560
+ format: TagFormat.plainText
4561
+ },
4562
+ {
4563
+ key: ConfigKey.property_license,
4564
+ description: "The license for the bit",
4565
+ format: TagFormat.plainText
4566
+ },
4567
+ {
4568
+ key: ConfigKey.property_rightsPolicy,
4569
+ description: "The rights policy or policies for the bit",
4570
+ format: TagFormat.plainText,
4571
+ maxCount: Count.infinity
4572
+ },
4452
4573
  {
4453
4574
  key: ConfigKey.property_isTemplate,
4454
4575
  description: "If true, the bit is a template",
@@ -4475,7 +4596,8 @@ var GROUPS = {
4475
4596
  {
4476
4597
  key: ConfigKey.property_aiGenerated,
4477
4598
  description: "If true, the bit is AI-generated",
4478
- format: TagFormat.boolean
4599
+ format: TagFormat.boolean,
4600
+ nullable: true
4479
4601
  },
4480
4602
  {
4481
4603
  key: ConfigKey.property_machineTranslated,
@@ -4490,7 +4612,8 @@ var GROUPS = {
4490
4612
  {
4491
4613
  key: ConfigKey.property_spansPageBreak,
4492
4614
  description: "If true, the bit spans a page break",
4493
- format: TagFormat.boolean
4615
+ format: TagFormat.boolean,
4616
+ nullable: true
4494
4617
  },
4495
4618
  {
4496
4619
  key: ConfigKey.property_searchIndex,
@@ -4565,7 +4688,8 @@ var GROUPS = {
4565
4688
  {
4566
4689
  key: ConfigKey.property_diffTime,
4567
4690
  description: "The diff time for the bit",
4568
- format: TagFormat.number
4691
+ format: TagFormat.number,
4692
+ nullable: true
4569
4693
  },
4570
4694
  {
4571
4695
  key: ConfigKey.property_ageRange,
@@ -4576,7 +4700,18 @@ var GROUPS = {
4576
4700
  {
4577
4701
  key: ConfigKey.property_lang,
4578
4702
  description: "The language for the bit",
4579
- format: TagFormat.plainText
4703
+ format: TagFormat.plainText,
4704
+ // PLAN-141 F3 (NISO import): a term-sec's language rides
4705
+ // <tbx:termEntry><tbx:langSet xml:lang> — a nested content slot
4706
+ // whose leaf is a $-in-ATTR-position slot (the nested counterpart
4707
+ // of the value-attr slot). Only termEntry elements match, so the
4708
+ // shared tag is inert everywhere else.
4709
+ mappingKeys: {
4710
+ "xml-niso-iec": {
4711
+ "@el": "tbx:termEntry",
4712
+ "@children": { "@el": "tbx:langSet", "@attr": { "xml:lang": "$" } }
4713
+ }
4714
+ }
4580
4715
  },
4581
4716
  {
4582
4717
  key: ConfigKey.property_publisher,
@@ -4593,6 +4728,7 @@ var GROUPS = {
4593
4728
  key: ConfigKey.property_theme,
4594
4729
  description: "The theme(s) for the bit",
4595
4730
  format: TagFormat.plainText,
4731
+ nullable: true,
4596
4732
  maxCount: Count.infinity
4597
4733
  },
4598
4734
  {
@@ -4611,6 +4747,7 @@ var GROUPS = {
4611
4747
  key: ConfigKey.property_tag,
4612
4748
  description: "The tag(s) for the bit",
4613
4749
  format: TagFormat.plainText,
4750
+ nullable: true,
4614
4751
  maxCount: Count.infinity
4615
4752
  },
4616
4753
  {
@@ -4630,6 +4767,7 @@ var GROUPS = {
4630
4767
  exportJsonKey: { tags: ["$"] },
4631
4768
  description: "The tag(s) for the group",
4632
4769
  format: TagFormat.plainText,
4770
+ nullable: true,
4633
4771
  maxCount: Count.infinity
4634
4772
  }
4635
4773
  ]
@@ -4747,6 +4885,20 @@ var GROUPS = {
4747
4885
  description: "The layer role(s) for the bit",
4748
4886
  format: TagFormat.plainText,
4749
4887
  maxCount: Count.infinity
4888
+ },
4889
+ {
4890
+ // Universal @internalComment — declares in config what Config.ts also
4891
+ // injects programmatically into every bit (its push runs last and wins
4892
+ // the keyed merge, so runtime behaviour is unchanged). Declared here so
4893
+ // the config export (ConfigBuilder → assets/config → configurator →
4894
+ // bitmark.json) carries the tag for downstream parsers. Empty
4895
+ // exportJsonKey: consumed but never emitted to the bit JSON (the value
4896
+ // is routed to parser.internalComments).
4897
+ key: ConfigKey.property_internalComment,
4898
+ description: "Internal comment for the bit.",
4899
+ format: TagFormat.plainText,
4900
+ maxCount: Count.infinity,
4901
+ exportJsonKey: {}
4750
4902
  }
4751
4903
  ]
4752
4904
  },
@@ -4758,6 +4910,9 @@ var GROUPS = {
4758
4910
  key: ConfigKey.tag_item,
4759
4911
  jsonKey: "item",
4760
4912
  exportJsonKey: { item: "$" },
4913
+ // PLAN-140 W3 (NISO import): the clause/note label of a mapped
4914
+ // source element ([%1], [%ANMERKUNG 1]).
4915
+ mappingKeys: { "xml-niso-iec": { "@el": "label", "@text": "$" } },
4761
4916
  description: "The item for the bit",
4762
4917
  chain: [
4763
4918
  {
@@ -4903,7 +5058,8 @@ var GROUPS = {
4903
5058
  {
4904
5059
  key: ConfigKey.property_size,
4905
5060
  description: "The size of the image",
4906
- format: TagFormat.number
5061
+ format: TagFormat.number,
5062
+ nullable: true
4907
5063
  },
4908
5064
  {
4909
5065
  key: ConfigKey.property_format,
@@ -5719,7 +5875,20 @@ var GROUPS = {
5719
5875
  key: ConfigKey.property_language,
5720
5876
  description: "The language of the book",
5721
5877
  format: TagFormat.plainText,
5722
- maxCount: Count.infinity
5878
+ maxCount: Count.infinity,
5879
+ // PLAN-141 F5 (NISO import): only the PRIMARY (first)
5880
+ // <content-language> survives — the maxEmits cap realises the
5881
+ // catalog's document-language rule (extras drop, R-4).
5882
+ mappingKeys: {
5883
+ "xml-niso-iec": [
5884
+ { predicates: [], maxEmits: 1, rule: { "@el": "content-language", "@text": "$" } }
5885
+ ]
5886
+ }
5887
+ },
5888
+ {
5889
+ key: ConfigKey.property_displayName,
5890
+ description: "The display name of the book",
5891
+ format: TagFormat.plainText
5723
5892
  },
5724
5893
  {
5725
5894
  key: ConfigKey.property_customerExternalId,
@@ -5795,7 +5964,18 @@ var GROUPS = {
5795
5964
  description: "The title of the book",
5796
5965
  maxCount: 2,
5797
5966
  jsonKey: "title|multi(count=2, key=subtitle)",
5798
- exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }]
5967
+ exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
5968
+ // PLAN-141 F5 (NISO import): the PRIMARY (first) <title-wrap>'s
5969
+ // assembled <full> title → [#]; the per-language extras drop (R-4).
5970
+ mappingKeys: {
5971
+ "xml-niso-iec": [
5972
+ {
5973
+ predicates: [],
5974
+ maxEmits: 1,
5975
+ rule: { "@el": "title-wrap", "@children": { "@el": "full", "@text": "$" } }
5976
+ }
5977
+ ]
5978
+ }
5799
5979
  },
5800
5980
  {
5801
5981
  key: ConfigKey.property_subtype,
@@ -5806,6 +5986,7 @@ var GROUPS = {
5806
5986
  key: ConfigKey.property_coverImage,
5807
5987
  description: "The cover image(s) of the book",
5808
5988
  format: TagFormat.plainText,
5989
+ nullable: true,
5809
5990
  maxCount: Count.infinity
5810
5991
  },
5811
5992
  {
@@ -6107,22 +6288,26 @@ var GROUPS = {
6107
6288
  {
6108
6289
  key: ConfigKey.property_platformMargin,
6109
6290
  description: "The platform margin",
6110
- format: TagFormat.number
6291
+ format: TagFormat.number,
6292
+ nullable: true
6111
6293
  },
6112
6294
  {
6113
6295
  key: ConfigKey.property_platformBorderRadius,
6114
6296
  description: "The platform border radius",
6115
- format: TagFormat.number
6297
+ format: TagFormat.number,
6298
+ nullable: true
6116
6299
  },
6117
6300
  {
6118
6301
  key: ConfigKey.property_platformSelectionBorderRadius,
6119
6302
  description: "The platform selection border radius",
6120
- format: TagFormat.number
6303
+ format: TagFormat.number,
6304
+ nullable: true
6121
6305
  },
6122
6306
  {
6123
6307
  key: ConfigKey.property_platformNeedsShadow,
6124
6308
  description: "If true, the platform needs shadow",
6125
- format: TagFormat.boolean
6309
+ format: TagFormat.boolean,
6310
+ nullable: true
6126
6311
  }
6127
6312
  ]
6128
6313
  },
@@ -6133,7 +6318,8 @@ var GROUPS = {
6133
6318
  {
6134
6319
  key: ConfigKey.property_revealSolutions,
6135
6320
  description: "If true, the quiz solutions are revealed",
6136
- format: TagFormat.boolean
6321
+ format: TagFormat.boolean,
6322
+ nullable: true
6137
6323
  // defaultValue: 'false',
6138
6324
  },
6139
6325
  {
@@ -6222,7 +6408,13 @@ var GROUPS = {
6222
6408
  {
6223
6409
  key: ConfigKey.property_caption,
6224
6410
  description: "The caption for the resource",
6225
- format: TagFormat.bitmarkText
6411
+ format: TagFormat.bitmarkText,
6412
+ // PLAN-141 F1 (NISO import): a figure's <caption><title> — the
6413
+ // nested content slot reads the title text; the caption rides the
6414
+ // resource chain ([&image:…][@caption:…], catalog D5).
6415
+ mappingKeys: {
6416
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
6417
+ }
6226
6418
  },
6227
6419
  {
6228
6420
  key: ConfigKey.property_showInIndex,
@@ -6280,12 +6472,14 @@ var GROUPS = {
6280
6472
  {
6281
6473
  key: ConfigKey.property_width,
6282
6474
  description: "The width of the image",
6283
- format: TagFormat.number
6475
+ format: TagFormat.number,
6476
+ nullable: true
6284
6477
  },
6285
6478
  {
6286
6479
  key: ConfigKey.property_height,
6287
6480
  description: "The height of the image",
6288
- format: TagFormat.number
6481
+ format: TagFormat.number,
6482
+ nullable: true
6289
6483
  },
6290
6484
  {
6291
6485
  key: ConfigKey.property_alt,
@@ -6330,12 +6524,14 @@ var GROUPS = {
6330
6524
  {
6331
6525
  key: ConfigKey.property_width,
6332
6526
  description: "The width of the image",
6333
- format: TagFormat.number
6527
+ format: TagFormat.number,
6528
+ nullable: true
6334
6529
  },
6335
6530
  {
6336
6531
  key: ConfigKey.property_height,
6337
6532
  description: "The height of the image",
6338
- format: TagFormat.number
6533
+ format: TagFormat.number,
6534
+ nullable: true
6339
6535
  },
6340
6536
  {
6341
6537
  key: ConfigKey.property_alt,
@@ -6387,12 +6583,14 @@ var GROUPS = {
6387
6583
  {
6388
6584
  key: ConfigKey.property_width,
6389
6585
  description: "The width of the video",
6390
- format: TagFormat.number
6586
+ format: TagFormat.number,
6587
+ nullable: true
6391
6588
  },
6392
6589
  {
6393
6590
  key: ConfigKey.property_height,
6394
6591
  description: "The height of the video",
6395
- format: TagFormat.number
6592
+ format: TagFormat.number,
6593
+ nullable: true
6396
6594
  },
6397
6595
  {
6398
6596
  key: ConfigKey.property_duration,
@@ -6490,6 +6688,10 @@ var GROUPS = {
6490
6688
  {
6491
6689
  key: ConfigKey.resource_image,
6492
6690
  exportJsonKey: { resource: { type: "image", image: { src: "$" } } },
6691
+ // PLAN-141 F1 (NISO import): the image URL rides the `$`-in-attr
6692
+ // value slot — a <graphic xlink:href> child of the mapped bit
6693
+ // element roots the [&image:URL] chain.
6694
+ mappingKeys: { "xml-niso-iec": { "@el": "graphic", "@attr": { "xlink:href": "$" } } },
6493
6695
  description: "The image resource",
6494
6696
  chain: [
6495
6697
  {
@@ -7364,6 +7566,8 @@ var BITS = {
7364
7566
  maxCount: 2,
7365
7567
  jsonKey: "title|multi(count=2, key=subtitle)",
7366
7568
  exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
7569
+ // PLAN-140 W3 (NISO import): the title of a mapped source element.
7570
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } },
7367
7571
  key: ConfigKey.tag_title,
7368
7572
  description: "The title of the article"
7369
7573
  }
@@ -7405,12 +7609,56 @@ var BITS = {
7405
7609
  [BitType2.smartStandardArticleNormative]: {
7406
7610
  since: "1.28.0",
7407
7611
  baseBitType: BitType2.standardArticleNormative,
7408
- description: "Smart standard normative article bit"
7612
+ description: "Smart standard normative article bit",
7613
+ // PLAN-140 W3 (NISO import, tranche 1): one article bit per NISO
7614
+ // paragraph (catalog D1). CONTENT keys (@children): the subtree is the
7615
+ // bit's body; nothing inside it promotes. (Ancestor-context normativity
7616
+ // is the non-normative sibling's @ancestor key — plan Q4, resolved.)
7617
+ //
7618
+ // Second rule (catalog D1 push-down): a NUMBERED-PARAGRAPH sec is an
7619
+ // article, not a chapter — the sec-type literal outranks the chapter
7620
+ // key's plain sec|app rule (most-specific-wins). Content key: the sec's
7621
+ // label rides [%] via the label tag key, its inner <p> is the body, its
7622
+ // id is the bit's customerId, and the anchor slot marks it
7623
+ // anchor-bearing.
7624
+ mappingKeys: {
7625
+ "xml-niso-iec": [
7626
+ { "@el": "p", "@attr": { id: "$customerId" }, "@children": "$" },
7627
+ {
7628
+ "@el": "sec",
7629
+ "@attr": { "sec-type": "numbered-paragraph", id: "$customerId" },
7630
+ "@children": "$",
7631
+ "\u25BC": "$anchor"
7632
+ }
7633
+ ]
7634
+ }
7409
7635
  },
7410
7636
  [BitType2.smartStandardArticleNonNormative]: {
7411
7637
  since: "1.28.0",
7412
7638
  baseBitType: BitType2.standardArticleNonNormative,
7413
- description: "Smart standard non-normative article bit"
7639
+ description: "Smart standard non-normative article bit",
7640
+ // PLAN-140 Q4 (normativity inheritance): a <p> is non-normative because
7641
+ // of an ANCESTOR element — a foreword/intro sec or an informative annex.
7642
+ // @ancestor is a reverse-match-only constraint (forward emission ignores
7643
+ // it); the rules are alternatives, first-satisfied wins, and the
7644
+ // @ancestor literals give this key higher specificity than the plain
7645
+ // normative-article <p> key wherever the context applies.
7646
+ mappingKeys: {
7647
+ "xml-niso-iec": [
7648
+ {
7649
+ "@el": "p",
7650
+ "@attr": { id: "$customerId" },
7651
+ "@ancestor": { "@attr": { "sec-type": "foreword|intro" } },
7652
+ "@children": "$"
7653
+ },
7654
+ {
7655
+ "@el": "p",
7656
+ "@attr": { id: "$customerId" },
7657
+ "@ancestor": { "@attr": { "content-type": "informative" } },
7658
+ "@children": "$"
7659
+ }
7660
+ ]
7661
+ }
7414
7662
  },
7415
7663
  [BitType2.smartStandardArticleNormativeCollapsible]: {
7416
7664
  since: "1.28.0",
@@ -7477,7 +7725,8 @@ var BITS = {
7477
7725
  {
7478
7726
  key: ConfigKey.property_coverImage,
7479
7727
  description: "Cover image of the catalog item",
7480
- format: TagFormat.plainText
7728
+ format: TagFormat.plainText,
7729
+ nullable: true
7481
7730
  },
7482
7731
  {
7483
7732
  key: ConfigKey.resource_coverImage,
@@ -7641,7 +7890,8 @@ var BITS = {
7641
7890
  {
7642
7891
  key: ConfigKey.property_coverImage,
7643
7892
  description: "Cover image of the catalog item",
7644
- format: TagFormat.plainText
7893
+ format: TagFormat.plainText,
7894
+ nullable: true
7645
7895
  },
7646
7896
  {
7647
7897
  key: ConfigKey.resource_coverImage,
@@ -7805,7 +8055,8 @@ var BITS = {
7805
8055
  {
7806
8056
  key: ConfigKey.property_coverImage,
7807
8057
  description: "Cover image of the catalog item",
7808
- format: TagFormat.plainText
8058
+ format: TagFormat.plainText,
8059
+ nullable: true
7809
8060
  },
7810
8061
  {
7811
8062
  key: ConfigKey.property_content2Buy,
@@ -8038,7 +8289,8 @@ var BITS = {
8038
8289
  {
8039
8290
  key: ConfigKey.property_maxCreatedBits,
8040
8291
  description: "The maximum number of bits that can be created from this bit",
8041
- format: TagFormat.number
8292
+ format: TagFormat.number,
8293
+ nullable: true
8042
8294
  }
8043
8295
  ],
8044
8296
  textFormatDefault: TextFormat2.plainText
@@ -8168,6 +8420,13 @@ var BITS = {
8168
8420
  since: "1.3.0",
8169
8421
  baseBitType: BitType2._standard,
8170
8422
  description: "Book bit, used to represent a book",
8423
+ // PLAN-141 F5 (NISO import): the <std-meta> front-matter container is
8424
+ // the [.book] bit (STRUCTURAL, first in document order): primary
8425
+ // title-wrap → [#], primary content-language → [@language], dated
8426
+ // std-ref → [@externalId] (tag keys with maxEmits caps — the NISO
8427
+ // convention puts the document language first). std-meta has no id, so
8428
+ // no anchor/customerId. Remaining leaves drop as recorded loss (R-4).
8429
+ mappingKeys: { "xml-niso-iec": { "@el": "std-meta" } },
8171
8430
  tags: [
8172
8431
  {
8173
8432
  key: ConfigKey.group_bookCommon,
@@ -8454,12 +8713,14 @@ var BITS = {
8454
8713
  {
8455
8714
  key: ConfigKey.property_focusX,
8456
8715
  description: "The X coordinate for focusing the image in the browser",
8457
- format: TagFormat.number
8716
+ format: TagFormat.number,
8717
+ nullable: true
8458
8718
  },
8459
8719
  {
8460
8720
  key: ConfigKey.property_focusY,
8461
8721
  description: "The Y coordinate for focusing the image in the browser",
8462
- format: TagFormat.number
8722
+ format: TagFormat.number,
8723
+ nullable: true
8463
8724
  }
8464
8725
  ]
8465
8726
  },
@@ -8490,6 +8751,15 @@ var BITS = {
8490
8751
  since: "1.3.0",
8491
8752
  baseBitType: BitType2._standard,
8492
8753
  description: "Chapter bit, used to define chapters in books or articles",
8754
+ // PLAN-140 W3 (NISO import, tranche 1): recover a chapter from a NISO
8755
+ // section or annex. STRUCTURAL key (no @children content slot): the
8756
+ // element carries no body of its own — tag children (label/title) map
8757
+ // via tag keys, every mapped descendant promotes to a following sibling
8758
+ // bit, and the chapter level derives from nesting depth (catalog D1).
8759
+ // The source id lands as [@customerId] (two-id model, D2).
8760
+ mappingKeys: {
8761
+ "xml-niso-iec": { "@el": "sec|app", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
8762
+ },
8493
8763
  tags: [
8494
8764
  {
8495
8765
  exportJsonKey: { anchor: "$" },
@@ -8501,7 +8771,10 @@ var BITS = {
8501
8771
  key: ConfigKey.tag_title,
8502
8772
  description: "The title of the chapter",
8503
8773
  jsonKey: "title|setMulti(level)",
8504
- exportJsonKey: { title: "$", level: "$level" }
8774
+ exportJsonKey: { title: "$", level: "$level" },
8775
+ // PLAN-140 W3 (NISO import): the section/annex title; the heading
8776
+ // level rides the normalizer-derived nesting depth (plan Q2).
8777
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
8505
8778
  },
8506
8779
  {
8507
8780
  key: ConfigKey.property_toc,
@@ -8591,12 +8864,14 @@ var BITS = {
8591
8864
  {
8592
8865
  key: ConfigKey.property_quizCountItems,
8593
8866
  description: "The number of items in the cloze quiz",
8594
- format: TagFormat.boolean
8867
+ format: TagFormat.boolean,
8868
+ nullable: true
8595
8869
  },
8596
8870
  {
8597
8871
  key: ConfigKey.property_quizStrikethroughSolutions,
8598
8872
  description: "If the cloze solutions should be strikethrough",
8599
- format: TagFormat.boolean
8873
+ format: TagFormat.boolean,
8874
+ nullable: true
8600
8875
  },
8601
8876
  {
8602
8877
  key: ConfigKey.group_gap,
@@ -8705,11 +8980,28 @@ var BITS = {
8705
8980
  since: "1.3.0",
8706
8981
  baseBitType: BitType2._standard,
8707
8982
  description: "Code bit, used for code snippets in articles or documents",
8983
+ // PLAN-141 F4 (NISO import): a <code> block is a CONTENT bit with a
8984
+ // literal text body; @language recovers as [@computerLanguage] (absent
8985
+ // attr → no tag). Anchor = the source id (D2 revised).
8986
+ mappingKeys: {
8987
+ "xml-niso-iec": {
8988
+ "@el": "code",
8989
+ "@attr": { id: "$customerId", language: "$computerLanguage" },
8990
+ "\u25BC": "$anchor",
8991
+ "@text": "$"
8992
+ }
8993
+ },
8708
8994
  tags: [
8709
8995
  {
8710
8996
  key: ConfigKey.property_computerLanguage,
8711
8997
  description: "The programming language of the code snippet",
8712
- format: TagFormat.plainText
8998
+ format: TagFormat.plainText,
8999
+ // PLAN-141 F4 (NISO import): the bit key's `language` sigil recovers
9000
+ // a present attr; this `@absent` rule supplies the AUTHORED default
9001
+ // when the source carries none (catalog code row — an untyped block
9002
+ // is `[@computerLanguage:text]`). Fires only on foreign imports,
9003
+ // never the carrier round-trip.
9004
+ mappingKeys: { "xml-niso-iec": [{ "@absent": "text" }] }
8713
9005
  },
8714
9006
  {
8715
9007
  key: ConfigKey.property_codeLineNumbers,
@@ -8748,7 +9040,20 @@ var BITS = {
8748
9040
  [BitType2.smartStandardFormulaNormative]: {
8749
9041
  since: "3.11.0",
8750
9042
  baseBitType: BitType2.formula,
8751
- description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative"
9043
+ description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative",
9044
+ // PLAN-141 F4 (NISO import): a <disp-formula> is a CONTENT bit whose
9045
+ // latex-format body carries the <mml:math> subtree VERBATIM (G1 — no
9046
+ // MathML↔LaTeX transform; ids stripped); <label> → [%]; a contained
9047
+ // <legend> PROMOTES as a sibling legend bit (cards cannot nest in a
9048
+ // body). Anchor = the source id (D2 revised).
9049
+ mappingKeys: {
9050
+ "xml-niso-iec": {
9051
+ "@el": "disp-formula",
9052
+ "@attr": { id: "$customerId" },
9053
+ "\u25BC": "$anchor",
9054
+ "@children": "$"
9055
+ }
9056
+ }
8752
9057
  },
8753
9058
  [BitType2.smartStandardRemarkFormula]: {
8754
9059
  since: "3.11.0",
@@ -9275,7 +9580,8 @@ var BITS = {
9275
9580
  {
9276
9581
  key: ConfigKey.property_reasonableNumOfChars,
9277
9582
  description: "The reasonable number of characters for the essay",
9278
- format: TagFormat.number
9583
+ format: TagFormat.number,
9584
+ nullable: true
9279
9585
  },
9280
9586
  {
9281
9587
  key: ConfigKey.property_sampleSolution,
@@ -9708,7 +10014,14 @@ var BITS = {
9708
10014
  [BitType2.smartStandardList]: {
9709
10015
  since: "1.28.0",
9710
10016
  baseBitType: BitType2.standardList,
9711
- description: "Smart standard list bit, used to create smart standard lists in articles or books"
10017
+ description: "Smart standard list bit, used to create smart standard lists in articles or books",
10018
+ // PLAN-140 refs family (NISO import): a reference list is a STRUCTURAL
10019
+ // bit (no @children — it takes a path ordinal anchor and its <ref>
10020
+ // children promote to sibling list-item bits); its <title> rides [#]
10021
+ // via the title tag key.
10022
+ mappingKeys: {
10023
+ "xml-niso-iec": { "@el": "ref-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
10024
+ }
9712
10025
  },
9713
10026
  [BitType2.smartStandardListCollapsible]: {
9714
10027
  since: "1.28.0",
@@ -9753,7 +10066,17 @@ var BITS = {
9753
10066
  [BitType2.smartStandardNoteNonNormative]: {
9754
10067
  since: "1.28.0",
9755
10068
  baseBitType: BitType2.standardNoteNonNormative,
9756
- description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards"
10069
+ description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards",
10070
+ // PLAN-140 W3 (NISO import, tranche 1). CONTENT key (@children): a
10071
+ // note's inner paragraphs are note body, never separate bits.
10072
+ mappingKeys: {
10073
+ "xml-niso-iec": {
10074
+ "@el": "non-normative-note",
10075
+ "@attr": { id: "$customerId" },
10076
+ "@children": "$",
10077
+ "\u25BC": "$anchor"
10078
+ }
10079
+ }
9757
10080
  },
9758
10081
  [BitType2.smartStandardNoteNormativeCollapsible]: {
9759
10082
  since: "1.28.0",
@@ -9860,7 +10183,19 @@ var BITS = {
9860
10183
  [BitType2.smartStandardRemarkNonNormative]: {
9861
10184
  since: "1.28.0",
9862
10185
  baseBitType: BitType2.standardRemarkNonNormative,
9863
- description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards"
10186
+ description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards",
10187
+ // PLAN-140 Q4 rider: a warning/caution note routes to the remark bit —
10188
+ // the same element as the note key, distinguished by the content-type
10189
+ // attr literal (alias value: forward emits the first alternative,
10190
+ // reverse accepts any). Most-specific-wins beats the plain note key.
10191
+ mappingKeys: {
10192
+ "xml-niso-iec": {
10193
+ "@el": "non-normative-note",
10194
+ "@attr": { "content-type": "warning|caution", id: "$customerId" },
10195
+ "@children": "$",
10196
+ "\u25BC": "$anchor"
10197
+ }
10198
+ }
9864
10199
  },
9865
10200
  [BitType2.smartStandardRemarkNormativeCollapsible]: {
9866
10201
  since: "1.28.0",
@@ -10292,6 +10627,12 @@ var BITS = {
10292
10627
  description: "Extractor theme bit, used to store design/theme JSON extracted from documents",
10293
10628
  textFormatDefault: TextFormat2.json
10294
10629
  },
10630
+ [BitType2.extractorReconcile]: {
10631
+ since: "5.35.0",
10632
+ baseBitType: BitType2._standard,
10633
+ description: "Extractor reconcile bit, used to store PDF-compare reconciliation decisions (config and issues) in JSON",
10634
+ textFormatDefault: TextFormat2.json
10635
+ },
10295
10636
  [BitType2.extractorAiChat]: {
10296
10637
  since: "3.19.0",
10297
10638
  baseBitType: BitType2._standard,
@@ -10310,32 +10651,38 @@ var BITS = {
10310
10651
  {
10311
10652
  key: ConfigKey.property_pageNo,
10312
10653
  description: "Page number for the block, used to indicate the page on which the block appears",
10313
- format: TagFormat.number
10654
+ format: TagFormat.number,
10655
+ nullable: true
10314
10656
  },
10315
10657
  {
10316
10658
  key: ConfigKey.property_x,
10317
10659
  description: "X-coordinate for the block, used to position the block on the page",
10318
- format: TagFormat.number
10660
+ format: TagFormat.number,
10661
+ nullable: true
10319
10662
  },
10320
10663
  {
10321
10664
  key: ConfigKey.property_y,
10322
10665
  description: "Y-coordinate for the block, used to position the block on the page",
10323
- format: TagFormat.number
10666
+ format: TagFormat.number,
10667
+ nullable: true
10324
10668
  },
10325
10669
  {
10326
10670
  key: ConfigKey.property_width,
10327
10671
  description: "Width of the block, used to define the size of the block on the page",
10328
- format: TagFormat.number
10672
+ format: TagFormat.number,
10673
+ nullable: true
10329
10674
  },
10330
10675
  {
10331
10676
  key: ConfigKey.property_height,
10332
10677
  description: "Height of the block, used to define the size of the block on the page",
10333
- format: TagFormat.number
10678
+ format: TagFormat.number,
10679
+ nullable: true
10334
10680
  },
10335
10681
  {
10336
10682
  key: ConfigKey.property_index,
10337
10683
  description: "Index of the block, used to order blocks within the extractor page",
10338
- format: TagFormat.number
10684
+ format: TagFormat.number,
10685
+ nullable: true
10339
10686
  },
10340
10687
  {
10341
10688
  key: ConfigKey.property_classification,
@@ -10645,7 +10992,20 @@ var BITS = {
10645
10992
  [BitType2.smartStandardLegendNormative]: {
10646
10993
  since: "3.12.0",
10647
10994
  baseBitType: BitType2.legend,
10648
- description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books"
10995
+ description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books",
10996
+ // PLAN-141 F2 (NISO import): a free-standing <legend> (a formula's) or
10997
+ // bare <def-list> (a table footer's — no <legend> wrapper there) that is
10998
+ // NOT the claimed card content of its enclosing bit is a legend bit:
10999
+ // STRUCTURAL-shaped, its <title> and <def-item>s build the
11000
+ // definition-list cards via the card set's authored keys. A <legend>
11001
+ // inside a figure/table bit stays that bit's claimed card content and
11002
+ // never reaches this key. Anchor = the source id (D2 revised).
11003
+ mappingKeys: {
11004
+ "xml-niso-iec": [
11005
+ { "@el": "legend", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" },
11006
+ { "@el": "def-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11007
+ ]
11008
+ }
10649
11009
  },
10650
11010
  [BitType2.smartStandardRemarkLegend]: {
10651
11011
  since: "3.12.0",
@@ -10700,7 +11060,16 @@ var BITS = {
10700
11060
  [BitType2.smartStandardDefinitionListNormative]: {
10701
11061
  since: "5.24.0",
10702
11062
  baseBitType: BitType2.standardDefinitionListNormative,
10703
- description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books"
11063
+ description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books",
11064
+ // PLAN-141 F3 (NISO import): a terms-and-definitions clause. STRUCTURAL-
11065
+ // shaped: <label> → [%], the tbx:termEntry/langSet subtree builds the
11066
+ // definition-list card via the card set's authored keys (all tig terms
11067
+ // stacked on the term side; definition/example/notes/source composed on
11068
+ // the definition side with authored locale affixes), langSet @xml:lang →
11069
+ // [@lang] (nested attr slot on the tag key). Anchor = the source id.
11070
+ mappingKeys: {
11071
+ "xml-niso-iec": { "@el": "term-sec", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11072
+ }
10704
11073
  },
10705
11074
  [BitType2.smartStandardDefinitionListNonNormative]: {
10706
11075
  since: "5.24.0",
@@ -10769,12 +11138,14 @@ var BITS = {
10769
11138
  {
10770
11139
  key: ConfigKey.property_focusX,
10771
11140
  description: "X-coordinate for the focus point, used to define the focus area in the image",
10772
- format: TagFormat.number
11141
+ format: TagFormat.number,
11142
+ nullable: true
10773
11143
  },
10774
11144
  {
10775
11145
  key: ConfigKey.property_focusY,
10776
11146
  description: "Y-coordinate for the focus point, used to define the focus area in the image",
10777
- format: TagFormat.number
11147
+ format: TagFormat.number,
11148
+ nullable: true
10778
11149
  }
10779
11150
  ]
10780
11151
  },
@@ -10881,7 +11252,15 @@ var BITS = {
10881
11252
  [BitType2.smartStandardImageFigureNormative]: {
10882
11253
  since: "1.28.0",
10883
11254
  baseBitType: BitType2.standardImageFigureNormative,
10884
- description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books"
11255
+ description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books",
11256
+ // PLAN-141 F1 (NISO import): a figure is STRUCTURAL-shaped (no
11257
+ // @children — no body): <label> → [%], <caption>/<graphic> ride the
11258
+ // [&image] resource chain, the <legend> def-list becomes the bit's
11259
+ // definition-list cards, and an inner note PROMOTES as a sibling bit.
11260
+ // Anchor = the source id (D2 revised).
11261
+ mappingKeys: {
11262
+ "xml-niso-iec": { "@el": "fig", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11263
+ }
10885
11264
  },
10886
11265
  [BitType2.smartStandardImageFigureNonNormative]: {
10887
11266
  since: "1.28.0",
@@ -11609,7 +11988,19 @@ var BITS = {
11609
11988
  [BitType2.smartStandardListItem]: {
11610
11989
  since: "1.28.0",
11611
11990
  baseBitType: BitType2.standardListItem,
11612
- description: "Smart standard list item bit, used to create smart standard list items in articles or books"
11991
+ description: "Smart standard list item bit, used to create smart standard list items in articles or books",
11992
+ // PLAN-140 refs family (NISO import): one list-item bit per <ref> —
11993
+ // CONTENT key (its citation subtree is the body), counter anchor scoped
11994
+ // to the containing list, <label> → [%], nested <std-id> → [@externalId]
11995
+ // (the externalId tag key's nested content slot).
11996
+ mappingKeys: {
11997
+ "xml-niso-iec": {
11998
+ "@el": "ref",
11999
+ "@attr": { id: "$customerId" },
12000
+ "@children": "$",
12001
+ "\u25BC": "$anchor"
12002
+ }
12003
+ }
11613
12004
  },
11614
12005
  [BitType2.smartStandardListItemCollapsible]: {
11615
12006
  since: "1.28.0",
@@ -12078,7 +12469,8 @@ var BITS = {
12078
12469
  {
12079
12470
  key: ConfigKey.property_product,
12080
12471
  description: "Product reference for the product page, used to link to the product",
12081
- format: TagFormat.plainText
12472
+ format: TagFormat.plainText,
12473
+ nullable: true
12082
12474
  }
12083
12475
  ]
12084
12476
  },
@@ -12097,6 +12489,7 @@ var BITS = {
12097
12489
  key: ConfigKey.property_product,
12098
12490
  description: "Product reference for the product list, used to link to the product",
12099
12491
  format: TagFormat.plainText,
12492
+ nullable: true,
12100
12493
  maxCount: Count.infinity
12101
12494
  }
12102
12495
  // {
@@ -12658,7 +13051,8 @@ var BITS = {
12658
13051
  {
12659
13052
  key: ConfigKey.property_ratingLevelSelected,
12660
13053
  description: "Selected level for the rating survey, used to define the default rating",
12661
- format: TagFormat.number
13054
+ format: TagFormat.number,
13055
+ nullable: true
12662
13056
  },
12663
13057
  {
12664
13058
  key: ConfigKey.property_buttonCaption,
@@ -12713,7 +13107,13 @@ var BITS = {
12713
13107
  // `<caption>` — placed inside the idiomatic `<table>` container as
12714
13108
  // its first child. Outside a table context it falls back to the
12715
13109
  // residual carrier.
12716
- htmlKey: { "@el": "caption", "@children": "$" }
13110
+ htmlKey: { "@el": "caption", "@children": "$" },
13111
+ // PLAN-141 F2 (NISO import): a table-wrap's <caption><title> — the
13112
+ // nested content slot reads the title text (catalog D5: the caption
13113
+ // is a TOP-LEVEL bit property on table bits).
13114
+ mappingKeys: {
13115
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
13116
+ }
12717
13117
  },
12718
13118
  {
12719
13119
  key: ConfigKey.property_tableFixedHeader,
@@ -12886,7 +13286,16 @@ var BITS = {
12886
13286
  [BitType2.smartStandardTableExtendedNormative]: {
12887
13287
  since: "1.28.0",
12888
13288
  baseBitType: BitType2.standardTableExtendedNormative,
12889
- description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books"
13289
+ description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books",
13290
+ // PLAN-141 F2 (NISO import): a table-wrap is STRUCTURAL-shaped (no
13291
+ // @children — no body): <label> → [%], <caption><title> → the bit-level
13292
+ // [@caption] (D5), the inner <table>/<table-wrap-foot> build the
13293
+ // table-extended card grid via the card set's authored keys, and a
13294
+ // footer <def-list> PROMOTES as a sibling legend bit. Anchor = the
13295
+ // source id (D2 revised).
13296
+ mappingKeys: {
13297
+ "xml-niso-iec": { "@el": "table-wrap", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
13298
+ }
12890
13299
  },
12891
13300
  [BitType2.smartStandardTableExtendedNonNormative]: {
12892
13301
  since: "1.28.0",
@@ -12961,7 +13370,8 @@ var BITS = {
12961
13370
  {
12962
13371
  key: ConfigKey.property_maxDisplayLevel,
12963
13372
  description: "Maximum display level for the chapter in the table of contents",
12964
- format: TagFormat.number
13373
+ format: TagFormat.number,
13374
+ nullable: true
12965
13375
  }
12966
13376
  ]
12967
13377
  },
@@ -12973,7 +13383,8 @@ var BITS = {
12973
13383
  {
12974
13384
  key: ConfigKey.property_maxTocChapterLevel,
12975
13385
  description: "Maximum chapter level for the inline table of contents",
12976
- format: TagFormat.number
13386
+ format: TagFormat.number,
13387
+ nullable: true
12977
13388
  }
12978
13389
  ]
12979
13390
  },
@@ -13396,13 +13807,15 @@ var BITS = {
13396
13807
  key: ConfigKey.property_width,
13397
13808
  // Same as image
13398
13809
  description: "Width for the embedded content, used to define the width in pixels",
13399
- format: TagFormat.number
13810
+ format: TagFormat.number,
13811
+ nullable: true
13400
13812
  },
13401
13813
  {
13402
13814
  key: ConfigKey.property_height,
13403
13815
  // Same as image
13404
13816
  description: "Height for the embedded content, used to define the height in pixels",
13405
- format: TagFormat.number
13817
+ format: TagFormat.number,
13818
+ nullable: true
13406
13819
  },
13407
13820
  {
13408
13821
  key: ConfigKey.property_vendorUrl,
@@ -13440,7 +13853,8 @@ var BITS = {
13440
13853
  {
13441
13854
  key: ConfigKey.property_jupyterExecutionCount,
13442
13855
  description: "Execution count for the Jupyter output, used to define the execution order",
13443
- format: TagFormat.number
13856
+ format: TagFormat.number,
13857
+ nullable: true
13444
13858
  }
13445
13859
  ],
13446
13860
  textFormatDefault: TextFormat2.plainText
@@ -13990,7 +14404,7 @@ var instance2 = new Config();
13990
14404
  // src/generated/package_info.ts
13991
14405
  var PACKAGE_INFO = {
13992
14406
  "name": "@gmb/bitmark-parser-generator",
13993
- "version": "5.34.0",
14407
+ "version": "5.36.0",
13994
14408
  "author": "Get More Brain Ltd",
13995
14409
  "license": "ISC",
13996
14410
  "description": "A bitmark parser and generator using Peggy.js"
@@ -14519,6 +14933,8 @@ var NodeType = {
14519
14933
  definition: "definition",
14520
14934
  definitions: "definitions",
14521
14935
  definitionsValue: "definitionsValue",
14936
+ displayName: "displayName",
14937
+ displayNameValue: "displayNameValue",
14522
14938
  diffContext: "diffContext",
14523
14939
  diffContextValue: "diffContextValue",
14524
14940
  diffOp: "diffOp",
@@ -14915,6 +15331,8 @@ var NodeType = {
14915
15331
  reviewTagValue: "reviewTagValue",
14916
15332
  reviewerTag: "reviewerTag",
14917
15333
  reviewerTagValue: "reviewerTagValue",
15334
+ rightsPolicy: "rightsPolicy",
15335
+ rightsPolicyValue: "rightsPolicyValue",
14918
15336
  root: "root",
14919
15337
  // bit type (root)
14920
15338
  rows: "rows",
@@ -28284,6 +28702,14 @@ var Builder = class extends BaseBuilder {
28284
28702
  data.jupyterExecutionCount,
28285
28703
  options
28286
28704
  ),
28705
+ copyright: this.toAstProperty(bitType, ConfigKey.property_copyright, data.copyright, options),
28706
+ license: this.toAstProperty(bitType, ConfigKey.property_license, data.license, options),
28707
+ rightsPolicy: this.toAstProperty(
28708
+ bitType,
28709
+ ConfigKey.property_rightsPolicy,
28710
+ data.rightsPolicy,
28711
+ options
28712
+ ),
28287
28713
  sourceRL: this.toAstProperty(bitType, ConfigKey.property_sourceRL, data.sourceRL, options),
28288
28714
  isPublic: this.toAstProperty(bitType, ConfigKey.property_isPublic, data.isPublic, options),
28289
28715
  isTemplate: this.toAstProperty(
@@ -28431,6 +28857,12 @@ var Builder = class extends BaseBuilder {
28431
28857
  data.publisherName,
28432
28858
  options
28433
28859
  ),
28860
+ displayName: this.toAstProperty(
28861
+ bitType,
28862
+ ConfigKey.property_displayName,
28863
+ data.displayName,
28864
+ options
28865
+ ),
28434
28866
  theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),
28435
28867
  rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),
28436
28868
  computerLanguage: this.toAstProperty(