diff --git a/src/hours/none.ts b/src/hours/none.ts index 2307f8f..8fc3475 100644 --- a/src/hours/none.ts +++ b/src/hours/none.ts @@ -13,6 +13,7 @@ import { resolveOfficeWinner, resolveMinorHourAntiphon, resolveMinorHourChapter, + resolveSelfContainedHymn, } from './resolve-common'; import noneDefinitionData from '../data/hours/none.yml'; import antiphonsData from '../data/hours/none-antiphons.yml'; @@ -25,8 +26,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] { case 'opening-versicle': return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }]; case 'hymn': - // Self-contained, no appendDoxology — see none-hymn.yml. - return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }]; + return resolveSelfContainedHymn(part); case 'chapter': return [{ kind: 'chapter', text: resolveMinorHourChapter('none', day, part.textRef.id) }]; case 'day-collect': diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index f42fb3d..89541b3 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -1,4 +1,4 @@ -import type { ResolvedPart, ResolvedText } from './types'; +import type { PropersRef, ResolvedPart, ResolvedText } from './types'; import type { Commemoration, DayWinner, LiturgicalDay, Weekday } from '../calendar/types'; import type { ProperText } from '../propers'; import { getCommonProper, getTemporalProper } from '../propers'; @@ -31,6 +31,15 @@ export function resolveCommon(id: string): ResolvedText { return toResolvedText(getCommonProper(id)); } +/** Terce/Sext/None's own Matins-less hymn 'hymn' case — a plain, fixed, + * self-contained text with no doxology mechanism at all (the closing + * doxology is baked directly into each hour's own hymn text file; see + * {terce,sext,none}-hymn.yml) and no override/season tiering. Byte- + * identical across all three files before being centralized here. */ +export function resolveSelfContainedHymn(part: { textRef: PropersRef }): ResolvedPart[] { + return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }]; +} + // Named temporal winners with real standing of their own, unconditionally // override-eligible — see hours/lauds.ts's getPsalmodyOverrideFor, which // shares this set (imported from here, not duplicated) since it's the diff --git a/src/hours/sext.ts b/src/hours/sext.ts index 24eba44..fa6555e 100644 --- a/src/hours/sext.ts +++ b/src/hours/sext.ts @@ -13,6 +13,7 @@ import { resolveOfficeWinner, resolveMinorHourAntiphon, resolveMinorHourChapter, + resolveSelfContainedHymn, } from './resolve-common'; import sextDefinitionData from '../data/hours/sext.yml'; import antiphonsData from '../data/hours/sext-antiphons.yml'; @@ -25,8 +26,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] { case 'opening-versicle': return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }]; case 'hymn': - // Self-contained, no appendDoxology — see sext-hymn.yml. - return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }]; + return resolveSelfContainedHymn(part); case 'chapter': return [{ kind: 'chapter', text: resolveMinorHourChapter('sext', day, part.textRef.id) }]; case 'day-collect': diff --git a/src/hours/terce.ts b/src/hours/terce.ts index 121a57e..9466398 100644 --- a/src/hours/terce.ts +++ b/src/hours/terce.ts @@ -13,6 +13,7 @@ import { resolveOfficeWinner, resolveMinorHourAntiphon, resolveMinorHourChapter, + resolveSelfContainedHymn, } from './resolve-common'; import terceDefinitionData from '../data/hours/terce.yml'; import antiphonsData from '../data/hours/terce-antiphons.yml'; @@ -25,8 +26,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] { case 'opening-versicle': return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }]; case 'hymn': - // Self-contained, no appendDoxology — see terce-hymn.yml. - return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }]; + return resolveSelfContainedHymn(part); case 'chapter': return [{ kind: 'chapter', text: resolveMinorHourChapter('terce', day, part.textRef.id) }]; case 'day-collect':