@claritylabs/cl-sdk 3.0.15 → 3.0.16

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.mjs CHANGED
@@ -2650,12 +2650,13 @@ function isTitleContentNode(node) {
2650
2650
  if (!text || text.length > 140) return false;
2651
2651
  const words = text.split(/\s+/);
2652
2652
  if (words.length > 14) return false;
2653
- const startsWithStructuredHeading = /^(section|item|part|coverage part|endorsement|schedule|article)\b|^[A-Z]\.\s|\b[IVX]+\.\s/i.test(text);
2653
+ const startsWithStructuredHeading = /^(section|item|part|endorsement|schedule|article)\b|^[A-Z]\.\s|\b[IVX]+\.\s/i.test(text);
2654
2654
  const uppercaseLetters = [...text].filter((char) => /[A-Z]/.test(char)).length;
2655
2655
  const lowercaseLetters = [...text].filter((char) => /[a-z]/.test(char)).length;
2656
2656
  const mostlyUppercase = uppercaseLetters > 0 && uppercaseLetters >= lowercaseLetters * 1.6;
2657
+ const containsSentencePunctuation = /[.;:]\s+\S/.test(text) || /[.;:]$/.test(text);
2657
2658
  const sentenceLike = /\b(is|are|was|were|will|shall|may|must|means|includes|provided|subject|available|attached|remain|constitutes)\b/i.test(text) && /[a-z]/.test(text);
2658
- return startsWithStructuredHeading || mostlyUppercase && !sentenceLike;
2659
+ return startsWithStructuredHeading || mostlyUppercase && !sentenceLike && !containsSentencePunctuation;
2659
2660
  }
2660
2661
  function nodePageEnd(node) {
2661
2662
  return node.pageEnd ?? node.pageStart;
@@ -9227,12 +9228,28 @@ function nodePageEnd2(node) {
9227
9228
  return node.pageEnd ?? node.pageStart;
9228
9229
  }
9229
9230
  function pageRangeForNodes(nodes) {
9230
- const pageStarts = nodes.map((node) => node.pageStart).filter((page) => typeof page === "number");
9231
- const pageEnds = nodes.map(nodePageEnd2).filter((page) => typeof page === "number");
9232
- if (pageStarts.length === 0 || pageEnds.length === 0) return void 0;
9233
- const start = Math.min(...pageStarts);
9234
- const end = Math.max(...pageEnds);
9235
- return start === end ? `page ${start}` : `pages ${start}-${end}`;
9231
+ const pages = [...new Set(nodes.flatMap((node) => {
9232
+ if (typeof node.pageStart !== "number") return [];
9233
+ const end = nodePageEnd2(node) ?? node.pageStart;
9234
+ const values = [];
9235
+ for (let page = node.pageStart; page <= end; page += 1) values.push(page);
9236
+ return values;
9237
+ }))].sort((left, right) => left - right);
9238
+ if (pages.length === 0) return void 0;
9239
+ const ranges = [];
9240
+ let start = pages[0];
9241
+ let previous = pages[0];
9242
+ for (const page of pages.slice(1)) {
9243
+ if (page === previous + 1) {
9244
+ previous = page;
9245
+ continue;
9246
+ }
9247
+ ranges.push(start === previous ? String(start) : `${start}-${previous}`);
9248
+ start = page;
9249
+ previous = page;
9250
+ }
9251
+ ranges.push(start === previous ? String(start) : `${start}-${previous}`);
9252
+ return ranges.length === 1 && !ranges[0].includes("-") ? `page ${ranges[0]}` : `pages ${ranges.join(", ")}`;
9236
9253
  }
9237
9254
  function descriptionWithPages(description, nodes) {
9238
9255
  const range = pageRangeForNodes(nodes);
@@ -9579,6 +9596,10 @@ function normalizeContainerEvidenceFromChildren(sourceTree) {
9579
9596
  pageEnd: pageEnds.length ? Math.max(...pageEnds) : currentNode.pageEnd,
9580
9597
  bbox,
9581
9598
  order: Math.min(currentNode.order, ...children.map((child) => child.order)),
9599
+ description: descriptionWithPages(
9600
+ currentNode.description.replace(/;\s*pages?\s+[0-9,\s-]+$/i, ""),
9601
+ evidenceNodes
9602
+ ),
9582
9603
  textExcerpt: shouldUseOwnEvidenceForContainer(currentNode) ? currentNode.textExcerpt : childText || currentNode.textExcerpt
9583
9604
  });
9584
9605
  }