@gmb/bitmark-parser-generator 4.14.0 → 4.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -122,6 +122,9 @@ var BitType = superenum({
122
122
  bugAlt: "bug-alt",
123
123
  bugCollapsible: "bug-collapsible",
124
124
  buttonCopyText: "button-copy-text",
125
+ catalogItemBook: "catalog-item-book",
126
+ catalogItemExternalBook: "catalog-item-external-book",
127
+ catalogItemProduct: "catalog-item-product",
125
128
  callToAction: "call-to-action",
126
129
  callToActionBookNow: "call-to-action-book-now",
127
130
  callToActionContact: "call-to-action-contact",
@@ -243,8 +246,8 @@ var BitType = superenum({
243
246
  extractorAiChat: "extractor-ai-chat",
244
247
  extractorBlock: "extractor-block",
245
248
  extractorConfiguration: "extractor-configuration",
246
- extractorImage: "extractor-image",
247
- extractorImageCollapsible: "extractor-image-collapsible",
249
+ extractorImages: "extractor-images",
250
+ extractorImagesCollapsible: "extractor-images-collapsible",
248
251
  extractorInformation: "extractor-information",
249
252
  extractorPage: "extractor-page",
250
253
  extractorPageCollapsible: "extractor-page-collapsible",
@@ -1149,6 +1152,9 @@ var propertyKeys = {
1149
1152
  property_colorTag: "@colorTag",
1150
1153
  property_computerLanguage: "@computerLanguage",
1151
1154
  property_content2Buy: "@content2Buy",
1155
+ property_listPrice: "@listPrice",
1156
+ property_customerProductId: "@customerProductId",
1157
+ property_customerProductShopLink: "@customerProductShopLink",
1152
1158
  property_copyright: "@copyright",
1153
1159
  property_coverColor: "@coverColor",
1154
1160
  property_coverImage: "@coverImage",
@@ -1222,6 +1228,7 @@ var propertyKeys = {
1222
1228
  property_listItemIndent: "@listItemIndent",
1223
1229
  property_location: "@location",
1224
1230
  property_machineTranslated: "@machineTranslated",
1231
+ property_spansPageBreak: "@spansPageBreak",
1225
1232
  property_mailingList: "@mailingList",
1226
1233
  property_mark: "@mark",
1227
1234
  property_maxCreatedBits: "@maxCreatedBits",
@@ -2691,6 +2698,11 @@ var GROUPS = {
2691
2698
  description: "If true, the bit is machine-translated",
2692
2699
  format: TagFormat.plainText
2693
2700
  },
2701
+ {
2702
+ key: ConfigKey.property_spansPageBreak,
2703
+ description: "If true, the bit spans a page break",
2704
+ format: TagFormat.boolean
2705
+ },
2694
2706
  {
2695
2707
  key: ConfigKey.property_searchIndex,
2696
2708
  description: "The search index(es) for the bit",
@@ -4500,6 +4512,120 @@ var BITS = {
4500
4512
  }
4501
4513
  ]
4502
4514
  },
4515
+ [BitType.catalogItemBook]: {
4516
+ since: "4.15.0",
4517
+ baseBitType: BitType._standard,
4518
+ description: "Catalog item book bit, used to represent a book product in a catalog with cover and description",
4519
+ tags: [
4520
+ {
4521
+ key: ConfigKey.tag_title,
4522
+ description: "Title and subtitle of the catalog item",
4523
+ maxCount: 2
4524
+ },
4525
+ {
4526
+ key: ConfigKey.property_coverImage,
4527
+ description: "Cover image of the catalog item",
4528
+ format: TagFormat.plainText
4529
+ },
4530
+ {
4531
+ key: ConfigKey.property_content2Buy,
4532
+ description: "Content to buy identifier",
4533
+ format: TagFormat.plainText
4534
+ },
4535
+ {
4536
+ key: ConfigKey.property_listPrice,
4537
+ description: "List price of the catalog item",
4538
+ format: TagFormat.plainText
4539
+ },
4540
+ {
4541
+ key: ConfigKey.property_buttonCaption,
4542
+ description: "Caption for the buy button",
4543
+ format: TagFormat.plainText
4544
+ },
4545
+ {
4546
+ key: ConfigKey.property_customerProductId,
4547
+ description: "Customer-specific product identifier",
4548
+ format: TagFormat.plainText
4549
+ }
4550
+ ],
4551
+ rootExampleType: ExampleType.string
4552
+ },
4553
+ [BitType.catalogItemExternalBook]: {
4554
+ since: "4.15.0",
4555
+ baseBitType: BitType._standard,
4556
+ description: "Catalog item external book bit, used to represent an external book product in a catalog with link to external shop",
4557
+ tags: [
4558
+ {
4559
+ key: ConfigKey.tag_title,
4560
+ description: "Title and subtitle of the catalog item",
4561
+ maxCount: 2
4562
+ },
4563
+ {
4564
+ key: ConfigKey.property_coverImage,
4565
+ description: "Cover image of the catalog item",
4566
+ format: TagFormat.plainText
4567
+ },
4568
+ {
4569
+ key: ConfigKey.property_customerProductShopLink,
4570
+ description: "Link to external shop for the product",
4571
+ format: TagFormat.plainText
4572
+ },
4573
+ {
4574
+ key: ConfigKey.property_listPrice,
4575
+ description: "List price of the catalog item",
4576
+ format: TagFormat.plainText
4577
+ },
4578
+ {
4579
+ key: ConfigKey.property_buttonCaption,
4580
+ description: "Caption for the buy button",
4581
+ format: TagFormat.plainText
4582
+ },
4583
+ {
4584
+ key: ConfigKey.property_customerProductId,
4585
+ description: "Customer-specific product identifier",
4586
+ format: TagFormat.plainText
4587
+ }
4588
+ ],
4589
+ rootExampleType: ExampleType.string
4590
+ },
4591
+ [BitType.catalogItemProduct]: {
4592
+ since: "4.15.0",
4593
+ baseBitType: BitType._standard,
4594
+ description: "Catalog item product bit, used to represent a general product in a catalog with cover and description",
4595
+ tags: [
4596
+ {
4597
+ key: ConfigKey.tag_title,
4598
+ description: "Title and subtitle of the catalog item",
4599
+ maxCount: 2
4600
+ },
4601
+ {
4602
+ key: ConfigKey.property_coverImage,
4603
+ description: "Cover image of the catalog item",
4604
+ format: TagFormat.plainText
4605
+ },
4606
+ {
4607
+ key: ConfigKey.property_content2Buy,
4608
+ description: "Content to buy identifier",
4609
+ format: TagFormat.plainText
4610
+ },
4611
+ {
4612
+ key: ConfigKey.property_listPrice,
4613
+ description: "List price of the catalog item",
4614
+ format: TagFormat.plainText
4615
+ },
4616
+ {
4617
+ key: ConfigKey.property_buttonCaption,
4618
+ description: "Caption for the buy button",
4619
+ format: TagFormat.plainText
4620
+ },
4621
+ {
4622
+ key: ConfigKey.property_customerProductId,
4623
+ description: "Customer-specific product identifier",
4624
+ format: TagFormat.plainText
4625
+ }
4626
+ ],
4627
+ rootExampleType: ExampleType.string
4628
+ },
4503
4629
  [BitType.callToAction]: {
4504
4630
  since: "1.15.0",
4505
4631
  baseBitType: BitType._standard,
@@ -6583,17 +6709,30 @@ var BITS = {
6583
6709
  description: "Extractor configuration bit, used to configure extractors in articles or books",
6584
6710
  textFormatDefault: TextFormat.plainText
6585
6711
  },
6586
- [BitType.extractorImage]: {
6712
+ [BitType.extractorImages]: {
6587
6713
  since: "4.3.0",
6588
- baseBitType: BitType.image,
6589
- description: "Extractor embedded image bit, used for embedded images extracted from PDFs",
6714
+ baseBitType: BitType._standard,
6715
+ description: "Extractor images bit, used for images extracted from PDFs",
6716
+ tags: [
6717
+ {
6718
+ key: ConfigKey.group_resourceBitTags,
6719
+ description: "Resource bit tags for logo grave images, used to define additional properties"
6720
+ },
6721
+ {
6722
+ // Image resource
6723
+ key: ConfigKey.group_resourceImage,
6724
+ description: "Resource image tags for logo grave images, used to attach images",
6725
+ minCount: 1,
6726
+ maxCount: Count.infinity
6727
+ }
6728
+ ],
6729
+ resourceAttachmentAllowed: false,
6590
6730
  textFormatDefault: TextFormat.plainText
6591
6731
  },
6592
- [BitType.extractorImageCollapsible]: {
6732
+ [BitType.extractorImagesCollapsible]: {
6593
6733
  since: "4.3.0",
6594
- baseBitType: BitType.extractorImage,
6595
- description: "Collapsible extractor embedded image bit, used for embedded images extracted from PDFs",
6596
- textFormatDefault: TextFormat.plainText
6734
+ baseBitType: BitType.extractorImages,
6735
+ description: "Collapsible extractor images bit, used for images extracted from PDFs"
6597
6736
  },
6598
6737
  [BitType.extractorInformation]: {
6599
6738
  since: "3.8.0",
@@ -9560,7 +9699,7 @@ var instance2 = new Config();
9560
9699
  // src/generated/package_info.ts
9561
9700
  var PACKAGE_INFO = {
9562
9701
  "name": "@gmb/bitmark-parser-generator",
9563
- "version": "4.14.0",
9702
+ "version": "4.15.0",
9564
9703
  "author": "Get More Brain Ltd",
9565
9704
  "license": "ISC",
9566
9705
  "description": "A bitmark parser and generator using Peggy.js"
@@ -10027,6 +10166,8 @@ var NodeType = superenum20({
10027
10166
  customerExternalId: "customerExternalId",
10028
10167
  customerId: "customerId",
10029
10168
  customerIdValue: "customerIdValue",
10169
+ customerProductId: "customerProductId",
10170
+ customerProductShopLink: "customerProductShopLink",
10030
10171
  data: "data",
10031
10172
  dataValue: "dataValue",
10032
10173
  dataValueValue: "dataValueValue",
@@ -10208,11 +10349,14 @@ var NodeType = superenum20({
10208
10349
  list: "list",
10209
10350
  listItemIndent: "listItemIndent",
10210
10351
  listItemIndentValue: "listItemIndentValue",
10352
+ listPrice: "listPrice",
10211
10353
  listValue: "listValue",
10212
10354
  location: "location",
10213
10355
  locationValue: "locationValue",
10214
10356
  machineTranslated: "machineTranslated",
10215
10357
  machineTranslatedValue: "machineTranslatedValue",
10358
+ spansPageBreak: "spansPageBreak",
10359
+ spansPageBreakValue: "spansPageBreakValue",
10216
10360
  mailingList: "mailingList",
10217
10361
  marginNumber: "marginNumber",
10218
10362
  marginNumberValue: "marginNumberValue",
@@ -10993,22 +11137,22 @@ var DeprecatedTextFormat = superenum23({
10993
11137
  // src/parser/json/TableUtils.ts
10994
11138
  function isTableBasicFormat(table) {
10995
11139
  const t = table;
10996
- return !!(t.columns || t.data) && !(t.head || t.body || t.foot);
11140
+ return !!(t.columns || t.data) && !(t.header || t.body || t.footer);
10997
11141
  }
10998
11142
  function isTableExtendedFormat(table) {
10999
11143
  const t = table;
11000
- return !!(t.head || t.body || t.foot);
11144
+ return !!(t.header || t.body || t.footer);
11001
11145
  }
11002
11146
  function isMixedTableFormat(table) {
11003
11147
  const t = table;
11004
11148
  const hasOld = !!(t.columns || t.data);
11005
- const hasNew = !!(t.head || t.body || t.foot);
11149
+ const hasNew = !!(t.header || t.body || t.footer);
11006
11150
  return hasOld && hasNew;
11007
11151
  }
11008
11152
  function convertBasicToExtendedTableFormat(table) {
11009
11153
  const tableExtended = {};
11010
11154
  if (table.columns && table.columns.length > 0) {
11011
- tableExtended.head = {
11155
+ tableExtended.header = {
11012
11156
  rows: [
11013
11157
  {
11014
11158
  cells: table.columns.map((col) => ({
@@ -11039,7 +11183,7 @@ function convertExtendedToBasicTableFormat(tableExtended) {
11039
11183
  return row.cells.map((cell) => cell?.content).filter((content) => content !== void 0);
11040
11184
  };
11041
11185
  const dataRows = [];
11042
- const headRows = tableExtended.head?.rows ?? [];
11186
+ const headRows = tableExtended.header?.rows ?? [];
11043
11187
  if (headRows.length > 0) {
11044
11188
  const primaryHeader = extractRowCells(headRows[0]);
11045
11189
  if (primaryHeader.length > 0) {
@@ -11065,7 +11209,7 @@ function convertExtendedToBasicTableFormat(tableExtended) {
11065
11209
  });
11066
11210
  };
11067
11211
  appendSectionRows(tableExtended.body);
11068
- appendSectionRows(tableExtended.foot);
11212
+ appendSectionRows(tableExtended.footer);
11069
11213
  if (dataRows.length > 0) {
11070
11214
  table.data = dataRows;
11071
11215
  }
@@ -22025,7 +22169,8 @@ var ResourceBuilder = class extends BaseBuilder {
22025
22169
  BitType.imageSeparator,
22026
22170
  BitType.pageBanner,
22027
22171
  BitType.imagesLogoGrave,
22028
- BitType.prototypeImages
22172
+ BitType.prototypeImages,
22173
+ BitType.extractorImages
22029
22174
  ])) {
22030
22175
  zoomDisabledDefault = true;
22031
22176
  }
@@ -22976,6 +23121,12 @@ var Builder = class extends BaseBuilder {
22976
23121
  data.machineTranslated,
22977
23122
  options
22978
23123
  ),
23124
+ spansPageBreak: this.toAstProperty(
23125
+ bitType,
23126
+ ConfigKey.property_spansPageBreak,
23127
+ data.spansPageBreak,
23128
+ options
23129
+ ),
22979
23130
  searchIndex: this.toAstProperty(
22980
23131
  bitType,
22981
23132
  ConfigKey.property_searchIndex,
@@ -23444,6 +23595,19 @@ var Builder = class extends BaseBuilder {
23444
23595
  data.content2Buy,
23445
23596
  options
23446
23597
  ),
23598
+ listPrice: this.toAstProperty(bitType, ConfigKey.property_listPrice, data.listPrice, options),
23599
+ customerProductId: this.toAstProperty(
23600
+ bitType,
23601
+ ConfigKey.property_customerProductId,
23602
+ data.customerProductId,
23603
+ options
23604
+ ),
23605
+ customerProductShopLink: this.toAstProperty(
23606
+ bitType,
23607
+ ConfigKey.property_customerProductShopLink,
23608
+ data.customerProductShopLink,
23609
+ options
23610
+ ),
23447
23611
  mailingList: this.toAstProperty(
23448
23612
  bitType,
23449
23613
  ConfigKey.property_mailingList,
@@ -24365,12 +24529,12 @@ var Builder = class extends BaseBuilder {
24365
24529
  rows
24366
24530
  };
24367
24531
  };
24368
- const head = buildSection(nodeTableExtended.head);
24369
- if (head && head.rows?.length > 0) nodeTableExtended.head = head;
24532
+ const header = buildSection(nodeTableExtended.header);
24533
+ if (header && header.rows?.length > 0) nodeTableExtended.header = header;
24370
24534
  const body = buildSection(nodeTableExtended.body);
24371
24535
  if (body && body.rows?.length > 0) nodeTableExtended.body = body;
24372
- const foot = buildSection(nodeTableExtended.foot);
24373
- if (foot && foot.rows?.length > 0) nodeTableExtended.foot = foot;
24536
+ const footer = buildSection(nodeTableExtended.footer);
24537
+ if (footer && footer.rows?.length > 0) nodeTableExtended.footer = footer;
24374
24538
  return node;
24375
24539
  }
24376
24540
  /**
@@ -26565,9 +26729,9 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
26565
26729
  writeAdvancedTable(table) {
26566
26730
  const normalized = normalizeTableFormat(BitType.tableExtended, table);
26567
26731
  const sections = [
26568
- { key: "thead", qualifier: "thead", section: normalized.head },
26569
- { key: "tbody", qualifier: void 0, section: normalized.body },
26570
- { key: "tfoot", qualifier: "tfoot", section: normalized.foot }
26732
+ { key: "header", qualifier: "table-header", section: normalized.header },
26733
+ { key: "body", qualifier: void 0, section: normalized.body },
26734
+ { key: "footer", qualifier: "table-footer", section: normalized.footer }
26571
26735
  ];
26572
26736
  let rowCount = 0;
26573
26737
  for (const { key, qualifier, section } of sections) {
@@ -26595,7 +26759,7 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
26595
26759
  }
26596
26760
  }
26597
26761
  writeTableCell(cell, section) {
26598
- const defaultCellType = section === "tbody" ? "td" : "th";
26762
+ const defaultCellType = section === "body" ? "td" : "th";
26599
26763
  const cellType = cell.title ? "th" : "td";
26600
26764
  if (cellType !== defaultCellType) {
26601
26765
  this.writeTableCellProperty("tableCellType", cellType);
@@ -27150,6 +27314,7 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27150
27314
  this.writeNL();
27151
27315
  this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);
27152
27316
  }
27317
+ return false;
27153
27318
  }
27154
27319
  // bitmarkAst -> bits -> bitsValue -> body -> bodyValue -> gap -> solutions -> solution
27155
27320
  // ? -> solutions -> solution
@@ -27231,11 +27396,12 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27231
27396
  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions -> questionsValue -> question
27232
27397
  enter_question(node, route) {
27233
27398
  const parent = this.getParentNode(route);
27234
- if (parent?.key !== NodeType.questionsValue) return;
27399
+ if (parent?.key !== NodeType.questionsValue) return true;
27235
27400
  if (node.value) {
27236
27401
  this.writeNL();
27237
27402
  this.writeTextOrValue(node.value, this.textFormat, TextLocation.body);
27238
27403
  }
27404
+ return false;
27239
27405
  }
27240
27406
  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question
27241
27407
  leaf_question(node, route) {
@@ -27296,7 +27462,8 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27296
27462
  BitType.imageSeparator,
27297
27463
  BitType.pageBanner,
27298
27464
  BitType.imagesLogoGrave,
27299
- BitType.prototypeImages
27465
+ BitType.prototypeImages,
27466
+ BitType.extractorImages
27300
27467
  ])) {
27301
27468
  this.writeProperty("zoomDisabled", node.value, route, {
27302
27469
  format: TagFormat.boolean,
@@ -28504,7 +28671,11 @@ var JsonGenerator = class extends AstWalkerGenerator {
28504
28671
  }
28505
28672
  resourceJson = wrapper;
28506
28673
  }
28507
- } else if (instance2.isOfBitType(bitType, [BitType.imagesLogoGrave, BitType.prototypeImages])) {
28674
+ } else if (instance2.isOfBitType(bitType, [
28675
+ BitType.imagesLogoGrave,
28676
+ BitType.prototypeImages,
28677
+ BitType.extractorImages
28678
+ ])) {
28508
28679
  const images = [];
28509
28680
  for (const r of resources) {
28510
28681
  if (r.type === ResourceType.image) {
@@ -29081,7 +29252,11 @@ var JsonGenerator = class extends AstWalkerGenerator {
29081
29252
  if (bitJson.resolvedDate == null) bitJson.resolvedDate = "";
29082
29253
  if (bitJson.resolvedBy == null) bitJson.resolvedBy = "";
29083
29254
  }
29084
- if (instance2.isOfBitType(bitType, [BitType.imagesLogoGrave, BitType.prototypeImages])) {
29255
+ if (instance2.isOfBitType(bitType, [
29256
+ BitType.imagesLogoGrave,
29257
+ BitType.prototypeImages,
29258
+ BitType.extractorImages
29259
+ ])) {
29085
29260
  if (bitType === BitType.imagesLogoGrave) {
29086
29261
  if (bitJson.logos == null) {
29087
29262
  bitJson.logos = [];
@@ -29509,7 +29684,7 @@ var JsonParser = class {
29509
29684
  processResources(bitType, resource, images, logos) {
29510
29685
  const nodes = [];
29511
29686
  if (resource) nodes.push(resource);
29512
- if (instance2.isOfBitType(bitType, [BitType.prototypeImages])) {
29687
+ if (instance2.isOfBitType(bitType, [BitType.prototypeImages, BitType.extractorImages])) {
29513
29688
  if (Array.isArray(images)) {
29514
29689
  for (const image of images) {
29515
29690
  if (image) nodes.push(image);
@@ -31719,17 +31894,17 @@ function parsePronunciationTable(_context, _bitType, cardSet) {
31719
31894
  }
31720
31895
  function parseTable(context, _bitType, cardSet) {
31721
31896
  const sectionRows = {
31722
- thead: [],
31723
- tbody: [],
31724
- tfoot: []
31897
+ header: [],
31898
+ body: [],
31899
+ footer: []
31725
31900
  };
31726
31901
  const getNormalizedQualifier = (rawQualifier) => {
31727
31902
  if (!rawQualifier) return void 0;
31728
31903
  const normalized = rawQualifier.trim().toLowerCase();
31729
- if (normalized === "thead" || normalized === "tbody" || normalized === "tfoot") {
31730
- return normalized;
31731
- }
31732
- context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to tbody.`);
31904
+ if (normalized === "table-header") return "header";
31905
+ if (normalized === "table-body") return "body";
31906
+ if (normalized === "table-footer") return "footer";
31907
+ context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to body.`);
31733
31908
  return void 0;
31734
31909
  };
31735
31910
  const isLegacyHeadingRow = (card, cardIndex) => {
@@ -31766,7 +31941,7 @@ function parseTable(context, _bitType, cardSet) {
31766
31941
  `Invalid table cell type '${raw}', using default for section '${section}'.`
31767
31942
  );
31768
31943
  }
31769
- return section === "tbody" ? "td" : "th";
31944
+ return section === "body" ? "td" : "th";
31770
31945
  };
31771
31946
  const normalizeSpan = (raw, kind) => {
31772
31947
  if (raw == null) return 1;
@@ -31834,7 +32009,7 @@ function parseTable(context, _bitType, cardSet) {
31834
32009
  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {
31835
32010
  const card = cardSet.cards[cardIdx];
31836
32011
  const qualifier = resolveSectionQualifier(card);
31837
- const section = qualifier ? qualifier : isLegacyHeadingRow(card, cardIdx) ? "thead" : "tbody";
32012
+ const section = qualifier ? qualifier : isLegacyHeadingRow(card, cardIdx) ? "header" : "body";
31838
32013
  const cells = [];
31839
32014
  for (const side of card.sides) {
31840
32015
  for (const variant of side.variants) {
@@ -31846,28 +32021,28 @@ function parseTable(context, _bitType, cardSet) {
31846
32021
  });
31847
32022
  }
31848
32023
  const table = {};
31849
- const hasHeadRows = sectionRows.thead.length > 0;
31850
- const hasBodyRows = sectionRows.tbody.length > 0;
31851
- const hasFootRows = sectionRows.tfoot.length > 0;
32024
+ const hasHeadRows = sectionRows.header.length > 0;
32025
+ const hasBodyRows = sectionRows.body.length > 0;
32026
+ const hasFootRows = sectionRows.footer.length > 0;
31852
32027
  if (hasHeadRows) {
31853
- table.head = {
31854
- rows: sectionRows.thead
32028
+ table.header = {
32029
+ rows: sectionRows.header
31855
32030
  };
31856
32031
  }
31857
32032
  if (hasBodyRows) {
31858
32033
  table.body = {
31859
- rows: sectionRows.tbody
32034
+ rows: sectionRows.body
31860
32035
  };
31861
32036
  }
31862
32037
  if (hasFootRows) {
31863
- table.foot = {
31864
- rows: sectionRows.tfoot
32038
+ table.footer = {
32039
+ rows: sectionRows.footer
31865
32040
  };
31866
32041
  }
31867
32042
  if (!hasHeadRows && !hasBodyRows && !hasFootRows) {
31868
- table.head = { rows: [] };
32043
+ table.header = { rows: [] };
31869
32044
  table.body = { rows: [] };
31870
- table.foot = { rows: [] };
32045
+ table.footer = { rows: [] };
31871
32046
  }
31872
32047
  return { table };
31873
32048
  }