diff --git a/src/calendar/temporal-id.ts b/src/calendar/temporal-id.ts index 5b852a0..33166db 100644 --- a/src/calendar/temporal-id.ts +++ b/src/calendar/temporal-id.ts @@ -30,6 +30,7 @@ // confirmed against that source rather than re-derived by hand. import { resolveSeason, sundayOnOrBefore, firstSundayStrictlyAfter, adventStart, easterOffsetOf } from './temporal'; import { daysBetween } from './date-math'; +import { weekdayOf } from './weekday'; const EASTER_OFFSET_IDS: [number, string][] = [ [-63, 'septuagesima'], @@ -78,6 +79,21 @@ export function resolveTemporalId(isoDate: string): string { const season = resolveSeason(isoDate); const year = Number(isoDate.slice(0, 4)); + // The Vigil of Christmas (Dec 24) has its own real proper content + // (collect, Lauds antiphons, Matins Gospel+homily nocturn) distinct from + // Advent 4's own — see data/propers/temporal/vigil-of-christmas-collect.yml + // and data/propers/nocturn-readings/vigil-of-christmas.yml, both + // transcribed directly from the reference engine's Sancti/12-24.txt. + // Scoped to non-Sunday only for now: when Dec 24 itself is Advent 4's own + // Sunday, the reference engine's own 12-24s.txt keeps Advent 4's psalms + // and most of its Matins lessons (only swapping in the Vigil's Gospel + // nocturn) rather than fully substituting this id — a genuine content + // splice this app doesn't model yet, deliberately left as `advent-4` for + // that one specific case pending that design decision. + if (isoDate.slice(5) === '12-24' && weekdayOf(isoDate) !== 'sunday') { + return 'vigil-of-christmas'; + } + if (season === 'advent') { const start = adventStart(year); const n = Math.round(daysBetween(start, sundayOnOrBefore(isoDate)) / 7) + 1; diff --git a/src/data/hours/lauds-psalmody-overrides/vigil-of-christmas.yml b/src/data/hours/lauds-psalmody-overrides/vigil-of-christmas.yml new file mode 100644 index 0000000..0e2726c --- /dev/null +++ b/src/data/hours/lauds-psalmody-overrides/vigil-of-christmas.yml @@ -0,0 +1,29 @@ +# Read directly from the reference engine's Sancti/12-24.txt (Latin `[Ant +# Laudes]`, 5 antiphons) and English/Sancti/12-24.txt -- the Vigil of +# Christmas's own proper Lauds antiphons, mapped onto this app's usual +# 3-psalm-group + canticle + laudate override shape (same fixed 92/99/62 +# psalm set every other duplex-majus+ override here uses, e.g. +# christmas-octave-sunday.yml/all-saints.yml). +id: vigil-of-christmas +groups: + - psalms: [92] + antiphon: + la: "Judǽa et Jerúsalem, * nolíte timére: cras egrediémini, et Dóminus erit vobíscum, allelúja." + en: "O Judah and Jerusalem, * fear not: tomorrow ye shall go out, and the Lord will be with you." + - psalms: [99] + antiphon: + la: "Hódie sciétis * quia véniet Dóminus: et mane vidébitis glóriam ejus." + en: "This day ye shall know * that the Lord cometh and in the morning, then ye shall see His glory." + - psalms: [62] + antiphon: + la: "Crástina die * delébitur iníquitas terræ: et regnábit super nos Salvátor mundi." + en: "On the morrow * the sins of the earth shall be washed away, and the Saviour of the world will be our King." +canticle: + id: canticum-trium-puerorum + antiphon: + la: "Dóminus véniet, * occúrrite illi, dicéntes: Magnum princípium, et regni ejus non erit finis: Deus, Fortis, Dominátor, Princeps pacis, allelúja." + en: "The Lord cometh! * Go ye out to meet Him, and say How great is His dominion, and of His kingdom there shall be no end! He is the Mighty God, the Ruler, the Prince of Peace, Alleluia!" +laudate: + antiphon: + la: "Crástina erit * vobis salus, dicit Dóminus Deus exercítuum." + en: "On the morrow * ye shall be saved, saith the Lord God of hosts." diff --git a/src/data/propers/nocturn-readings/vigil-of-christmas.yml b/src/data/propers/nocturn-readings/vigil-of-christmas.yml new file mode 100644 index 0000000..08ca973 --- /dev/null +++ b/src/data/propers/nocturn-readings/vigil-of-christmas.yml @@ -0,0 +1,50 @@ +# Matins reading for the Vigil of Christmas (Dec 24, when it's not itself +# Advent 4's own Sunday) -- read directly from the reference engine's +# Sancti/12-24.txt (Lectio1, Latin) and English/Sancti/12-24.txt (Lectio1, +# English): the day's Gospel pericope (Matt 1:18-21, given in full, not a +# bare incipit) plus St. Jerome's homily on it. Same single-nocturn Vigil +# shape as vigil-of-st-john-the-baptist.yml -- `nocturn: 1`, matching the +# Ember-day convention for a ferial day's one real nocturn (see +# hours/matins.ts's own nocturnReadingIds doc comment). +id: vigil-of-christmas +readings: + - nocturn: 1 + isGospel: true + citation: { la: "Matt 1:18-21", en: "Matt 1:18-21" } + text: + la: >- + Cum esset desponsáta Mater Jesu María Joseph, ántequam convenírent, invénta est in útero + habens de Spíritu Sancto. Et réliqua. + en: >- + When as his mother Mary was espoused to Joseph, before they came together, she was found + with child, of the Holy Ghost. And so on. + status: { la: verified, en: verified } + responsory: + la: | + R. Sanctificámini hódie, et estóte paráti: quia die crástina vidébitis + * Majestátem Dei in vobis. + V. Hódie sciétis quia véniet Dóminus, et mane vidébitis. + R. Majestátem Dei in vobis. + en: | + R. Sanctify yourselves today, and be ready; for on the morrow, ye shall see + * The majesty of God upon you. + V. This day ye shall know that the Lord cometh, and in the morning, then ye shall see. + R. The majesty of God upon you. + - nocturn: 1 + isGospel: false + source: "Homily by St. Jerome, Priest (at Bethlehem), Book of Commentaries, on Matth. i." + text: + la: >- + Quare non de símplici vírgine, sed de desponsáta concípitur? Primum, ut per generatiónem + Joseph, orígo Maríæ monstrarétur: secúndo, ne lapidarétur a Judǽis ut adúltera: tértio, ut + in Ægýptum fúgiens habéret solátium. Martyr Ignátius étiam quartam áddidit causam, cur a + desponsáta concéptus sit: Ut partus, ínquiens, ejus celarétur diábolo, dum eum putat non de + vírgine, sed de uxóre generátum. + en: >- + Why was the Lord conceived of an espoused virgin rather than of a free? First, for the + sake of the genealogy of Mary, which we have obtained by that of Joseph. Secondly, because + she was thus saved from being stoned by the Jews as an adulteress. Thirdly, that Himself + and His mother might have a guardian on their journey into Egypt. To these, Ignatius, the + martyr of Antioch, has added a fourth reason namely, that the birth might take place + unknown to the devil, who would naturally suppose that Mary had conceived by Joseph. + status: { la: verified, en: verified } diff --git a/src/data/propers/temporal/vigil-of-christmas-benedictus-antiphon.yml b/src/data/propers/temporal/vigil-of-christmas-benedictus-antiphon.yml new file mode 100644 index 0000000..a9dd107 --- /dev/null +++ b/src/data/propers/temporal/vigil-of-christmas-benedictus-antiphon.yml @@ -0,0 +1,16 @@ +# Verified against Divinum Officium (Monastic Tridentinum 1617), Lauds +# live query, 2026-12-24 (a plain Thursday, non-Sunday Vigil of +# Christmas). The static reference file (Sancti/12-24.txt) has no +# explicit `[Ant Benedictus]` tag for this date -- turns out the live +# engine reuses the same text tagged `[Ant 2]` there (labeled "Antiphona +# ex Proprio Sanctorum" in the live render), already imported separately +# for Matins' own Nocturn 2 -- see nocturn-readings/vigil-of-christmas.yml. +# Same text, two real uses, not a coincidence to collapse into one file: +# these are two distinct ResolvedPart slots. +id: vigil-of-christmas-benedictus-antiphon +text: + la: "Oriétur * sicut sol Salvátor mundi: et descéndet in úterum Vírginis, sicut imber super gramen, allelúja." + en: "The Saviour of the world * shall rise like the sun, and come down into the womb of the Virgin as the showers upon the grass, alleluia." +status: + la: verified + en: verified diff --git a/src/data/propers/temporal/vigil-of-christmas-collect.yml b/src/data/propers/temporal/vigil-of-christmas-collect.yml new file mode 100644 index 0000000..5d8e9c0 --- /dev/null +++ b/src/data/propers/temporal/vigil-of-christmas-collect.yml @@ -0,0 +1,20 @@ +# Read directly from the reference engine's own Sancti/12-24.txt (Latin) +# and English/Sancti/12-24.txt -- the Vigil of Christmas's own proper +# Oratio (`In Vigilia Nativitatis Domini`, Duplex I classis), used on Dec +# 24 regardless of rank contest (see calendar/temporal-id.ts's own +# `vigil-of-christmas` case, currently scoped to a non-Sunday Dec 24 only). +id: vigil-of-christmas-collect +text: + la: | + Orémus. + Deus, qui nos redemptiónis nostræ ánnua exspectatióne lætíficas: præsta; ut Unigénitum tuum, quem Redemptórem læti suscípimus, veniéntem quoque Júdicem secúri videámus, Dóminum nostrum Jesum Christum Fílium tuum: + Qui tecum vivit et regnat in unitáte Spíritus Sancti, Deus, per ómnia sǽcula sæculórum. + R. Amen. + en: | + Let us pray. + O God, thou Who gladden us year after year with the expectation of our redemption, grant that we, who now welcome with joy thy only-begotten Son as our Redeemer, may also gaze upon Him without fear when He comes as our judge, our Lord Jesus Christ, thy Son: + Who liveth and reigneth with thee, in the unity of the Holy Spirit, God, world without end. + R. Amen. +status: + la: verified + en: verified diff --git a/src/hours/resolve-common.ts b/src/hours/resolve-common.ts index 038e294..b78ca9a 100644 --- a/src/hours/resolve-common.ts +++ b/src/hours/resolve-common.ts @@ -57,6 +57,7 @@ export const ALWAYS_OVERRIDE_TEMPORAL_IDS = new Set([ 'immaculate-heart-of-mary', 'circumcision', 'holy-name-of-jesus', + 'vigil-of-christmas', ]); /**