Skip to content

Commit 9a176a4

Browse files
kckernclaude
andcommitted
fix(web): a capped range keeps its plain title
The scripture-guide package lists at most 1000 verses, so /gen.1.1-ex.1.2 resolves to Genesis 1:1–34:19 and the Genesis 1:1 title form made that "Genesis 1–34.19". That range is not what PHP titled (live: "Genesis 1–50Exodus 1:1–2"), so displayReference now applies the form only below the package's limit: "Genesis 1–34:19", as before 115689b. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent 013b115 commit 9a176a4

3 files changed

Lines changed: 11 additions & 3 deletions

File tree

‎apps/web/src/domain/rules/referenceParsing.js‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,12 @@ export function bookAlias(key) {
6161
// "2 Nephi 3:19; 27:13"), verses of the same chapter joined by commas ("John 3:16; 3:18" →
6262
// "John 3:16,18"), and a range from verse 1 into another chapter without its first verse
6363
// ("2 Nephi 3:1-4:2" → "2 Nephi 3–4:2").
64-
export function displayReference(normalized) {
64+
// The scripture-guide package lists at most this many verses for a reference
65+
export const PACKAGE_VERSE_LIMIT = 1000;
66+
67+
// verseCount: the verses the reference resolved to; a capped range (PACKAGE_VERSE_LIMIT) is not
68+
// the range PHP titled, so its Genesis 1:1 form is not reproduced
69+
export function displayReference(normalized, verseCount = 0) {
6570
const parts = String(normalized || '').split(/;\s*/).filter(Boolean);
6671
const out = [];
6772
let chapter = null;
@@ -75,7 +80,7 @@ export function displayReference(normalized) {
7580
}
7681
// From Genesis 1:1 (verse id 1) referenceFromVerseIds skipped its cross-chapter branch
7782
// (segment 0) and printed the chapter run as "Genesis 1–2.3"
78-
if (!out.length && /^Genesis 1:1[-–]\d+:\d+$/.test(part)) part = part.replace(/^Genesis 1:1[-–](\d+):(\d+)$/, 'Genesis 1-$1.$2');
83+
if (!out.length && verseCount < PACKAGE_VERSE_LIMIT && /^Genesis 1:1[-–]\d+:\d+$/.test(part)) part = part.replace(/^Genesis 1:1[-–](\d+):(\d+)$/, 'Genesis 1-$1.$2');
7984
part = part.replace(/(^|\s)(\d+):1[-–](\d+:\d+)$/, '$1$2-$3');
8085
// Across a book end, one range without spaces; a start at verse 1 drops it ("Malachi 4–Matthew 1:2")
8186
part = part.replace(/^(.*?\d+)(?::(\d+))?\s+[-–]\s+(?=[^\d\s])/, (m, start, v) => `${start}${v && v !== '1' ? `:${v}` : ''}–`);

‎apps/web/src/presentation/presenters/HtmlPresenter.js‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ export class HtmlPresenter {
432432
return {
433433
reference: result.reference.normalized,
434434
// Page title: the reference with en dashes for ranges (PHP referenceFromVerseIds)
435-
title: displayReference(result.reference.normalized),
435+
title: displayReference(result.reference.normalized, result.reference.verseIds?.length ?? 0),
436436
// Heading for a reference block that matched no verses (scriptures::blankData)
437437
// escaped: it echoes the request (the PHP site reflected it raw)
438438
blank: result.verses.length ? null : escapeHtml(result.legacyBlock ? result.legacyBlock.orig : blankHeading(result.reference.query)),

‎apps/web/test/unit/referenceParsing.test.js‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,9 @@ describe('displayReference', () => {
8686
expect(displayReference('Genesis 1:1-3:5')).toBe('Genesis 1–3.5');
8787
expect(displayReference('Genesis 1:1-5')).toBe('Genesis 1:1–5');
8888
expect(displayReference('JST Genesis 1:1-2:3')).toBe('JST Genesis 1–2:3');
89+
// the package lists at most 1000 verses: a capped range was never what PHP titled
90+
expect(displayReference('Genesis 1:1-34:19', 1000)).toBe('Genesis 1–34:19');
91+
expect(displayReference('Genesis 1:1-2:3', 34)).toBe('Genesis 1–2.3');
8992
});
9093
test('a range across a book end is one range (referenceFromVerseIds)', () => {
9194
expect(displayReference('Malachi 4:5 - Matthew 1:2')).toBe('Malachi 4:5–Matthew 1:2');

0 commit comments

Comments
 (0)