@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.
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8"/>
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1"/>
6
- <title>@gmb/bitmark-parser-generator [22 Oct 2025 at 05:00]</title>
6
+ <title>@gmb/bitmark-parser-generator [28 Oct 2025 at 21:47]</title>
7
7
  <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAMAAACdt4HsAAABrVBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+O1foceMD///+J0/qK1Pr7/v8Xdr/9///W8P4UdL7L7P0Scr2r4Pyj3vwad8D5/f/2/f+55f3E6f34+/2H0/ojfMKpzOd0rNgQcb3F3O/j9f7c8v6g3Pz0/P/w+v/q+P7n9v6T1/uQ1vuE0vqLut/y+v+Z2fvt+f+15Pzv9fuc2/vR7v2V2Pvd6/bg9P7I6/285/2y4/yp3/zp8vk8i8kqgMT7/P31+fyv4vxGkcz6/P6/6P3j7vfS5PNnpNUxhcbO7f7F6v3O4vHK3/DA2u631Ouy0eqXweKJud5wqthfoNMMbLvY8f73+v2dxeR8sNtTmdDx9/zX6PSjyeaCtd1YnNGX2PuQveCGt95Nls42h8dLlM3F4vBtAAAAM3RSTlMAAyOx0/sKBvik8opWGBMOAe3l1snDm2E9LSb06eHcu5JpHbarfHZCN9CBb08zzkdNS0kYaptYAAAFV0lEQVRYw92X51/aYBDHHS2O2qqttVbrqNq9m+TJIAYIShBkWwqIiCgoWvfeq7Z2/s29hyQNyUcR7LveGwVyXy6XH8/9rqxglLfUPLxVduUor3h0rfp2TYvpivk37929TkG037hffoX0+peVtZQc1589rigVUdXS/ABSAyEmGIO/1XfvldSK8vs3OqB6u3m0nxmIrvgB0dj7rr7Y9IbuF68hnfFaiHA/sxqm0wciIG43P60qKv9WXWc1RXGh/mFESFABTSBi0sNAKzqet17eCtOb3kZIDwxEEU0oAIJGYxNBDhBND29e0rtXXbcpuPmED9IhEAAQ/AXEaF8EPmnrrKsv0LvWR3fg5sWDNAFZOgAgaKvZDogHNU9MFwnnYROkc56RD5CjAbQX9Ow4g7upCsvYu55aSI/Nj0H1akgKQEUM94dwK65hYRmFU9MIcH/fqJYOZYcnuJSU/waKDgTOEVaVKhwrTRP5XzgSpAITYzom7UvkhFX5VutmxeNnWDjjswTKTyfgluNDGbUpWissXhF3s7mlSml+czWkg3D0l1nNjGNjz3myOQOa1KM/jOS6ebdbAVTCi4gljHSFrviza7tOgRWcS0MOUX9zdNgag5w7rRqA44Lzw0hr1WqES36dFliSJFlh2rXIae3FFcDDgKdxrUIDePr8jGcSClV1u7A9xeN0ModY/pHMxmR1EzRh8TJiwqsHmKW0l4FCEZI+jHio+JdPPE9qwQtTRxku2D8sIeRL2LnxWSllANCQGOIiqVHAz2ye2JR0DcH+HoxDkaADLjgxjKQ+AwCX/g0+DNgdG0ukYCONAe+dbc2IAc6fwt1ARoDSezNHxV2Cmzwv3O6lDMV55edBGwGK9n1+x2F8EDfAGCxug8MhpsMEcTEAWf3rx2vZhe/LAmtIn/6apE6PN0ULKgywD9mmdxbmFl3OvD5AS5fW5zLbv/YHmcsBTjf/afDz3MaZTVCfAP9z6/Bw6ycv8EUBWJIn9zYcoAWWlW9+OzO3vkTy8H+RANLmdrpOuYWdZYEXpo+TlCJrW5EARb7fF+bWdqf3hhyZI1nWJQHgznErZhbjoEsWqi8dQNoE294aldzFurwSABL2XXMf9+H1VQGke9exw5P/AnA5Pv5ngMul7LOvO922iwACu8WkCwLCafvM4CeWPxfA8lNHcWZSoi8EwMAIciKX2Z4SWCMAa3snCZ/G4EA8D6CMLNFsGQhkkz/gQNEBbPCbWsxGUpYVu3z8IyNAknwJkfPMEhLyrdi5RTyUVACkw4GSFRNWJNEW+fgPGwHD8/JxnRuLabN4CGNRkAE23na2+VmEAUmrYymSGjMAYqH84YUIyzgzs3XC7gNgH36Vcc4zKY9o9fgPBXUAiHHwVboBHGLiX6Zcjp1f2wu4tvzZKo0ecPnDtQYDQvJXaBeNzce45Fp28ZQLrEZVuFqgBwOalArKXnW1UzlnSusQKJqKYNuz4tOnI6sZG4zanpemv+7ySU2jbA9h6uhcgpfy6G2PahirDZ6zvq6zDduMVFTKvzw8wgyEdelwY9in3XkEPs3osJuwRQ4qTkfzifndg9Gfc4pdsu82+tTnHZTBa2EAMrqr2t43pguc8tNm7JQVQ2S0ukj2d22dhXYP0/veWtwKrCkNoNimAN5+Xr/oLrxswKbVJjteWrX7eR63o4j9q0GxnaBdWgGA5VStpanIjQmEhV0/nVt5VOFUvix6awJhPcAaTEShgrG+iGyvb5a0Ndb1YGHFPEwoqAinoaykaID1o1pdPNu7XsnCKQ3R+hwWIIhGvORcJUBYXe3Xa3vq/mF/N9V13ugufMkfXn+KHsRD0B8AAAAASUVORK5CYII=" type="image/x-icon" />
8
8
 
9
9
  <script>
@@ -31,7 +31,7 @@
31
31
  <body>
32
32
  <div id="app"></div>
33
33
  <script>
34
- window.chartData = [{"label":"bitmark-parser-generator.min.js","isAsset":true,"statSize":1200929,"parsedSize":526386,"gzipSize":102527,"groups":[{"label":"dist/browser/cjs","path":"./dist/browser/cjs","statSize":1193949,"groups":[{"id":922,"label":"index.cjs","path":"./dist/browser/cjs/index.cjs","statSize":1193949,"parsedSize":526282,"gzipSize":102527}],"parsedSize":526282,"gzipSize":102527},{"label":"node_modules/@ncoderz/superenum/dist/esm","path":"./node_modules/@ncoderz/superenum/dist/esm","statSize":6980,"groups":[{"id":718,"label":"superenum.js","path":"./node_modules/@ncoderz/superenum/dist/esm/superenum.js","statSize":6980}],"parsedSize":0,"gzipSize":0}],"isInitialByEntrypoint":{"main":true}}];
34
+ window.chartData = [{"label":"bitmark-parser-generator.min.js","isAsset":true,"statSize":1206537,"parsedSize":530100,"gzipSize":103036,"groups":[{"label":"dist/browser/cjs","path":"./dist/browser/cjs","statSize":1199557,"groups":[{"id":922,"label":"index.cjs","path":"./dist/browser/cjs/index.cjs","statSize":1199557,"parsedSize":529996,"gzipSize":103036}],"parsedSize":529996,"gzipSize":103036},{"label":"node_modules/@ncoderz/superenum/dist/esm","path":"./node_modules/@ncoderz/superenum/dist/esm","statSize":6980,"groups":[{"id":718,"label":"superenum.js","path":"./node_modules/@ncoderz/superenum/dist/esm/superenum.js","statSize":6980}],"parsedSize":0,"gzipSize":0}],"isInitialByEntrypoint":{"main":true}}];
35
35
  window.entrypoints = ["main"];
36
36
  window.defaultSizes = "stat";
37
37
  </script>
@@ -167,6 +167,9 @@ var BitType = (0, import_superenum.superenum)({
167
167
  bugAlt: "bug-alt",
168
168
  bugCollapsible: "bug-collapsible",
169
169
  buttonCopyText: "button-copy-text",
170
+ catalogItemBook: "catalog-item-book",
171
+ catalogItemExternalBook: "catalog-item-external-book",
172
+ catalogItemProduct: "catalog-item-product",
170
173
  callToAction: "call-to-action",
171
174
  callToActionBookNow: "call-to-action-book-now",
172
175
  callToActionContact: "call-to-action-contact",
@@ -288,8 +291,8 @@ var BitType = (0, import_superenum.superenum)({
288
291
  extractorAiChat: "extractor-ai-chat",
289
292
  extractorBlock: "extractor-block",
290
293
  extractorConfiguration: "extractor-configuration",
291
- extractorImage: "extractor-image",
292
- extractorImageCollapsible: "extractor-image-collapsible",
294
+ extractorImages: "extractor-images",
295
+ extractorImagesCollapsible: "extractor-images-collapsible",
293
296
  extractorInformation: "extractor-information",
294
297
  extractorPage: "extractor-page",
295
298
  extractorPageCollapsible: "extractor-page-collapsible",
@@ -1194,6 +1197,9 @@ var propertyKeys = {
1194
1197
  property_colorTag: "@colorTag",
1195
1198
  property_computerLanguage: "@computerLanguage",
1196
1199
  property_content2Buy: "@content2Buy",
1200
+ property_listPrice: "@listPrice",
1201
+ property_customerProductId: "@customerProductId",
1202
+ property_customerProductShopLink: "@customerProductShopLink",
1197
1203
  property_copyright: "@copyright",
1198
1204
  property_coverColor: "@coverColor",
1199
1205
  property_coverImage: "@coverImage",
@@ -1267,6 +1273,7 @@ var propertyKeys = {
1267
1273
  property_listItemIndent: "@listItemIndent",
1268
1274
  property_location: "@location",
1269
1275
  property_machineTranslated: "@machineTranslated",
1276
+ property_spansPageBreak: "@spansPageBreak",
1270
1277
  property_mailingList: "@mailingList",
1271
1278
  property_mark: "@mark",
1272
1279
  property_maxCreatedBits: "@maxCreatedBits",
@@ -2736,6 +2743,11 @@ var GROUPS = {
2736
2743
  description: "If true, the bit is machine-translated",
2737
2744
  format: TagFormat.plainText
2738
2745
  },
2746
+ {
2747
+ key: ConfigKey.property_spansPageBreak,
2748
+ description: "If true, the bit spans a page break",
2749
+ format: TagFormat.boolean
2750
+ },
2739
2751
  {
2740
2752
  key: ConfigKey.property_searchIndex,
2741
2753
  description: "The search index(es) for the bit",
@@ -4545,6 +4557,120 @@ var BITS = {
4545
4557
  }
4546
4558
  ]
4547
4559
  },
4560
+ [BitType.catalogItemBook]: {
4561
+ since: "4.15.0",
4562
+ baseBitType: BitType._standard,
4563
+ description: "Catalog item book bit, used to represent a book product in a catalog with cover and description",
4564
+ tags: [
4565
+ {
4566
+ key: ConfigKey.tag_title,
4567
+ description: "Title and subtitle of the catalog item",
4568
+ maxCount: 2
4569
+ },
4570
+ {
4571
+ key: ConfigKey.property_coverImage,
4572
+ description: "Cover image of the catalog item",
4573
+ format: TagFormat.plainText
4574
+ },
4575
+ {
4576
+ key: ConfigKey.property_content2Buy,
4577
+ description: "Content to buy identifier",
4578
+ format: TagFormat.plainText
4579
+ },
4580
+ {
4581
+ key: ConfigKey.property_listPrice,
4582
+ description: "List price of the catalog item",
4583
+ format: TagFormat.plainText
4584
+ },
4585
+ {
4586
+ key: ConfigKey.property_buttonCaption,
4587
+ description: "Caption for the buy button",
4588
+ format: TagFormat.plainText
4589
+ },
4590
+ {
4591
+ key: ConfigKey.property_customerProductId,
4592
+ description: "Customer-specific product identifier",
4593
+ format: TagFormat.plainText
4594
+ }
4595
+ ],
4596
+ rootExampleType: ExampleType.string
4597
+ },
4598
+ [BitType.catalogItemExternalBook]: {
4599
+ since: "4.15.0",
4600
+ baseBitType: BitType._standard,
4601
+ description: "Catalog item external book bit, used to represent an external book product in a catalog with link to external shop",
4602
+ tags: [
4603
+ {
4604
+ key: ConfigKey.tag_title,
4605
+ description: "Title and subtitle of the catalog item",
4606
+ maxCount: 2
4607
+ },
4608
+ {
4609
+ key: ConfigKey.property_coverImage,
4610
+ description: "Cover image of the catalog item",
4611
+ format: TagFormat.plainText
4612
+ },
4613
+ {
4614
+ key: ConfigKey.property_customerProductShopLink,
4615
+ description: "Link to external shop for the product",
4616
+ format: TagFormat.plainText
4617
+ },
4618
+ {
4619
+ key: ConfigKey.property_listPrice,
4620
+ description: "List price of the catalog item",
4621
+ format: TagFormat.plainText
4622
+ },
4623
+ {
4624
+ key: ConfigKey.property_buttonCaption,
4625
+ description: "Caption for the buy button",
4626
+ format: TagFormat.plainText
4627
+ },
4628
+ {
4629
+ key: ConfigKey.property_customerProductId,
4630
+ description: "Customer-specific product identifier",
4631
+ format: TagFormat.plainText
4632
+ }
4633
+ ],
4634
+ rootExampleType: ExampleType.string
4635
+ },
4636
+ [BitType.catalogItemProduct]: {
4637
+ since: "4.15.0",
4638
+ baseBitType: BitType._standard,
4639
+ description: "Catalog item product bit, used to represent a general product in a catalog with cover and description",
4640
+ tags: [
4641
+ {
4642
+ key: ConfigKey.tag_title,
4643
+ description: "Title and subtitle of the catalog item",
4644
+ maxCount: 2
4645
+ },
4646
+ {
4647
+ key: ConfigKey.property_coverImage,
4648
+ description: "Cover image of the catalog item",
4649
+ format: TagFormat.plainText
4650
+ },
4651
+ {
4652
+ key: ConfigKey.property_content2Buy,
4653
+ description: "Content to buy identifier",
4654
+ format: TagFormat.plainText
4655
+ },
4656
+ {
4657
+ key: ConfigKey.property_listPrice,
4658
+ description: "List price of the catalog item",
4659
+ format: TagFormat.plainText
4660
+ },
4661
+ {
4662
+ key: ConfigKey.property_buttonCaption,
4663
+ description: "Caption for the buy button",
4664
+ format: TagFormat.plainText
4665
+ },
4666
+ {
4667
+ key: ConfigKey.property_customerProductId,
4668
+ description: "Customer-specific product identifier",
4669
+ format: TagFormat.plainText
4670
+ }
4671
+ ],
4672
+ rootExampleType: ExampleType.string
4673
+ },
4548
4674
  [BitType.callToAction]: {
4549
4675
  since: "1.15.0",
4550
4676
  baseBitType: BitType._standard,
@@ -6628,17 +6754,30 @@ var BITS = {
6628
6754
  description: "Extractor configuration bit, used to configure extractors in articles or books",
6629
6755
  textFormatDefault: TextFormat2.plainText
6630
6756
  },
6631
- [BitType.extractorImage]: {
6757
+ [BitType.extractorImages]: {
6632
6758
  since: "4.3.0",
6633
- baseBitType: BitType.image,
6634
- description: "Extractor embedded image bit, used for embedded images extracted from PDFs",
6759
+ baseBitType: BitType._standard,
6760
+ description: "Extractor images bit, used for images extracted from PDFs",
6761
+ tags: [
6762
+ {
6763
+ key: ConfigKey.group_resourceBitTags,
6764
+ description: "Resource bit tags for logo grave images, used to define additional properties"
6765
+ },
6766
+ {
6767
+ // Image resource
6768
+ key: ConfigKey.group_resourceImage,
6769
+ description: "Resource image tags for logo grave images, used to attach images",
6770
+ minCount: 1,
6771
+ maxCount: Count.infinity
6772
+ }
6773
+ ],
6774
+ resourceAttachmentAllowed: false,
6635
6775
  textFormatDefault: TextFormat2.plainText
6636
6776
  },
6637
- [BitType.extractorImageCollapsible]: {
6777
+ [BitType.extractorImagesCollapsible]: {
6638
6778
  since: "4.3.0",
6639
- baseBitType: BitType.extractorImage,
6640
- description: "Collapsible extractor embedded image bit, used for embedded images extracted from PDFs",
6641
- textFormatDefault: TextFormat2.plainText
6779
+ baseBitType: BitType.extractorImages,
6780
+ description: "Collapsible extractor images bit, used for images extracted from PDFs"
6642
6781
  },
6643
6782
  [BitType.extractorInformation]: {
6644
6783
  since: "3.8.0",
@@ -9605,7 +9744,7 @@ var instance2 = new Config();
9605
9744
  // src/generated/package_info.ts
9606
9745
  var PACKAGE_INFO = {
9607
9746
  "name": "@gmb/bitmark-parser-generator",
9608
- "version": "4.14.0",
9747
+ "version": "4.15.0",
9609
9748
  "author": "Get More Brain Ltd",
9610
9749
  "license": "ISC",
9611
9750
  "description": "A bitmark parser and generator using Peggy.js"
@@ -10072,6 +10211,8 @@ var NodeType = (0, import_superenum20.superenum)({
10072
10211
  customerExternalId: "customerExternalId",
10073
10212
  customerId: "customerId",
10074
10213
  customerIdValue: "customerIdValue",
10214
+ customerProductId: "customerProductId",
10215
+ customerProductShopLink: "customerProductShopLink",
10075
10216
  data: "data",
10076
10217
  dataValue: "dataValue",
10077
10218
  dataValueValue: "dataValueValue",
@@ -10253,11 +10394,14 @@ var NodeType = (0, import_superenum20.superenum)({
10253
10394
  list: "list",
10254
10395
  listItemIndent: "listItemIndent",
10255
10396
  listItemIndentValue: "listItemIndentValue",
10397
+ listPrice: "listPrice",
10256
10398
  listValue: "listValue",
10257
10399
  location: "location",
10258
10400
  locationValue: "locationValue",
10259
10401
  machineTranslated: "machineTranslated",
10260
10402
  machineTranslatedValue: "machineTranslatedValue",
10403
+ spansPageBreak: "spansPageBreak",
10404
+ spansPageBreakValue: "spansPageBreakValue",
10261
10405
  mailingList: "mailingList",
10262
10406
  marginNumber: "marginNumber",
10263
10407
  marginNumberValue: "marginNumberValue",
@@ -11038,22 +11182,22 @@ var DeprecatedTextFormat = (0, import_superenum23.superenum)({
11038
11182
  // src/parser/json/TableUtils.ts
11039
11183
  function isTableBasicFormat(table) {
11040
11184
  const t = table;
11041
- return !!(t.columns || t.data) && !(t.head || t.body || t.foot);
11185
+ return !!(t.columns || t.data) && !(t.header || t.body || t.footer);
11042
11186
  }
11043
11187
  function isTableExtendedFormat(table) {
11044
11188
  const t = table;
11045
- return !!(t.head || t.body || t.foot);
11189
+ return !!(t.header || t.body || t.footer);
11046
11190
  }
11047
11191
  function isMixedTableFormat(table) {
11048
11192
  const t = table;
11049
11193
  const hasOld = !!(t.columns || t.data);
11050
- const hasNew = !!(t.head || t.body || t.foot);
11194
+ const hasNew = !!(t.header || t.body || t.footer);
11051
11195
  return hasOld && hasNew;
11052
11196
  }
11053
11197
  function convertBasicToExtendedTableFormat(table) {
11054
11198
  const tableExtended = {};
11055
11199
  if (table.columns && table.columns.length > 0) {
11056
- tableExtended.head = {
11200
+ tableExtended.header = {
11057
11201
  rows: [
11058
11202
  {
11059
11203
  cells: table.columns.map((col) => ({
@@ -11084,7 +11228,7 @@ function convertExtendedToBasicTableFormat(tableExtended) {
11084
11228
  return row.cells.map((cell) => cell?.content).filter((content) => content !== void 0);
11085
11229
  };
11086
11230
  const dataRows = [];
11087
- const headRows = tableExtended.head?.rows ?? [];
11231
+ const headRows = tableExtended.header?.rows ?? [];
11088
11232
  if (headRows.length > 0) {
11089
11233
  const primaryHeader = extractRowCells(headRows[0]);
11090
11234
  if (primaryHeader.length > 0) {
@@ -11110,7 +11254,7 @@ function convertExtendedToBasicTableFormat(tableExtended) {
11110
11254
  });
11111
11255
  };
11112
11256
  appendSectionRows(tableExtended.body);
11113
- appendSectionRows(tableExtended.foot);
11257
+ appendSectionRows(tableExtended.footer);
11114
11258
  if (dataRows.length > 0) {
11115
11259
  table.data = dataRows;
11116
11260
  }
@@ -22070,7 +22214,8 @@ var ResourceBuilder = class extends BaseBuilder {
22070
22214
  BitType.imageSeparator,
22071
22215
  BitType.pageBanner,
22072
22216
  BitType.imagesLogoGrave,
22073
- BitType.prototypeImages
22217
+ BitType.prototypeImages,
22218
+ BitType.extractorImages
22074
22219
  ])) {
22075
22220
  zoomDisabledDefault = true;
22076
22221
  }
@@ -23021,6 +23166,12 @@ var Builder = class extends BaseBuilder {
23021
23166
  data.machineTranslated,
23022
23167
  options
23023
23168
  ),
23169
+ spansPageBreak: this.toAstProperty(
23170
+ bitType,
23171
+ ConfigKey.property_spansPageBreak,
23172
+ data.spansPageBreak,
23173
+ options
23174
+ ),
23024
23175
  searchIndex: this.toAstProperty(
23025
23176
  bitType,
23026
23177
  ConfigKey.property_searchIndex,
@@ -23489,6 +23640,19 @@ var Builder = class extends BaseBuilder {
23489
23640
  data.content2Buy,
23490
23641
  options
23491
23642
  ),
23643
+ listPrice: this.toAstProperty(bitType, ConfigKey.property_listPrice, data.listPrice, options),
23644
+ customerProductId: this.toAstProperty(
23645
+ bitType,
23646
+ ConfigKey.property_customerProductId,
23647
+ data.customerProductId,
23648
+ options
23649
+ ),
23650
+ customerProductShopLink: this.toAstProperty(
23651
+ bitType,
23652
+ ConfigKey.property_customerProductShopLink,
23653
+ data.customerProductShopLink,
23654
+ options
23655
+ ),
23492
23656
  mailingList: this.toAstProperty(
23493
23657
  bitType,
23494
23658
  ConfigKey.property_mailingList,
@@ -24410,12 +24574,12 @@ var Builder = class extends BaseBuilder {
24410
24574
  rows
24411
24575
  };
24412
24576
  };
24413
- const head = buildSection(nodeTableExtended.head);
24414
- if (head && head.rows?.length > 0) nodeTableExtended.head = head;
24577
+ const header = buildSection(nodeTableExtended.header);
24578
+ if (header && header.rows?.length > 0) nodeTableExtended.header = header;
24415
24579
  const body = buildSection(nodeTableExtended.body);
24416
24580
  if (body && body.rows?.length > 0) nodeTableExtended.body = body;
24417
- const foot = buildSection(nodeTableExtended.foot);
24418
- if (foot && foot.rows?.length > 0) nodeTableExtended.foot = foot;
24581
+ const footer = buildSection(nodeTableExtended.footer);
24582
+ if (footer && footer.rows?.length > 0) nodeTableExtended.footer = footer;
24419
24583
  return node;
24420
24584
  }
24421
24585
  /**
@@ -26610,9 +26774,9 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
26610
26774
  writeAdvancedTable(table) {
26611
26775
  const normalized = normalizeTableFormat(BitType.tableExtended, table);
26612
26776
  const sections = [
26613
- { key: "thead", qualifier: "thead", section: normalized.head },
26614
- { key: "tbody", qualifier: void 0, section: normalized.body },
26615
- { key: "tfoot", qualifier: "tfoot", section: normalized.foot }
26777
+ { key: "header", qualifier: "table-header", section: normalized.header },
26778
+ { key: "body", qualifier: void 0, section: normalized.body },
26779
+ { key: "footer", qualifier: "table-footer", section: normalized.footer }
26616
26780
  ];
26617
26781
  let rowCount = 0;
26618
26782
  for (const { key, qualifier, section } of sections) {
@@ -26640,7 +26804,7 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
26640
26804
  }
26641
26805
  }
26642
26806
  writeTableCell(cell, section) {
26643
- const defaultCellType = section === "tbody" ? "td" : "th";
26807
+ const defaultCellType = section === "body" ? "td" : "th";
26644
26808
  const cellType = cell.title ? "th" : "td";
26645
26809
  if (cellType !== defaultCellType) {
26646
26810
  this.writeTableCellProperty("tableCellType", cellType);
@@ -27195,6 +27359,7 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27195
27359
  this.writeNL();
27196
27360
  this.writeTextOrValue(node.value, this.textFormat, TextLocation2.body);
27197
27361
  }
27362
+ return false;
27198
27363
  }
27199
27364
  // bitmarkAst -> bits -> bitsValue -> body -> bodyValue -> gap -> solutions -> solution
27200
27365
  // ? -> solutions -> solution
@@ -27276,11 +27441,12 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27276
27441
  // bitmarkAst -> bits -> bitsValue -> cardNode -> questions -> questionsValue -> question
27277
27442
  enter_question(node, route) {
27278
27443
  const parent = this.getParentNode(route);
27279
- if (parent?.key !== NodeType.questionsValue) return;
27444
+ if (parent?.key !== NodeType.questionsValue) return true;
27280
27445
  if (node.value) {
27281
27446
  this.writeNL();
27282
27447
  this.writeTextOrValue(node.value, this.textFormat, TextLocation2.body);
27283
27448
  }
27449
+ return false;
27284
27450
  }
27285
27451
  // bitmarkAst -> bits -> bitsValue -> cardNode -> flashcards -> flashcardsValue -> question
27286
27452
  leaf_question(node, route) {
@@ -27341,7 +27507,8 @@ var BitmarkGenerator = class extends AstWalkerGenerator {
27341
27507
  BitType.imageSeparator,
27342
27508
  BitType.pageBanner,
27343
27509
  BitType.imagesLogoGrave,
27344
- BitType.prototypeImages
27510
+ BitType.prototypeImages,
27511
+ BitType.extractorImages
27345
27512
  ])) {
27346
27513
  this.writeProperty("zoomDisabled", node.value, route, {
27347
27514
  format: TagFormat.boolean,
@@ -28549,7 +28716,11 @@ var JsonGenerator = class extends AstWalkerGenerator {
28549
28716
  }
28550
28717
  resourceJson = wrapper;
28551
28718
  }
28552
- } else if (instance2.isOfBitType(bitType, [BitType.imagesLogoGrave, BitType.prototypeImages])) {
28719
+ } else if (instance2.isOfBitType(bitType, [
28720
+ BitType.imagesLogoGrave,
28721
+ BitType.prototypeImages,
28722
+ BitType.extractorImages
28723
+ ])) {
28553
28724
  const images = [];
28554
28725
  for (const r of resources) {
28555
28726
  if (r.type === ResourceType.image) {
@@ -29126,7 +29297,11 @@ var JsonGenerator = class extends AstWalkerGenerator {
29126
29297
  if (bitJson.resolvedDate == null) bitJson.resolvedDate = "";
29127
29298
  if (bitJson.resolvedBy == null) bitJson.resolvedBy = "";
29128
29299
  }
29129
- if (instance2.isOfBitType(bitType, [BitType.imagesLogoGrave, BitType.prototypeImages])) {
29300
+ if (instance2.isOfBitType(bitType, [
29301
+ BitType.imagesLogoGrave,
29302
+ BitType.prototypeImages,
29303
+ BitType.extractorImages
29304
+ ])) {
29130
29305
  if (bitType === BitType.imagesLogoGrave) {
29131
29306
  if (bitJson.logos == null) {
29132
29307
  bitJson.logos = [];
@@ -29554,7 +29729,7 @@ var JsonParser = class {
29554
29729
  processResources(bitType, resource, images, logos) {
29555
29730
  const nodes = [];
29556
29731
  if (resource) nodes.push(resource);
29557
- if (instance2.isOfBitType(bitType, [BitType.prototypeImages])) {
29732
+ if (instance2.isOfBitType(bitType, [BitType.prototypeImages, BitType.extractorImages])) {
29558
29733
  if (Array.isArray(images)) {
29559
29734
  for (const image of images) {
29560
29735
  if (image) nodes.push(image);
@@ -31746,17 +31921,17 @@ function parsePronunciationTable(_context, _bitType, cardSet) {
31746
31921
  }
31747
31922
  function parseTable(context, _bitType, cardSet) {
31748
31923
  const sectionRows = {
31749
- thead: [],
31750
- tbody: [],
31751
- tfoot: []
31924
+ header: [],
31925
+ body: [],
31926
+ footer: []
31752
31927
  };
31753
31928
  const getNormalizedQualifier = (rawQualifier) => {
31754
31929
  if (!rawQualifier) return void 0;
31755
31930
  const normalized = rawQualifier.trim().toLowerCase();
31756
- if (normalized === "thead" || normalized === "tbody" || normalized === "tfoot") {
31757
- return normalized;
31758
- }
31759
- context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to tbody.`);
31931
+ if (normalized === "table-header") return "header";
31932
+ if (normalized === "table-body") return "body";
31933
+ if (normalized === "table-footer") return "footer";
31934
+ context.addWarning(`Unknown table section qualifier '${rawQualifier}', defaulting to body.`);
31760
31935
  return void 0;
31761
31936
  };
31762
31937
  const isLegacyHeadingRow = (card, cardIndex) => {
@@ -31793,7 +31968,7 @@ function parseTable(context, _bitType, cardSet) {
31793
31968
  `Invalid table cell type '${raw}', using default for section '${section}'.`
31794
31969
  );
31795
31970
  }
31796
- return section === "tbody" ? "td" : "th";
31971
+ return section === "body" ? "td" : "th";
31797
31972
  };
31798
31973
  const normalizeSpan = (raw, kind) => {
31799
31974
  if (raw == null) return 1;
@@ -31861,7 +32036,7 @@ function parseTable(context, _bitType, cardSet) {
31861
32036
  for (let cardIdx = 0; cardIdx < cardSet.cards.length; cardIdx++) {
31862
32037
  const card = cardSet.cards[cardIdx];
31863
32038
  const qualifier = resolveSectionQualifier(card);
31864
- const section = qualifier ? qualifier : isLegacyHeadingRow(card, cardIdx) ? "thead" : "tbody";
32039
+ const section = qualifier ? qualifier : isLegacyHeadingRow(card, cardIdx) ? "header" : "body";
31865
32040
  const cells = [];
31866
32041
  for (const side of card.sides) {
31867
32042
  for (const variant of side.variants) {
@@ -31873,28 +32048,28 @@ function parseTable(context, _bitType, cardSet) {
31873
32048
  });
31874
32049
  }
31875
32050
  const table = {};
31876
- const hasHeadRows = sectionRows.thead.length > 0;
31877
- const hasBodyRows = sectionRows.tbody.length > 0;
31878
- const hasFootRows = sectionRows.tfoot.length > 0;
32051
+ const hasHeadRows = sectionRows.header.length > 0;
32052
+ const hasBodyRows = sectionRows.body.length > 0;
32053
+ const hasFootRows = sectionRows.footer.length > 0;
31879
32054
  if (hasHeadRows) {
31880
- table.head = {
31881
- rows: sectionRows.thead
32055
+ table.header = {
32056
+ rows: sectionRows.header
31882
32057
  };
31883
32058
  }
31884
32059
  if (hasBodyRows) {
31885
32060
  table.body = {
31886
- rows: sectionRows.tbody
32061
+ rows: sectionRows.body
31887
32062
  };
31888
32063
  }
31889
32064
  if (hasFootRows) {
31890
- table.foot = {
31891
- rows: sectionRows.tfoot
32065
+ table.footer = {
32066
+ rows: sectionRows.footer
31892
32067
  };
31893
32068
  }
31894
32069
  if (!hasHeadRows && !hasBodyRows && !hasFootRows) {
31895
- table.head = { rows: [] };
32070
+ table.header = { rows: [] };
31896
32071
  table.body = { rows: [] };
31897
- table.foot = { rows: [] };
32072
+ table.footer = { rows: [] };
31898
32073
  }
31899
32074
  return { table };
31900
32075
  }