From 0736c3649475109b082c500ca67fb50a447eed1b Mon Sep 17 00:00:00 2001 From: Will Estes Date: Thu, 3 Sep 2026 15:00:06 -0400 Subject: [PATCH] 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 Claude-Session: https://claude.ai/code/session_01AGjUyhUZJaSjiniEmnLdak --- ...vespers-hymn-advent-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-advent.yml | 12 --------- ...vespers-hymn-friday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-friday.yml | 12 --------- .../vespers-hymn-lent-doxology-per-annum.yml | 7 +++++ src/data/propers/common/vespers-hymn-lent.yml | 12 --------- ...vespers-hymn-monday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-monday.yml | 12 --------- ...rs-hymn-paschaltide-doxology-per-annum.yml | 7 +++++ .../common/vespers-hymn-paschaltide.yml | 12 --------- ...rs-hymn-passiontide-doxology-per-annum.yml | 7 +++++ .../common/vespers-hymn-passiontide.yml | 12 --------- ...spers-hymn-saturday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-saturday.yml | 12 --------- ...vespers-hymn-sunday-doxology-per-annum.yml | 17 ++++++++++++ .../propers/common/vespers-hymn-sunday.yml | 17 ++++-------- ...spers-hymn-thursday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-thursday.yml | 12 --------- ...espers-hymn-tuesday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-tuesday.yml | 12 --------- ...pers-hymn-wednesday-doxology-per-annum.yml | 7 +++++ .../propers/common/vespers-hymn-wednesday.yml | 12 --------- src/hours/vespers.ts | 27 ++++++++++++++++++- 23 files changed, 118 insertions(+), 133 deletions(-) create mode 100644 src/data/propers/common/vespers-hymn-advent-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-friday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-lent-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-monday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-paschaltide-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-passiontide-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-saturday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-sunday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-thursday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-tuesday-doxology-per-annum.yml create mode 100644 src/data/propers/common/vespers-hymn-wednesday-doxology-per-annum.yml diff --git a/src/data/propers/common/vespers-hymn-advent-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-advent-doxology-per-annum.yml new file mode 100644 index 0000000..fb29b9b --- /dev/null +++ b/src/data/propers/common/vespers-hymn-advent-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-advent.yml b/src/data/propers/common/vespers-hymn-advent.yml index 1ac442d..4c80fc1 100644 --- a/src/data/propers/common/vespers-hymn-advent.yml +++ b/src/data/propers/common/vespers-hymn-advent.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-friday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-friday-doxology-per-annum.yml new file mode 100644 index 0000000..cb2e90a --- /dev/null +++ b/src/data/propers/common/vespers-hymn-friday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-friday.yml b/src/data/propers/common/vespers-hymn-friday.yml index 4f828fb..2ddebee 100644 --- a/src/data/propers/common/vespers-hymn-friday.yml +++ b/src/data/propers/common/vespers-hymn-friday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-lent-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-lent-doxology-per-annum.yml new file mode 100644 index 0000000..ae0d54c --- /dev/null +++ b/src/data/propers/common/vespers-hymn-lent-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-lent.yml b/src/data/propers/common/vespers-hymn-lent.yml index 82475cf..a446a4a 100644 --- a/src/data/propers/common/vespers-hymn-lent.yml +++ b/src/data/propers/common/vespers-hymn-lent.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-monday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-monday-doxology-per-annum.yml new file mode 100644 index 0000000..683edd0 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-monday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-monday.yml b/src/data/propers/common/vespers-hymn-monday.yml index 90b8eac..5844aff 100644 --- a/src/data/propers/common/vespers-hymn-monday.yml +++ b/src/data/propers/common/vespers-hymn-monday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-paschaltide-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-paschaltide-doxology-per-annum.yml new file mode 100644 index 0000000..00284f3 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-paschaltide-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-paschaltide.yml b/src/data/propers/common/vespers-hymn-paschaltide.yml index 035bdb8..e3bdff3 100644 --- a/src/data/propers/common/vespers-hymn-paschaltide.yml +++ b/src/data/propers/common/vespers-hymn-paschaltide.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-passiontide-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-passiontide-doxology-per-annum.yml new file mode 100644 index 0000000..a2e64b6 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-passiontide-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-passiontide.yml b/src/data/propers/common/vespers-hymn-passiontide.yml index d55fc98..ac55a65 100644 --- a/src/data/propers/common/vespers-hymn-passiontide.yml +++ b/src/data/propers/common/vespers-hymn-passiontide.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-saturday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-saturday-doxology-per-annum.yml new file mode 100644 index 0000000..2095612 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-saturday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-saturday.yml b/src/data/propers/common/vespers-hymn-saturday.yml index 31de7c6..61f5d0f 100644 --- a/src/data/propers/common/vespers-hymn-saturday.yml +++ b/src/data/propers/common/vespers-hymn-saturday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-sunday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-sunday-doxology-per-annum.yml new file mode 100644 index 0000000..c2a9149 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-sunday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-sunday.yml b/src/data/propers/common/vespers-hymn-sunday.yml index 5add5fd..dd7bf4d 100644 --- a/src/data/propers/common/vespers-hymn-sunday.yml +++ b/src/data/propers/common/vespers-hymn-sunday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-thursday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-thursday-doxology-per-annum.yml new file mode 100644 index 0000000..f37f3a5 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-thursday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-thursday.yml b/src/data/propers/common/vespers-hymn-thursday.yml index 4f6107e..f7e9741 100644 --- a/src/data/propers/common/vespers-hymn-thursday.yml +++ b/src/data/propers/common/vespers-hymn-thursday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-tuesday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-tuesday-doxology-per-annum.yml new file mode 100644 index 0000000..9215422 --- /dev/null +++ b/src/data/propers/common/vespers-hymn-tuesday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-tuesday.yml b/src/data/propers/common/vespers-hymn-tuesday.yml index 22f24c4..30cec52 100644 --- a/src/data/propers/common/vespers-hymn-tuesday.yml +++ b/src/data/propers/common/vespers-hymn-tuesday.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-wednesday-doxology-per-annum.yml b/src/data/propers/common/vespers-hymn-wednesday-doxology-per-annum.yml new file mode 100644 index 0000000..9632edc --- /dev/null +++ b/src/data/propers/common/vespers-hymn-wednesday-doxology-per-annum.yml @@ -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 diff --git a/src/data/propers/common/vespers-hymn-wednesday.yml b/src/data/propers/common/vespers-hymn-wednesday.yml index ccf342f..1dfe073 100644 --- a/src/data/propers/common/vespers-hymn-wednesday.yml +++ b/src/data/propers/common/vespers-hymn-wednesday.yml @@ -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 diff --git a/src/hours/vespers.ts b/src/hours/vespers.ts index 646bfe4..7c68e0a 100644 --- a/src/hours/vespers.ts +++ b/src/hours/vespers.ts @@ -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)),