Return the first complete sentence from a prose paragraph, suitable
for use as a fallback editorial title when the artefact H1 is
categorical (e.g. # EU Parliament Committee Reports) and the
resolver must derive <title> from the BLUF / lede summary instead.
A "sentence" is the prefix up to the first sentence-terminator
(. , ! , ? , ; ) inside the [HEADLINE_SOFT_MIN, TITLE_MAX_LENGTH] window. Common abbreviations (Q1., Q2.,
H1., H2., Mr., Mrs., e.g., i.e., vs.) are skipped
so they don't terminate the sentence prematurely. When no
acceptable terminator exists in the window, returns the entire
input unchanged so truncateTitle can handle clause-boundary
truncation downstream.
This produces journalistically clean titles even for the
propositions / committee-reports cases where the BLUF paragraph
opens with a single long sentence that exceeds 140 chars —
truncateTitle then breaks on a clause boundary, and the result is
still grammatical because the input was a sentence prefix rather
than an arbitrary paragraph slice.
Return the first complete sentence from a prose paragraph, suitable for use as a fallback editorial title when the artefact H1 is categorical (e.g.
# EU Parliament Committee Reports) and the resolver must derive<title>from the BLUF / lede summary instead.A "sentence" is the prefix up to the first sentence-terminator (
.,!,?,;) inside the[HEADLINE_SOFT_MIN, TITLE_MAX_LENGTH]window. Common abbreviations (Q1.,Q2.,H1.,H2.,Mr.,Mrs.,e.g.,i.e.,vs.) are skipped so they don't terminate the sentence prematurely. When no acceptable terminator exists in the window, returns the entire input unchanged so truncateTitle can handle clause-boundary truncation downstream.This produces journalistically clean titles even for the propositions / committee-reports cases where the BLUF paragraph opens with a single long sentence that exceeds 140 chars —
truncateTitlethen breaks on a clause boundary, and the result is still grammatical because the input was a sentence prefix rather than an arbitrary paragraph slice.