Wire seasonal hymn-doxology into every plain-default Vespers hymn

Sunday's hymn ("Lucis Creator") is the one case whose Monastic source text
carries a real "*" seasonal-substitution marker (live-checked); every other
key (Mon-Sat, Advent, Lent, Passiontide, Paschaltide) is wired the same way
anyway as a deliberate broadening beyond the source, at the user's request
("the doxology is a neat way to stay tuned in to the season... we're doing a
remix, not a copy"). Each hymn's own natural ending is split into a matching
per-annum companion file, so a season/feast with no override reproduces the
original text exactly; only Nat/Epi/Pasch/Asc/Pent/Corp/Heart and the two
feast/date overrides from the previous commit actually change anything.

Real visible effect: hymns shown during Christmastide/Epiphanytide/Corpus
Christi/Sacred Heart (none of which get a distinct seasonal hymn, so these
were always the plain weekday defaults) now pick up the right doxology
instead of a generic ending; Ascensiontide and the Pentecost octave now
diverge from the rest of Paschaltide's doxology mid-season.

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 15:00:06 -04:00
parent aeda043577
commit 0736c36494
23 changed files with 118 additions and 133 deletions
@@ -0,0 +1,7 @@
id: vespers-hymn-advent-doxology-per-annum
text:
la: "Laus, honor, virtus, glória,\nDeo Patri, et Fílio,\nSancto simul Paráclito,\nIn sæculórum sǽcula.\nAmen."
en: "Be glory given and honour done\nTo God the Father and the Son\nAnd to the Holy Ghost on high,\nFrom age to age eternally.\nAmen."
status:
la: draft
en: draft
@@ -36,12 +36,6 @@ text:
Ventúre judex sǽculi,
Consérva nos in témpore
Hostis a telo pérfidi.
Laus, honor, virtus, glória,
Deo Patri, et Fílio,
Sancto simul Paráclito,
In sæculórum sǽcula.
Amen.
en: |
Bright builder of the heavenly poles,
Eternal light of faithful souls,
@@ -67,12 +61,6 @@ text:
Shalt be our Judge, we humbly pray
Such arms of heavenly grace to send
As may thy Church from foes defend.
Be glory given and honour done
To God the Father and the Son
And to the Holy Ghost on high,
From age to age eternally.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-friday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "Grant this, O Father, ever One\nWith Christ, thy sole-begotten Son,\nWhom, with the Spirit we adore,\nOne God, both now and evermore.\nAmen."
status:
la: draft
en: draft
@@ -26,12 +26,6 @@ text:
Da gratiárum múnera:
Dissólve litis víncula:
Astrínge pacis fœ́dera.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
Maker of man, who from thy throne
Dost order all things, God alone;
@@ -52,12 +46,6 @@ text:
And grant thy gifts of grace below;
From chains of strife our souls release,
Bind fast the gentle bands of peace.
Grant this, O Father, ever One
With Christ, thy sole-begotten Son,
Whom, with the Spirit we adore,
One God, both now and evermore.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-lent-doxology-per-annum
text:
la: "Præsta, beáta Trínitas,\nConcéde, simplex Únitas;\nUt fructuósa sint tuis\nJejuniórum múnera.\nAmen."
en: "We pray thee, Holy Trinity,\nOne God, unchanging Unity,\nThat we from this our abstinence\nMay reap the fruits of penitence.\nAmen."
status:
la: draft
en: draft
@@ -26,12 +26,6 @@ text:
Dona per abstinéntiam,
Jejúnet ut mens sóbria
A labe prorsus críminum.
Præsta, beáta Trínitas,
Concéde, simplex Únitas;
Ut fructuósa sint tuis
Jejuniórum múnera.
Amen.
en: |
O kind Creator, bow thine ear
To mark the cry, to know the tear
@@ -52,12 +46,6 @@ text:
From discipline of outward things,
That fasting inward secretly
The soul may purely dwell with thee.
We pray thee, Holy Trinity,
One God, unchanging Unity,
That we from this our abstinence
May reap the fruits of penitence.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-monday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "Grant this, O Father, ever One\nWith Christ, thy sole-begotten Son,\nAnd Holy Ghost, whom all adore,\nReigning and blest forevermore.\nAmen."
status:
la: draft
en: draft
@@ -25,12 +25,6 @@ text:
Sic lúminis jubar ferat:
Ut vana cuncta próterat:
Hanc falsa nulla cómprimant.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O great Creator of the sky,
Who wouldest not the floods on high
@@ -51,12 +45,6 @@ text:
So shall its rays direct us right:
And let this faith each error chase,
And never give to falsehood place.
Grant this, O Father, ever One
With Christ, thy sole-begotten Son,
And Holy Ghost, whom all adore,
Reigning and blest forevermore.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-paschaltide-doxology-per-annum
text:
la: "Glória tibi Dómine,\nQui surrexísti a mórtuis,\nCum Patre et Sancto Spíritu,\nIn sempitérna sǽcula.\nAmen."
en: "Hymns of glory, songs of praise,\nFather, unto thee we raise;\nRisen Lord, all praise to thee,\nEver with the Spirit be.\nAmen."
status:
la: draft
en: draft
@@ -44,12 +44,6 @@ text:
In hoc pascháli gáudio,
Ab omni mortis ímpetu
Tuum defénde pópulum.
Glória tibi Dómine,
Qui surrexísti a mórtuis,
Cum Patre et Sancto Spíritu,
In sempitérna sǽcula.
Amen.
en: |
At the Lamb's high feast we sing
Praise to our victorious King,
@@ -85,12 +79,6 @@ text:
Only sin can this destroy;
From the death of sin set free,
Souls re-born, dear Lord, in Thee.
Hymns of glory, songs of praise,
Father, unto thee we raise;
Risen Lord, all praise to thee,
Ever with the Spirit be.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-passiontide-doxology-per-annum
text:
la: "Te summa, Deus, Trínitas,\nColláudet omnis spíritus:\nQuos per Crucis mystérium\nSalvas, rege per sǽcula.\nAmen."
en: "Blest Trinity, salvation's spring,\nMay every soul thy praises sing;\nTo those thou grantest conquest by\nThe holy cross, rewards apply.\nAmen."
status:
la: draft
en: draft
@@ -45,12 +45,6 @@ text:
Hoc Passiónis témpore
Auge piis justítiam,
Reísque dona véniam.
Te summa, Deus, Trínitas,
Colláudet omnis spíritus:
Quos per Crucis mystérium
Salvas, rege per sǽcula.
Amen.
en: |
Abroad the regal banners fly,
Now shines the cross's mystery;
@@ -82,12 +76,6 @@ text:
This holy Passiontide,
To give fresh merit to the saint,
And pardon to the penitent.
Blest Trinity, salvation's spring,
May every soul thy praises sing;
To those thou grantest conquest by
The holy cross, rewards apply.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-saturday-doxology-per-annum
text:
la: "Deo Patri sit glória,\nEjúsque soli Fílio,\nCum Spíritu Paráclito,\nEt nunc, et in perpétuum.\nAmen."
en: "All laud to God the Father be;\nall praise, Eternal Son, to Thee;\nall glory, as is ever meet,\nto God the Holy Paraclete.\nAmen."
status:
la: draft
en: draft
@@ -16,12 +16,6 @@ text:
Te deprecémur véspere:
Te nostra supplex glória
Per cuncta laudet sǽcula.
Deo Patri sit glória,
Ejúsque soli Fílio,
Cum Spíritu Paráclito,
Et nunc, et in perpétuum.
Amen.
en: |
O Trinity of blessed Light,
O Unity of sovereign might,
@@ -32,12 +26,6 @@ text:
to Thee our evening prayer we raise;
Thee may our glory evermore
in lowly reverence adore.
All laud to God the Father be;
all praise, Eternal Son, to Thee;
all glory, as is ever meet,
to God the Holy Paraclete.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,17 @@
# Sunday Vespers' own natural doxology ending ("Lucis Creator", split out
# of vespers-hymn-sunday.yml so hours/vespers.ts can swap it seasonally via
# hymn-doxology.ts — the reference source carries a real "*" substitution
# marker here, live-checked in Psalterium/Special/Major Special.txt's
# "[Hymnus Day0 Vespera]", which the Monastic "[HymnusM Day0 Vespera]"
# inherits unchanged (its own two `s///` substitutions don't touch the
# doxology line) — unlike the weekday (Day1-6) and Paschaltide Vespers
# hymns, whose Monastic forms are each a separate, fixed, non-swapping
# text with no such marker. Text/status carried over unchanged from the
# original file.
id: vespers-hymn-sunday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "O Father, that we ask be done,\nThrough Jesus Christ, thine only Son;\nWho, with the Holy Ghost and thee,\nDoth live and reign eternally.\nAmen."
status:
la: draft
en: draft
@@ -6,6 +6,11 @@
# here rather than left as a diff — not live-query-verified (see TODO.md).
# English has no separate Monastic variant in the source (the wording
# differences don't affect translation), so it's the same text either way.
# The closing doxology stanza is split out into
# vespers-hymn-sunday-doxology-per-annum.yml (see hours/vespers.ts) — the source
# carries a real "*" seasonal-substitution marker there (live-checked
# 2026-09-03, Psalterium/Special/Major Special.txt), unlike every other
# Lauds/Vespers weekday hymn's fixed ending.
id: vespers-hymn-sunday
text:
la: |
@@ -28,12 +33,6 @@ text:
Vitále tollat prǽmium:
Vitémus omne nóxium:
Purgémus omne péssimum.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O blest Creator of the light,
Who mak'st the day with radiance bright,
@@ -54,12 +53,6 @@ text:
The heavenly gate and prize to gain:
Each harmful lure aside to cast,
And purge away each error past.
O Father, that we ask be done,
Through Jesus Christ, thine only Son;
Who, with the Holy Ghost and thee,
Doth live and reign eternally.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-thursday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "This boon, O Father, we entreat,\nThis blessing grant, Eternal Son,\nAnd Holy Ghost, the Paraclete,\nBoth now, and while the ages run.\nAmen."
status:
la: draft
en: draft
@@ -27,12 +27,6 @@ text:
Nullum levet jactántia:
Elísa mens ne cóncidat:
Eláta mens ne córruat.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O sovereign Lord of nature's might,
Who bad'st the water's birth divide;
@@ -53,12 +47,6 @@ text:
The humble cheer, the high control;
Check in each heart its proud excess,
But raise the meek and contrite soul!
This boon, O Father, we entreat,
This blessing grant, Eternal Son,
And Holy Ghost, the Paraclete,
Both now, and while the ages run.
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-tuesday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "Hear thou our prayer, Almighty King!\nHear thou our praises, while we sing,\nAdoring with the heavenly host,\nThe Father, Son, and Holy Ghost!\nAmen."
status:
la: draft
en: draft
@@ -27,12 +27,6 @@ text:
Nullis malis appróximet:
Bonis repléri gáudeat,
Et mortis actum nésciat.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
Earth's mighty Maker, whose command
Raised from the sea the solid land;
@@ -53,12 +47,6 @@ text:
And keep from every evil way;
Rejoice each promised good to win,
And flee from every mortal sin.
Hear thou our prayer, Almighty King!
Hear thou our praises, while we sing,
Adoring with the heavenly host,
The Father, Son, and Holy Ghost!
Amen.
status:
la: draft
en: draft
@@ -0,0 +1,7 @@
id: vespers-hymn-wednesday-doxology-per-annum
text:
la: "Præsta, Pater piíssime,\nPatríque compar Únice,\nCum Spíritu Paráclito\nRegnans per omne sǽculum.\nAmen."
en: "Grant this, O Father, ever One\nWith Christ thy sole-begotten Son,\nWhom, with the Spirit we adore,\nOne God, both now and evermore.\nAmen."
status:
la: draft
en: draft
@@ -27,12 +27,6 @@ text:
Abstérge sordes méntium:
Resólve culpæ vínculum:
Evérte moles críminum.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O God, whose hand hath spread the sky,
And all its shining hosts on high,
@@ -53,12 +47,6 @@ text:
Polluted souls make pure again:
Unloose the bands of guilt within:
Remove the burden of our sin.
Grant this, O Father, ever One
With Christ thy sole-begotten Son,
Whom, with the Spirit we adore,
One God, both now and evermore.
Amen.
status:
la: draft
en: draft
+26 -1
View File
@@ -5,10 +5,12 @@ import { weekdayOf } from '../calendar/weekday';
import { getDayLabel } from '../calendar/day-label';
import { getPsalmVerses } from '../psalter';
import { getOpeningVersicleId } from './opening-versicle';
import { getHymnDoxologyId } from './hymn-doxology';
import { getVespersSaintOverride, getVespersCommonOverride } from './vespers-psalmody-overrides';
import { applyFlexaMark } from './antiphon';
import {
resolveCommon,
appendDoxology,
getDayCollects,
getMagnificatAntiphon,
splitNamedAntiphon,
@@ -170,6 +172,29 @@ function vespersCapitulumForOverride(id: string): ResolvedText {
return resolveCommon(`lauds-capitulum-${id}`);
}
/**
* Every plain-default Vespers hymn's own closing doxology stanza (split
* out into `vespers-hymn-${key}-doxology-per-annum.yml`) is re-attached
* here through the seasonal mechanism (hours/hymn-doxology.ts) — Sunday's
* hymn ("Lucis Creator") is the one case in Lauds/Vespers/Matins' whole
* weekday-default set whose Monastic source text carries a real "*"
* seasonal-substitution marker (live-checked 2026-09-03), but every other
* key is wired the same way anyway as a deliberate broadening beyond the
* source: this project isn't a reconstruction (see the repo's CLAUDE.md),
* and the doxology is a natural, low-cost way to keep every hour visibly
* in step with the season — e.g. the plain weekday hymns used all through
* Christmastide/Epiphanytide/Corpus Christi/Sacred Heart (no
* `seasonalOfficeSuffix` covers those) previously stayed on their generic
* per-annum ending throughout. Each key's own natural ending is preserved
* as its per-annum default, so a season/feast with no override (e.g.
* Advent, Lent — the source itself never swaps those) reproduces the
* exact original text. See lauds.ts's identical resolveLaudsHymn. */
function resolveVespersHymn(day: LiturgicalDay, key: string): ResolvedText {
const body = resolveCommon(`vespers-hymn-${key}`);
const doxology = resolveCommon(getHymnDoxologyId(day, `vespers-hymn-${key}-doxology-per-annum`));
return appendDoxology(body, doxology);
}
/** The chapter/responsory/hymn/versicle bundle following the psalmody —
* see hours/types.ts's 'vespers-office' doc comment. Any sanctoral
* winner's (or named-temporal feast's) own proper bundle (chapter via
@@ -207,7 +232,7 @@ function resolveOffice(day: LiturgicalDay): ResolvedPart[] {
kind: 'responsory',
text: resolveResponsory(resolveCommon(seasonSuffix ? `vespers-responsory-${key}` : vespersResponsoryId(day.weekday)), day),
},
{ kind: 'hymn', text: resolveCommon(`vespers-hymn-${key}`) },
{ kind: 'hymn', text: resolveVespersHymn(day, key) },
{
kind: 'versicle',
text: resolveCommon(seasonSuffix ? `vespers-versicle-${key}` : vespersVersicleId(day.weekday)),