Wire seasonal hymn-doxology into the Matins ferial hymn

The plain ferial hymn's Monastic source (Day1-6 Hymnus,
Psalterium/Special/Matutinum Special.txt) carries a real "*" seasonal-
substitution marker, live-checked against the reference engine. Splits the
hymn's own natural doxology ending into a new per-annum companion file and
swaps it via getHymnDoxologyId/appendDoxology, same pattern already used by
Prime and Compline.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak
This commit is contained in:
2026-09-03 14:59:49 -04:00
parent 44feb8c6b1
commit aeda043577
3 changed files with 31 additions and 19 deletions
+10 -1
View File
@@ -76,9 +76,11 @@ import { getPsalmVerses } from '../psalter';
import { getPsalmsFor, type PsalmRef } from '../psalter/distribution';
import { getScriptureVerses } from '../scripture';
import { getOpeningVersicleId } from './opening-versicle';
import { getHymnDoxologyId } from './hymn-doxology';
import { applyFlexaMark } from './antiphon';
import {
resolveCommon,
appendDoxology,
getDayCollect,
getOfficeOverrideId,
resolveOfficeWinner,
@@ -454,7 +456,14 @@ function resolveMatinsHymn(day: LiturgicalDay): ResolvedText {
return seasonal;
}
}
return resolveCommon('matins-hymn-ferial');
// The plain ferial hymn's own Monastic source (Day1-6 Hymnus, Psalterium/
// Special/Matutinum Special.txt) carries a real seasonal-doxology
// substitution marker (live-checked 2026-09-03) — unlike the Advent/
// Paschaltide seasonal hymns above, whose Monastic forms are each fixed,
// non-swapping text, so only this final fallback needs the swap.
const body = resolveCommon('matins-hymn-ferial');
const doxology = resolveCommon(getHymnDoxologyId(day, 'matins-hymn-doxology-per-annum'));
return appendDoxology(body, doxology);
}
/** The plain ferial weekday nocturn's real antiphoned psalmody — a