@gmb/bitmark-parser-generator 5.35.0 → 5.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/main.js CHANGED
@@ -1316,6 +1316,7 @@ var propertyKeys = {
1316
1316
  property_dateEnd: "@dateEnd",
1317
1317
  property_decimalPlaces: "@decimalPlaces",
1318
1318
  property_deeplink: "@deeplink",
1319
+ property_displayName: "@displayName",
1319
1320
  property_diffContext: "@diffContext",
1320
1321
  property_diffOp: "@diffOp",
1321
1322
  property_diffRef: "@diffRef",
@@ -1528,6 +1529,8 @@ var propertyKeys = {
1528
1529
  property_trim: "@trim",
1529
1530
  property_unit: "@unit",
1530
1531
  property_unitAbbr: "@unitAbbr",
1532
+ property_unitAbbrPlural: "@unitAbbrPlural",
1533
+ property_unitPlural: "@unitPlural",
1531
1534
  property_vendorDashboardId: "@vendorDashboardId",
1532
1535
  property_vendorSurveyId: "@vendorSurveyId",
1533
1536
  property_vendorUrl: "@vendorUrl",
@@ -2456,9 +2459,30 @@ var CARDSETS = {
2456
2459
  [CardSetConfigKey.definitionList]: {
2457
2460
  jsonKey: "definitions",
2458
2461
  exportJsonKey: { definitions: "$" },
2462
+ // PLAN-141 F1 (NISO import): each <def-item> is one card; the sides
2463
+ // read <term>/<def>; the enclosing <legend>'s <title> lands on the
2464
+ // term side's heading tag ([#Key] header card).
2465
+ // PLAN-141 F3: a <tbx:langSet> is ALSO one card (a terminology entry —
2466
+ // its enclosing <tbx:termEntry> is a transparent claim wrapper); its
2467
+ // children compose the term/definition sides via the side rules below.
2468
+ mappingKeys: {
2469
+ "xml-niso-iec": [
2470
+ { "@el": "def-item", "@children": "$" },
2471
+ { "@el": "tbx:langSet", "@children": "$" }
2472
+ ]
2473
+ },
2459
2474
  sides: [
2460
2475
  {
2461
2476
  name: "term",
2477
+ // F3: every <tbx:tig>'s <tbx:term> STACKS one-per-line onto the
2478
+ // single term side (the "$\n" template's authored separator; the
2479
+ // trailing one is trimmed) — the PDF's Maus/Mus/M/Müsli stack.
2480
+ mappingKeys: {
2481
+ "xml-niso-iec": [
2482
+ { "@el": "term", "@text": "$" },
2483
+ { "@el": "tbx:tig", "@children": { "@el": "tbx:term", "@text": "$\n" } }
2484
+ ]
2485
+ },
2462
2486
  variants: [
2463
2487
  {
2464
2488
  jsonKey: "term.text",
@@ -2474,7 +2498,8 @@ var CARDSETS = {
2474
2498
  format: TagFormat.plainText,
2475
2499
  nullable: true,
2476
2500
  jsonKey: "^heading.forKeys",
2477
- exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2501
+ exportJsonKey: { "@bit": { heading: { forKeys: "$" } } },
2502
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
2478
2503
  },
2479
2504
  {
2480
2505
  key: ConfigKey.group_resourceIcon,
@@ -2500,6 +2525,24 @@ var CARDSETS = {
2500
2525
  },
2501
2526
  {
2502
2527
  name: "definition",
2528
+ // F3: the definition side COMPOSES from the entry's fields in
2529
+ // document order, with the ES-rendered locale affixes AUTHORED as
2530
+ // value-position templates (never engine text): the subject field
2531
+ // in ⟨⟩ glues (trailing space) onto the definition line; example /
2532
+ // notes / source follow as blank-line-separated lines. The TBX
2533
+ // grammar flags (normativeAuthorization, termType, partOfSpeech,
2534
+ // grammaticalNumber) are unrendered machine-only data — dropped and
2535
+ // recorded (catalog R-2, reviewed under D7 max-preservation).
2536
+ mappingKeys: {
2537
+ "xml-niso-iec": [
2538
+ { "@el": "def", "@children": "$" },
2539
+ { "@el": "tbx:subjectField", "@text": "\u27E8$\u27E9 " },
2540
+ { "@el": "tbx:definition", "@children": "$" },
2541
+ { "@el": "tbx:example", "@children": "BEISPIEL $" },
2542
+ { "@el": "tbx:note", "@children": "Anmerkung zu Begriff: $" },
2543
+ { "@el": "tbx:source", "@text": "[QUELLE: $]" }
2544
+ ]
2545
+ },
2503
2546
  variants: [
2504
2547
  {
2505
2548
  jsonKey: "definition.text",
@@ -3890,6 +3933,11 @@ var CARDSETS = {
3890
3933
  { table: { header: { rows: ["$"] } } }
3891
3934
  ],
3892
3935
  htmlKey: { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } },
3936
+ // PLAN-141 F2 (NISO import): the XHTML table model NISO uses — a
3937
+ // <thead> SECTION whose <tr> rows are the header cards.
3938
+ mappingKeys: {
3939
+ "xml-niso-iec": { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } }
3940
+ },
3893
3941
  sideJsonKey: "cells[{s}]|set(title=true)",
3894
3942
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3895
3943
  // Header cells are `<th>`. The `width` attribute is contributed by the
@@ -3901,12 +3949,21 @@ var CARDSETS = {
3901
3949
  jsonKey: "table.body.rows",
3902
3950
  exportJsonKey: { table: { body: { rows: "$" } } },
3903
3951
  htmlKey: { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } },
3952
+ // PLAN-141 F2 (NISO import): <tbody> rows are the (default) data cards.
3953
+ mappingKeys: {
3954
+ "xml-niso-iec": { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } }
3955
+ },
3904
3956
  isDefault: true
3905
3957
  },
3906
3958
  "table-footer": {
3907
3959
  jsonKey: "table.footer.rows",
3908
3960
  exportJsonKey: { table: { footer: { rows: "$" } } },
3909
3961
  htmlKey: { "@el": "tfoot", "@children": { "@el": "tr", "@children": "$" } },
3962
+ // PLAN-141 F2 (NISO import): NISO has no <tfoot> — the footer card's
3963
+ // source is the <table-wrap-foot> block (CONTENT-shaped: no rows; its
3964
+ // prose/notes flatten into one footer card — catalog table-wrap-foot
3965
+ // row; a contained <def-list> promotes as a sibling legend bit).
3966
+ mappingKeys: { "xml-niso-iec": { "@el": "table-wrap-foot", "@children": "$" } },
3910
3967
  sideJsonKey: "cells[{s}]|set(title=true)",
3911
3968
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3912
3969
  // Footer cells render as `<th>` (mirrors the header `title: true`
@@ -3923,6 +3980,8 @@ var CARDSETS = {
3923
3980
  // Default (body) cell → `<td>`; the header/footer sections override the
3924
3981
  // side to `<th>` via their sideHtmlKey (HTML.md §8).
3925
3982
  htmlKey: { "@el": "td", "@children": "$" },
3983
+ // PLAN-141 F2 (NISO import): a <td> row child is a body cell side.
3984
+ mappingKeys: { "xml-niso-iec": { "@el": "td", "@children": "$" } },
3926
3985
  variants: [
3927
3986
  {
3928
3987
  jsonKey: "content",
@@ -3940,7 +3999,11 @@ var CARDSETS = {
3940
3999
  // cell with `title: true` automatically.
3941
4000
  jsonKey: "content",
3942
4001
  exportJsonKey: { content: "$" },
3943
- description: "Title text of the table cell (header rows)."
4002
+ description: "Title text of the table cell (header rows).",
4003
+ // PLAN-141 F2 (NISO import): a <th> row child is a TITLE cell —
4004
+ // its content lands in the `[#…]` tag (an empty <th> keeps its
4005
+ // slot as a bare `[#]`).
4006
+ mappingKeys: { "xml-niso-iec": { "@el": "th", "@children": "$" } }
3944
4007
  },
3945
4008
  {
3946
4009
  key: ConfigKey.property_tableCellType,
@@ -3959,6 +4022,9 @@ var CARDSETS = {
3959
4022
  // HTML-C2: contribute a `rowspan` attribute onto the enclosing
3960
4023
  // cell element (`<th>`/`<td>`).
3961
4024
  htmlKey: { "@el": { "@attr": { rowspan: "$" } } },
4025
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4026
+ // `rowspan` attribute (element-scope attr form).
4027
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { rowspan: "$" } } } },
3962
4028
  description: "Number of rows the cell spans.",
3963
4029
  format: TagFormat.number
3964
4030
  },
@@ -3969,6 +4035,9 @@ var CARDSETS = {
3969
4035
  // HTML-C2: contribute a `colspan` attribute onto the enclosing
3970
4036
  // cell element (`<th>`/`<td>`).
3971
4037
  htmlKey: { "@el": { "@attr": { colspan: "$" } } },
4038
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4039
+ // `colspan` attribute (element-scope attr form).
4040
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { colspan: "$" } } } },
3972
4041
  description: "Number of columns the cell spans.",
3973
4042
  format: TagFormat.number
3974
4043
  },
@@ -3990,6 +4059,13 @@ var CARDSETS = {
3990
4059
  // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the
3991
4060
  // enclosing cell element (`<th>`/`<td>`).
3992
4061
  htmlKey: { "@el": { "@attr": { width: "$" } } },
4062
+ // PLAN-141 F2 (NISO import): NISO carries widths as PER-COLUMN
4063
+ // <col width="…"> descriptors at container level, not on cells.
4064
+ // The matched values distribute positionally onto the first
4065
+ // (header) card's sides. Number format ⇒ only an integral
4066
+ // percentage survives ("20.0000%" → 20); a fractional one
4067
+ // (renderer-equalised "4.7619%") is dropped — catalog `col` row.
4068
+ mappingKeys: { "xml-niso-iec": { "@el": "col", "@attr": { width: "$" } } },
3993
4069
  description: "Width for the column.",
3994
4070
  format: TagFormat.number
3995
4071
  }
@@ -4259,12 +4335,22 @@ var CARDSETS = {
4259
4335
  },
4260
4336
  {
4261
4337
  key: ConfigKey.property_unit,
4262
- description: "Unit of measurement for the ingredient.",
4338
+ description: "Unit of measurement for the ingredient (singular).",
4339
+ format: TagFormat.plainText
4340
+ },
4341
+ {
4342
+ key: ConfigKey.property_unitPlural,
4343
+ description: "Unit of measurement for the ingredient (plural).",
4263
4344
  format: TagFormat.plainText
4264
4345
  },
4265
4346
  {
4266
4347
  key: ConfigKey.property_unitAbbr,
4267
- description: "Abbreviation for the unit of measurement.",
4348
+ description: "Abbreviation for the unit of measurement (singular).",
4349
+ format: TagFormat.plainText
4350
+ },
4351
+ {
4352
+ key: ConfigKey.property_unitAbbrPlural,
4353
+ description: "Abbreviation for the unit of measurement (plural).",
4268
4354
  format: TagFormat.plainText
4269
4355
  },
4270
4356
  {
@@ -4363,7 +4449,22 @@ var GROUPS = {
4363
4449
  key: ConfigKey.property_externalId,
4364
4450
  description: "The external identifier for the bit",
4365
4451
  format: TagFormat.plainText,
4366
- maxCount: Count.infinity
4452
+ maxCount: Count.infinity,
4453
+ // PLAN-140 refs family (NISO import): the machine identifier of a
4454
+ // referenced standard. NESTED content slot — the tag reads (and
4455
+ // consumes) ONLY the <std-id> inside a <std> child; the remaining
4456
+ // designation/title text stays bit body. A <std> without <std-id>
4457
+ // does not fire the key.
4458
+ // PLAN-141 F5: on the [.book] bit, the DATED <std-ref> designation
4459
+ // is the document's external id. Safe rule order: <std-ref> is a
4460
+ // direct bit-element child only under <std-meta> (everywhere else
4461
+ // it nests inside <std>, which the tag spine never reaches).
4462
+ mappingKeys: {
4463
+ "xml-niso-iec": [
4464
+ { "@el": "std", "@children": { "@el": "std-id", "@text": "$" } },
4465
+ { "@el": "std-ref", "@attr": { type: "dated" }, "@text": "$" }
4466
+ ]
4467
+ }
4367
4468
  },
4368
4469
  {
4369
4470
  key: ConfigKey.property_sourceRL,
@@ -4425,6 +4526,11 @@ var GROUPS = {
4425
4526
  description: "Translation source reference",
4426
4527
  format: TagFormat.plainText
4427
4528
  },
4529
+ {
4530
+ key: ConfigKey.property_isCollapsible,
4531
+ description: "If true, the bit is collapsible",
4532
+ format: TagFormat.boolean
4533
+ },
4428
4534
  {
4429
4535
  key: ConfigKey.property_spansPageBreak,
4430
4536
  description: "If true, the bit spans a page break",
@@ -4504,7 +4610,8 @@ var GROUPS = {
4504
4610
  {
4505
4611
  key: ConfigKey.property_diffTime,
4506
4612
  description: "The diff time for the bit",
4507
- format: TagFormat.number
4613
+ format: TagFormat.number,
4614
+ nullable: true
4508
4615
  },
4509
4616
  {
4510
4617
  key: ConfigKey.property_ageRange,
@@ -4515,7 +4622,18 @@ var GROUPS = {
4515
4622
  {
4516
4623
  key: ConfigKey.property_lang,
4517
4624
  description: "The language for the bit",
4518
- format: TagFormat.plainText
4625
+ format: TagFormat.plainText,
4626
+ // PLAN-141 F3 (NISO import): a term-sec's language rides
4627
+ // <tbx:termEntry><tbx:langSet xml:lang> — a nested content slot
4628
+ // whose leaf is a $-in-ATTR-position slot (the nested counterpart
4629
+ // of the value-attr slot). Only termEntry elements match, so the
4630
+ // shared tag is inert everywhere else.
4631
+ mappingKeys: {
4632
+ "xml-niso-iec": {
4633
+ "@el": "tbx:termEntry",
4634
+ "@children": { "@el": "tbx:langSet", "@attr": { "xml:lang": "$" } }
4635
+ }
4636
+ }
4519
4637
  },
4520
4638
  {
4521
4639
  key: ConfigKey.property_publisher,
@@ -4714,6 +4832,9 @@ var GROUPS = {
4714
4832
  key: ConfigKey.tag_item,
4715
4833
  jsonKey: "item",
4716
4834
  exportJsonKey: { item: "$" },
4835
+ // PLAN-140 W3 (NISO import): the clause/note label of a mapped
4836
+ // source element ([%1], [%ANMERKUNG 1]).
4837
+ mappingKeys: { "xml-niso-iec": { "@el": "label", "@text": "$" } },
4717
4838
  description: "The item for the bit",
4718
4839
  chain: [
4719
4840
  {
@@ -5676,7 +5797,20 @@ var GROUPS = {
5676
5797
  key: ConfigKey.property_language,
5677
5798
  description: "The language of the book",
5678
5799
  format: TagFormat.plainText,
5679
- maxCount: Count.infinity
5800
+ maxCount: Count.infinity,
5801
+ // PLAN-141 F5 (NISO import): only the PRIMARY (first)
5802
+ // <content-language> survives — the maxEmits cap realises the
5803
+ // catalog's document-language rule (extras drop, R-4).
5804
+ mappingKeys: {
5805
+ "xml-niso-iec": [
5806
+ { predicates: [], maxEmits: 1, rule: { "@el": "content-language", "@text": "$" } }
5807
+ ]
5808
+ }
5809
+ },
5810
+ {
5811
+ key: ConfigKey.property_displayName,
5812
+ description: "The display name of the book",
5813
+ format: TagFormat.plainText
5680
5814
  },
5681
5815
  {
5682
5816
  key: ConfigKey.property_customerExternalId,
@@ -5752,7 +5886,18 @@ var GROUPS = {
5752
5886
  description: "The title of the book",
5753
5887
  maxCount: 2,
5754
5888
  jsonKey: "title|multi(count=2, key=subtitle)",
5755
- exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }]
5889
+ exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
5890
+ // PLAN-141 F5 (NISO import): the PRIMARY (first) <title-wrap>'s
5891
+ // assembled <full> title → [#]; the per-language extras drop (R-4).
5892
+ mappingKeys: {
5893
+ "xml-niso-iec": [
5894
+ {
5895
+ predicates: [],
5896
+ maxEmits: 1,
5897
+ rule: { "@el": "title-wrap", "@children": { "@el": "full", "@text": "$" } }
5898
+ }
5899
+ ]
5900
+ }
5756
5901
  },
5757
5902
  {
5758
5903
  key: ConfigKey.property_subtype,
@@ -6065,17 +6210,20 @@ var GROUPS = {
6065
6210
  {
6066
6211
  key: ConfigKey.property_platformMargin,
6067
6212
  description: "The platform margin",
6068
- format: TagFormat.number
6213
+ format: TagFormat.number,
6214
+ nullable: true
6069
6215
  },
6070
6216
  {
6071
6217
  key: ConfigKey.property_platformBorderRadius,
6072
6218
  description: "The platform border radius",
6073
- format: TagFormat.number
6219
+ format: TagFormat.number,
6220
+ nullable: true
6074
6221
  },
6075
6222
  {
6076
6223
  key: ConfigKey.property_platformSelectionBorderRadius,
6077
6224
  description: "The platform selection border radius",
6078
- format: TagFormat.number
6225
+ format: TagFormat.number,
6226
+ nullable: true
6079
6227
  },
6080
6228
  {
6081
6229
  key: ConfigKey.property_platformNeedsShadow,
@@ -6182,7 +6330,13 @@ var GROUPS = {
6182
6330
  {
6183
6331
  key: ConfigKey.property_caption,
6184
6332
  description: "The caption for the resource",
6185
- format: TagFormat.bitmarkText
6333
+ format: TagFormat.bitmarkText,
6334
+ // PLAN-141 F1 (NISO import): a figure's <caption><title> — the
6335
+ // nested content slot reads the title text; the caption rides the
6336
+ // resource chain ([&image:…][@caption:…], catalog D5).
6337
+ mappingKeys: {
6338
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
6339
+ }
6186
6340
  },
6187
6341
  {
6188
6342
  key: ConfigKey.property_showInIndex,
@@ -6456,6 +6610,10 @@ var GROUPS = {
6456
6610
  {
6457
6611
  key: ConfigKey.resource_image,
6458
6612
  exportJsonKey: { resource: { type: "image", image: { src: "$" } } },
6613
+ // PLAN-141 F1 (NISO import): the image URL rides the `$`-in-attr
6614
+ // value slot — a <graphic xlink:href> child of the mapped bit
6615
+ // element roots the [&image:URL] chain.
6616
+ mappingKeys: { "xml-niso-iec": { "@el": "graphic", "@attr": { "xlink:href": "$" } } },
6459
6617
  description: "The image resource",
6460
6618
  chain: [
6461
6619
  {
@@ -7330,6 +7488,8 @@ var BITS = {
7330
7488
  maxCount: 2,
7331
7489
  jsonKey: "title|multi(count=2, key=subtitle)",
7332
7490
  exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
7491
+ // PLAN-140 W3 (NISO import): the title of a mapped source element.
7492
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } },
7333
7493
  key: ConfigKey.tag_title,
7334
7494
  description: "The title of the article"
7335
7495
  }
@@ -7371,22 +7531,84 @@ var BITS = {
7371
7531
  [BitType.smartStandardArticleNormative]: {
7372
7532
  since: "1.28.0",
7373
7533
  baseBitType: BitType.standardArticleNormative,
7374
- description: "Smart standard normative article bit"
7534
+ description: "Smart standard normative article bit",
7535
+ // PLAN-140 W3 (NISO import, tranche 1): one article bit per NISO
7536
+ // paragraph (catalog D1). CONTENT keys (@children): the subtree is the
7537
+ // bit's body; nothing inside it promotes. (Ancestor-context normativity
7538
+ // is the non-normative sibling's @ancestor key — plan Q4, resolved.)
7539
+ //
7540
+ // Second rule (catalog D1 push-down): a NUMBERED-PARAGRAPH sec is an
7541
+ // article, not a chapter — the sec-type literal outranks the chapter
7542
+ // key's plain sec|app rule (most-specific-wins). Content key: the sec's
7543
+ // label rides [%] via the label tag key, its inner <p> is the body, its
7544
+ // id is the bit's customerId, and the anchor slot marks it
7545
+ // anchor-bearing.
7546
+ mappingKeys: {
7547
+ "xml-niso-iec": [
7548
+ { "@el": "p", "@attr": { id: "$customerId" }, "@children": "$" },
7549
+ {
7550
+ "@el": "sec",
7551
+ "@attr": { "sec-type": "numbered-paragraph", id: "$customerId" },
7552
+ "@children": "$",
7553
+ "\u25BC": "$anchor"
7554
+ }
7555
+ ]
7556
+ }
7375
7557
  },
7376
7558
  [BitType.smartStandardArticleNonNormative]: {
7377
7559
  since: "1.28.0",
7378
7560
  baseBitType: BitType.standardArticleNonNormative,
7379
- description: "Smart standard non-normative article bit"
7561
+ description: "Smart standard non-normative article bit",
7562
+ // PLAN-140 Q4 (normativity inheritance): a <p> is non-normative because
7563
+ // of an ANCESTOR element — a foreword/intro sec or an informative annex.
7564
+ // @ancestor is a reverse-match-only constraint (forward emission ignores
7565
+ // it); the rules are alternatives, first-satisfied wins, and the
7566
+ // @ancestor literals give this key higher specificity than the plain
7567
+ // normative-article <p> key wherever the context applies.
7568
+ mappingKeys: {
7569
+ "xml-niso-iec": [
7570
+ {
7571
+ "@el": "p",
7572
+ "@attr": { id: "$customerId" },
7573
+ "@ancestor": { "@attr": { "sec-type": "foreword|intro" } },
7574
+ "@children": "$"
7575
+ },
7576
+ {
7577
+ "@el": "p",
7578
+ "@attr": { id: "$customerId" },
7579
+ "@ancestor": { "@attr": { "content-type": "informative" } },
7580
+ "@children": "$"
7581
+ }
7582
+ ]
7583
+ }
7380
7584
  },
7381
7585
  [BitType.smartStandardArticleNormativeCollapsible]: {
7382
7586
  since: "1.28.0",
7587
+ deprecated: "5.37.0",
7383
7588
  baseBitType: BitType.smartStandardArticleNormative,
7384
- description: "Smart standard normative article bit that is collapsible"
7589
+ description: "Smart standard normative article bit that is collapsible",
7590
+ tags: [
7591
+ {
7592
+ key: ConfigKey.property_isCollapsible,
7593
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
7594
+ format: TagFormat.boolean,
7595
+ defaultValue: "true"
7596
+ }
7597
+ ]
7385
7598
  },
7386
7599
  [BitType.smartStandardArticleNonNormativeCollapsible]: {
7387
7600
  since: "1.28.0",
7601
+ deprecated: "5.37.0",
7388
7602
  baseBitType: BitType.smartStandardArticleNonNormative,
7389
- description: "Smart standard non-normative article bit that is collapsible"
7603
+ description: "Smart standard non-normative article bit that is collapsible",
7604
+ tags: [
7605
+ {
7606
+ key: ConfigKey.property_isCollapsible,
7607
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
7608
+ format: TagFormat.boolean,
7609
+ defaultValue: "true"
7610
+ }
7611
+ ]
7390
7612
  },
7391
7613
  [BitType.statement]: {
7392
7614
  since: "1.3.0",
@@ -8007,7 +8229,8 @@ var BITS = {
8007
8229
  {
8008
8230
  key: ConfigKey.property_maxCreatedBits,
8009
8231
  description: "The maximum number of bits that can be created from this bit",
8010
- format: TagFormat.number
8232
+ format: TagFormat.number,
8233
+ nullable: true
8011
8234
  }
8012
8235
  ],
8013
8236
  textFormatDefault: TextFormat.plainText
@@ -8137,6 +8360,13 @@ var BITS = {
8137
8360
  since: "1.3.0",
8138
8361
  baseBitType: BitType._standard,
8139
8362
  description: "Book bit, used to represent a book",
8363
+ // PLAN-141 F5 (NISO import): the <std-meta> front-matter container is
8364
+ // the [.book] bit (STRUCTURAL, first in document order): primary
8365
+ // title-wrap → [#], primary content-language → [@language], dated
8366
+ // std-ref → [@externalId] (tag keys with maxEmits caps — the NISO
8367
+ // convention puts the document language first). std-meta has no id, so
8368
+ // no anchor/customerId. Remaining leaves drop as recorded loss (R-4).
8369
+ mappingKeys: { "xml-niso-iec": { "@el": "std-meta" } },
8140
8370
  tags: [
8141
8371
  {
8142
8372
  key: ConfigKey.group_bookCommon,
@@ -8423,12 +8653,14 @@ var BITS = {
8423
8653
  {
8424
8654
  key: ConfigKey.property_focusX,
8425
8655
  description: "The X coordinate for focusing the image in the browser",
8426
- format: TagFormat.number
8656
+ format: TagFormat.number,
8657
+ nullable: true
8427
8658
  },
8428
8659
  {
8429
8660
  key: ConfigKey.property_focusY,
8430
8661
  description: "The Y coordinate for focusing the image in the browser",
8431
- format: TagFormat.number
8662
+ format: TagFormat.number,
8663
+ nullable: true
8432
8664
  }
8433
8665
  ]
8434
8666
  },
@@ -8459,6 +8691,15 @@ var BITS = {
8459
8691
  since: "1.3.0",
8460
8692
  baseBitType: BitType._standard,
8461
8693
  description: "Chapter bit, used to define chapters in books or articles",
8694
+ // PLAN-140 W3 (NISO import, tranche 1): recover a chapter from a NISO
8695
+ // section or annex. STRUCTURAL key (no @children content slot): the
8696
+ // element carries no body of its own — tag children (label/title) map
8697
+ // via tag keys, every mapped descendant promotes to a following sibling
8698
+ // bit, and the chapter level derives from nesting depth (catalog D1).
8699
+ // The source id lands as [@customerId] (two-id model, D2).
8700
+ mappingKeys: {
8701
+ "xml-niso-iec": { "@el": "sec|app", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
8702
+ },
8462
8703
  tags: [
8463
8704
  {
8464
8705
  exportJsonKey: { anchor: "$" },
@@ -8470,7 +8711,10 @@ var BITS = {
8470
8711
  key: ConfigKey.tag_title,
8471
8712
  description: "The title of the chapter",
8472
8713
  jsonKey: "title|setMulti(level)",
8473
- exportJsonKey: { title: "$", level: "$level" }
8714
+ exportJsonKey: { title: "$", level: "$level" },
8715
+ // PLAN-140 W3 (NISO import): the section/annex title; the heading
8716
+ // level rides the normalizer-derived nesting depth (plan Q2).
8717
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
8474
8718
  },
8475
8719
  {
8476
8720
  key: ConfigKey.property_toc,
@@ -8483,12 +8727,6 @@ var BITS = {
8483
8727
  description: "The progress of the chapter, used for tracking reading progress",
8484
8728
  format: TagFormat.boolean,
8485
8729
  defaultValue: "true"
8486
- },
8487
- {
8488
- key: ConfigKey.property_isCollapsible,
8489
- description: "If true, the chapter is collapsible",
8490
- format: TagFormat.boolean,
8491
- defaultValue: "false"
8492
8730
  }
8493
8731
  ]
8494
8732
  },
@@ -8676,11 +8914,28 @@ var BITS = {
8676
8914
  since: "1.3.0",
8677
8915
  baseBitType: BitType._standard,
8678
8916
  description: "Code bit, used for code snippets in articles or documents",
8917
+ // PLAN-141 F4 (NISO import): a <code> block is a CONTENT bit with a
8918
+ // literal text body; @language recovers as [@computerLanguage] (absent
8919
+ // attr → no tag). Anchor = the source id (D2 revised).
8920
+ mappingKeys: {
8921
+ "xml-niso-iec": {
8922
+ "@el": "code",
8923
+ "@attr": { id: "$customerId", language: "$computerLanguage" },
8924
+ "\u25BC": "$anchor",
8925
+ "@text": "$"
8926
+ }
8927
+ },
8679
8928
  tags: [
8680
8929
  {
8681
8930
  key: ConfigKey.property_computerLanguage,
8682
8931
  description: "The programming language of the code snippet",
8683
- format: TagFormat.plainText
8932
+ format: TagFormat.plainText,
8933
+ // PLAN-141 F4 (NISO import): the bit key's `language` sigil recovers
8934
+ // a present attr; this `@absent` rule supplies the AUTHORED default
8935
+ // when the source carries none (catalog code row — an untyped block
8936
+ // is `[@computerLanguage:text]`). Fires only on foreign imports,
8937
+ // never the carrier round-trip.
8938
+ mappingKeys: { "xml-niso-iec": [{ "@absent": "text" }] }
8684
8939
  },
8685
8940
  {
8686
8941
  key: ConfigKey.property_codeLineNumbers,
@@ -8719,7 +8974,20 @@ var BITS = {
8719
8974
  [BitType.smartStandardFormulaNormative]: {
8720
8975
  since: "3.11.0",
8721
8976
  baseBitType: BitType.formula,
8722
- description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative"
8977
+ description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative",
8978
+ // PLAN-141 F4 (NISO import): a <disp-formula> is a CONTENT bit whose
8979
+ // latex-format body carries the <mml:math> subtree VERBATIM (G1 — no
8980
+ // MathML↔LaTeX transform; ids stripped); <label> → [%]; a contained
8981
+ // <legend> PROMOTES as a sibling legend bit (cards cannot nest in a
8982
+ // body). Anchor = the source id (D2 revised).
8983
+ mappingKeys: {
8984
+ "xml-niso-iec": {
8985
+ "@el": "disp-formula",
8986
+ "@attr": { id: "$customerId" },
8987
+ "\u25BC": "$anchor",
8988
+ "@children": "$"
8989
+ }
8990
+ }
8723
8991
  },
8724
8992
  [BitType.smartStandardRemarkFormula]: {
8725
8993
  since: "3.11.0",
@@ -9065,12 +9333,22 @@ var BITS = {
9065
9333
  chain: [
9066
9334
  {
9067
9335
  key: ConfigKey.property_unit,
9068
- description: "The unit of measurement for the ingredients",
9336
+ description: "The unit of measurement for the ingredients (singular)",
9337
+ format: TagFormat.plainText
9338
+ },
9339
+ {
9340
+ key: ConfigKey.property_unitPlural,
9341
+ description: "The unit of measurement for the ingredients (plural)",
9069
9342
  format: TagFormat.plainText
9070
9343
  },
9071
9344
  {
9072
9345
  key: ConfigKey.property_unitAbbr,
9073
- description: "The abbreviation for the unit of measurement",
9346
+ description: "The abbreviation for the unit of measurement (singular)",
9347
+ format: TagFormat.plainText
9348
+ },
9349
+ {
9350
+ key: ConfigKey.property_unitAbbrPlural,
9351
+ description: "The abbreviation for the unit of measurement (plural)",
9074
9352
  format: TagFormat.plainText
9075
9353
  },
9076
9354
  {
@@ -9246,7 +9524,8 @@ var BITS = {
9246
9524
  {
9247
9525
  key: ConfigKey.property_reasonableNumOfChars,
9248
9526
  description: "The reasonable number of characters for the essay",
9249
- format: TagFormat.number
9527
+ format: TagFormat.number,
9528
+ nullable: true
9250
9529
  },
9251
9530
  {
9252
9531
  key: ConfigKey.property_sampleSolution,
@@ -9348,13 +9627,31 @@ var BITS = {
9348
9627
  },
9349
9628
  [BitType.smartStandardExampleNormativeCollapsible]: {
9350
9629
  since: "1.28.0",
9630
+ deprecated: "5.37.0",
9351
9631
  baseBitType: BitType.smartStandardExampleNormative,
9352
- description: "Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed"
9632
+ description: "Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed",
9633
+ tags: [
9634
+ {
9635
+ key: ConfigKey.property_isCollapsible,
9636
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
9637
+ format: TagFormat.boolean,
9638
+ defaultValue: "true"
9639
+ }
9640
+ ]
9353
9641
  },
9354
9642
  [BitType.smartStandardExampleNonNormativeCollapsible]: {
9355
9643
  since: "1.28.0",
9644
+ deprecated: "5.37.0",
9356
9645
  baseBitType: BitType.smartStandardExampleNonNormative,
9357
- description: "Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed"
9646
+ description: "Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed",
9647
+ tags: [
9648
+ {
9649
+ key: ConfigKey.property_isCollapsible,
9650
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
9651
+ format: TagFormat.boolean,
9652
+ defaultValue: "true"
9653
+ }
9654
+ ]
9358
9655
  },
9359
9656
  [BitType.authorContentBitGenerator]: {
9360
9657
  since: "4.2.0",
@@ -9679,12 +9976,28 @@ var BITS = {
9679
9976
  [BitType.smartStandardList]: {
9680
9977
  since: "1.28.0",
9681
9978
  baseBitType: BitType.standardList,
9682
- description: "Smart standard list bit, used to create smart standard lists in articles or books"
9979
+ description: "Smart standard list bit, used to create smart standard lists in articles or books",
9980
+ // PLAN-140 refs family (NISO import): a reference list is a STRUCTURAL
9981
+ // bit (no @children — it takes a path ordinal anchor and its <ref>
9982
+ // children promote to sibling list-item bits); its <title> rides [#]
9983
+ // via the title tag key.
9984
+ mappingKeys: {
9985
+ "xml-niso-iec": { "@el": "ref-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
9986
+ }
9683
9987
  },
9684
9988
  [BitType.smartStandardListCollapsible]: {
9685
9989
  since: "1.28.0",
9990
+ deprecated: "5.37.0",
9686
9991
  baseBitType: BitType.smartStandardList,
9687
- description: "Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books"
9992
+ description: "Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books",
9993
+ tags: [
9994
+ {
9995
+ key: ConfigKey.property_isCollapsible,
9996
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
9997
+ format: TagFormat.boolean,
9998
+ defaultValue: "true"
9999
+ }
10000
+ ]
9688
10001
  },
9689
10002
  [BitType.message]: {
9690
10003
  since: "1.3.0",
@@ -9724,17 +10037,45 @@ var BITS = {
9724
10037
  [BitType.smartStandardNoteNonNormative]: {
9725
10038
  since: "1.28.0",
9726
10039
  baseBitType: BitType.standardNoteNonNormative,
9727
- description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards"
10040
+ description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards",
10041
+ // PLAN-140 W3 (NISO import, tranche 1). CONTENT key (@children): a
10042
+ // note's inner paragraphs are note body, never separate bits.
10043
+ mappingKeys: {
10044
+ "xml-niso-iec": {
10045
+ "@el": "non-normative-note",
10046
+ "@attr": { id: "$customerId" },
10047
+ "@children": "$",
10048
+ "\u25BC": "$anchor"
10049
+ }
10050
+ }
9728
10051
  },
9729
10052
  [BitType.smartStandardNoteNormativeCollapsible]: {
9730
10053
  since: "1.28.0",
10054
+ deprecated: "5.37.0",
9731
10055
  baseBitType: BitType.smartStandardNoteNormative,
9732
- description: "Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed"
10056
+ description: "Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed",
10057
+ tags: [
10058
+ {
10059
+ key: ConfigKey.property_isCollapsible,
10060
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10061
+ format: TagFormat.boolean,
10062
+ defaultValue: "true"
10063
+ }
10064
+ ]
9733
10065
  },
9734
10066
  [BitType.smartStandardNoteNonNormativeCollapsible]: {
9735
10067
  since: "1.28.0",
10068
+ deprecated: "5.37.0",
9736
10069
  baseBitType: BitType.smartStandardNoteNonNormative,
9737
- description: "Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed"
10070
+ description: "Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed",
10071
+ tags: [
10072
+ {
10073
+ key: ConfigKey.property_isCollapsible,
10074
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10075
+ format: TagFormat.boolean,
10076
+ defaultValue: "true"
10077
+ }
10078
+ ]
9738
10079
  },
9739
10080
  [BitType.noteAi]: {
9740
10081
  since: "1.3.0",
@@ -9831,17 +10172,47 @@ var BITS = {
9831
10172
  [BitType.smartStandardRemarkNonNormative]: {
9832
10173
  since: "1.28.0",
9833
10174
  baseBitType: BitType.standardRemarkNonNormative,
9834
- description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards"
10175
+ description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards",
10176
+ // PLAN-140 Q4 rider: a warning/caution note routes to the remark bit —
10177
+ // the same element as the note key, distinguished by the content-type
10178
+ // attr literal (alias value: forward emits the first alternative,
10179
+ // reverse accepts any). Most-specific-wins beats the plain note key.
10180
+ mappingKeys: {
10181
+ "xml-niso-iec": {
10182
+ "@el": "non-normative-note",
10183
+ "@attr": { "content-type": "warning|caution", id: "$customerId" },
10184
+ "@children": "$",
10185
+ "\u25BC": "$anchor"
10186
+ }
10187
+ }
9835
10188
  },
9836
10189
  [BitType.smartStandardRemarkNormativeCollapsible]: {
9837
10190
  since: "1.28.0",
10191
+ deprecated: "5.37.0",
9838
10192
  baseBitType: BitType.smartStandardRemarkNormative,
9839
- description: "Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed"
10193
+ description: "Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed",
10194
+ tags: [
10195
+ {
10196
+ key: ConfigKey.property_isCollapsible,
10197
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10198
+ format: TagFormat.boolean,
10199
+ defaultValue: "true"
10200
+ }
10201
+ ]
9840
10202
  },
9841
10203
  [BitType.smartStandardRemarkNonNormativeCollapsible]: {
9842
10204
  since: "1.28.0",
10205
+ deprecated: "5.37.0",
9843
10206
  baseBitType: BitType.smartStandardRemarkNonNormative,
9844
- description: "Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed"
10207
+ description: "Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed",
10208
+ tags: [
10209
+ {
10210
+ key: ConfigKey.property_isCollapsible,
10211
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10212
+ format: TagFormat.boolean,
10213
+ defaultValue: "true"
10214
+ }
10215
+ ]
9845
10216
  },
9846
10217
  [BitType.selfAssessment]: {
9847
10218
  since: "1.3.0",
@@ -9912,53 +10283,143 @@ var BITS = {
9912
10283
  },
9913
10284
  [BitType.collapsible]: {
9914
10285
  since: "1.21.0",
10286
+ deprecated: "5.37.0",
9915
10287
  baseBitType: BitType.article,
9916
- description: "Collapsible bit, used to create collapsible sections in articles or books"
10288
+ description: "Collapsible bit, used to create collapsible sections in articles or books",
10289
+ tags: [
10290
+ {
10291
+ key: ConfigKey.property_isCollapsible,
10292
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10293
+ format: TagFormat.boolean,
10294
+ defaultValue: "true"
10295
+ }
10296
+ ]
9917
10297
  },
9918
10298
  [BitType.sideNoteCollapsible]: {
9919
10299
  since: "1.21.0",
9920
- baseBitType: BitType.article,
9921
- description: "Side note collapsible bit, used to create collapsible side notes in articles or books"
10300
+ deprecated: "5.37.0",
10301
+ baseBitType: BitType.sideNote,
10302
+ description: "Side note collapsible bit, used to create collapsible side notes in articles or books",
10303
+ tags: [
10304
+ {
10305
+ key: ConfigKey.property_isCollapsible,
10306
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10307
+ format: TagFormat.boolean,
10308
+ defaultValue: "true"
10309
+ }
10310
+ ]
9922
10311
  },
9923
10312
  [BitType.infoCollapsible]: {
9924
10313
  since: "1.21.0",
9925
- baseBitType: BitType.article,
9926
- description: "Info collapsible bit, used to create collapsible informational sections in articles or books"
10314
+ deprecated: "5.37.0",
10315
+ baseBitType: BitType.info,
10316
+ description: "Info collapsible bit, used to create collapsible informational sections in articles or books",
10317
+ tags: [
10318
+ {
10319
+ key: ConfigKey.property_isCollapsible,
10320
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10321
+ format: TagFormat.boolean,
10322
+ defaultValue: "true"
10323
+ }
10324
+ ]
9927
10325
  },
9928
10326
  [BitType.remarkCollapsible]: {
9929
10327
  since: "1.21.0",
9930
- baseBitType: BitType.article,
9931
- description: "Remark collapsible bit, used to create collapsible remarks in articles or books"
10328
+ deprecated: "5.37.0",
10329
+ baseBitType: BitType.remark,
10330
+ description: "Remark collapsible bit, used to create collapsible remarks in articles or books",
10331
+ tags: [
10332
+ {
10333
+ key: ConfigKey.property_isCollapsible,
10334
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10335
+ format: TagFormat.boolean,
10336
+ defaultValue: "true"
10337
+ }
10338
+ ]
9932
10339
  },
9933
10340
  [BitType.warningCollapsible]: {
9934
10341
  since: "1.21.0",
9935
- baseBitType: BitType.article,
9936
- description: "Warning collapsible bit, used to create collapsible warnings in articles or books"
10342
+ deprecated: "5.37.0",
10343
+ baseBitType: BitType.warning,
10344
+ description: "Warning collapsible bit, used to create collapsible warnings in articles or books",
10345
+ tags: [
10346
+ {
10347
+ key: ConfigKey.property_isCollapsible,
10348
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10349
+ format: TagFormat.boolean,
10350
+ defaultValue: "true"
10351
+ }
10352
+ ]
9937
10353
  },
9938
10354
  [BitType.dangerCollapsible]: {
9939
10355
  since: "1.21.0",
9940
- baseBitType: BitType.article,
9941
- description: "Danger collapsible bit, used to create collapsible danger sections in articles or books"
10356
+ deprecated: "5.37.0",
10357
+ baseBitType: BitType.danger,
10358
+ description: "Danger collapsible bit, used to create collapsible danger sections in articles or books",
10359
+ tags: [
10360
+ {
10361
+ key: ConfigKey.property_isCollapsible,
10362
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10363
+ format: TagFormat.boolean,
10364
+ defaultValue: "true"
10365
+ }
10366
+ ]
9942
10367
  },
9943
10368
  [BitType.noteCollapsible]: {
9944
10369
  since: "1.21.0",
9945
- baseBitType: BitType.article,
9946
- description: "Note collapsible bit, used to create collapsible notes in articles or books"
10370
+ deprecated: "5.37.0",
10371
+ baseBitType: BitType.note,
10372
+ description: "Note collapsible bit, used to create collapsible notes in articles or books",
10373
+ tags: [
10374
+ {
10375
+ key: ConfigKey.property_isCollapsible,
10376
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10377
+ format: TagFormat.boolean,
10378
+ defaultValue: "true"
10379
+ }
10380
+ ]
9947
10381
  },
9948
10382
  [BitType.exampleCollapsible]: {
9949
10383
  since: "1.21.0",
9950
- baseBitType: BitType.article,
9951
- description: "Example collapsible bit, used to create collapsible examples in articles or books"
10384
+ deprecated: "5.37.0",
10385
+ baseBitType: BitType.example,
10386
+ description: "Example collapsible bit, used to create collapsible examples in articles or books",
10387
+ tags: [
10388
+ {
10389
+ key: ConfigKey.property_isCollapsible,
10390
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10391
+ format: TagFormat.boolean,
10392
+ defaultValue: "true"
10393
+ }
10394
+ ]
9952
10395
  },
9953
10396
  [BitType.hintCollapsible]: {
9954
10397
  since: "1.21.0",
9955
- baseBitType: BitType.article,
9956
- description: "Hint collapsible bit, used to create collapsible hints in articles or books"
10398
+ deprecated: "5.37.0",
10399
+ baseBitType: BitType.hint,
10400
+ description: "Hint collapsible bit, used to create collapsible hints in articles or books",
10401
+ tags: [
10402
+ {
10403
+ key: ConfigKey.property_isCollapsible,
10404
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10405
+ format: TagFormat.boolean,
10406
+ defaultValue: "true"
10407
+ }
10408
+ ]
9957
10409
  },
9958
10410
  [BitType.bugCollapsible]: {
9959
10411
  since: "1.21.0",
9960
- baseBitType: BitType.article,
9961
- description: "Bug collapsible bit, used to create collapsible bug reports in articles or books"
10412
+ deprecated: "5.37.0",
10413
+ baseBitType: BitType.bug,
10414
+ description: "Bug collapsible bit, used to create collapsible bug reports in articles or books",
10415
+ tags: [
10416
+ {
10417
+ key: ConfigKey.property_isCollapsible,
10418
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10419
+ format: TagFormat.boolean,
10420
+ defaultValue: "true"
10421
+ }
10422
+ ]
9962
10423
  },
9963
10424
  [BitType.platformPath]: {
9964
10425
  since: "3.14.1",
@@ -10180,8 +10641,17 @@ var BITS = {
10180
10641
  },
10181
10642
  [BitType.extractorPageCollapsible]: {
10182
10643
  since: "1.30.0",
10644
+ deprecated: "5.37.0",
10183
10645
  baseBitType: BitType.extractorPage,
10184
- description: "Collapsible extractor page bit, used to extract pages from images with collapsible functionality"
10646
+ description: "Collapsible extractor page bit, used to extract pages from images with collapsible functionality",
10647
+ tags: [
10648
+ {
10649
+ key: ConfigKey.property_isCollapsible,
10650
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10651
+ format: TagFormat.boolean,
10652
+ defaultValue: "true"
10653
+ }
10654
+ ]
10185
10655
  },
10186
10656
  [BitType.extractorPageWithBlocks]: {
10187
10657
  since: "1.5.21",
@@ -10190,8 +10660,17 @@ var BITS = {
10190
10660
  },
10191
10661
  [BitType.extractorPageWithBlocksCollapsible]: {
10192
10662
  since: "1.30.0",
10663
+ deprecated: "5.37.0",
10193
10664
  baseBitType: BitType.extractorPageWithBlocks,
10194
- description: "Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality"
10665
+ description: "Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality",
10666
+ tags: [
10667
+ {
10668
+ key: ConfigKey.property_isCollapsible,
10669
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10670
+ format: TagFormat.boolean,
10671
+ defaultValue: "true"
10672
+ }
10673
+ ]
10195
10674
  },
10196
10675
  [BitType.extractorConfiguration]: {
10197
10676
  since: "1.7.1",
@@ -10231,8 +10710,17 @@ var BITS = {
10231
10710
  },
10232
10711
  [BitType.extractorImageCollapsible]: {
10233
10712
  since: "4.3.0",
10713
+ deprecated: "5.37.0",
10234
10714
  baseBitType: BitType.extractorImage,
10235
- description: "Collapsible extractor images bit, used for images extracted from PDFs"
10715
+ description: "Collapsible extractor images bit, used for images extracted from PDFs",
10716
+ tags: [
10717
+ {
10718
+ key: ConfigKey.property_isCollapsible,
10719
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10720
+ format: TagFormat.boolean,
10721
+ defaultValue: "true"
10722
+ }
10723
+ ]
10236
10724
  },
10237
10725
  [BitType.extractorBlueprint]: {
10238
10726
  since: "5.12.0",
@@ -10287,7 +10775,8 @@ var BITS = {
10287
10775
  {
10288
10776
  key: ConfigKey.property_pageNo,
10289
10777
  description: "Page number for the block, used to indicate the page on which the block appears",
10290
- format: TagFormat.number
10778
+ format: TagFormat.number,
10779
+ nullable: true
10291
10780
  },
10292
10781
  {
10293
10782
  key: ConfigKey.property_x,
@@ -10304,17 +10793,20 @@ var BITS = {
10304
10793
  {
10305
10794
  key: ConfigKey.property_width,
10306
10795
  description: "Width of the block, used to define the size of the block on the page",
10307
- format: TagFormat.number
10796
+ format: TagFormat.number,
10797
+ nullable: true
10308
10798
  },
10309
10799
  {
10310
10800
  key: ConfigKey.property_height,
10311
10801
  description: "Height of the block, used to define the size of the block on the page",
10312
- format: TagFormat.number
10802
+ format: TagFormat.number,
10803
+ nullable: true
10313
10804
  },
10314
10805
  {
10315
10806
  key: ConfigKey.property_index,
10316
10807
  description: "Index of the block, used to order blocks within the extractor page",
10317
- format: TagFormat.number
10808
+ format: TagFormat.number,
10809
+ nullable: true
10318
10810
  },
10319
10811
  {
10320
10812
  key: ConfigKey.property_classification,
@@ -10365,8 +10857,17 @@ var BITS = {
10365
10857
  },
10366
10858
  [BitType.extractorPageNumberCollapsible]: {
10367
10859
  since: "1.30.0",
10860
+ deprecated: "5.37.0",
10368
10861
  baseBitType: BitType.extractorPageNumber,
10369
- description: "Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality"
10862
+ description: "Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality",
10863
+ tags: [
10864
+ {
10865
+ key: ConfigKey.property_isCollapsible,
10866
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10867
+ format: TagFormat.boolean,
10868
+ defaultValue: "true"
10869
+ }
10870
+ ]
10370
10871
  },
10371
10872
  [BitType.extractorPageHeader]: {
10372
10873
  since: "1.5.21",
@@ -10375,8 +10876,17 @@ var BITS = {
10375
10876
  },
10376
10877
  [BitType.extractorPageHeaderCollapsible]: {
10377
10878
  since: "1.30.0",
10879
+ deprecated: "5.37.0",
10378
10880
  baseBitType: BitType.extractorPageHeader,
10379
- description: "Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality"
10881
+ description: "Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality",
10882
+ tags: [
10883
+ {
10884
+ key: ConfigKey.property_isCollapsible,
10885
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10886
+ format: TagFormat.boolean,
10887
+ defaultValue: "true"
10888
+ }
10889
+ ]
10380
10890
  },
10381
10891
  [BitType.extractorPageFooter]: {
10382
10892
  since: "1.5.21",
@@ -10385,8 +10895,17 @@ var BITS = {
10385
10895
  },
10386
10896
  [BitType.extractorPageFooterCollapsible]: {
10387
10897
  since: "1.30.0",
10898
+ deprecated: "5.37.0",
10388
10899
  baseBitType: BitType.extractorPageFooter,
10389
- description: "Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality"
10900
+ description: "Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality",
10901
+ tags: [
10902
+ {
10903
+ key: ConfigKey.property_isCollapsible,
10904
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10905
+ format: TagFormat.boolean,
10906
+ defaultValue: "true"
10907
+ }
10908
+ ]
10390
10909
  },
10391
10910
  [BitType.pageOpenBook]: {
10392
10911
  since: "1.5.10",
@@ -10624,7 +11143,20 @@ var BITS = {
10624
11143
  [BitType.smartStandardLegendNormative]: {
10625
11144
  since: "3.12.0",
10626
11145
  baseBitType: BitType.legend,
10627
- description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books"
11146
+ description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books",
11147
+ // PLAN-141 F2 (NISO import): a free-standing <legend> (a formula's) or
11148
+ // bare <def-list> (a table footer's — no <legend> wrapper there) that is
11149
+ // NOT the claimed card content of its enclosing bit is a legend bit:
11150
+ // STRUCTURAL-shaped, its <title> and <def-item>s build the
11151
+ // definition-list cards via the card set's authored keys. A <legend>
11152
+ // inside a figure/table bit stays that bit's claimed card content and
11153
+ // never reaches this key. Anchor = the source id (D2 revised).
11154
+ mappingKeys: {
11155
+ "xml-niso-iec": [
11156
+ { "@el": "legend", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" },
11157
+ { "@el": "def-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11158
+ ]
11159
+ }
10628
11160
  },
10629
11161
  [BitType.smartStandardRemarkLegend]: {
10630
11162
  since: "3.12.0",
@@ -10663,8 +11195,17 @@ var BITS = {
10663
11195
  },
10664
11196
  [BitType.definitionListCollapsible]: {
10665
11197
  since: "5.25.0",
11198
+ deprecated: "5.37.0",
10666
11199
  baseBitType: BitType.definitionList,
10667
- description: "Collapsible definition list bit, used to create collapsible lists of definitions in articles or books"
11200
+ description: "Collapsible definition list bit, used to create collapsible lists of definitions in articles or books",
11201
+ tags: [
11202
+ {
11203
+ key: ConfigKey.property_isCollapsible,
11204
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11205
+ format: TagFormat.boolean,
11206
+ defaultValue: "true"
11207
+ }
11208
+ ]
10668
11209
  },
10669
11210
  [BitType.standardDefinitionListNormative]: {
10670
11211
  since: "5.24.0",
@@ -10679,7 +11220,16 @@ var BITS = {
10679
11220
  [BitType.smartStandardDefinitionListNormative]: {
10680
11221
  since: "5.24.0",
10681
11222
  baseBitType: BitType.standardDefinitionListNormative,
10682
- description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books"
11223
+ description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books",
11224
+ // PLAN-141 F3 (NISO import): a terms-and-definitions clause. STRUCTURAL-
11225
+ // shaped: <label> → [%], the tbx:termEntry/langSet subtree builds the
11226
+ // definition-list card via the card set's authored keys (all tig terms
11227
+ // stacked on the term side; definition/example/notes/source composed on
11228
+ // the definition side with authored locale affixes), langSet @xml:lang →
11229
+ // [@lang] (nested attr slot on the tag key). Anchor = the source id.
11230
+ mappingKeys: {
11231
+ "xml-niso-iec": { "@el": "term-sec", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11232
+ }
10683
11233
  },
10684
11234
  [BitType.smartStandardDefinitionListNonNormative]: {
10685
11235
  since: "5.24.0",
@@ -10748,12 +11298,14 @@ var BITS = {
10748
11298
  {
10749
11299
  key: ConfigKey.property_focusX,
10750
11300
  description: "X-coordinate for the focus point, used to define the focus area in the image",
10751
- format: TagFormat.number
11301
+ format: TagFormat.number,
11302
+ nullable: true
10752
11303
  },
10753
11304
  {
10754
11305
  key: ConfigKey.property_focusY,
10755
11306
  description: "Y-coordinate for the focus point, used to define the focus area in the image",
10756
- format: TagFormat.number
11307
+ format: TagFormat.number,
11308
+ nullable: true
10757
11309
  }
10758
11310
  ]
10759
11311
  },
@@ -10860,7 +11412,15 @@ var BITS = {
10860
11412
  [BitType.smartStandardImageFigureNormative]: {
10861
11413
  since: "1.28.0",
10862
11414
  baseBitType: BitType.standardImageFigureNormative,
10863
- description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books"
11415
+ description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books",
11416
+ // PLAN-141 F1 (NISO import): a figure is STRUCTURAL-shaped (no
11417
+ // @children — no body): <label> → [%], <caption>/<graphic> ride the
11418
+ // [&image] resource chain, the <legend> def-list becomes the bit's
11419
+ // definition-list cards, and an inner note PROMOTES as a sibling bit.
11420
+ // Anchor = the source id (D2 revised).
11421
+ mappingKeys: {
11422
+ "xml-niso-iec": { "@el": "fig", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11423
+ }
10864
11424
  },
10865
11425
  [BitType.smartStandardImageFigureNonNormative]: {
10866
11426
  since: "1.28.0",
@@ -10869,13 +11429,31 @@ var BITS = {
10869
11429
  },
10870
11430
  [BitType.smartStandardImageFigureNormativeCollapsible]: {
10871
11431
  since: "1.28.0",
11432
+ deprecated: "5.37.0",
10872
11433
  baseBitType: BitType.smartStandardImageFigureNormative,
10873
- description: "Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books"
11434
+ description: "Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books",
11435
+ tags: [
11436
+ {
11437
+ key: ConfigKey.property_isCollapsible,
11438
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11439
+ format: TagFormat.boolean,
11440
+ defaultValue: "true"
11441
+ }
11442
+ ]
10874
11443
  },
10875
11444
  [BitType.smartStandardImageFigureNonNormativeCollapsible]: {
10876
11445
  since: "1.28.0",
11446
+ deprecated: "5.37.0",
10877
11447
  baseBitType: BitType.smartStandardImageFigureNonNormative,
10878
- description: "Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books"
11448
+ description: "Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books",
11449
+ tags: [
11450
+ {
11451
+ key: ConfigKey.property_isCollapsible,
11452
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11453
+ format: TagFormat.boolean,
11454
+ defaultValue: "true"
11455
+ }
11456
+ ]
10879
11457
  },
10880
11458
  [BitType.imageLandscape]: {
10881
11459
  since: "1.3.0",
@@ -11087,43 +11665,115 @@ var BITS = {
11087
11665
  },
11088
11666
  [BitType.smartStandardTableImageNormativeCollapsible]: {
11089
11667
  since: "1.28.0",
11668
+ deprecated: "5.37.0",
11090
11669
  baseBitType: BitType.smartStandardTableImageNormative,
11091
- description: "Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books"
11670
+ description: "Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books",
11671
+ tags: [
11672
+ {
11673
+ key: ConfigKey.property_isCollapsible,
11674
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11675
+ format: TagFormat.boolean,
11676
+ defaultValue: "true"
11677
+ }
11678
+ ]
11092
11679
  },
11093
11680
  [BitType.smartStandardTableImageNonNormativeCollapsible]: {
11094
11681
  since: "1.28.0",
11682
+ deprecated: "5.37.0",
11095
11683
  baseBitType: BitType.smartStandardTableImageNonNormative,
11096
- description: "Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books"
11684
+ description: "Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books",
11685
+ tags: [
11686
+ {
11687
+ key: ConfigKey.property_isCollapsible,
11688
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11689
+ format: TagFormat.boolean,
11690
+ defaultValue: "true"
11691
+ }
11692
+ ]
11097
11693
  },
11098
11694
  [BitType.smartStandardRemarkTableImageNormativeCollapsible]: {
11099
11695
  since: "1.28.0",
11696
+ deprecated: "5.37.0",
11100
11697
  baseBitType: BitType.smartStandardRemarkTableImageNormative,
11101
- description: "Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books"
11698
+ description: "Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books",
11699
+ tags: [
11700
+ {
11701
+ key: ConfigKey.property_isCollapsible,
11702
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11703
+ format: TagFormat.boolean,
11704
+ defaultValue: "true"
11705
+ }
11706
+ ]
11102
11707
  },
11103
11708
  [BitType.smartStandardRemarkTableImageNonNormativeCollapsible]: {
11104
11709
  since: "1.28.0",
11710
+ deprecated: "5.37.0",
11105
11711
  baseBitType: BitType.smartStandardRemarkTableImageNonNormative,
11106
- description: "Collapsible smart standard non-normative remark table image bit, used to create collapsible smart standard non-normative remark images in tables in articles or books"
11712
+ description: "Collapsible smart standard non-normative remark table image bit, used to create collapsible smart standard non-normative remark images in tables in articles or books",
11713
+ tags: [
11714
+ {
11715
+ key: ConfigKey.property_isCollapsible,
11716
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11717
+ format: TagFormat.boolean,
11718
+ defaultValue: "true"
11719
+ }
11720
+ ]
11107
11721
  },
11108
11722
  [BitType.smartStandardTableExtendedImageNormativeCollapsible]: {
11109
11723
  since: "1.28.0",
11724
+ deprecated: "5.37.0",
11110
11725
  baseBitType: BitType.smartStandardTableExtendedImageNormative,
11111
- description: "Collapsible smart standard normative extended table image bit, used to create collapsible smart standard normative extended images in tables in articles or books"
11726
+ description: "Collapsible smart standard normative extended table image bit, used to create collapsible smart standard normative extended images in tables in articles or books",
11727
+ tags: [
11728
+ {
11729
+ key: ConfigKey.property_isCollapsible,
11730
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11731
+ format: TagFormat.boolean,
11732
+ defaultValue: "true"
11733
+ }
11734
+ ]
11112
11735
  },
11113
11736
  [BitType.smartStandardTableExtendedImageNonNormativeCollapsible]: {
11114
11737
  since: "1.28.0",
11738
+ deprecated: "5.37.0",
11115
11739
  baseBitType: BitType.smartStandardTableExtendedImageNonNormative,
11116
- description: "Collapsible smart standard non-normative extended table image bit, used to create collapsible smart standard non-normative extended images in tables in articles or books"
11740
+ description: "Collapsible smart standard non-normative extended table image bit, used to create collapsible smart standard non-normative extended images in tables in articles or books",
11741
+ tags: [
11742
+ {
11743
+ key: ConfigKey.property_isCollapsible,
11744
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11745
+ format: TagFormat.boolean,
11746
+ defaultValue: "true"
11747
+ }
11748
+ ]
11117
11749
  },
11118
11750
  [BitType.smartStandardRemarkTableExtendedImageNormativeCollapsible]: {
11119
11751
  since: "1.28.0",
11752
+ deprecated: "5.37.0",
11120
11753
  baseBitType: BitType.smartStandardRemarkTableExtendedImageNormative,
11121
- description: "Collapsible smart standard normative remark extended table image bit, used to create collapsible smart standard normative remark extended images in tables in articles or books"
11754
+ description: "Collapsible smart standard normative remark extended table image bit, used to create collapsible smart standard normative remark extended images in tables in articles or books",
11755
+ tags: [
11756
+ {
11757
+ key: ConfigKey.property_isCollapsible,
11758
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11759
+ format: TagFormat.boolean,
11760
+ defaultValue: "true"
11761
+ }
11762
+ ]
11122
11763
  },
11123
11764
  [BitType.smartStandardRemarkTableExtendedImageNonNormativeCollapsible]: {
11124
11765
  since: "1.28.0",
11766
+ deprecated: "5.37.0",
11125
11767
  baseBitType: BitType.smartStandardRemarkTableExtendedImageNonNormative,
11126
- description: "Collapsible smart standard non-normative remark extended table image bit, used to create collapsible smart standard non-normative remark extended images in tables in articles or books"
11768
+ description: "Collapsible smart standard non-normative remark extended table image bit, used to create collapsible smart standard non-normative remark extended images in tables in articles or books",
11769
+ tags: [
11770
+ {
11771
+ key: ConfigKey.property_isCollapsible,
11772
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11773
+ format: TagFormat.boolean,
11774
+ defaultValue: "true"
11775
+ }
11776
+ ]
11127
11777
  },
11128
11778
  [BitType.imageLink]: {
11129
11779
  since: "1.3.0",
@@ -11588,12 +12238,33 @@ var BITS = {
11588
12238
  [BitType.smartStandardListItem]: {
11589
12239
  since: "1.28.0",
11590
12240
  baseBitType: BitType.standardListItem,
11591
- description: "Smart standard list item bit, used to create smart standard list items in articles or books"
12241
+ description: "Smart standard list item bit, used to create smart standard list items in articles or books",
12242
+ // PLAN-140 refs family (NISO import): one list-item bit per <ref> —
12243
+ // CONTENT key (its citation subtree is the body), counter anchor scoped
12244
+ // to the containing list, <label> → [%], nested <std-id> → [@externalId]
12245
+ // (the externalId tag key's nested content slot).
12246
+ mappingKeys: {
12247
+ "xml-niso-iec": {
12248
+ "@el": "ref",
12249
+ "@attr": { id: "$customerId" },
12250
+ "@children": "$",
12251
+ "\u25BC": "$anchor"
12252
+ }
12253
+ }
11592
12254
  },
11593
12255
  [BitType.smartStandardListItemCollapsible]: {
11594
12256
  since: "1.28.0",
12257
+ deprecated: "5.37.0",
11595
12258
  baseBitType: BitType.smartStandardListItem,
11596
- description: "Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books"
12259
+ description: "Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books",
12260
+ tags: [
12261
+ {
12262
+ key: ConfigKey.property_isCollapsible,
12263
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
12264
+ format: TagFormat.boolean,
12265
+ defaultValue: "true"
12266
+ }
12267
+ ]
11597
12268
  },
11598
12269
  [BitType.mark]: {
11599
12270
  since: "1.3.0",
@@ -11926,8 +12597,17 @@ var BITS = {
11926
12597
  },
11927
12598
  [BitType.pageCollapsible]: {
11928
12599
  since: "1.30.0",
12600
+ deprecated: "5.37.0",
11929
12601
  baseBitType: BitType.page,
11930
- description: "Collapsible page bit, used to create collapsible sections in pages"
12602
+ description: "Collapsible page bit, used to create collapsible sections in pages",
12603
+ tags: [
12604
+ {
12605
+ key: ConfigKey.property_isCollapsible,
12606
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
12607
+ format: TagFormat.boolean,
12608
+ defaultValue: "true"
12609
+ }
12610
+ ]
11931
12611
  },
11932
12612
  [BitType.pageCoverImage]: {
11933
12613
  since: "1.22.0",
@@ -12695,7 +13375,13 @@ var BITS = {
12695
13375
  // `<caption>` — placed inside the idiomatic `<table>` container as
12696
13376
  // its first child. Outside a table context it falls back to the
12697
13377
  // residual carrier.
12698
- htmlKey: { "@el": "caption", "@children": "$" }
13378
+ htmlKey: { "@el": "caption", "@children": "$" },
13379
+ // PLAN-141 F2 (NISO import): a table-wrap's <caption><title> — the
13380
+ // nested content slot reads the title text (catalog D5: the caption
13381
+ // is a TOP-LEVEL bit property on table bits).
13382
+ mappingKeys: {
13383
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
13384
+ }
12699
13385
  },
12700
13386
  {
12701
13387
  key: ConfigKey.property_tableFixedHeader,
@@ -12868,7 +13554,16 @@ var BITS = {
12868
13554
  [BitType.smartStandardTableExtendedNormative]: {
12869
13555
  since: "1.28.0",
12870
13556
  baseBitType: BitType.standardTableExtendedNormative,
12871
- description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books"
13557
+ description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books",
13558
+ // PLAN-141 F2 (NISO import): a table-wrap is STRUCTURAL-shaped (no
13559
+ // @children — no body): <label> → [%], <caption><title> → the bit-level
13560
+ // [@caption] (D5), the inner <table>/<table-wrap-foot> build the
13561
+ // table-extended card grid via the card set's authored keys, and a
13562
+ // footer <def-list> PROMOTES as a sibling legend bit. Anchor = the
13563
+ // source id (D2 revised).
13564
+ mappingKeys: {
13565
+ "xml-niso-iec": { "@el": "table-wrap", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
13566
+ }
12872
13567
  },
12873
13568
  [BitType.smartStandardTableExtendedNonNormative]: {
12874
13569
  since: "1.28.0",
@@ -12887,43 +13582,115 @@ var BITS = {
12887
13582
  },
12888
13583
  [BitType.smartStandardTableNormativeCollapsible]: {
12889
13584
  since: "1.28.0",
13585
+ deprecated: "5.37.0",
12890
13586
  baseBitType: BitType.smartStandardTableNormative,
12891
- description: "Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books"
13587
+ description: "Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books",
13588
+ tags: [
13589
+ {
13590
+ key: ConfigKey.property_isCollapsible,
13591
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13592
+ format: TagFormat.boolean,
13593
+ defaultValue: "true"
13594
+ }
13595
+ ]
12892
13596
  },
12893
13597
  [BitType.smartStandardTableNonNormativeCollapsible]: {
12894
13598
  since: "1.28.0",
13599
+ deprecated: "5.37.0",
12895
13600
  baseBitType: BitType.smartStandardTableNonNormative,
12896
- description: "Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books"
13601
+ description: "Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books",
13602
+ tags: [
13603
+ {
13604
+ key: ConfigKey.property_isCollapsible,
13605
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13606
+ format: TagFormat.boolean,
13607
+ defaultValue: "true"
13608
+ }
13609
+ ]
12897
13610
  },
12898
13611
  [BitType.smartStandardRemarkTableNormativeCollapsible]: {
12899
13612
  since: "1.28.0",
13613
+ deprecated: "5.37.0",
12900
13614
  baseBitType: BitType.smartStandardRemarkTableNormative,
12901
- description: "Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books"
13615
+ description: "Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books",
13616
+ tags: [
13617
+ {
13618
+ key: ConfigKey.property_isCollapsible,
13619
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13620
+ format: TagFormat.boolean,
13621
+ defaultValue: "true"
13622
+ }
13623
+ ]
12902
13624
  },
12903
13625
  [BitType.smartStandardRemarkTableNonNormativeCollapsible]: {
12904
13626
  since: "1.28.0",
13627
+ deprecated: "5.37.0",
12905
13628
  baseBitType: BitType.smartStandardRemarkTableNonNormative,
12906
- description: "Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books"
13629
+ description: "Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books",
13630
+ tags: [
13631
+ {
13632
+ key: ConfigKey.property_isCollapsible,
13633
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13634
+ format: TagFormat.boolean,
13635
+ defaultValue: "true"
13636
+ }
13637
+ ]
12907
13638
  },
12908
13639
  [BitType.smartStandardTableExtendedNormativeCollapsible]: {
12909
13640
  since: "1.28.0",
13641
+ deprecated: "5.37.0",
12910
13642
  baseBitType: BitType.smartStandardTableExtendedNormative,
12911
- description: "Collapsible smart standard normative extended table bit, used to create collapsible smart standard normative extended tables in articles or books"
13643
+ description: "Collapsible smart standard normative extended table bit, used to create collapsible smart standard normative extended tables in articles or books",
13644
+ tags: [
13645
+ {
13646
+ key: ConfigKey.property_isCollapsible,
13647
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13648
+ format: TagFormat.boolean,
13649
+ defaultValue: "true"
13650
+ }
13651
+ ]
12912
13652
  },
12913
13653
  [BitType.smartStandardTableExtendedNonNormativeCollapsible]: {
12914
13654
  since: "1.28.0",
13655
+ deprecated: "5.37.0",
12915
13656
  baseBitType: BitType.smartStandardTableExtendedNonNormative,
12916
- description: "Collapsible smart standard non-normative extended table bit, used to create collapsible smart standard non-normative extended tables in articles or books"
13657
+ description: "Collapsible smart standard non-normative extended table bit, used to create collapsible smart standard non-normative extended tables in articles or books",
13658
+ tags: [
13659
+ {
13660
+ key: ConfigKey.property_isCollapsible,
13661
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13662
+ format: TagFormat.boolean,
13663
+ defaultValue: "true"
13664
+ }
13665
+ ]
12917
13666
  },
12918
13667
  [BitType.smartStandardRemarkTableExtendedNormativeCollapsible]: {
12919
13668
  since: "1.28.0",
13669
+ deprecated: "5.37.0",
12920
13670
  baseBitType: BitType.smartStandardRemarkTableExtendedNormative,
12921
- description: "Collapsible smart standard normative remark extended table bit, used to create collapsible smart standard normative remark extended tables in articles or books"
13671
+ description: "Collapsible smart standard normative remark extended table bit, used to create collapsible smart standard normative remark extended tables in articles or books",
13672
+ tags: [
13673
+ {
13674
+ key: ConfigKey.property_isCollapsible,
13675
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13676
+ format: TagFormat.boolean,
13677
+ defaultValue: "true"
13678
+ }
13679
+ ]
12922
13680
  },
12923
13681
  [BitType.smartStandardRemarkTableExtendedNonNormativeCollapsible]: {
12924
13682
  since: "1.28.0",
13683
+ deprecated: "5.37.0",
12925
13684
  baseBitType: BitType.smartStandardRemarkTableExtendedNonNormative,
12926
- description: "Collapsible smart standard non-normative remark extended table bit, used to create collapsible smart standard non-normative remark extended tables in articles or books"
13685
+ description: "Collapsible smart standard non-normative remark extended table bit, used to create collapsible smart standard non-normative remark extended tables in articles or books",
13686
+ tags: [
13687
+ {
13688
+ key: ConfigKey.property_isCollapsible,
13689
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13690
+ format: TagFormat.boolean,
13691
+ defaultValue: "true"
13692
+ }
13693
+ ]
12927
13694
  },
12928
13695
  [BitType.parameters]: {
12929
13696
  since: "1.18.0",
@@ -12943,7 +13710,8 @@ var BITS = {
12943
13710
  {
12944
13711
  key: ConfigKey.property_maxDisplayLevel,
12945
13712
  description: "Maximum display level for the chapter in the table of contents",
12946
- format: TagFormat.number
13713
+ format: TagFormat.number,
13714
+ nullable: true
12947
13715
  }
12948
13716
  ]
12949
13717
  },
@@ -12955,7 +13723,8 @@ var BITS = {
12955
13723
  {
12956
13724
  key: ConfigKey.property_maxTocChapterLevel,
12957
13725
  description: "Maximum chapter level for the inline table of contents",
12958
- format: TagFormat.number
13726
+ format: TagFormat.number,
13727
+ nullable: true
12959
13728
  }
12960
13729
  ]
12961
13730
  },
@@ -13378,13 +14147,15 @@ var BITS = {
13378
14147
  key: ConfigKey.property_width,
13379
14148
  // Same as image
13380
14149
  description: "Width for the embedded content, used to define the width in pixels",
13381
- format: TagFormat.number
14150
+ format: TagFormat.number,
14151
+ nullable: true
13382
14152
  },
13383
14153
  {
13384
14154
  key: ConfigKey.property_height,
13385
14155
  // Same as image
13386
14156
  description: "Height for the embedded content, used to define the height in pixels",
13387
- format: TagFormat.number
14157
+ format: TagFormat.number,
14158
+ nullable: true
13388
14159
  },
13389
14160
  {
13390
14161
  key: ConfigKey.property_vendorUrl,
@@ -13422,7 +14193,8 @@ var BITS = {
13422
14193
  {
13423
14194
  key: ConfigKey.property_jupyterExecutionCount,
13424
14195
  description: "Execution count for the Jupyter output, used to define the execution order",
13425
- format: TagFormat.number
14196
+ format: TagFormat.number,
14197
+ nullable: true
13426
14198
  }
13427
14199
  ],
13428
14200
  textFormatDefault: TextFormat.plainText
@@ -13630,10 +14402,12 @@ var BITS = {
13630
14402
  };
13631
14403
 
13632
14404
  // src/config/Config.ts
14405
+ var COLLAPSIBLE_BIT_TYPE_SUFFIX = "-collapsible";
13633
14406
  var Config = class {
13634
14407
  bitLevelMin = 1;
13635
14408
  bitLevelMax = 7;
13636
14409
  bitCache = /* @__PURE__ */ new Map();
14410
+ migratedBitCache = /* @__PURE__ */ new Map();
13637
14411
  allResourcesCache;
13638
14412
  comboResourcesCache = /* @__PURE__ */ new Map();
13639
14413
  constructor() {
@@ -13650,6 +14424,29 @@ var Config = class {
13650
14424
  if (bitType?.startsWith("|")) bitType = bitType.substring(1);
13651
14425
  return Enum(BitType).fromValue(bitType) ?? BitType._error;
13652
14426
  }
14427
+ /**
14428
+ * PLAN-017: Return the migration target for a deprecated `*-collapsible` bit type.
14429
+ *
14430
+ * Every `*-collapsible` bit type declares its non-collapsible cousin as its `baseBitType`, so the
14431
+ * target is read from the config rather than a hand-maintained table — a new `*-collapsible` bit
14432
+ * type is covered automatically.
14433
+ *
14434
+ * `BitType.collapsible` is the one exclusion: it has no non-collapsible cousin (its `baseBitType`
14435
+ * is `article`, which is not a migration target).
14436
+ *
14437
+ * @param bitType the bit type
14438
+ * @returns the bit type to migrate to, or undefined if the bit type does not migrate
14439
+ */
14440
+ getMigratedBitType(bitType) {
14441
+ const cached = this.migratedBitCache.get(bitType);
14442
+ if (cached !== void 0 || this.migratedBitCache.has(bitType)) return cached;
14443
+ let target;
14444
+ if (bitType !== BitType.collapsible && bitType.endsWith(COLLAPSIBLE_BIT_TYPE_SUFFIX)) {
14445
+ target = BITS[bitType]?.baseBitType;
14446
+ }
14447
+ this.migratedBitCache.set(bitType, target);
14448
+ return target;
14449
+ }
13653
14450
  /**
13654
14451
  * Check if a bit type is and instance of the given root bit type.
13655
14452
  *
@@ -13972,7 +14769,7 @@ var instance2 = new Config();
13972
14769
  // src/generated/package_info.ts
13973
14770
  var PACKAGE_INFO = {
13974
14771
  "name": "@gmb/bitmark-parser-generator",
13975
- "version": "5.35.0",
14772
+ "version": "5.37.0",
13976
14773
  "license": "ISC"};
13977
14774
  var Environment = {
13978
14775
  unknown: "",
@@ -14469,6 +15266,8 @@ var NodeType = {
14469
15266
  definition: "definition",
14470
15267
  definitions: "definitions",
14471
15268
  definitionsValue: "definitionsValue",
15269
+ displayName: "displayName",
15270
+ displayNameValue: "displayNameValue",
14472
15271
  diffContext: "diffContext",
14473
15272
  diffContextValue: "diffContextValue",
14474
15273
  diffOp: "diffOp",
@@ -14997,6 +15796,8 @@ var NodeType = {
14997
15796
  type: "type",
14998
15797
  unit: "unit",
14999
15798
  unitAbbr: "unitAbbr",
15799
+ unitAbbrPlural: "unitAbbrPlural",
15800
+ unitPlural: "unitPlural",
15000
15801
  url: "url",
15001
15802
  validationDate: "validationDate",
15002
15803
  validationDateValue: "validationDateValue",
@@ -27987,8 +28788,14 @@ var Builder = class extends BaseBuilder {
27987
28788
  */
27988
28789
  buildBit(data, options) {
27989
28790
  data = structuredClone(data);
28791
+ const migratedBitType = instance2.getMigratedBitType(data.bitType);
28792
+ if (migratedBitType) {
28793
+ data.bitType = migratedBitType;
28794
+ data.isCollapsible = data.isCollapsible ?? true;
28795
+ }
27990
28796
  const bitType = data.bitType;
27991
28797
  const bitConfig = instance2.getBitConfig(bitType);
28798
+ const isCollapsibleDefaultsTrue = bitConfig.tags[ConfigKey.property_isCollapsible]?.defaultValue === "true";
27992
28799
  const deprecatedTextFormat = Enum(DeprecatedTextFormat).fromValue(data.textFormat);
27993
28800
  let textFormat = Enum(TextFormat).fromValue(data.textFormat) ?? bitConfig.textFormatDefault;
27994
28801
  if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {
@@ -28206,6 +29013,12 @@ var Builder = class extends BaseBuilder {
28206
29013
  data.publisherName,
28207
29014
  options
28208
29015
  ),
29016
+ displayName: this.toAstProperty(
29017
+ bitType,
29018
+ ConfigKey.property_displayName,
29019
+ data.displayName,
29020
+ options
29021
+ ),
28209
29022
  theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),
28210
29023
  rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),
28211
29024
  computerLanguage: this.toAstProperty(
@@ -29115,7 +29928,7 @@ var Builder = class extends BaseBuilder {
29115
29928
  isCollapsible: this.toAstProperty(
29116
29929
  bitType,
29117
29930
  ConfigKey.property_isCollapsible,
29118
- data.isCollapsible,
29931
+ data.isCollapsible ?? (isCollapsibleDefaultsTrue ? true : void 0),
29119
29932
  options
29120
29933
  ),
29121
29934
  anchor: data.anchor,
@@ -29884,7 +30697,9 @@ var Builder = class extends BaseBuilder {
29884
30697
  ingredient: this.handleJsonText(context, TextLocation.tag, data.ingredient),
29885
30698
  quantity: data.quantity ?? 0,
29886
30699
  unit: data.unit ?? "",
30700
+ unitPlural: data.unitPlural ?? "",
29887
30701
  unitAbbr: data.unitAbbr ?? "",
30702
+ unitAbbrPlural: data.unitAbbrPlural ?? "",
29888
30703
  decimalPlaces: data.decimalPlaces ?? 1,
29889
30704
  disableCalculation: data.disableCalculation ?? false,
29890
30705
  item: this.handleJsonText(context, TextLocation.tag, data.item),
@@ -30479,11 +31294,22 @@ var Builder = class extends BaseBuilder {
30479
31294
  */
30480
31295
  buildServings(_context, data) {
30481
31296
  if (!data) return void 0;
30482
- const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = data;
31297
+ const {
31298
+ servings,
31299
+ unit,
31300
+ unitPlural,
31301
+ unitAbbr,
31302
+ unitAbbrPlural,
31303
+ decimalPlaces,
31304
+ disableCalculation,
31305
+ hint
31306
+ } = data;
30483
31307
  const node = {
30484
31308
  servings: servings ?? 0,
30485
31309
  unit: unit ?? "",
31310
+ unitPlural: unitPlural ?? "",
30486
31311
  unitAbbr: unitAbbr ?? "",
31312
+ unitAbbrPlural: unitAbbrPlural ?? "",
30487
31313
  decimalPlaces: decimalPlaces ?? 1,
30488
31314
  disableCalculation: disableCalculation ?? false,
30489
31315
  hint: hint ?? ""
@@ -31409,7 +32235,16 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
31409
32235
  const nodeValue = node.value;
31410
32236
  const parent = this.getParentNode(route);
31411
32237
  if (parent?.key !== NodeType.bitsValue) return true;
31412
- const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = nodeValue;
32238
+ const {
32239
+ servings,
32240
+ unit,
32241
+ unitPlural,
32242
+ unitAbbr,
32243
+ unitAbbrPlural,
32244
+ decimalPlaces,
32245
+ disableCalculation,
32246
+ hint
32247
+ } = nodeValue;
31413
32248
  this.writeProperty("servings", servings, route, {
31414
32249
  format: TagFormat.plainText
31415
32250
  });
@@ -31419,12 +32254,24 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
31419
32254
  forceChain: true
31420
32255
  });
31421
32256
  }
32257
+ if (unitPlural != null) {
32258
+ this.writeProperty("unitPlural", unitPlural, route, {
32259
+ format: TagFormat.plainText,
32260
+ forceChain: true
32261
+ });
32262
+ }
31422
32263
  if (unitAbbr != null) {
31423
32264
  this.writeProperty("unitAbbr", unitAbbr, route, {
31424
32265
  format: TagFormat.plainText,
31425
32266
  forceChain: true
31426
32267
  });
31427
32268
  }
32269
+ if (unitAbbrPlural != null) {
32270
+ this.writeProperty("unitAbbrPlural", unitAbbrPlural, route, {
32271
+ format: TagFormat.plainText,
32272
+ forceChain: true
32273
+ });
32274
+ }
31428
32275
  if (decimalPlaces != null) {
31429
32276
  this.writeProperty("decimalPlaces", decimalPlaces, route, {
31430
32277
  format: TagFormat.plainText,
@@ -32268,10 +33115,18 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
32268
33115
  this.writeProperty("unit", ingredient.unit, route, {
32269
33116
  format: TagFormat.plainText
32270
33117
  });
33118
+ if (ingredient.unitPlural != null)
33119
+ this.writeProperty("unitPlural", ingredient.unitPlural, route, {
33120
+ format: TagFormat.plainText
33121
+ });
32271
33122
  if (ingredient.unitAbbr != null)
32272
33123
  this.writeProperty("unitAbbr", ingredient.unitAbbr, route, {
32273
33124
  format: TagFormat.plainText
32274
33125
  });
33126
+ if (ingredient.unitAbbrPlural != null)
33127
+ this.writeProperty("unitAbbrPlural", ingredient.unitAbbrPlural, route, {
33128
+ format: TagFormat.plainText
33129
+ });
32275
33130
  if (ingredient.decimalPlaces != null)
32276
33131
  this.writeProperty("decimalPlaces", ingredient.decimalPlaces, route, {
32277
33132
  format: TagFormat.plainText
@@ -34041,6 +34896,25 @@ var JsonGenerator = class extends AstWalkerGenerator {
34041
34896
  }
34042
34897
  return false;
34043
34898
  }
34899
+ // bitmarkAst -> bits -> bitsValue -> isCollapsible
34900
+ /**
34901
+ * PLAN-016: `isCollapsible` is emitted only when true. `false` is the implied
34902
+ * default for every bit, so it is never written to the JSON — an absent key
34903
+ * means the bit's configured default (`true` for the deprecated
34904
+ * `*-collapsible` bit types, `false` everywhere else).
34905
+ *
34906
+ * Defining these handlers suppresses the generic property handlers that
34907
+ * `generatePropertyHandlers()` would otherwise install for this tag.
34908
+ */
34909
+ leaf_isCollapsible(node, route) {
34910
+ const parent = this.getParentNode(route);
34911
+ if (parent?.key !== NodeType.bitsValue) return false;
34912
+ if (node.value === true) this.bitJson.isCollapsible = true;
34913
+ return false;
34914
+ }
34915
+ enter_isCollapsible(node, route) {
34916
+ return this.leaf_isCollapsible(node, route);
34917
+ }
34044
34918
  // bitmarkAst -> bits -> bitsValue -> markConfig
34045
34919
  enter_markConfig(_node, _route) {
34046
34920
  return true;
@@ -34912,7 +35786,6 @@ var JsonGenerator = class extends AstWalkerGenerator {
34912
35786
  if (instance2.isOfBitType(bitType, BitType.chapter)) {
34913
35787
  if (bitJson.toc == null) bitJson.toc = true;
34914
35788
  if (bitJson.progress == null) bitJson.progress = true;
34915
- if (bitJson.isCollapsible == null) bitJson.isCollapsible = false;
34916
35789
  if (bitJson.level == null) bitJson.level = 1;
34917
35790
  if (bitJson.body == null) bitJson.body = this.bodyDefault;
34918
35791
  }
@@ -37817,7 +38690,9 @@ function parseIngredients(_context, _bitType, cardSet) {
37817
38690
  title: titleArray,
37818
38691
  __instructionString,
37819
38692
  unit,
38693
+ unitPlural,
37820
38694
  unitAbbr,
38695
+ unitAbbrPlural,
37821
38696
  decimalPlaces,
37822
38697
  disableCalculation,
37823
38698
  cardBodyStr,
@@ -37847,7 +38722,9 @@ function parseIngredients(_context, _bitType, cardSet) {
37847
38722
  ingredient: cardBodyStr,
37848
38723
  quantity,
37849
38724
  unit: unit ?? instance3.EMPTY_STRING,
38725
+ unitPlural,
37850
38726
  unitAbbr: unitAbbr ?? instance3.EMPTY_STRING,
38727
+ unitAbbrPlural,
37851
38728
  decimalPlaces: decimalPlaces ?? 1,
37852
38729
  disableCalculation,
37853
38730
  ...tags2
@@ -38497,12 +39374,22 @@ function servingsChainContentProcessor(context, _contentDepth, tagsConfig, conte
38497
39374
  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint("servings content", content);
38498
39375
  const tags2 = context.bitContentProcessor(ContentDepth.Chain, tagsConfig, content.chain);
38499
39376
  if (context.DEBUG_CHAIN_TAGS) context.debugPrint("servings TAGS", tags2);
38500
- const { unit, unitAbbr, decimalPlaces, disableCalculation, __hintString } = tags2;
39377
+ const {
39378
+ unit,
39379
+ unitPlural,
39380
+ unitAbbr,
39381
+ unitAbbrPlural,
39382
+ decimalPlaces,
39383
+ disableCalculation,
39384
+ __hintString
39385
+ } = tags2;
38501
39386
  const servings = instance6.asNumber(content.value) ?? 1;
38502
39387
  const node = {
38503
39388
  servings,
38504
39389
  unit,
39390
+ unitPlural,
38505
39391
  unitAbbr,
39392
+ unitAbbrPlural,
38506
39393
  decimalPlaces: decimalPlaces ?? 1,
38507
39394
  disableCalculation,
38508
39395
  hint: __hintString
@@ -44171,7 +45058,7 @@ var ConfigBuilder = class {
44171
45058
  }
44172
45059
  const outputFolder = opts.outputDir ?? "assets/config";
44173
45060
  const outputFolderBits = path3.join(outputFolder, "bits");
44174
- const outputFolderGroups = path3.join(outputFolder, "partials");
45061
+ const outputFolderGroups = path3.join(outputFolder, "groups");
44175
45062
  const outputFolderCards = path3.join(outputFolder, "cards");
44176
45063
  fs4.ensureDirSync(outputFolderBits);
44177
45064
  fs4.ensureDirSync(outputFolderGroups);
@@ -44206,6 +45093,15 @@ var ConfigBuilder = class {
44206
45093
  }
44207
45094
  return [{ key: groupKey }];
44208
45095
  };
45096
+ const mappingKeysField = (base, json, html) => {
45097
+ const record = {};
45098
+ for (const [id, value] of Object.entries(base ?? {})) {
45099
+ if (value != null) record[id] = value;
45100
+ }
45101
+ if (json.present && json.value != null) record.json = json.value;
45102
+ if (html.present && html.value != null) record.html = html.value;
45103
+ return Object.keys(record).length > 0 ? { mappingKeys: record } : {};
45104
+ };
44209
45105
  const bareKeyForProperty = (key) => {
44210
45106
  if (key.startsWith("@") || key.startsWith("&")) return key.substring(1);
44211
45107
  return void 0;
@@ -44226,22 +45122,20 @@ var ConfigBuilder = class {
44226
45122
  if (tag.format === TagFormat.plainText) {
44227
45123
  format = "string";
44228
45124
  } else if (tag.format === TagFormat.boolean) {
44229
- format = "bool";
44230
- } else if (tag.format === TagFormat.bitmarkText) {
44231
- format = "bitmark";
45125
+ format = "boolean";
44232
45126
  } else if (tag.format === TagFormat.number) {
44233
45127
  format = "number";
44234
45128
  } else {
44235
- format = "bitmark--";
45129
+ format = "bitmark+";
44236
45130
  }
44237
45131
  } else if (tagType === BitTagConfigKeyType.property) {
44238
45132
  tagName = tag.key;
44239
45133
  if (tag.format === TagFormat.plainText) {
44240
45134
  format = "string";
44241
45135
  } else if (tag.format === TagFormat.boolean) {
44242
- format = "bool";
45136
+ format = "boolean";
44243
45137
  } else if (tag.format === TagFormat.bitmarkText) {
44244
- format = "bitmark";
45138
+ format = "bitmark+";
44245
45139
  } else if (tag.format === TagFormat.number) {
44246
45140
  format = "number";
44247
45141
  } else if (tag.format === TagFormat.coordinates) {
@@ -44273,8 +45167,11 @@ var ConfigBuilder = class {
44273
45167
  tags2.push({
44274
45168
  type: "group",
44275
45169
  key: ref.key,
44276
- ...hasExportChosen ? { jsonKey: exportJsonKeyChosen } : {},
44277
- ...hasHtmlChosen ? { htmlKey: htmlKeyChosen } : {},
45170
+ ...mappingKeysField(
45171
+ { ...ref.extraKeys ?? {}, ...tag.mappingKeys ?? {} },
45172
+ { value: exportJsonKeyChosen, present: hasExportChosen },
45173
+ { value: htmlKeyChosen, present: hasHtmlChosen }
45174
+ ),
44278
45175
  ...min != null ? { min } : {},
44279
45176
  ...max != null ? { max } : {},
44280
45177
  ...description ? { description } : {}
@@ -44291,53 +45188,48 @@ var ConfigBuilder = class {
44291
45188
  chain = chainTags;
44292
45189
  }
44293
45190
  const hasExport = Object.prototype.hasOwnProperty.call(tag, "exportJsonKey");
44294
- let exportJsonKeyField;
44295
- if (hasExport) {
44296
- exportJsonKeyField = { jsonKey: tag.exportJsonKey };
44297
- } else if (legacyIsTrivialDefault(tag)) {
44298
- exportJsonKeyField = {};
44299
- } else {
45191
+ if (!hasExport && !legacyIsTrivialDefault(tag)) {
44300
45192
  const headingPath = [...pathStack, `tags.${tag.key}`].join(" / ");
44301
45193
  exportJsonKeyErrors.push(
44302
45194
  `Missing exportJsonKey for non-default jsonKey at ${headingPath}` + (tag.jsonKey ? ` (legacy: \`${tag.jsonKey}\`)` : ` (symbol-mapped tag \`${tag.key}\`)`)
44303
45195
  );
44304
- exportJsonKeyField = {};
44305
45196
  }
44306
45197
  const hasHtml = Object.prototype.hasOwnProperty.call(tag, "htmlKey");
44307
- const htmlKeyField = hasHtml ? { htmlKey: tag.htmlKey } : {};
44308
45198
  const t = {
44309
45199
  type: "tag",
44310
45200
  key: tagName,
44311
- ...exportJsonKeyField,
44312
- ...htmlKeyField,
44313
- format,
44314
- default: tag.defaultValue ?? null,
45201
+ ...mappingKeysField(
45202
+ tag.mappingKeys,
45203
+ { value: tag.exportJsonKey, present: hasExport },
45204
+ { value: tag.htmlKey, present: hasHtml }
45205
+ ),
45206
+ ...format && format !== "string" ? { format } : {},
45207
+ ...tag.defaultValue != null ? { default: tag.defaultValue } : {},
44315
45208
  ...tag.nullable ? { nullable: true } : {},
44316
- min: tag.minCount == null ? 0 : tag.minCount,
44317
- max: tag.maxCount == null ? 1 : tag.maxCount,
45209
+ ...tag.minCount != null && tag.minCount !== 0 ? { min: tag.minCount } : {},
45210
+ ...tag.maxCount != null && tag.maxCount !== 1 ? { max: tag.maxCount } : {},
44318
45211
  description: tag.description ?? "",
44319
45212
  tags: chain
44320
45213
  };
44321
45214
  tags2.push(t);
44322
45215
  return tags2;
44323
45216
  };
44324
- const cardJsonKeyField = (container, legacyKey, exportKey, pathHeading) => {
45217
+ const cardMappingKeysField = (container, base, legacyKey, exportKey, htmlExportKey, pathHeading) => {
44325
45218
  const c = container;
44326
45219
  const hasExport = Object.prototype.hasOwnProperty.call(c, exportKey);
44327
- if (hasExport) return { jsonKey: c[exportKey] };
44328
- const legacy = c[legacyKey];
44329
- if (legacy == null) return {};
44330
- exportJsonKeyErrors.push(
44331
- `Missing exportJsonKey for non-default jsonKey at ${pathHeading} (legacy: \`${legacy}\`)`
44332
- );
44333
- return {};
44334
- };
44335
- const cardHtmlKeyField = (container, htmlExportKey) => {
44336
- const c = container;
44337
- if (Object.prototype.hasOwnProperty.call(c, htmlExportKey)) {
44338
- return { htmlKey: c[htmlExportKey] };
45220
+ if (!hasExport && c[legacyKey] != null) {
45221
+ exportJsonKeyErrors.push(
45222
+ `Missing exportJsonKey for non-default jsonKey at ${pathHeading} (legacy: \`${c[legacyKey]}\`)`
45223
+ );
44339
45224
  }
44340
- return {};
45225
+ return mappingKeysField(
45226
+ base,
45227
+ { value: c[exportKey], present: hasExport },
45228
+ {
45229
+ value: c[htmlExportKey],
45230
+ present: Object.prototype.hasOwnProperty.call(c, htmlExportKey)
45231
+ }
45232
+ );
44341
45233
  };
44342
45234
  const serializeCardSet = (cardSetKey) => {
44343
45235
  const variantBodyFormat = (variant) => variant.format ?? TextFormat.bitmarkText;
@@ -44368,11 +45260,17 @@ var ConfigBuilder = class {
44368
45260
  variantTags.push(...processTagEntries(variantTag, [variantPath]));
44369
45261
  }
44370
45262
  return {
44371
- ...cardJsonKeyField(variant, "jsonKey", "exportJsonKey", variantPath),
44372
- ...cardHtmlKeyField(variant, "htmlKey"),
44373
- format: variantBodyFormat(variant),
45263
+ ...cardMappingKeysField(
45264
+ variant,
45265
+ void 0,
45266
+ "jsonKey",
45267
+ "exportJsonKey",
45268
+ "htmlKey",
45269
+ variantPath
45270
+ ),
45271
+ bodyFormat: variantBodyFormat(variant),
44374
45272
  tags: variantTags,
44375
- repeatCount: variant.repeatCount ?? 1,
45273
+ ...variant.repeatCount != null && variant.repeatCount !== 1 ? { repeatCount: variant.repeatCount } : {},
44376
45274
  ...variant.bodyRequired ? { bodyRequired: true } : {},
44377
45275
  ...variant.bodyAllowed === false ? { bodyForbidden: true } : {}
44378
45276
  };
@@ -44380,8 +45278,14 @@ var ConfigBuilder = class {
44380
45278
  return {
44381
45279
  name: side.name,
44382
45280
  ...side.repeat ? { repeat: side.repeat } : {},
44383
- ...cardJsonKeyField(side, "jsonKey", "exportJsonKey", sidePath),
44384
- ...cardHtmlKeyField(side, "htmlKey"),
45281
+ ...cardMappingKeysField(
45282
+ side,
45283
+ side.mappingKeys,
45284
+ "jsonKey",
45285
+ "exportJsonKey",
45286
+ "htmlKey",
45287
+ sidePath
45288
+ ),
44385
45289
  variants
44386
45290
  };
44387
45291
  });
@@ -44392,20 +45296,40 @@ var ConfigBuilder = class {
44392
45296
  const hasSideHtml = Object.prototype.hasOwnProperty.call(section, "sideHtmlKey");
44393
45297
  let cardSides = sides;
44394
45298
  if (hasSideExport || section.sideJsonKey != null || hasSideHtml) {
44395
- const sideOverride = cardJsonKeyField(
44396
- section,
44397
- "sideJsonKey",
44398
- "sideExportJsonKey",
44399
- `${sectionPath} / sides.*`
44400
- );
44401
- const sideHtmlOverride = cardHtmlKeyField(section, "sideHtmlKey");
44402
- cardSides = sides.map((s) => ({ ...s, ...sideOverride, ...sideHtmlOverride }));
45299
+ if (!hasSideExport && section.sideJsonKey != null) {
45300
+ exportJsonKeyErrors.push(
45301
+ `Missing exportJsonKey for non-default jsonKey at ${sectionPath} / sides.* (legacy: \`${section.sideJsonKey}\`)`
45302
+ );
45303
+ }
45304
+ cardSides = sides.map((s) => {
45305
+ const record = { ...s.mappingKeys ?? {} };
45306
+ if (hasSideExport) {
45307
+ if (section.sideExportJsonKey != null) record.json = section.sideExportJsonKey;
45308
+ else delete record.json;
45309
+ }
45310
+ if (hasSideHtml) {
45311
+ if (section.sideHtmlKey != null) record.html = section.sideHtmlKey;
45312
+ else delete record.html;
45313
+ }
45314
+ return {
45315
+ name: s.name,
45316
+ ...s.repeat ? { repeat: s.repeat } : {},
45317
+ ...Object.keys(record).length > 0 ? { mappingKeys: record } : {},
45318
+ variants: s.variants
45319
+ };
45320
+ });
44403
45321
  }
44404
45322
  return {
44405
45323
  name: sectionName,
44406
45324
  ...section.isDefault ? { isDefault: true } : {},
44407
- ...cardJsonKeyField(section, "jsonKey", "exportJsonKey", sectionPath),
44408
- ...cardHtmlKeyField(section, "htmlKey"),
45325
+ ...cardMappingKeysField(
45326
+ section,
45327
+ section.mappingKeys,
45328
+ "jsonKey",
45329
+ "exportJsonKey",
45330
+ "htmlKey",
45331
+ sectionPath
45332
+ ),
44409
45333
  // PLAN-085: per-section cardinality. Emit only when non-default
44410
45334
  // (treat `0` / undefined as "unbounded — omit").
44411
45335
  ...section.minCount != null && section.minCount !== 0 ? { min: section.minCount } : {},
@@ -44413,7 +45337,18 @@ var ConfigBuilder = class {
44413
45337
  sides: cardSides
44414
45338
  };
44415
45339
  });
44416
- return { name: normalizedKey, ...cardHtmlKeyField(cardSetConfig, "htmlKey"), cards };
45340
+ return {
45341
+ name: normalizedKey,
45342
+ ...mappingKeysField(
45343
+ void 0,
45344
+ { present: false },
45345
+ {
45346
+ value: cardSetConfig.htmlKey,
45347
+ present: Object.prototype.hasOwnProperty.call(cardSetConfig, "htmlKey")
45348
+ }
45349
+ ),
45350
+ cards
45351
+ };
44417
45352
  }
44418
45353
  const cardSetPath = `cardSets.${normalizedKey} / cards.default`;
44419
45354
  return {
@@ -44422,8 +45357,14 @@ var ConfigBuilder = class {
44422
45357
  {
44423
45358
  name: "default",
44424
45359
  isDefault: true,
44425
- ...cardJsonKeyField(cardSetConfig, "jsonKey", "exportJsonKey", cardSetPath),
44426
- ...cardHtmlKeyField(cardSetConfig, "htmlKey"),
45360
+ ...cardMappingKeysField(
45361
+ cardSetConfig,
45362
+ cardSetConfig.mappingKeys,
45363
+ "jsonKey",
45364
+ "exportJsonKey",
45365
+ "htmlKey",
45366
+ cardSetPath
45367
+ ),
44427
45368
  sides
44428
45369
  }
44429
45370
  ]
@@ -44459,14 +45400,19 @@ var ConfigBuilder = class {
44459
45400
  ...t.max != null ? { max: t.max } : {},
44460
45401
  ...t.description ? { description: t.description } : {}
44461
45402
  };
44462
- if (Object.prototype.hasOwnProperty.call(t, "jsonKey")) {
44463
- ref.exportJsonKey = t.jsonKey;
45403
+ const record = t.mappingKeys ?? {};
45404
+ if (Object.prototype.hasOwnProperty.call(record, "json")) {
45405
+ ref.exportJsonKey = record.json;
44464
45406
  ref.hasExportJsonKey = true;
44465
45407
  }
44466
- if (Object.prototype.hasOwnProperty.call(t, "htmlKey")) {
44467
- ref.htmlKey = t.htmlKey;
45408
+ if (Object.prototype.hasOwnProperty.call(record, "html")) {
45409
+ ref.htmlKey = record.html;
44468
45410
  ref.hasHtmlKey = true;
44469
45411
  }
45412
+ const extras = Object.fromEntries(
45413
+ Object.entries(record).filter(([id]) => id !== "json" && id !== "html")
45414
+ );
45415
+ if (Object.keys(extras).length > 0) ref.extraKeys = extras;
44470
45416
  replacements.push(ref);
44471
45417
  }
44472
45418
  squashedGroups.set(groupKey, replacements);
@@ -44500,8 +45446,11 @@ var ConfigBuilder = class {
44500
45446
  pushOrReplace({
44501
45447
  type: "group",
44502
45448
  key: ref.key,
44503
- ...ref.hasExportJsonKey ? { jsonKey: ref.exportJsonKey } : {},
44504
- ...ref.hasHtmlKey ? { htmlKey: ref.htmlKey } : {},
45449
+ ...mappingKeysField(
45450
+ ref.extraKeys,
45451
+ { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },
45452
+ { value: ref.htmlKey, present: !!ref.hasHtmlKey }
45453
+ ),
44505
45454
  ...ref.min != null ? { min: ref.min } : {},
44506
45455
  ...ref.max != null ? { max: ref.max } : {},
44507
45456
  ...ref.description ? { description: ref.description } : {}
@@ -44514,8 +45463,11 @@ var ConfigBuilder = class {
44514
45463
  pushOrReplace({
44515
45464
  type: "group",
44516
45465
  key: ref.key,
44517
- ...ref.hasExportJsonKey ? { jsonKey: ref.exportJsonKey } : {},
44518
- ...ref.hasHtmlKey ? { htmlKey: ref.htmlKey } : {},
45466
+ ...mappingKeysField(
45467
+ ref.extraKeys,
45468
+ { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },
45469
+ { value: ref.htmlKey, present: !!ref.hasHtmlKey }
45470
+ ),
44519
45471
  ...ref.min != null ? { min: ref.min } : {},
44520
45472
  ...ref.max != null ? { max: ref.max } : {},
44521
45473
  ...ref.description ? { description: ref.description } : {}
@@ -44542,20 +45494,17 @@ var ConfigBuilder = class {
44542
45494
  description: b.description ?? "",
44543
45495
  since: resolvedBitConfig.since,
44544
45496
  deprecated: resolvedBitConfig.deprecated,
44545
- history: [
44546
- {
44547
- version: resolvedBitConfig.since,
44548
- changes: ["Initial version"]
44549
- }
44550
- ],
44551
- format: resolvedBitConfig.textFormatDefault ?? "bitmark--",
44552
- bodyRequired: resolvedBitConfig.bodyRequired ?? false,
44553
- bodyForbidden: !(resolvedBitConfig.bodyAllowed ?? true),
44554
- footerRequired: resolvedBitConfig.footerRequired ?? false,
44555
- footerForbidden: !(resolvedBitConfig.footerAllowed ?? true),
44556
- resourceAttachmentAllowed: resolvedBitConfig.resourceAttachmentAllowed ?? true,
45497
+ bodyFormat: resolvedBitConfig.textFormatDefault ?? "bitmark--",
45498
+ ...resolvedBitConfig.bodyRequired ? { bodyRequired: true } : {},
45499
+ ...resolvedBitConfig.bodyAllowed === false ? { bodyForbidden: true } : {},
45500
+ ...resolvedBitConfig.footerRequired ? { footerRequired: true } : {},
45501
+ ...resolvedBitConfig.footerAllowed === false ? { footerForbidden: true } : {},
45502
+ ...resolvedBitConfig.resourceAttachmentAllowed === false ? { resourceAttachmentAllowed: false } : {},
45503
+ // Bit-level named key mappings (element keys for markup import),
45504
+ // carried verbatim from the raw config.
45505
+ ...mappingKeysField(b.mappingKeys, { present: false }, { present: false }),
44557
45506
  tags: tags2,
44558
- ...cardRef ? { card: cardRef } : {}
45507
+ ...cardRef ? { cardSet: cardRef } : {}
44559
45508
  };
44560
45509
  const output = path3.join(outputFolderBits, `${b.bitType}.jsonc`);
44561
45510
  const str = JSON.stringify(bitJson, null, 2);
@@ -44583,14 +45532,7 @@ var ConfigBuilder = class {
44583
45532
  const bitJson = {
44584
45533
  name: groupKey,
44585
45534
  description: g.description ?? "",
44586
- since: "UNKNOWN",
44587
45535
  deprecated: g.deprecated,
44588
- history: [
44589
- {
44590
- version: "UNKNOWN",
44591
- changes: ["Initial version"]
44592
- }
44593
- ],
44594
45536
  tags: tags2
44595
45537
  // cards: [
44596
45538
  // {
@@ -44644,8 +45586,11 @@ var ConfigBuilder = class {
44644
45586
  tags2.push({
44645
45587
  type: "group",
44646
45588
  key: ref.key,
44647
- ...ref.hasExportJsonKey ? { jsonKey: ref.exportJsonKey } : {},
44648
- ...ref.hasHtmlKey ? { htmlKey: ref.htmlKey } : {},
45589
+ ...mappingKeysField(
45590
+ ref.extraKeys,
45591
+ { value: ref.exportJsonKey, present: !!ref.hasExportJsonKey },
45592
+ { value: ref.htmlKey, present: !!ref.hasHtmlKey }
45593
+ ),
44649
45594
  ...ref.min != null ? { min: ref.min } : {},
44650
45595
  ...ref.max != null ? { max: ref.max } : {},
44651
45596
  ...ref.description ? { description: ref.description } : {}
@@ -44666,14 +45611,7 @@ var ConfigBuilder = class {
44666
45611
  const bitJson = {
44667
45612
  name: groupKey,
44668
45613
  description: b.description ?? "",
44669
- since: "UNKNOWN",
44670
45614
  deprecated: b.deprecated,
44671
- history: [
44672
- {
44673
- version: "UNKNOWN",
44674
- changes: ["Initial version"]
44675
- }
44676
- ],
44677
45615
  tags: tags2
44678
45616
  };
44679
45617
  const output = path3.join(outputFolderGroups, `${groupKey}.jsonc`);
@@ -44714,7 +45652,7 @@ var ConfigBuilder = class {
44714
45652
  validateConfigTree(outputFolder) {
44715
45653
  const errors = [];
44716
45654
  const outputFolderBits = path3.join(outputFolder, "bits");
44717
- const outputFolderGroups = path3.join(outputFolder, "partials");
45655
+ const outputFolderGroups = path3.join(outputFolder, "groups");
44718
45656
  const outputFolderCards = path3.join(outputFolder, "cards");
44719
45657
  const availableGroups = /* @__PURE__ */ new Set();
44720
45658
  if (fs4.existsSync(outputFolderGroups)) {
@@ -44788,7 +45726,7 @@ var ConfigBuilder = class {
44788
45726
  const content = fs4.readFileSync(filePath, "utf-8");
44789
45727
  const config = JSON.parse(content);
44790
45728
  if (config.tags && Array.isArray(config.tags)) {
44791
- checkTags(config.tags, `partials/${file}`, 15);
45729
+ checkTags(config.tags, `groups/${file}`, 15);
44792
45730
  }
44793
45731
  } catch (err) {
44794
45732
  errors.push(`Failed to parse ${file}: ${err}`);