@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.
@@ -1402,6 +1402,7 @@ var propertyKeys = {
1402
1402
  property_dateEnd: "@dateEnd",
1403
1403
  property_decimalPlaces: "@decimalPlaces",
1404
1404
  property_deeplink: "@deeplink",
1405
+ property_displayName: "@displayName",
1405
1406
  property_diffContext: "@diffContext",
1406
1407
  property_diffOp: "@diffOp",
1407
1408
  property_diffRef: "@diffRef",
@@ -1614,6 +1615,8 @@ var propertyKeys = {
1614
1615
  property_trim: "@trim",
1615
1616
  property_unit: "@unit",
1616
1617
  property_unitAbbr: "@unitAbbr",
1618
+ property_unitAbbrPlural: "@unitAbbrPlural",
1619
+ property_unitPlural: "@unitPlural",
1617
1620
  property_vendorDashboardId: "@vendorDashboardId",
1618
1621
  property_vendorSurveyId: "@vendorSurveyId",
1619
1622
  property_vendorUrl: "@vendorUrl",
@@ -2551,9 +2554,30 @@ var CARDSETS = {
2551
2554
  [CardSetConfigKey.definitionList]: {
2552
2555
  jsonKey: "definitions",
2553
2556
  exportJsonKey: { definitions: "$" },
2557
+ // PLAN-141 F1 (NISO import): each <def-item> is one card; the sides
2558
+ // read <term>/<def>; the enclosing <legend>'s <title> lands on the
2559
+ // term side's heading tag ([#Key] header card).
2560
+ // PLAN-141 F3: a <tbx:langSet> is ALSO one card (a terminology entry —
2561
+ // its enclosing <tbx:termEntry> is a transparent claim wrapper); its
2562
+ // children compose the term/definition sides via the side rules below.
2563
+ mappingKeys: {
2564
+ "xml-niso-iec": [
2565
+ { "@el": "def-item", "@children": "$" },
2566
+ { "@el": "tbx:langSet", "@children": "$" }
2567
+ ]
2568
+ },
2554
2569
  sides: [
2555
2570
  {
2556
2571
  name: "term",
2572
+ // F3: every <tbx:tig>'s <tbx:term> STACKS one-per-line onto the
2573
+ // single term side (the "$\n" template's authored separator; the
2574
+ // trailing one is trimmed) — the PDF's Maus/Mus/M/Müsli stack.
2575
+ mappingKeys: {
2576
+ "xml-niso-iec": [
2577
+ { "@el": "term", "@text": "$" },
2578
+ { "@el": "tbx:tig", "@children": { "@el": "tbx:term", "@text": "$\n" } }
2579
+ ]
2580
+ },
2557
2581
  variants: [
2558
2582
  {
2559
2583
  jsonKey: "term.text",
@@ -2569,7 +2593,8 @@ var CARDSETS = {
2569
2593
  format: TagFormat.plainText,
2570
2594
  nullable: true,
2571
2595
  jsonKey: "^heading.forKeys",
2572
- exportJsonKey: { "@bit": { heading: { forKeys: "$" } } }
2596
+ exportJsonKey: { "@bit": { heading: { forKeys: "$" } } },
2597
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
2573
2598
  },
2574
2599
  {
2575
2600
  key: ConfigKey.group_resourceIcon,
@@ -2595,6 +2620,24 @@ var CARDSETS = {
2595
2620
  },
2596
2621
  {
2597
2622
  name: "definition",
2623
+ // F3: the definition side COMPOSES from the entry's fields in
2624
+ // document order, with the ES-rendered locale affixes AUTHORED as
2625
+ // value-position templates (never engine text): the subject field
2626
+ // in ⟨⟩ glues (trailing space) onto the definition line; example /
2627
+ // notes / source follow as blank-line-separated lines. The TBX
2628
+ // grammar flags (normativeAuthorization, termType, partOfSpeech,
2629
+ // grammaticalNumber) are unrendered machine-only data — dropped and
2630
+ // recorded (catalog R-2, reviewed under D7 max-preservation).
2631
+ mappingKeys: {
2632
+ "xml-niso-iec": [
2633
+ { "@el": "def", "@children": "$" },
2634
+ { "@el": "tbx:subjectField", "@text": "\u27E8$\u27E9 " },
2635
+ { "@el": "tbx:definition", "@children": "$" },
2636
+ { "@el": "tbx:example", "@children": "BEISPIEL $" },
2637
+ { "@el": "tbx:note", "@children": "Anmerkung zu Begriff: $" },
2638
+ { "@el": "tbx:source", "@text": "[QUELLE: $]" }
2639
+ ]
2640
+ },
2598
2641
  variants: [
2599
2642
  {
2600
2643
  jsonKey: "definition.text",
@@ -3985,6 +4028,11 @@ var CARDSETS = {
3985
4028
  { table: { header: { rows: ["$"] } } }
3986
4029
  ],
3987
4030
  htmlKey: { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } },
4031
+ // PLAN-141 F2 (NISO import): the XHTML table model NISO uses — a
4032
+ // <thead> SECTION whose <tr> rows are the header cards.
4033
+ mappingKeys: {
4034
+ "xml-niso-iec": { "@el": "thead", "@children": { "@el": "tr", "@children": "$" } }
4035
+ },
3988
4036
  sideJsonKey: "cells[{s}]|set(title=true)",
3989
4037
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
3990
4038
  // Header cells are `<th>`. The `width` attribute is contributed by the
@@ -3996,12 +4044,21 @@ var CARDSETS = {
3996
4044
  jsonKey: "table.body.rows",
3997
4045
  exportJsonKey: { table: { body: { rows: "$" } } },
3998
4046
  htmlKey: { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } },
4047
+ // PLAN-141 F2 (NISO import): <tbody> rows are the (default) data cards.
4048
+ mappingKeys: {
4049
+ "xml-niso-iec": { "@el": "tbody", "@children": { "@el": "tr", "@children": "$" } }
4050
+ },
3999
4051
  isDefault: true
4000
4052
  },
4001
4053
  "table-footer": {
4002
4054
  jsonKey: "table.footer.rows",
4003
4055
  exportJsonKey: { table: { footer: { rows: "$" } } },
4004
4056
  htmlKey: { "@el": "tfoot", "@children": { "@el": "tr", "@children": "$" } },
4057
+ // PLAN-141 F2 (NISO import): NISO has no <tfoot> — the footer card's
4058
+ // source is the <table-wrap-foot> block (CONTENT-shaped: no rows; its
4059
+ // prose/notes flatten into one footer card — catalog table-wrap-foot
4060
+ // row; a contained <def-list> promotes as a sibling legend bit).
4061
+ mappingKeys: { "xml-niso-iec": { "@el": "table-wrap-foot", "@children": "$" } },
4005
4062
  sideJsonKey: "cells[{s}]|set(title=true)",
4006
4063
  sideExportJsonKey: { cells: { $s: { title: true, $: "$" } } },
4007
4064
  // Footer cells render as `<th>` (mirrors the header `title: true`
@@ -4018,6 +4075,8 @@ var CARDSETS = {
4018
4075
  // Default (body) cell → `<td>`; the header/footer sections override the
4019
4076
  // side to `<th>` via their sideHtmlKey (HTML.md §8).
4020
4077
  htmlKey: { "@el": "td", "@children": "$" },
4078
+ // PLAN-141 F2 (NISO import): a <td> row child is a body cell side.
4079
+ mappingKeys: { "xml-niso-iec": { "@el": "td", "@children": "$" } },
4021
4080
  variants: [
4022
4081
  {
4023
4082
  jsonKey: "content",
@@ -4035,7 +4094,11 @@ var CARDSETS = {
4035
4094
  // cell with `title: true` automatically.
4036
4095
  jsonKey: "content",
4037
4096
  exportJsonKey: { content: "$" },
4038
- description: "Title text of the table cell (header rows)."
4097
+ description: "Title text of the table cell (header rows).",
4098
+ // PLAN-141 F2 (NISO import): a <th> row child is a TITLE cell —
4099
+ // its content lands in the `[#…]` tag (an empty <th> keeps its
4100
+ // slot as a bare `[#]`).
4101
+ mappingKeys: { "xml-niso-iec": { "@el": "th", "@children": "$" } }
4039
4102
  },
4040
4103
  {
4041
4104
  key: ConfigKey.property_tableCellType,
@@ -4054,6 +4117,9 @@ var CARDSETS = {
4054
4117
  // HTML-C2: contribute a `rowspan` attribute onto the enclosing
4055
4118
  // cell element (`<th>`/`<td>`).
4056
4119
  htmlKey: { "@el": { "@attr": { rowspan: "$" } } },
4120
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4121
+ // `rowspan` attribute (element-scope attr form).
4122
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { rowspan: "$" } } } },
4057
4123
  description: "Number of rows the cell spans.",
4058
4124
  format: TagFormat.number
4059
4125
  },
@@ -4064,6 +4130,9 @@ var CARDSETS = {
4064
4130
  // HTML-C2: contribute a `colspan` attribute onto the enclosing
4065
4131
  // cell element (`<th>`/`<td>`).
4066
4132
  htmlKey: { "@el": { "@attr": { colspan: "$" } } },
4133
+ // PLAN-141 F2 (NISO import): recover the source cell's own
4134
+ // `colspan` attribute (element-scope attr form).
4135
+ mappingKeys: { "xml-niso-iec": { "@el": { "@attr": { colspan: "$" } } } },
4067
4136
  description: "Number of columns the cell spans.",
4068
4137
  format: TagFormat.number
4069
4138
  },
@@ -4085,6 +4154,13 @@ var CARDSETS = {
4085
4154
  // HTML.md §8 + HTML-C2: contribute a `width` attribute onto the
4086
4155
  // enclosing cell element (`<th>`/`<td>`).
4087
4156
  htmlKey: { "@el": { "@attr": { width: "$" } } },
4157
+ // PLAN-141 F2 (NISO import): NISO carries widths as PER-COLUMN
4158
+ // <col width="…"> descriptors at container level, not on cells.
4159
+ // The matched values distribute positionally onto the first
4160
+ // (header) card's sides. Number format ⇒ only an integral
4161
+ // percentage survives ("20.0000%" → 20); a fractional one
4162
+ // (renderer-equalised "4.7619%") is dropped — catalog `col` row.
4163
+ mappingKeys: { "xml-niso-iec": { "@el": "col", "@attr": { width: "$" } } },
4088
4164
  description: "Width for the column.",
4089
4165
  format: TagFormat.number
4090
4166
  }
@@ -4354,12 +4430,22 @@ var CARDSETS = {
4354
4430
  },
4355
4431
  {
4356
4432
  key: ConfigKey.property_unit,
4357
- description: "Unit of measurement for the ingredient.",
4433
+ description: "Unit of measurement for the ingredient (singular).",
4434
+ format: TagFormat.plainText
4435
+ },
4436
+ {
4437
+ key: ConfigKey.property_unitPlural,
4438
+ description: "Unit of measurement for the ingredient (plural).",
4358
4439
  format: TagFormat.plainText
4359
4440
  },
4360
4441
  {
4361
4442
  key: ConfigKey.property_unitAbbr,
4362
- description: "Abbreviation for the unit of measurement.",
4443
+ description: "Abbreviation for the unit of measurement (singular).",
4444
+ format: TagFormat.plainText
4445
+ },
4446
+ {
4447
+ key: ConfigKey.property_unitAbbrPlural,
4448
+ description: "Abbreviation for the unit of measurement (plural).",
4363
4449
  format: TagFormat.plainText
4364
4450
  },
4365
4451
  {
@@ -4458,7 +4544,22 @@ var GROUPS = {
4458
4544
  key: ConfigKey.property_externalId,
4459
4545
  description: "The external identifier for the bit",
4460
4546
  format: TagFormat.plainText,
4461
- maxCount: Count.infinity
4547
+ maxCount: Count.infinity,
4548
+ // PLAN-140 refs family (NISO import): the machine identifier of a
4549
+ // referenced standard. NESTED content slot — the tag reads (and
4550
+ // consumes) ONLY the <std-id> inside a <std> child; the remaining
4551
+ // designation/title text stays bit body. A <std> without <std-id>
4552
+ // does not fire the key.
4553
+ // PLAN-141 F5: on the [.book] bit, the DATED <std-ref> designation
4554
+ // is the document's external id. Safe rule order: <std-ref> is a
4555
+ // direct bit-element child only under <std-meta> (everywhere else
4556
+ // it nests inside <std>, which the tag spine never reaches).
4557
+ mappingKeys: {
4558
+ "xml-niso-iec": [
4559
+ { "@el": "std", "@children": { "@el": "std-id", "@text": "$" } },
4560
+ { "@el": "std-ref", "@attr": { type: "dated" }, "@text": "$" }
4561
+ ]
4562
+ }
4462
4563
  },
4463
4564
  {
4464
4565
  key: ConfigKey.property_sourceRL,
@@ -4520,6 +4621,11 @@ var GROUPS = {
4520
4621
  description: "Translation source reference",
4521
4622
  format: TagFormat.plainText
4522
4623
  },
4624
+ {
4625
+ key: ConfigKey.property_isCollapsible,
4626
+ description: "If true, the bit is collapsible",
4627
+ format: TagFormat.boolean
4628
+ },
4523
4629
  {
4524
4630
  key: ConfigKey.property_spansPageBreak,
4525
4631
  description: "If true, the bit spans a page break",
@@ -4599,7 +4705,8 @@ var GROUPS = {
4599
4705
  {
4600
4706
  key: ConfigKey.property_diffTime,
4601
4707
  description: "The diff time for the bit",
4602
- format: TagFormat.number
4708
+ format: TagFormat.number,
4709
+ nullable: true
4603
4710
  },
4604
4711
  {
4605
4712
  key: ConfigKey.property_ageRange,
@@ -4610,7 +4717,18 @@ var GROUPS = {
4610
4717
  {
4611
4718
  key: ConfigKey.property_lang,
4612
4719
  description: "The language for the bit",
4613
- format: TagFormat.plainText
4720
+ format: TagFormat.plainText,
4721
+ // PLAN-141 F3 (NISO import): a term-sec's language rides
4722
+ // <tbx:termEntry><tbx:langSet xml:lang> — a nested content slot
4723
+ // whose leaf is a $-in-ATTR-position slot (the nested counterpart
4724
+ // of the value-attr slot). Only termEntry elements match, so the
4725
+ // shared tag is inert everywhere else.
4726
+ mappingKeys: {
4727
+ "xml-niso-iec": {
4728
+ "@el": "tbx:termEntry",
4729
+ "@children": { "@el": "tbx:langSet", "@attr": { "xml:lang": "$" } }
4730
+ }
4731
+ }
4614
4732
  },
4615
4733
  {
4616
4734
  key: ConfigKey.property_publisher,
@@ -4809,6 +4927,9 @@ var GROUPS = {
4809
4927
  key: ConfigKey.tag_item,
4810
4928
  jsonKey: "item",
4811
4929
  exportJsonKey: { item: "$" },
4930
+ // PLAN-140 W3 (NISO import): the clause/note label of a mapped
4931
+ // source element ([%1], [%ANMERKUNG 1]).
4932
+ mappingKeys: { "xml-niso-iec": { "@el": "label", "@text": "$" } },
4812
4933
  description: "The item for the bit",
4813
4934
  chain: [
4814
4935
  {
@@ -5771,7 +5892,20 @@ var GROUPS = {
5771
5892
  key: ConfigKey.property_language,
5772
5893
  description: "The language of the book",
5773
5894
  format: TagFormat.plainText,
5774
- maxCount: Count.infinity
5895
+ maxCount: Count.infinity,
5896
+ // PLAN-141 F5 (NISO import): only the PRIMARY (first)
5897
+ // <content-language> survives — the maxEmits cap realises the
5898
+ // catalog's document-language rule (extras drop, R-4).
5899
+ mappingKeys: {
5900
+ "xml-niso-iec": [
5901
+ { predicates: [], maxEmits: 1, rule: { "@el": "content-language", "@text": "$" } }
5902
+ ]
5903
+ }
5904
+ },
5905
+ {
5906
+ key: ConfigKey.property_displayName,
5907
+ description: "The display name of the book",
5908
+ format: TagFormat.plainText
5775
5909
  },
5776
5910
  {
5777
5911
  key: ConfigKey.property_customerExternalId,
@@ -5847,7 +5981,18 @@ var GROUPS = {
5847
5981
  description: "The title of the book",
5848
5982
  maxCount: 2,
5849
5983
  jsonKey: "title|multi(count=2, key=subtitle)",
5850
- exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }]
5984
+ exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
5985
+ // PLAN-141 F5 (NISO import): the PRIMARY (first) <title-wrap>'s
5986
+ // assembled <full> title → [#]; the per-language extras drop (R-4).
5987
+ mappingKeys: {
5988
+ "xml-niso-iec": [
5989
+ {
5990
+ predicates: [],
5991
+ maxEmits: 1,
5992
+ rule: { "@el": "title-wrap", "@children": { "@el": "full", "@text": "$" } }
5993
+ }
5994
+ ]
5995
+ }
5851
5996
  },
5852
5997
  {
5853
5998
  key: ConfigKey.property_subtype,
@@ -6160,17 +6305,20 @@ var GROUPS = {
6160
6305
  {
6161
6306
  key: ConfigKey.property_platformMargin,
6162
6307
  description: "The platform margin",
6163
- format: TagFormat.number
6308
+ format: TagFormat.number,
6309
+ nullable: true
6164
6310
  },
6165
6311
  {
6166
6312
  key: ConfigKey.property_platformBorderRadius,
6167
6313
  description: "The platform border radius",
6168
- format: TagFormat.number
6314
+ format: TagFormat.number,
6315
+ nullable: true
6169
6316
  },
6170
6317
  {
6171
6318
  key: ConfigKey.property_platformSelectionBorderRadius,
6172
6319
  description: "The platform selection border radius",
6173
- format: TagFormat.number
6320
+ format: TagFormat.number,
6321
+ nullable: true
6174
6322
  },
6175
6323
  {
6176
6324
  key: ConfigKey.property_platformNeedsShadow,
@@ -6277,7 +6425,13 @@ var GROUPS = {
6277
6425
  {
6278
6426
  key: ConfigKey.property_caption,
6279
6427
  description: "The caption for the resource",
6280
- format: TagFormat.bitmarkText
6428
+ format: TagFormat.bitmarkText,
6429
+ // PLAN-141 F1 (NISO import): a figure's <caption><title> — the
6430
+ // nested content slot reads the title text; the caption rides the
6431
+ // resource chain ([&image:…][@caption:…], catalog D5).
6432
+ mappingKeys: {
6433
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
6434
+ }
6281
6435
  },
6282
6436
  {
6283
6437
  key: ConfigKey.property_showInIndex,
@@ -6551,6 +6705,10 @@ var GROUPS = {
6551
6705
  {
6552
6706
  key: ConfigKey.resource_image,
6553
6707
  exportJsonKey: { resource: { type: "image", image: { src: "$" } } },
6708
+ // PLAN-141 F1 (NISO import): the image URL rides the `$`-in-attr
6709
+ // value slot — a <graphic xlink:href> child of the mapped bit
6710
+ // element roots the [&image:URL] chain.
6711
+ mappingKeys: { "xml-niso-iec": { "@el": "graphic", "@attr": { "xlink:href": "$" } } },
6554
6712
  description: "The image resource",
6555
6713
  chain: [
6556
6714
  {
@@ -7425,6 +7583,8 @@ var BITS = {
7425
7583
  maxCount: 2,
7426
7584
  jsonKey: "title|multi(count=2, key=subtitle)",
7427
7585
  exportJsonKey: [{ "@level=1": { title: "$" } }, { "@level=2": { subtitle: "$" } }],
7586
+ // PLAN-140 W3 (NISO import): the title of a mapped source element.
7587
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } },
7428
7588
  key: ConfigKey.tag_title,
7429
7589
  description: "The title of the article"
7430
7590
  }
@@ -7466,22 +7626,84 @@ var BITS = {
7466
7626
  [BitType2.smartStandardArticleNormative]: {
7467
7627
  since: "1.28.0",
7468
7628
  baseBitType: BitType2.standardArticleNormative,
7469
- description: "Smart standard normative article bit"
7629
+ description: "Smart standard normative article bit",
7630
+ // PLAN-140 W3 (NISO import, tranche 1): one article bit per NISO
7631
+ // paragraph (catalog D1). CONTENT keys (@children): the subtree is the
7632
+ // bit's body; nothing inside it promotes. (Ancestor-context normativity
7633
+ // is the non-normative sibling's @ancestor key — plan Q4, resolved.)
7634
+ //
7635
+ // Second rule (catalog D1 push-down): a NUMBERED-PARAGRAPH sec is an
7636
+ // article, not a chapter — the sec-type literal outranks the chapter
7637
+ // key's plain sec|app rule (most-specific-wins). Content key: the sec's
7638
+ // label rides [%] via the label tag key, its inner <p> is the body, its
7639
+ // id is the bit's customerId, and the anchor slot marks it
7640
+ // anchor-bearing.
7641
+ mappingKeys: {
7642
+ "xml-niso-iec": [
7643
+ { "@el": "p", "@attr": { id: "$customerId" }, "@children": "$" },
7644
+ {
7645
+ "@el": "sec",
7646
+ "@attr": { "sec-type": "numbered-paragraph", id: "$customerId" },
7647
+ "@children": "$",
7648
+ "\u25BC": "$anchor"
7649
+ }
7650
+ ]
7651
+ }
7470
7652
  },
7471
7653
  [BitType2.smartStandardArticleNonNormative]: {
7472
7654
  since: "1.28.0",
7473
7655
  baseBitType: BitType2.standardArticleNonNormative,
7474
- description: "Smart standard non-normative article bit"
7656
+ description: "Smart standard non-normative article bit",
7657
+ // PLAN-140 Q4 (normativity inheritance): a <p> is non-normative because
7658
+ // of an ANCESTOR element — a foreword/intro sec or an informative annex.
7659
+ // @ancestor is a reverse-match-only constraint (forward emission ignores
7660
+ // it); the rules are alternatives, first-satisfied wins, and the
7661
+ // @ancestor literals give this key higher specificity than the plain
7662
+ // normative-article <p> key wherever the context applies.
7663
+ mappingKeys: {
7664
+ "xml-niso-iec": [
7665
+ {
7666
+ "@el": "p",
7667
+ "@attr": { id: "$customerId" },
7668
+ "@ancestor": { "@attr": { "sec-type": "foreword|intro" } },
7669
+ "@children": "$"
7670
+ },
7671
+ {
7672
+ "@el": "p",
7673
+ "@attr": { id: "$customerId" },
7674
+ "@ancestor": { "@attr": { "content-type": "informative" } },
7675
+ "@children": "$"
7676
+ }
7677
+ ]
7678
+ }
7475
7679
  },
7476
7680
  [BitType2.smartStandardArticleNormativeCollapsible]: {
7477
7681
  since: "1.28.0",
7682
+ deprecated: "5.37.0",
7478
7683
  baseBitType: BitType2.smartStandardArticleNormative,
7479
- description: "Smart standard normative article bit that is collapsible"
7684
+ description: "Smart standard normative article bit that is collapsible",
7685
+ tags: [
7686
+ {
7687
+ key: ConfigKey.property_isCollapsible,
7688
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
7689
+ format: TagFormat.boolean,
7690
+ defaultValue: "true"
7691
+ }
7692
+ ]
7480
7693
  },
7481
7694
  [BitType2.smartStandardArticleNonNormativeCollapsible]: {
7482
7695
  since: "1.28.0",
7696
+ deprecated: "5.37.0",
7483
7697
  baseBitType: BitType2.smartStandardArticleNonNormative,
7484
- description: "Smart standard non-normative article bit that is collapsible"
7698
+ description: "Smart standard non-normative article bit that is collapsible",
7699
+ tags: [
7700
+ {
7701
+ key: ConfigKey.property_isCollapsible,
7702
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
7703
+ format: TagFormat.boolean,
7704
+ defaultValue: "true"
7705
+ }
7706
+ ]
7485
7707
  },
7486
7708
  [BitType2.statement]: {
7487
7709
  since: "1.3.0",
@@ -8102,7 +8324,8 @@ var BITS = {
8102
8324
  {
8103
8325
  key: ConfigKey.property_maxCreatedBits,
8104
8326
  description: "The maximum number of bits that can be created from this bit",
8105
- format: TagFormat.number
8327
+ format: TagFormat.number,
8328
+ nullable: true
8106
8329
  }
8107
8330
  ],
8108
8331
  textFormatDefault: TextFormat2.plainText
@@ -8232,6 +8455,13 @@ var BITS = {
8232
8455
  since: "1.3.0",
8233
8456
  baseBitType: BitType2._standard,
8234
8457
  description: "Book bit, used to represent a book",
8458
+ // PLAN-141 F5 (NISO import): the <std-meta> front-matter container is
8459
+ // the [.book] bit (STRUCTURAL, first in document order): primary
8460
+ // title-wrap → [#], primary content-language → [@language], dated
8461
+ // std-ref → [@externalId] (tag keys with maxEmits caps — the NISO
8462
+ // convention puts the document language first). std-meta has no id, so
8463
+ // no anchor/customerId. Remaining leaves drop as recorded loss (R-4).
8464
+ mappingKeys: { "xml-niso-iec": { "@el": "std-meta" } },
8235
8465
  tags: [
8236
8466
  {
8237
8467
  key: ConfigKey.group_bookCommon,
@@ -8518,12 +8748,14 @@ var BITS = {
8518
8748
  {
8519
8749
  key: ConfigKey.property_focusX,
8520
8750
  description: "The X coordinate for focusing the image in the browser",
8521
- format: TagFormat.number
8751
+ format: TagFormat.number,
8752
+ nullable: true
8522
8753
  },
8523
8754
  {
8524
8755
  key: ConfigKey.property_focusY,
8525
8756
  description: "The Y coordinate for focusing the image in the browser",
8526
- format: TagFormat.number
8757
+ format: TagFormat.number,
8758
+ nullable: true
8527
8759
  }
8528
8760
  ]
8529
8761
  },
@@ -8554,6 +8786,15 @@ var BITS = {
8554
8786
  since: "1.3.0",
8555
8787
  baseBitType: BitType2._standard,
8556
8788
  description: "Chapter bit, used to define chapters in books or articles",
8789
+ // PLAN-140 W3 (NISO import, tranche 1): recover a chapter from a NISO
8790
+ // section or annex. STRUCTURAL key (no @children content slot): the
8791
+ // element carries no body of its own — tag children (label/title) map
8792
+ // via tag keys, every mapped descendant promotes to a following sibling
8793
+ // bit, and the chapter level derives from nesting depth (catalog D1).
8794
+ // The source id lands as [@customerId] (two-id model, D2).
8795
+ mappingKeys: {
8796
+ "xml-niso-iec": { "@el": "sec|app", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
8797
+ },
8557
8798
  tags: [
8558
8799
  {
8559
8800
  exportJsonKey: { anchor: "$" },
@@ -8565,7 +8806,10 @@ var BITS = {
8565
8806
  key: ConfigKey.tag_title,
8566
8807
  description: "The title of the chapter",
8567
8808
  jsonKey: "title|setMulti(level)",
8568
- exportJsonKey: { title: "$", level: "$level" }
8809
+ exportJsonKey: { title: "$", level: "$level" },
8810
+ // PLAN-140 W3 (NISO import): the section/annex title; the heading
8811
+ // level rides the normalizer-derived nesting depth (plan Q2).
8812
+ mappingKeys: { "xml-niso-iec": { "@el": "title", "@text": "$" } }
8569
8813
  },
8570
8814
  {
8571
8815
  key: ConfigKey.property_toc,
@@ -8578,12 +8822,6 @@ var BITS = {
8578
8822
  description: "The progress of the chapter, used for tracking reading progress",
8579
8823
  format: TagFormat.boolean,
8580
8824
  defaultValue: "true"
8581
- },
8582
- {
8583
- key: ConfigKey.property_isCollapsible,
8584
- description: "If true, the chapter is collapsible",
8585
- format: TagFormat.boolean,
8586
- defaultValue: "false"
8587
8825
  }
8588
8826
  ]
8589
8827
  },
@@ -8771,11 +9009,28 @@ var BITS = {
8771
9009
  since: "1.3.0",
8772
9010
  baseBitType: BitType2._standard,
8773
9011
  description: "Code bit, used for code snippets in articles or documents",
9012
+ // PLAN-141 F4 (NISO import): a <code> block is a CONTENT bit with a
9013
+ // literal text body; @language recovers as [@computerLanguage] (absent
9014
+ // attr → no tag). Anchor = the source id (D2 revised).
9015
+ mappingKeys: {
9016
+ "xml-niso-iec": {
9017
+ "@el": "code",
9018
+ "@attr": { id: "$customerId", language: "$computerLanguage" },
9019
+ "\u25BC": "$anchor",
9020
+ "@text": "$"
9021
+ }
9022
+ },
8774
9023
  tags: [
8775
9024
  {
8776
9025
  key: ConfigKey.property_computerLanguage,
8777
9026
  description: "The programming language of the code snippet",
8778
- format: TagFormat.plainText
9027
+ format: TagFormat.plainText,
9028
+ // PLAN-141 F4 (NISO import): the bit key's `language` sigil recovers
9029
+ // a present attr; this `@absent` rule supplies the AUTHORED default
9030
+ // when the source carries none (catalog code row — an untyped block
9031
+ // is `[@computerLanguage:text]`). Fires only on foreign imports,
9032
+ // never the carrier round-trip.
9033
+ mappingKeys: { "xml-niso-iec": [{ "@absent": "text" }] }
8779
9034
  },
8780
9035
  {
8781
9036
  key: ConfigKey.property_codeLineNumbers,
@@ -8814,7 +9069,20 @@ var BITS = {
8814
9069
  [BitType2.smartStandardFormulaNormative]: {
8815
9070
  since: "3.11.0",
8816
9071
  baseBitType: BitType2.formula,
8817
- description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative"
9072
+ description: "Smart standard normative formula bit, used for mathematical formulas in smart standards that are normative",
9073
+ // PLAN-141 F4 (NISO import): a <disp-formula> is a CONTENT bit whose
9074
+ // latex-format body carries the <mml:math> subtree VERBATIM (G1 — no
9075
+ // MathML↔LaTeX transform; ids stripped); <label> → [%]; a contained
9076
+ // <legend> PROMOTES as a sibling legend bit (cards cannot nest in a
9077
+ // body). Anchor = the source id (D2 revised).
9078
+ mappingKeys: {
9079
+ "xml-niso-iec": {
9080
+ "@el": "disp-formula",
9081
+ "@attr": { id: "$customerId" },
9082
+ "\u25BC": "$anchor",
9083
+ "@children": "$"
9084
+ }
9085
+ }
8818
9086
  },
8819
9087
  [BitType2.smartStandardRemarkFormula]: {
8820
9088
  since: "3.11.0",
@@ -9160,12 +9428,22 @@ var BITS = {
9160
9428
  chain: [
9161
9429
  {
9162
9430
  key: ConfigKey.property_unit,
9163
- description: "The unit of measurement for the ingredients",
9431
+ description: "The unit of measurement for the ingredients (singular)",
9432
+ format: TagFormat.plainText
9433
+ },
9434
+ {
9435
+ key: ConfigKey.property_unitPlural,
9436
+ description: "The unit of measurement for the ingredients (plural)",
9164
9437
  format: TagFormat.plainText
9165
9438
  },
9166
9439
  {
9167
9440
  key: ConfigKey.property_unitAbbr,
9168
- description: "The abbreviation for the unit of measurement",
9441
+ description: "The abbreviation for the unit of measurement (singular)",
9442
+ format: TagFormat.plainText
9443
+ },
9444
+ {
9445
+ key: ConfigKey.property_unitAbbrPlural,
9446
+ description: "The abbreviation for the unit of measurement (plural)",
9169
9447
  format: TagFormat.plainText
9170
9448
  },
9171
9449
  {
@@ -9341,7 +9619,8 @@ var BITS = {
9341
9619
  {
9342
9620
  key: ConfigKey.property_reasonableNumOfChars,
9343
9621
  description: "The reasonable number of characters for the essay",
9344
- format: TagFormat.number
9622
+ format: TagFormat.number,
9623
+ nullable: true
9345
9624
  },
9346
9625
  {
9347
9626
  key: ConfigKey.property_sampleSolution,
@@ -9443,13 +9722,31 @@ var BITS = {
9443
9722
  },
9444
9723
  [BitType2.smartStandardExampleNormativeCollapsible]: {
9445
9724
  since: "1.28.0",
9725
+ deprecated: "5.37.0",
9446
9726
  baseBitType: BitType2.smartStandardExampleNormative,
9447
- description: "Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed"
9727
+ description: "Smart standard normative example collapsible bit, used to provide normative examples in smart standards that can be collapsed",
9728
+ tags: [
9729
+ {
9730
+ key: ConfigKey.property_isCollapsible,
9731
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
9732
+ format: TagFormat.boolean,
9733
+ defaultValue: "true"
9734
+ }
9735
+ ]
9448
9736
  },
9449
9737
  [BitType2.smartStandardExampleNonNormativeCollapsible]: {
9450
9738
  since: "1.28.0",
9739
+ deprecated: "5.37.0",
9451
9740
  baseBitType: BitType2.smartStandardExampleNonNormative,
9452
- description: "Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed"
9741
+ description: "Smart standard non-normative example collapsible bit, used to provide non-normative examples in smart standards that can be collapsed",
9742
+ tags: [
9743
+ {
9744
+ key: ConfigKey.property_isCollapsible,
9745
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
9746
+ format: TagFormat.boolean,
9747
+ defaultValue: "true"
9748
+ }
9749
+ ]
9453
9750
  },
9454
9751
  [BitType2.authorContentBitGenerator]: {
9455
9752
  since: "4.2.0",
@@ -9774,12 +10071,28 @@ var BITS = {
9774
10071
  [BitType2.smartStandardList]: {
9775
10072
  since: "1.28.0",
9776
10073
  baseBitType: BitType2.standardList,
9777
- description: "Smart standard list bit, used to create smart standard lists in articles or books"
10074
+ description: "Smart standard list bit, used to create smart standard lists in articles or books",
10075
+ // PLAN-140 refs family (NISO import): a reference list is a STRUCTURAL
10076
+ // bit (no @children — it takes a path ordinal anchor and its <ref>
10077
+ // children promote to sibling list-item bits); its <title> rides [#]
10078
+ // via the title tag key.
10079
+ mappingKeys: {
10080
+ "xml-niso-iec": { "@el": "ref-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
10081
+ }
9778
10082
  },
9779
10083
  [BitType2.smartStandardListCollapsible]: {
9780
10084
  since: "1.28.0",
10085
+ deprecated: "5.37.0",
9781
10086
  baseBitType: BitType2.smartStandardList,
9782
- description: "Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books"
10087
+ description: "Smart standard list collapsible bit, used to create collapsible smart standard lists in articles or books",
10088
+ tags: [
10089
+ {
10090
+ key: ConfigKey.property_isCollapsible,
10091
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10092
+ format: TagFormat.boolean,
10093
+ defaultValue: "true"
10094
+ }
10095
+ ]
9783
10096
  },
9784
10097
  [BitType2.message]: {
9785
10098
  since: "1.3.0",
@@ -9819,17 +10132,45 @@ var BITS = {
9819
10132
  [BitType2.smartStandardNoteNonNormative]: {
9820
10133
  since: "1.28.0",
9821
10134
  baseBitType: BitType2.standardNoteNonNormative,
9822
- description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards"
10135
+ description: "Smart standard non-normative note bit, used to provide non-normative notes in smart standards",
10136
+ // PLAN-140 W3 (NISO import, tranche 1). CONTENT key (@children): a
10137
+ // note's inner paragraphs are note body, never separate bits.
10138
+ mappingKeys: {
10139
+ "xml-niso-iec": {
10140
+ "@el": "non-normative-note",
10141
+ "@attr": { id: "$customerId" },
10142
+ "@children": "$",
10143
+ "\u25BC": "$anchor"
10144
+ }
10145
+ }
9823
10146
  },
9824
10147
  [BitType2.smartStandardNoteNormativeCollapsible]: {
9825
10148
  since: "1.28.0",
10149
+ deprecated: "5.37.0",
9826
10150
  baseBitType: BitType2.smartStandardNoteNormative,
9827
- description: "Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed"
10151
+ description: "Smart standard normative note collapsible bit, used to provide normative notes in smart standards that can be collapsed",
10152
+ tags: [
10153
+ {
10154
+ key: ConfigKey.property_isCollapsible,
10155
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10156
+ format: TagFormat.boolean,
10157
+ defaultValue: "true"
10158
+ }
10159
+ ]
9828
10160
  },
9829
10161
  [BitType2.smartStandardNoteNonNormativeCollapsible]: {
9830
10162
  since: "1.28.0",
10163
+ deprecated: "5.37.0",
9831
10164
  baseBitType: BitType2.smartStandardNoteNonNormative,
9832
- description: "Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed"
10165
+ description: "Smart standard non-normative note collapsible bit, used to provide non-normative notes in smart standards that can be collapsed",
10166
+ tags: [
10167
+ {
10168
+ key: ConfigKey.property_isCollapsible,
10169
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10170
+ format: TagFormat.boolean,
10171
+ defaultValue: "true"
10172
+ }
10173
+ ]
9833
10174
  },
9834
10175
  [BitType2.noteAi]: {
9835
10176
  since: "1.3.0",
@@ -9926,17 +10267,47 @@ var BITS = {
9926
10267
  [BitType2.smartStandardRemarkNonNormative]: {
9927
10268
  since: "1.28.0",
9928
10269
  baseBitType: BitType2.standardRemarkNonNormative,
9929
- description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards"
10270
+ description: "Smart standard non-normative remark bit, used to provide non-normative remarks in smart standards",
10271
+ // PLAN-140 Q4 rider: a warning/caution note routes to the remark bit —
10272
+ // the same element as the note key, distinguished by the content-type
10273
+ // attr literal (alias value: forward emits the first alternative,
10274
+ // reverse accepts any). Most-specific-wins beats the plain note key.
10275
+ mappingKeys: {
10276
+ "xml-niso-iec": {
10277
+ "@el": "non-normative-note",
10278
+ "@attr": { "content-type": "warning|caution", id: "$customerId" },
10279
+ "@children": "$",
10280
+ "\u25BC": "$anchor"
10281
+ }
10282
+ }
9930
10283
  },
9931
10284
  [BitType2.smartStandardRemarkNormativeCollapsible]: {
9932
10285
  since: "1.28.0",
10286
+ deprecated: "5.37.0",
9933
10287
  baseBitType: BitType2.smartStandardRemarkNormative,
9934
- description: "Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed"
10288
+ description: "Smart standard normative remark collapsible bit, used to provide normative remarks in smart standards that can be collapsed",
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
+ ]
9935
10297
  },
9936
10298
  [BitType2.smartStandardRemarkNonNormativeCollapsible]: {
9937
10299
  since: "1.28.0",
10300
+ deprecated: "5.37.0",
9938
10301
  baseBitType: BitType2.smartStandardRemarkNonNormative,
9939
- description: "Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed"
10302
+ description: "Smart standard non-normative remark collapsible bit, used to provide non-normative remarks in smart standards that can be collapsed",
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
+ ]
9940
10311
  },
9941
10312
  [BitType2.selfAssessment]: {
9942
10313
  since: "1.3.0",
@@ -10007,53 +10378,143 @@ var BITS = {
10007
10378
  },
10008
10379
  [BitType2.collapsible]: {
10009
10380
  since: "1.21.0",
10381
+ deprecated: "5.37.0",
10010
10382
  baseBitType: BitType2.article,
10011
- description: "Collapsible bit, used to create collapsible sections in articles or books"
10383
+ description: "Collapsible bit, used to create collapsible sections in articles or books",
10384
+ tags: [
10385
+ {
10386
+ key: ConfigKey.property_isCollapsible,
10387
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10388
+ format: TagFormat.boolean,
10389
+ defaultValue: "true"
10390
+ }
10391
+ ]
10012
10392
  },
10013
10393
  [BitType2.sideNoteCollapsible]: {
10014
10394
  since: "1.21.0",
10015
- baseBitType: BitType2.article,
10016
- description: "Side note collapsible bit, used to create collapsible side notes in articles or books"
10395
+ deprecated: "5.37.0",
10396
+ baseBitType: BitType2.sideNote,
10397
+ description: "Side note collapsible bit, used to create collapsible side notes in articles or books",
10398
+ tags: [
10399
+ {
10400
+ key: ConfigKey.property_isCollapsible,
10401
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10402
+ format: TagFormat.boolean,
10403
+ defaultValue: "true"
10404
+ }
10405
+ ]
10017
10406
  },
10018
10407
  [BitType2.infoCollapsible]: {
10019
10408
  since: "1.21.0",
10020
- baseBitType: BitType2.article,
10021
- description: "Info collapsible bit, used to create collapsible informational sections in articles or books"
10409
+ deprecated: "5.37.0",
10410
+ baseBitType: BitType2.info,
10411
+ description: "Info collapsible bit, used to create collapsible informational sections in articles or books",
10412
+ tags: [
10413
+ {
10414
+ key: ConfigKey.property_isCollapsible,
10415
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10416
+ format: TagFormat.boolean,
10417
+ defaultValue: "true"
10418
+ }
10419
+ ]
10022
10420
  },
10023
10421
  [BitType2.remarkCollapsible]: {
10024
10422
  since: "1.21.0",
10025
- baseBitType: BitType2.article,
10026
- description: "Remark collapsible bit, used to create collapsible remarks in articles or books"
10423
+ deprecated: "5.37.0",
10424
+ baseBitType: BitType2.remark,
10425
+ description: "Remark collapsible bit, used to create collapsible remarks in articles or books",
10426
+ tags: [
10427
+ {
10428
+ key: ConfigKey.property_isCollapsible,
10429
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10430
+ format: TagFormat.boolean,
10431
+ defaultValue: "true"
10432
+ }
10433
+ ]
10027
10434
  },
10028
10435
  [BitType2.warningCollapsible]: {
10029
10436
  since: "1.21.0",
10030
- baseBitType: BitType2.article,
10031
- description: "Warning collapsible bit, used to create collapsible warnings in articles or books"
10437
+ deprecated: "5.37.0",
10438
+ baseBitType: BitType2.warning,
10439
+ description: "Warning collapsible bit, used to create collapsible warnings in articles or books",
10440
+ tags: [
10441
+ {
10442
+ key: ConfigKey.property_isCollapsible,
10443
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10444
+ format: TagFormat.boolean,
10445
+ defaultValue: "true"
10446
+ }
10447
+ ]
10032
10448
  },
10033
10449
  [BitType2.dangerCollapsible]: {
10034
10450
  since: "1.21.0",
10035
- baseBitType: BitType2.article,
10036
- description: "Danger collapsible bit, used to create collapsible danger sections in articles or books"
10451
+ deprecated: "5.37.0",
10452
+ baseBitType: BitType2.danger,
10453
+ description: "Danger collapsible bit, used to create collapsible danger sections in articles or books",
10454
+ tags: [
10455
+ {
10456
+ key: ConfigKey.property_isCollapsible,
10457
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10458
+ format: TagFormat.boolean,
10459
+ defaultValue: "true"
10460
+ }
10461
+ ]
10037
10462
  },
10038
10463
  [BitType2.noteCollapsible]: {
10039
10464
  since: "1.21.0",
10040
- baseBitType: BitType2.article,
10041
- description: "Note collapsible bit, used to create collapsible notes in articles or books"
10465
+ deprecated: "5.37.0",
10466
+ baseBitType: BitType2.note,
10467
+ description: "Note collapsible bit, used to create collapsible notes in articles or books",
10468
+ tags: [
10469
+ {
10470
+ key: ConfigKey.property_isCollapsible,
10471
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10472
+ format: TagFormat.boolean,
10473
+ defaultValue: "true"
10474
+ }
10475
+ ]
10042
10476
  },
10043
10477
  [BitType2.exampleCollapsible]: {
10044
10478
  since: "1.21.0",
10045
- baseBitType: BitType2.article,
10046
- description: "Example collapsible bit, used to create collapsible examples in articles or books"
10479
+ deprecated: "5.37.0",
10480
+ baseBitType: BitType2.example,
10481
+ description: "Example collapsible bit, used to create collapsible examples in articles or books",
10482
+ tags: [
10483
+ {
10484
+ key: ConfigKey.property_isCollapsible,
10485
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10486
+ format: TagFormat.boolean,
10487
+ defaultValue: "true"
10488
+ }
10489
+ ]
10047
10490
  },
10048
10491
  [BitType2.hintCollapsible]: {
10049
10492
  since: "1.21.0",
10050
- baseBitType: BitType2.article,
10051
- description: "Hint collapsible bit, used to create collapsible hints in articles or books"
10493
+ deprecated: "5.37.0",
10494
+ baseBitType: BitType2.hint,
10495
+ description: "Hint collapsible bit, used to create collapsible hints in articles or books",
10496
+ tags: [
10497
+ {
10498
+ key: ConfigKey.property_isCollapsible,
10499
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10500
+ format: TagFormat.boolean,
10501
+ defaultValue: "true"
10502
+ }
10503
+ ]
10052
10504
  },
10053
10505
  [BitType2.bugCollapsible]: {
10054
10506
  since: "1.21.0",
10055
- baseBitType: BitType2.article,
10056
- description: "Bug collapsible bit, used to create collapsible bug reports in articles or books"
10507
+ deprecated: "5.37.0",
10508
+ baseBitType: BitType2.bug,
10509
+ description: "Bug collapsible bit, used to create collapsible bug reports in articles or books",
10510
+ tags: [
10511
+ {
10512
+ key: ConfigKey.property_isCollapsible,
10513
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10514
+ format: TagFormat.boolean,
10515
+ defaultValue: "true"
10516
+ }
10517
+ ]
10057
10518
  },
10058
10519
  [BitType2.platformPath]: {
10059
10520
  since: "3.14.1",
@@ -10275,8 +10736,17 @@ var BITS = {
10275
10736
  },
10276
10737
  [BitType2.extractorPageCollapsible]: {
10277
10738
  since: "1.30.0",
10739
+ deprecated: "5.37.0",
10278
10740
  baseBitType: BitType2.extractorPage,
10279
- description: "Collapsible extractor page bit, used to extract pages from images with collapsible functionality"
10741
+ description: "Collapsible extractor page bit, used to extract pages from images with collapsible functionality",
10742
+ tags: [
10743
+ {
10744
+ key: ConfigKey.property_isCollapsible,
10745
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10746
+ format: TagFormat.boolean,
10747
+ defaultValue: "true"
10748
+ }
10749
+ ]
10280
10750
  },
10281
10751
  [BitType2.extractorPageWithBlocks]: {
10282
10752
  since: "1.5.21",
@@ -10285,8 +10755,17 @@ var BITS = {
10285
10755
  },
10286
10756
  [BitType2.extractorPageWithBlocksCollapsible]: {
10287
10757
  since: "1.30.0",
10758
+ deprecated: "5.37.0",
10288
10759
  baseBitType: BitType2.extractorPageWithBlocks,
10289
- description: "Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality"
10760
+ description: "Collapsible extractor page with blocks bit, used to extract pages with blocks from images with collapsible functionality",
10761
+ tags: [
10762
+ {
10763
+ key: ConfigKey.property_isCollapsible,
10764
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10765
+ format: TagFormat.boolean,
10766
+ defaultValue: "true"
10767
+ }
10768
+ ]
10290
10769
  },
10291
10770
  [BitType2.extractorConfiguration]: {
10292
10771
  since: "1.7.1",
@@ -10326,8 +10805,17 @@ var BITS = {
10326
10805
  },
10327
10806
  [BitType2.extractorImageCollapsible]: {
10328
10807
  since: "4.3.0",
10808
+ deprecated: "5.37.0",
10329
10809
  baseBitType: BitType2.extractorImage,
10330
- description: "Collapsible extractor images bit, used for images extracted from PDFs"
10810
+ description: "Collapsible extractor images bit, used for images extracted from PDFs",
10811
+ tags: [
10812
+ {
10813
+ key: ConfigKey.property_isCollapsible,
10814
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10815
+ format: TagFormat.boolean,
10816
+ defaultValue: "true"
10817
+ }
10818
+ ]
10331
10819
  },
10332
10820
  [BitType2.extractorBlueprint]: {
10333
10821
  since: "5.12.0",
@@ -10382,7 +10870,8 @@ var BITS = {
10382
10870
  {
10383
10871
  key: ConfigKey.property_pageNo,
10384
10872
  description: "Page number for the block, used to indicate the page on which the block appears",
10385
- format: TagFormat.number
10873
+ format: TagFormat.number,
10874
+ nullable: true
10386
10875
  },
10387
10876
  {
10388
10877
  key: ConfigKey.property_x,
@@ -10399,17 +10888,20 @@ var BITS = {
10399
10888
  {
10400
10889
  key: ConfigKey.property_width,
10401
10890
  description: "Width of the block, used to define the size of the block on the page",
10402
- format: TagFormat.number
10891
+ format: TagFormat.number,
10892
+ nullable: true
10403
10893
  },
10404
10894
  {
10405
10895
  key: ConfigKey.property_height,
10406
10896
  description: "Height of the block, used to define the size of the block on the page",
10407
- format: TagFormat.number
10897
+ format: TagFormat.number,
10898
+ nullable: true
10408
10899
  },
10409
10900
  {
10410
10901
  key: ConfigKey.property_index,
10411
10902
  description: "Index of the block, used to order blocks within the extractor page",
10412
- format: TagFormat.number
10903
+ format: TagFormat.number,
10904
+ nullable: true
10413
10905
  },
10414
10906
  {
10415
10907
  key: ConfigKey.property_classification,
@@ -10460,8 +10952,17 @@ var BITS = {
10460
10952
  },
10461
10953
  [BitType2.extractorPageNumberCollapsible]: {
10462
10954
  since: "1.30.0",
10955
+ deprecated: "5.37.0",
10463
10956
  baseBitType: BitType2.extractorPageNumber,
10464
- description: "Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality"
10957
+ description: "Collapsible extractor page number bit, used to define page numbers in extractor pages with collapsible functionality",
10958
+ tags: [
10959
+ {
10960
+ key: ConfigKey.property_isCollapsible,
10961
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10962
+ format: TagFormat.boolean,
10963
+ defaultValue: "true"
10964
+ }
10965
+ ]
10465
10966
  },
10466
10967
  [BitType2.extractorPageHeader]: {
10467
10968
  since: "1.5.21",
@@ -10470,8 +10971,17 @@ var BITS = {
10470
10971
  },
10471
10972
  [BitType2.extractorPageHeaderCollapsible]: {
10472
10973
  since: "1.30.0",
10974
+ deprecated: "5.37.0",
10473
10975
  baseBitType: BitType2.extractorPageHeader,
10474
- description: "Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality"
10976
+ description: "Collapsible extractor page header bit, used to define headers in extractor pages with collapsible functionality",
10977
+ tags: [
10978
+ {
10979
+ key: ConfigKey.property_isCollapsible,
10980
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
10981
+ format: TagFormat.boolean,
10982
+ defaultValue: "true"
10983
+ }
10984
+ ]
10475
10985
  },
10476
10986
  [BitType2.extractorPageFooter]: {
10477
10987
  since: "1.5.21",
@@ -10480,8 +10990,17 @@ var BITS = {
10480
10990
  },
10481
10991
  [BitType2.extractorPageFooterCollapsible]: {
10482
10992
  since: "1.30.0",
10993
+ deprecated: "5.37.0",
10483
10994
  baseBitType: BitType2.extractorPageFooter,
10484
- description: "Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality"
10995
+ description: "Collapsible extractor page footer bit, used to define footers in extractor pages with collapsible functionality",
10996
+ tags: [
10997
+ {
10998
+ key: ConfigKey.property_isCollapsible,
10999
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11000
+ format: TagFormat.boolean,
11001
+ defaultValue: "true"
11002
+ }
11003
+ ]
10485
11004
  },
10486
11005
  [BitType2.pageOpenBook]: {
10487
11006
  since: "1.5.10",
@@ -10719,7 +11238,20 @@ var BITS = {
10719
11238
  [BitType2.smartStandardLegendNormative]: {
10720
11239
  since: "3.12.0",
10721
11240
  baseBitType: BitType2.legend,
10722
- description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books"
11241
+ description: "Smart standard normative legend bit, used to provide normative smart standard legends in articles or books",
11242
+ // PLAN-141 F2 (NISO import): a free-standing <legend> (a formula's) or
11243
+ // bare <def-list> (a table footer's — no <legend> wrapper there) that is
11244
+ // NOT the claimed card content of its enclosing bit is a legend bit:
11245
+ // STRUCTURAL-shaped, its <title> and <def-item>s build the
11246
+ // definition-list cards via the card set's authored keys. A <legend>
11247
+ // inside a figure/table bit stays that bit's claimed card content and
11248
+ // never reaches this key. Anchor = the source id (D2 revised).
11249
+ mappingKeys: {
11250
+ "xml-niso-iec": [
11251
+ { "@el": "legend", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" },
11252
+ { "@el": "def-list", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11253
+ ]
11254
+ }
10723
11255
  },
10724
11256
  [BitType2.smartStandardRemarkLegend]: {
10725
11257
  since: "3.12.0",
@@ -10758,8 +11290,17 @@ var BITS = {
10758
11290
  },
10759
11291
  [BitType2.definitionListCollapsible]: {
10760
11292
  since: "5.25.0",
11293
+ deprecated: "5.37.0",
10761
11294
  baseBitType: BitType2.definitionList,
10762
- description: "Collapsible definition list bit, used to create collapsible lists of definitions in articles or books"
11295
+ description: "Collapsible definition list bit, used to create collapsible lists of definitions in articles or books",
11296
+ tags: [
11297
+ {
11298
+ key: ConfigKey.property_isCollapsible,
11299
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11300
+ format: TagFormat.boolean,
11301
+ defaultValue: "true"
11302
+ }
11303
+ ]
10763
11304
  },
10764
11305
  [BitType2.standardDefinitionListNormative]: {
10765
11306
  since: "5.24.0",
@@ -10774,7 +11315,16 @@ var BITS = {
10774
11315
  [BitType2.smartStandardDefinitionListNormative]: {
10775
11316
  since: "5.24.0",
10776
11317
  baseBitType: BitType2.standardDefinitionListNormative,
10777
- description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books"
11318
+ description: "Smart standard normative definition list bit, used to create normative smart standard definition lists in articles or books",
11319
+ // PLAN-141 F3 (NISO import): a terms-and-definitions clause. STRUCTURAL-
11320
+ // shaped: <label> → [%], the tbx:termEntry/langSet subtree builds the
11321
+ // definition-list card via the card set's authored keys (all tig terms
11322
+ // stacked on the term side; definition/example/notes/source composed on
11323
+ // the definition side with authored locale affixes), langSet @xml:lang →
11324
+ // [@lang] (nested attr slot on the tag key). Anchor = the source id.
11325
+ mappingKeys: {
11326
+ "xml-niso-iec": { "@el": "term-sec", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11327
+ }
10778
11328
  },
10779
11329
  [BitType2.smartStandardDefinitionListNonNormative]: {
10780
11330
  since: "5.24.0",
@@ -10843,12 +11393,14 @@ var BITS = {
10843
11393
  {
10844
11394
  key: ConfigKey.property_focusX,
10845
11395
  description: "X-coordinate for the focus point, used to define the focus area in the image",
10846
- format: TagFormat.number
11396
+ format: TagFormat.number,
11397
+ nullable: true
10847
11398
  },
10848
11399
  {
10849
11400
  key: ConfigKey.property_focusY,
10850
11401
  description: "Y-coordinate for the focus point, used to define the focus area in the image",
10851
- format: TagFormat.number
11402
+ format: TagFormat.number,
11403
+ nullable: true
10852
11404
  }
10853
11405
  ]
10854
11406
  },
@@ -10955,7 +11507,15 @@ var BITS = {
10955
11507
  [BitType2.smartStandardImageFigureNormative]: {
10956
11508
  since: "1.28.0",
10957
11509
  baseBitType: BitType2.standardImageFigureNormative,
10958
- description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books"
11510
+ description: "Smart standard normative image figure bit, used to create smart standard normative image figures in articles or books",
11511
+ // PLAN-141 F1 (NISO import): a figure is STRUCTURAL-shaped (no
11512
+ // @children — no body): <label> → [%], <caption>/<graphic> ride the
11513
+ // [&image] resource chain, the <legend> def-list becomes the bit's
11514
+ // definition-list cards, and an inner note PROMOTES as a sibling bit.
11515
+ // Anchor = the source id (D2 revised).
11516
+ mappingKeys: {
11517
+ "xml-niso-iec": { "@el": "fig", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
11518
+ }
10959
11519
  },
10960
11520
  [BitType2.smartStandardImageFigureNonNormative]: {
10961
11521
  since: "1.28.0",
@@ -10964,13 +11524,31 @@ var BITS = {
10964
11524
  },
10965
11525
  [BitType2.smartStandardImageFigureNormativeCollapsible]: {
10966
11526
  since: "1.28.0",
11527
+ deprecated: "5.37.0",
10967
11528
  baseBitType: BitType2.smartStandardImageFigureNormative,
10968
- description: "Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books"
11529
+ description: "Collapsible smart standard normative image figure bit, used to create collapsible smart standard normative image figures in articles or books",
11530
+ tags: [
11531
+ {
11532
+ key: ConfigKey.property_isCollapsible,
11533
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11534
+ format: TagFormat.boolean,
11535
+ defaultValue: "true"
11536
+ }
11537
+ ]
10969
11538
  },
10970
11539
  [BitType2.smartStandardImageFigureNonNormativeCollapsible]: {
10971
11540
  since: "1.28.0",
11541
+ deprecated: "5.37.0",
10972
11542
  baseBitType: BitType2.smartStandardImageFigureNonNormative,
10973
- description: "Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books"
11543
+ description: "Collapsible smart standard non-normative image figure bit, used to create collapsible smart standard non-normative image figures in articles or books",
11544
+ tags: [
11545
+ {
11546
+ key: ConfigKey.property_isCollapsible,
11547
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11548
+ format: TagFormat.boolean,
11549
+ defaultValue: "true"
11550
+ }
11551
+ ]
10974
11552
  },
10975
11553
  [BitType2.imageLandscape]: {
10976
11554
  since: "1.3.0",
@@ -11182,43 +11760,115 @@ var BITS = {
11182
11760
  },
11183
11761
  [BitType2.smartStandardTableImageNormativeCollapsible]: {
11184
11762
  since: "1.28.0",
11763
+ deprecated: "5.37.0",
11185
11764
  baseBitType: BitType2.smartStandardTableImageNormative,
11186
- description: "Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books"
11765
+ description: "Collapsible smart standard normative table image bit, used to create collapsible smart standard normative images in tables in articles or books",
11766
+ tags: [
11767
+ {
11768
+ key: ConfigKey.property_isCollapsible,
11769
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11770
+ format: TagFormat.boolean,
11771
+ defaultValue: "true"
11772
+ }
11773
+ ]
11187
11774
  },
11188
11775
  [BitType2.smartStandardTableImageNonNormativeCollapsible]: {
11189
11776
  since: "1.28.0",
11777
+ deprecated: "5.37.0",
11190
11778
  baseBitType: BitType2.smartStandardTableImageNonNormative,
11191
- description: "Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books"
11779
+ description: "Collapsible smart standard non-normative table image bit, used to create collapsible smart standard non-normative images in tables in articles or books",
11780
+ tags: [
11781
+ {
11782
+ key: ConfigKey.property_isCollapsible,
11783
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11784
+ format: TagFormat.boolean,
11785
+ defaultValue: "true"
11786
+ }
11787
+ ]
11192
11788
  },
11193
11789
  [BitType2.smartStandardRemarkTableImageNormativeCollapsible]: {
11194
11790
  since: "1.28.0",
11791
+ deprecated: "5.37.0",
11195
11792
  baseBitType: BitType2.smartStandardRemarkTableImageNormative,
11196
- description: "Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books"
11793
+ description: "Collapsible smart standard normative remark table image bit, used to create collapsible smart standard normative remark images in tables in articles or books",
11794
+ tags: [
11795
+ {
11796
+ key: ConfigKey.property_isCollapsible,
11797
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11798
+ format: TagFormat.boolean,
11799
+ defaultValue: "true"
11800
+ }
11801
+ ]
11197
11802
  },
11198
11803
  [BitType2.smartStandardRemarkTableImageNonNormativeCollapsible]: {
11199
11804
  since: "1.28.0",
11805
+ deprecated: "5.37.0",
11200
11806
  baseBitType: BitType2.smartStandardRemarkTableImageNonNormative,
11201
- 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"
11807
+ 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",
11808
+ tags: [
11809
+ {
11810
+ key: ConfigKey.property_isCollapsible,
11811
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11812
+ format: TagFormat.boolean,
11813
+ defaultValue: "true"
11814
+ }
11815
+ ]
11202
11816
  },
11203
11817
  [BitType2.smartStandardTableExtendedImageNormativeCollapsible]: {
11204
11818
  since: "1.28.0",
11819
+ deprecated: "5.37.0",
11205
11820
  baseBitType: BitType2.smartStandardTableExtendedImageNormative,
11206
- description: "Collapsible smart standard normative extended table image bit, used to create collapsible smart standard normative extended images in tables in articles or books"
11821
+ description: "Collapsible smart standard normative extended table image bit, used to create collapsible smart standard normative extended images in tables in articles or books",
11822
+ tags: [
11823
+ {
11824
+ key: ConfigKey.property_isCollapsible,
11825
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11826
+ format: TagFormat.boolean,
11827
+ defaultValue: "true"
11828
+ }
11829
+ ]
11207
11830
  },
11208
11831
  [BitType2.smartStandardTableExtendedImageNonNormativeCollapsible]: {
11209
11832
  since: "1.28.0",
11833
+ deprecated: "5.37.0",
11210
11834
  baseBitType: BitType2.smartStandardTableExtendedImageNonNormative,
11211
- 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"
11835
+ 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",
11836
+ tags: [
11837
+ {
11838
+ key: ConfigKey.property_isCollapsible,
11839
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11840
+ format: TagFormat.boolean,
11841
+ defaultValue: "true"
11842
+ }
11843
+ ]
11212
11844
  },
11213
11845
  [BitType2.smartStandardRemarkTableExtendedImageNormativeCollapsible]: {
11214
11846
  since: "1.28.0",
11847
+ deprecated: "5.37.0",
11215
11848
  baseBitType: BitType2.smartStandardRemarkTableExtendedImageNormative,
11216
- 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"
11849
+ 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",
11850
+ tags: [
11851
+ {
11852
+ key: ConfigKey.property_isCollapsible,
11853
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11854
+ format: TagFormat.boolean,
11855
+ defaultValue: "true"
11856
+ }
11857
+ ]
11217
11858
  },
11218
11859
  [BitType2.smartStandardRemarkTableExtendedImageNonNormativeCollapsible]: {
11219
11860
  since: "1.28.0",
11861
+ deprecated: "5.37.0",
11220
11862
  baseBitType: BitType2.smartStandardRemarkTableExtendedImageNonNormative,
11221
- 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"
11863
+ 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",
11864
+ tags: [
11865
+ {
11866
+ key: ConfigKey.property_isCollapsible,
11867
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
11868
+ format: TagFormat.boolean,
11869
+ defaultValue: "true"
11870
+ }
11871
+ ]
11222
11872
  },
11223
11873
  [BitType2.imageLink]: {
11224
11874
  since: "1.3.0",
@@ -11683,12 +12333,33 @@ var BITS = {
11683
12333
  [BitType2.smartStandardListItem]: {
11684
12334
  since: "1.28.0",
11685
12335
  baseBitType: BitType2.standardListItem,
11686
- description: "Smart standard list item bit, used to create smart standard list items in articles or books"
12336
+ description: "Smart standard list item bit, used to create smart standard list items in articles or books",
12337
+ // PLAN-140 refs family (NISO import): one list-item bit per <ref> —
12338
+ // CONTENT key (its citation subtree is the body), counter anchor scoped
12339
+ // to the containing list, <label> → [%], nested <std-id> → [@externalId]
12340
+ // (the externalId tag key's nested content slot).
12341
+ mappingKeys: {
12342
+ "xml-niso-iec": {
12343
+ "@el": "ref",
12344
+ "@attr": { id: "$customerId" },
12345
+ "@children": "$",
12346
+ "\u25BC": "$anchor"
12347
+ }
12348
+ }
11687
12349
  },
11688
12350
  [BitType2.smartStandardListItemCollapsible]: {
11689
12351
  since: "1.28.0",
12352
+ deprecated: "5.37.0",
11690
12353
  baseBitType: BitType2.smartStandardListItem,
11691
- description: "Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books"
12354
+ description: "Collapsible smart standard list item bit, used to create collapsible smart standard list items in articles or books",
12355
+ tags: [
12356
+ {
12357
+ key: ConfigKey.property_isCollapsible,
12358
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
12359
+ format: TagFormat.boolean,
12360
+ defaultValue: "true"
12361
+ }
12362
+ ]
11692
12363
  },
11693
12364
  [BitType2.mark]: {
11694
12365
  since: "1.3.0",
@@ -12021,8 +12692,17 @@ var BITS = {
12021
12692
  },
12022
12693
  [BitType2.pageCollapsible]: {
12023
12694
  since: "1.30.0",
12695
+ deprecated: "5.37.0",
12024
12696
  baseBitType: BitType2.page,
12025
- description: "Collapsible page bit, used to create collapsible sections in pages"
12697
+ description: "Collapsible page bit, used to create collapsible sections in pages",
12698
+ tags: [
12699
+ {
12700
+ key: ConfigKey.property_isCollapsible,
12701
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
12702
+ format: TagFormat.boolean,
12703
+ defaultValue: "true"
12704
+ }
12705
+ ]
12026
12706
  },
12027
12707
  [BitType2.pageCoverImage]: {
12028
12708
  since: "1.22.0",
@@ -12790,7 +13470,13 @@ var BITS = {
12790
13470
  // `<caption>` — placed inside the idiomatic `<table>` container as
12791
13471
  // its first child. Outside a table context it falls back to the
12792
13472
  // residual carrier.
12793
- htmlKey: { "@el": "caption", "@children": "$" }
13473
+ htmlKey: { "@el": "caption", "@children": "$" },
13474
+ // PLAN-141 F2 (NISO import): a table-wrap's <caption><title> — the
13475
+ // nested content slot reads the title text (catalog D5: the caption
13476
+ // is a TOP-LEVEL bit property on table bits).
13477
+ mappingKeys: {
13478
+ "xml-niso-iec": { "@el": "caption", "@children": { "@el": "title", "@text": "$" } }
13479
+ }
12794
13480
  },
12795
13481
  {
12796
13482
  key: ConfigKey.property_tableFixedHeader,
@@ -12963,7 +13649,16 @@ var BITS = {
12963
13649
  [BitType2.smartStandardTableExtendedNormative]: {
12964
13650
  since: "1.28.0",
12965
13651
  baseBitType: BitType2.standardTableExtendedNormative,
12966
- description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books"
13652
+ description: "Smart standard normative extended table bit, used to create smart standard normative extended tables in articles or books",
13653
+ // PLAN-141 F2 (NISO import): a table-wrap is STRUCTURAL-shaped (no
13654
+ // @children — no body): <label> → [%], <caption><title> → the bit-level
13655
+ // [@caption] (D5), the inner <table>/<table-wrap-foot> build the
13656
+ // table-extended card grid via the card set's authored keys, and a
13657
+ // footer <def-list> PROMOTES as a sibling legend bit. Anchor = the
13658
+ // source id (D2 revised).
13659
+ mappingKeys: {
13660
+ "xml-niso-iec": { "@el": "table-wrap", "@attr": { id: "$customerId" }, "\u25BC": "$anchor" }
13661
+ }
12967
13662
  },
12968
13663
  [BitType2.smartStandardTableExtendedNonNormative]: {
12969
13664
  since: "1.28.0",
@@ -12982,43 +13677,115 @@ var BITS = {
12982
13677
  },
12983
13678
  [BitType2.smartStandardTableNormativeCollapsible]: {
12984
13679
  since: "1.28.0",
13680
+ deprecated: "5.37.0",
12985
13681
  baseBitType: BitType2.smartStandardTableNormative,
12986
- description: "Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books"
13682
+ description: "Collapsible smart standard normative table bit, used to create collapsible smart standard normative tables in articles or books",
13683
+ tags: [
13684
+ {
13685
+ key: ConfigKey.property_isCollapsible,
13686
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13687
+ format: TagFormat.boolean,
13688
+ defaultValue: "true"
13689
+ }
13690
+ ]
12987
13691
  },
12988
13692
  [BitType2.smartStandardTableNonNormativeCollapsible]: {
12989
13693
  since: "1.28.0",
13694
+ deprecated: "5.37.0",
12990
13695
  baseBitType: BitType2.smartStandardTableNonNormative,
12991
- description: "Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books"
13696
+ description: "Collapsible smart standard non-normative table bit, used to create collapsible smart standard non-normative tables in articles or books",
13697
+ tags: [
13698
+ {
13699
+ key: ConfigKey.property_isCollapsible,
13700
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13701
+ format: TagFormat.boolean,
13702
+ defaultValue: "true"
13703
+ }
13704
+ ]
12992
13705
  },
12993
13706
  [BitType2.smartStandardRemarkTableNormativeCollapsible]: {
12994
13707
  since: "1.28.0",
13708
+ deprecated: "5.37.0",
12995
13709
  baseBitType: BitType2.smartStandardRemarkTableNormative,
12996
- description: "Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books"
13710
+ description: "Collapsible smart standard normative remark table bit, used to create collapsible smart standard normative remark tables in articles or books",
13711
+ tags: [
13712
+ {
13713
+ key: ConfigKey.property_isCollapsible,
13714
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13715
+ format: TagFormat.boolean,
13716
+ defaultValue: "true"
13717
+ }
13718
+ ]
12997
13719
  },
12998
13720
  [BitType2.smartStandardRemarkTableNonNormativeCollapsible]: {
12999
13721
  since: "1.28.0",
13722
+ deprecated: "5.37.0",
13000
13723
  baseBitType: BitType2.smartStandardRemarkTableNonNormative,
13001
- description: "Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books"
13724
+ description: "Collapsible smart standard non-normative remark table bit, used to create collapsible smart standard non-normative remark tables in articles or books",
13725
+ tags: [
13726
+ {
13727
+ key: ConfigKey.property_isCollapsible,
13728
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13729
+ format: TagFormat.boolean,
13730
+ defaultValue: "true"
13731
+ }
13732
+ ]
13002
13733
  },
13003
13734
  [BitType2.smartStandardTableExtendedNormativeCollapsible]: {
13004
13735
  since: "1.28.0",
13736
+ deprecated: "5.37.0",
13005
13737
  baseBitType: BitType2.smartStandardTableExtendedNormative,
13006
- description: "Collapsible smart standard normative extended table bit, used to create collapsible smart standard normative extended tables in articles or books"
13738
+ description: "Collapsible smart standard normative extended table bit, used to create collapsible smart standard normative extended tables in articles or books",
13739
+ tags: [
13740
+ {
13741
+ key: ConfigKey.property_isCollapsible,
13742
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13743
+ format: TagFormat.boolean,
13744
+ defaultValue: "true"
13745
+ }
13746
+ ]
13007
13747
  },
13008
13748
  [BitType2.smartStandardTableExtendedNonNormativeCollapsible]: {
13009
13749
  since: "1.28.0",
13750
+ deprecated: "5.37.0",
13010
13751
  baseBitType: BitType2.smartStandardTableExtendedNonNormative,
13011
- description: "Collapsible smart standard non-normative extended table bit, used to create collapsible smart standard non-normative extended tables in articles or books"
13752
+ description: "Collapsible smart standard non-normative extended table bit, used to create collapsible smart standard non-normative extended tables in articles or books",
13753
+ tags: [
13754
+ {
13755
+ key: ConfigKey.property_isCollapsible,
13756
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13757
+ format: TagFormat.boolean,
13758
+ defaultValue: "true"
13759
+ }
13760
+ ]
13012
13761
  },
13013
13762
  [BitType2.smartStandardRemarkTableExtendedNormativeCollapsible]: {
13014
13763
  since: "1.28.0",
13764
+ deprecated: "5.37.0",
13015
13765
  baseBitType: BitType2.smartStandardRemarkTableExtendedNormative,
13016
- description: "Collapsible smart standard normative remark extended table bit, used to create collapsible smart standard normative remark extended tables in articles or books"
13766
+ description: "Collapsible smart standard normative remark extended table bit, used to create collapsible smart standard normative remark extended tables in articles or books",
13767
+ tags: [
13768
+ {
13769
+ key: ConfigKey.property_isCollapsible,
13770
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13771
+ format: TagFormat.boolean,
13772
+ defaultValue: "true"
13773
+ }
13774
+ ]
13017
13775
  },
13018
13776
  [BitType2.smartStandardRemarkTableExtendedNonNormativeCollapsible]: {
13019
13777
  since: "1.28.0",
13778
+ deprecated: "5.37.0",
13020
13779
  baseBitType: BitType2.smartStandardRemarkTableExtendedNonNormative,
13021
- 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"
13780
+ 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",
13781
+ tags: [
13782
+ {
13783
+ key: ConfigKey.property_isCollapsible,
13784
+ description: "If true, the bit is collapsible (defaults true for this deprecated bit type)",
13785
+ format: TagFormat.boolean,
13786
+ defaultValue: "true"
13787
+ }
13788
+ ]
13022
13789
  },
13023
13790
  [BitType2.parameters]: {
13024
13791
  since: "1.18.0",
@@ -13038,7 +13805,8 @@ var BITS = {
13038
13805
  {
13039
13806
  key: ConfigKey.property_maxDisplayLevel,
13040
13807
  description: "Maximum display level for the chapter in the table of contents",
13041
- format: TagFormat.number
13808
+ format: TagFormat.number,
13809
+ nullable: true
13042
13810
  }
13043
13811
  ]
13044
13812
  },
@@ -13050,7 +13818,8 @@ var BITS = {
13050
13818
  {
13051
13819
  key: ConfigKey.property_maxTocChapterLevel,
13052
13820
  description: "Maximum chapter level for the inline table of contents",
13053
- format: TagFormat.number
13821
+ format: TagFormat.number,
13822
+ nullable: true
13054
13823
  }
13055
13824
  ]
13056
13825
  },
@@ -13473,13 +14242,15 @@ var BITS = {
13473
14242
  key: ConfigKey.property_width,
13474
14243
  // Same as image
13475
14244
  description: "Width for the embedded content, used to define the width in pixels",
13476
- format: TagFormat.number
14245
+ format: TagFormat.number,
14246
+ nullable: true
13477
14247
  },
13478
14248
  {
13479
14249
  key: ConfigKey.property_height,
13480
14250
  // Same as image
13481
14251
  description: "Height for the embedded content, used to define the height in pixels",
13482
- format: TagFormat.number
14252
+ format: TagFormat.number,
14253
+ nullable: true
13483
14254
  },
13484
14255
  {
13485
14256
  key: ConfigKey.property_vendorUrl,
@@ -13517,7 +14288,8 @@ var BITS = {
13517
14288
  {
13518
14289
  key: ConfigKey.property_jupyterExecutionCount,
13519
14290
  description: "Execution count for the Jupyter output, used to define the execution order",
13520
- format: TagFormat.number
14291
+ format: TagFormat.number,
14292
+ nullable: true
13521
14293
  }
13522
14294
  ],
13523
14295
  textFormatDefault: TextFormat2.plainText
@@ -13725,11 +14497,13 @@ var BITS = {
13725
14497
  };
13726
14498
 
13727
14499
  // src/config/Config.ts
14500
+ var COLLAPSIBLE_BIT_TYPE_SUFFIX = "-collapsible";
13728
14501
  var Config = class {
13729
14502
  constructor() {
13730
14503
  __publicField(this, "bitLevelMin", 1);
13731
14504
  __publicField(this, "bitLevelMax", 7);
13732
14505
  __publicField(this, "bitCache", /* @__PURE__ */ new Map());
14506
+ __publicField(this, "migratedBitCache", /* @__PURE__ */ new Map());
13733
14507
  __publicField(this, "allResourcesCache");
13734
14508
  __publicField(this, "comboResourcesCache", /* @__PURE__ */ new Map());
13735
14509
  }
@@ -13745,6 +14519,29 @@ var Config = class {
13745
14519
  if (bitType?.startsWith("|")) bitType = bitType.substring(1);
13746
14520
  return (0, import_superenum16.Enum)(BitType2).fromValue(bitType) ?? BitType2._error;
13747
14521
  }
14522
+ /**
14523
+ * PLAN-017: Return the migration target for a deprecated `*-collapsible` bit type.
14524
+ *
14525
+ * Every `*-collapsible` bit type declares its non-collapsible cousin as its `baseBitType`, so the
14526
+ * target is read from the config rather than a hand-maintained table — a new `*-collapsible` bit
14527
+ * type is covered automatically.
14528
+ *
14529
+ * `BitType.collapsible` is the one exclusion: it has no non-collapsible cousin (its `baseBitType`
14530
+ * is `article`, which is not a migration target).
14531
+ *
14532
+ * @param bitType the bit type
14533
+ * @returns the bit type to migrate to, or undefined if the bit type does not migrate
14534
+ */
14535
+ getMigratedBitType(bitType) {
14536
+ const cached = this.migratedBitCache.get(bitType);
14537
+ if (cached !== void 0 || this.migratedBitCache.has(bitType)) return cached;
14538
+ let target;
14539
+ if (bitType !== BitType2.collapsible && bitType.endsWith(COLLAPSIBLE_BIT_TYPE_SUFFIX)) {
14540
+ target = BITS[bitType]?.baseBitType;
14541
+ }
14542
+ this.migratedBitCache.set(bitType, target);
14543
+ return target;
14544
+ }
13748
14545
  /**
13749
14546
  * Check if a bit type is and instance of the given root bit type.
13750
14547
  *
@@ -14067,7 +14864,7 @@ var instance2 = new Config();
14067
14864
  // src/generated/package_info.ts
14068
14865
  var PACKAGE_INFO = {
14069
14866
  "name": "@gmb/bitmark-parser-generator",
14070
- "version": "5.35.0",
14867
+ "version": "5.37.0",
14071
14868
  "author": "Get More Brain Ltd",
14072
14869
  "license": "ISC",
14073
14870
  "description": "A bitmark parser and generator using Peggy.js"
@@ -14596,6 +15393,8 @@ var NodeType = {
14596
15393
  definition: "definition",
14597
15394
  definitions: "definitions",
14598
15395
  definitionsValue: "definitionsValue",
15396
+ displayName: "displayName",
15397
+ displayNameValue: "displayNameValue",
14599
15398
  diffContext: "diffContext",
14600
15399
  diffContextValue: "diffContextValue",
14601
15400
  diffOp: "diffOp",
@@ -15124,6 +15923,8 @@ var NodeType = {
15124
15923
  type: "type",
15125
15924
  unit: "unit",
15126
15925
  unitAbbr: "unitAbbr",
15926
+ unitAbbrPlural: "unitAbbrPlural",
15927
+ unitPlural: "unitPlural",
15127
15928
  url: "url",
15128
15929
  validationDate: "validationDate",
15129
15930
  validationDateValue: "validationDateValue",
@@ -28299,8 +29100,14 @@ var Builder = class extends BaseBuilder {
28299
29100
  */
28300
29101
  buildBit(data, options) {
28301
29102
  data = structuredClone(data);
29103
+ const migratedBitType = instance2.getMigratedBitType(data.bitType);
29104
+ if (migratedBitType) {
29105
+ data.bitType = migratedBitType;
29106
+ data.isCollapsible = data.isCollapsible ?? true;
29107
+ }
28302
29108
  const bitType = data.bitType;
28303
29109
  const bitConfig = instance2.getBitConfig(bitType);
29110
+ const isCollapsibleDefaultsTrue = bitConfig.tags[ConfigKey.property_isCollapsible]?.defaultValue === "true";
28304
29111
  const deprecatedTextFormat = (0, import_superenum30.Enum)(DeprecatedTextFormat).fromValue(data.textFormat);
28305
29112
  let textFormat = (0, import_superenum30.Enum)(TextFormat2).fromValue(data.textFormat) ?? bitConfig.textFormatDefault;
28306
29113
  if (deprecatedTextFormat === DeprecatedTextFormat.bitmarkMinusMinus) {
@@ -28518,6 +29325,12 @@ var Builder = class extends BaseBuilder {
28518
29325
  data.publisherName,
28519
29326
  options
28520
29327
  ),
29328
+ displayName: this.toAstProperty(
29329
+ bitType,
29330
+ ConfigKey.property_displayName,
29331
+ data.displayName,
29332
+ options
29333
+ ),
28521
29334
  theme: this.toAstProperty(bitType, ConfigKey.property_theme, data.theme, options),
28522
29335
  rtl: this.toAstProperty(bitType, ConfigKey.property_rtl, data.rtl, options),
28523
29336
  computerLanguage: this.toAstProperty(
@@ -29427,7 +30240,7 @@ var Builder = class extends BaseBuilder {
29427
30240
  isCollapsible: this.toAstProperty(
29428
30241
  bitType,
29429
30242
  ConfigKey.property_isCollapsible,
29430
- data.isCollapsible,
30243
+ data.isCollapsible ?? (isCollapsibleDefaultsTrue ? true : void 0),
29431
30244
  options
29432
30245
  ),
29433
30246
  anchor: data.anchor,
@@ -30196,7 +31009,9 @@ var Builder = class extends BaseBuilder {
30196
31009
  ingredient: this.handleJsonText(context, TextLocation2.tag, data.ingredient),
30197
31010
  quantity: data.quantity ?? 0,
30198
31011
  unit: data.unit ?? "",
31012
+ unitPlural: data.unitPlural ?? "",
30199
31013
  unitAbbr: data.unitAbbr ?? "",
31014
+ unitAbbrPlural: data.unitAbbrPlural ?? "",
30200
31015
  decimalPlaces: data.decimalPlaces ?? 1,
30201
31016
  disableCalculation: data.disableCalculation ?? false,
30202
31017
  item: this.handleJsonText(context, TextLocation2.tag, data.item),
@@ -30793,11 +31608,22 @@ var Builder = class extends BaseBuilder {
30793
31608
  */
30794
31609
  buildServings(_context, data) {
30795
31610
  if (!data) return void 0;
30796
- const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = data;
31611
+ const {
31612
+ servings,
31613
+ unit,
31614
+ unitPlural,
31615
+ unitAbbr,
31616
+ unitAbbrPlural,
31617
+ decimalPlaces,
31618
+ disableCalculation,
31619
+ hint
31620
+ } = data;
30797
31621
  const node = {
30798
31622
  servings: servings ?? 0,
30799
31623
  unit: unit ?? "",
31624
+ unitPlural: unitPlural ?? "",
30800
31625
  unitAbbr: unitAbbr ?? "",
31626
+ unitAbbrPlural: unitAbbrPlural ?? "",
30801
31627
  decimalPlaces: decimalPlaces ?? 1,
30802
31628
  disableCalculation: disableCalculation ?? false,
30803
31629
  hint: hint ?? ""
@@ -31734,7 +32560,16 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
31734
32560
  const nodeValue = node.value;
31735
32561
  const parent = this.getParentNode(route);
31736
32562
  if (parent?.key !== NodeType.bitsValue) return true;
31737
- const { servings, unit, unitAbbr, decimalPlaces, disableCalculation, hint } = nodeValue;
32563
+ const {
32564
+ servings,
32565
+ unit,
32566
+ unitPlural,
32567
+ unitAbbr,
32568
+ unitAbbrPlural,
32569
+ decimalPlaces,
32570
+ disableCalculation,
32571
+ hint
32572
+ } = nodeValue;
31738
32573
  this.writeProperty("servings", servings, route, {
31739
32574
  format: TagFormat.plainText
31740
32575
  });
@@ -31744,12 +32579,24 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
31744
32579
  forceChain: true
31745
32580
  });
31746
32581
  }
32582
+ if (unitPlural != null) {
32583
+ this.writeProperty("unitPlural", unitPlural, route, {
32584
+ format: TagFormat.plainText,
32585
+ forceChain: true
32586
+ });
32587
+ }
31747
32588
  if (unitAbbr != null) {
31748
32589
  this.writeProperty("unitAbbr", unitAbbr, route, {
31749
32590
  format: TagFormat.plainText,
31750
32591
  forceChain: true
31751
32592
  });
31752
32593
  }
32594
+ if (unitAbbrPlural != null) {
32595
+ this.writeProperty("unitAbbrPlural", unitAbbrPlural, route, {
32596
+ format: TagFormat.plainText,
32597
+ forceChain: true
32598
+ });
32599
+ }
31753
32600
  if (decimalPlaces != null) {
31754
32601
  this.writeProperty("decimalPlaces", decimalPlaces, route, {
31755
32602
  format: TagFormat.plainText,
@@ -32596,10 +33443,18 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
32596
33443
  this.writeProperty("unit", ingredient.unit, route, {
32597
33444
  format: TagFormat.plainText
32598
33445
  });
33446
+ if (ingredient.unitPlural != null)
33447
+ this.writeProperty("unitPlural", ingredient.unitPlural, route, {
33448
+ format: TagFormat.plainText
33449
+ });
32599
33450
  if (ingredient.unitAbbr != null)
32600
33451
  this.writeProperty("unitAbbr", ingredient.unitAbbr, route, {
32601
33452
  format: TagFormat.plainText
32602
33453
  });
33454
+ if (ingredient.unitAbbrPlural != null)
33455
+ this.writeProperty("unitAbbrPlural", ingredient.unitAbbrPlural, route, {
33456
+ format: TagFormat.plainText
33457
+ });
32603
33458
  if (ingredient.decimalPlaces != null)
32604
33459
  this.writeProperty("decimalPlaces", ingredient.decimalPlaces, route, {
32605
33460
  format: TagFormat.plainText
@@ -34378,6 +35233,25 @@ var JsonGenerator = class extends AstWalkerGenerator {
34378
35233
  }
34379
35234
  return false;
34380
35235
  }
35236
+ // bitmarkAst -> bits -> bitsValue -> isCollapsible
35237
+ /**
35238
+ * PLAN-016: `isCollapsible` is emitted only when true. `false` is the implied
35239
+ * default for every bit, so it is never written to the JSON — an absent key
35240
+ * means the bit's configured default (`true` for the deprecated
35241
+ * `*-collapsible` bit types, `false` everywhere else).
35242
+ *
35243
+ * Defining these handlers suppresses the generic property handlers that
35244
+ * `generatePropertyHandlers()` would otherwise install for this tag.
35245
+ */
35246
+ leaf_isCollapsible(node, route) {
35247
+ const parent = this.getParentNode(route);
35248
+ if (parent?.key !== NodeType.bitsValue) return false;
35249
+ if (node.value === true) this.bitJson.isCollapsible = true;
35250
+ return false;
35251
+ }
35252
+ enter_isCollapsible(node, route) {
35253
+ return this.leaf_isCollapsible(node, route);
35254
+ }
34381
35255
  // bitmarkAst -> bits -> bitsValue -> markConfig
34382
35256
  enter_markConfig(_node, _route) {
34383
35257
  return true;
@@ -35251,7 +36125,6 @@ var JsonGenerator = class extends AstWalkerGenerator {
35251
36125
  if (instance2.isOfBitType(bitType, BitType2.chapter)) {
35252
36126
  if (bitJson.toc == null) bitJson.toc = true;
35253
36127
  if (bitJson.progress == null) bitJson.progress = true;
35254
- if (bitJson.isCollapsible == null) bitJson.isCollapsible = false;
35255
36128
  if (bitJson.level == null) bitJson.level = 1;
35256
36129
  if (bitJson.body == null) bitJson.body = this.bodyDefault;
35257
36130
  }
@@ -38212,7 +39085,9 @@ function parseIngredients(_context, _bitType, cardSet) {
38212
39085
  title: titleArray,
38213
39086
  __instructionString,
38214
39087
  unit,
39088
+ unitPlural,
38215
39089
  unitAbbr,
39090
+ unitAbbrPlural,
38216
39091
  decimalPlaces,
38217
39092
  disableCalculation,
38218
39093
  cardBodyStr,
@@ -38242,7 +39117,9 @@ function parseIngredients(_context, _bitType, cardSet) {
38242
39117
  ingredient: cardBodyStr,
38243
39118
  quantity,
38244
39119
  unit: unit ?? instance3.EMPTY_STRING,
39120
+ unitPlural,
38245
39121
  unitAbbr: unitAbbr ?? instance3.EMPTY_STRING,
39122
+ unitAbbrPlural,
38246
39123
  decimalPlaces: decimalPlaces ?? 1,
38247
39124
  disableCalculation,
38248
39125
  ...tags2
@@ -38913,12 +39790,22 @@ function servingsChainContentProcessor(context, _contentDepth, tagsConfig, conte
38913
39790
  if (context.DEBUG_CHAIN_CONTENT) context.debugPrint("servings content", content);
38914
39791
  const tags2 = context.bitContentProcessor(ContentDepth.Chain, tagsConfig, content.chain);
38915
39792
  if (context.DEBUG_CHAIN_TAGS) context.debugPrint("servings TAGS", tags2);
38916
- const { unit, unitAbbr, decimalPlaces, disableCalculation, __hintString } = tags2;
39793
+ const {
39794
+ unit,
39795
+ unitPlural,
39796
+ unitAbbr,
39797
+ unitAbbrPlural,
39798
+ decimalPlaces,
39799
+ disableCalculation,
39800
+ __hintString
39801
+ } = tags2;
38917
39802
  const servings = instance6.asNumber(content.value) ?? 1;
38918
39803
  const node = {
38919
39804
  servings,
38920
39805
  unit,
39806
+ unitPlural,
38921
39807
  unitAbbr,
39808
+ unitAbbrPlural,
38922
39809
  decimalPlaces: decimalPlaces ?? 1,
38923
39810
  disableCalculation,
38924
39811
  hint: __hintString