@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.js CHANGED
@@ -3005,12 +3005,13 @@ function isTitleContentNode(node) {
3005
3005
  if (!text || text.length > 140) return false;
3006
3006
  const words = text.split(/\s+/);
3007
3007
  if (words.length > 14) return false;
3008
- const startsWithStructuredHeading = /^(section|item|part|coverage part|endorsement|schedule|article)\b|^[A-Z]\.\s|\b[IVX]+\.\s/i.test(text);
3008
+ const startsWithStructuredHeading = /^(section|item|part|endorsement|schedule|article)\b|^[A-Z]\.\s|\b[IVX]+\.\s/i.test(text);
3009
3009
  const uppercaseLetters = [...text].filter((char) => /[A-Z]/.test(char)).length;
3010
3010
  const lowercaseLetters = [...text].filter((char) => /[a-z]/.test(char)).length;
3011
3011
  const mostlyUppercase = uppercaseLetters > 0 && uppercaseLetters >= lowercaseLetters * 1.6;
3012
+ const containsSentencePunctuation = /[.;:]\s+\S/.test(text) || /[.;:]$/.test(text);
3012
3013
  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);
3013
- return startsWithStructuredHeading || mostlyUppercase && !sentenceLike;
3014
+ return startsWithStructuredHeading || mostlyUppercase && !sentenceLike && !containsSentencePunctuation;
3014
3015
  }
3015
3016
  function nodePageEnd(node) {
3016
3017
  return node.pageEnd ?? node.pageStart;
@@ -9574,12 +9575,28 @@ function nodePageEnd2(node) {
9574
9575
  return node.pageEnd ?? node.pageStart;
9575
9576
  }
9576
9577
  function pageRangeForNodes(nodes) {
9577
- const pageStarts = nodes.map((node) => node.pageStart).filter((page) => typeof page === "number");
9578
- const pageEnds = nodes.map(nodePageEnd2).filter((page) => typeof page === "number");
9579
- if (pageStarts.length === 0 || pageEnds.length === 0) return void 0;
9580
- const start = Math.min(...pageStarts);
9581
- const end = Math.max(...pageEnds);
9582
- return start === end ? `page ${start}` : `pages ${start}-${end}`;
9578
+ const pages = [...new Set(nodes.flatMap((node) => {
9579
+ if (typeof node.pageStart !== "number") return [];
9580
+ const end = nodePageEnd2(node) ?? node.pageStart;
9581
+ const values = [];
9582
+ for (let page = node.pageStart; page <= end; page += 1) values.push(page);
9583
+ return values;
9584
+ }))].sort((left, right) => left - right);
9585
+ if (pages.length === 0) return void 0;
9586
+ const ranges = [];
9587
+ let start = pages[0];
9588
+ let previous = pages[0];
9589
+ for (const page of pages.slice(1)) {
9590
+ if (page === previous + 1) {
9591
+ previous = page;
9592
+ continue;
9593
+ }
9594
+ ranges.push(start === previous ? String(start) : `${start}-${previous}`);
9595
+ start = page;
9596
+ previous = page;
9597
+ }
9598
+ ranges.push(start === previous ? String(start) : `${start}-${previous}`);
9599
+ return ranges.length === 1 && !ranges[0].includes("-") ? `page ${ranges[0]}` : `pages ${ranges.join(", ")}`;
9583
9600
  }
9584
9601
  function descriptionWithPages(description, nodes) {
9585
9602
  const range = pageRangeForNodes(nodes);
@@ -9926,6 +9943,10 @@ function normalizeContainerEvidenceFromChildren(sourceTree) {
9926
9943
  pageEnd: pageEnds.length ? Math.max(...pageEnds) : currentNode.pageEnd,
9927
9944
  bbox,
9928
9945
  order: Math.min(currentNode.order, ...children.map((child) => child.order)),
9946
+ description: descriptionWithPages(
9947
+ currentNode.description.replace(/;\s*pages?\s+[0-9,\s-]+$/i, ""),
9948
+ evidenceNodes
9949
+ ),
9929
9950
  textExcerpt: shouldUseOwnEvidenceForContainer(currentNode) ? currentNode.textExcerpt : childText || currentNode.textExcerpt
9930
9951
  });
9931
9952
  }