Compare commits

...

4 Commits

Author SHA1 Message Date
will 813d173f5c hours: build Terce, Sext, and None
Deploy / deploy (push) Successful in 39s
Three separate resolver files (terce.ts/sext.ts/none.ts), not a shared
little-hour module — they're structurally identical but kept independent
by choice. Ordo verified against Divinum Officium (Monastic Tridentinum
1617): opening versicle, self-contained hymn, one antiphon framing three
psalms (no closing repeat, unlike Prime), a capitulum with its own
embedded short versicle/response, the day's own collect, and a closing
identical across all three hours.

Also fills in psalter-distribution.yml's previously-missing Sunday/
Monday/Tuesday psalm entries (Ps 118 sections for Sunday/Monday; Tuesday
turns out to share Wednesday/Thursday's native gradual-psalm set, not a
distinct one). Friday/Saturday's antiphons are derived from each day's
first psalm rather than reusing the native gradual antiphons, since
those two days already use a redistributed, non-native psalm set.

hours/types.ts gains a 'day-collect' part kind — the first ordo to use
the day's own Proper collect rather than a fixed text.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:51:08 -04:00
will 7a932b40be propers: add the Terce/Sext/None hymns
Fixed, self-contained text (including each hymn's own final doxology
stanza) — unlike Prime's/Compline's hymns, these don't change by season,
so there's no appendDoxology split. Verified against Divinum Officium
(Monastic Tridentinum 1617).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:50:49 -04:00
will 083a2e0562 psalter: add the 27 psalms needed by Terce/Sext/None
Text for every psalm src/data/psalter-distribution.yml's terce/sext/none
tables reference but hadn't been authored yet — the native Gradual set
(119-127) plus the psalms used by the Friday/Saturday redistribution.
Verified Latin/English against Divinum Officium (Monastic Tridentinum
1617).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:50:40 -04:00
will 81440de832 hours: add the day's-collect resolver
Terce/Sext/None's Oratio is the day's own Proper-of-season/-saints
collect, not a fixed text — getDayCollect() resolves it from the
LiturgicalDay's winner (temporal id or sanctoral saint's propers),
falling through to an honest "missing" status for saints that don't
have authored propers yet.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:50:24 -04:00
53 changed files with 2257 additions and 33 deletions
+8 -1
View File
@@ -12,7 +12,7 @@
import type { FeastClass } from './types';
import sanctoralCalendarData from '../data/calendar/sanctoral-calendar.yml';
interface SaintRecord {
export interface SaintRecord {
id: string;
name: string;
rank: FeastClass;
@@ -38,6 +38,13 @@ export interface SanctoralCandidate {
}
/** Which saint(s) (if any) are assigned to this date. `isoDate`'s year is ignored — the sanctoral cycle repeats every civil year. */
/** The saint's full record — used when something more than id/name/rank is
* needed, e.g. hours/resolve-common.ts's getDayCollect looking up whether
* a real collect has been authored for a winning saint. */
export function getSaintRecord(id: string): SaintRecord | undefined {
return saintsById.get(id);
}
export function getSanctoralCandidatesFor(isoDate: string): SanctoralCandidate[] {
const monthDay = isoDate.slice(5);
const ids = sanctoralCalendar.days[monthDay] ?? [];
+19
View File
@@ -0,0 +1,19 @@
# See terce-antiphons.yml for the full explanation of this table's shape,
# sourcing, and the Friday/Saturday derivation caveat.
sunday:
la: "Allelúja."
en: "Alleluia."
monday:
la: "Fiat manus tua."
en: "Let thy hand be with me to save me."
tuesday: &gradual-none-ant
la: "Beáti omnes."
en: "Blessed are all they."
wednesday: *gradual-none-ant
thursday: *gradual-none-ant
friday:
la: "Si vere útique justítiam loquímini."
en: "If in very deed you speak justice."
saturday:
la: "Dóminus regnávit."
en: "The Lord hath reigned."
+16
View File
@@ -0,0 +1,16 @@
# See terce.yml for the full explanation of this ordo's structure and
# deliberate deviations — None is identical in shape, only its hymn,
# antiphon/psalms, and capitulum differ.
id: none
parts:
- kind: opening-versicle
- kind: hymn
textRef: { source: common, id: none-hymn }
- kind: variable
resolve: by-weekday
- kind: chapter
textRef: { source: common, id: none-capitulum-per-annum }
- kind: day-collect
- kind: preces
textRef: { source: common, id: little-hour-conclusio }
label: Conclusion
+19
View File
@@ -0,0 +1,19 @@
# See terce-antiphons.yml for the full explanation of this table's shape,
# sourcing, and the Friday/Saturday derivation caveat.
sunday:
la: "Allelúja."
en: "Alleluia."
monday:
la: "Áspice in me."
en: "Look upon me."
tuesday: &gradual-sext-ant
la: "Qui hábitas."
en: "Who dwellest."
wednesday: *gradual-sext-ant
thursday: *gradual-sext-ant
friday:
la: "Quid gloriáris in malítia."
en: "Why dost thou glory in malice."
saturday:
la: "Fundaménta ejus in móntibus sanctis."
en: "The foundations thereof are in the holy mountains."
+16
View File
@@ -0,0 +1,16 @@
# See terce.yml for the full explanation of this ordo's structure and
# deliberate deviations — Sext is identical in shape, only its hymn,
# antiphon/psalms, and capitulum differ.
id: sext
parts:
- kind: opening-versicle
- kind: hymn
textRef: { source: common, id: sext-hymn }
- kind: variable
resolve: by-weekday
- kind: chapter
textRef: { source: common, id: sext-capitulum-per-annum }
- kind: day-collect
- kind: preces
textRef: { source: common, id: little-hour-conclusio }
label: Conclusion
+38
View File
@@ -0,0 +1,38 @@
# One antiphon per weekday, framing that day's whole psalm group (see
# hours/terce.ts and psalter/distribution.ts's 'terce' table) — same shape
# and convention as data/hours/prime-antiphons.yml (inline text, no
# separate common-propers id, incipit/full split via an embedded "*" where
# the source has one). None of these happen to have a "*" — each is a
# short single-clause antiphon and splitAntiphon() already degrades
# gracefully (incipit == full) when there isn't one.
#
# Verified against Divinum Officium (Monastic Tridentinum 1617):
# - sunday/monday/tuesday: clean per-annum runs with no sanctoral
# override (2026-08-09 Sun, 2026-08-31 Mon, 2026-10-13 Tue).
# - wednesday/thursday: share Tuesday's antiphon — same native psalms
# (119-121), confirmed identical across all three.
# - friday/saturday: these two days' psalms were editorially
# redistributed (see psalter-distribution.yml's long comment on
# 'terce'), so there's no real historical antiphon for this specific
# grouping. Per explicit decision, each is instead derived from the
# opening phrase of that day's first psalm (Ps 41 for Friday, Ps 69 for
# Saturday) — editorial, not independently verified against the
# reference engine as a real antiphon, same caveat as the
# redistribution itself.
sunday:
la: "Allelúja."
en: "Alleluia."
monday:
la: "Ádjuva me."
en: "Help me."
tuesday: &gradual-terce-ant
la: "Clamávi."
en: "I cried unto the Lord."
wednesday: *gradual-terce-ant
thursday: *gradual-terce-ant
friday:
la: "Quemádmodum desíderat cervus."
en: "As the hart panteth."
saturday:
la: "Deus, in adjutórium meum inténde."
en: "O God, come to my assistance."
+29
View File
@@ -0,0 +1,29 @@
# Ordo verified against Divinum Officium (Monastic Tridentinum 1617), clean
# per-annum runs with no sanctoral override (2026-08-09 Sun, 2026-08-31 Mon,
# 2026-10-13 Tue) — see src/hours/terce.ts for how each part resolves.
#
# Deliberately deviates from that verified source in one place, matching
# Prime's own precedent: the opening Pater/Ave (said silently before "Deus
# in adjutórium") is dropped, to keep the hour shorter.
#
# Real structure, confirmed directly against the engine: opening versicle,
# hymn (self-contained, no seasonal doxology swap — see terce-hymn.yml),
# one antiphon framing all three psalms, capitulum with its own embedded
# short versicle/response (*not* a separate elaborate responsory the way
# Prime's chapter-responsory.ts adds one — Monastic Terce doesn't have
# one), the day's own collect, and a closing that's identical across all
# three Little Hours (see little-hour-conclusio.yml). No Preces, no Creed —
# real Monastic Terce/Sext/None have neither.
id: terce
parts:
- kind: opening-versicle
- kind: hymn
textRef: { source: common, id: terce-hymn }
- kind: variable
resolve: by-weekday
- kind: chapter
textRef: { source: common, id: terce-capitulum-per-annum }
- kind: day-collect
- kind: preces
textRef: { source: common, id: little-hour-conclusio }
label: Conclusion
@@ -0,0 +1,23 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), clean
# per-annum run (2026-08-31) — identical across Terce, Sext, and None
# (confirmed by comparing all three directly), unlike Prime's/Compline's
# own distinct conclusios.
id: little-hour-conclusio
text:
la: |
V. Dómine, exáudi oratiónem meam.
R. Et clamor meus ad te véniat.
V. Benedicámus Dómino.
R. Deo grátias.
V. Fidélium ánimæ per misericórdiam Dei requiéscant in pace.
R. Amen.
en: |
V. O Lord, hear my prayer.
R. And let my cry come unto thee.
V. Let us bless the Lord.
R. Thanks be to God.
V. May the souls of the faithful, through the mercy of God, rest in peace.
R. Amen.
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), clean
# per-annum run (2026-08-31). See terce-capitulum-per-annum.yml for the
# combined-block structure note and the deferred-seasonal-variant caveat.
id: none-capitulum-per-annum
text:
la: "Empti enim estis prétio magno. Glorificáte et portáte Deum in córpore vestro. R. Deo grátias. V. Ab occúltis meis munda me, Dómine. R. Et ab aliénis parce servo tuo."
en: "For you are bought with a great price. Glorify and bear God in your body. R. Thanks be to God. V. From my secret ones cleanse me, O Lord. R. And from those of others spare thy servant."
citation:
la: "1 Cor. 6:20"
en: "1 Cor. 6:20"
status:
la: verified
en: verified
+43
View File
@@ -0,0 +1,43 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617). Fixed
# hymn for None, invariant by season (per explicit user direction) — the
# whole text including its own final doxology stanza is self-contained,
# not run through hymn-doxology.ts the way Prime's/Compline's hymns are.
# Same Latin doxology as Terce/Sext ("Praesta, Pater piissime...") but a
# distinct English translation, matching this hymn's own different meter.
id: none-hymn
text:
la: |
Rerum, Deus, tenax vigor,
Immótus in te pérmanens,
Lucis diúrnæ témpora
Succéssibus detérminans:
Largíre clarum véspere,
Quo vita nusquam décidat,
Sed prǽmium mortis sacræ
Perénnis instet glória.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O strength and stay upholding all creation,
Who ever dost thyself unmoved abide,
Yet day by day the light in due gradation
From hour to hour through all its changes guide:
Grant to life's day a calm unclouded ending,
An eve untouched by shadows of decay,
The brightness of a holy death-bed blending
With dawning glories of th' eternal day.
Hear us, O Father, gracious and forgiving,
And thou, O Christ, the co-eternal Word,
Who, with the Holy Ghost, by all things living
Now and to endless ages art adored.
Amen.
status:
la: verified
en: verified
@@ -0,0 +1,13 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), clean
# per-annum run (2026-08-31). See terce-capitulum-per-annum.yml for the
# combined-block structure note and the deferred-seasonal-variant caveat.
id: sext-capitulum-per-annum
text:
la: "Alter altérius ónera portáte, et sic adimplébitis legem Christi. R. Deo grátias. V. Dóminus regit me, et nihil mihi déerit. R. In loco páscuæ ibi me collocávit."
en: "Bear ye one another's burdens; and so you shall fulfill the law of Christ. R. Thanks be to God. V. The Lord ruleth me: and I shall want nothing. R. He hath set me in a place of pasture."
citation:
la: "Gal. 6:2"
en: "Gal. 6:2"
status:
la: verified
en: verified
+41
View File
@@ -0,0 +1,41 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617). Fixed
# hymn for Sext, invariant by season (per explicit user direction) — the
# whole text including its own final doxology stanza is self-contained,
# not run through hymn-doxology.ts the way Prime's/Compline's hymns are.
id: sext-hymn
text:
la: |
Rector potens, verax Deus,
Qui témperas rerum vices,
Splendóre mane ínstruis,
Et ígnibus merídiem:
Exstíngue flammas lítium,
Aufer calórem nóxium,
Confer salútem córporum,
Verámque pacem córdium.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
O God of truth, O Lord of might,
Who orderest time and change aright,
Who send'st the early morning ray,
And light'st the glow of perfect day:
Extinguish thou each sinful fire,
And banish every ill desire;
And while thou keep'st the body whole,
Shed forth thy peace upon the soul.
Almighty Father, hear our cry,
Through Jesus Christ, our Lord most High,
Who, with the Holy Ghost and thee,
Doth live and reign eternally.
Amen.
status:
la: verified
en: verified
@@ -0,0 +1,20 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617), clean
# per-annum runs (2026-08-31, a Monday with no sanctoral override — see
# hours/terce.ts). "Capitulum Versus" in the source is one combined block:
# the chapter, then R. Deo grátias, then a short versicle/response pair —
# unlike Prime, the Little Hours have no separate elaborate short
# responsory, so all of that is kept together here as one 'chapter' part.
#
# Per-annum only for now — real practice varies this by season (confirmed
# by comparing against a Lenten Ember Wednesday run, which showed different
# capitulum text entirely), but that seasonal table isn't built yet.
id: terce-capitulum-per-annum
text:
la: "Sana me, Dómine, et sanábor: salvum me fac, et salvus ero: quóniam laus mea tu es. R. Deo grátias. V. Adjútor meus, esto, ne derelínquas me. R. Neque despícias me, Deus, salutáris meus."
en: "Heal me, O Lord, and I shall be healed: save me, and I shall be saved, for thou art my praise. R. Thanks be to God. V. Be thou my helper, forsake me not. R. Do not thou despise me, O God my Saviour."
citation:
la: "Jer. 17:14"
en: "Jer. 17:14"
status:
la: verified
en: verified
+41
View File
@@ -0,0 +1,41 @@
# Verified against Divinum Officium (Monastic Tridentinum 1617). Fixed
# hymn for Terce, invariant by season (per explicit user direction) — the
# whole text including its own final doxology stanza is self-contained,
# not run through hymn-doxology.ts the way Prime's/Compline's hymns are.
id: terce-hymn
text:
la: |
Nunc, Sancte, nobis, Spíritus,
Unum Patri cum Fílio,
Dignáre promptus íngeri
Nostro refúsus péctori.
Os, lingua, mens, sensus, vigor
Confessiónem pérsonent.
Flamméscat igne cáritas,
Accéndat ardor próximos.
Præsta, Pater piíssime,
Patríque compar Únice,
Cum Spíritu Paráclito
Regnans per omne sǽculum.
Amen.
en: |
Come Holy Ghost who ever One
Art with the Father and the Son,
It is the hour, our souls possess
With thy full flood of holiness.
Let flesh and heart and lips and mind
Sound forth our witness to mankind;
And love light up our mortal frame,
Till others catch the living flame.
Almighty Father, hear our cry,
Through Jesus Christ, our Lord most High,
Who, with the Holy Ghost and thee,
Doth live and reign eternally.
Amen.
status:
la: verified
en: verified
+82
View File
@@ -0,0 +1,82 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 41
verses:
- n: 2
text:
la: "Quemádmodum desíderat cervus ad fontes aquárum: * ita desíderat ánima mea ad te, Deus."
en: "As the hart panteth after the fountains of water; * so my soul panteth after thee, O God."
status:
la: verified
en: verified
- n: 3
text:
la: "Sitívit ánima mea ad Deum fortem vivum: * quando véniam, et apparébo ante fáciem Dei?"
en: "My soul hath thirsted after the strong living God; * when shall I come and appear before the face of God?"
status:
la: verified
en: verified
- n: 4
text:
la: "Fuérunt mihi lácrimæ meæ panes die ac nocte: * dum dícitur mihi quotídie: Ubi est Deus tuus?"
en: "My tears have been my bread day and night, * whilst it is said to me daily: Where is thy God?"
status:
la: verified
en: verified
- n: 5
text:
la: "In voce exsultatiónis, et confessiónis: * sonus epulántis."
en: "With the voice of joy and praise; * the noise of one feasting."
status:
la: verified
en: verified
- n: 6
text:
la: "Spera in Deo, quóniam adhuc confitébor illi: * salutáre vultus mei, et Deus meus."
en: "Hope in God, for I will still give praise to him: * the salvation of my countenance, and my God."
status:
la: verified
en: verified
- n: 7
text:
la: "Ad meípsum ánima mea conturbáta est: * proptérea memor ero tui de terra Jordánis, et Hermóniim a monte módico."
en: "My soul is troubled within myself: * therefore will I remember thee from the land of Jordan and Hermoniim, from the little hill."
status:
la: verified
en: verified
- n: 8
text:
la: "Ómnia excélsa tua, et fluctus tui * super me transiérunt."
en: "All thy heights and thy billows * have passed over me."
status:
la: verified
en: verified
- n: 9
text:
la: "Apud me orátio Deo vitæ meæ, * dicam Deo: Suscéptor meus es."
en: "With me is prayer to the God of my life. * I will say to God: Thou art my support."
status:
la: verified
en: verified
- n: 10
text:
la: "Quare oblítus es mei? * et quare contristátus incédo, dum afflígit me inimícus?"
en: "Why hast thou forgotten me? * and why go I mourning, whilst my enemy afflicteth me?"
status:
la: verified
en: verified
- n: 11
text:
la: "Dum dicunt mihi per síngulos dies: Ubi est Deus tuus? * quare tristis es, ánima mea? et quare contúrbas me?"
en: "Whilst they say to me day by day: Where is thy God? * Why art thou cast down, O my soul? and why dost thou disquiet me?"
status:
la: verified
en: verified
- n: 12
text:
la: "Spera in Deo, quóniam adhuc confitébor illi: * salutáre vultus mei, et Deus meus."
en: "Hope thou in God, for I will still give praise to him: * the salvation of my countenance, and my God."
status:
la: verified
en: verified
+82
View File
@@ -0,0 +1,82 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 45
verses:
- n: 2
text:
la: "Deus noster refúgium, et virtus: * adjútor in tribulatiónibus, quæ invenérunt nos nimis."
en: "Our God is our refuge and strength: * a helper in troubles, which have found us exceedingly."
status:
la: verified
en: verified
- n: 3
text:
la: "Proptérea non timébimus dum turbábitur terra: * et transferéntur montes in cor maris."
en: "Therefore we will not fear, when the earth shall be troubled; * and the mountains shall be removed into the heart of the sea."
status:
la: verified
en: verified
- n: 4
text:
la: "Sonuérunt, et turbátæ sunt aquæ eórum: * conturbáti sunt montes in fortitúdine ejus."
en: "Their waters roared and were troubled: * the mountains were troubled with his strength."
status:
la: verified
en: verified
- n: 5
text:
la: "Flúminis ímpetus lætíficat civitátem Dei: * sanctificávit tabernáculum suum Altíssimus."
en: "The stream of the river maketh the city of God joyful: * the most High hath sanctified his own tabernacle."
status:
la: verified
en: verified
- n: 6
text:
la: "Deus in médio ejus, non commovébitur: * adjuvábit eam Deus mane dilúculo."
en: "God is in the midst thereof, it shall not be moved: * God will help it in the morning early."
status:
la: verified
en: verified
- n: 7
text:
la: "Conturbátæ sunt gentes, et inclináta sunt regna: * dedit vocem suam, mota est terra."
en: "Nations were troubled, and kingdoms were bowed down: * he uttered his voice, the earth trembled."
status:
la: verified
en: verified
- n: 8
text:
la: "Dóminus virtútum nobíscum: * suscéptor noster Deus Jacob."
en: "The Lord of armies is with us: * the God of Jacob is our protector."
status:
la: verified
en: verified
- n: 9
text:
la: "Veníte, et vidéte ópera Dómini, quæ pósuit prodígia super terram: * áuferens bella usque ad finem terræ."
en: "Come and behold ye the works of the Lord: what wonders he hath done upon earth, * making wars to cease even to the end of the earth."
status:
la: verified
en: verified
- n: 10
text:
la: "Arcum cónteret, et confrínget arma: * et scuta combúret igni."
en: "He shall destroy the bow, and break the weapons: * and the shield he shall burn in the fire."
status:
la: verified
en: verified
- n: 11
text:
la: "Vacáte, et vidéte quóniam ego sum Deus: * exaltábor in géntibus, et exaltábor in terra."
en: "Be still and see that I am God; * I will be exalted among the nations, and I will be exalted in the earth."
status:
la: verified
en: verified
- n: 12
text:
la: "Dóminus virtútum nobíscum: * suscéptor noster Deus Jacob."
en: "The Lord of armies is with us: * the God of Jacob is our protector."
status:
la: verified
en: verified
+68
View File
@@ -0,0 +1,68 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 46
verses:
- n: 2
text:
la: "Omnes gentes, pláudite mánibus: * jubiláte Deo in voce exsultatiónis."
en: "O clap your hands, all ye nations: * shout unto God with the voice of joy,"
status:
la: verified
en: verified
- n: 3
text:
la: "Quóniam Dóminus excélsus, terríbilis: * Rex magnus super omnem terram."
en: "For the Lord is high, terrible: * a great king over all the earth."
status:
la: verified
en: verified
- n: 4
text:
la: "Subjécit pópulos nobis: * et gentes sub pédibus nostris."
en: "He hath subdued the people under us; * and the nations under our feet."
status:
la: verified
en: verified
- n: 5
text:
la: "Elégit nobis hereditátem suam: * spéciem Jacob, quam diléxit."
en: "He hath chosen for us his inheritance, * the beauty of Jacob which he hath loved."
status:
la: verified
en: verified
- n: 6
text:
la: "Ascéndit Deus in júbilo: * et Dóminus in voce tubæ."
en: "God is ascended with jubilee, * and the Lord with the sound of trumpet."
status:
la: verified
en: verified
- n: 7
text:
la: "Psállite Deo nostro, psállite: * psállite Regi nostro, psállite."
en: "Sing praises to our God, sing ye: * sing praises to our king, sing ye."
status:
la: verified
en: verified
- n: 8
text:
la: "Quóniam Rex omnis terræ Deus: * psállite sapiénter."
en: "For God is the king of all the earth: * sing ye wisely."
status:
la: verified
en: verified
- n: 9
text:
la: "Regnábit Deus super gentes: * Deus sedet super sedem sanctam suam."
en: "God shall reign over the nations: * God sitteth on his holy throne."
status:
la: verified
en: verified
- n: 10
text:
la: "Príncipes populórum congregáti sunt cum Deo Ábraham: * quóniam dii fortes terræ veheménter eleváti sunt."
en: "The princes of the people are gathered together, with the God of Abraham: * for the strong gods of the earth are exceedingly exalted."
status:
la: verified
en: verified
+68
View File
@@ -0,0 +1,68 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 51
verses:
- n: 3
text:
la: "Quid gloriáris in malítia, * qui potens es in iniquitáte?"
en: "Why dost thou glory in malice, * thou that art mighty in iniquity?"
status:
la: verified
en: verified
- n: 4
text:
la: "Tota die injustítiam cogitávit lingua tua: * sicut novácula acúta fecísti dolum."
en: "All the day long thy tongue hath devised injustice: * as a sharp razor, thou hast wrought deceit."
status:
la: verified
en: verified
- n: 5
text:
la: "Dilexísti malítiam super benignitátem: * iniquitátem magis quam loqui æquitátem."
en: "Thou hast loved malice more than goodness: * and iniquity rather than to speak righteousness."
status:
la: verified
en: verified
- n: 6
text:
la: "Dilexísti ómnia verba præcipitatiónis, * lingua dolósa."
en: "Thou hast loved all the words of ruin, * O deceitful tongue."
status:
la: verified
en: verified
- n: 7
text:
la: "Proptérea Deus déstruet te in finem, * evéllet te, et emigrábit te de tabernáculo tuo: et radícem tuam de terra vivéntium."
en: "Therefore will God destroy thee for ever: * he will pluck thee out, and remove thee from thy dwelling place: and thy root out of the land of the living."
status:
la: verified
en: verified
- n: 8
text:
la: "Vidébunt justi, et timébunt, et super eum ridébunt, et dicent: * Ecce homo, qui non pósuit Deum adjutórem suum:"
en: "The just shall see and fear, and shall laugh at him, and say: * Behold the man that made not God his helper:"
status:
la: verified
en: verified
- n: 9
text:
la: "Sed sperávit in multitúdine divitiárum suárum: * et præváluit in vanitáte sua."
en: "But trusted in the abundance of his riches: * and prevailed in his vanity."
status:
la: verified
en: verified
- n: 10
text:
la: "Ego autem, sicut olíva fructífera in domo Dei, * sperávi in misericórdia Dei in ætérnum: et in sǽculum sǽculi."
en: "But I, as a fruitful olive tree in the house of God, * have hoped in the mercy of God for ever, yea for ever and ever."
status:
la: verified
en: verified
- n: 11
text:
la: "Confitébor tibi in sǽculum, quia fecísti: * et exspectábo nomen tuum, quóniam bonum est in conspéctu sanctórum tuórum."
en: "I will praise thee for ever, because thou hast done it: * and I will wait on thy name, for it is good in the sight of thy saints."
status:
la: verified
en: verified
+54
View File
@@ -0,0 +1,54 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 52
verses:
- n: 1
text:
la: "Dixit insípiens in corde suo: * Non est Deus."
en: "The fool said in his heart: * There is no God."
status:
la: verified
en: verified
- n: 2
text:
la: "Corrúpti sunt, et abominábiles facti sunt in iniquitátibus: * non est qui fáciat bonum."
en: "They are corrupted, and become abominable in iniquities: * there is none that doth good."
status:
la: verified
en: verified
- n: 3
text:
la: "Deus de cælo prospéxit super fílios hóminum: * ut vídeat si est intéllegens, aut requírens Deum."
en: "God looked down from heaven on the children of men: * to see if there were any that did understand, or did seek God."
status:
la: verified
en: verified
- n: 4
text:
la: "Omnes declinavérunt, simul inútiles facti sunt: * non est qui fáciat bonum, non est usque ad unum."
en: "All have gone aside, they are become unprofitable together, * there is none that doth good, no not one."
status:
la: verified
en: verified
- n: 5
text:
la: "Nonne scient omnes qui operántur iniquitátem, * qui dévorant plebem meam ut cibum panis?"
en: "Shall not all the workers of iniquity know, * who eat up my people as they eat bread?"
status:
la: verified
en: verified
- n: 6
text:
la: "Quóniam Deus dissipávit ossa eórum qui homínibus placent: * confúsi sunt, quóniam Deus sprevit eos."
en: "For God hath scattered the bones of them that please men: * they have been confounded, because God hath despised them."
status:
la: verified
en: verified
- n: 7
text:
la: "Quis dabit ex Sion salutáre Israël? * cum convérterit Deus captivitátem plebis suæ, exsultábit Jacob, et lætábitur Israël."
en: "Who will give out of Sion the salvation of Israel? * when God shall bring back the captivity of his people, Jacob shall rejoice, and Israel shall be glad."
status:
la: verified
en: verified
+54
View File
@@ -0,0 +1,54 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 53
verses:
- n: 3
text:
la: "Deus, in nómine tuo salvum me fac: * et in virtúte tua júdica me."
en: "Save me, O God, by thy name, * and judge me in thy strength."
status:
la: verified
en: verified
- n: 4
text:
la: "Deus, exáudi oratiónem meam: * áuribus pércipe verba oris mei."
en: "O God, hear my prayer: * give ear to the words of my mouth."
status:
la: verified
en: verified
- n: 5
text:
la: "Quóniam aliéni insurrexérunt advérsum me, et fortes quæsiérunt ánimam meam: * et non proposuérunt Deum ante conspéctum suum."
en: "For strangers have risen up against me; and the mighty have sought after my soul: * and they have not set God before their eyes."
status:
la: verified
en: verified
- n: 6
text:
la: "Ecce enim, Deus ádjuvat me: * et Dóminus suscéptor est ánimæ meæ."
en: "For behold God is my helper: * and the Lord is the protector of my soul."
status:
la: verified
en: verified
- n: 7
text:
la: "Avérte mala inimícis meis: * et in veritáte tua dispérde illos."
en: "Turn back the evils upon my enemies; * and cut them off in thy truth."
status:
la: verified
en: verified
- n: 8
text:
la: "Voluntárie sacrificábo tibi, * et confitébor nómini tuo, Dómine: quóniam bonum est:"
en: "I will freely sacrifice to thee, * and will give praise, O God, to thy name: because it is good:"
status:
la: verified
en: verified
- n: 9
text:
la: "Quóniam ex omni tribulatióne eripuísti me: * et super inimícos meos despéxit óculus meus."
en: "For thou hast delivered me out of all trouble: * and my eye hath looked down upon my enemies."
status:
la: verified
en: verified
+82
View File
@@ -0,0 +1,82 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 57
verses:
- n: 2
text:
la: "Si vere útique justítiam loquímini: * recta judicáte, fílii hóminum."
en: "If in very deed you speak justice: * judge right things, ye sons of men."
status:
la: verified
en: verified
- n: 3
text:
la: "Étenim in corde iniquitátes operámini: * in terra injustítias manus vestræ concínnant."
en: "For in your heart you work iniquity: * your hands forge injustice in the earth."
status:
la: verified
en: verified
- n: 4
text:
la: "Alienáti sunt peccatóres a vulva, erravérunt ab útero: * locúti sunt falsa."
en: "The wicked are alienated from the womb; they have gone astray from the womb: * they have spoken false things."
status:
la: verified
en: verified
- n: 5
text:
la: "Furor illis secúndum similitúdinem serpéntis: * sicut áspidis surdæ, et obturántis aures suas,"
en: "Their madness is according to the likeness of a serpent: * like the deaf asp that stoppeth her ears:"
status:
la: verified
en: verified
- n: 6
text:
la: "Quæ non exáudiet vocem incantántium: * et venéfici incantántis sapiénter."
en: "Which will not hear the voice of the charmers; * nor of the wizard that charmeth wisely."
status:
la: verified
en: verified
- n: 7
text:
la: "Deus cónteret dentes eórum in ore ipsórum: * molas leónum confrínget Dóminus."
en: "God shall break in pieces their teeth in their mouth: * the Lord shall break the grinders of the lions."
status:
la: verified
en: verified
- n: 8
text:
la: "Ad níhilum devénient tamquam aqua decúrrens: * inténdit arcum suum donec infirméntur."
en: "They shall come to nothing, like water running down; * he hath bent his bow till they be weakened."
status:
la: verified
en: verified
- n: 9
text:
la: "Sicut cera, quæ fluit, auferéntur: * supercécidit ignis, et non vidérunt solem."
en: "Like wax that melteth they shall be taken away: * fire hath fallen on them, and they shall not see the sun."
status:
la: verified
en: verified
- n: 10
text:
la: "Priúsquam intellégerent spinæ vestræ rhamnum: * sicut vivéntes, sic in ira absórbet eos."
en: "Before your thorns could know the brier; he swalloweth them up, * as alive, in his wrath."
status:
la: verified
en: verified
- n: 11
text:
la: "Lætábitur justus cum víderit vindíctam: * manus suas lavábit in sánguine peccatóris."
en: "The just shall rejoice when he shall see the revenge: * he shall wash his hands in the blood of the sinner."
status:
la: verified
en: verified
- n: 12
text:
la: "Et dicet homo: Si útique est fructus justo: * útique est Deus júdicans eos in terra."
en: "And man shall say: If indeed there be fruit to the just: * there is indeed a God that judgeth them on the earth."
status:
la: verified
en: verified
+61
View File
@@ -0,0 +1,61 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 60
verses:
- n: 2
text:
la: "Exáudi, Deus, deprecatiónem meam: * inténde oratióni meæ."
en: "Hear, O God, my supplication: * be attentive to my prayer."
status:
la: verified
en: verified
- n: 3
text:
la: "A fínibus terræ ad te clamávi: * dum anxiarétur cor meum, in petra exaltásti me."
en: "To thee have I cried from the ends of the earth: * when my heart was in anguish, thou hast exalted me on a rock."
status:
la: verified
en: verified
- n: 4
text:
la: "Deduxísti me, quia factus es spes mea: * turris fortitúdinis a fácie inimíci."
en: "Thou hast conducted me; for thou hast been my hope: * a tower of strength against the face of the enemy."
status:
la: verified
en: verified
- n: 5
text:
la: "Inhabitábo in tabernáculo tuo in sǽcula: * prótegar in velaménto alárum tuárum."
en: "In thy tabernacle I shall dwell for ever: * I shall be protected under the covert of thy wings."
status:
la: verified
en: verified
- n: 6
text:
la: "Quóniam tu, Deus meus, exaudísti oratiónem meam: * dedísti hereditátem timéntibus nomen tuum."
en: "For thou, my God, hast heard my prayer: * thou hast given an inheritance to them that fear thy name."
status:
la: verified
en: verified
- n: 7
text:
la: "Dies super dies regis adícies: * annos ejus usque in diem generatiónis et generatiónis."
en: "Thou wilt add days to the days of the king: * his years even to generation and generation."
status:
la: verified
en: verified
- n: 8
text:
la: "Pérmanet in ætérnum in conspéctu Dei: * misericórdiam et veritátem ejus quis requíret?"
en: "He abideth for ever in the sight of God: * his mercy and truth who shall search?"
status:
la: verified
en: verified
- n: 9
text:
la: "Sic psalmum dicam nómini tuo in sǽculum sǽculi: * ut reddam vota mea de die in diem."
en: "So will I sing a psalm to thy name for ever and ever: * that I may pay my vows from day to day."
status:
la: verified
en: verified
+82
View File
@@ -0,0 +1,82 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 61
verses:
- n: 2
text:
la: "Nonne Deo subjécta erit ánima mea? * ab ipso enim salutáre meum."
en: "Shall not my soul be subject to God? * for from him is my salvation."
status:
la: verified
en: verified
- n: 3
text:
la: "Nam et ipse Deus meus, et salutáris meus: * suscéptor meus, non movébor ámplius."
en: "For he is my God and my saviour: * he is my protector, I shall be moved no more."
status:
la: verified
en: verified
- n: 4
text:
la: "Quoúsque irrúitis in hóminem? * interfícitis univérsi vos: tamquam paríeti inclináto et macériæ depúlsæ?"
en: "How long do you rush in upon a man? * you all kill, as if you were thrusting down a leaning wall, and a tottering fence."
status:
la: verified
en: verified
- n: 5
text:
la: "Verúmtamen prétium meum cogitavérunt repéllere, cucúrri in siti: * ore suo benedicébant, et corde suo maledicébant."
en: "But they have thought to cast away my price; I ran in thirst: * they blessed with their mouth, but cursed with their heart."
status:
la: verified
en: verified
- n: 6
text:
la: "Verúmtamen Deo subjécta esto, ánima mea: * quóniam ab ipso patiéntia mea."
en: "But be thou, O my soul, subject to God: * for from him is my patience."
status:
la: verified
en: verified
- n: 7
text:
la: "Quia ipse Deus meus, et salvátor meus: * adjútor meus, non emigrábo."
en: "For he is my God and my saviour: * he is my helper, I shall not be moved."
status:
la: verified
en: verified
- n: 8
text:
la: "In Deo salutáre meum, et glória mea: * Deus auxílii mei, et spes mea in Deo est."
en: "In God is my salvation and my glory: * he is the God of my help, and my hope is in God."
status:
la: verified
en: verified
- n: 9
text:
la: "Speráte in eo omnis congregátio pópuli, effúndite coram illo corda vestra: * Deus adjútor noster in ætérnum."
en: "Trust in him, all ye congregation of people: pour out your hearts before him. * God is our helper for ever."
status:
la: verified
en: verified
- n: 10
text:
la: "Verúmtamen vani fílii hóminum, mendáces fílii hóminum in statéris: * ut decípiant ipsi de vanitáte in idípsum."
en: "But vain are the sons of men, the sons of men are liars in the balances: * that by vanity they may together deceive."
status:
la: verified
en: verified
- n: 11
text:
la: "Nolíte speráre in iniquitáte, et rapínas nolíte concupíscere: * divítiæ si áffluant, nolíte cor appónere."
en: "Trust not in iniquity, and cover not robberies: * if riches abound, set not your heart upon them."
status:
la: verified
en: verified
- n: 12
text:
la: "Semel locútus est Deus, duo hæc audívi, quia potéstas Dei est, et tibi, Dómine, misericórdia: * quia tu reddes unicuíque juxta ópera sua."
en: "God hath spoken once, these two things have I heard, that power belongeth to God, and mercy to thee, O Lord; * for thou wilt render to every man according to his works."
status:
la: verified
en: verified
+40
View File
@@ -0,0 +1,40 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 69
verses:
- n: 2
text:
la: "Deus, in adjutórium meum inténde: * Dómine, ad adjuvándum me festína."
en: "O God, come to my assistance; * O Lord, make haste to help me."
status:
la: verified
en: verified
- n: 3
text:
la: "Confundántur et revereántur, * qui quærunt ánimam meam."
en: "Let them be confounded and ashamed * that seek my soul:"
status:
la: verified
en: verified
- n: 4
text:
la: "Avertántur statim erubescéntes, * qui dicunt mihi: Euge, euge."
en: "Let them be presently turned away blushing for shame * that say to me: T is well, t is well."
status:
la: verified
en: verified
- n: 5
text:
la: "Exsúltent et læténtur in te omnes qui quærunt te, * et dicant semper: Magnificétur Dóminus: qui díligunt salutáre tuum."
en: "Let all that seek thee rejoice and be glad in thee; * and let such as love thy salvation say always: The Lord be magnified."
status:
la: verified
en: verified
- n: 6
text:
la: "Adjútor meus, et liberátor meus es tu: * Dómine, ne moréris."
en: "Thou art my helper and my deliverer: * O Lord, make no delay."
status:
la: verified
en: verified
+75
View File
@@ -0,0 +1,75 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 74
verses:
- n: 2
text:
la: "Confitébimur tibi, Deus: * confitébimur, et invocábimus nomen tuum."
en: "We will praise thee, O God: * we will praise, and we will call upon thy name."
status:
la: verified
en: verified
- n: 3
text:
la: "Narrábimus mirabília tua: * cum accépero tempus, ego justítias judicábo."
en: "We will relate thy wondrous works: * when I shall take a time, I will judge justices."
status:
la: verified
en: verified
- n: 4
text:
la: "Liquefácta est terra, et omnes qui hábitant in ea: * ego confirmávi colúmnas ejus."
en: "The earth is melted, and all that dwell therein: * I have established the pillars thereof."
status:
la: verified
en: verified
- n: 5
text:
la: "Dixi iníquis: Nolíte iníque ágere: * et delinquéntibus: Nolíte exaltáre cornu:"
en: "I said to the wicked: Do not act wickedly: * and to the sinners: Lift not up the horn."
status:
la: verified
en: verified
- n: 6
text:
la: "Nolíte extóllere in altum cornu vestrum: * nolíte loqui advérsus Deum iniquitátem."
en: "Lift not up your horn on high: * speak not iniquity against God."
status:
la: verified
en: verified
- n: 7
text:
la: "Quia neque ab Oriénte, neque ab Occidénte, neque a desértis móntibus: * quóniam Deus judex est."
en: "For neither from the east, nor from the west, nor from the desert hills: * for God is the judge."
status:
la: verified
en: verified
- n: 8
text:
la: "Hunc humíliat, et hunc exáltat: * quia calix in manu Dómini vini meri plenus misto."
en: "One he putteth down, and another he lifteth up: * for in the hand of the Lord there is a cup of strong wine full of mixture."
status:
la: verified
en: verified
- n: 9
text:
la: "Et inclinávit ex hoc in hoc: verúmtamen fæx ejus non est exinaníta: * bibent omnes peccatóres terræ."
en: "And he hath poured it out from this to that: but the dregs thereof are not emptied: * all the sinners of the earth shall drink."
status:
la: verified
en: verified
- n: 10
text:
la: "Ego autem annuntiábo in sǽculum: * cantábo Deo Jacob."
en: "But I will declare for ever: * I will sing to the God of Jacob."
status:
la: verified
en: verified
- n: 11
text:
la: "Et ómnia córnua peccatórum confríngam: * et exaltabúntur córnua justi."
en: "And I will break all the horns of sinners: * but the horns of the just shall be exalted."
status:
la: verified
en: verified
+61
View File
@@ -0,0 +1,61 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 81
verses:
- n: 1
text:
la: "Deus stetit in synagóga deórum: * in médio autem deos dijúdicat."
en: "God hath stood in the congregation of gods: * and being in the midst of them he judgeth gods."
status:
la: verified
en: verified
- n: 2
text:
la: "Úsquequo judicátis iniquitátem: * et fácies peccatórum súmitis?"
en: "How long will you judge unjustly: * and accept the persons of the wicked?"
status:
la: verified
en: verified
- n: 3
text:
la: "Judicáte egéno, et pupíllo: * húmilem, et páuperem justificáte."
en: "Judge for the needy and fatherless: * do justice to the humble and the poor."
status:
la: verified
en: verified
- n: 4
text:
la: "Erípite páuperem: * et egénum de manu peccatóris liberáte."
en: "Rescue the poor; * and deliver the needy out of the hand of the sinner."
status:
la: verified
en: verified
- n: 5
text:
la: "Nesciérunt, neque intellexérunt, in ténebris ámbulant: * movebúntur ómnia fundaménta terræ."
en: "They have not known nor understood: they walk on in darkness: * all the foundations of the earth shall be moved."
status:
la: verified
en: verified
- n: 6
text:
la: "Ego dixi: Dii estis, * et fílii Excélsi omnes."
en: "I have said: You are gods * and all of you the sons of the most High."
status:
la: verified
en: verified
- n: 7
text:
la: "Vos autem sicut hómines moriémini: * et sicut unus de princípibus cadétis."
en: "But you like men shall die: * and shall fall like one of the princes."
status:
la: verified
en: verified
- n: 8
text:
la: "Surge, Deus, júdica terram: * quóniam tu hereditábis in ómnibus géntibus."
en: "Arise, O God, judge thou the earth: * for thou shalt inherit among all the nations."
status:
la: verified
en: verified
+47
View File
@@ -0,0 +1,47 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 86
verses:
- n: 1
text:
la: "Fundaménta ejus in móntibus sanctis: * díligit Dóminus portas Sion super ómnia tabernácula Jacob."
en: "The foundations thereof are in the holy mountains: * The Lord loveth the gates of Sion above all the tabernacles of Jacob."
status:
la: verified
en: verified
- n: 3
text:
la: "Gloriósa dicta sunt de te, * cívitas Dei."
en: "Glorious things are said of thee, * O city of God."
status:
la: verified
en: verified
- n: 4
text:
la: "Ecce, alienígenæ, et Tyrus, et pópulus Æthíopum, * hi fuérunt illic."
en: "Behold the foreigners, and Tyre, and the people of the Ethiopians, * these were there."
status:
la: verified
en: verified
- n: 5
text:
la: "Numquid Sion dicet: Homo, et homo natus est in ea: * et ipse fundávit eam Altíssimus?"
en: "Shall not Sion say: This man and that man is born in her? * and the Highest himself hath founded her."
status:
la: verified
en: verified
- n: 6
text:
la: "Dóminus narrábit in scriptúris populórum, et príncipum: * horum, qui fuérunt in ea."
en: "The Lord shall tell in his writings of peoples and of princes, * of them that have been in her."
status:
la: verified
en: verified
- n: 7
text:
la: "Sicut lætántium ómnium * habitátio est in te."
en: "The dwelling in thee * is as it were of all rejoicing."
status:
la: verified
en: verified
+40
View File
@@ -0,0 +1,40 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 92
verses:
- n: 1
text:
la: "Étenim firmávit orbem terræ, * qui non commovébitur."
en: "For he hath established the world * which shall not be moved."
status:
la: verified
en: verified
- n: 2
text:
la: "Paráta sedes tua ex tunc: * a sǽculo tu es."
en: "Thy throne is prepared from of old: * thou art from everlasting."
status:
la: verified
en: verified
- n: 3
text:
la: "Elevavérunt flúmina fluctus suos, * a vócibus aquárum multárum."
en: "The floods have lifted up their waves, * with the noise of many waters."
status:
la: verified
en: verified
- n: 4
text:
la: "Mirábiles elatiónes maris: * mirábilis in altis Dóminus."
en: "Wonderful are the surges of the sea: * wonderful is the Lord on high."
status:
la: verified
en: verified
- n: 5
text:
la: "Testimónia tua credibília facta sunt nimis: * domum tuam decet sanctitúdo, Dómine, in longitúdinem diérum."
en: "Thy testimonies are become exceedingly credible: * holiness becometh thy house, O Lord, unto length of days."
status:
la: verified
en: verified
+61
View File
@@ -0,0 +1,61 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 97
verses:
- n: 1
text:
la: "Salvávit sibi déxtera ejus: * et brácchium sanctum ejus."
en: "His right hand hath wrought for him salvation, * and his arm is holy."
status:
la: verified
en: verified
- n: 2
text:
la: "Notum fecit Dóminus salutáre suum: * in conspéctu géntium revelávit justítiam suam."
en: "The Lord hath made known his salvation: * he hath revealed his justice in the sight of the Gentiles."
status:
la: verified
en: verified
- n: 3
text:
la: "Vidérunt omnes términi terræ * salutáre Dei nostri."
en: "All the ends of the earth have seen * the salvation of our God."
status:
la: verified
en: verified
- n: 4
text:
la: "Jubiláte Deo, omnis terra: * cantáte, et exsultáte, et psállite."
en: "Sing joyfully to God, all the earth; * make melody, rejoice and sing."
status:
la: verified
en: verified
- n: 5
text:
la: "Psállite Dómino in cíthara, in cíthara et voce psalmi: * in tubis ductílibus, et voce tubæ córneæ."
en: "Sing praise to the Lord on the harp, on the harp, and with the voice of a psalm: * with long trumpets, and sound of cornet."
status:
la: verified
en: verified
- n: 6
text:
la: "Jubiláte in conspéctu regis Dómini: * moveátur mare, et plenitúdo ejus: orbis terrárum, et qui hábitant in eo."
en: "Make a joyful noise before the Lord our king: * let the sea be moved and the fulness thereof: the world and they that dwell therein."
status:
la: verified
en: verified
- n: 8
text:
la: "Flúmina plaudent manu, simul montes exsultábunt a conspéctu Dómini: * quóniam venit judicáre terram."
en: "The rivers shall clap their hands, the mountains shall rejoice together at the presence of the Lord: * because he cometh to judge the earth."
status:
la: verified
en: verified
- n: 9
text:
la: "Judicábit orbem terrárum in justítia, * et pópulos in æquitáte."
en: "He shall judge the world with justice, * and the people with equity."
status:
la: verified
en: verified
+68
View File
@@ -0,0 +1,68 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 98
verses:
- n: 1
text:
la: "Dóminus regnávit, irascántur pópuli: * qui sedet super Chérubim, moveátur terra."
en: "The Lord hath reigned, let the people be angry: * he that sitteth on the cherubims: let the earth be moved."
status:
la: verified
en: verified
- n: 2
text:
la: "Dóminus in Sion magnus: * et excélsus super omnes pópulos."
en: "The Lord is great in Sion, * and high above all people."
status:
la: verified
en: verified
- n: 3
text:
la: "Confiteántur nómini tuo magno: quóniam terríbile, et sanctum est: * et honor regis judícium díligit."
en: "Let them give praise to thy great name: for it is terrible and holy: * and the kings honour loveth judgment."
status:
la: verified
en: verified
- n: 4
text:
la: "Tu parásti directiónes: * judícium et justítiam in Jacob tu fecísti."
en: "Thou hast prepared directions: * thou hast done judgment and justice in Jacob."
status:
la: verified
en: verified
- n: 5
text:
la: "Exaltáte Dóminum, Deum nostrum, et adoráte scabéllum pedum ejus: * quóniam sanctum est."
en: "Exalt ye the Lord our God, and adore his footstool, * for it is holy."
status:
la: verified
en: verified
- n: 6
text:
la: "Invocábant Dóminum, et ipse exaudiébat eos: * in colúmna nubis loquebátur ad eos."
en: "They called upon the Lord, and he heard them: * he spoke to them in the pillar of the cloud."
status:
la: verified
en: verified
- n: 7
text:
la: "Custodiébant testimónia ejus, * et præcéptum quod dedit illis."
en: "They kept his testimonies, * and the commandment which he gave them."
status:
la: verified
en: verified
- n: 8
text:
la: "Dómine, Deus noster, tu exaudiébas eos: * Deus, tu propítius fuísti eis, et ulcíscens in omnes adinventiónes eórum."
en: "Thou didst hear them, O Lord our God: * thou wast a merciful God to them, and taking vengeance on all their inventions."
status:
la: verified
en: verified
- n: 9
text:
la: "Exaltáte Dóminum, Deum nostrum, et adoráte in monte sancto ejus: * quóniam sanctus Dóminus, Deus noster."
en: "Exalt ye the Lord our God, and adore at his holy mountain: * for the Lord our God is holy."
status:
la: verified
en: verified
+26
View File
@@ -0,0 +1,26 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 99
verses:
- n: 2
text:
la: "Introíte in conspéctu ejus, * in exsultatióne."
en: "Come in before his presence * with exceeding great joy."
status:
la: verified
en: verified
- n: 3
text:
la: "Pópulus ejus, et oves páscuæ ejus: * introíte portas ejus in confessióne, átria ejus in hymnis: confitémini illi."
en: "We are his people and the sheep of his pasture. * Go ye into his gates with praise, into his courts with hymns: and give glory to him."
status:
la: verified
en: verified
- n: 4
text:
la: "Laudáte nomen ejus: quóniam suávis est Dóminus, in ætérnum misericórdia ejus, * et usque in generatiónem et generatiónem véritas ejus."
en: "Praise ye his name: for the Lord is sweet, his mercy endureth for ever, * and his truth to generation and generation."
status:
la: verified
en: verified
+61
View File
@@ -0,0 +1,61 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 100
verses:
- n: 1
text:
la: "Misericórdiam, et judícium * cantábo tibi, Dómine:"
en: "Mercy and judgment * I will sing to thee, O Lord:"
status:
la: verified
en: verified
- n: 2
text:
la: "Perambulábam in innocéntia cordis mei, * in médio domus meæ."
en: "I walked in the innocence of my heart, * in the midst of my house."
status:
la: verified
en: verified
- n: 3
text:
la: "Non proponébam ante óculos meos rem injústam: * faciéntes prævaricatiónes odívi."
en: "I did not set before my eyes any unjust thing: * I hated the workers of iniquities."
status:
la: verified
en: verified
- n: 4
text:
la: "Non adhǽsit mihi cor pravum: * declinántem a me malígnum non cognoscébam."
en: "The perverse heart did not cleave to me: * and the malignant, that turned aside from me, I would not know."
status:
la: verified
en: verified
- n: 5
text:
la: "Supérbo óculo, et insatiábili corde, * cum hoc non edébam."
en: "With him that had a proud eye, and an unsatiable heart, * I would not eat."
status:
la: verified
en: verified
- n: 6
text:
la: "Óculi mei ad fidéles terræ ut sédeant mecum: * ámbulans in via immaculáta, hic mihi ministrábat."
en: "My eyes were upon the faithful of the earth, to sit with me: * the man that walked in the perfect way, he served me."
status:
la: verified
en: verified
- n: 7
text:
la: "Non habitábit in médio domus meæ qui facit supérbiam: * qui lóquitur iníqua, non diréxit in conspéctu oculórum meórum."
en: "He that worketh pride shall not dwell in the midst of my house: * he that speaketh unjust things did not prosper before my eyes."
status:
la: verified
en: verified
- n: 8
text:
la: "In matutíno interficiébam omnes peccatóres terræ: * ut dispérderem de civitáte Dómini omnes operántes iniquitátem."
en: "In the morning I put to death all the wicked of the land: * that I might cut off all the workers of iniquity from the city of the Lord."
status:
la: verified
en: verified
+47
View File
@@ -0,0 +1,47 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 119
verses:
- n: 1
text:
la: "Ad Dóminum cum tribulárer clamávi: * et exaudívit me."
en: "In my trouble I cried to the Lord: * and he heard me."
status:
la: verified
en: verified
- n: 2
text:
la: "Dómine, líbera ánimam meam a lábiis iníquis, * et a lingua dolósa."
en: "O Lord, deliver my soul from wicked lips, * and a deceitful tongue."
status:
la: verified
en: verified
- n: 3
text:
la: "Quid detur tibi, aut quid apponátur tibi * ad linguam dolósam?"
en: "What shall be given to thee, or what shall be added to thee, * to a deceitful tongue?"
status:
la: verified
en: verified
- n: 4
text:
la: "Sagíttæ poténtis acútæ, * cum carbónibus desolatóriis."
en: "The sharp arrows of the mighty, * with coals that lay waste."
status:
la: verified
en: verified
- n: 5
text:
la: "Heu mihi, quia incolátus meus prolongátus est: habitávi cum habitántibus Cedar: * multum íncola fuit ánima mea."
en: "Woe is me, that my sojourning is prolonged! I have dwelt with the inhabitants of Cedar: * my soul hath been long a sojourner."
status:
la: verified
en: verified
- n: 7
text:
la: "Cum his, qui odérunt pacem, eram pacíficus: * cum loquébar illis, impugnábant me gratis."
en: "With them that hated peace I was peaceable: * when I spoke to them they fought against me without cause."
status:
la: verified
en: verified
+61
View File
@@ -0,0 +1,61 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 120
verses:
- n: 1
text:
la: "Levávi óculos meos in montes, * unde véniet auxílium mihi."
en: "I have lifted up my eyes to the mountains, * from whence help shall come to me."
status:
la: verified
en: verified
- n: 2
text:
la: "Auxílium meum a Dómino, * qui fecit cælum et terram."
en: "My help is from the Lord, * who made heaven and earth."
status:
la: verified
en: verified
- n: 3
text:
la: "Non det in commotiónem pedem tuum: * neque dormítet qui custódit te."
en: "May he not suffer thy foot to be moved: * neither let him slumber that keepeth thee."
status:
la: verified
en: verified
- n: 4
text:
la: "Ecce, non dormitábit neque dórmiet, * qui custódit Israël."
en: "Behold he shall neither slumber nor sleep, * that keepeth Israel."
status:
la: verified
en: verified
- n: 5
text:
la: "Dóminus custódit te, Dóminus protéctio tua, * super manum déxteram tuam."
en: "The Lord is thy keeper, the Lord is thy protection * upon thy right hand."
status:
la: verified
en: verified
- n: 6
text:
la: "Per diem sol non uret te: * neque luna per noctem."
en: "The sun shall not burn thee by day: * nor the moon by night."
status:
la: verified
en: verified
- n: 7
text:
la: "Dóminus custódit te ab omni malo: * custódiat ánimam tuam Dóminus."
en: "The Lord keepeth thee from all evil: * may the Lord keep thy soul."
status:
la: verified
en: verified
- n: 8
text:
la: "Dóminus custódiat intróitum tuum, et éxitum tuum: * ex hoc nunc, et usque in sǽculum."
en: "May the Lord keep thy coming in and thy going out; * from henceforth now and for ever."
status:
la: verified
en: verified
+68
View File
@@ -0,0 +1,68 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 121
verses:
- n: 1
text:
la: "Lætátus sum in his, quæ dicta sunt mihi: * In domum Dómini íbimus."
en: "I rejoiced at the things that were said to me: * We shall go into the house of the Lord."
status:
la: verified
en: verified
- n: 2
text:
la: "Stantes erant pedes nostri, * in átriis tuis, Jerúsalem."
en: "Our feet were standing * in thy courts, O Jerusalem."
status:
la: verified
en: verified
- n: 3
text:
la: "Jerúsalem, quæ ædificátur ut cívitas: * cujus participátio ejus in idípsum."
en: "Jerusalem, which is built as a city, * which is compact together."
status:
la: verified
en: verified
- n: 4
text:
la: "Illuc enim ascendérunt tribus, tribus Dómini: * testimónium Israël ad confiténdum nómini Dómini."
en: "For thither did the tribes go up, the tribes of the Lord: * the testimony of Israel, to praise the name of the Lord."
status:
la: verified
en: verified
- n: 5
text:
la: "Quia illic sedérunt sedes in judício, * sedes super domum David."
en: "Because their seats have sat in judgment, * seats upon the house of David."
status:
la: verified
en: verified
- n: 6
text:
la: "Rogáte quæ ad pacem sunt Jerúsalem: * et abundántia diligéntibus te:"
en: "Pray ye for the things that are for the peace of Jerusalem: * and abundance for them that love thee."
status:
la: verified
en: verified
- n: 7
text:
la: "Fiat pax in virtúte tua: * et abundántia in túrribus tuis."
en: "Let peace be in thy strength: * and abundance in thy towers."
status:
la: verified
en: verified
- n: 8
text:
la: "Propter fratres meos, et próximos meos, * loquébar pacem de te:"
en: "For the sake of my brethren, and of my neighbours, * I spoke peace of thee."
status:
la: verified
en: verified
- n: 9
text:
la: "Propter domum Dómini, Dei nostri, * quæsívi bona tibi."
en: "Because of the house of the Lord our God, * I have sought good things for thee."
status:
la: verified
en: verified
+33
View File
@@ -0,0 +1,33 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 122
verses:
- n: 1
text:
la: "Ad te levávi óculos meos, * qui hábitas in cælis."
en: "To thee have I lifted up my eyes, * who dwellest in heaven."
status:
la: verified
en: verified
- n: 2
text:
la: "Sicut óculi ancíllæ in mánibus dóminæ suæ: * ita óculi nostri ad Dóminum, Deum nostrum, donec misereátur nostri."
en: "As the eyes of the handmaid are on the hands of her mistress: * so are our eyes unto the Lord our God, until he have mercy on us."
status:
la: verified
en: verified
- n: 3
text:
la: "Miserére nostri, Dómine, miserére nostri: * quia multum repléti sumus despectióne:"
en: "Have mercy on us, O Lord, have mercy on us: * for we are greatly filled with contempt."
status:
la: verified
en: verified
- n: 4
text:
la: "Quia multum repléta est ánima nostra: * oppróbrium abundántibus, et despéctio supérbis."
en: "For our soul is greatly filled: * we are a reproach to the rich, and contempt to the proud."
status:
la: verified
en: verified
+54
View File
@@ -0,0 +1,54 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 123
verses:
- n: 1
text:
la: "Nisi quia Dóminus erat in nobis, dicat nunc Israël: * nisi quia Dóminus erat in nobis,"
en: "If it had not been that the Lord was with us, let Israel now say: * If it had not been that the Lord was with us,"
status:
la: verified
en: verified
- n: 2
text:
la: "Cum exsúrgerent hómines in nos, * forte vivos deglutíssent nos:"
en: "When men rose up against us, * perhaps they had swallowed us up alive."
status:
la: verified
en: verified
- n: 3
text:
la: "Cum irascerétur furor eórum in nos, * fórsitan aqua absorbuísset nos."
en: "When their fury was enkindled against us, * perhaps the waters had swallowed us up."
status:
la: verified
en: verified
- n: 5
text:
la: "Torréntem pertransívit ánima nostra: * fórsitan pertransísset ánima nostra aquam intolerábilem."
en: "Our soul hath passed through a torrent: * perhaps our soul had passed through a water insupportable."
status:
la: verified
en: verified
- n: 6
text:
la: "Benedíctus Dóminus * qui non dedit nos in captiónem déntibus eórum."
en: "Blessed be the Lord, * who hath not given us to be a prey to their teeth."
status:
la: verified
en: verified
- n: 7
text:
la: "Láqueus contrítus est, * et nos liberáti sumus."
en: "The snare is broken, * and we are delivered."
status:
la: verified
en: verified
- n: 8
text:
la: "Adjutórium nostrum in nómine Dómini, * qui fecit cælum et terram."
en: "Our help is in the name of the Lord, * who made heaven and earth."
status:
la: verified
en: verified
+40
View File
@@ -0,0 +1,40 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 124
verses:
- n: 1
text:
la: "Qui confídunt in Dómino, sicut mons Sion: * non commovébitur in ætérnum, qui hábitat in Jerúsalem."
en: "They that trust in the Lord shall be as mount Sion: * he shall not be moved for ever that dwelleth in Jerusalem."
status:
la: verified
en: verified
- n: 2
text:
la: "Montes in circúitu ejus: * et Dóminus in circúitu pópuli sui, ex hoc nunc et usque in sǽculum."
en: "Mountains are round about it: * so the Lord is round about his people from henceforth now and for ever."
status:
la: verified
en: verified
- n: 3
text:
la: "Quia non relínquet Dóminus virgam peccatórum super sortem justórum: * ut non exténdant justi ad iniquitátem manus suas."
en: "For the Lord will not leave the rod of sinners upon the lot of the just: * that the just may not stretch forth their hands to iniquity."
status:
la: verified
en: verified
- n: 4
text:
la: "Bénefac, Dómine, bonis, * et rectis corde."
en: "Do good, O Lord, to those that are good, * and to the upright of heart."
status:
la: verified
en: verified
- n: 5
text:
la: "Declinántes autem in obligatiónes addúcet Dóminus cum operántibus iniquitátem: * pax super Israël."
en: "But such as turn aside into bonds, the Lord shall lead out with the workers of iniquity: * peace upon Israel."
status:
la: verified
en: verified
+47
View File
@@ -0,0 +1,47 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 125
verses:
- n: 1
text:
la: "In converténdo Dóminus captivitátem Sion: * facti sumus sicut consoláti:"
en: "When the Lord brought back the captivity of Sion, * we became like men comforted."
status:
la: verified
en: verified
- n: 2
text:
la: "Tunc dicent inter gentes: * Magnificávit Dóminus fácere cum eis."
en: "Then shall they say among the Gentiles: * The Lord hath done great things for them."
status:
la: verified
en: verified
- n: 3
text:
la: "Magnificávit Dóminus fácere nobíscum: * facti sumus lætántes."
en: "The Lord hath done great things for us: * we are become joyful."
status:
la: verified
en: verified
- n: 4
text:
la: "Convérte, Dómine, captivitátem nostram, * sicut torrens in Austro."
en: "Turn again our captivity, O Lord, * as a stream in the south."
status:
la: verified
en: verified
- n: 5
text:
la: "Qui séminant in lácrimis, * in exsultatióne metent."
en: "They that sow in tears * shall reap in joy."
status:
la: verified
en: verified
- n: 6
text:
la: "Veniéntes autem vénient cum exsultatióne, * portántes manípulos suos."
en: "But coming they shall come with joyfulness, * carrying their sheaves."
status:
la: verified
en: verified
+33
View File
@@ -0,0 +1,33 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 126
verses:
- n: 1
text:
la: "Nisi Dóminus custodíerit civitátem, * frustra vígilat qui custódit eam."
en: "Unless the Lord keep the city, * he watcheth in vain that keepeth it."
status:
la: verified
en: verified
- n: 2
text:
la: "Cum déderit diléctis suis somnum: * ecce heréditas Dómini fílii: merces, fructus ventris."
en: "When he shall give sleep to his beloved, * behold the inheritance of the Lord are children: the reward, the fruit of the womb."
status:
la: verified
en: verified
- n: 4
text:
la: "Sicut sagíttæ in manu poténtis: * ita fílii excussórum."
en: "As arrows in the hand of the mighty, * so the children of them that have been shaken."
status:
la: verified
en: verified
- n: 5
text:
la: "Beátus vir, qui implévit desidérium suum ex ipsis: * non confundétur cum loquétur inimícis suis in porta."
en: "Blessed is the man that hath filled the desire with them; * he shall not be confounded when he shall speak to his enemies in the gate."
status:
la: verified
en: verified
+47
View File
@@ -0,0 +1,47 @@
# Verified against Divinum Officium (Latin Psalmorum, English translation).
# Vulgate/Gallican numbering.
number: 127
verses:
- n: 1
text:
la: "Beáti, omnes, qui timent Dóminum, * qui ámbulant in viis ejus."
en: "Blessed are all they that fear the Lord: * that walk in his ways."
status:
la: verified
en: verified
- n: 2
text:
la: "Labóres mánuum tuárum quia manducábis: * beátus es, et bene tibi erit."
en: "For thou shalt eat the labours of thy hands: * blessed art thou, and it shall be well with thee."
status:
la: verified
en: verified
- n: 3
text:
la: "Fílii tui sicut novéllæ olivárum, * in circúitu mensæ tuæ."
en: "Thy children as olive plants, * round about thy table."
status:
la: verified
en: verified
- n: 4
text:
la: "Ecce, sic benedicétur homo, * qui timet Dóminum."
en: "Behold, thus shall the man be blessed * that feareth the Lord."
status:
la: verified
en: verified
- n: 5
text:
la: "Benedícat tibi Dóminus ex Sion: * et vídeas bona Jerúsalem ómnibus diébus vitæ tuæ."
en: "May the Lord bless thee out of Sion: * and mayst thou see the good things of Jerusalem all the days of thy life."
status:
la: verified
en: verified
- n: 6
text:
la: "Et vídeas fílios filiórum tuórum, * pacem super Israël."
en: "And mayst thou see thy childrens children, * peace upon Israel."
status:
la: verified
en: verified
+33 -6
View File
@@ -78,9 +78,9 @@ prime:
#
# Sunday, Monday, and Tuesday's Terce/Sext/None are untouched by any of
# this (still whatever Divinum Officium gives natively — Ps 118 sections
# for Sunday/Monday, 119-127 for Tuesday) and so aren't recorded here;
# source them from the reference engine directly when those hours are
# built, the same as Wednesday/Thursday's unchanged 119-127 below.
# for Sunday/Monday, 119-127 for Tuesday) — now recorded below, verified
# against clean per-annum runs with no sanctoral override (2026-08-09 Sun,
# 2026-08-31 Mon, 2026-10-13 Tue).
matins:
monday:
- { number: 32 }
@@ -147,10 +147,19 @@ matins:
# redistribution; source it directly from the reference engine.
terce:
wednesday: &gradual-terce
sunday:
- { number: 118, verses: "33-40" }
- { number: 118, verses: "41-48" }
- { number: 118, verses: "49-56" }
monday:
- { number: 118, verses: "105-112" }
- { number: 118, verses: "113-120" }
- { number: 118, verses: "121-128" }
tuesday: &gradual-terce
- { number: 119 }
- { number: 120 }
- { number: 121 }
wednesday: *gradual-terce
thursday: *gradual-terce
friday:
- { number: 41 }
@@ -162,10 +171,19 @@ terce:
- { number: 81 }
sext:
wednesday: &gradual-sext
sunday:
- { number: 118, verses: "57-64" }
- { number: 118, verses: "65-72" }
- { number: 118, verses: "73-80" }
monday:
- { number: 118, verses: "129-136" }
- { number: 118, verses: "137-144" }
- { number: 118, verses: "145-152" }
tuesday: &gradual-sext
- { number: 122 }
- { number: 123 }
- { number: 124 }
wednesday: *gradual-sext
thursday: *gradual-sext
friday:
- { number: 51 }
@@ -177,10 +195,19 @@ sext:
- { number: 97 }
none:
wednesday: &gradual-none
sunday:
- { number: 118, verses: "81-88" }
- { number: 118, verses: "89-96" }
- { number: 118, verses: "97-104" }
monday:
- { number: 118, verses: "153-160" }
- { number: 118, verses: "161-168" }
- { number: 118, verses: "169-176" }
tuesday: &gradual-none
- { number: 125 }
- { number: 126 }
- { number: 127 }
wednesday: *gradual-none
thursday: *gradual-none
friday:
- { number: 57 }
+1
View File
@@ -85,6 +85,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
case 'closing-antiphon':
case 'by-day-kind':
case 'variable':
case 'day-collect':
throw new Error(`Compline's ordo doesn't support a '${part.kind}' part`);
}
}
+63 -5
View File
@@ -1,7 +1,65 @@
import type { ResolvedOrdo } from './types';
import type { HourDefinition, HourPart, ResolvedOrdo, ResolvedPart } from './types';
import type { LiturgicalDay, Weekday } from '../calendar/types';
import { resolveDay } from '../calendar';
import { getDayLabel } from '../calendar/day-label';
import { getPsalmsFor } from '../psalter/distribution';
import { getPsalmVerses } from '../psalter';
import { getOpeningVersicleId } from './opening-versicle';
import { isDoubleOrHigher } from './antiphon';
import { resolveCommon, getDayCollect, splitNamedAntiphon } from './resolve-common';
import noneDefinitionData from '../data/hours/none.yml';
import antiphonsData from '../data/hours/none-antiphons.yml';
// Milestone 3. Not built yet — will call into hours/shared/little-hour-shared.ts
// alongside terce.ts and sext.ts once that's written.
export function resolveOrdo(date: string): ResolvedOrdo {
return { hourId: 'none', date, parts: [], notImplemented: true };
const noneDefinition = noneDefinitionData as HourDefinition;
const antiphons = antiphonsData as Record<Weekday, Partial<Record<string, string>>>;
function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
switch (part.kind) {
case 'opening-versicle':
return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }];
case 'hymn':
// Self-contained, no appendDoxology — see none-hymn.yml.
return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }];
case 'chapter':
return [{ kind: 'chapter', text: resolveCommon(part.textRef.id) }];
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
// psalms, no closing repeat (unlike Prime): confirmed directly
// against the engine, Capitulum follows the third psalm immediately.
const psalmRefs = getPsalmsFor('none', day.weekday);
const { incipit, full } = splitNamedAntiphon(antiphons[day.weekday]);
const opening = isDoubleOrHigher(day.winner) ? full : incipit;
return psalmRefs.map((ref, i) => ({
kind: 'psalm' as const,
psalmNumber: ref.number,
antiphon: i === 0 ? opening : undefined,
verses: getPsalmVerses(ref.number, ref.verses).map((v) => ({ n: v.n, text: v.text, status: v.status })),
}));
}
// Not used by None.
case 'prayer':
case 'responsory':
case 'versicle':
case 'psalm':
case 'canticle':
case 'lesson':
case 'martyrology':
case 'rule-reading':
case 'by-day-kind':
case 'creed':
case 'closing-antiphon':
case 'nunc-dimittis':
case 'marian-antiphon':
throw new Error(`None's ordo doesn't support a '${part.kind}' part`);
}
}
export function resolveOrdo(date: string): ResolvedOrdo {
const day = resolveDay(date);
const parts = noneDefinition.parts.flatMap((part) => resolvePart(part, day));
return { hourId: 'none', date, parts, dayLabel: getDayLabel(day) };
}
+2 -1
View File
@@ -108,9 +108,10 @@ function resolvePart(part: HourPart, date: string, day: LiturgicalDay): Resolved
{ kind: 'preces', text: resolveCommon('lesson-close') },
];
}
// Not used by Prime — Compline-only.
// Not used by Prime — Compline-only, or Little-Hours-only.
case 'nunc-dimittis':
case 'marian-antiphon':
case 'day-collect':
throw new Error(`Prime's ordo doesn't support a '${part.kind}' part`);
}
}
+29 -3
View File
@@ -1,12 +1,38 @@
import type { ResolvedText } from './types';
import { getCommonProper } from '../propers';
import type { LiturgicalDay } from '../calendar/types';
import type { ProperText } from '../propers';
import { getCommonProper, getTemporalProper } from '../propers';
import { getSaintRecord } from '../calendar/feasts';
import { splitAntiphon } from './antiphon';
function toResolvedText(proper: ProperText): ResolvedText {
return { text: proper.text, status: proper.status, citation: proper.citation };
}
/** Shared by every hour's resolver — looks up a common proper by id and
* shapes it as a ResolvedText. */
export function resolveCommon(id: string): ResolvedText {
const proper = getCommonProper(id);
return { text: proper.text, status: proper.status, citation: proper.citation };
return toResolvedText(getCommonProper(id));
}
/**
* The day's own collect — real for the vast majority of days (a temporal
* winner always resolves, since all 52 Sunday collects are authored and
* ferias inherit the governing Sunday's via calendar/temporal-id.ts), and
* honestly "missing" for the handful of days a saint wins outright until
* that saint's own propers are authored (`saints/<id>.yml`'s `propers`
* field is still `null` for all of them today) — same "resolve as
* pending" convention as everywhere else, not a special case to handle.
*/
export function getDayCollect(day: LiturgicalDay): ResolvedText {
if (day.winner.kind === 'temporal') {
return toResolvedText(getTemporalProper(`${day.winner.id}-collect`));
}
const saint = getSaintRecord(day.winner.id);
if (saint?.propers) {
return resolveCommon(`${saint.propers}-collect`);
}
return { text: {}, status: { la: 'missing', en: 'missing' } };
}
export function verifiedText(text: Partial<Record<string, string>>): ResolvedText {
+63 -5
View File
@@ -1,7 +1,65 @@
import type { ResolvedOrdo } from './types';
import type { HourDefinition, HourPart, ResolvedOrdo, ResolvedPart } from './types';
import type { LiturgicalDay, Weekday } from '../calendar/types';
import { resolveDay } from '../calendar';
import { getDayLabel } from '../calendar/day-label';
import { getPsalmsFor } from '../psalter/distribution';
import { getPsalmVerses } from '../psalter';
import { getOpeningVersicleId } from './opening-versicle';
import { isDoubleOrHigher } from './antiphon';
import { resolveCommon, getDayCollect, splitNamedAntiphon } from './resolve-common';
import sextDefinitionData from '../data/hours/sext.yml';
import antiphonsData from '../data/hours/sext-antiphons.yml';
// Milestone 3. Not built yet — will call into hours/shared/little-hour-shared.ts
// alongside terce.ts and none.ts once that's written.
export function resolveOrdo(date: string): ResolvedOrdo {
return { hourId: 'sext', date, parts: [], notImplemented: true };
const sextDefinition = sextDefinitionData as HourDefinition;
const antiphons = antiphonsData as Record<Weekday, Partial<Record<string, string>>>;
function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
switch (part.kind) {
case 'opening-versicle':
return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }];
case 'hymn':
// Self-contained, no appendDoxology — see sext-hymn.yml.
return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }];
case 'chapter':
return [{ kind: 'chapter', text: resolveCommon(part.textRef.id) }];
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
// psalms, no closing repeat (unlike Prime): confirmed directly
// against the engine, Capitulum follows the third psalm immediately.
const psalmRefs = getPsalmsFor('sext', day.weekday);
const { incipit, full } = splitNamedAntiphon(antiphons[day.weekday]);
const opening = isDoubleOrHigher(day.winner) ? full : incipit;
return psalmRefs.map((ref, i) => ({
kind: 'psalm' as const,
psalmNumber: ref.number,
antiphon: i === 0 ? opening : undefined,
verses: getPsalmVerses(ref.number, ref.verses).map((v) => ({ n: v.n, text: v.text, status: v.status })),
}));
}
// Not used by Sext.
case 'prayer':
case 'responsory':
case 'versicle':
case 'psalm':
case 'canticle':
case 'lesson':
case 'martyrology':
case 'rule-reading':
case 'by-day-kind':
case 'creed':
case 'closing-antiphon':
case 'nunc-dimittis':
case 'marian-antiphon':
throw new Error(`Sext's ordo doesn't support a '${part.kind}' part`);
}
}
export function resolveOrdo(date: string): ResolvedOrdo {
const day = resolveDay(date);
const parts = sextDefinition.parts.flatMap((part) => resolvePart(part, day));
return { hourId: 'sext', date, parts, dayLabel: getDayLabel(day) };
}
+63 -5
View File
@@ -1,7 +1,65 @@
import type { ResolvedOrdo } from './types';
import type { HourDefinition, HourPart, ResolvedOrdo, ResolvedPart } from './types';
import type { LiturgicalDay, Weekday } from '../calendar/types';
import { resolveDay } from '../calendar';
import { getDayLabel } from '../calendar/day-label';
import { getPsalmsFor } from '../psalter/distribution';
import { getPsalmVerses } from '../psalter';
import { getOpeningVersicleId } from './opening-versicle';
import { isDoubleOrHigher } from './antiphon';
import { resolveCommon, getDayCollect, splitNamedAntiphon } from './resolve-common';
import terceDefinitionData from '../data/hours/terce.yml';
import antiphonsData from '../data/hours/terce-antiphons.yml';
// Milestone 3. Not built yet — will call into hours/shared/little-hour-shared.ts
// alongside sext.ts and none.ts once that's written.
export function resolveOrdo(date: string): ResolvedOrdo {
return { hourId: 'terce', date, parts: [], notImplemented: true };
const terceDefinition = terceDefinitionData as HourDefinition;
const antiphons = antiphonsData as Record<Weekday, Partial<Record<string, string>>>;
function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
switch (part.kind) {
case 'opening-versicle':
return [{ kind: 'versicle', text: resolveCommon(getOpeningVersicleId(day.season, day.winner)) }];
case 'hymn':
// Self-contained, no appendDoxology — see terce-hymn.yml.
return [{ kind: 'hymn', text: resolveCommon(part.textRef.id) }];
case 'chapter':
return [{ kind: 'chapter', text: resolveCommon(part.textRef.id) }];
case 'day-collect':
return [{ kind: 'prayer', text: getDayCollect(day) }];
case 'preces':
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
case 'variable': {
// Only 'by-weekday' applies here — one antiphon framing all three
// psalms, no closing repeat (unlike Prime): confirmed directly
// against the engine, Capitulum follows the third psalm immediately.
const psalmRefs = getPsalmsFor('terce', day.weekday);
const { incipit, full } = splitNamedAntiphon(antiphons[day.weekday]);
const opening = isDoubleOrHigher(day.winner) ? full : incipit;
return psalmRefs.map((ref, i) => ({
kind: 'psalm' as const,
psalmNumber: ref.number,
antiphon: i === 0 ? opening : undefined,
verses: getPsalmVerses(ref.number, ref.verses).map((v) => ({ n: v.n, text: v.text, status: v.status })),
}));
}
// Not used by Terce.
case 'prayer':
case 'responsory':
case 'versicle':
case 'psalm':
case 'canticle':
case 'lesson':
case 'martyrology':
case 'rule-reading':
case 'by-day-kind':
case 'creed':
case 'closing-antiphon':
case 'nunc-dimittis':
case 'marian-antiphon':
throw new Error(`Terce's ordo doesn't support a '${part.kind}' part`);
}
}
export function resolveOrdo(date: string): ResolvedOrdo {
const day = resolveDay(date);
const parts = terceDefinition.parts.flatMap((part) => resolvePart(part, day));
return { hourId: 'terce', date, parts, dayLabel: getDayLabel(day) };
}
+7 -1
View File
@@ -87,7 +87,13 @@ export type HourPart =
// Salve Regina. See hours/marian-antiphon.ts.
| { kind: 'marian-antiphon' }
// Unused by Prime/Compline/the little hours — exercised starting milestone 4.
| { kind: 'variable'; resolve: 'by-weekday' | 'by-season' | 'by-feast-rank' };
| { kind: 'variable'; resolve: 'by-weekday' | 'by-season' | 'by-feast-rank' }
// The day's own Proper-of-season/Proper-of-saints collect — resolved by
// day, not by textRef. First used by the Little Hours' "Oratio {ex
// Proprio de Tempore}" via hours/resolve-common.ts's getDayCollect;
// Prime/Compline both still use a fixed collect (`prayer` + textRef).
// Renders as a plain 'prayer' ResolvedPart.
| { kind: 'day-collect' };
export interface HourDefinition {
id: HourId;
+82
View File
@@ -0,0 +1,82 @@
import { describe, expect, it } from 'vitest';
import { resolveOrdo } from '../../src/hours';
// Clean per-annum dates, verified against Divinum Officium (Monastic
// Tridentinum 1617) to have no sanctoral override — see
// data/psalter-distribution.yml and data/hours/*-antiphons.yml for how
// each was chosen.
const SUNDAY = '2026-08-09';
const MONDAY = '2026-08-31';
const TUESDAY = '2026-10-13';
const LITTLE_HOURS = ['terce', 'sext', 'none'] as const;
const PSALMS_BY_HOUR: Record<(typeof LITTLE_HOURS)[number], [number, number, number]> = {
terce: [119, 120, 121],
sext: [122, 123, 124],
none: [125, 126, 127],
};
describe.each(LITTLE_HOURS)('resolveOrdo(%s, ...)', (hourId) => {
it('is implemented', () => {
const ordo = resolveOrdo(hourId, TUESDAY);
expect(ordo.notImplemented).toBeUndefined();
expect(ordo.hourId).toBe(hourId);
});
it('resolves three psalms from the gradual set on a plain weekday, framed by one antiphon', () => {
const ordo = resolveOrdo(hourId, TUESDAY);
const psalmParts = ordo.parts.filter((p) => p.kind === 'psalm');
expect(psalmParts.map((p) => (p.kind === 'psalm' ? p.psalmNumber : undefined))).toEqual(
PSALMS_BY_HOUR[hourId],
);
expect(psalmParts[0]?.kind === 'psalm' ? psalmParts[0].antiphon?.status.en : undefined).toBe('verified');
// No closing repeat of the antiphon — confirmed against the real engine.
expect(psalmParts[1]?.kind === 'psalm' ? psalmParts[1].antiphon : undefined).toBeUndefined();
expect(psalmParts[2]?.kind === 'psalm' ? psalmParts[2].antiphon : undefined).toBeUndefined();
expect(ordo.parts.some((p) => p.kind === 'antiphon')).toBe(false);
});
it('slices Psalm 118 by section on Sunday and Monday instead of the gradual set', () => {
const sunday = resolveOrdo(hourId, SUNDAY);
const sundayPsalms = sunday.parts.filter((p) => p.kind === 'psalm');
expect(sundayPsalms.every((p) => (p.kind === 'psalm' ? p.psalmNumber === 118 : false))).toBe(true);
const monday = resolveOrdo(hourId, MONDAY);
const mondayPsalms = monday.parts.filter((p) => p.kind === 'psalm');
expect(mondayPsalms.every((p) => (p.kind === 'psalm' ? p.psalmNumber === 118 : false))).toBe(true);
// Different sections, not a repeat of Sunday's.
const sundayVerseNs = sundayPsalms[0]?.kind === 'psalm' ? sundayPsalms[0].verses.map((v) => v.n) : [];
const mondayVerseNs = mondayPsalms[0]?.kind === 'psalm' ? mondayPsalms[0].verses.map((v) => v.n) : [];
expect(sundayVerseNs).not.toEqual(mondayVerseNs);
});
it('resolves the hymn as fully self-contained, verified text (no seasonal doxology append)', () => {
const ordo = resolveOrdo(hourId, TUESDAY);
const hymn = ordo.parts.find((p) => p.kind === 'hymn');
expect(hymn && hymn.kind === 'hymn' ? hymn.text.status.en : undefined).toBe('verified');
expect(hymn && hymn.kind === 'hymn' ? hymn.text.text.la : undefined).toContain('Amen.');
});
it('resolves the per-annum capitulum with its citation', () => {
const ordo = resolveOrdo(hourId, TUESDAY);
const chapter = ordo.parts.find((p) => p.kind === 'chapter');
expect(chapter && chapter.kind === 'chapter' ? chapter.text.status.en : undefined).toBe('verified');
expect(chapter && chapter.kind === 'chapter' ? chapter.text.citation?.en : undefined).toBeDefined();
});
it("resolves the day's own collect as the closing prayer", () => {
const ordo = resolveOrdo(hourId, SUNDAY); // post-pentecost-11 — real, verified collect
const prayer = ordo.parts.find((p) => p.kind === 'prayer');
expect(prayer && prayer.kind === 'prayer' ? prayer.text.status.en : undefined).toBe('verified');
expect(prayer && prayer.kind === 'prayer' ? prayer.text.text.en : undefined).toContain('Let us pray.');
});
it('ends with the shared Little Hour conclusion, identical across all three hours', () => {
const ordo = resolveOrdo(hourId, TUESDAY);
const conclusion = ordo.parts.find((p) => p.kind === 'preces' && p.label === 'Conclusion');
expect(conclusion && conclusion.kind === 'preces' ? conclusion.text.text.en : undefined).toContain(
'Let us bless the Lord.',
);
});
});
+2 -2
View File
@@ -188,8 +188,8 @@ describe('resolveOrdo("prime", ...)', () => {
});
describe('resolveOrdo for not-yet-built hours', () => {
it('flags terce as not implemented rather than throwing', () => {
const ordo = resolveOrdo('terce', MONDAY);
it('flags lauds as not implemented rather than throwing', () => {
const ordo = resolveOrdo('lauds', MONDAY);
expect(ordo.notImplemented).toBe(true);
expect(ordo.parts).toEqual([]);
});
+27
View File
@@ -0,0 +1,27 @@
import { describe, expect, it } from 'vitest';
import { resolveDay } from '../../src/calendar';
import { getDayCollect } from '../../src/hours/resolve-common';
describe('getDayCollect', () => {
it('resolves a real, verified collect for an ordinary Sunday', () => {
const day = resolveDay('2026-08-09'); // post-pentecost-11
const collect = getDayCollect(day);
expect(collect.status.la).toBe('verified');
expect(collect.status.en).toBe('verified');
expect(collect.text.en).toContain('Let us pray.');
});
it('resolves a real, verified collect for a ferial day via its governing Sunday', () => {
const day = resolveDay('2026-06-14'); // post-pentecost-03's Sunday
const collect = getDayCollect(day);
expect(collect.status.la).toBe('verified');
});
it('resolves as honestly missing for a saint with no authored propers yet', () => {
const day = resolveDay('2026-08-10'); // St. Lawrence wins outright, propers: null
expect(day.winner.kind).toBe('sanctoral');
const collect = getDayCollect(day);
expect(collect.status.la).toBe('missing');
expect(collect.status.en).toBe('missing');
});
});
+4 -4
View File
@@ -41,12 +41,12 @@ describe('shell', () => {
const root = document.getElementById('app')!;
mountShell(root);
const terceBtn = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-hour]')).find(
(btn) => btn.dataset.hour === 'terce',
const laudsBtn = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-hour]')).find(
(btn) => btn.dataset.hour === 'lauds',
);
terceBtn?.click();
laudsBtn?.click();
expect(root.querySelector('.hour-view h2')?.textContent).toBe('Terce');
expect(root.querySelector('.hour-view h2')?.textContent).toBe('Lauds');
expect(root.querySelector('.hour-view-pending')).not.toBeNull();
});