eyecite-ts 0.21.2 → 0.21.4

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.
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t,i={}){let{useCleanText:a=!1,autoEscape:o=!0,useFullSpan:s=!1,template:c,callback:l}=i,u=[...t].sort((e,t)=>{let n=a?e.span.cleanStart:e.span.originalStart;return(a?t.span.cleanStart:t.span.originalStart)-n}),d=e,f=new Map,p=[];for(let t of u){let i,u;if(s&&`fullSpan`in t&&t.fullSpan?(i=a?t.fullSpan.cleanStart:t.fullSpan.originalStart,u=a?t.fullSpan.cleanEnd:t.fullSpan.originalEnd):(i=a?t.span.cleanStart:t.span.originalStart,u=a?t.span.cleanEnd:t.span.originalEnd),!a){let e=n(d,i,u);if(e===null){p.push(t);continue}i=e.start,u=e.end}let m=``;if(l)m=l(t,e.substring(Math.max(0,i-30),Math.min(e.length,u+30)));else if(c){let e=d.substring(i,u),t=o?r(e):e;m=c.before+t+c.after}else continue;d=d.slice(0,i)+m+d.slice(u),f.set(i,i)}return{text:d,positionMap:f,skipped:p}}function t(e,t){let n=t-1;for(;n>=0;){if(e[n]===`>`)return null;if(e[n]===`<`){let r=t;for(;r<e.length;){if(e[r]===`>`)return{tagStart:n,tagEnd:r+1};r++}return{tagStart:n,tagEnd:e.length}}n--}return null}function n(e,n,r){let i=n,a=r,o=t(e,n);o&&(i=o.tagStart);let s=t(e,r);return s&&(a=s.tagEnd),i>=a?null:{start:i,end:a}}function r(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`};return e.replace(/[&<>"'/]/g,e=>t[e])}exports.annotate=e;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t,n={}){let{useCleanText:a=!1,autoEscape:o=!0,useFullSpan:s=!1,template:c,callback:l}=n,u=[...t.map(e=>{let t=s&&`fullSpan`in e&&e.fullSpan?e.fullSpan:e.span;return{citation:e,start:a?t.cleanStart:t.originalStart,end:a?t.cleanEnd:t.originalEnd}})].sort((e,t)=>e.start===t.start?t.end-e.end:e.start-t.start),d=[],f=[];for(let e of u){let t=f[f.length-1];if(t!==void 0&&e.start<t.end){if(e.end<=t.end){d.push(e.citation);continue}let n=t.citation.confidence??0;(e.citation.confidence??0)>n?(f.pop(),d.push(t.citation),f.push(e)):d.push(e.citation);continue}f.push(e)}let p=[...f].sort((e,t)=>t.start-e.start),m=e,h=new Map;for(let t of p){let{citation:n}=t,s=t.start,u=t.end;if(!a){let e=r(m,s,u);if(e===null){d.push(n);continue}s=e.start,u=e.end}let f=``;if(l)f=l(n,e.substring(Math.max(0,s-30),Math.min(e.length,u+30)));else if(c){let e=m.substring(s,u),t=o?i(e):e;f=c.before+t+c.after}else continue;m=m.slice(0,s)+f+m.slice(u),h.set(s,s)}return{text:m,positionMap:h,skipped:d}}function t(e,t){let r=t-1;for(;r>=0;){if(e[r]===`>`)return null;if(e[r]===`<`){if(!n(e,r)){r--;continue}let i=t;for(;i<e.length;){if(e[i]===`>`)return{tagStart:r,tagEnd:i+1};i++}return{tagStart:r,tagEnd:e.length}}r--}return null}function n(e,t){let n=e[t+1];return n===void 0?!1:/[a-zA-Z!/]/.test(n)}function r(e,n,r){let i=n,a=r,o=t(e,n);o&&(i=o.tagStart);let s=t(e,r);return s&&(a=s.tagEnd),i>=a?null:{start:i,end:a}}function i(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`};return e.replace(/[&<>"'/]/g,e=>t[e])}exports.annotate=e;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../src/annotate/annotate.ts"],"sourcesContent":["import type { Citation } from \"../types/citation\"\nimport type { AnnotationOptions, AnnotationResult } from \"./types\"\n\n/**\n * Annotate citations in text with custom markup.\n *\n * Supports two modes:\n * - **Template mode**: Simple before/after wrapping (set `options.template`)\n * - **Callback mode**: Custom logic with full citation context (set `options.callback`)\n *\n * Citations are processed in reverse order to avoid position shifts invalidating\n * subsequent annotations. Position tracking maps original positions to new positions\n * after markup insertion.\n *\n * @param text - Original or cleaned text to annotate\n * @param citations - Citations to mark up (from extraction pipeline)\n * @param options - Annotation configuration\n * @returns Annotated text with position mapping\n *\n * @example Template mode\n * ```typescript\n * const result = annotate(text, citations, {\n * template: { before: '<cite>', after: '</cite>' }\n * })\n * // Result: \"See <cite>500 F.2d 123</cite>\"\n * ```\n *\n * @example Callback mode\n * ```typescript\n * const result = annotate(text, citations, {\n * callback: (citation) => {\n * if (citation.type === 'case') {\n * return `<a href=\"/cases/${citation.volume}\">${citation.matchedText}</a>`\n * }\n * return citation.matchedText\n * }\n * })\n * ```\n *\n * @example Position tracking\n * ```typescript\n * const result = annotate(text, citations, { template: { before: '<mark>', after: '</mark>' } })\n * // result.positionMap tracks how positions shifted\n * const originalPos = 10\n * const newPos = result.positionMap.get(originalPos)\n * ```\n */\nexport function annotate<C extends Citation = Citation>(\n text: string,\n citations: C[],\n options: AnnotationOptions<C> = {},\n): AnnotationResult {\n const {\n useCleanText = false,\n autoEscape = true, // Secure by default\n useFullSpan = false, // Backward compatible default\n template,\n callback,\n } = options\n\n // Sort reverse to avoid position shifts invalidating subsequent annotations\n const sorted = [...citations].sort((a, b) => {\n const aPos = useCleanText ? a.span.cleanStart : a.span.originalStart\n const bPos = useCleanText ? b.span.cleanStart : b.span.originalStart\n return bPos - aPos // Reverse for backward iteration\n })\n\n let result = text\n const positionMap = new Map<number, number>()\n const skipped: Citation[] = []\n\n for (const citation of sorted) {\n // Determine which span to use\n let start: number\n let end: number\n\n if (useFullSpan && \"fullSpan\" in citation && citation.fullSpan) {\n // Full span mode: case name through parenthetical\n start = useCleanText ? citation.fullSpan.cleanStart : citation.fullSpan.originalStart\n end = useCleanText ? citation.fullSpan.cleanEnd : citation.fullSpan.originalEnd\n } else {\n // Default mode: core citation only\n start = useCleanText ? citation.span.cleanStart : citation.span.originalStart\n end = useCleanText ? citation.span.cleanEnd : citation.span.originalEnd\n }\n\n // Snap positions out of HTML tags when annotating original text\n if (!useCleanText) {\n const snapped = snapOutOfHtmlTags(result, start, end)\n if (snapped === null) {\n // Could not safely snap — skip this citation\n skipped.push(citation)\n continue\n }\n start = snapped.start\n end = snapped.end\n }\n\n let markup = \"\"\n\n if (callback) {\n // Callback mode: developer provides full logic\n const surrounding = text.substring(Math.max(0, start - 30), Math.min(text.length, end + 30))\n markup = callback(citation, surrounding)\n } else if (template) {\n // Template mode: simple before/after wrapping\n const citationText = result.substring(start, end)\n const escaped = autoEscape ? escapeHtmlEntities(citationText) : citationText\n markup = template.before + escaped + template.after\n } else {\n // No annotation specified\n continue\n }\n\n // Insert annotation (working backwards preserves positions for later citations)\n result = result.slice(0, start) + markup + result.slice(end)\n\n // Track original position to new position (before this annotation was added)\n positionMap.set(start, start)\n }\n\n return { text: result, positionMap, skipped }\n}\n\n/**\n * Check if a position falls inside an HTML tag (between `<` and `>`).\n * Returns the index of the opening `<` if inside a tag, otherwise -1.\n */\nfunction findContainingTag(text: string, pos: number): { tagStart: number; tagEnd: number } | null {\n // Search backwards from pos for '<' without encountering '>' first\n let i = pos - 1\n while (i >= 0) {\n if (text[i] === \">\") return null // Hit a tag close — we're outside\n if (text[i] === \"<\") {\n // Found opening '<' — now find the closing '>'\n let j = pos\n while (j < text.length) {\n if (text[j] === \">\") return { tagStart: i, tagEnd: j + 1 }\n j++\n }\n // Unclosed tag — treat as inside\n return { tagStart: i, tagEnd: text.length }\n }\n i--\n }\n return null\n}\n\n/**\n * Snap annotation start/end positions to avoid landing inside HTML tags.\n *\n * If a position falls inside an HTML tag, it is moved:\n * - Start position: snapped to before the tag's `<`\n * - End position: snapped to after the tag's `>`\n *\n * Returns null if the positions can't be safely adjusted (e.g., entirely\n * within a single tag).\n */\nfunction snapOutOfHtmlTags(\n text: string,\n start: number,\n end: number,\n): { start: number; end: number } | null {\n let snappedStart = start\n let snappedEnd = end\n\n const startTag = findContainingTag(text, start)\n if (startTag) {\n snappedStart = startTag.tagStart\n }\n\n const endTag = findContainingTag(text, end)\n if (endTag) {\n snappedEnd = endTag.tagEnd\n }\n\n // Sanity check: start must come before end\n if (snappedStart >= snappedEnd) return null\n\n return { start: snappedStart, end: snappedEnd }\n}\n\n/**\n * Escape HTML entities to prevent XSS injection.\n *\n * Converts special HTML characters to their entity equivalents:\n * - `&` → `&amp;`\n * - `<` → `&lt;`\n * - `>` → `&gt;`\n * - `\"` → `&quot;`\n * - `'` → `&#39;`\n * - `/` → `&#x2F;`\n *\n * @param text - Text to escape\n * @returns Escaped text safe for HTML insertion\n */\nfunction escapeHtmlEntities(text: string): string {\n const map: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n \"/\": \"&#x2F;\",\n }\n return text.replace(/[&<>\"'/]/g, (char) => map[char])\n}\n"],"mappings":"mEA+CA,SAAgB,EACd,EACA,EACA,EAAgC,EAAE,CAChB,CAClB,GAAM,CACJ,eAAe,GACf,aAAa,GACb,cAAc,GACd,WACA,YACE,EAGE,EAAS,CAAC,GAAG,EAAU,CAAC,MAAM,EAAG,IAAM,CAC3C,IAAM,EAAO,EAAe,EAAE,KAAK,WAAa,EAAE,KAAK,cAEvD,OADa,EAAe,EAAE,KAAK,WAAa,EAAE,KAAK,eACzC,GACd,CAEE,EAAS,EACP,EAAc,IAAI,IAClB,EAAsB,EAAE,CAE9B,IAAK,IAAM,KAAY,EAAQ,CAE7B,IAAI,EACA,EAaJ,GAXI,GAAe,aAAc,GAAY,EAAS,UAEpD,EAAQ,EAAe,EAAS,SAAS,WAAa,EAAS,SAAS,cACxE,EAAM,EAAe,EAAS,SAAS,SAAW,EAAS,SAAS,cAGpE,EAAQ,EAAe,EAAS,KAAK,WAAa,EAAS,KAAK,cAChE,EAAM,EAAe,EAAS,KAAK,SAAW,EAAS,KAAK,aAI1D,CAAC,EAAc,CACjB,IAAM,EAAU,EAAkB,EAAQ,EAAO,EAAI,CACrD,GAAI,IAAY,KAAM,CAEpB,EAAQ,KAAK,EAAS,CACtB,SAEF,EAAQ,EAAQ,MAChB,EAAM,EAAQ,IAGhB,IAAI,EAAS,GAEb,GAAI,EAGF,EAAS,EAAS,EADE,EAAK,UAAU,KAAK,IAAI,EAAG,EAAQ,GAAG,CAAE,KAAK,IAAI,EAAK,OAAQ,EAAM,GAAG,CAAC,CACpD,SAC/B,EAAU,CAEnB,IAAM,EAAe,EAAO,UAAU,EAAO,EAAI,CAC3C,EAAU,EAAa,EAAmB,EAAa,CAAG,EAChE,EAAS,EAAS,OAAS,EAAU,EAAS,WAG9C,SAIF,EAAS,EAAO,MAAM,EAAG,EAAM,CAAG,EAAS,EAAO,MAAM,EAAI,CAG5D,EAAY,IAAI,EAAO,EAAM,CAG/B,MAAO,CAAE,KAAM,EAAQ,cAAa,UAAS,CAO/C,SAAS,EAAkB,EAAc,EAA0D,CAEjG,IAAI,EAAI,EAAM,EACd,KAAO,GAAK,GAAG,CACb,GAAI,EAAK,KAAO,IAAK,OAAO,KAC5B,GAAI,EAAK,KAAO,IAAK,CAEnB,IAAI,EAAI,EACR,KAAO,EAAI,EAAK,QAAQ,CACtB,GAAI,EAAK,KAAO,IAAK,MAAO,CAAE,SAAU,EAAG,OAAQ,EAAI,EAAG,CAC1D,IAGF,MAAO,CAAE,SAAU,EAAG,OAAQ,EAAK,OAAQ,CAE7C,IAEF,OAAO,KAaT,SAAS,EACP,EACA,EACA,EACuC,CACvC,IAAI,EAAe,EACf,EAAa,EAEX,EAAW,EAAkB,EAAM,EAAM,CAC3C,IACF,EAAe,EAAS,UAG1B,IAAM,EAAS,EAAkB,EAAM,EAAI,CAQ3C,OAPI,IACF,EAAa,EAAO,QAIlB,GAAgB,EAAmB,KAEhC,CAAE,MAAO,EAAc,IAAK,EAAY,CAiBjD,SAAS,EAAmB,EAAsB,CAChD,IAAM,EAA8B,CAClC,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,SACN,CACD,OAAO,EAAK,QAAQ,YAAc,GAAS,EAAI,GAAM"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../src/annotate/annotate.ts"],"sourcesContent":["import type { Citation } from \"../types/citation\"\nimport type { AnnotationOptions, AnnotationResult } from \"./types\"\n\n/**\n * Annotate citations in text with custom markup.\n *\n * Supports two modes:\n * - **Template mode**: Simple before/after wrapping (set `options.template`)\n * - **Callback mode**: Custom logic with full citation context (set `options.callback`)\n *\n * Citations are processed in reverse order to avoid position shifts invalidating\n * subsequent annotations. Position tracking maps original positions to new positions\n * after markup insertion.\n *\n * @param text - Original or cleaned text to annotate\n * @param citations - Citations to mark up (from extraction pipeline)\n * @param options - Annotation configuration\n * @returns Annotated text with position mapping\n *\n * @example Template mode\n * ```typescript\n * const result = annotate(text, citations, {\n * template: { before: '<cite>', after: '</cite>' }\n * })\n * // Result: \"See <cite>500 F.2d 123</cite>\"\n * ```\n *\n * @example Callback mode\n * ```typescript\n * const result = annotate(text, citations, {\n * callback: (citation) => {\n * if (citation.type === 'case') {\n * return `<a href=\"/cases/${citation.volume}\">${citation.matchedText}</a>`\n * }\n * return citation.matchedText\n * }\n * })\n * ```\n *\n * @example Position tracking\n * ```typescript\n * const result = annotate(text, citations, { template: { before: '<mark>', after: '</mark>' } })\n * // result.positionMap tracks how positions shifted\n * const originalPos = 10\n * const newPos = result.positionMap.get(originalPos)\n * ```\n */\nexport function annotate<C extends Citation = Citation>(\n text: string,\n citations: C[],\n options: AnnotationOptions<C> = {},\n): AnnotationResult {\n const {\n useCleanText = false,\n autoEscape = true, // Secure by default\n useFullSpan = false, // Backward compatible default\n template,\n callback,\n } = options\n\n // Resolve each citation to its actual wrap range up-front. When useFullSpan\n // is true, the wrap region is the citation's fullSpan (if present), so the\n // sort and overlap checks must agree on that range — sorting by the core\n // span.originalStart while wrapping the fullSpan corrupts parallel-reporter\n // sequences whose fullSpans all share an endpoint (issue #543).\n type Resolved = {\n citation: C\n start: number\n end: number\n }\n const resolved: Resolved[] = citations.map((citation) => {\n const span =\n useFullSpan && \"fullSpan\" in citation && citation.fullSpan ? citation.fullSpan : citation.span\n return {\n citation,\n start: useCleanText ? span.cleanStart : span.originalStart,\n end: useCleanText ? span.cleanEnd : span.originalEnd,\n }\n })\n\n // Sort ascending by start position. Tie-break on wider range first (smaller\n // end last) so that when two wraps share a start, the outer (longer) one is\n // processed first and the inner one is skipped via overlap detection.\n const ascending = [...resolved].sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start\n return b.end - a.end\n })\n\n // Overlap detection: walk ascending and resolve any wrap whose range\n // intersects the currently-accepted wrap (issues #543, #545). Two wraps\n // overlap when one starts before the other ends.\n //\n // Resolution rule:\n // - If one wrap fully contains the other, keep the outer (already accepted)\n // wrap so the entire cluster ends up under a single sentinel.\n // - Otherwise (true intersection) prefer the higher-confidence citation —\n // this lets a real citation displace an earlier low-confidence false\n // positive that happens to start first.\n // The discarded citation surfaces via `skipped`.\n const skipped: Citation[] = []\n const accepted: Resolved[] = []\n for (const item of ascending) {\n const last = accepted[accepted.length - 1]\n if (last !== undefined && item.start < last.end) {\n // Overlaps the most recently accepted wrap. Decide which wins.\n const lastContainsItem = item.end <= last.end\n if (lastContainsItem) {\n // Inner wrap nested inside outer — drop the inner one\n skipped.push(item.citation)\n continue\n }\n // True intersection — prefer the higher-confidence citation\n const lastConf = last.citation.confidence ?? 0\n const itemConf = item.citation.confidence ?? 0\n if (itemConf > lastConf) {\n // Incoming wins — eject the previously-accepted wrap\n accepted.pop()\n skipped.push(last.citation)\n accepted.push(item)\n } else {\n // Existing wrap wins (ties keep the earlier-starting one)\n skipped.push(item.citation)\n }\n continue\n }\n accepted.push(item)\n }\n\n // Process accepted wraps in reverse so splicing earlier ranges doesn't\n // shift later (rightmost) positions.\n const ordered = [...accepted].sort((a, b) => b.start - a.start)\n\n let result = text\n const positionMap = new Map<number, number>()\n\n for (const item of ordered) {\n const { citation } = item\n let start = item.start\n let end = item.end\n\n // Snap positions out of HTML tags when annotating original text\n if (!useCleanText) {\n const snapped = snapOutOfHtmlTags(result, start, end)\n if (snapped === null) {\n // Could not safely snap — skip this citation\n skipped.push(citation)\n continue\n }\n start = snapped.start\n end = snapped.end\n }\n\n let markup = \"\"\n\n if (callback) {\n // Callback mode: developer provides full logic\n const surrounding = text.substring(Math.max(0, start - 30), Math.min(text.length, end + 30))\n markup = callback(citation, surrounding)\n } else if (template) {\n // Template mode: simple before/after wrapping\n const citationText = result.substring(start, end)\n const escaped = autoEscape ? escapeHtmlEntities(citationText) : citationText\n markup = template.before + escaped + template.after\n } else {\n // No annotation specified\n continue\n }\n\n // Insert annotation (working backwards preserves positions for later citations)\n result = result.slice(0, start) + markup + result.slice(end)\n\n // Track original position to new position (before this annotation was added)\n positionMap.set(start, start)\n }\n\n return { text: result, positionMap, skipped }\n}\n\n/**\n * Check if a position falls inside an HTML tag (between `<` and `>`).\n * Returns the tag's start/end indices if inside a tag, otherwise null.\n *\n * Real-world opinions (especially OCR output) contain bare `<` characters in\n * prose (`A < B`, `rate is < 30%`). Treating every unpaired `<` as a tag-open\n * caused `annotate` to engulf prose between the bare `<` and the next citation\n * (issue #544). A `<` only opens a tag when followed (possibly after whitespace)\n * by an ASCII letter, `!` (comments/doctype), or `/` (closing tag).\n */\nfunction findContainingTag(text: string, pos: number): { tagStart: number; tagEnd: number } | null {\n // Search backwards from pos for '<' without encountering '>' first\n let i = pos - 1\n while (i >= 0) {\n if (text[i] === \">\") return null // Hit a tag close — we're outside\n if (text[i] === \"<\") {\n if (!looksLikeTagOpen(text, i)) {\n // Bare `<` (prose / math), not an HTML tag — keep walking backwards\n i--\n continue\n }\n // Found opening '<' — now find the closing '>'\n let j = pos\n while (j < text.length) {\n if (text[j] === \">\") return { tagStart: i, tagEnd: j + 1 }\n j++\n }\n // Unclosed tag — treat as inside\n return { tagStart: i, tagEnd: text.length }\n }\n i--\n }\n return null\n}\n\n/**\n * True when the `<` at `ltIndex` plausibly opens an HTML tag, comment, or\n * close-tag. Well-formed HTML tags have no whitespace between `<` and the\n * tag-name character, so `<` must be IMMEDIATELY followed by an ASCII letter,\n * `!` (comment/doctype), or `/` (closing tag). Everything else (digits,\n * punctuation, whitespace, end-of-text) is treated as prose — e.g. `< 30%`,\n * `< B`, `<3`, OCR noise like `<®=»`.\n */\nfunction looksLikeTagOpen(text: string, ltIndex: number): boolean {\n const next = text[ltIndex + 1]\n if (next === undefined) return false\n return /[a-zA-Z!/]/.test(next)\n}\n\n/**\n * Snap annotation start/end positions to avoid landing inside HTML tags.\n *\n * If a position falls inside an HTML tag, it is moved:\n * - Start position: snapped to before the tag's `<`\n * - End position: snapped to after the tag's `>`\n *\n * Returns null if the positions can't be safely adjusted (e.g., entirely\n * within a single tag).\n */\nfunction snapOutOfHtmlTags(\n text: string,\n start: number,\n end: number,\n): { start: number; end: number } | null {\n let snappedStart = start\n let snappedEnd = end\n\n const startTag = findContainingTag(text, start)\n if (startTag) {\n snappedStart = startTag.tagStart\n }\n\n const endTag = findContainingTag(text, end)\n if (endTag) {\n snappedEnd = endTag.tagEnd\n }\n\n // Sanity check: start must come before end\n if (snappedStart >= snappedEnd) return null\n\n return { start: snappedStart, end: snappedEnd }\n}\n\n/**\n * Escape HTML entities to prevent XSS injection.\n *\n * Converts special HTML characters to their entity equivalents:\n * - `&` → `&amp;`\n * - `<` → `&lt;`\n * - `>` → `&gt;`\n * - `\"` → `&quot;`\n * - `'` → `&#39;`\n * - `/` → `&#x2F;`\n *\n * @param text - Text to escape\n * @returns Escaped text safe for HTML insertion\n */\nfunction escapeHtmlEntities(text: string): string {\n const map: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n \"/\": \"&#x2F;\",\n }\n return text.replace(/[&<>\"'/]/g, (char) => map[char])\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { t as Citation } from "../citation-Ba2mRoW-.cjs";
1
+ import { t as Citation } from "../citation-IOfRnNcY.cjs";
2
2
 
3
3
  //#region src/annotate/types.d.ts
4
4
  /**
@@ -119,8 +119,11 @@ interface AnnotationResult {
119
119
  /**
120
120
  * Citations that couldn't be annotated.
121
121
  *
122
- * Currently empty (all citations are annotated if callback/template provided).
123
- * Future versions may skip overlapping citations or invalid positions.
122
+ * Populated when:
123
+ * - Two citation wraps overlap (intersect or nest). The outer/higher-
124
+ * confidence wrap wins; the other surfaces here (#543, #545).
125
+ * - A citation's positions snap to invalid coordinates inside an HTML tag
126
+ * (#17), e.g. start >= end after snapping.
124
127
  */
125
128
  skipped: Citation[];
126
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/annotate/types.ts","../../src/annotate/annotate.ts"],"mappings":";;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;AAkFA;UAlFiB,iBAAA,WAA4B,QAAA,GAAW,QAAA;;;;;;;;;EAStD,YAAA;;;;ACUF;;;;;;;;;;;;;;EDSE,UAAA;;;;;;;;;;;;;EAcA,WAAA;;;;;;;;;;;EAYA,QAAA,IAAY,QAAA,EAAU,CAAA,EAAG,WAAA;;;;;;;;;;;;;;;;EAiBzB,QAAA;+CAEE,MAAA;IAEA,KAAA;EAAA;AAAA;;;;UAOa,gBAAA;;;;EAIf,IAAA;;;;;;;;;EAUA,WAAA,EAAa,GAAA;;;;;;;EAQb,OAAA,EAAS,QAAA;AAAA;;;;AAxGX;;;;;;;;;;;;;;;;;;;;;;;AAkFA;;;;;;;;;;;;;;AC/DA;;;;;;iBAAgB,QAAA,WAAmB,QAAA,GAAW,QAAA,CAAA,CAC5C,IAAA,UACA,SAAA,EAAW,CAAA,IACX,OAAA,GAAS,iBAAA,CAAkB,CAAA,IAC1B,gBAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../src/annotate/types.ts","../../src/annotate/annotate.ts"],"mappings":";;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;AAkFA;UAlFiB,iBAAA,WAA4B,QAAA,GAAW,QAAA;;;;;;;;;EAStD,YAAA;;;;ACUF;;;;;;;;;;;;;;EDSE,UAAA;;;;;;;;;;;;;EAcA,WAAA;;;;;;;;;;;EAYA,QAAA,IAAY,QAAA,EAAU,CAAA,EAAG,WAAA;;;;;;;;;;;;;;;;EAiBzB,QAAA;+CAEE,MAAA;IAEA,KAAA;EAAA;AAAA;;;;UAOa,gBAAA;;;;EAIf,IAAA;;;;;;;;;EAUA,WAAA,EAAa,GAAA;;;;;;;;;;EAWb,OAAA,EAAS,QAAA;AAAA;;;;AA3GX;;;;;;;;;;;;;;;;;;;;;;;AAkFA;;;;;;;;;;;;;;AC/DA;;;;;;iBAAgB,QAAA,WAAmB,QAAA,GAAW,QAAA,CAAA,CAC5C,IAAA,UACA,SAAA,EAAW,CAAA,IACX,OAAA,GAAS,iBAAA,CAAkB,CAAA,IAC1B,gBAAA"}
@@ -1,4 +1,4 @@
1
- import { t as Citation } from "../citation-BxhgKVy4.mjs";
1
+ import { t as Citation } from "../citation-CZAaCykt.mjs";
2
2
 
3
3
  //#region src/annotate/types.d.ts
4
4
  /**
@@ -119,8 +119,11 @@ interface AnnotationResult {
119
119
  /**
120
120
  * Citations that couldn't be annotated.
121
121
  *
122
- * Currently empty (all citations are annotated if callback/template provided).
123
- * Future versions may skip overlapping citations or invalid positions.
122
+ * Populated when:
123
+ * - Two citation wraps overlap (intersect or nest). The outer/higher-
124
+ * confidence wrap wins; the other surfaces here (#543, #545).
125
+ * - A citation's positions snap to invalid coordinates inside an HTML tag
126
+ * (#17), e.g. start >= end after snapping.
124
127
  */
125
128
  skipped: Citation[];
126
129
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/annotate/types.ts","../../src/annotate/annotate.ts"],"mappings":";;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;AAkFA;UAlFiB,iBAAA,WAA4B,QAAA,GAAW,QAAA;;;;;;;;;EAStD,YAAA;;;;ACUF;;;;;;;;;;;;;;EDSE,UAAA;;;;;;;;;;;;;EAcA,WAAA;;;;;;;;;;;EAYA,QAAA,IAAY,QAAA,EAAU,CAAA,EAAG,WAAA;;;;;;;;;;;;;;;;EAiBzB,QAAA;+CAEE,MAAA;IAEA,KAAA;EAAA;AAAA;;;;UAOa,gBAAA;;;;EAIf,IAAA;;;;;;;;;EAUA,WAAA,EAAa,GAAA;;;;;;;EAQb,OAAA,EAAS,QAAA;AAAA;;;;AAxGX;;;;;;;;;;;;;;;;;;;;;;;AAkFA;;;;;;;;;;;;;;AC/DA;;;;;;iBAAgB,QAAA,WAAmB,QAAA,GAAW,QAAA,CAAA,CAC5C,IAAA,UACA,SAAA,EAAW,CAAA,IACX,OAAA,GAAS,iBAAA,CAAkB,CAAA,IAC1B,gBAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/annotate/types.ts","../../src/annotate/annotate.ts"],"mappings":";;;;;AA4BA;;;;;;;;;;;;;;;;;;;;;;;AAkFA;UAlFiB,iBAAA,WAA4B,QAAA,GAAW,QAAA;;;;;;;;;EAStD,YAAA;;;;ACUF;;;;;;;;;;;;;;EDSE,UAAA;;;;;;;;;;;;;EAcA,WAAA;;;;;;;;;;;EAYA,QAAA,IAAY,QAAA,EAAU,CAAA,EAAG,WAAA;;;;;;;;;;;;;;;;EAiBzB,QAAA;+CAEE,MAAA;IAEA,KAAA;EAAA;AAAA;;;;UAOa,gBAAA;;;;EAIf,IAAA;;;;;;;;;EAUA,WAAA,EAAa,GAAA;;;;;;;;;;EAWb,OAAA,EAAS,QAAA;AAAA;;;;AA3GX;;;;;;;;;;;;;;;;;;;;;;;AAkFA;;;;;;;;;;;;;;AC/DA;;;;;;iBAAgB,QAAA,WAAmB,QAAA,GAAW,QAAA,CAAA,CAC5C,IAAA,UACA,SAAA,EAAW,CAAA,IACX,OAAA,GAAS,iBAAA,CAAkB,CAAA,IAC1B,gBAAA"}
@@ -1,2 +1,2 @@
1
- function e(e,t,i={}){let{useCleanText:a=!1,autoEscape:o=!0,useFullSpan:s=!1,template:c,callback:l}=i,u=[...t].sort((e,t)=>{let n=a?e.span.cleanStart:e.span.originalStart;return(a?t.span.cleanStart:t.span.originalStart)-n}),d=e,f=new Map,p=[];for(let t of u){let i,u;if(s&&`fullSpan`in t&&t.fullSpan?(i=a?t.fullSpan.cleanStart:t.fullSpan.originalStart,u=a?t.fullSpan.cleanEnd:t.fullSpan.originalEnd):(i=a?t.span.cleanStart:t.span.originalStart,u=a?t.span.cleanEnd:t.span.originalEnd),!a){let e=n(d,i,u);if(e===null){p.push(t);continue}i=e.start,u=e.end}let m=``;if(l)m=l(t,e.substring(Math.max(0,i-30),Math.min(e.length,u+30)));else if(c){let e=d.substring(i,u),t=o?r(e):e;m=c.before+t+c.after}else continue;d=d.slice(0,i)+m+d.slice(u),f.set(i,i)}return{text:d,positionMap:f,skipped:p}}function t(e,t){let n=t-1;for(;n>=0;){if(e[n]===`>`)return null;if(e[n]===`<`){let r=t;for(;r<e.length;){if(e[r]===`>`)return{tagStart:n,tagEnd:r+1};r++}return{tagStart:n,tagEnd:e.length}}n--}return null}function n(e,n,r){let i=n,a=r,o=t(e,n);o&&(i=o.tagStart);let s=t(e,r);return s&&(a=s.tagEnd),i>=a?null:{start:i,end:a}}function r(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`};return e.replace(/[&<>"'/]/g,e=>t[e])}export{e as annotate};
1
+ function e(e,t,n={}){let{useCleanText:a=!1,autoEscape:o=!0,useFullSpan:s=!1,template:c,callback:l}=n,u=[...t.map(e=>{let t=s&&`fullSpan`in e&&e.fullSpan?e.fullSpan:e.span;return{citation:e,start:a?t.cleanStart:t.originalStart,end:a?t.cleanEnd:t.originalEnd}})].sort((e,t)=>e.start===t.start?t.end-e.end:e.start-t.start),d=[],f=[];for(let e of u){let t=f[f.length-1];if(t!==void 0&&e.start<t.end){if(e.end<=t.end){d.push(e.citation);continue}let n=t.citation.confidence??0;(e.citation.confidence??0)>n?(f.pop(),d.push(t.citation),f.push(e)):d.push(e.citation);continue}f.push(e)}let p=[...f].sort((e,t)=>t.start-e.start),m=e,h=new Map;for(let t of p){let{citation:n}=t,s=t.start,u=t.end;if(!a){let e=r(m,s,u);if(e===null){d.push(n);continue}s=e.start,u=e.end}let f=``;if(l)f=l(n,e.substring(Math.max(0,s-30),Math.min(e.length,u+30)));else if(c){let e=m.substring(s,u),t=o?i(e):e;f=c.before+t+c.after}else continue;m=m.slice(0,s)+f+m.slice(u),h.set(s,s)}return{text:m,positionMap:h,skipped:d}}function t(e,t){let r=t-1;for(;r>=0;){if(e[r]===`>`)return null;if(e[r]===`<`){if(!n(e,r)){r--;continue}let i=t;for(;i<e.length;){if(e[i]===`>`)return{tagStart:r,tagEnd:i+1};i++}return{tagStart:r,tagEnd:e.length}}r--}return null}function n(e,t){let n=e[t+1];return n===void 0?!1:/[a-zA-Z!/]/.test(n)}function r(e,n,r){let i=n,a=r,o=t(e,n);o&&(i=o.tagStart);let s=t(e,r);return s&&(a=s.tagEnd),i>=a?null:{start:i,end:a}}function i(e){let t={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`,"/":`&#x2F;`};return e.replace(/[&<>"'/]/g,e=>t[e])}export{e as annotate};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../src/annotate/annotate.ts"],"sourcesContent":["import type { Citation } from \"../types/citation\"\nimport type { AnnotationOptions, AnnotationResult } from \"./types\"\n\n/**\n * Annotate citations in text with custom markup.\n *\n * Supports two modes:\n * - **Template mode**: Simple before/after wrapping (set `options.template`)\n * - **Callback mode**: Custom logic with full citation context (set `options.callback`)\n *\n * Citations are processed in reverse order to avoid position shifts invalidating\n * subsequent annotations. Position tracking maps original positions to new positions\n * after markup insertion.\n *\n * @param text - Original or cleaned text to annotate\n * @param citations - Citations to mark up (from extraction pipeline)\n * @param options - Annotation configuration\n * @returns Annotated text with position mapping\n *\n * @example Template mode\n * ```typescript\n * const result = annotate(text, citations, {\n * template: { before: '<cite>', after: '</cite>' }\n * })\n * // Result: \"See <cite>500 F.2d 123</cite>\"\n * ```\n *\n * @example Callback mode\n * ```typescript\n * const result = annotate(text, citations, {\n * callback: (citation) => {\n * if (citation.type === 'case') {\n * return `<a href=\"/cases/${citation.volume}\">${citation.matchedText}</a>`\n * }\n * return citation.matchedText\n * }\n * })\n * ```\n *\n * @example Position tracking\n * ```typescript\n * const result = annotate(text, citations, { template: { before: '<mark>', after: '</mark>' } })\n * // result.positionMap tracks how positions shifted\n * const originalPos = 10\n * const newPos = result.positionMap.get(originalPos)\n * ```\n */\nexport function annotate<C extends Citation = Citation>(\n text: string,\n citations: C[],\n options: AnnotationOptions<C> = {},\n): AnnotationResult {\n const {\n useCleanText = false,\n autoEscape = true, // Secure by default\n useFullSpan = false, // Backward compatible default\n template,\n callback,\n } = options\n\n // Sort reverse to avoid position shifts invalidating subsequent annotations\n const sorted = [...citations].sort((a, b) => {\n const aPos = useCleanText ? a.span.cleanStart : a.span.originalStart\n const bPos = useCleanText ? b.span.cleanStart : b.span.originalStart\n return bPos - aPos // Reverse for backward iteration\n })\n\n let result = text\n const positionMap = new Map<number, number>()\n const skipped: Citation[] = []\n\n for (const citation of sorted) {\n // Determine which span to use\n let start: number\n let end: number\n\n if (useFullSpan && \"fullSpan\" in citation && citation.fullSpan) {\n // Full span mode: case name through parenthetical\n start = useCleanText ? citation.fullSpan.cleanStart : citation.fullSpan.originalStart\n end = useCleanText ? citation.fullSpan.cleanEnd : citation.fullSpan.originalEnd\n } else {\n // Default mode: core citation only\n start = useCleanText ? citation.span.cleanStart : citation.span.originalStart\n end = useCleanText ? citation.span.cleanEnd : citation.span.originalEnd\n }\n\n // Snap positions out of HTML tags when annotating original text\n if (!useCleanText) {\n const snapped = snapOutOfHtmlTags(result, start, end)\n if (snapped === null) {\n // Could not safely snap — skip this citation\n skipped.push(citation)\n continue\n }\n start = snapped.start\n end = snapped.end\n }\n\n let markup = \"\"\n\n if (callback) {\n // Callback mode: developer provides full logic\n const surrounding = text.substring(Math.max(0, start - 30), Math.min(text.length, end + 30))\n markup = callback(citation, surrounding)\n } else if (template) {\n // Template mode: simple before/after wrapping\n const citationText = result.substring(start, end)\n const escaped = autoEscape ? escapeHtmlEntities(citationText) : citationText\n markup = template.before + escaped + template.after\n } else {\n // No annotation specified\n continue\n }\n\n // Insert annotation (working backwards preserves positions for later citations)\n result = result.slice(0, start) + markup + result.slice(end)\n\n // Track original position to new position (before this annotation was added)\n positionMap.set(start, start)\n }\n\n return { text: result, positionMap, skipped }\n}\n\n/**\n * Check if a position falls inside an HTML tag (between `<` and `>`).\n * Returns the index of the opening `<` if inside a tag, otherwise -1.\n */\nfunction findContainingTag(text: string, pos: number): { tagStart: number; tagEnd: number } | null {\n // Search backwards from pos for '<' without encountering '>' first\n let i = pos - 1\n while (i >= 0) {\n if (text[i] === \">\") return null // Hit a tag close — we're outside\n if (text[i] === \"<\") {\n // Found opening '<' — now find the closing '>'\n let j = pos\n while (j < text.length) {\n if (text[j] === \">\") return { tagStart: i, tagEnd: j + 1 }\n j++\n }\n // Unclosed tag — treat as inside\n return { tagStart: i, tagEnd: text.length }\n }\n i--\n }\n return null\n}\n\n/**\n * Snap annotation start/end positions to avoid landing inside HTML tags.\n *\n * If a position falls inside an HTML tag, it is moved:\n * - Start position: snapped to before the tag's `<`\n * - End position: snapped to after the tag's `>`\n *\n * Returns null if the positions can't be safely adjusted (e.g., entirely\n * within a single tag).\n */\nfunction snapOutOfHtmlTags(\n text: string,\n start: number,\n end: number,\n): { start: number; end: number } | null {\n let snappedStart = start\n let snappedEnd = end\n\n const startTag = findContainingTag(text, start)\n if (startTag) {\n snappedStart = startTag.tagStart\n }\n\n const endTag = findContainingTag(text, end)\n if (endTag) {\n snappedEnd = endTag.tagEnd\n }\n\n // Sanity check: start must come before end\n if (snappedStart >= snappedEnd) return null\n\n return { start: snappedStart, end: snappedEnd }\n}\n\n/**\n * Escape HTML entities to prevent XSS injection.\n *\n * Converts special HTML characters to their entity equivalents:\n * - `&` → `&amp;`\n * - `<` → `&lt;`\n * - `>` → `&gt;`\n * - `\"` → `&quot;`\n * - `'` → `&#39;`\n * - `/` → `&#x2F;`\n *\n * @param text - Text to escape\n * @returns Escaped text safe for HTML insertion\n */\nfunction escapeHtmlEntities(text: string): string {\n const map: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n \"/\": \"&#x2F;\",\n }\n return text.replace(/[&<>\"'/]/g, (char) => map[char])\n}\n"],"mappings":"AA+CA,SAAgB,EACd,EACA,EACA,EAAgC,EAAE,CAChB,CAClB,GAAM,CACJ,eAAe,GACf,aAAa,GACb,cAAc,GACd,WACA,YACE,EAGE,EAAS,CAAC,GAAG,EAAU,CAAC,MAAM,EAAG,IAAM,CAC3C,IAAM,EAAO,EAAe,EAAE,KAAK,WAAa,EAAE,KAAK,cAEvD,OADa,EAAe,EAAE,KAAK,WAAa,EAAE,KAAK,eACzC,GACd,CAEE,EAAS,EACP,EAAc,IAAI,IAClB,EAAsB,EAAE,CAE9B,IAAK,IAAM,KAAY,EAAQ,CAE7B,IAAI,EACA,EAaJ,GAXI,GAAe,aAAc,GAAY,EAAS,UAEpD,EAAQ,EAAe,EAAS,SAAS,WAAa,EAAS,SAAS,cACxE,EAAM,EAAe,EAAS,SAAS,SAAW,EAAS,SAAS,cAGpE,EAAQ,EAAe,EAAS,KAAK,WAAa,EAAS,KAAK,cAChE,EAAM,EAAe,EAAS,KAAK,SAAW,EAAS,KAAK,aAI1D,CAAC,EAAc,CACjB,IAAM,EAAU,EAAkB,EAAQ,EAAO,EAAI,CACrD,GAAI,IAAY,KAAM,CAEpB,EAAQ,KAAK,EAAS,CACtB,SAEF,EAAQ,EAAQ,MAChB,EAAM,EAAQ,IAGhB,IAAI,EAAS,GAEb,GAAI,EAGF,EAAS,EAAS,EADE,EAAK,UAAU,KAAK,IAAI,EAAG,EAAQ,GAAG,CAAE,KAAK,IAAI,EAAK,OAAQ,EAAM,GAAG,CAAC,CACpD,SAC/B,EAAU,CAEnB,IAAM,EAAe,EAAO,UAAU,EAAO,EAAI,CAC3C,EAAU,EAAa,EAAmB,EAAa,CAAG,EAChE,EAAS,EAAS,OAAS,EAAU,EAAS,WAG9C,SAIF,EAAS,EAAO,MAAM,EAAG,EAAM,CAAG,EAAS,EAAO,MAAM,EAAI,CAG5D,EAAY,IAAI,EAAO,EAAM,CAG/B,MAAO,CAAE,KAAM,EAAQ,cAAa,UAAS,CAO/C,SAAS,EAAkB,EAAc,EAA0D,CAEjG,IAAI,EAAI,EAAM,EACd,KAAO,GAAK,GAAG,CACb,GAAI,EAAK,KAAO,IAAK,OAAO,KAC5B,GAAI,EAAK,KAAO,IAAK,CAEnB,IAAI,EAAI,EACR,KAAO,EAAI,EAAK,QAAQ,CACtB,GAAI,EAAK,KAAO,IAAK,MAAO,CAAE,SAAU,EAAG,OAAQ,EAAI,EAAG,CAC1D,IAGF,MAAO,CAAE,SAAU,EAAG,OAAQ,EAAK,OAAQ,CAE7C,IAEF,OAAO,KAaT,SAAS,EACP,EACA,EACA,EACuC,CACvC,IAAI,EAAe,EACf,EAAa,EAEX,EAAW,EAAkB,EAAM,EAAM,CAC3C,IACF,EAAe,EAAS,UAG1B,IAAM,EAAS,EAAkB,EAAM,EAAI,CAQ3C,OAPI,IACF,EAAa,EAAO,QAIlB,GAAgB,EAAmB,KAEhC,CAAE,MAAO,EAAc,IAAK,EAAY,CAiBjD,SAAS,EAAmB,EAAsB,CAChD,IAAM,EAA8B,CAClC,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,QACL,IAAK,SACN,CACD,OAAO,EAAK,QAAQ,YAAc,GAAS,EAAI,GAAM"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/annotate/annotate.ts"],"sourcesContent":["import type { Citation } from \"../types/citation\"\nimport type { AnnotationOptions, AnnotationResult } from \"./types\"\n\n/**\n * Annotate citations in text with custom markup.\n *\n * Supports two modes:\n * - **Template mode**: Simple before/after wrapping (set `options.template`)\n * - **Callback mode**: Custom logic with full citation context (set `options.callback`)\n *\n * Citations are processed in reverse order to avoid position shifts invalidating\n * subsequent annotations. Position tracking maps original positions to new positions\n * after markup insertion.\n *\n * @param text - Original or cleaned text to annotate\n * @param citations - Citations to mark up (from extraction pipeline)\n * @param options - Annotation configuration\n * @returns Annotated text with position mapping\n *\n * @example Template mode\n * ```typescript\n * const result = annotate(text, citations, {\n * template: { before: '<cite>', after: '</cite>' }\n * })\n * // Result: \"See <cite>500 F.2d 123</cite>\"\n * ```\n *\n * @example Callback mode\n * ```typescript\n * const result = annotate(text, citations, {\n * callback: (citation) => {\n * if (citation.type === 'case') {\n * return `<a href=\"/cases/${citation.volume}\">${citation.matchedText}</a>`\n * }\n * return citation.matchedText\n * }\n * })\n * ```\n *\n * @example Position tracking\n * ```typescript\n * const result = annotate(text, citations, { template: { before: '<mark>', after: '</mark>' } })\n * // result.positionMap tracks how positions shifted\n * const originalPos = 10\n * const newPos = result.positionMap.get(originalPos)\n * ```\n */\nexport function annotate<C extends Citation = Citation>(\n text: string,\n citations: C[],\n options: AnnotationOptions<C> = {},\n): AnnotationResult {\n const {\n useCleanText = false,\n autoEscape = true, // Secure by default\n useFullSpan = false, // Backward compatible default\n template,\n callback,\n } = options\n\n // Resolve each citation to its actual wrap range up-front. When useFullSpan\n // is true, the wrap region is the citation's fullSpan (if present), so the\n // sort and overlap checks must agree on that range — sorting by the core\n // span.originalStart while wrapping the fullSpan corrupts parallel-reporter\n // sequences whose fullSpans all share an endpoint (issue #543).\n type Resolved = {\n citation: C\n start: number\n end: number\n }\n const resolved: Resolved[] = citations.map((citation) => {\n const span =\n useFullSpan && \"fullSpan\" in citation && citation.fullSpan ? citation.fullSpan : citation.span\n return {\n citation,\n start: useCleanText ? span.cleanStart : span.originalStart,\n end: useCleanText ? span.cleanEnd : span.originalEnd,\n }\n })\n\n // Sort ascending by start position. Tie-break on wider range first (smaller\n // end last) so that when two wraps share a start, the outer (longer) one is\n // processed first and the inner one is skipped via overlap detection.\n const ascending = [...resolved].sort((a, b) => {\n if (a.start !== b.start) return a.start - b.start\n return b.end - a.end\n })\n\n // Overlap detection: walk ascending and resolve any wrap whose range\n // intersects the currently-accepted wrap (issues #543, #545). Two wraps\n // overlap when one starts before the other ends.\n //\n // Resolution rule:\n // - If one wrap fully contains the other, keep the outer (already accepted)\n // wrap so the entire cluster ends up under a single sentinel.\n // - Otherwise (true intersection) prefer the higher-confidence citation —\n // this lets a real citation displace an earlier low-confidence false\n // positive that happens to start first.\n // The discarded citation surfaces via `skipped`.\n const skipped: Citation[] = []\n const accepted: Resolved[] = []\n for (const item of ascending) {\n const last = accepted[accepted.length - 1]\n if (last !== undefined && item.start < last.end) {\n // Overlaps the most recently accepted wrap. Decide which wins.\n const lastContainsItem = item.end <= last.end\n if (lastContainsItem) {\n // Inner wrap nested inside outer — drop the inner one\n skipped.push(item.citation)\n continue\n }\n // True intersection — prefer the higher-confidence citation\n const lastConf = last.citation.confidence ?? 0\n const itemConf = item.citation.confidence ?? 0\n if (itemConf > lastConf) {\n // Incoming wins — eject the previously-accepted wrap\n accepted.pop()\n skipped.push(last.citation)\n accepted.push(item)\n } else {\n // Existing wrap wins (ties keep the earlier-starting one)\n skipped.push(item.citation)\n }\n continue\n }\n accepted.push(item)\n }\n\n // Process accepted wraps in reverse so splicing earlier ranges doesn't\n // shift later (rightmost) positions.\n const ordered = [...accepted].sort((a, b) => b.start - a.start)\n\n let result = text\n const positionMap = new Map<number, number>()\n\n for (const item of ordered) {\n const { citation } = item\n let start = item.start\n let end = item.end\n\n // Snap positions out of HTML tags when annotating original text\n if (!useCleanText) {\n const snapped = snapOutOfHtmlTags(result, start, end)\n if (snapped === null) {\n // Could not safely snap — skip this citation\n skipped.push(citation)\n continue\n }\n start = snapped.start\n end = snapped.end\n }\n\n let markup = \"\"\n\n if (callback) {\n // Callback mode: developer provides full logic\n const surrounding = text.substring(Math.max(0, start - 30), Math.min(text.length, end + 30))\n markup = callback(citation, surrounding)\n } else if (template) {\n // Template mode: simple before/after wrapping\n const citationText = result.substring(start, end)\n const escaped = autoEscape ? escapeHtmlEntities(citationText) : citationText\n markup = template.before + escaped + template.after\n } else {\n // No annotation specified\n continue\n }\n\n // Insert annotation (working backwards preserves positions for later citations)\n result = result.slice(0, start) + markup + result.slice(end)\n\n // Track original position to new position (before this annotation was added)\n positionMap.set(start, start)\n }\n\n return { text: result, positionMap, skipped }\n}\n\n/**\n * Check if a position falls inside an HTML tag (between `<` and `>`).\n * Returns the tag's start/end indices if inside a tag, otherwise null.\n *\n * Real-world opinions (especially OCR output) contain bare `<` characters in\n * prose (`A < B`, `rate is < 30%`). Treating every unpaired `<` as a tag-open\n * caused `annotate` to engulf prose between the bare `<` and the next citation\n * (issue #544). A `<` only opens a tag when followed (possibly after whitespace)\n * by an ASCII letter, `!` (comments/doctype), or `/` (closing tag).\n */\nfunction findContainingTag(text: string, pos: number): { tagStart: number; tagEnd: number } | null {\n // Search backwards from pos for '<' without encountering '>' first\n let i = pos - 1\n while (i >= 0) {\n if (text[i] === \">\") return null // Hit a tag close — we're outside\n if (text[i] === \"<\") {\n if (!looksLikeTagOpen(text, i)) {\n // Bare `<` (prose / math), not an HTML tag — keep walking backwards\n i--\n continue\n }\n // Found opening '<' — now find the closing '>'\n let j = pos\n while (j < text.length) {\n if (text[j] === \">\") return { tagStart: i, tagEnd: j + 1 }\n j++\n }\n // Unclosed tag — treat as inside\n return { tagStart: i, tagEnd: text.length }\n }\n i--\n }\n return null\n}\n\n/**\n * True when the `<` at `ltIndex` plausibly opens an HTML tag, comment, or\n * close-tag. Well-formed HTML tags have no whitespace between `<` and the\n * tag-name character, so `<` must be IMMEDIATELY followed by an ASCII letter,\n * `!` (comment/doctype), or `/` (closing tag). Everything else (digits,\n * punctuation, whitespace, end-of-text) is treated as prose — e.g. `< 30%`,\n * `< B`, `<3`, OCR noise like `<®=»`.\n */\nfunction looksLikeTagOpen(text: string, ltIndex: number): boolean {\n const next = text[ltIndex + 1]\n if (next === undefined) return false\n return /[a-zA-Z!/]/.test(next)\n}\n\n/**\n * Snap annotation start/end positions to avoid landing inside HTML tags.\n *\n * If a position falls inside an HTML tag, it is moved:\n * - Start position: snapped to before the tag's `<`\n * - End position: snapped to after the tag's `>`\n *\n * Returns null if the positions can't be safely adjusted (e.g., entirely\n * within a single tag).\n */\nfunction snapOutOfHtmlTags(\n text: string,\n start: number,\n end: number,\n): { start: number; end: number } | null {\n let snappedStart = start\n let snappedEnd = end\n\n const startTag = findContainingTag(text, start)\n if (startTag) {\n snappedStart = startTag.tagStart\n }\n\n const endTag = findContainingTag(text, end)\n if (endTag) {\n snappedEnd = endTag.tagEnd\n }\n\n // Sanity check: start must come before end\n if (snappedStart >= snappedEnd) return null\n\n return { start: snappedStart, end: snappedEnd }\n}\n\n/**\n * Escape HTML entities to prevent XSS injection.\n *\n * Converts special HTML characters to their entity equivalents:\n * - `&` → `&amp;`\n * - `<` → `&lt;`\n * - `>` → `&gt;`\n * - `\"` → `&quot;`\n * - `'` → `&#39;`\n * - `/` → `&#x2F;`\n *\n * @param text - Text to escape\n * @returns Escaped text safe for HTML insertion\n */\nfunction escapeHtmlEntities(text: string): string {\n const map: Record<string, string> = {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n \"/\": \"&#x2F;\",\n }\n return text.replace(/[&<>\"'/]/g, (char) => map[char])\n}\n"],"mappings":"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"}
@@ -634,8 +634,37 @@ interface FullCaseCitation extends CitationBase {
634
634
  interface StatuteCitation extends CitationBase {
635
635
  type: "statute";
636
636
  title?: number;
637
- code: string;
638
- section: string;
637
+ /**
638
+ * Code identifier (`U.S.C.`, `NMSA 1978`, `Penal`, `Va. Code`, etc.).
639
+ * Optional because bare-section citations with no nearby jurisdictional
640
+ * signal drop both `code` and `jurisdiction` rather than guessing.
641
+ * (#565, originally #531)
642
+ */
643
+ code?: string;
644
+ /**
645
+ * Section identifier. Optional because some forms cite the chapter alone
646
+ * (e.g. Massachusetts `G.L. c. 93A` — see `chapter` below). #569
647
+ */
648
+ section?: string;
649
+ /**
650
+ * Structured representation of a `§§ N-M` range. Populated only for
651
+ * citations where the section field is unambiguously a numeric range
652
+ * (typically federal `28 U.S.C. §§ 591-99`). Hyphenated state-style
653
+ * sections (`19.2-81`, `32A-2-7`) are NOT ranges and leave this
654
+ * undefined. `start` is mirrored on the `section` field for backward
655
+ * compatibility. (#564)
656
+ */
657
+ sectionRange?: {
658
+ start: string;
659
+ end: string;
660
+ };
661
+ /**
662
+ * Chapter identifier for citations that use a chapter+section layout,
663
+ * notably Massachusetts (`G.L. c. 93A`, `M.G.L.A. c. 93, § 14`).
664
+ * Previously the chapter number was leaking into `code`; populated
665
+ * separately as of #569.
666
+ */
667
+ chapter?: string;
639
668
  /** Subsection/pincite chain, e.g. "(a)(1)(A)" */
640
669
  subsection?: string;
641
670
  /** 2-letter state code or "US" when unambiguously identified */
@@ -1083,4 +1112,4 @@ type CitationOfType<T extends CitationType> = Extract<Citation, {
1083
1112
  type ExtractorMap = { [K in FullCitationType]: CitationOfType<K> };
1084
1113
  //#endregion
1085
1114
  export { ConstitutionalComponentSpans as A, PinciteInfo as B, ShortFormCitationType as C, SupraCitation as D, SubsequentHistoryEntry as E, StatuteComponentSpans as F, StatutesAtLargeComponentSpans as I, Span as L, JournalComponentSpans as M, NeutralComponentSpans as N, Warning as O, PublicLawComponentSpans as P, TransformationMap as R, ShortFormCitation as S, StatutesAtLargeCitation as T, parsePincite as V, NeutralCitation as _, CitationType as a, PublicLawCitation as b, DocketCitation as c, FullCaseCitation as d, FullCitation as f, JournalCitation as g, IdCitation as h, CitationSignal as i, FederalRegisterComponentSpans as j, CaseComponentSpans as k, ExtractorMap as l, HistorySignal as m, CitationBase as n, ConstitutionalCitation as o, FullCitationType as p, CitationOfType as r, CourtInference as s, Citation as t, FederalRegisterCitation as u, Parenthetical as v, StatuteCitation as w, ShortFormCaseCitation as x, ParentheticalType as y, spanFromGroupIndex as z };
1086
- //# sourceMappingURL=citation-Ba2mRoW-.d.cts.map
1115
+ //# sourceMappingURL=citation-CZAaCykt.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"citation-Ba2mRoW-.d.cts","names":[],"sources":["../src/extract/pincite.ts","../src/extract/dates.ts","../src/clean/segmentMap.ts","../src/types/span.ts","../src/types/componentSpans.ts","../src/types/citation.ts"],"mappings":"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"}
1
+ {"version":3,"file":"citation-CZAaCykt.d.mts","names":[],"sources":["../src/extract/pincite.ts","../src/extract/dates.ts","../src/clean/segmentMap.ts","../src/types/span.ts","../src/types/componentSpans.ts","../src/types/citation.ts"],"mappings":"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"}
@@ -634,8 +634,37 @@ interface FullCaseCitation extends CitationBase {
634
634
  interface StatuteCitation extends CitationBase {
635
635
  type: "statute";
636
636
  title?: number;
637
- code: string;
638
- section: string;
637
+ /**
638
+ * Code identifier (`U.S.C.`, `NMSA 1978`, `Penal`, `Va. Code`, etc.).
639
+ * Optional because bare-section citations with no nearby jurisdictional
640
+ * signal drop both `code` and `jurisdiction` rather than guessing.
641
+ * (#565, originally #531)
642
+ */
643
+ code?: string;
644
+ /**
645
+ * Section identifier. Optional because some forms cite the chapter alone
646
+ * (e.g. Massachusetts `G.L. c. 93A` — see `chapter` below). #569
647
+ */
648
+ section?: string;
649
+ /**
650
+ * Structured representation of a `§§ N-M` range. Populated only for
651
+ * citations where the section field is unambiguously a numeric range
652
+ * (typically federal `28 U.S.C. §§ 591-99`). Hyphenated state-style
653
+ * sections (`19.2-81`, `32A-2-7`) are NOT ranges and leave this
654
+ * undefined. `start` is mirrored on the `section` field for backward
655
+ * compatibility. (#564)
656
+ */
657
+ sectionRange?: {
658
+ start: string;
659
+ end: string;
660
+ };
661
+ /**
662
+ * Chapter identifier for citations that use a chapter+section layout,
663
+ * notably Massachusetts (`G.L. c. 93A`, `M.G.L.A. c. 93, § 14`).
664
+ * Previously the chapter number was leaking into `code`; populated
665
+ * separately as of #569.
666
+ */
667
+ chapter?: string;
639
668
  /** Subsection/pincite chain, e.g. "(a)(1)(A)" */
640
669
  subsection?: string;
641
670
  /** 2-letter state code or "US" when unambiguously identified */
@@ -1083,4 +1112,4 @@ type CitationOfType<T extends CitationType> = Extract<Citation, {
1083
1112
  type ExtractorMap = { [K in FullCitationType]: CitationOfType<K> };
1084
1113
  //#endregion
1085
1114
  export { ConstitutionalComponentSpans as A, PinciteInfo as B, ShortFormCitationType as C, SupraCitation as D, SubsequentHistoryEntry as E, StatuteComponentSpans as F, StatutesAtLargeComponentSpans as I, Span as L, JournalComponentSpans as M, NeutralComponentSpans as N, Warning as O, PublicLawComponentSpans as P, TransformationMap as R, ShortFormCitation as S, StatutesAtLargeCitation as T, parsePincite as V, NeutralCitation as _, CitationType as a, PublicLawCitation as b, DocketCitation as c, FullCaseCitation as d, FullCitation as f, JournalCitation as g, IdCitation as h, CitationSignal as i, FederalRegisterComponentSpans as j, CaseComponentSpans as k, ExtractorMap as l, HistorySignal as m, CitationBase as n, ConstitutionalCitation as o, FullCitationType as p, CitationOfType as r, CourtInference as s, Citation as t, FederalRegisterCitation as u, Parenthetical as v, StatuteCitation as w, ShortFormCaseCitation as x, ParentheticalType as y, spanFromGroupIndex as z };
1086
- //# sourceMappingURL=citation-BxhgKVy4.d.mts.map
1115
+ //# sourceMappingURL=citation-IOfRnNcY.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"citation-BxhgKVy4.d.mts","names":[],"sources":["../src/extract/pincite.ts","../src/extract/dates.ts","../src/clean/segmentMap.ts","../src/types/span.ts","../src/types/componentSpans.ts","../src/types/citation.ts"],"mappings":"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"}
1
+ {"version":3,"file":"citation-IOfRnNcY.d.cts","names":[],"sources":["../src/extract/pincite.ts","../src/extract/dates.ts","../src/clean/segmentMap.ts","../src/types/span.ts","../src/types/componentSpans.ts","../src/types/citation.ts"],"mappings":"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"}