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, Ventúre judex sǽculi,
Consérva nos in témpore Consérva nos in témpore
Hostis a telo pérfidi. 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: | en: |
Bright builder of the heavenly poles, Bright builder of the heavenly poles,
Eternal light of faithful souls, Eternal light of faithful souls,
@@ -67,12 +61,6 @@ text:
Shalt be our Judge, we humbly pray Shalt be our Judge, we humbly pray
Such arms of heavenly grace to send Such arms of heavenly grace to send
As may thy Church from foes defend. 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: status:
la: draft la: draft
en: 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: Da gratiárum múnera:
Dissólve litis víncula: Dissólve litis víncula:
Astrínge pacis fœ́dera. 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: | en: |
Maker of man, who from thy throne Maker of man, who from thy throne
Dost order all things, God alone; Dost order all things, God alone;
@@ -52,12 +46,6 @@ text:
And grant thy gifts of grace below; And grant thy gifts of grace below;
From chains of strife our souls release, From chains of strife our souls release,
Bind fast the gentle bands of peace. 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: status:
la: draft la: draft
en: 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, Dona per abstinéntiam,
Jejúnet ut mens sóbria Jejúnet ut mens sóbria
A labe prorsus críminum. 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: | en: |
O kind Creator, bow thine ear O kind Creator, bow thine ear
To mark the cry, to know the tear To mark the cry, to know the tear
@@ -52,12 +46,6 @@ text:
From discipline of outward things, From discipline of outward things,
That fasting inward secretly That fasting inward secretly
The soul may purely dwell with thee. 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: status:
la: draft la: draft
en: 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: Sic lúminis jubar ferat:
Ut vana cuncta próterat: Ut vana cuncta próterat:
Hanc falsa nulla cómprimant. 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: | en: |
O great Creator of the sky, O great Creator of the sky,
Who wouldest not the floods on high Who wouldest not the floods on high
@@ -51,12 +45,6 @@ text:
So shall its rays direct us right: So shall its rays direct us right:
And let this faith each error chase, And let this faith each error chase,
And never give to falsehood place. 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: status:
la: draft la: draft
en: 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, In hoc pascháli gáudio,
Ab omni mortis ímpetu Ab omni mortis ímpetu
Tuum defénde pópulum. 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: | en: |
At the Lamb's high feast we sing At the Lamb's high feast we sing
Praise to our victorious King, Praise to our victorious King,
@@ -85,12 +79,6 @@ text:
Only sin can this destroy; Only sin can this destroy;
From the death of sin set free, From the death of sin set free,
Souls re-born, dear Lord, in Thee. 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: status:
la: draft la: draft
en: 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 Hoc Passiónis témpore
Auge piis justítiam, Auge piis justítiam,
Reísque dona véniam. 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: | en: |
Abroad the regal banners fly, Abroad the regal banners fly,
Now shines the cross's mystery; Now shines the cross's mystery;
@@ -82,12 +76,6 @@ text:
This holy Passiontide, This holy Passiontide,
To give fresh merit to the saint, To give fresh merit to the saint,
And pardon to the penitent. 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: status:
la: draft la: draft
en: 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 deprecémur véspere:
Te nostra supplex glória Te nostra supplex glória
Per cuncta laudet sǽcula. 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: | en: |
O Trinity of blessed Light, O Trinity of blessed Light,
O Unity of sovereign might, O Unity of sovereign might,
@@ -32,12 +26,6 @@ text:
to Thee our evening prayer we raise; to Thee our evening prayer we raise;
Thee may our glory evermore Thee may our glory evermore
in lowly reverence adore. 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: status:
la: draft la: draft
en: 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). # 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 # English has no separate Monastic variant in the source (the wording
# differences don't affect translation), so it's the same text either way. # 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 id: vespers-hymn-sunday
text: text:
la: | la: |
@@ -28,12 +33,6 @@ text:
Vitále tollat prǽmium: Vitále tollat prǽmium:
Vitémus omne nóxium: Vitémus omne nóxium:
Purgémus omne péssimum. 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: | en: |
O blest Creator of the light, O blest Creator of the light,
Who mak'st the day with radiance bright, Who mak'st the day with radiance bright,
@@ -54,12 +53,6 @@ text:
The heavenly gate and prize to gain: The heavenly gate and prize to gain:
Each harmful lure aside to cast, Each harmful lure aside to cast,
And purge away each error past. 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: status:
la: draft la: draft
en: 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: Nullum levet jactántia:
Elísa mens ne cóncidat: Elísa mens ne cóncidat:
Eláta mens ne córruat. 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: | en: |
O sovereign Lord of nature's might, O sovereign Lord of nature's might,
Who bad'st the water's birth divide; Who bad'st the water's birth divide;
@@ -53,12 +47,6 @@ text:
The humble cheer, the high control; The humble cheer, the high control;
Check in each heart its proud excess, Check in each heart its proud excess,
But raise the meek and contrite soul! 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: status:
la: draft la: draft
en: 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: Nullis malis appróximet:
Bonis repléri gáudeat, Bonis repléri gáudeat,
Et mortis actum nésciat. 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: | en: |
Earth's mighty Maker, whose command Earth's mighty Maker, whose command
Raised from the sea the solid land; Raised from the sea the solid land;
@@ -53,12 +47,6 @@ text:
And keep from every evil way; And keep from every evil way;
Rejoice each promised good to win, Rejoice each promised good to win,
And flee from every mortal sin. 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: status:
la: draft la: draft
en: 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: Abstérge sordes méntium:
Resólve culpæ vínculum: Resólve culpæ vínculum:
Evérte moles críminum. 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: | en: |
O God, whose hand hath spread the sky, O God, whose hand hath spread the sky,
And all its shining hosts on high, And all its shining hosts on high,
@@ -53,12 +47,6 @@ text:
Polluted souls make pure again: Polluted souls make pure again:
Unloose the bands of guilt within: Unloose the bands of guilt within:
Remove the burden of our sin. 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: status:
la: draft la: draft
en: draft en: draft
+26 -1
View File
@@ -5,10 +5,12 @@ import { weekdayOf } from '../calendar/weekday';
import { getDayLabel } from '../calendar/day-label'; import { getDayLabel } from '../calendar/day-label';
import { getPsalmVerses } from '../psalter'; import { getPsalmVerses } from '../psalter';
import { getOpeningVersicleId } from './opening-versicle'; import { getOpeningVersicleId } from './opening-versicle';
import { getHymnDoxologyId } from './hymn-doxology';
import { getVespersSaintOverride, getVespersCommonOverride } from './vespers-psalmody-overrides'; import { getVespersSaintOverride, getVespersCommonOverride } from './vespers-psalmody-overrides';
import { applyFlexaMark } from './antiphon'; import { applyFlexaMark } from './antiphon';
import { import {
resolveCommon, resolveCommon,
appendDoxology,
getDayCollects, getDayCollects,
getMagnificatAntiphon, getMagnificatAntiphon,
splitNamedAntiphon, splitNamedAntiphon,
@@ -170,6 +172,29 @@ function vespersCapitulumForOverride(id: string): ResolvedText {
return resolveCommon(`lauds-capitulum-${id}`); 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 — /** The chapter/responsory/hymn/versicle bundle following the psalmody —
* see hours/types.ts's 'vespers-office' doc comment. Any sanctoral * see hours/types.ts's 'vespers-office' doc comment. Any sanctoral
* winner's (or named-temporal feast's) own proper bundle (chapter via * winner's (or named-temporal feast's) own proper bundle (chapter via
@@ -207,7 +232,7 @@ function resolveOffice(day: LiturgicalDay): ResolvedPart[] {
kind: 'responsory', kind: 'responsory',
text: resolveResponsory(resolveCommon(seasonSuffix ? `vespers-responsory-${key}` : vespersResponsoryId(day.weekday)), day), 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', kind: 'versicle',
text: resolveCommon(seasonSuffix ? `vespers-versicle-${key}` : vespersVersicleId(day.weekday)), text: resolveCommon(seasonSuffix ? `vespers-versicle-${key}` : vespersVersicleId(day.weekday)),