aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/caldata/caldata_test.go307
-rw-r--r--internal/caldata/tridentine-calendar.ini66
-rw-r--r--internal/calendar/calendar.go124
-rw-r--r--internal/calendar/oracle_ef_test.go259
-rw-r--r--internal/calendar/precedence_ef.go86
-rw-r--r--internal/calendar/precedence_ef_repro_test.go160
-rw-r--r--internal/calendar/precedence_ef_test.go67
-rw-r--r--internal/calendar/temporal_ef.go81
-rw-r--r--internal/calendar/temporal_ef_test.go92
-rw-r--r--internal/calendar/testdata/oracle-ef.json7770
-rw-r--r--internal/calendar/types.go12
-rw-r--r--internal/i18n/golden_test.go19
-rw-r--r--internal/i18n/i18n.go14
-rw-r--r--internal/i18n/lang/en.ini13
-rw-r--r--internal/i18n/lang/pl.ini13
-rw-r--r--internal/i18n/vocab_test.go98
-rw-r--r--internal/liturgy/section.go9
-rw-r--r--internal/readings/offline.go125
-rw-r--r--internal/readings/partids_test.go75
-rw-r--r--internal/readings/readings_test.go37
-rw-r--r--internal/render/render.go8
21 files changed, 6543 insertions, 2892 deletions
diff --git a/internal/caldata/caldata_test.go b/internal/caldata/caldata_test.go
index 12aa765..7dbbf84 100644
--- a/internal/caldata/caldata_test.go
+++ b/internal/caldata/caldata_test.go
@@ -74,9 +74,13 @@ func TestTridentineLoads(t *testing.T) {
t.Fatalf("EF sanctoral has only %d entries; expected the full calendar", len(l.Cels))
}
// Landmark feasts must be present with the right rank/class: Sts Peter & Paul
- // (I class, 06-29), the Purification/Presentation (a II class feast of the
- // Lord, 02-02, which must displace a Sunday), the Immaculate Conception
- // (I class, 12-08).
+ // (I class, 06-29), the Purification/Presentation (II class, 02-02, class
+ // = lord -- see classOf's own doc comment in scripts/gen-sanctoral-ef.go
+ // for why: the calendarium's own title names the BLESSED VIRGIN, but the
+ // tag exists to drive OCCURRENCE behaviour, and missalemeum -- this
+ // data's own oracle -- shows the Purification taking a II-class Sunday's
+ // place outright, the "festum Domini" pattern, not the ordinary-BVM
+ // pattern), the Immaculate Conception (I class, 12-08).
want := map[string]struct{ date, rank, class string }{
"sts-peter-paul": {"06-29", "class-1", ""},
"purification-of-the-blessed-virgin-mary": {"02-02", "class-2", "lord"},
@@ -91,7 +95,7 @@ func TestTridentineLoads(t *testing.T) {
if rc.Fields["date"] != w.date || rc.Fields["rank"] != w.rank {
t.Errorf("%s: date/rank = %q/%q, want %q/%q", slug, rc.Fields["date"], rc.Fields["rank"], w.date, w.rank)
}
- if w.class != "" && rc.Fields["class"] != w.class {
+ if rc.Fields["class"] != w.class {
t.Errorf("%s: class = %q, want %q", slug, rc.Fields["class"], w.class)
}
}
@@ -103,3 +107,298 @@ func TestTridentineLoads(t *testing.T) {
}
}
}
+
+// TestTridentineClassOfLord: scripts/gen-sanctoral-ef.go's classOf tags
+// feasts of the Lord (class = lord). "Most Holy Name of Mary" was wrongly
+// tagged lord (a title-substring false positive: "holy name" alone matches
+// both "Holy Name of Jesus" and "Most Holy Name of MARY", calendarium
+// "Sanctissimi Nominis Mariae") and is fixed here, not contested. The
+// Baptism commemoration was missing the tag entirely (13 January's title
+// ends "of THE Lord", not "of OUR Lord", the only suffix classOf used to
+// check -- calendarium "IN COMMEMORATIONE BAPTISMATIS D. N. I. C."), also
+// fixed and not contested. The Purification is DELIBERATELY absent from
+// this table: it stays tagged lord, on occurrence-behaviour evidence, not
+// the calendarium's title -- see TestTridentineLoads and classOf's own doc
+// comment in scripts/gen-sanctoral-ef.go for the full account of why it is
+// the one contested case, not a clean-cut fix.
+func TestTridentineClassOfLord(t *testing.T) {
+ l := Tridentine()
+ want := map[string]string{
+ "most-holy-name-of-mary": "", // BVM, not the Lord
+ "commemoration-of-the-baptism-of-the-lord": "lord",
+ }
+ for slug, wantClass := range want {
+ rc, ok := l.Cels[slug]
+ if !ok {
+ t.Errorf("missing landmark feast %q", slug)
+ continue
+ }
+ if got := rc.Fields["class"]; got != wantClass {
+ t.Errorf("%s: class = %q, want %q", slug, got, wantClass)
+ }
+ }
+}
+
+// TestTridentineLentRankNotCommemoration: 15 III-class feasts, every one
+// falling 6 March - 5 April, were tagged rank = commemoration because all
+// six of the generator's reference years happen to place that fixed date
+// within Lent, where a privileged Lenten feria always outranks an
+// equal-class feast (RG 109(e)) -- the generator mistook "how the entry
+// presented on the sampled days" for the entry's true, intrinsic rank. A
+// sample of the 15 (full list in the report); the calendarium gives each one
+// III class outright, e.g. 5 April "S. Vincentii Ferrerii Conf., III
+// classis."
+func TestTridentineLentRankNotCommemoration(t *testing.T) {
+ l := Tridentine()
+ for _, slug := range []string{
+ "sts-felicitas-perpetua", "thomas-aquinas", "frances-rome",
+ "gregory-the-great", "patrick", "benedict", "francis-of-paola",
+ "isidore-of-seville", "vincent-ferrer",
+ } {
+ rc, ok := l.Cels[slug]
+ if !ok {
+ t.Errorf("missing %q", slug)
+ continue
+ }
+ if got := rc.Fields["rank"]; got != "class-3" {
+ t.Errorf("%s: rank = %q, want class-3 (not commemoration)", slug, got)
+ }
+ }
+}
+
+// TestTridentineGenuineCommemorationStaysCommemoration: the fix above must
+// NOT promote every commemoration-only entry indiscriminately -- some really
+// are without an independent Mass in the 1960-reformed books, demoted even
+// on an ORDINARY, unprivileged day (not explained by Lent/Passiontide or any
+// higher-class temporal day). St Blaise (3 Feb, an ordinary Septuagesima-
+// season feria) is live-confirmed by missalemeum as a mere commemoration
+// even then, so RankCommemoration is the honest, correct rank -- promoting
+// him to class-4 would let him wrongly win an ordinary green-season feria he
+// has no independent Mass to celebrate.
+func TestTridentineGenuineCommemorationStaysCommemoration(t *testing.T) {
+ l := Tridentine()
+ rc, ok := l.Cels["blaise"]
+ if !ok {
+ t.Fatal("missing blaise")
+ }
+ if got := rc.Fields["rank"]; got != "commemoration" {
+ t.Errorf("blaise: rank = %q, want commemoration (genuinely no independent Mass)", got)
+ }
+}
+
+// TestTridentineNoMissingEntries: four entries present in missalemeum (and
+// so in the calendarium) were silently dropped by the generator's own
+// dedup, which keyed a single global map by SLUG alone -- two by a literal
+// slug collision with an unrelated feast of the same English title on a
+// different date (28 January's "St. Agnes", the traditional SECOND
+// commemoration of 21 January's own Agnes; 14 May's "St. Boniface", a
+// different martyr from 5 June's Boniface of Mainz), and two (Evaristus,
+// Theodore) by the generator returning on the first reference year that
+// showed an observed office, before ever reaching the later year that
+// revealed their commemoration.
+func TestTridentineNoMissingEntries(t *testing.T) {
+ l := Tridentine()
+ want := map[string]string{
+ "agnes-secundo": "01-28",
+ "boniface-martyr": "05-14",
+ "evaristus": "10-26",
+ "theodore": "11-09",
+ }
+ for slug, date := range want {
+ rc, ok := l.Cels[slug]
+ if !ok {
+ t.Errorf("missing %q (%s)", slug, date)
+ continue
+ }
+ if got := rc.Fields["date"]; got != date {
+ t.Errorf("%s: date = %q, want %q", slug, got, date)
+ }
+ }
+}
+
+// TestTridentineRomanusAndEusebiusPresent: CORRECTED after review found the
+// opposite claim resting on an incomplete primary-source check. An earlier
+// version of this test (and of scripts/gen-sanctoral-ef.go's
+// knownSpuriousComm) asserted Romanus ABSENT, on the strength of ONE of the
+// three local Missal scans -- "1962-06-23,…LT.pdf", an ELECTRONIC
+// TRANSCRIPTION that silently drops vigil commemorations generally (also
+// missing: 7 August Donatus, 25 December Anastasia, both present elsewhere).
+// The other two, PHOTOGRAPHIC scans of the actual 1962 Missale Romanum, both
+// carry it: "missale-romanum-1962.pdf" calendarium, 9 August row: "XVI d V
+// 9 Vigilia, III classis, Commemoratio S. Romani Mart.", with the saint's
+// own proper text elsewhere in the same scan ("Et fit commemoratio S. Romani
+// Mar-"), and its own back-of-book index ("Romani Mart., 9 augusti ... 621").
+// Where the scans and the transcription disagree, the scans win -- see
+// gen-sanctoral-ef.go's own primary-source note, same rule recorded there so
+// it is not lost a second time.
+//
+// 14 August's "St. Eusebius" is the identical shape (calendarium: "XI b XIX
+// 14 Vigilia, II classis, Commemoratio S. Eusebii Conf.") and a DIFFERENT
+// person from 16 December's "St. Eusebius, Ep. et Mart." (calendarium: "V
+// XVII S. Eusebii Ep. et Mart., III classis.") -- a Confessor and a Bishop
+// and Martyr, not the same saint moved or duplicated. missalemeum gives both
+// the same bare English title, so they collide by slug; slugOverride
+// disambiguates rather than either being dropped.
+func TestTridentineRomanusAndEusebiusPresent(t *testing.T) {
+ l := Tridentine()
+ if rc, ok := l.Cels["romanus"]; !ok {
+ t.Error("romanus missing: the calendarium's photographic scans both carry \"Commemoratio S. Romani Mart.\" on 9 August")
+ } else if rc.Fields["date"] != "08-09" {
+ t.Errorf("romanus: date = %q, want 08-09", rc.Fields["date"])
+ }
+ want := map[string]struct{ date, rank string }{
+ // St Eusebius Confessor (14 Aug) and St Romanus (9 Aug, checked
+ // above) are both bare "Commemoratio" in the calendarium (no class
+ // of their own) -- pinned here, not just presence/date, per
+ // TestTridentineCommemorationRanksPinned's own reasoning below:
+ // romanus's own rank is pinned there instead, since that test
+ // groups every commemoration-rank entry this task's fixes touched
+ // in one place. eusebius-confessor is listed here because it is
+ // the OTHER half of this specific test's own slug-disambiguation
+ // story.
+ "eusebius-confessor": {"08-14", "commemoration"}, // "S. Eusebii Conf." -- a Confessor
+ "eusebius": {"12-16", "class-3"}, // "S. Eusebii Ep. et Mart." -- a Bishop and Martyr, a different person, unaffected by this round
+ }
+ for slug, w := range want {
+ rc, ok := l.Cels[slug]
+ if !ok {
+ t.Errorf("missing %q (%s)", slug, w.date)
+ continue
+ }
+ if rc.Fields["date"] != w.date {
+ t.Errorf("%s: date = %q, want %q", slug, rc.Fields["date"], w.date)
+ }
+ if rc.Fields["rank"] != w.rank {
+ t.Errorf("%s: rank = %q, want %q", slug, rc.Fields["rank"], w.rank)
+ }
+ }
+}
+
+// TestTridentineCommemorationRanksPinned: nothing in this test suite
+// asserted `rank` for thomas-becket, silvester, or romanus before this --
+// `TestTridentineRomanusAndEusebiusPresent` above pinned presence and date
+// for romanus but not rank, and Thomas Becket/Silvester (the I3 fix, RG
+// 68(d)/(e)) had no rank assertion anywhere at all. So a future
+// regeneration could silently rewrite any of the three back to class-4 --
+// the EXACT I3 failure mode -- with the suite green throughout. Pinned
+// together because they are the same failure shape (a bare "Commemoratio"
+// in the calendarium, no class of its own, silently promoted by
+// refYearExplainsAbsence's own coupling to temporal_ef.go, see that
+// function's doc comment) even though they were found in two different
+// review rounds (romanus in C2, Thomas Becket/Silvester in I3).
+func TestTridentineCommemorationRanksPinned(t *testing.T) {
+ l := Tridentine()
+ for _, slug := range []string{"romanus", "thomas-becket", "silvester"} {
+ rc, ok := l.Cels[slug]
+ if !ok {
+ t.Errorf("missing %q", slug)
+ continue
+ }
+ if rc.Fields["rank"] != "commemoration" {
+ t.Errorf("%s: rank = %q, want commemoration", slug, rc.Fields["rank"])
+ }
+ }
+}
+
+// TestTridentineNoTransferArtifacts: a movable-transfer feast displayed on
+// whatever civil date it actually landed on in a given reference year (St
+// Joseph pushed to 20 March by a Sunday of Lent; the Annunciation deferred
+// past Holy Week; All Souls moved to the Monday; St Matthias shown on the
+// 25th in a leap year) must not leak into the sanctoral as a phantom
+// fixed-date entry keyed to that transferred civil date.
+func TestTridentineNoTransferArtifacts(t *testing.T) {
+ l := Tridentine()
+ for _, slug := range []string{
+ "joseph-spouse-of-the-bl-virgin-mary-0320",
+ "annunciation-of-the-blessed-virgin-mary-0405",
+ "annunciation-of-the-blessed-virgin-mary-0408",
+ "annunciation-of-the-blessed-virgin-mary-0409",
+ "commemoration-of-all-souls-1103",
+ "matthias-0225",
+ } {
+ if _, ok := l.Cels[slug]; ok {
+ t.Errorf("phantom transfer-artifact entry %q present", slug)
+ }
+ }
+}
+
+// TestTridentineNamesPreservedAcrossRegeneration is the coverage guard a
+// regeneration silently destroying a whole language's names needed and did
+// not have: an earlier version of scripts/gen-sanctoral-ef.go's main()
+// preserved existing name.la values across a regeneration (missalemeum
+// supplies English only) but had no equivalent for name.pl -- and, because
+// the bootstrapped file has in fact never carried a name.la value, that
+// mechanism looked correct while doing nothing at all. A regeneration
+// deleted all 322 Polish names outright (name.pl count 322 -> 0), silently:
+// no test here asserted anything about a name.* field, and
+// `len(l.Cels) < 250` (TestTridentineLoads) does not notice a field going
+// missing within entries that still exist. `naming.CelebrationName`'s own
+// name[lang] -> name.en fallback (internal/naming/naming.go) then quietly
+// substituted English for Polish on every EF display in that language,
+// reaching mobile.Day(date, "ef", version, "pl") -- a shipped dlectio entry
+// point -- with no error anywhere in the chain.
+//
+// CORRECTED after review: the first version of this test counted name.pl
+// only (a hardcoded single language -- the exact "whitelist of two
+// languages" mistake C1's own fix was written to stop repeating, just
+// moved into the test), and its coverage floor (>= 315) had 7 entries of
+// slack -- the review proved dropping 6 entries' Polish names still passed
+// it. Fixed on both axes: the language set is DISCOVERED from the data
+// (every "name.<lang>" key actually present, not a hardcoded list, so a
+// regeneration dropping name.la or introducing a future name.de is
+// checked the same way as name.pl), and the floor for each discovered
+// language is its EXACT true count, not a loose approximation -- verified
+// directly against the branch point (`git show 2386a45:...`) once, by
+// hand, and hardcoded as the answer, not derived at test time from data
+// that could itself be wrong.
+//
+// True counts, independently verified: name.en on every entry (327, all
+// regenerated fresh from missalemeum, including the 5 entries this task's
+// own fixes added); name.pl on exactly 322 (preserved from the branch
+// point; the 5 new entries -- St Agnes secundo, St Boniface Martyr, St
+// Evaristus, St Theodore, St Eusebius Confessor -- never had a curated
+// Polish name to preserve in the first place, so 322, not 327, is the
+// correct target, not a shortfall); no OTHER name.<lang> exists in the
+// branch point at all (name.la is read by the generator but the
+// bootstrapped file has in fact never carried one), so the discovered
+// language set itself must be exactly {en, pl} -- a regeneration that
+// silently introduced or lost an entire language key, not just some
+// values within one, is caught by this assertion, not only by the count.
+func TestTridentineNamesPreservedAcrossRegeneration(t *testing.T) {
+ l := Tridentine()
+ counts := map[string]int{}
+ for _, rc := range l.Cels {
+ for k, v := range rc.Fields {
+ if v == "" || !strings.HasPrefix(k, "name.") {
+ continue
+ }
+ lang := strings.TrimPrefix(k, "name.")
+ counts[lang]++
+ }
+ }
+ wantLangs := map[string]bool{"en": true, "pl": true}
+ for lang := range counts {
+ if !wantLangs[lang] {
+ t.Errorf("unexpected name.%s present (%d entries) -- discovered language set must be exactly {en, pl}", lang, counts[lang])
+ }
+ }
+ for lang := range wantLangs {
+ if counts[lang] == 0 {
+ t.Errorf("name.%s entirely absent -- discovered language set must be exactly {en, pl}", lang)
+ }
+ }
+ if got := counts["en"]; got != len(l.Cels) {
+ t.Errorf("name.en coverage = %d entries, want %d (every entry, all freshly regenerated)", got, len(l.Cels))
+ }
+ if got := counts["pl"]; got != 322 {
+ t.Errorf("name.pl coverage = %d entries, want exactly 322 (the branch point's own true count; the 5 entries this task added have no curated Polish name to preserve, so more or fewer than 322 is a bug either way)", got)
+ }
+
+ rc, ok := l.Cels["assumption-of-the-blessed-virgin-mary"]
+ if !ok {
+ t.Fatal("missing assumption-of-the-blessed-virgin-mary")
+ }
+ if got := rc.Fields["name.pl"]; got != "Wniebowzięcie N. M. P." {
+ t.Errorf("assumption-of-the-blessed-virgin-mary: name.pl = %q, want the preserved Polish name", got)
+ }
+}
diff --git a/internal/caldata/tridentine-calendar.ini b/internal/caldata/tridentine-calendar.ini
index 3fb61d7..55564d7 100644
--- a/internal/caldata/tridentine-calendar.ini
+++ b/internal/caldata/tridentine-calendar.ini
@@ -4,7 +4,9 @@
; by internal/calendar (temporalEF) and is NOT listed here.
; Ranks use the 1960 Code of Rubrics: class-1..class-4.
; Generated by scripts/gen-sanctoral-ef.go from missalemeum (Divinum Officium 1962
-; data). Latin names are hand-curated where present. See NOTICE.
+; data). name.en is always regenerated fresh from missalemeum; every other
+; name.<lang> (missalemeum supplies English only) is preserved verbatim from
+; whatever this file already carried before regeneration. See NOTICE.
[layer]
id = tridentine
@@ -29,6 +31,7 @@ name.pl = św. Hygina, Papieża i Męczennika
date = 01-13
rank = class-2
colour = white
+class = lord
name.en = Commemoration of the Baptism of the Lord
name.pl = Wspomnienie Chrztu Pańskiego
reading.first = Isa 60:1-6
@@ -191,6 +194,12 @@ name.pl = św. Jana Chryzostoma, Wyznawcy, Biskupa i Doktora Kościoła
reading.first = 2 Tim 4:1-8
reading.gospel = Matt 5:13-19
+[agnes-secundo]
+date = 01-28
+rank = commemoration
+colour = red
+name.en = St. Agnes
+
[peter-nolasco]
date = 01-28
rank = class-3
@@ -430,56 +439,56 @@ name.pl = św. Lucjusza I, Papieża i Męczennika
[sts-felicitas-perpetua]
date = 03-06
-rank = commemoration
+rank = class-3
colour = red
name.en = Sts. Felicitas & Perpetua
name.pl = śś. Perpetui i Felicyty, Męczennic
[thomas-aquinas]
date = 03-07
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Thomas Aquinas
name.pl = św. Tomasza z Akwinu, Wyznawcy i Doktora Kościoła
[john-of-god]
date = 03-08
-rank = commemoration
+rank = class-3
colour = white
name.en = St. John of God
name.pl = św. Jana Bożego, Wyznawcy
[frances-rome]
date = 03-09
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Frances Rome
name.pl = św. Franciszki Rzymianki, Wdowy
[forty-holy-martyrs-of-sebaste]
date = 03-10
-rank = commemoration
+rank = class-3
colour = red
name.en = Forty Holy Martyrs of Sebaste
name.pl = śś. Czterdziestu Męczenników
[gregory-the-great]
date = 03-12
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Gregory the Great
name.pl = św. Grzegorza Wielkiego, Papieża, Wyznawcy i Doktora Kościoła
[patrick]
date = 03-17
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Patrick
name.pl = św. Patryka, Biskupa i Wyznawcy
[cyril-of-jerusalem]
date = 03-18
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Cyril of Jerusalem
name.pl = św. Cyryla Jerozolimskiego, Biskupa, Wyznawcy i Doktora Kościoła
@@ -495,14 +504,14 @@ reading.gospel = Matt 1:18-21
[benedict]
date = 03-21
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Benedict
name.pl = św. Benedykta, Opata
[gabriel-the-archangel]
date = 03-24
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Gabriel the Archangel
name.pl = św. Gabriela Archanioła
@@ -518,35 +527,35 @@ reading.gospel = Luke 1:26-38
[john-damascene]
date = 03-27
-rank = commemoration
+rank = class-3
colour = white
name.en = St. John Damascene
name.pl = św. Jana Damasceńskiego, Wyznawcy i Doktora Kościoła
[john-of-capistrano]
date = 03-28
-rank = commemoration
+rank = class-3
colour = white
name.en = St. John of Capistrano
name.pl = św. Jana Kapistrana, Wyznawcy
[francis-of-paola]
date = 04-02
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Francis of Paola
name.pl = św. Franciszka z Pauli, Wyznawcy
[isidore-of-seville]
date = 04-04
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Isidore of Seville
name.pl = św. Izydora, Biskupa, Wyznawcy i Doktora Kościoła
[vincent-ferrer]
date = 04-05
-rank = commemoration
+rank = class-3
colour = white
name.en = St. Vincent Ferrer
name.pl = św. Wincentego Fereriusza, Wyznawcy
@@ -784,6 +793,12 @@ name.pl = św. Roberta Bellarmina, Biskupa, Wyznawcy i Doktora Kościoła
reading.first = Wis 7:7-14.
reading.gospel = Matt 5:13-19
+[boniface-martyr]
+date = 05-14
+rank = commemoration
+colour = red
+name.en = St. Boniface
+
[john-baptist-de-la-salle]
date = 05-15
rank = class-3
@@ -1596,6 +1611,12 @@ colour = red
name.en = Sts. Hippolytus & Cassian
name.pl = śś. Hipolita i Kasjana, Męczenników
+[eusebius-confessor]
+date = 08-14
+rank = commemoration
+colour = red
+name.en = St. Eusebius
+
[vigil-of-the-assumption]
date = 08-14
rank = class-2
@@ -1866,7 +1887,6 @@ name.pl = św. Prota i Jacka, Męczenników
date = 09-12
rank = class-3
colour = white
-class = lord
name.en = Most Holy Name of Mary
name.pl = Najświętszego Imienia Maryi
reading.first = Sir 24:23-31
@@ -2264,6 +2284,12 @@ colour = red
name.en = Sts. Chrysanthus & Daria
name.pl = śś. Chryzanta i Darii, Męczenników
+[evaristus]
+date = 10-26
+rank = commemoration
+colour = red
+name.en = St. Evaristus
+
[sts-simon-jude]
date = 10-28
rank = class-2
@@ -2324,6 +2350,12 @@ name.pl = Rocznica Konsekracji Bazyliki Najświętszego Zbawiciela na Lateranie
reading.first = Rev 21:2-5
reading.gospel = Luke 19:1-10
+[theodore]
+date = 11-09
+rank = commemoration
+colour = red
+name.en = St. Theodore
+
[andrew-avellino]
date = 11-10
rank = class-3
diff --git a/internal/calendar/calendar.go b/internal/calendar/calendar.go
index 33706d8..2d8611a 100644
--- a/internal/calendar/calendar.go
+++ b/internal/calendar/calendar.go
@@ -35,14 +35,43 @@ func TemporalSlug(date time.Time, sel Selection) string {
func computeEF(date time.Time, sel Selection, layers []Layer) LiturgicalDay {
td := temporalEF(date)
merged := mergeLayers(layers)
- cands := []candidate{{Cel: td.Cel, Temporal: true, Season: td.Season}}
+ year := date.Year()
+ // occupiedByRank reports whether some OTHER fixed-date sanctoral
+ // celebration whose rank passes `allowed` resolves onto d this year.
+ // transferIfImpededEF uses this at two different thresholds: class 1
+ // only, to decide whether a candidate is impeded in the first place (a
+ // class-2 occupant never impedes a class-1 feast -- class 1 always beats
+ // class 2 outright, no tie exists); and class 1 OR 2, for RG 96's "next
+ // day that is not I or II class" once a transfer is already under way
+ // (e.g. the Visitation, 2 July, blocking the Precious Blood's transfer
+ // off 1 July in 2011).
+ occupiedByRank := func(d time.Time, exceptSlug string, allowed func(Rank) bool) bool {
+ for slug2, rc2 := range merged {
+ if slug2 == exceptSlug {
+ continue
+ }
+ cel2 := buildCelebration(slug2, rc2)
+ if !allowed(cel2.Rank) {
+ continue
+ }
+ if when2, ok := celebrationDate(cel2, year, sel); ok && sameDay(when2, d) {
+ return true
+ }
+ }
+ return false
+ }
+ isClass1 := func(r Rank) bool { return r == RankClass1 }
+ isClass1Or2 := func(r Rank) bool { return r == RankClass1 || r == RankClass2 }
+ cands := []candidate{{Cel: td.Cel, Temporal: true, Season: td.Season, Sunday: td.Sunday}}
for slug, rc := range merged {
cel := buildCelebration(slug, rc)
- when, ok := celebrationDate(cel, date.Year(), sel)
+ when, ok := celebrationDate(cel, year, sel)
if !ok {
continue
}
- effective := transferIfImpededEF(cel, when)
+ effective := transferIfImpededEF(cel, when,
+ func(d time.Time) bool { return occupiedByRank(d, cel.Slug, isClass1) },
+ func(d time.Time) bool { return occupiedByRank(d, cel.Slug, isClass1Or2) })
if sameDay(effective, date) {
cands = append(cands, candidate{Cel: cel, Temporal: false, Season: td.Season})
}
@@ -199,12 +228,54 @@ func transferIfImpeded(cel Celebration, when time.Time, sel Selection) time.Time
// transferIfImpededEF moves an EF sanctoral feast off a date it cannot be kept
// on. Two rules cover the 1962 cases: All Souls, when Nov 2 is a Sunday, is
-// transferred to the Monday (Nov 3); and a I class feast impeded by a I class
-// temporal day (Holy Week, the Easter octave) is pushed forward to the next free
-// day — for the Annunciation in Holy Week this lands on the Monday after Low
-// Sunday, past the whole privileged octave. Lower-rank feasts are only
-// commemorated, never transferred.
-func transferIfImpededEF(cel Celebration, when time.Time) time.Time {
+// transferred to the Monday (Nov 3); and a I class feast genuinely impeded is
+// pushed forward to the next day that is itself neither I nor II class (RG
+// 96: "the next following day that is not I or II class"). Lower-rank feasts
+// are only commemorated, never transferred (RG 95).
+//
+// occupiedByClass1 and occupiedByClass1Or2 are deliberately different
+// thresholds, not the same check reused twice:
+// - a candidate is impeded IN THE FIRST PLACE only by a genuine class-1
+// collision -- the temporal office of `when` is itself I class (a Sunday
+// of Advent/Lent/Passiontide, Holy Week, a named I-class feast), or
+// another FIXED I-class sanctoral feast already sits on `when` (RG
+// 97/98). A II-class occupant, temporal or sanctoral, never impedes a
+// I-class feast at all -- I class always outranks II class outright, no
+// tie-break is even reached -- so using the wider I-OR-II threshold here
+// would (and, before this fix, did: e.g. All Saints, 1 Nov, was wrongly
+// bumped to 3 Nov merely for landing on an ordinary II-class Sunday it
+// would have won outright) send an unimpeded I-class feast on an
+// unnecessary walk.
+// - once a transfer is under way, the DESTINATION must avoid landing on
+// ANY I- or II-class day (RG 96's own wider "not I or II class" text) --
+// e.g. the Visitation, 2 July, blocks the Precious Blood's transfer off 1
+// July in 2011, and 3 July's ordinary Sunday blocks it a second time.
+//
+// KNOWN GAP, not fixed here (recorded per RG 95, so the next person does not
+// have to rediscover it from scratch): this function resolves ONE
+// candidate's own transfer walk in isolation. It has no way to notice that a
+// SECOND, separately-transferred I-class candidate has landed on the exact
+// same destination day. Concretely: St Joseph (19 March) and the
+// Annunciation (25 March) can both be walked, independently, to the Monday
+// after Low Sunday in the same year (2008, 2035, 2046 -- e.g. 2035-04-02:
+// `annunciation-of-the-blessed-virgin-mary … +joseph-spouse-of-the-bl-virgin-mary`).
+// RG 95 grants the right of translation "solummodo festis I classis" (to
+// I-class feasts ONLY) -- so BOTH have that right, and the day they land on
+// together is itself an ordinary occurrence collision RG 97/98 governs (the
+// higher table position is kept, the other transfers FURTHER): this
+// function does not re-walk the loser, it lets pickEF's plain alphabetical
+// slug tie-break settle it, so the loser is merely commemorated instead of
+// continuing its own walk one more day. RG 98 itself supplies the missing
+// determinism rule for the tie this collision even needs: "in paritate
+// autem Officium prius impeditum praecedit" -- at equal table position, the
+// office impeded FIRST takes precedence -- which is chronological (Joseph,
+// impeded on the 19th, before the Annunciation's own walk begins on the
+// 25th) and may favour Joseph over pickEF's alphabetical fallback. Neither
+// RG 98's tie rule nor the re-walk RG 97 implies is implemented; fixing this
+// properly means resolving occurrence between two ALREADY-TRANSFERRED
+// candidates, not a single one, which is out of this function's current
+// shape.
+func transferIfImpededEF(cel Celebration, when time.Time, occupiedByClass1, occupiedByClass1Or2 func(time.Time) bool) time.Time {
if when.Month() == time.November && when.Day() == 2 && when.Weekday() == time.Sunday &&
strings.Contains(cel.Slug, "all-souls") {
return when.AddDate(0, 0, 1)
@@ -212,11 +283,40 @@ func transferIfImpededEF(cel Celebration, when time.Time) time.Time {
if cel.Rank != RankClass1 {
return when
}
- day := when
+ // Is cel actually impeded on `when` at all? Compare its OWN precedence
+ // (via precedenceEF, the same function pickEF uses to decide the day)
+ // against the temporal office's, rather than testing the temporal
+ // office's class in isolation -- a plain "is the temporal day I class"
+ // test wrongly impedes a candidate that would in fact WIN a tie against
+ // it: RG 91 entry 4 (the Immaculate Conception, the Assumption) sits
+ // ABOVE entry 6 (Sundays), so the Immaculate Conception is not impeded
+ // by the Advent Sunday it may fall on at all, unlike an ordinary I-class
+ // feast (entry 11, e.g. St Joseph), which is. occupiedByClass1 still
+ // covers the separate case of a competing FIXED I-class SANCTORAL
+ // feast, which this temporal-only comparison cannot see.
+ startTemporal := temporalEF(when)
+ tCand := candidate{Cel: startTemporal.Cel, Temporal: true, Season: startTemporal.Season, Sunday: startTemporal.Sunday}
+ sCand := candidate{Cel: cel, Temporal: false}
+ startImpeded := precedenceEF(tCand) < precedenceEF(sCand) || occupiedByClass1(when)
+ if !startImpeded {
+ return when
+ }
+ day := when.AddDate(0, 0, 1)
for i := 0; i < 30; i++ {
b := temporalEF(day)
- if precedenceEF(candidate{Cel: b.Cel, Temporal: true, Season: b.Season}) <= 2 {
- day = day.AddDate(0, 0, 1) // impeded by a I class temporal day; push forward
+ // A direct CLASS test, not precedenceEF's tie-break band: band
+ // encodes which of two EQUAL-class candidates wins a tie (e.g. a
+ // Sunday beats an equal-class feast, but a privileged Ember/late-
+ // Advent FERIA of the same class yields to one, defect 2) -- an
+ // unrelated question from RG 96's own "is this day itself I or II
+ // class" test. Reusing band here undercounted: a day within the
+ // Octave of the Nativity (26-31 Dec) is genuinely II class (RG 67),
+ // but as an ordinary, non-Sunday II-class temporal candidate its OWN
+ // band yields (5, not <=3) -- so band<=3 alone let an impeded I-class
+ // feast wrongly land there. isHighClass tests the class directly.
+ isHighClass := b.Cel.Rank == RankClass1 || b.Cel.Rank == RankClass2
+ if isHighClass || occupiedByClass1Or2(day) {
+ day = day.AddDate(0, 0, 1) // still I- or II-class; keep walking
continue
}
return day
diff --git a/internal/calendar/oracle_ef_test.go b/internal/calendar/oracle_ef_test.go
index ce4badd..6d63220 100644
--- a/internal/calendar/oracle_ef_test.go
+++ b/internal/calendar/oracle_ef_test.go
@@ -12,11 +12,51 @@ import (
"github.com/lukaszkasprzak/lectio/internal/calendar"
)
+// efOracleDay is one day of missalemeum's per-date proper API, as captured in
+// sources/snapshot.tar.gz (missalemeum/en/YYYY-MM-DD.json, 2026-01-01 ..
+// 2027-12-31, 730 days) and flattened by scripts/build-oracle-ef.sh.
+//
+// Three things about this data that will otherwise cost hours (see that
+// script's own header for the full account):
+//
+// 1. ID looks like "sancti:MM-DD:rank:colour", but its embedded rank is the
+// rank of the PROPERS USED that day, not the day's own rank -- e.g.
+// 2026-01-02 is a class-4 feria carrying id "sancti:01-01:1:w" because it
+// reuses the Circumcision's propers. Kept here for provenance/debugging
+// ONLY. Rank and Colour comparisons below use Rank/Colours, never ID.
+// 2. Colours is an array -- 14 of 730 days carry two values (Gaudete/Laetare
+// "pv", Palm Sunday "rv", Good Friday "bv", Holy Saturday "vw") -- so the
+// comparison is membership, not equality.
+// 3. A two-colour value on a weekday can be an artifact of proper reuse (a
+// feria inside Gaudete/Laetare week reusing the Sunday's own propers)
+// rather than a claim about that weekday's own colour. No special-casing
+// is needed for this: lectio's single ferial colour (violet) is already a
+// member of the reused set (e.g. ["p","v"]), so a plain membership check
+// absorbs it.
type efOracleDay struct {
- Tempora string `json:"tempora"`
- Title string `json:"title"`
- Rank int `json:"rank"`
- Colour string `json:"colour"`
+ ID string `json:"id"`
+ Tempora string `json:"tempora"`
+ Title string `json:"title"`
+ Rank int `json:"rank"`
+ Colours []string `json:"colours"`
+}
+
+// efColourLetters maps missalemeum's single-letter colour codes to lectio's
+// Colour vocabulary (scripts/gen-sanctoral-ef.go's colourWord table, same
+// mapping, kept in sync deliberately rather than imported across a
+// package/build-tag boundary).
+var efColourLetters = map[string]calendar.Colour{
+ "w": calendar.White, "r": calendar.Red, "g": calendar.Green,
+ "v": calendar.Violet, "b": calendar.Black, "p": calendar.Rose,
+}
+
+// efRankNumbers maps missalemeum's 1-4 rank number to lectio's EF Rank
+// vocabulary. missalemeum has no separate "commemoration" rank number --
+// RankCommemoration is a lectio-side concept for a losing sanctoral
+// candidate, never the oracle's claim about the OBSERVED day.
+var efRankNumbers = map[int]calendar.Rank{
+ 1: calendar.RankClass1, 2: calendar.RankClass2,
+ 3: calendar.RankClass3, 4: calendar.RankClass4,
}
// efSeasonFromString maps a missalemeum tempora/title phrase (for a day in the
@@ -28,6 +68,14 @@ type efOracleDay struct {
// there, not to Time after Epiphany.
func efSeasonFromString(s string, month int) calendar.Season {
s = strings.ToLower(s)
+ // missalemeum's own EN-locale text still carries the occasional Latin
+ // ligature (e.g. "Feria V after Sexagesimæ") -- confirmed in the
+ // committed snapshot: "Sexagesimæ" appears 10 times, "Sexagesima" (no
+ // ligature) only 4, and the ligatured form matched no case below,
+ // silently mapping those 10 days to season "" (skipped from coverage
+ // entirely, not merely a season miss). Normalising here fixes every
+ // current and future ligature in one place, not just this one word.
+ s = strings.ReplaceAll(s, "æ", "ae")
has := func(subs ...string) bool {
for _, sub := range subs {
if strings.Contains(s, sub) {
@@ -63,9 +111,116 @@ func efSeasonFromString(s string, month int) calendar.Season {
}
}
-// TestOracleEF diffs the EF engine against missalemeum (Divinum Officium data).
-// Season is asserted strictly (validates temporalEF); rank/colour are reported
-// informationally (partial 1962 sanctoral).
+// efAllow is one cited allow-list entry: a genuine, defensible divergence
+// between lectio's EF engine and the missalemeum oracle on Rank and/or
+// Colour, kept out of the pass/fail count deliberately rather than silently
+// skipped. Every entry names the date(s) it covers, which field(s) it
+// excuses, and why -- with an RG citation where the divergence is a rubric
+// question, or a plain "not built" note where it is a documented scope gap
+// (see internal/calendar/precedence_ef.go and temporal_ef.go's own doc
+// comments, and colitur's rules-register.md, for the fuller accounts).
+type efAllow struct {
+ date string // "" = pattern-matched by match(), see below
+ match func(date string, day time.Time, oracle efOracleDay) bool
+ field string // "rank", "colour", or "rank+colour"
+ reason string
+}
+
+var efAllowList = []efAllow{
+ {
+ // RG 91 entry 27, "Officium sanctae Mariae in sabbato": the votive
+ // BVM Office on an otherwise-unoccupied IV-class Saturday. Not built
+ // in lectio (temporal_ef.go constructs only a bare ferial slug on
+ // these Saturdays; the vocabulary comment in colitur's own register
+ // documents the same gap on its side). missalemeum's rank/colour for
+ // these Saturdays reflects the BVM Office (usually white); lectio's
+ // reflects the plain per-annum feria (green, class-4). A real,
+ // scoped, pre-existing gap -- not one of the seven defects, and not
+ // attempted here (a Plan-scale feature, per the sibling project's own
+ // parking of the identical item).
+ match: func(date string, day time.Time, o efOracleDay) bool {
+ return day.Weekday() == time.Saturday &&
+ strings.Contains(strings.ToLower(o.Title), "b. v. m")
+ },
+ field: "rank+colour",
+ reason: "RG 91 entry 27 (BVM Office on Saturday) is not built in lectio; both engines agree only that the day is unimpeded",
+ },
+ {
+ // RG 72-73 place 6-13 January within Christmastide itself ("a I
+ // Vesperis Nativitatis Domini usque ad diem 13 ianuarii inclusive");
+ // RG 119(a) backs the same boundary from the white-colour side
+ // ("...usque ad expletum tempus Epiphaniae"). lectio's efSeason
+ // (temporal_ef.go) instead starts "time after Epiphany" on 6 January,
+ // so a plain feria in this window gets green/TimeAfterEpiphany
+ // instead of white/Christmastide. This is a real, PRE-EXISTING season-
+ // boundary divergence -- colitur's own rules-register.md documents
+ // the identical gap on its side (§3c item 1) as deliberate and
+ // resolved in the OTHER engine's favour, not one of the seven named
+ // defects, and not touched here: efSeason is a season-boundary
+ // function with much wider reach than any of the seven, and changing
+ // it is out of this task's scope.
+ match: func(date string, day time.Time, o efOracleDay) bool {
+ return day.Month() == time.January && day.Day() >= 6 && day.Day() <= 13
+ },
+ field: "colour",
+ reason: "RG 72-73/RG 119(a): 6-13 Jan is Christmastide, not lectio's time-after-Epiphany reading (efSeason, not one of the seven defects; see colitur rules-register.md §3c item 1)",
+ },
+ {
+ // RG 33: "Vigilia II aut III classis penitus omittitur, si occurrat in
+ // dominica quavis..." -- a II/III-class vigil is ENTIRELY OMITTED on
+ // any Sunday. 9 August 2026 is a Sunday; the Vigil of St Lawrence (III
+ // class) must vanish and the Sunday itself be observed -- which is
+ // exactly what lectio does (see cmd/lectio-ef-dump: 2026-08-09
+ // observed is the II-class Sunday, the vigil demoted to a losing
+ // candidate). missalemeum's OWN data shows the vigil still winning
+ // that Sunday, an RG 33 gap on missalemeum's side, not lectio's --
+ // already identified and adjudicated in the primary source's favour
+ // by the sibling project (rules-register.md §6, "the romanus-vs-
+ // vigil-of-st-lawrence 9 August Sunday tie-break", M1).
+ date: "2026-08-09",
+ field: "rank+colour",
+ reason: "RG 33: a II/III-class vigil is omitted on any Sunday; missalemeum itself shows an RG 33 gap here (colitur rules-register.md §6, M1) -- lectio's Sunday-observed answer is the Missal-correct one",
+ },
+ {
+ // OPEN, not adjudicated by any primary text found so far. RG 91's
+ // plain table gives St Joseph (19 March, I class) the day outright
+ // over an ordinary III-class Friday of Passion Week -- no RG 96
+ // collision requiring a transfer -- yet missalemeum shows Joseph
+ // entirely displaced in 2027 specifically (the Friday's own office
+ // observed, the Seven Sorrows commemorated instead). The sibling
+ // project's much deeper primary-source pass over the SAME question
+ // left it explicitly open (colitur rules-register.md §6, M13: "three
+ // possibilities, none confirmed") rather than guess at an unfound
+ // rubric. Not attempted here either, for the same reason -- adjudicating
+ // it would mean finding a citation that a more thorough primary-source
+ // audit did not.
+ date: "2027-03-19",
+ field: "rank+colour",
+ reason: "unresolved even by primary-source review (colitur rules-register.md §6, M13); not adjudicated here either way",
+ },
+}
+
+func efAllowed(date string, day time.Time, oracle efOracleDay, field string) (bool, string) {
+ for _, a := range efAllowList {
+ if a.date != "" && a.date != date {
+ continue
+ }
+ if a.match != nil && !a.match(date, day, oracle) {
+ continue
+ }
+ if a.field == field || a.field == "rank+colour" {
+ return true, a.reason
+ }
+ }
+ return false, ""
+}
+
+// TestOracleEF diffs the EF engine against missalemeum (Divinum Officium data)
+// over 730 days (2026-01-01 .. 2027-12-31). Season, Rank and Colour are all
+// asserted strictly (membership for Colour, since missalemeum's colour is an
+// array); a prior version of this test asserted Season only, which is exactly
+// why several precedence/colour defects (see precedence_ef.go, temporal_ef.go)
+// shipped without ever failing a test.
func TestOracleEF(t *testing.T) {
raw, err := os.ReadFile("testdata/oracle-ef.json")
if err != nil {
@@ -85,8 +240,8 @@ func TestOracleEF(t *testing.T) {
}
sort.Strings(dates)
- var seasonMiss, skipped, total int
- shown := 0
+ var seasonMiss, rankMiss, colourMiss, rankAllowed, colourAllowed, skipped, total int
+ shownSeason, shownRank, shownColour := 0, 0, 0
for _, date := range dates {
od := oracle[date]
src := od.Tempora
@@ -95,22 +250,92 @@ func TestOracleEF(t *testing.T) {
}
day, _ := time.Parse("2006-01-02", date)
want := efSeasonFromString(src, int(day.Month()))
- if want == "" {
- skipped++
- continue
- }
total++
got := calendar.Compute(day.UTC(), sel, layers)
- if got.Season != want {
+
+ // An unrecognised season phrase skips the SEASON comparison only --
+ // it must not also skip Rank/Colour for that day. A `continue` here
+ // once did exactly that, silently zeroing oracle coverage for every
+ // day whose phrase efSeasonFromString doesn't recognise (Holy
+ // Thursday -- "maundy"/"holy week" don't match "Holy Thursday"
+ // itself; the six September Ember days -- no "ember" case exists at
+ // all, only Advent/Lent Ember days pass by an incidental substring
+ // match on "advent"/"lent"). Reverting the Holy Thursday colour fix
+ // (temporal_ef.go) left this test green under the old `continue`;
+ // it does not under this one.
+ if want == "" {
+ skipped++
+ } else if got.Season != want {
seasonMiss++
- if shown < 25 {
+ if shownSeason < 40 {
t.Errorf("%s: EF season got %q want %q (from %q)", date, got.Season, want, src)
- shown++
+ shownSeason++
+ }
+ }
+
+ wantRank, rankKnown := efRankNumbers[od.Rank]
+ if rankKnown && got.Observed.Rank != wantRank {
+ if ok, reason := efAllowed(date, day, od, "rank"); ok {
+ rankAllowed++
+ t.Logf("[allow-listed] %s: EF rank got %q want %q — %s", date, got.Observed.Rank, wantRank, reason)
+ } else {
+ rankMiss++
+ if shownRank < 40 {
+ t.Errorf("%s: EF rank got %q want %q (oracle rank %d, title %q)",
+ date, got.Observed.Rank, wantRank, od.Rank, od.Title)
+ shownRank++
+ }
+ }
+ }
+
+ colourOK := false
+ for _, c := range od.Colours {
+ if efColourLetters[c] == got.Colour {
+ colourOK = true
+ break
+ }
+ }
+ // Membership alone cannot catch a Rose regression: violet is a
+ // member of every rose/violet pair by construction (Gaudete/
+ // Laetare), so "got violet, want one of [rose violet]" passes even
+ // if RG 131's Rose support (temporal_ef.go) were reverted entirely.
+ // On the day the rose/violet pair actually names -- oracle rank 1,
+ // the Sunday itself, not a weekday reusing its propers (which
+ // carries a lower rank and is deliberately membership-only, this
+ // file's own doc comment item 3) -- a colour set containing rose
+ // demands rose specifically, not merely "some member".
+ if colourOK && od.Rank == 1 && got.Colour != calendar.Rose {
+ for _, c := range od.Colours {
+ if c == "p" {
+ colourOK = false
+ break
+ }
+ }
+ }
+ if !colourOK && len(od.Colours) > 0 {
+ if ok, reason := efAllowed(date, day, od, "colour"); ok {
+ colourAllowed++
+ t.Logf("[allow-listed] %s: EF colour got %q want one of %v — %s", date, got.Colour, od.Colours, reason)
+ } else {
+ colourMiss++
+ if shownColour < 40 {
+ t.Errorf("%s: EF colour got %q want one of %v (title %q)",
+ date, got.Colour, od.Colours, od.Title)
+ shownColour++
+ }
}
}
}
- t.Logf("EF oracle: %d checked, %d skipped(unmapped), %d season mismatches", total, skipped, seasonMiss)
+ t.Logf("EF oracle: %d checked, %d skipped(unmapped), %d season mismatches, "+
+ "%d rank mismatches (%d allow-listed), %d colour mismatches (%d allow-listed)",
+ total, skipped, seasonMiss, rankMiss, rankAllowed, colourMiss, colourAllowed)
if seasonMiss > 0 {
t.Fatalf("%d/%d EF season mismatches vs missalemeum — temporalEF is wrong", seasonMiss, total)
}
+ if rankMiss > 0 {
+ t.Fatalf("%d/%d EF rank mismatches vs missalemeum (not allow-listed)", rankMiss, total)
+ }
+ if colourMiss > 0 {
+ t.Fatalf("%d/%d EF colour mismatches vs missalemeum (not allow-listed)", colourMiss, total)
+ }
}
diff --git a/internal/calendar/precedence_ef.go b/internal/calendar/precedence_ef.go
index 4fda626..9f5016f 100644
--- a/internal/calendar/precedence_ef.go
+++ b/internal/calendar/precedence_ef.go
@@ -1,6 +1,9 @@
package calendar
-import "sort"
+import (
+ "sort"
+ "strings"
+)
// efRankOrder orders EF (1960) ranks: class-1 highest, then class-2..4,
// commemoration, ferial lowest.
@@ -22,34 +25,89 @@ func efRankOrder(r Rank) int {
}
// precedenceEF ranks an EF candidate for occurrence (lower = higher precedence):
-// by class first, then a tie-break at equal class (1960 occurrence table).
+// by class first, then a tie-break at equal class (RG 91's Table of
+// Precedence, read entry-by-entry within each class).
//
-// The tie-break is asymmetric by season. An ORDINARY feria (per annum, Advent,
-// Septuagesima) yields to an equal-class feast — the feast is celebrated and the
-// feria commemorated (e.g. St Francis Xavier, Dec 3, on an Advent feria). The
-// ferias of Lent and Passiontide are privileged: they outrank an equal-class
-// feast, which is only commemorated. Sundays and named temporal feasts likewise
-// win their ties. The *2 class spacing means the ±1 tie-break never crosses a
-// class boundary.
+// The tie-break is asymmetric by season AND, at class 2, by whether the
+// temporal day is a Sunday or a privileged FERIA:
+// - III/IV class: an ORDINARY feria (per annum, Advent to 16 Dec,
+// Septuagesima) yields to an equal-class feast (entries 24/25 above the
+// feria) -- the feast is celebrated, the feria commemorated (e.g. St
+// Francis Xavier, Dec 3). The ferias of Lent and Passiontide are
+// privileged (entry 22, ABOVE entry 24): they outrank an equal-class
+// feast, which is only commemorated.
+// - II class: an ordinary SUNDAY wins its tie (entry 15, above entry 16's
+// feasts) -- but a II-class privileged FERIA (the Ember days, the
+// late-Advent 17-23 Dec ferias, entry 18) sits BELOW entry 16 and yields
+// to an equal-class feast, the opposite of a Sunday's own tie. This is
+// the same table shape as III class's Advent/per-annum ferias, just
+// inverted for which II-class temporal days count as "privileged".
+// - I class: Sundays (entry 6) and I-class ferias (entry 7, Ash
+// Wednesday/Holy Week) both sit above entry 11's feasts, so they always
+// win -- there is no I-class "ordinary feria yields" case at all.
+//
+// The *2 class spacing means the ±1 tie-break never crosses a class boundary.
func precedenceEF(c candidate) int {
p := (6 - efRankOrder(c.Cel.Rank)) * 2 // class-1 -> 2, ferial -> 12
if c.Temporal {
- ordinaryFeria := (c.Cel.Rank == RankClass3 || c.Cel.Rank == RankClass4) &&
- c.Season != Lent && c.Season != Passiontide
- if ordinaryFeria {
- p++ // an ordinary feria yields to an equal-class feast
+ yieldsToFeast := false
+ switch c.Cel.Rank {
+ case RankClass3, RankClass4:
+ yieldsToFeast = c.Season != Lent && c.Season != Passiontide
+ case RankClass2:
+ // A II-class Sunday (entry 15) wins; a II-class privileged feria --
+ // Ember days, the late-Advent 17-23 Dec ferias (entry 18) -- yields
+ // to an equal-class feast (entry 16), e.g. St Matthew (21 Sep)
+ // beating the September Ember Wednesday, or St Thomas (21 Dec)
+ // beating an Advent late feria.
+ yieldsToFeast = !c.Sunday
+ }
+ if yieldsToFeast {
+ p++
} else {
- p-- // Sundays, named feasts, and penitential ferias win their ties
+ p-- // Sundays, I-class ferias, and penitential (Lent/Passiontide) ferias win their ties
}
} else if c.Cel.Class == ClassLord && c.Cel.Rank == RankClass2 {
// A II class feast of the Lord takes the place of a II class Sunday it
// falls on (unlike a saint's feast, which is only commemorated). Give it
// the edge over the Sunday's tie-break bonus.
p -= 2
+ } else if c.Cel.Rank == RankClass1 && beatsClass1Sunday(c.Cel.Slug) {
+ // RG 91 entries 4 (Immaculate Conception, Assumption BVM) and 5
+ // (Vigil & Octave day of the Nativity) both sit ABOVE entry 6
+ // (Sundays of Advent/Lent/Passiontide, Low Sunday) -- unlike an
+ // ORDINARY I-class feast (entry 11, e.g. St Joseph, the Precious
+ // Blood), which yields to a I-class Sunday, these win the tie.
+ // Found while verifying defect 4 (Sunday ranks): before that fix,
+ // Advent/Lent Sundays were wrongly II class, so these feasts beat
+ // them outright on base class alone, accidentally right; once
+ // Sundays became I class the tie-break mattered, and without this
+ // branch the Sunday would wrongly win. Two live cases in the fixed
+ // calendar: the Immaculate Conception (8 December) on an Advent
+ // Sunday, and the Vigil of Christmas (24 December) on Advent IV --
+ // the latter is not merely a wrong winner but a WORSE bug without
+ // this branch: transferIfImpededEF has no way to re-place a
+ // transfer that crosses the Dec31/Jan1 boundary (celebrationDate
+ // re-resolves a fixed date using the YEAR OF THE DAY BEING QUERIED,
+ // so a walk landing in January of the following year can never
+ // match the query that produced it), so the Vigil simply vanished
+ // for the year instead of landing on the wrong day. The Assumption
+ // (15 August) never falls in Advent or Lent, so its own share of
+ // this branch is citation-complete but not live.
+ p -= 2
}
return p
}
+// beatsClass1Sunday reports whether slug is one of RG 91's entries 4 or 5 --
+// the Immaculate Conception, the Assumption, or the Vigil of Christmas --
+// all of which sit above entry 6's Sundays in the Table of Precedence.
+func beatsClass1Sunday(slug string) bool {
+ return strings.Contains(slug, "immaculate-conception") ||
+ strings.Contains(slug, "assumption-of-the-blessed-virgin-mary") ||
+ slug == "vigil-of-christmas"
+}
+
// pickEF returns the observed EF celebration and the commemorations, ordered
// deterministically by precedence then slug.
func pickEF(cands []candidate) (candidate, []candidate) {
diff --git a/internal/calendar/precedence_ef_repro_test.go b/internal/calendar/precedence_ef_repro_test.go
new file mode 100644
index 0000000..11fd6ca
--- /dev/null
+++ b/internal/calendar/precedence_ef_repro_test.go
@@ -0,0 +1,160 @@
+package calendar_test
+
+// Reproduction tests for three named EF precedence defects (colitur's
+// differential/oracle audit against lectio's ~66-line EF precedence
+// approximation, internal/calendar/precedence_ef.go). Each test fails before
+// its fix and passes after -- see the report for the exact pre-fix failure
+// message. These exercise the REAL tridentine sanctoral data
+// (caldata.Tridentine()) through the public Compute entry point, since the
+// bugs are about how real fixed-date feasts interact with the temporal
+// calendar, not about precedenceEF's arithmetic in isolation (that is
+// covered separately, package-internal, in precedence_ef_test.go).
+
+import (
+ "testing"
+ "time"
+
+ "github.com/lukaszkasprzak/lectio/internal/caldata"
+ "github.com/lukaszkasprzak/lectio/internal/calendar"
+)
+
+func efCompute(date string) calendar.LiturgicalDay {
+ sel := calendar.DefaultSelection()
+ sel.Form = "old"
+ d, _ := time.Parse("2006-01-02", date)
+ return calendar.Compute(d.UTC(), sel, []calendar.Layer{caldata.Tridentine()})
+}
+
+// TestJosephYieldsToSundayOfLent: RG 91 entry 6 (Sundays of Lent, I class)
+// vs entry 11 (I-class feasts of the universal Church not above) -- the
+// Sunday holds; St Joseph (19 March) transfers to the next free day (RG 95,
+// RG 96), landing on the 20th. Before the fix (defect 4: Sunday ranks), Lent
+// Sundays were wrongly II class, so Joseph (I class) won outright every time
+// this collision occurred.
+func TestJosephYieldsToSundayOfLent(t *testing.T) {
+ for _, year := range []string{"2006", "2017", "2023", "2028", "2034", "2045"} {
+ sunday := efCompute(year + "-03-19")
+ if sunday.Observed.Slug == "joseph-spouse-of-the-bl-virgin-mary" {
+ t.Errorf("%s-03-19 observed = %q want the Lent Sunday (RG 91 entry 6 beats entry 11)", year, sunday.Observed.Slug)
+ }
+ next := efCompute(year + "-03-20")
+ if next.Observed.Slug != "joseph-spouse-of-the-bl-virgin-mary" {
+ t.Errorf("%s-03-20 observed = %q want joseph-spouse-of-the-bl-virgin-mary (transferred one day, RG 96)", year, next.Observed.Slug)
+ }
+ }
+}
+
+// TestTransferSkipsBothIAndIIClass: RG 96 -- an impeded I-class feast
+// transfers to the next day that is NOT ITSELF I OR II CLASS (not merely "not
+// I class"). 2011: the Sacred Heart (Friday after the Corpus Christi octave)
+// falls on 1 July and impedes the Precious Blood (also 1 July, fixed). 2
+// July is the Visitation (II class, fixed); 3 July is an ordinary II-class
+// Sunday. Both must be skipped; the Precious Blood lands on 4 July, and the
+// Visitation is observed, undisplaced, on its own day.
+func TestTransferSkipsBothIAndIIClass(t *testing.T) {
+ if got := efCompute("2011-07-01").Observed.Slug; got != "ef-sacred-heart" {
+ t.Fatalf("2011-07-01 observed = %q want ef-sacred-heart", got)
+ }
+ if got := efCompute("2011-07-02").Observed.Slug; got != "visitation-of-the-blessed-virgin-mary" {
+ t.Errorf("2011-07-02 observed = %q want visitation-of-the-blessed-virgin-mary (RG 96: the Precious Blood must skip past it, not displace it)", got)
+ }
+ if got := efCompute("2011-07-03").Observed.Slug; got != "ef-time-after-pentecost-sunday-3" {
+ t.Errorf("2011-07-03 observed = %q want ef-time-after-pentecost-sunday-3 (an ordinary II-class Sunday also blocks a I-class transfer)", got)
+ }
+ if got := efCompute("2011-07-04").Observed.Slug; got != "precious-blood-of-our-lord-jesus-christ" {
+ t.Errorf("2011-07-04 observed = %q want precious-blood-of-our-lord-jesus-christ (RG 96: first day that is neither I nor II class)", got)
+ }
+}
+
+// TestMatthewBeatsSeptemberEmberWednesday: RG 91 -- St Matthew (21 September,
+// II class) and the September Ember Wednesday are both II class; the table
+// decides the tie. Entry 16 (II-class feasts of the universal Church) sits
+// ABOVE entry 18 (II-class ferias, including the Ember days) -- the feast
+// wins, the Ember feria is only commemorated.
+func TestMatthewBeatsSeptemberEmberWednesday(t *testing.T) {
+ // 21 September falls on the September Ember Wednesday whenever the third
+ // Sunday of September is the 18th -- 2016 and 2022 both qualify.
+ for _, date := range []string{"2016-09-21", "2022-09-21"} {
+ day := efCompute(date)
+ if day.Observed.Slug != "matthew" {
+ t.Errorf("%s observed = %q want matthew (RG 91 entry 16 beats entry 18)", date, day.Observed.Slug)
+ }
+ }
+}
+
+// TestImmaculateConceptionBeatsAdventSunday: found, not named among the
+// seven, while verifying defect 4 (Sunday ranks) against the real sanctoral
+// data. RG 91 entry 4 (Immaculate Conception, Assumption BVM) sits ABOVE
+// entry 6 (Sundays of Advent/Lent/Passiontide) -- unlike an ORDINARY
+// I-class feast (entry 11, e.g. St Joseph), the Immaculate Conception
+// (8 December) is not impeded by the Advent Sunday it falls on at all. Before
+// defect 4's own fix, Advent Sundays were wrongly II class, so this was
+// accidentally right (I class beats II class outright); once Sundays became
+// I class the tie mattered for the first time.
+func TestImmaculateConceptionBeatsAdventSunday(t *testing.T) {
+ for _, year := range []string{"2013", "2019", "2024"} {
+ day := efCompute(year + "-12-08")
+ if day.Observed.Slug != "immaculate-conception-of-the-blessed-virgin-mary" {
+ t.Errorf("%s-12-08 observed = %q want immaculate-conception-of-the-blessed-virgin-mary (RG 91 entry 4 beats entry 6)", year, day.Observed.Slug)
+ }
+ }
+}
+
+// TestVigilOfChristmasSurvivesAdventSunday: found, not named among the
+// seven, while verifying defect 4 against the real sanctoral data -- and
+// worse than a wrong winner. RG 91 entry 5 (Vigil & Octave day of the
+// Nativity) also sits above entry 6, so the Vigil of Christmas (24 December)
+// is not impeded by falling on Advent IV either. Without this, defect 4
+// alone would have made the Advent Sunday win a genuine tie, sending the
+// Vigil into transferIfImpededEF's forward walk -- which has no way to
+// re-place a transfer that crosses the Dec31/Jan1 boundary (celebrationDate
+// re-resolves a fixed date using the year of whatever day is being queried,
+// so a walk landing in the following January can never match the query that
+// produced it). The Vigil did not move to the wrong day; it vanished for the
+// whole year.
+func TestVigilOfChristmasSurvivesAdventSunday(t *testing.T) {
+ for _, year := range []string{"2006", "2017", "2023", "2028"} {
+ day := efCompute(year + "-12-24")
+ if day.Observed.Slug != "vigil-of-christmas" {
+ t.Errorf("%s-12-24 observed = %q want vigil-of-christmas (RG 91 entry 5 beats entry 6; must not vanish)", year, day.Observed.Slug)
+ }
+ }
+}
+
+// TestPurificationBeatsFebruarySunday: the fixture behind classOf's own
+// Purification decision (scripts/gen-sanctoral-ef.go), committed here rather
+// than left as an assertion only, because the deciding years (2 February on
+// a Sunday: 2014, 2020, 2025, 2031, 2042, 2048) fall entirely outside this
+// repo's own missalemeum oracle snapshot (sources/snapshot.tar.gz,
+// 2026-01-01 .. 2027-12-31), so nothing else in this repository can
+// reproduce the evidence classOf's decision rests on. (2036, sometimes
+// quoted alongside 2025/2031 as a third example: 2 February 2036 is in fact
+// a SATURDAY, `date -d 2036-02-02 +%A` -- checked here rather than repeated;
+// 2042 is the correct next instance after 2031.)
+//
+// RG 91 entry 14 ("Festa Domini II classis") sits above entry 15
+// ("Dominicae II classis"), which sits above entry 16 ("Festa II classis
+// Ecclesiae universae, quae non [sunt Domini]") -- entry 14 takes an
+// occurring Sunday's place outright, entry 16 is merely commemorated on
+// one. The Purification (2 February) matches entry 14's pattern, not entry
+// 16's, independently fetched live from missalemeum for five different
+// Sundays: 2014-02-02, 2020-02-02, 2025-02-02, 2031-02-02, 2042-02-02 (all
+// "id":"sancti:02-02:2:w", "commemorations":[]). Control:
+// nativity-of-the-blessed-virgin-mary (8 September, an undisputed ordinary
+// Marian feast, entry 16's own pattern) on a Sunday -- 2019-09-08 -- shows
+// the SUNDAY observed, the feast commemorated instead: the opposite shape,
+// proving the Purification's own treatment is a deliberate pattern in the
+// oracle, not a gap. This is a decision AGAINST the calendarium's own title
+// ("IN PURIFICATIONE B. MARIAE VIRG.") and RG 120(b) (which files 2
+// February under the white-colour rule's "B. Mariae Virg." heading, kept
+// separate from 120(a)'s "Domini" heading) -- both point BVM; the
+// occurrence-behaviour evidence here points Domini. See classOf's own doc
+// comment for the fuller account; not re-argued here.
+func TestPurificationBeatsFebruarySunday(t *testing.T) {
+ for _, year := range []string{"2014", "2020", "2025", "2031", "2042"} {
+ day := efCompute(year + "-02-02")
+ if day.Observed.Slug != "purification-of-the-blessed-virgin-mary" {
+ t.Errorf("%s-02-02 observed = %q want purification-of-the-blessed-virgin-mary (RG 91 entry 14 beats entry 15)", year, day.Observed.Slug)
+ }
+ }
+}
diff --git a/internal/calendar/precedence_ef_test.go b/internal/calendar/precedence_ef_test.go
index 818b452..d5e254f 100644
--- a/internal/calendar/precedence_ef_test.go
+++ b/internal/calendar/precedence_ef_test.go
@@ -6,6 +6,14 @@ func efCand(rank Rank, temporal bool) candidate {
return candidate{Cel: Celebration{Rank: rank}, Temporal: temporal}
}
+// efTemporalCand builds a temporal candidate with the season/Sunday flags
+// precedenceEF's tie-break actually reads, so a test claiming to exercise
+// "a Sunday" or "a Lenten feria" genuinely sets those fields rather than
+// happening to pass for an unrelated reason (e.g. a class difference alone).
+func efTemporalCand(rank Rank, season Season, sunday bool) candidate {
+ return candidate{Cel: Celebration{Rank: rank}, Temporal: true, Season: season, Sunday: sunday}
+}
+
func TestPrecedenceEF(t *testing.T) {
c1 := efCand(RankClass1, false)
c3 := efCand(RankClass3, false)
@@ -14,16 +22,57 @@ func TestPrecedenceEF(t *testing.T) {
if !(precedenceEF(c1) < precedenceEF(c3) && precedenceEF(c3) < precedenceEF(c4) && precedenceEF(c4) < precedenceEF(comm)) {
t.Error("EF class ordering broken (class-1 > class-3 > class-4 > commemoration)")
}
- // at equal class, the temporal office wins.
- temp := efCand(RankClass2, true)
+ // a I-class feast beats a II-class Sunday (RG 91 entry 11 vs entry 15 --
+ // different classes, so this holds regardless of the tie-break, but the
+ // candidate is still marked Sunday so the test means what its name says).
+ sunday2 := efTemporalCand(RankClass2, TimeAfterPentecost, true)
+ feast1 := efCand(RankClass1, false)
+ obs, others := pickEF([]candidate{sunday2, feast1})
+ if obs.Cel.Rank != RankClass1 || len(others) != 1 {
+ t.Errorf("I-class feast should win over II-class Sunday, got %+v", obs.Cel)
+ }
+}
+
+// TestPrecedenceEFClass2SundayVsFeria: RG 91 entries 15/16/18 -- at class 2,
+// a SUNDAY wins its tie against an equal-class feast (entry 15 above 16), but
+// a privileged FERIA (the Ember days, the late-Advent 17-23 Dec ferias, entry
+// 18) YIELDS to one (entry 16 above 18) -- the opposite of the Sunday case.
+// This is defect 2's own witness: before the fix, precedenceEF treated every
+// non-ordinaryFeria temporal candidate the same way, so an Ember/late-Advent
+// feria wrongly won its tie exactly like a Sunday does.
+func TestPrecedenceEFClass2SundayVsFeria(t *testing.T) {
saint := efCand(RankClass2, false)
- obs, _ := pickEF([]candidate{saint, temp})
- if !obs.Temporal {
- t.Error("equal-class: temporal office should be observed")
+
+ sunday := efTemporalCand(RankClass2, TimeAfterPentecost, true)
+ obsSunday, _ := pickEF([]candidate{saint, sunday})
+ if !obsSunday.Temporal {
+ t.Errorf("a II-class Sunday should win its tie against an equal-class feast, got %+v observed", obsSunday.Cel)
}
- // a I-class feast beats a II-class Sunday.
- obs2, others := pickEF([]candidate{efCand(RankClass2, true), efCand(RankClass1, false)})
- if obs2.Cel.Rank != RankClass1 || len(others) != 1 {
- t.Errorf("I-class feast should win over II-class Sunday, got %+v", obs2.Cel)
+
+ emberFeria := efTemporalCand(RankClass2, TimeAfterPentecost, false) // e.g. the September Ember Wednesday
+ obsFeria, _ := pickEF([]candidate{saint, emberFeria})
+ if obsFeria.Temporal {
+ t.Errorf("a II-class privileged feria should yield its tie to an equal-class feast, got %+v observed (temporal)", obsFeria.Cel)
+ }
+}
+
+// TestPrecedenceEFClass3FeriaSeason: the pre-existing rule (unchanged by
+// defect 2's fix), stated explicitly rather than left implicit: an ORDINARY
+// III/IV-class feria (per annum, Advent to 16 Dec, Septuagesima) yields to an
+// equal-class feast; the ferias of Lent and Passiontide are privileged and
+// win instead.
+func TestPrecedenceEFClass3FeriaSeason(t *testing.T) {
+ saint := efCand(RankClass3, false)
+
+ ordinary := efTemporalCand(RankClass3, Advent, false)
+ obsOrdinary, _ := pickEF([]candidate{saint, ordinary})
+ if obsOrdinary.Temporal {
+ t.Errorf("an ordinary Advent feria should yield to an equal-class feast, got %+v observed (temporal)", obsOrdinary.Cel)
+ }
+
+ lenten := efTemporalCand(RankClass3, Lent, false)
+ obsLenten, _ := pickEF([]candidate{saint, lenten})
+ if !obsLenten.Temporal {
+ t.Errorf("a Lenten feria should win its tie against an equal-class feast, got %+v observed", obsLenten.Cel)
}
}
diff --git a/internal/calendar/temporal_ef.go b/internal/calendar/temporal_ef.go
index 7420ebd..c649405 100644
--- a/internal/calendar/temporal_ef.go
+++ b/internal/calendar/temporal_ef.go
@@ -74,6 +74,16 @@ func efCel(season Season, slug string, col Colour, rank Rank, week int) temporal
}
}
+// efSunday is efCel plus the Sunday flag, for the temporal candidates that
+// are actual Sundays -- precedenceEF's tie-break needs to tell a Sunday (RG
+// 91 entry 15, wins its tie) apart from an equal-class privileged FERIA
+// (entry 18, the Ember/late-Advent days, which yields).
+func efSunday(season Season, slug string, col Colour, rank Rank, week int) temporalDay {
+ day := efCel(season, slug, col, rank, week)
+ day.Sunday = true
+ return day
+}
+
// temporalEF computes the 1962 temporal identity of date. Season is exact
// (oracle-validated); ranks/weeks are best-effort for display.
func temporalEF(date time.Time) temporalDay {
@@ -87,6 +97,15 @@ func temporalEF(date time.Time) temporalDay {
if !date.Before(easter.AddDate(0, 0, 50)) && !date.After(easter.AddDate(0, 0, 55)) {
col = Red
}
+ // Holy Thursday (the Mass of Chrism and the Mass in Cena Domini) is white,
+ // a whole-Mass exception to Passiontide's violet -- RG 128(b)'s own named
+ // exception list, and RG 122 stating the same fact affirmatively in the
+ // White section. Good Friday and Holy Saturday, either side, are NOT
+ // exceptions here (RG 132's black for Good Friday's liturgical action is a
+ // separate, unmodelled gap -- see precedence_ef.go's doc comments).
+ if sameDay(date, easter.AddDate(0, 0, -3)) {
+ col = White
+ }
sun := date.Weekday() == time.Sunday
// Major feasts of the Lord (I class): nice titles + colour.
@@ -129,8 +148,20 @@ func temporalEF(date time.Time) temporalDay {
if sun {
week := efWeek(date, season, y, easter)
rank := RankClass2
- if season == Advent && sameDay(date, adventStart(y)) {
- rank = RankClass1 // 1st Sunday of Advent
+ sundayColour := col
+ if season == Advent || season == Lent {
+ // RG 11-12 / RG 91 entry 6: every Sunday of Advent and every Sunday
+ // of Lent is I class -- not only Advent I, the sole case previously
+ // handled (Passiontide's own two Sundays, Passion and Palm, are
+ // already I class via the named-feast switch above; Low Sunday
+ // likewise).
+ rank = RankClass1
+ switch {
+ case season == Advent && week == 3:
+ sundayColour = Rose // Gaudete -- RG 131, that Sunday's Office/Mass only
+ case season == Lent && week == 4:
+ sundayColour = Rose // Laetare -- RG 131, that Sunday's Office/Mass only
+ }
}
// Resumed Sundays after Pentecost (1960 Rubrics): when Easter is early
// there are more than 24 Sundays after Pentecost. The LAST Sunday before
@@ -140,17 +171,17 @@ func temporalEF(date time.Time) temporalDay {
if season == TimeAfterPentecost {
lastSun := adventStart(y).AddDate(0, 0, -7)
if sameDay(date, lastSun) {
- return efCel(TimeAfterPentecost, "ef-time-after-pentecost-sunday-24", col, rank, 24)
+ return efSunday(TimeAfterPentecost, "ef-time-after-pentecost-sunday-24", col, rank, 24)
}
if week > 23 {
p := daysBetween(easter.AddDate(0, 0, 49), lastSun) / 7 // total Sundays after Pentecost
e := week - p + 7 // resumed Sunday after Epiphany
// Season stays time-after-pentecost (calendrical); the Epiphany
// slug only routes the readings to the resumed Mass.
- return efCel(TimeAfterPentecost, "ef-time-after-epiphany-sunday-"+strconv.Itoa(e), Green, rank, e)
+ return efSunday(TimeAfterPentecost, "ef-time-after-epiphany-sunday-"+strconv.Itoa(e), Green, rank, e)
}
}
- return efCel(season, "ef-"+string(season)+"-sunday-"+strconv.Itoa(week), col, rank, week)
+ return efSunday(season, "ef-"+string(season)+"-sunday-"+strconv.Itoa(week), sundayColour, rank, week)
}
// The days between Ash Wednesday and the 1st Sunday of Lent have their own
// proper Masses (not part of a numbered Lenten week).
@@ -166,6 +197,17 @@ func temporalEF(date time.Time) temporalDay {
// saint (e.g. the Conversion of St Paul, Jan 25) displaces them.
rank = RankClass3
}
+ if season == Advent && date.Month() == time.December && date.Day() >= 17 && date.Day() <= 23 {
+ // RG 91 entry 18: the late-Advent ferias (17-23 Dec) are II class
+ // privileged ferias, not the ordinary III class of the rest of Advent.
+ rank = RankClass2
+ }
+ if season == Christmas && date.Month() == time.December && date.Day() >= 26 {
+ // RG 67/68: "Dies infra octavam sunt II classis" -- days within the
+ // Octave of the Nativity (26-31 Dec) are II class; the octave day
+ // itself (1 Jan) is I class, already handled above as a named feast.
+ rank = RankClass2
+ }
if efPrivilegedFeria(date, easter) {
// The days of Holy Week and the privileged octaves of Easter and
// Pentecost are I class; no saint's feast is admitted (the feast is
@@ -173,12 +215,11 @@ func temporalEF(date time.Time) temporalDay {
// the temporal office win, matching the 1962 occurrence rules.
rank = RankClass1
}
- // The Ember Days of September and Advent (Wednesday, Friday, Saturday after
- // the third Sunday of the month/season) are II class privileged ferias in
- // violet; they displace a III class saint (only commemorated). The Lenten
- // Ember days are already III class Lenten ferias, and the Whitsun Ember days
- // fall inside the I class Pentecost octave handled above.
- if es, ok := efEmberSlug(date, y); ok {
+ // The Ember Days of September, Advent and Lent (Wednesday, Friday, Saturday
+ // after the anchor Sunday) are II class privileged ferias in violet; they
+ // displace a III class saint (only commemorated) -- RG 91 entry 18. The
+ // Whitsun Ember days fall inside the I class Pentecost octave handled above.
+ if es, ok := efEmberSlug(date, y, easter); ok {
return efCel(season, es, Violet, RankClass2, week)
}
// Unique ferial slug (season-week-weekday) so proper ferias (Lent, Advent,
@@ -197,22 +238,26 @@ func thirdSundayOfSeptember(y int) time.Time {
}
// efEmberSlug returns the Ember-day slug for date, if it is an Ember Wednesday,
-// Friday or Saturday of September or Advent (the day after the third Sunday +
-// 3/5/6). Returns ("", false) otherwise.
-func efEmberSlug(date time.Time, y int) (string, bool) {
+// Friday or Saturday of September, Advent or Lent (the day after the anchor
+// Sunday + 3/5/6: the third Sunday of September, Advent III, or Lent I --
+// MR1962, "De anno et eius partibus", Quatuor Tempora). Returns ("", false)
+// otherwise. The Whitsun Ember days are not listed here: they fall inside the
+// I class Pentecost octave, handled separately by efPrivilegedFeria.
+func efEmberSlug(date time.Time, y int, easter time.Time) (string, bool) {
for _, e := range []struct {
- third time.Time
+ anchor time.Time
season string
}{
{thirdSundayOfSeptember(y), "september"},
{adventStart(y).AddDate(0, 0, 14), "advent"}, // 3rd Sunday of Advent
+ {easter.AddDate(0, 0, -42), "lent"}, // 1st Sunday of Lent
} {
switch {
- case sameDay(date, e.third.AddDate(0, 0, 3)):
+ case sameDay(date, e.anchor.AddDate(0, 0, 3)):
return "ef-" + e.season + "-ember-wed", true
- case sameDay(date, e.third.AddDate(0, 0, 5)):
+ case sameDay(date, e.anchor.AddDate(0, 0, 5)):
return "ef-" + e.season + "-ember-fri", true
- case sameDay(date, e.third.AddDate(0, 0, 6)):
+ case sameDay(date, e.anchor.AddDate(0, 0, 6)):
return "ef-" + e.season + "-ember-sat", true
}
}
diff --git a/internal/calendar/temporal_ef_test.go b/internal/calendar/temporal_ef_test.go
index 6d632e2..8b1ffa5 100644
--- a/internal/calendar/temporal_ef_test.go
+++ b/internal/calendar/temporal_ef_test.go
@@ -38,3 +38,95 @@ func TestTemporalEFChristTheKing(t *testing.T) {
t.Errorf("efChristTheKing(2025) = %s want 2025-10-26", got)
}
}
+
+// TestTemporalEFSundayRanks: RG 11-12 / RG 91 entry 6 -- Sundays of Advent,
+// Lent and Passiontide, and Low Sunday, are I class; all others (including
+// Septuagesima's own three Sundays and the ordinary Sundays after Epiphany/
+// Pentecost) stay II class. Before the fix, only Advent I was I class; every
+// other Advent/Lent Sunday was left at the generic-Sunday II-class default.
+func TestTemporalEFSundayRanks(t *testing.T) {
+ cases := []struct {
+ date string
+ want Rank
+ }{
+ {"2025-11-30", RankClass1}, // Advent I
+ {"2025-12-07", RankClass1}, // Advent II
+ {"2025-12-14", RankClass1}, // Advent III (Gaudete)
+ {"2025-12-21", RankClass1}, // Advent IV
+ {"2025-03-09", RankClass1}, // Lent I
+ {"2025-03-16", RankClass1}, // Lent II
+ {"2025-03-23", RankClass1}, // Lent III
+ {"2025-03-30", RankClass1}, // Lent IV (Laetare)
+ {"2025-04-06", RankClass1}, // Passion Sunday
+ {"2025-04-13", RankClass1}, // Palm Sunday
+ {"2025-04-27", RankClass1}, // Low Sunday
+ {"2025-02-16", RankClass2}, // Septuagesima Sunday -- NOT I class
+ {"2025-02-23", RankClass2}, // Sexagesima Sunday -- NOT I class
+ {"2025-03-02", RankClass2}, // Quinquagesima Sunday -- NOT I class
+ {"2025-06-22", RankClass2}, // II Sunday after Pentecost -- ordinary II class
+ }
+ for _, c := range cases {
+ got := temporalEF(d(c.date))
+ if got.Cel.Rank != c.want {
+ t.Errorf("temporalEF(%s).Cel.Rank = %s, want %s (%s)", c.date, got.Cel.Rank, c.want, got.Cel.Slug)
+ }
+ }
+}
+
+// TestTemporalEFRoseSundays: RG 131 -- rose is permitted on Gaudete (Advent
+// III) and Laetare (Lent IV), for that Sunday's own Office and Mass only.
+// Before the fix, efColour had no Rose case at all.
+func TestTemporalEFRoseSundays(t *testing.T) {
+ if got := temporalEF(d("2025-12-14")).Cel.Colour; got != Rose {
+ t.Errorf("Gaudete (2025-12-14) colour = %s, want rose", got)
+ }
+ if got := temporalEF(d("2025-03-30")).Cel.Colour; got != Rose {
+ t.Errorf("Laetare (2025-03-30) colour = %s, want rose", got)
+ }
+ // The Advent/Lent Sundays either side stay violet -- rose is an indult for
+ // that one Sunday, not a season colour.
+ if got := temporalEF(d("2025-12-07")).Cel.Colour; got != Violet {
+ t.Errorf("Advent II (2025-12-07) colour = %s, want violet", got)
+ }
+ if got := temporalEF(d("2025-03-23")).Cel.Colour; got != Violet {
+ t.Errorf("Lent III (2025-03-23) colour = %s, want violet", got)
+ }
+}
+
+// TestTemporalEFHolyThursdayColour: RG 128(b)/RG 122 -- Holy Thursday's Mass
+// of Chrism and Mass in Cena Domini are white, a whole-day exception to
+// Passiontide's violet. Good Friday and Holy Saturday, either side, stay
+// violet (their own black/no-colour exceptions are a separate, unmodelled
+// gap -- see RG 132, precedence_ef.go's own doc comments).
+func TestTemporalEFHolyThursdayColour(t *testing.T) {
+ easter := d("2025-04-20")
+ holyThu := easter.AddDate(0, 0, -3)
+ goodFri := easter.AddDate(0, 0, -2)
+ holySat := easter.AddDate(0, 0, -1)
+ if got := temporalEF(holyThu).Cel.Colour; got != White {
+ t.Errorf("Holy Thursday colour = %s, want white", got)
+ }
+ if got := temporalEF(goodFri).Cel.Colour; got != Violet {
+ t.Errorf("Good Friday colour = %s, want violet (unchanged)", got)
+ }
+ if got := temporalEF(holySat).Cel.Colour; got != Violet {
+ t.Errorf("Holy Saturday colour = %s, want violet (unchanged)", got)
+ }
+}
+
+// TestTemporalEFEmberDayRanks: RG 91 entry 18 -- the Ember days of Lent (and,
+// unchanged, September and Advent) are II-class privileged ferias, not the
+// ordinary III-class Lenten ferias around them. Before the fix, efEmberSlug
+// had no Lent case at all, so Lent's Ember Wed/Fri/Sat fell through to the
+// ordinary III-class Lenten-feria rank.
+func TestTemporalEFEmberDayRanks(t *testing.T) {
+ // Lent I Sunday 2025 = 2025-03-09; Ember Wed/Fri/Sat = +3/+5/+6.
+ lentI := d("2025-03-09")
+ for _, off := range []int{3, 5, 6} {
+ day := lentI.AddDate(0, 0, off)
+ got := temporalEF(day)
+ if got.Cel.Rank != RankClass2 {
+ t.Errorf("Lent Ember day %s rank = %s, want class-2 (%s)", day.Format("2006-01-02"), got.Cel.Rank, got.Cel.Slug)
+ }
+ }
+}
diff --git a/internal/calendar/testdata/oracle-ef.json b/internal/calendar/testdata/oracle-ef.json
index 3ddf10c..f857288 100644
--- a/internal/calendar/testdata/oracle-ef.json
+++ b/internal/calendar/testdata/oracle-ef.json
@@ -1,4382 +1,6586 @@
{
- "2025-01-01": {
+ "2026-01-01": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
"title": "Octave Day of Christmas",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-06": {
+ "2026-01-02": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
- "title": "Epiphany of the Lord",
- "rank": 1,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-01-10": {
+ "2026-01-03": {
+ "id": "commune:C10b:4:w",
"tempora": "",
- "title": "Feria",
+ "title": "II Mass of the B. V. M. – Vultum Tuum",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-07": {
+ "2026-01-04": {
+ "id": "tempora:Nat2-0:2:w",
+ "tempora": "",
+ "title": "Holy Name of Jesus",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-01-05": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-02": {
+ "2026-01-06": {
+ "id": "sancti:01-06:1:w",
+ "tempora": "",
+ "title": "Epiphany of the Lord",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-01-07": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-03": {
+ "2026-01-08": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-05": {
+ "2026-01-09": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
- "title": "Holy Name of Jesus",
- "rank": 2,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-01-09": {
+ "2026-01-10": {
+ "id": "commune:C10b:4:w",
"tempora": "",
- "title": "Feria",
+ "title": "II Mass of the B. V. M. – Vultum Tuum",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-12": {
+ "2026-01-11": {
+ "id": "tempora:Epi1-0:2:w",
"tempora": "",
"title": "The Holy Family: Jesus, Mary & Joseph",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-20": {
- "tempora": "Feria II after II Sunday after Epiphany",
- "title": "Sts. Fabian & Sebastian",
- "rank": 3,
- "colour": "r"
- },
- "2025-01-16": {
- "tempora": "Feria V after Epiphany",
- "title": "St. Marcellus I",
- "rank": 3,
- "colour": "r"
- },
- "2025-01-04": {
- "tempora": "",
- "title": "II Mass of the B. V. M. – Vultum Tuum",
+ "2026-01-12": {
+ "id": "tempora:Epi1-0a:2:w",
+ "tempora": "Feria II after Epiphany",
+ "title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-13": {
- "tempora": "Feria II after Epiphany",
+ "2026-01-13": {
+ "id": "sancti:01-13:2:w",
+ "tempora": "Feria III after Epiphany",
"title": "Commemoration of the Baptism of the Lord",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-19": {
- "tempora": "",
- "title": "II Sunday after Epiphany",
- "rank": 2,
- "colour": "g"
+ "2026-01-14": {
+ "id": "sancti:01-14:3:w",
+ "tempora": "Feria IV after Epiphany",
+ "title": "St. Hilary",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-01-08": {
- "tempora": "",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "2026-01-15": {
+ "id": "sancti:01-15:3:w",
+ "tempora": "Feria V after Epiphany",
+ "title": "St. Paul, the First Hermit",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-01-17": {
+ "2026-01-16": {
+ "id": "sancti:01-16:3:r",
"tempora": "Feria VI after Epiphany",
+ "title": "St. Marcellus I",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-01-17": {
+ "id": "sancti:01-17:3:w",
+ "tempora": "Saturday after Epiphany",
"title": "St. Anthony",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-26": {
+ "2026-01-18": {
+ "id": "tempora:Epi2-0:2:g",
"tempora": "",
- "title": "III Sunday after Epiphany",
+ "title": "II Sunday after Epiphany",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-01-25": {
- "tempora": "Saturday after II Sunday after Epiphany",
- "title": "Conversion of St. Paul",
- "rank": 3,
- "colour": "w"
- },
- "2025-01-11": {
- "tempora": "",
- "title": "II Mass of the B. V. M. – Vultum Tuum",
+ "2026-01-19": {
+ "id": "tempora:Epi2-0:2:g",
+ "tempora": "Feria II after II Sunday after Epiphany",
+ "title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2025-01-21": {
+ "2026-01-20": {
+ "id": "sancti:01-20:3:r",
"tempora": "Feria III after II Sunday after Epiphany",
- "title": "St. Agnes",
- "rank": 3,
- "colour": "r"
- },
- "2025-01-27": {
- "tempora": "Feria II after III Sunday after Epiphany",
- "title": "St. John Chrysostom",
+ "title": "Sts. Fabian & Sebastian",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-01-22": {
+ "2026-01-21": {
+ "id": "sancti:01-21:3:r",
"tempora": "Feria IV after II Sunday after Epiphany",
- "title": "Sts. Vincent & Anastasius",
- "rank": 3,
- "colour": "r"
- },
- "2025-01-14": {
- "tempora": "Feria III after Epiphany",
- "title": "St. Hilary",
- "rank": 3,
- "colour": "w"
- },
- "2025-01-31": {
- "tempora": "Feria VI after III Sunday after Epiphany",
- "title": "St. John Bosco",
+ "title": "St. Agnes",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-01-15": {
- "tempora": "Feria IV after Epiphany",
- "title": "St. Paul, the First Hermit",
+ "2026-01-22": {
+ "id": "sancti:01-22:3:r",
+ "tempora": "Feria V after II Sunday after Epiphany",
+ "title": "Sts. Vincent & Anastasius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-01-28": {
- "tempora": "Feria III after III Sunday after Epiphany",
- "title": "St. Peter Nolasco",
+ "2026-01-23": {
+ "id": "sancti:01-23:3:w",
+ "tempora": "Feria VI after II Sunday after Epiphany",
+ "title": "St. Raymond of Peñafort",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-01-24": {
- "tempora": "Feria VI after II Sunday after Epiphany",
+ "2026-01-24": {
+ "id": "sancti:01-24:3:r",
+ "tempora": "Saturday after II Sunday after Epiphany",
"title": "St. Timothy",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-01-18": {
- "tempora": "Saturday after Epiphany",
- "title": "II Mass of the B. V. M. – Vultum Tuum",
- "rank": 4,
- "colour": "w"
+ "2026-01-25": {
+ "id": "tempora:Epi3-0:2:g",
+ "tempora": "",
+ "title": "III Sunday after Epiphany",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-02-01": {
- "tempora": "Saturday after III Sunday after Epiphany",
- "title": "St. Ignatius of Antioch",
+ "2026-01-26": {
+ "id": "sancti:01-26:3:r",
+ "tempora": "Feria II after III Sunday after Epiphany",
+ "title": "St. Polycarp",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-01-29": {
- "tempora": "Feria IV after III Sunday after Epiphany",
- "title": "St. Francis de Sales",
+ "2026-01-27": {
+ "id": "sancti:01-27:3:w",
+ "tempora": "Feria III after III Sunday after Epiphany",
+ "title": "St. John Chrysostom",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-05": {
- "tempora": "Feria IV after IV Sunday after Epiphany",
- "title": "St. Agatha",
+ "2026-01-28": {
+ "id": "sancti:01-28:3:w",
+ "tempora": "Feria IV after III Sunday after Epiphany",
+ "title": "St. Peter Nolasco",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-09": {
- "tempora": "",
- "title": "V Sunday after Epiphany",
- "rank": 2,
- "colour": "g"
- },
- "2025-02-03": {
- "tempora": "Feria II after IV Sunday after Epiphany",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2025-02-07": {
- "tempora": "Feria VI after IV Sunday after Epiphany",
- "title": "St. Romuald",
+ "2026-01-29": {
+ "id": "sancti:01-29:3:w",
+ "tempora": "Feria V after III Sunday after Epiphany",
+ "title": "St. Francis de Sales",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-10": {
- "tempora": "Feria II after V Sunday after Epiphany",
- "title": "St. Scholastica",
+ "2026-01-30": {
+ "id": "sancti:01-30:3:r",
+ "tempora": "Feria VI after III Sunday after Epiphany",
+ "title": "St. Martina",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-02-11": {
- "tempora": "Feria III after V Sunday after Epiphany",
- "title": "Our Lady of Lourdes",
+ "2026-01-31": {
+ "id": "sancti:01-31:3:w",
+ "tempora": "Saturday after III Sunday after Epiphany",
+ "title": "St. John Bosco",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-16": {
+ "2026-02-01": {
+ "id": "tempora:Quadp1-0:2:v",
"tempora": "",
"title": "Septuagesima Sunday",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-02-13": {
- "tempora": "Feria V after V Sunday after Epiphany",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2025-02-02": {
- "tempora": "IV Sunday after Epiphany",
+ "2026-02-02": {
+ "id": "sancti:02-02:2:w",
+ "tempora": "Feria II after Septuagesima",
"title": "Purification of the Blessed Virgin Mary",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-12": {
- "tempora": "Feria IV after V Sunday after Epiphany",
- "title": "Seven Holy Servite Founders",
- "rank": 3,
- "colour": "w"
+ "2026-02-03": {
+ "id": "tempora:Quadp1-0:2:v",
+ "tempora": "Feria III after Septuagesima",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "v"
+ ]
},
- "2025-02-04": {
- "tempora": "Feria III after IV Sunday after Epiphany",
+ "2026-02-04": {
+ "id": "sancti:02-04:3:w",
+ "tempora": "Feria IV after Septuagesima",
"title": "St. Andrew Corsini",
"rank": 3,
- "colour": "w"
- },
- "2025-01-30": {
- "tempora": "Feria V after III Sunday after Epiphany",
- "title": "St. Martina",
- "rank": 3,
- "colour": "r"
- },
- "2025-01-23": {
- "tempora": "Feria V after II Sunday after Epiphany",
- "title": "St. Raymond of Peñafort",
- "rank": 3,
- "colour": "w"
- },
- "2025-02-17": {
- "tempora": "Feria II after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-20": {
+ "2026-02-05": {
+ "id": "sancti:02-05:3:r",
"tempora": "Feria V after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
- },
- "2025-02-19": {
- "tempora": "Feria IV after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "title": "St. Agatha",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-02-21": {
+ "2026-02-06": {
+ "id": "sancti:02-06:3:w",
"tempora": "Feria VI after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "title": "St. Titus",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-02-14": {
- "tempora": "Feria VI after V Sunday after Epiphany",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2026-02-07": {
+ "id": "sancti:02-07:3:w",
+ "tempora": "Saturday after Septuagesima",
+ "title": "St. Romuald",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-02-23": {
+ "2026-02-08": {
+ "id": "tempora:Quadp2-0:2:v",
"tempora": "",
"title": "Sexagesima Sunday",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-02-08": {
- "tempora": "Saturday after IV Sunday after Epiphany",
- "title": "St. John of Matha",
- "rank": 3,
- "colour": "w"
- },
- "2025-02-06": {
- "tempora": "Feria V after IV Sunday after Epiphany",
- "title": "St. Titus",
+ "2026-02-09": {
+ "id": "sancti:02-09:3:w",
+ "tempora": "Feria II after Sexagesima",
+ "title": "St. Cyril of Alexandria",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-25": {
+ "2026-02-10": {
+ "id": "sancti:02-10:3:w",
"tempora": "Feria III after Sexagesimæ",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
- },
- "2025-03-05": {
- "tempora": "",
- "title": "Ash Wednesday",
- "rank": 1,
- "colour": "v"
- },
- "2025-02-24": {
- "tempora": "Feria II after Sexagesima",
- "title": "St. Matthias",
- "rank": 2,
- "colour": "r"
+ "title": "St. Scholastica",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-02-26": {
+ "2026-02-11": {
+ "id": "sancti:02-11:3:w",
"tempora": "Feria IV after Sexagesimæ",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "title": "Our Lady of Lourdes",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-02-27": {
+ "2026-02-12": {
+ "id": "sancti:02-12:3:w",
"tempora": "Feria V after Sexagesimæ",
- "title": "St. Gabriel of Our Lady of Sorrows",
+ "title": "Seven Holy Servite Founders",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-02-28": {
+ "2026-02-13": {
+ "id": "tempora:Quadp2-0:2:v",
"tempora": "Feria VI after Sexagesimæ",
"title": "Feria",
"rank": 4,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-02-22": {
- "tempora": "Saturday after Septuagesima",
- "title": "Chair of St. Peter",
+ "2026-02-14": {
+ "id": "commune:C10c:4:w",
+ "tempora": "Saturday after Sexagesimæ",
+ "title": "III Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-02-15": {
+ "id": "tempora:Quadp3-0:2:v",
+ "tempora": "",
+ "title": "Quinquagesima Sunday",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-03": {
+ "2026-02-16": {
+ "id": "tempora:Quadp3-0:2:v",
"tempora": "Feria II after Quinquagesima",
"title": "Feria",
"rank": 4,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-02-17": {
+ "id": "tempora:Quadp3-0:2:v",
+ "tempora": "Feria III after Quinquagesima",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-02": {
+ "2026-02-18": {
+ "id": "tempora:Quadp3-3:1:v",
"tempora": "",
- "title": "Quinquagesima Sunday",
- "rank": 2,
- "colour": "v"
+ "title": "Ash Wednesday",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-13": {
+ "2026-02-19": {
+ "id": "tempora:Quadp3-4:3:v",
"tempora": "",
- "title": "Feria V after the I Sunday of Lent",
+ "title": "Feria V after Ash Wednesday",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-11": {
+ "2026-02-20": {
+ "id": "tempora:Quadp3-5:3:v",
"tempora": "",
- "title": "Feria III after the I Sunday of Lent",
+ "title": "Feria VI after Ash Wednesday",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-09": {
+ "2026-02-21": {
+ "id": "tempora:Quadp3-6:3:v",
+ "tempora": "",
+ "title": "Saturday after Ash Wednesday",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-02-22": {
+ "id": "tempora:Quad1-0:1:v",
"tempora": "",
"title": "I Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-06": {
+ "2026-02-23": {
+ "id": "tempora:Quad1-1:3:v",
"tempora": "",
- "title": "Feria V after Ash Wednesday",
+ "title": "Feria II after the I Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-02-15": {
- "tempora": "Saturday after V Sunday after Epiphany",
- "title": "III Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2026-02-24": {
+ "id": "sancti:02-24:2:r",
+ "tempora": "Feria III after the I Sunday of Lent",
+ "title": "St. Matthias",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2025-02-18": {
- "tempora": "Feria III after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "2026-02-25": {
+ "id": "tempora:Quad1-3:2:v",
+ "tempora": "",
+ "title": "Ember Wednesday of Lent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-02-26": {
+ "id": "tempora:Quad1-4:3:v",
+ "tempora": "",
+ "title": "Feria V after the I Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-14": {
+ "2026-02-27": {
+ "id": "tempora:Quad1-5:2:v",
"tempora": "",
"title": "Ember Friday of Lent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-16": {
+ "2026-02-28": {
+ "id": "tempora:Quad1-6:2:v",
+ "tempora": "",
+ "title": "Ember Saturday of Lent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-03-01": {
+ "id": "tempora:Quad2-0:1:v",
"tempora": "",
"title": "II Sunday of Lent",
"rank": 1,
- "colour": "v"
- },
- "2025-03-01": {
- "tempora": "Saturday after Sexagesimæ",
- "title": "III Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-12": {
+ "2026-03-02": {
+ "id": "tempora:Quad2-1:3:v",
"tempora": "",
- "title": "Ember Wednesday of Lent",
- "rank": 2,
- "colour": "v"
+ "title": "Feria II after the II Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-07": {
+ "2026-03-03": {
+ "id": "tempora:Quad2-2:3:v",
"tempora": "",
- "title": "Feria VI after Ash Wednesday",
+ "title": "Feria III after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-10": {
+ "2026-03-04": {
+ "id": "tempora:Quad2-3:3:v",
"tempora": "",
- "title": "Feria II after the I Sunday of Lent",
+ "title": "Feria IV after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-20": {
+ "2026-03-05": {
+ "id": "tempora:Quad2-4:3:v",
"tempora": "",
"title": "Feria V after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-04": {
- "tempora": "Feria III after Quinquagesima",
- "title": "St. Casimir",
+ "2026-03-06": {
+ "id": "tempora:Quad2-5:3:v",
+ "tempora": "",
+ "title": "Feria VI after the II Sunday of Lent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-22": {
+ "2026-03-07": {
+ "id": "tempora:Quad2-6:3:v",
"tempora": "",
"title": "Saturday after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-23": {
+ "2026-03-08": {
+ "id": "tempora:Quad3-0:1:v",
"tempora": "",
"title": "III Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-08": {
+ "2026-03-09": {
+ "id": "tempora:Quad3-1:3:v",
"tempora": "",
- "title": "Saturday after Ash Wednesday",
+ "title": "Feria II after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-26": {
+ "2026-03-10": {
+ "id": "tempora:Quad3-2:3:v",
"tempora": "",
- "title": "Feria IV after the III Sunday of Lent",
+ "title": "Feria III after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-30": {
+ "2026-03-11": {
+ "id": "tempora:Quad3-3:3:v",
"tempora": "",
- "title": "IV Sunday of Lent",
- "rank": 1,
- "colour": "pv"
+ "title": "Feria IV after the III Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-18": {
+ "2026-03-12": {
+ "id": "tempora:Quad3-4:3:v",
"tempora": "",
- "title": "Feria III after the II Sunday of Lent",
+ "title": "Feria V after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-19": {
- "tempora": "Feria IV after the II Sunday of Lent",
- "title": "St. Joseph, Spouse of the Bl. Virgin Mary",
- "rank": 1,
- "colour": "w"
- },
- "2025-03-15": {
+ "2026-03-13": {
+ "id": "tempora:Quad3-5:3:v",
"tempora": "",
- "title": "Ember Saturday of Lent",
- "rank": 2,
- "colour": "v"
+ "title": "Feria VI after the III Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2025-03-29": {
+ "2026-03-14": {
+ "id": "tempora:Quad3-6:3:v",
"tempora": "",
"title": "Saturday after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
- },
- "2025-03-25": {
- "tempora": "Feria III after the III Sunday of Lent",
- "title": "Annunciation of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-06": {
+ "2026-03-15": {
+ "id": "tempora:Quad4-0:1:pv",
"tempora": "",
- "title": "Passion Sunday",
+ "title": "IV Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2025-03-31": {
+ "2026-03-16": {
+ "id": "tempora:Quad4-1:3:v",
"tempora": "",
"title": "Feria II after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-01": {
+ "2026-03-17": {
+ "id": "tempora:Quad4-2:3:v",
"tempora": "",
"title": "Feria III after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-28": {
+ "2026-03-18": {
+ "id": "tempora:Quad4-3:3:v",
"tempora": "",
- "title": "Feria VI after the III Sunday of Lent",
+ "title": "Feria IV after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-24": {
- "tempora": "",
- "title": "Feria II after the III Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "2026-03-19": {
+ "id": "sancti:03-19:1:w",
+ "tempora": "Feria V after the IV Sunday of Lent",
+ "title": "St. Joseph, Spouse of the Bl. Virgin Mary",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-03-21": {
+ "2026-03-20": {
+ "id": "tempora:Quad4-5:3:v",
"tempora": "",
- "title": "Feria VI after the II Sunday of Lent",
+ "title": "Feria VI after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-03": {
+ "2026-03-21": {
+ "id": "tempora:Quad4-6:3:v",
"tempora": "",
- "title": "Feria V after the IV Sunday of Lent",
+ "title": "Saturday after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-13": {
+ "2026-03-22": {
+ "id": "tempora:Quad5-0:1:v",
"tempora": "",
- "title": "Palm Sunday",
+ "title": "Passion Sunday",
"rank": 1,
- "colour": "rv"
+ "colours": [
+ "v"
+ ]
},
- "2025-03-27": {
+ "2026-03-23": {
+ "id": "tempora:Quad5-1:3:v",
"tempora": "",
- "title": "Feria V after the III Sunday of Lent",
+ "title": "Feria II of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-08": {
+ "2026-03-24": {
+ "id": "tempora:Quad5-2:3:v",
"tempora": "",
"title": "Feria III of Passion Week",
"rank": 3,
- "colour": "v"
- },
- "2025-03-17": {
- "tempora": "",
- "title": "Feria II after the II Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-12": {
- "tempora": "",
- "title": "Saturday of Passion Week",
- "rank": 3,
- "colour": "v"
+ "2026-03-25": {
+ "id": "sancti:03-25:1:w",
+ "tempora": "Feria IV of Passion Week",
+ "title": "Annunciation of the Blessed Virgin Mary",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-04-10": {
+ "2026-03-26": {
+ "id": "tempora:Quad5-4:3:v",
"tempora": "",
"title": "Feria V of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-07": {
+ "2026-03-27": {
+ "id": "tempora:Quad5-5Feria:3:v",
"tempora": "",
- "title": "Feria II of Passion Week",
+ "title": "Feria VI of Passion Week",
"rank": 3,
- "colour": "v"
- },
- "2025-04-20": {
- "tempora": "",
- "title": "Easter Sunday",
- "rank": 1,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-09": {
+ "2026-03-28": {
+ "id": "tempora:Quad5-6:3:v",
"tempora": "",
- "title": "Feria IV of Passion Week",
+ "title": "Saturday of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-17": {
+ "2026-03-29": {
+ "id": "tempora:Quad6-0r:1:rv",
"tempora": "",
- "title": "Holy Thursday",
+ "title": "Palm Sunday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "r",
+ "v"
+ ]
},
- "2025-04-14": {
+ "2026-03-30": {
+ "id": "tempora:Quad6-1:1:v",
"tempora": "",
"title": "Feria II of Holy Week",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-04-02": {
+ "2026-03-31": {
+ "id": "tempora:Quad6-2:1:v",
"tempora": "",
- "title": "Feria IV after the IV Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "title": "Feria III of Holy Week",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2025-04-11": {
+ "2026-04-01": {
+ "id": "tempora:Quad6-3:1:v",
"tempora": "",
- "title": "Feria VI of Passion Week",
- "rank": 3,
- "colour": "v"
+ "title": "Feria IV of Holy Week",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2025-04-22": {
+ "2026-04-02": {
+ "id": "tempora:Quad6-4r:1:w",
"tempora": "",
- "title": "Tuesday in the Octave of Easter",
+ "title": "Holy Thursday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-18": {
+ "2026-04-03": {
+ "id": "tempora:Quad6-5r:1:bv",
"tempora": "",
"title": "Good Friday",
"rank": 1,
- "colour": "bv"
+ "colours": [
+ "b",
+ "v"
+ ]
},
- "2025-04-27": {
+ "2026-04-04": {
+ "id": "tempora:Quad6-6r:1:vw",
"tempora": "",
- "title": "Low Sunday",
+ "title": "Holy Saturday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "v",
+ "w"
+ ]
},
- "2025-04-25": {
+ "2026-04-05": {
+ "id": "tempora:Pasc0-0:1:w",
"tempora": "",
- "title": "Friday in the Octave of Easter",
+ "title": "Easter Sunday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-19": {
+ "2026-04-06": {
+ "id": "tempora:Pasc0-1:1:w",
"tempora": "",
- "title": "Holy Saturday",
+ "title": "Monday in the Octave of Easter",
"rank": 1,
- "colour": "vw"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-23": {
+ "2026-04-07": {
+ "id": "tempora:Pasc0-2:1:w",
"tempora": "",
- "title": "Wednesday in the Octave of Easter",
+ "title": "Tuesday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-21": {
+ "2026-04-08": {
+ "id": "tempora:Pasc0-3:1:w",
"tempora": "",
- "title": "Monday in the Octave of Easter",
+ "title": "Wednesday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-24": {
+ "2026-04-09": {
+ "id": "tempora:Pasc0-4:1:w",
"tempora": "",
"title": "Thursday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-28": {
- "tempora": "Monday after I Sunday after Easter",
- "title": "St. Paul of the Cross",
- "rank": 3,
- "colour": "w"
+ "2026-04-10": {
+ "id": "tempora:Pasc0-5:1:w",
+ "tempora": "",
+ "title": "Friday in the Octave of Easter",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-04-26": {
+ "2026-04-11": {
+ "id": "tempora:Pasc0-6:1:w",
"tempora": "",
"title": "Saturday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-04": {
+ "2026-04-12": {
+ "id": "tempora:Pasc1-0:1:w",
"tempora": "",
- "title": "Feria VI after the IV Sunday of Lent",
+ "title": "Low Sunday",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-04-13": {
+ "id": "sancti:04-13:3:r",
+ "tempora": "Monday after I Sunday after Easter",
+ "title": "St. Hermenegild",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "r"
+ ]
},
- "2025-05-04": {
- "tempora": "",
- "title": "II Sunday after Easter",
- "rank": 2,
- "colour": "w"
+ "2026-04-14": {
+ "id": "sancti:04-14:3:r",
+ "tempora": "Tuesday after I Sunday after Easter",
+ "title": "St. Justin",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-04-15": {
+ "id": "tempora:Pasc1-0:1:w",
+ "tempora": "Wednesday after I Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-01": {
+ "2026-04-16": {
+ "id": "tempora:Pasc1-0:1:w",
"tempora": "Thursday after I Sunday after Easter",
- "title": "St. Joseph the Workman",
- "rank": 1,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-02": {
+ "2026-04-17": {
+ "id": "tempora:Pasc1-0:1:w",
"tempora": "Friday after I Sunday after Easter",
- "title": "St. Athanasius",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-04-15": {
- "tempora": "",
- "title": "Feria III of Holy Week",
- "rank": 1,
- "colour": "v"
+ "2026-04-18": {
+ "id": "commune:C10Pasc:4:w",
+ "tempora": "Saturday after I Sunday after Easter",
+ "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-04-29": {
- "tempora": "Tuesday after I Sunday after Easter",
- "title": "St. Peter of Verona",
- "rank": 3,
- "colour": "r"
+ "2026-04-19": {
+ "id": "tempora:Pasc2-0:2:w",
+ "tempora": "",
+ "title": "II Sunday after Easter",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-08": {
- "tempora": "Thursday after II Sunday after Easter",
+ "2026-04-20": {
+ "id": "tempora:Pasc2-0:2:w",
+ "tempora": "Monday after II Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-06": {
+ "2026-04-21": {
+ "id": "sancti:04-21:3:w",
"tempora": "Tuesday after II Sunday after Easter",
+ "title": "St. Anselm",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-04-22": {
+ "id": "sancti:04-22:3:r",
+ "tempora": "Wednesday after II Sunday after Easter",
+ "title": "Sts. Soter & Caius",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-04-23": {
+ "id": "tempora:Pasc2-0:2:w",
+ "tempora": "Thursday after II Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-04-30": {
- "tempora": "Wednesday after I Sunday after Easter",
- "title": "St. Catherine of Siena",
+ "2026-04-24": {
+ "id": "sancti:04-24:3:r",
+ "tempora": "Friday after II Sunday after Easter",
+ "title": "St. Fidelis of Sigmaringen",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-04-05": {
- "tempora": "",
- "title": "Saturday after the IV Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "2026-04-25": {
+ "id": "sancti:04-25:2:r",
+ "tempora": "Saturday after II Sunday after Easter",
+ "title": "St. Mark",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2025-04-16": {
+ "2026-04-26": {
+ "id": "tempora:Pasc3-0r:2:w",
"tempora": "",
- "title": "Feria IV of Holy Week",
- "rank": 1,
- "colour": "v"
+ "title": "III Sunday after Easter",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-05": {
- "tempora": "Monday after II Sunday after Easter",
- "title": "St. Pius V",
+ "2026-04-27": {
+ "id": "sancti:04-27:3:w",
+ "tempora": "Monday after III Sunday after Easter",
+ "title": "St. Peter Canisius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-12": {
- "tempora": "Monday after III Sunday after Easter",
- "title": "Sts. Nereus, Achilleus, Domitilla, & Pancras",
+ "2026-04-28": {
+ "id": "sancti:04-28:3:w",
+ "tempora": "Tuesday after III Sunday after Easter",
+ "title": "St. Paul of the Cross",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-09": {
- "tempora": "Friday after II Sunday after Easter",
- "title": "St. Gregory of Nazianzen",
+ "2026-04-29": {
+ "id": "sancti:04-29:3:r",
+ "tempora": "Wednesday after III Sunday after Easter",
+ "title": "St. Peter of Verona",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-05-07": {
- "tempora": "Wednesday after II Sunday after Easter",
- "title": "St. Stanislaus",
+ "2026-04-30": {
+ "id": "sancti:04-30:3:w",
+ "tempora": "Thursday after III Sunday after Easter",
+ "title": "St. Catherine of Siena",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-13": {
- "tempora": "Tuesday after III Sunday after Easter",
- "title": "St. Robert Bellarmine",
+ "2026-05-01": {
+ "id": "sancti:05-01r:1:w",
+ "tempora": "Friday after III Sunday after Easter",
+ "title": "St. Joseph the Workman",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-05-02": {
+ "id": "sancti:05-02:3:w",
+ "tempora": "Saturday after III Sunday after Easter",
+ "title": "St. Athanasius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-18": {
+ "2026-05-03": {
+ "id": "tempora:Pasc4-0:2:w",
"tempora": "",
"title": "IV Sunday after Easter",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-11": {
- "tempora": "",
- "title": "III Sunday after Easter",
- "rank": 2,
- "colour": "w"
+ "2026-05-04": {
+ "id": "sancti:05-04:3:w",
+ "tempora": "Monday after IV Sunday after Easter",
+ "title": "St. Monica",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-22": {
- "tempora": "Thursday after IV Sunday after Easter",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "2026-05-05": {
+ "id": "sancti:05-05:3:w",
+ "tempora": "Tuesday after IV Sunday after Easter",
+ "title": "St. Pius V",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-21": {
+ "2026-05-06": {
+ "id": "tempora:Pasc4-0:2:w",
"tempora": "Wednesday after IV Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-03": {
- "tempora": "Saturday after I Sunday after Easter",
- "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2026-05-07": {
+ "id": "sancti:05-07:3:r",
+ "tempora": "Thursday after IV Sunday after Easter",
+ "title": "St. Stanislaus",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-05-23": {
+ "2026-05-08": {
+ "id": "tempora:Pasc4-0:2:w",
"tempora": "Friday after IV Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-14": {
- "tempora": "Wednesday after III Sunday after Easter",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "2026-05-09": {
+ "id": "sancti:05-09:3:w",
+ "tempora": "Saturday after IV Sunday after Easter",
+ "title": "St. Gregory of Nazianzen",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-29": {
+ "2026-05-10": {
+ "id": "tempora:Pasc5-0:2:w",
"tempora": "",
- "title": "Ascension of the Lord",
- "rank": 1,
- "colour": "w"
+ "title": "V Sunday after Easter",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-05-11": {
+ "id": "sancti:05-11r:2:r",
+ "tempora": "The Minor Litanies – Rogations",
+ "title": "Sts. Philip & James",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-05-12": {
+ "id": "sancti:05-12:3:r",
+ "tempora": "The Minor Litanies – Rogations",
+ "title": "Sts. Nereus, Achilleus, Domitilla, & Pancras",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-05-25": {
+ "2026-05-13": {
+ "id": "tempora:Pasc5-3:2:w",
"tempora": "",
- "title": "V Sunday after Easter",
+ "title": "Vigil of the Ascension",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-15": {
- "tempora": "Thursday after III Sunday after Easter",
+ "2026-05-14": {
+ "id": "tempora:Pasc5-4:1:w",
+ "tempora": "",
+ "title": "Ascension of the Lord",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-05-15": {
+ "id": "sancti:05-15:3:w",
+ "tempora": "Feria VI after the Ascension",
"title": "St. John Baptist de la Salle",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-17": {
- "tempora": "Saturday after III Sunday after Easter",
- "title": "St. Paschal Baylon",
- "rank": 3,
- "colour": "w"
+ "2026-05-16": {
+ "id": "commune:C10Pasc:4:w",
+ "tempora": "Saturday after the Ascension",
+ "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-20": {
- "tempora": "Tuesday after IV Sunday after Easter",
- "title": "St. Bernardine of Siena",
- "rank": 3,
- "colour": "w"
+ "2026-05-17": {
+ "id": "tempora:Pasc6-0:2:w",
+ "tempora": "",
+ "title": "Sunday after the Ascension",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2025-05-10": {
- "tempora": "Saturday after II Sunday after Easter",
- "title": "St. Antoninus",
+ "2026-05-18": {
+ "id": "sancti:05-18:3:r",
+ "tempora": "Feria II after the Ascension",
+ "title": "St. Venantius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-05-19": {
- "tempora": "Monday after IV Sunday after Easter",
+ "2026-05-19": {
+ "id": "sancti:05-19:3:w",
+ "tempora": "Feria III after the Ascension",
"title": "St. Peter Celestine",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-05-26": {
- "tempora": "The Minor Litanies – Rogations",
- "title": "St. Philip Neri",
+ "2026-05-20": {
+ "id": "sancti:05-20:3:w",
+ "tempora": "Feria IV after the Ascension",
+ "title": "St. Bernardine of Siena",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-01": {
- "tempora": "",
- "title": "Sunday after the Ascension",
- "rank": 2,
- "colour": "w"
- },
- "2025-05-30": {
- "tempora": "Feria VI after the Ascension",
+ "2026-05-21": {
+ "id": "tempora:Pasc6-0:2:w",
+ "tempora": "Feria V after the Ascension",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-08": {
- "tempora": "",
- "title": "Pentecost Sunday",
- "rank": 1,
- "colour": "r"
- },
- "2025-05-28": {
- "tempora": "",
- "title": "Vigil of the Ascension",
- "rank": 2,
- "colour": "w"
- },
- "2025-06-03": {
- "tempora": "Feria III after the Ascension",
+ "2026-05-22": {
+ "id": "tempora:Pasc6-0:2:w",
+ "tempora": "Feria VI after the Ascension",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-07": {
+ "2026-05-23": {
+ "id": "tempora:Pasc6-6:1:r",
"tempora": "",
"title": "Saturday after the Ascension",
"rank": 1,
- "colour": "r"
- },
- "2025-05-24": {
- "tempora": "Saturday after IV Sunday after Easter",
- "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
- },
- "2025-05-31": {
- "tempora": "Saturday after the Ascension",
- "title": "Queenship of the Blessed Virgin Mary",
- "rank": 2,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-05": {
- "tempora": "Feria V after the Ascension",
- "title": "St. Boniface",
- "rank": 3,
- "colour": "r"
- },
- "2025-06-09": {
+ "2026-05-24": {
+ "id": "tempora:Pasc7-0:1:r",
"tempora": "",
- "title": "Monday after Pentecost",
+ "title": "Pentecost Sunday",
"rank": 1,
- "colour": "r"
- },
- "2025-05-16": {
- "tempora": "Friday after III Sunday after Easter",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
- },
- "2025-06-04": {
- "tempora": "Feria IV after the Ascension",
- "title": "St. Francis Caracciolo",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-15": {
+ "2026-05-25": {
+ "id": "tempora:Pasc7-1:1:r",
"tempora": "",
- "title": "Trinity Sunday",
+ "title": "Monday after Pentecost",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-10": {
+ "2026-05-26": {
+ "id": "tempora:Pasc7-2:1:r",
"tempora": "",
"title": "Tuesday after Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-05-27": {
- "tempora": "The Minor Litanies – Rogations",
- "title": "St. Bede the Venerable",
- "rank": 3,
- "colour": "w"
+ "2026-05-27": {
+ "id": "tempora:Pasc7-3:1:r",
+ "tempora": "",
+ "title": "Ember Wednesday of Pentecost",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
},
- "2025-06-02": {
- "tempora": "Feria II after the Ascension",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "2026-05-28": {
+ "id": "tempora:Pasc7-4:1:r",
+ "tempora": "",
+ "title": "Thursday after Pentecost",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
},
- "2025-06-13": {
+ "2026-05-29": {
+ "id": "tempora:Pasc7-5:1:r",
"tempora": "",
"title": "Ember Friday of Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-12": {
+ "2026-05-30": {
+ "id": "tempora:Pasc7-6:1:r",
"tempora": "",
- "title": "Thursday after Pentecost",
+ "title": "Ember Saturday of Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-22": {
+ "2026-05-31": {
+ "id": "tempora:Pent01-0r:1:w",
"tempora": "",
- "title": "II Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "title": "Trinity Sunday",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-06-16": {
+ "2026-06-01": {
+ "id": "sancti:06-01:3:w",
"tempora": "Feria II after I Sunday after Pentecost",
+ "title": "St. Angela Merici",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-06-02": {
+ "id": "tempora:Pent01-0a:2:g",
+ "tempora": "Feria III after I Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-06-11": {
- "tempora": "",
- "title": "Ember Wednesday of Pentecost",
- "rank": 1,
- "colour": "r"
- },
- "2025-06-23": {
- "tempora": "Feria II after II Sunday after Pentecost",
- "title": "Vigil of the Nativity of St. John the Baptist",
- "rank": 2,
- "colour": "v"
+ "2026-06-03": {
+ "id": "tempora:Pent01-0a:2:g",
+ "tempora": "Feria IV after I Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-06-19": {
+ "2026-06-04": {
+ "id": "tempora:Pent01-4:1:w",
"tempora": "",
"title": "Corpus Christi",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-24": {
- "tempora": "Feria III after II Sunday after Pentecost",
- "title": "Nativity of St. John the Baptist",
- "rank": 1,
- "colour": "w"
- },
- "2025-06-21": {
- "tempora": "Saturday after I Sunday after Pentecost",
- "title": "St. Aloysius Gongzaga",
+ "2026-06-05": {
+ "id": "sancti:06-05:3:r",
+ "tempora": "Feria V after I Sunday after Pentecost",
+ "title": "St. Boniface",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-06-26": {
- "tempora": "Feria V after II Sunday after Pentecost",
- "title": "Sts. John & Paul",
+ "2026-06-06": {
+ "id": "sancti:06-06:3:w",
+ "tempora": "Saturday after I Sunday after Pentecost",
+ "title": "St. Norbert",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-25": {
- "tempora": "Feria IV after II Sunday after Pentecost",
- "title": "St. William",
- "rank": 3,
- "colour": "w"
+ "2026-06-07": {
+ "id": "tempora:Pent02-0r:2:g",
+ "tempora": "",
+ "title": "II Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-06-20": {
- "tempora": "Feria V after I Sunday after Pentecost",
+ "2026-06-08": {
+ "id": "tempora:Pent02-0r:2:g",
+ "tempora": "Feria II after II Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-06-27": {
- "tempora": "",
- "title": "Sacred Heart of Jesus",
- "rank": 1,
- "colour": "w"
+ "2026-06-09": {
+ "id": "tempora:Pent02-0r:2:g",
+ "tempora": "Feria III after II Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-06-28": {
- "tempora": "Saturday after II Sunday after Pentecost",
- "title": "Vigil of Sts. Peter & Paul",
- "rank": 2,
- "colour": "v"
+ "2026-06-10": {
+ "id": "sancti:06-10:3:w",
+ "tempora": "Feria IV after II Sunday after Pentecost",
+ "title": "St. Margaret of Scotland",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-06-06": {
- "tempora": "Feria VI after the Ascension",
- "title": "St. Norbert",
+ "2026-06-11": {
+ "id": "sancti:06-11:3:r",
+ "tempora": "Feria V after II Sunday after Pentecost",
+ "title": "St. Barnabas",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-07-01": {
- "tempora": "Feria III after III Sunday after Pentecost",
- "title": "The Precious Blood of Our Lord Jesus Christ",
+ "2026-06-12": {
+ "id": "tempora:Pent02-5:1:w",
+ "tempora": "",
+ "title": "Sacred Heart of Jesus",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-18": {
- "tempora": "Feria IV after I Sunday after Pentecost",
- "title": "St. Ephrem of Syria",
+ "2026-06-13": {
+ "id": "sancti:06-13:3:w",
+ "tempora": "Saturday after II Sunday after Pentecost",
+ "title": "St. Anthony of Padua",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-06": {
+ "2026-06-14": {
+ "id": "tempora:Pent03-0r:2:g",
"tempora": "",
- "title": "IV Sunday after Pentecost",
+ "title": "III Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-06-30": {
+ "2026-06-15": {
+ "id": "tempora:Pent03-0r:2:g",
"tempora": "Feria II after III Sunday after Pentecost",
- "title": "In Commemoratione Sancti Pauli Apostoli",
- "rank": 3,
- "colour": "r"
- },
- "2025-06-29": {
- "tempora": "III Sunday after Pentecost",
- "title": "Sts. Peter & Paul",
- "rank": 1,
- "colour": "r"
- },
- "2025-07-03": {
- "tempora": "Feria V after III Sunday after Pentecost",
- "title": "St. Irenaeus",
- "rank": 3,
- "colour": "r"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-07-04": {
- "tempora": "Feria VI after III Sunday after Pentecost",
+ "2026-06-16": {
+ "id": "tempora:Pent03-0r:2:g",
+ "tempora": "Feria III after III Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-06-17": {
- "tempora": "Feria III after I Sunday after Pentecost",
+ "2026-06-17": {
+ "id": "sancti:06-17r:3:w",
+ "tempora": "Feria IV after III Sunday after Pentecost",
"title": "St. Gregory Barbarigo",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-05": {
- "tempora": "Saturday after III Sunday after Pentecost",
- "title": "St. Anthony Mary Zaccariah",
+ "2026-06-18": {
+ "id": "sancti:06-18:3:r",
+ "tempora": "Feria V after III Sunday after Pentecost",
+ "title": "St. Ephrem of Syria",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-07-09": {
- "tempora": "Feria IV after IV Sunday after Pentecost",
- "title": "Feria",
+ "2026-06-19": {
+ "id": "sancti:06-19:3:r",
+ "tempora": "Feria VI after III Sunday after Pentecost",
+ "title": "St. Julia of Falconieri",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-06-20": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after III Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-08": {
- "tempora": "Feria III after IV Sunday after Pentecost",
- "title": "St. Elizabeth of Portugal",
- "rank": 3,
- "colour": "w"
+ "2026-06-21": {
+ "id": "tempora:Pent04-0:2:g",
+ "tempora": "",
+ "title": "IV Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-07-07": {
+ "2026-06-22": {
+ "id": "sancti:06-22:3:w",
"tempora": "Feria II after IV Sunday after Pentecost",
- "title": "Sts. Cyril & Methodius",
+ "title": "St. Paulinus of Nola",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-10": {
+ "2026-06-23": {
+ "id": "sancti:06-23:2:v",
+ "tempora": "Feria III after IV Sunday after Pentecost",
+ "title": "Vigil of the Nativity of St. John the Baptist",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-06-24": {
+ "id": "sancti:06-24:1:w",
+ "tempora": "Feria IV after IV Sunday after Pentecost",
+ "title": "Nativity of St. John the Baptist",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-06-25": {
+ "id": "sancti:06-25:3:w",
"tempora": "Feria V after IV Sunday after Pentecost",
- "title": "Seven Holy Brothers and Sts. Rufina & Secunda",
+ "title": "St. William",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-13": {
+ "2026-06-26": {
+ "id": "sancti:06-26:3:r",
+ "tempora": "Feria VI after IV Sunday after Pentecost",
+ "title": "Sts. John & Paul",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-06-27": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after IV Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-06-28": {
+ "id": "tempora:Pent05-0:2:g",
"tempora": "",
"title": "V Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-19": {
- "tempora": "Saturday after V Sunday after Pentecost",
- "title": "St. Vincent de Paul",
+ "2026-06-29": {
+ "id": "sancti:06-29:1:r",
+ "tempora": "Feria II after V Sunday after Pentecost",
+ "title": "Sts. Peter & Paul",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-06-30": {
+ "id": "sancti:06-30:3:r",
+ "tempora": "Feria III after V Sunday after Pentecost",
+ "title": "In Commemoratione Sancti Pauli Apostoli",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-07-02": {
- "tempora": "Feria IV after III Sunday after Pentecost",
+ "2026-07-01": {
+ "id": "sancti:07-01:1:r",
+ "tempora": "Feria IV after V Sunday after Pentecost",
+ "title": "The Precious Blood of Our Lord Jesus Christ",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-07-02": {
+ "id": "sancti:07-02:2:w",
+ "tempora": "Feria V after V Sunday after Pentecost",
"title": "Visitation of the Blessed Virgin Mary",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-06-14": {
- "tempora": "",
- "title": "Ember Saturday of Pentecost",
- "rank": 1,
- "colour": "r"
+ "2026-07-03": {
+ "id": "sancti:07-03r:3:r",
+ "tempora": "Feria VI after V Sunday after Pentecost",
+ "title": "St. Irenaeus",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-07-20": {
+ "2026-07-04": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after V Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-07-05": {
+ "id": "tempora:Pent06-0:2:g",
"tempora": "",
"title": "VI Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-11": {
- "tempora": "Feria VI after IV Sunday after Pentecost",
+ "2026-07-06": {
+ "id": "tempora:Pent06-0:2:g",
+ "tempora": "Feria II after VI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-22": {
+ "2026-07-07": {
+ "id": "sancti:07-07:3:w",
"tempora": "Feria III after VI Sunday after Pentecost",
- "title": "St. Mary Magdalene",
+ "title": "Sts. Cyril & Methodius",
"rank": 3,
- "colour": "w"
- },
- "2025-07-16": {
- "tempora": "Feria IV after V Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-12": {
- "tempora": "Saturday after IV Sunday after Pentecost",
- "title": "St. John Gualbert",
+ "2026-07-08": {
+ "id": "sancti:07-08:3:w",
+ "tempora": "Feria IV after VI Sunday after Pentecost",
+ "title": "St. Elizabeth of Portugal",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-07-14": {
- "tempora": "Feria II after V Sunday after Pentecost",
- "title": "St. Bonaventure",
- "rank": 3,
- "colour": "w"
+ "2026-07-09": {
+ "id": "tempora:Pent06-0:2:g",
+ "tempora": "Feria V after VI Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-07-18": {
- "tempora": "Feria VI after V Sunday after Pentecost",
- "title": "Camillus de Lellis",
+ "2026-07-10": {
+ "id": "sancti:07-10:3:r",
+ "tempora": "Feria VI after VI Sunday after Pentecost",
+ "title": "Seven Holy Brothers and Sts. Rufina & Secunda",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-07-26": {
+ "2026-07-11": {
+ "id": "commune:C10t:4:w",
"tempora": "Saturday after VI Sunday after Pentecost",
- "title": "St. Anne, Mother of the Blessed Virgin",
- "rank": 2,
- "colour": "w"
- },
- "2025-07-15": {
- "tempora": "Feria III after V Sunday after Pentecost",
- "title": "St. Henry the Emperor",
- "rank": 3,
- "colour": "w"
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2025-07-27": {
+ "2026-07-12": {
+ "id": "tempora:Pent07-0:2:g",
"tempora": "",
"title": "VII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-25": {
- "tempora": "Feria VI after VI Sunday after Pentecost",
- "title": "St. James the Greater",
- "rank": 2,
- "colour": "r"
- },
- "2025-07-24": {
- "tempora": "Feria V after VI Sunday after Pentecost",
+ "2026-07-13": {
+ "id": "tempora:Pent07-0:2:g",
+ "tempora": "Feria II after VII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-31": {
- "tempora": "Feria V after VII Sunday after Pentecost",
- "title": "St. Ignatius Loyola",
+ "2026-07-14": {
+ "id": "sancti:07-14:3:w",
+ "tempora": "Feria III after VII Sunday after Pentecost",
+ "title": "St. Bonaventure",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-03": {
- "tempora": "",
- "title": "VIII Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
- },
- "2025-07-17": {
- "tempora": "Feria V after V Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2025-07-21": {
- "tempora": "Feria II after VI Sunday after Pentecost",
- "title": "St. Laurence of Brindisi",
+ "2026-07-15": {
+ "id": "sancti:07-15:3:w",
+ "tempora": "Feria IV after VII Sunday after Pentecost",
+ "title": "St. Henry the Emperor",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-01": {
- "tempora": "Feria VI after VII Sunday after Pentecost",
+ "2026-07-16": {
+ "id": "tempora:Pent07-0:2:g",
+ "tempora": "Feria V after VII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
- },
- "2025-07-29": {
- "tempora": "Feria III after VII Sunday after Pentecost",
- "title": "St. Martha",
- "rank": 3,
- "colour": "r"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-28": {
- "tempora": "Feria II after VII Sunday after Pentecost",
- "title": "Sts. Nazarius & Celsus, St. Victor I & St. Innocent I",
- "rank": 3,
- "colour": "r"
- },
- "2025-07-30": {
- "tempora": "Feria IV after VII Sunday after Pentecost",
+ "2026-07-17": {
+ "id": "tempora:Pent07-0:2:g",
+ "tempora": "Feria VI after VII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-02": {
+ "2026-07-18": {
+ "id": "sancti:07-18:3:r",
"tempora": "Saturday after VII Sunday after Pentecost",
- "title": "St. Alphonsus Liguori",
+ "title": "Camillus de Lellis",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-07-19": {
+ "id": "tempora:Pent08-0:2:g",
+ "tempora": "",
+ "title": "VIII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-08-04": {
+ "2026-07-20": {
+ "id": "sancti:07-20:3:r",
"tempora": "Feria II after VIII Sunday after Pentecost",
- "title": "St. Dominic",
+ "title": "St. Jerome Emiliani",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-15": {
- "tempora": "Feria VI after IX Sunday after Pentecost",
- "title": "Assumption of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "2026-07-21": {
+ "id": "sancti:07-21r:3:w",
+ "tempora": "Feria III after VIII Sunday after Pentecost",
+ "title": "St. Laurence of Brindisi",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-08-06": {
+ "2026-07-22": {
+ "id": "sancti:07-22:3:w",
"tempora": "Feria IV after VIII Sunday after Pentecost",
- "title": "Transfiguration of Our Lord",
- "rank": 2,
- "colour": "w"
+ "title": "St. Mary Magdalene",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-08-12": {
- "tempora": "Feria III after IX Sunday after Pentecost",
- "title": "St. Clare",
+ "2026-07-23": {
+ "id": "sancti:07-23:3:w",
+ "tempora": "Feria V after VIII Sunday after Pentecost",
+ "title": "St. Apollinaris",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-11": {
- "tempora": "Feria II after IX Sunday after Pentecost",
+ "2026-07-24": {
+ "id": "tempora:Pent08-0:2:g",
+ "tempora": "Feria VI after VIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-17": {
- "tempora": "",
- "title": "X Sunday after Pentecost",
+ "2026-07-25": {
+ "id": "sancti:07-25:2:r",
+ "tempora": "Saturday after VIII Sunday after Pentecost",
+ "title": "St. James the Greater",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-10": {
+ "2026-07-26": {
+ "id": "tempora:Pent09-0:2:g",
"tempora": "",
"title": "IX Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-13": {
- "tempora": "Feria IV after IX Sunday after Pentecost",
+ "2026-07-27": {
+ "id": "tempora:Pent09-0:2:g",
+ "tempora": "Feria II after IX Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-05": {
- "tempora": "Feria III after VIII Sunday after Pentecost",
- "title": "Dedication of the Basilica of St. Mary Major",
+ "2026-07-28": {
+ "id": "sancti:07-28:3:r",
+ "tempora": "Feria III after IX Sunday after Pentecost",
+ "title": "Sts. Nazarius & Celsus, St. Victor I & St. Innocent I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-07": {
- "tempora": "Feria V after VIII Sunday after Pentecost",
- "title": "St. Cajetan",
+ "2026-07-29": {
+ "id": "sancti:07-29:3:r",
+ "tempora": "Feria IV after IX Sunday after Pentecost",
+ "title": "St. Martha",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-16": {
- "tempora": "Saturday after IX Sunday after Pentecost",
- "title": "St. Joachim, Father of the Blessed Virgin",
- "rank": 2,
- "colour": "w"
+ "2026-07-30": {
+ "id": "tempora:Pent09-0:2:g",
+ "tempora": "Feria V after IX Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-08-21": {
- "tempora": "Feria V after X Sunday after Pentecost",
- "title": "St. Jane Frances de Chantal",
+ "2026-07-31": {
+ "id": "sancti:07-31:3:w",
+ "tempora": "Feria VI after IX Sunday after Pentecost",
+ "title": "St. Ignatius Loyola",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-08-01": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after IX Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-08-02": {
+ "id": "tempora:Pent10-0:2:g",
+ "tempora": "",
+ "title": "X Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-08-18": {
+ "2026-08-03": {
+ "id": "tempora:Pent10-0:2:g",
"tempora": "Feria II after X Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-07-23": {
- "tempora": "Feria IV after VI Sunday after Pentecost",
- "title": "St. Apollinaris",
+ "2026-08-04": {
+ "id": "sancti:08-04:3:w",
+ "tempora": "Feria III after X Sunday after Pentecost",
+ "title": "St. Dominic",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-08": {
- "tempora": "Feria VI after VIII Sunday after Pentecost",
- "title": "St. John Mary Vianney",
+ "2026-08-05": {
+ "id": "sancti:08-05:3:w",
+ "tempora": "Feria IV after X Sunday after Pentecost",
+ "title": "Dedication of the Basilica of St. Mary Major",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-23": {
- "tempora": "Saturday after X Sunday after Pentecost",
- "title": "St. Philip Benizi",
+ "2026-08-06": {
+ "id": "sancti:08-06:2:w",
+ "tempora": "Feria V after X Sunday after Pentecost",
+ "title": "Transfiguration of Our Lord",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-08-07": {
+ "id": "sancti:08-07:3:w",
+ "tempora": "Feria VI after X Sunday after Pentecost",
+ "title": "St. Cajetan",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-20": {
- "tempora": "Feria IV after X Sunday after Pentecost",
- "title": "St. Bernard of Clairvaux",
+ "2026-08-08": {
+ "id": "sancti:08-08:3:w",
+ "tempora": "Saturday after X Sunday after Pentecost",
+ "title": "St. John Mary Vianney",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-22": {
- "tempora": "Feria VI after X Sunday after Pentecost",
- "title": "Immaculate Heart of Mary",
- "rank": 2,
- "colour": "w"
+ "2026-08-09": {
+ "id": "sancti:08-09t:3:r",
+ "tempora": "XI Sunday after Pentecost",
+ "title": "Vigil of St. Lawrence",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-08-14": {
- "tempora": "Feria V after IX Sunday after Pentecost",
- "title": "Vigil of the Assumption",
+ "2026-08-10": {
+ "id": "sancti:08-10:2:r",
+ "tempora": "Feria II after XI Sunday after Pentecost",
+ "title": "St. Lawrence",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-25": {
- "tempora": "Feria II after XI Sunday after Pentecost",
- "title": "St. Louis IX",
- "rank": 3,
- "colour": "w"
+ "2026-08-11": {
+ "id": "tempora:Pent11-0:2:g",
+ "tempora": "Feria III after XI Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-08-27": {
+ "2026-08-12": {
+ "id": "sancti:08-12:3:w",
"tempora": "Feria IV after XI Sunday after Pentecost",
- "title": "St. Joseph Calasance",
+ "title": "St. Clare",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-31": {
- "tempora": "",
- "title": "XII Sunday after Pentecost",
+ "2026-08-13": {
+ "id": "tempora:Pent11-0:2:g",
+ "tempora": "Feria V after XI Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-08-14": {
+ "id": "sancti:08-14:2:w",
+ "tempora": "Feria VI after XI Sunday after Pentecost",
+ "title": "Vigil of the Assumption",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-24": {
+ "2026-08-15": {
+ "id": "sancti:08-15:1:w",
+ "tempora": "Saturday after XI Sunday after Pentecost",
+ "title": "Assumption of the Blessed Virgin Mary",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-08-16": {
+ "id": "tempora:Pent12-0:2:g",
"tempora": "",
- "title": "XI Sunday after Pentecost",
+ "title": "XII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-09": {
- "tempora": "Saturday after VIII Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2026-08-17": {
+ "id": "sancti:08-17:3:w",
+ "tempora": "Feria II after XII Sunday after Pentecost",
+ "title": "St. Hyacinth",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-08-26": {
- "tempora": "Feria III after XI Sunday after Pentecost",
+ "2026-08-18": {
+ "id": "tempora:Pent12-0:2:g",
+ "tempora": "Feria III after XII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-08-19": {
- "tempora": "Feria III after X Sunday after Pentecost",
+ "2026-08-19": {
+ "id": "sancti:08-19:3:w",
+ "tempora": "Feria IV after XII Sunday after Pentecost",
"title": "St. John Eudes",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-04": {
+ "2026-08-20": {
+ "id": "sancti:08-20:3:w",
"tempora": "Feria V after XII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Bernard of Clairvaux",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-09-03": {
- "tempora": "Feria IV after XII Sunday after Pentecost",
- "title": "St. Pius X",
+ "2026-08-21": {
+ "id": "sancti:08-21:3:w",
+ "tempora": "Feria VI after XII Sunday after Pentecost",
+ "title": "St. Jane Frances de Chantal",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-07": {
+ "2026-08-22": {
+ "id": "sancti:08-22:2:w",
+ "tempora": "Saturday after XII Sunday after Pentecost",
+ "title": "Immaculate Heart of Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-08-23": {
+ "id": "tempora:Pent13-0:2:g",
"tempora": "",
"title": "XIII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-02": {
- "tempora": "Feria III after XII Sunday after Pentecost",
- "title": "St. Stephen of Hungary",
+ "2026-08-24": {
+ "id": "sancti:08-24:2:r",
+ "tempora": "Feria II after XIII Sunday after Pentecost",
+ "title": "St. Bartholomew",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-08-25": {
+ "id": "sancti:08-25:3:w",
+ "tempora": "Feria III after XIII Sunday after Pentecost",
+ "title": "St. Louis IX",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-30": {
- "tempora": "Saturday after XI Sunday after Pentecost",
- "title": "St. Rose of Lima",
+ "2026-08-26": {
+ "id": "tempora:Pent13-0:2:g",
+ "tempora": "Feria IV after XIII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-08-27": {
+ "id": "sancti:08-27:3:w",
+ "tempora": "Feria V after XIII Sunday after Pentecost",
+ "title": "St. Joseph Calasance",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-08-28": {
- "tempora": "Feria V after XI Sunday after Pentecost",
+ "2026-08-28": {
+ "id": "sancti:08-28:3:r",
+ "tempora": "Feria VI after XIII Sunday after Pentecost",
"title": "St. Augustine",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-09-10": {
- "tempora": "Feria IV after XIII Sunday after Pentecost",
- "title": "St. Nicholas of Tolentino",
+ "2026-08-29": {
+ "id": "sancti:08-29:3:r",
+ "tempora": "Saturday after XIII Sunday after Pentecost",
+ "title": "Beheading of St. John the Baptist",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-08-29": {
- "tempora": "Feria VI after XI Sunday after Pentecost",
- "title": "Beheading of St. John the Baptist",
+ "2026-08-30": {
+ "id": "tempora:Pent14-0:2:g",
+ "tempora": "",
+ "title": "XIV Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-08-31": {
+ "id": "sancti:08-31:3:w",
+ "tempora": "Feria II after XIV Sunday after Pentecost",
+ "title": "St. Raymond Nonnatus",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-09": {
- "tempora": "Feria III after XIII Sunday after Pentecost",
+ "2026-09-01": {
+ "id": "tempora:Pent14-0:2:g",
+ "tempora": "Feria III after XIV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-14": {
- "tempora": "XIV Sunday after Pentecost",
- "title": "Exaltation of the Holy Cross",
+ "2026-09-02": {
+ "id": "sancti:09-02:3:w",
+ "tempora": "Feria IV after XIV Sunday after Pentecost",
+ "title": "St. Stephen of Hungary",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-03": {
+ "id": "sancti:09-03:3:w",
+ "tempora": "Feria V after XIV Sunday after Pentecost",
+ "title": "St. Pius X",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-04": {
+ "id": "tempora:Pent14-0:2:g",
+ "tempora": "Feria VI after XIV Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-09-05": {
+ "id": "sancti:09-05:3:w",
+ "tempora": "Saturday after XIV Sunday after Pentecost",
+ "title": "St. Lawrence Justinian",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-06": {
+ "id": "tempora:Pent15-0:2:g",
+ "tempora": "",
+ "title": "XV Sunday after Pentecost",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-08": {
- "tempora": "Feria II after XIII Sunday after Pentecost",
+ "2026-09-07": {
+ "id": "tempora:Pent15-0:2:g",
+ "tempora": "Feria II after XV Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-09-08": {
+ "id": "sancti:09-08:2:w",
+ "tempora": "Feria III after XV Sunday after Pentecost",
"title": "Nativity of the Blessed Virgin Mary",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-11": {
- "tempora": "Feria V after XIII Sunday after Pentecost",
+ "2026-09-09": {
+ "id": "tempora:Pent15-0:2:g",
+ "tempora": "Feria IV after XV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-01": {
- "tempora": "Feria II after XII Sunday after Pentecost",
+ "2026-09-10": {
+ "id": "sancti:09-10:3:w",
+ "tempora": "Feria V after XV Sunday after Pentecost",
+ "title": "St. Nicholas of Tolentino",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-11": {
+ "id": "tempora:Pent15-0:2:g",
+ "tempora": "Feria VI after XV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-12": {
- "tempora": "Feria VI after XIII Sunday after Pentecost",
+ "2026-09-12": {
+ "id": "sancti:09-12:3:w",
+ "tempora": "Saturday after XV Sunday after Pentecost",
"title": "Most Holy Name of Mary",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-19": {
- "tempora": "Feria VI after XIV Sunday after Pentecost",
- "title": "St. Januarius & Companions",
+ "2026-09-13": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "",
+ "title": "XVI Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-09-14": {
+ "id": "sancti:09-14:2:r",
+ "tempora": "Feria II after XVI Sunday after Pentecost",
+ "title": "Exaltation of the Holy Cross",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2026-09-15": {
+ "id": "sancti:09-15:2:w",
+ "tempora": "Feria III after XVI Sunday after Pentecost",
+ "title": "Seven Sorrows of the Blessed Virgin Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-16": {
+ "id": "sancti:09-16:3:r",
+ "tempora": "Feria IV after XVI Sunday after Pentecost",
+ "title": "Sts. Cornelius & Cyprian",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-09-18": {
- "tempora": "Feria V after XIV Sunday after Pentecost",
+ "2026-09-17": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "Feria V after XVI Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-09-18": {
+ "id": "sancti:09-18:3:w",
+ "tempora": "Feria VI after XVI Sunday after Pentecost",
"title": "St. Joseph of Cupertino",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-05": {
- "tempora": "Feria VI after XII Sunday after Pentecost",
- "title": "St. Lawrence Justinian",
+ "2026-09-19": {
+ "id": "sancti:09-19:3:r",
+ "tempora": "Saturday after XVI Sunday after Pentecost",
+ "title": "St. Januarius & Companions",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-09-06": {
- "tempora": "Saturday after XII Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2026-09-20": {
+ "id": "tempora:Pent17-0:2:g",
+ "tempora": "",
+ "title": "XVII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2025-09-25": {
- "tempora": "Feria V after XV Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2026-09-21": {
+ "id": "sancti:09-21:2:r",
+ "tempora": "Feria II after XVII Sunday after Pentecost",
+ "title": "St. Matthew",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2025-09-17": {
- "tempora": "Feria IV after XIV Sunday after Pentecost",
+ "2026-09-22": {
+ "id": "sancti:09-22:3:w",
+ "tempora": "Feria III after XVII Sunday after Pentecost",
+ "title": "St. Thomas of Villanova",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-09-23": {
+ "id": "tempora:093-3:2:v",
+ "tempora": "",
+ "title": "Ember Wednesday of September",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-09-24": {
+ "id": "tempora:Pent17-0:2:g",
+ "tempora": "Feria V after XVII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-15": {
- "tempora": "Feria II after XIV Sunday after Pentecost",
- "title": "Seven Sorrows of the Blessed Virgin Mary",
+ "2026-09-25": {
+ "id": "tempora:093-5:2:v",
+ "tempora": "",
+ "title": "Ember Friday of September",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-09-26": {
+ "2026-09-26": {
+ "id": "tempora:093-6:2:v",
"tempora": "",
- "title": "Ember Friday of September",
+ "title": "Ember Saturday of September",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-09-21": {
+ "2026-09-27": {
+ "id": "tempora:Pent18-0:2:g",
"tempora": "",
- "title": "XV Sunday after Pentecost",
+ "title": "XVIII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-09-13": {
- "tempora": "Saturday after XIII Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2026-09-28": {
+ "id": "sancti:09-28:3:r",
+ "tempora": "Feria II after XVIII Sunday after Pentecost",
+ "title": "St. Wenceslaus",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-09-29": {
- "tempora": "Feria II after XVI Sunday after Pentecost",
+ "2026-09-29": {
+ "id": "sancti:09-29:1:w",
+ "tempora": "Feria III after XVIII Sunday after Pentecost",
"title": "Dedication of St. Michael the Archangel",
"rank": 1,
- "colour": "w"
- },
- "2025-09-28": {
- "tempora": "",
- "title": "XVI Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-30": {
- "tempora": "Feria III after XVI Sunday after Pentecost",
+ "2026-09-30": {
+ "id": "sancti:09-30:3:w",
+ "tempora": "Feria IV after XVIII Sunday after Pentecost",
"title": "St. Jerome",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-03": {
- "tempora": "Feria VI after XVI Sunday after Pentecost",
- "title": "St. Theresa of the Infant Jesus",
- "rank": 3,
- "colour": "w"
- },
- "2025-10-05": {
- "tempora": "",
- "title": "XVII Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "2026-10-01": {
+ "id": "tempora:Pent18-0:2:g",
+ "tempora": "Feria V after XVIII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-10-02": {
- "tempora": "Feria V after XVI Sunday after Pentecost",
+ "2026-10-02": {
+ "id": "sancti:10-02:3:w",
+ "tempora": "Feria VI after XVIII Sunday after Pentecost",
"title": "Holy Guardian Angels",
"rank": 3,
- "colour": "w"
- },
- "2025-10-04": {
- "tempora": "Saturday after XVI Sunday after Pentecost",
- "title": "St. Francis of Assisi",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-20": {
- "tempora": "Saturday after XIV Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
- },
- "2025-10-09": {
- "tempora": "Feria V after XVII Sunday after Pentecost",
- "title": "St. John Leonardi",
+ "2026-10-03": {
+ "id": "sancti:10-03:3:w",
+ "tempora": "Saturday after XVIII Sunday after Pentecost",
+ "title": "St. Theresa of the Infant Jesus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-24": {
+ "2026-10-04": {
+ "id": "tempora:Pent19-0:2:g",
"tempora": "",
- "title": "Ember Wednesday of September",
+ "title": "XIX Sunday after Pentecost",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-08": {
- "tempora": "Feria IV after XVII Sunday after Pentecost",
- "title": "St. Bridget of Sweden",
- "rank": 3,
- "colour": "w"
- },
- "2025-09-23": {
- "tempora": "Feria III after XV Sunday after Pentecost",
- "title": "St. Linus",
- "rank": 3,
- "colour": "r"
+ "2026-10-05": {
+ "id": "tempora:Pent19-0:2:g",
+ "tempora": "Feria II after XIX Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-10-10": {
- "tempora": "Feria VI after XVII Sunday after Pentecost",
- "title": "St. Francis Borgia",
+ "2026-10-06": {
+ "id": "sancti:10-06:3:w",
+ "tempora": "Feria III after XIX Sunday after Pentecost",
+ "title": "St. Bruno",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-07": {
- "tempora": "Feria III after XVII Sunday after Pentecost",
+ "2026-10-07": {
+ "id": "sancti:10-07:2:w",
+ "tempora": "Feria IV after XIX Sunday after Pentecost",
"title": "Our Lady of the Rosary",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-14": {
- "tempora": "Feria III after XVIII Sunday after Pentecost",
- "title": "St. Callistus I",
+ "2026-10-08": {
+ "id": "sancti:10-08:3:w",
+ "tempora": "Feria V after XIX Sunday after Pentecost",
+ "title": "St. Bridget of Sweden",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-06": {
- "tempora": "Feria II after XVII Sunday after Pentecost",
- "title": "St. Bruno",
+ "2026-10-09": {
+ "id": "sancti:10-09:3:w",
+ "tempora": "Feria VI after XIX Sunday after Pentecost",
+ "title": "St. John Leonardi",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-27": {
- "tempora": "",
- "title": "Ember Saturday of September",
- "rank": 2,
- "colour": "v"
+ "2026-10-10": {
+ "id": "sancti:10-10:3:w",
+ "tempora": "Saturday after XIX Sunday after Pentecost",
+ "title": "St. Francis Borgia",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-10-12": {
+ "2026-10-11": {
+ "id": "tempora:Pent20-0:2:g",
"tempora": "",
- "title": "XVIII Sunday after Pentecost",
+ "title": "XX Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-11": {
- "tempora": "Saturday after XVII Sunday after Pentecost",
- "title": "Maternity of the Blessed Virgin Mary",
- "rank": 2,
- "colour": "w"
+ "2026-10-12": {
+ "id": "tempora:Pent20-0:2:g",
+ "tempora": "Feria II after XX Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2025-09-22": {
- "tempora": "Feria II after XV Sunday after Pentecost",
- "title": "St. Thomas of Villanova",
+ "2026-10-13": {
+ "id": "sancti:10-13:3:w",
+ "tempora": "Feria III after XX Sunday after Pentecost",
+ "title": "St. Edward",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-09-16": {
- "tempora": "Feria III after XIV Sunday after Pentecost",
- "title": "Sts. Cornelius & Cyprian",
+ "2026-10-14": {
+ "id": "sancti:10-14:3:r",
+ "tempora": "Feria IV after XX Sunday after Pentecost",
+ "title": "St. Callistus I",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-10-15": {
- "tempora": "Feria IV after XVIII Sunday after Pentecost",
+ "2026-10-15": {
+ "id": "sancti:10-15:3:w",
+ "tempora": "Feria V after XX Sunday after Pentecost",
"title": "St. Teresa of Avila",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-16": {
- "tempora": "Feria V after XVIII Sunday after Pentecost",
+ "2026-10-16": {
+ "id": "sancti:10-16:3:w",
+ "tempora": "Feria VI after XX Sunday after Pentecost",
"title": "St. Hedwig",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-26": {
- "tempora": "XX Sunday after Pentecost",
- "title": "Christ the King",
- "rank": 1,
- "colour": "w"
- },
- "2025-10-18": {
- "tempora": "Saturday after XVIII Sunday after Pentecost",
- "title": "St. Luke the Evangelist",
- "rank": 2,
- "colour": "r"
- },
- "2025-10-17": {
- "tempora": "Feria VI after XVIII Sunday after Pentecost",
+ "2026-10-17": {
+ "id": "sancti:10-17:3:w",
+ "tempora": "Saturday after XX Sunday after Pentecost",
"title": "St. Margaret Mary Alacoque",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-19": {
+ "2026-10-18": {
+ "id": "tempora:Pent21-0:2:g",
"tempora": "",
- "title": "XIX Sunday after Pentecost",
+ "title": "XXI Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-20": {
- "tempora": "Feria II after XIX Sunday after Pentecost",
+ "2026-10-19": {
+ "id": "sancti:10-19:3:w",
+ "tempora": "Feria II after XXI Sunday after Pentecost",
+ "title": "St. Peter of Alcantara",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-10-20": {
+ "id": "sancti:10-20:3:w",
+ "tempora": "Feria III after XXI Sunday after Pentecost",
"title": "St. John Cantius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-22": {
- "tempora": "Feria IV after XIX Sunday after Pentecost",
+ "2026-10-21": {
+ "id": "tempora:Pent21-0:2:g",
+ "tempora": "Feria IV after XXI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-23": {
- "tempora": "Feria V after XIX Sunday after Pentecost",
+ "2026-10-22": {
+ "id": "tempora:Pent21-0:2:g",
+ "tempora": "Feria V after XXI Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-10-23": {
+ "id": "sancti:10-23r:3:w",
+ "tempora": "Feria VI after XXI Sunday after Pentecost",
"title": "St. Anthony Mary Claret",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-24": {
- "tempora": "Feria VI after XIX Sunday after Pentecost",
+ "2026-10-24": {
+ "id": "sancti:10-24:3:w",
+ "tempora": "Saturday after XXI Sunday after Pentecost",
"title": "St. Raphael the Archangel",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-29": {
- "tempora": "Feria IV after XX Sunday after Pentecost",
+ "2026-10-25": {
+ "id": "sancti:10-DU:1:w",
+ "tempora": "XXII Sunday after Pentecost",
+ "title": "Christ the King",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-10-26": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "Feria II after XXII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-27": {
- "tempora": "Feria II after XX Sunday after Pentecost",
+ "2026-10-27": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "Feria III after XXII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-28": {
- "tempora": "Feria III after XX Sunday after Pentecost",
+ "2026-10-28": {
+ "id": "sancti:10-28:2:r",
+ "tempora": "Feria IV after XXII Sunday after Pentecost",
"title": "Sts. Simon & Jude",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-10-31": {
- "tempora": "Feria VI after XX Sunday after Pentecost",
+ "2026-10-29": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "Feria V after XXII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-01": {
- "tempora": "Feria IV after XVI Sunday after Pentecost",
+ "2026-10-30": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "Feria VI after XXII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-01": {
- "tempora": "Saturday after XX Sunday after Pentecost",
+ "2026-10-31": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XXII Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-11-01": {
+ "id": "sancti:11-01:1:w",
+ "tempora": "XXIII Sunday after Pentecost",
"title": "All Saints",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-10-30": {
- "tempora": "Feria V after XX Sunday after Pentecost",
+ "2026-11-02": {
+ "id": "sancti:11-02m1:1:b",
+ "tempora": "Feria II after XXIII Sunday after Pentecost",
+ "title": "Commemoration of All Souls",
+ "rank": 1,
+ "colours": [
+ "b"
+ ]
+ },
+ "2026-11-03": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria III after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-10-13": {
- "tempora": "Feria II after XVIII Sunday after Pentecost",
- "title": "St. Edward",
+ "2026-11-04": {
+ "id": "sancti:11-04:3:w",
+ "tempora": "Feria IV after XXIII Sunday after Pentecost",
+ "title": "St. Charles Borromeo",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-05": {
- "tempora": "Feria IV after XXI Sunday after Pentecost",
+ "2026-11-05": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria V after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-02": {
- "tempora": "",
- "title": "XXI Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
- },
- "2025-11-07": {
- "tempora": "Feria VI after XXI Sunday after Pentecost",
+ "2026-11-06": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria VI after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-06": {
- "tempora": "Feria V after XXI Sunday after Pentecost",
- "title": "Feria",
+ "2026-11-07": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XXIII Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-14": {
- "tempora": "Feria VI after XXII Sunday after Pentecost",
- "title": "St. Josaphat",
+ "2026-11-08": {
+ "id": "tempora:Epi5-0:2:g",
+ "tempora": "",
+ "title": "V Sunday after Epiphany",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-11-09": {
+ "id": "sancti:11-09:2:w",
+ "tempora": "Feria II after V Sunday after Epiphany",
+ "title": "Dedication of the Archbasilica of Our Holy Savior",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-11-10": {
+ "id": "sancti:11-10:3:w",
+ "tempora": "Feria III after V Sunday after Epiphany",
+ "title": "St. Andrew Avellino",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-12": {
- "tempora": "Feria IV after XXII Sunday after Pentecost",
+ "2026-11-11": {
+ "id": "sancti:11-11:3:w",
+ "tempora": "Feria IV after V Sunday after Epiphany",
+ "title": "St. Martin of Tours",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-11-12": {
+ "id": "sancti:11-12:3:r",
+ "tempora": "Feria V after V Sunday after Epiphany",
"title": "St. Martin I",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-11-16": {
+ "2026-11-13": {
+ "id": "tempora:Epi5-0:2:g",
+ "tempora": "Feria VI after V Sunday after Epiphany",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2026-11-14": {
+ "id": "sancti:11-14:3:w",
+ "tempora": "Saturday after V Sunday after Epiphany",
+ "title": "St. Josaphat",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2026-11-15": {
+ "id": "tempora:Epi6-0:2:g",
"tempora": "",
- "title": "XXIII Sunday after Pentecost",
+ "title": "VI Sunday after Epiphany",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-15": {
- "tempora": "Saturday after XXII Sunday after Pentecost",
- "title": "St. Albert the Great",
+ "2026-11-16": {
+ "id": "sancti:11-16:3:w",
+ "tempora": "Feria II after VI Sunday after Epiphany",
+ "title": "St. Gertrude the Great",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-13": {
- "tempora": "Feria V after XXII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2026-11-17": {
+ "id": "sancti:11-17:3:w",
+ "tempora": "Feria III after VI Sunday after Epiphany",
+ "title": "St. Gregory the Wonderworker",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-11-11": {
- "tempora": "Feria III after XXII Sunday after Pentecost",
- "title": "St. Martin of Tours",
+ "2026-11-18": {
+ "id": "sancti:11-18r:3:w",
+ "tempora": "Feria IV after VI Sunday after Epiphany",
+ "title": "Dedication of the Basilicas of Sts. Peter & Paul",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-04": {
- "tempora": "Feria III after XXI Sunday after Pentecost",
- "title": "St. Charles Borromeo",
+ "2026-11-19": {
+ "id": "sancti:11-19:3:w",
+ "tempora": "Feria V after VI Sunday after Epiphany",
+ "title": "St. Elizabeth of Hungary",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-20": {
- "tempora": "Feria V after XXIII Sunday after Pentecost",
+ "2026-11-20": {
+ "id": "sancti:11-20:3:w",
+ "tempora": "Feria VI after VI Sunday after Epiphany",
"title": "St. Felix of Valois",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-10": {
- "tempora": "Feria II after XXII Sunday after Pentecost",
- "title": "St. Andrew Avellino",
+ "2026-11-21": {
+ "id": "sancti:11-21:3:w",
+ "tempora": "Saturday after VI Sunday after Epiphany",
+ "title": "Presentation of the Blessed Virgin Mary",
"rank": 3,
- "colour": "w"
- },
- "2025-10-21": {
- "tempora": "Feria III after XIX Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-23": {
+ "2026-11-22": {
+ "id": "tempora:Pent24-0:2:g",
"tempora": "",
"title": "XXIV Sunday after Pentecost",
"rank": 2,
- "colour": "g"
- },
- "2025-10-25": {
- "tempora": "Saturday after XIX Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-17": {
- "tempora": "Feria II after XXIII Sunday after Pentecost",
- "title": "St. Gregory the Wonderworker",
+ "2026-11-23": {
+ "id": "sancti:11-23:3:r",
+ "tempora": "Feria II after XXIV Sunday after Pentecost",
+ "title": "St. Clement I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2025-11-19": {
- "tempora": "Feria IV after XXIII Sunday after Pentecost",
- "title": "St. Elizabeth of Hungary",
+ "2026-11-24": {
+ "id": "sancti:11-24:3:w",
+ "tempora": "Feria III after XXIV Sunday after Pentecost",
+ "title": "St. John of the Cross",
"rank": 3,
- "colour": "w"
- },
- "2025-11-09": {
- "tempora": "XXII Sunday after Pentecost",
- "title": "Dedication of the Archbasilica of Our Holy Savior",
- "rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-30": {
- "tempora": "",
- "title": "I Sunday of Advent",
- "rank": 1,
- "colour": "v"
+ "2026-11-25": {
+ "id": "sancti:11-25:3:r",
+ "tempora": "Feria IV after XXIV Sunday after Pentecost",
+ "title": "St. Catherine of Alexandria",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-11-27": {
+ "2026-11-26": {
+ "id": "sancti:11-26:3:w",
"tempora": "Feria V after XXIV Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Sylvester",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2025-11-28": {
+ "2026-11-27": {
+ "id": "tempora:Pent24-0:2:g",
"tempora": "Feria VI after XXIV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2025-11-08": {
- "tempora": "Saturday after XXI Sunday after Pentecost",
+ "2026-11-28": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XXIV Sunday after Pentecost",
"title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-01": {
+ "2026-11-29": {
+ "id": "tempora:Adv1-0:1:v",
"tempora": "",
- "title": "Feria II after I Sunday of Advent",
- "rank": 3,
- "colour": "v"
+ "title": "I Sunday of Advent",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2025-11-22": {
- "tempora": "Saturday after XXIII Sunday after Pentecost",
- "title": "St. Cecilia",
- "rank": 3,
- "colour": "r"
+ "2026-11-30": {
+ "id": "sancti:11-30:2:r",
+ "tempora": "Feria II after I Sunday of Advent",
+ "title": "St. Andrew",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2025-11-21": {
- "tempora": "Feria VI after XXIII Sunday after Pentecost",
- "title": "Presentation of the Blessed Virgin Mary",
+ "2026-12-01": {
+ "id": "tempora:Adv1-0:1:v",
+ "tempora": "",
+ "title": "Feria III after I Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-11-03": {
- "tempora": "Feria II after XXI Sunday after Pentecost",
- "title": "Commemoration of All Souls",
- "rank": 1,
- "colour": "b"
+ "2026-12-02": {
+ "id": "sancti:12-02:3:r",
+ "tempora": "Feria IV after I Sunday of Advent",
+ "title": "St. Vivian",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2025-11-24": {
- "tempora": "Feria II after XXIV Sunday after Pentecost",
- "title": "St. John of the Cross",
+ "2026-12-03": {
+ "id": "sancti:12-03:3:w",
+ "tempora": "Feria V after I Sunday of Advent",
+ "title": "St. Francis Xavier",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-02": {
- "tempora": "Feria III after I Sunday of Advent",
- "title": "St. Vivian",
+ "2026-12-04": {
+ "id": "sancti:12-04:3:w",
+ "tempora": "Feria VI after I Sunday of Advent",
+ "title": "St. Peter Chrysologus",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-08": {
- "tempora": "Feria II after II Sunday of Advent",
- "title": "Immaculate Conception of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "2026-12-05": {
+ "id": "tempora:Adv1-0:1:v",
+ "tempora": "",
+ "title": "Sabbato after I Sunday of Advent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2025-12-07": {
+ "2026-12-06": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
"title": "II Sunday of Advent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-11-25": {
- "tempora": "Feria III after XXIV Sunday after Pentecost",
- "title": "St. Catherine of Alexandria",
+ "2026-12-07": {
+ "id": "sancti:12-07:3:w",
+ "tempora": "Feria II after II Sunday of Advent",
+ "title": "St. Ambrose",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2025-11-18": {
- "tempora": "Feria III after XXIII Sunday after Pentecost",
- "title": "Dedication of the Basilicas of Sts. Peter & Paul",
- "rank": 3,
- "colour": "w"
+ "2026-12-08": {
+ "id": "sancti:12-08:1:w",
+ "tempora": "Feria III after II Sunday of Advent",
+ "title": "Immaculate Conception of the Blessed Virgin Mary",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-12-09": {
+ "2026-12-09": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Feria III after II Sunday of Advent",
- "rank": 3,
- "colour": "v"
- },
- "2025-12-03": {
- "tempora": "Feria IV after I Sunday of Advent",
- "title": "St. Francis Xavier",
+ "title": "Feria IV after II Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-12-12": {
+ "2026-12-10": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Feria VI after II Sunday of Advent",
+ "title": "Feria V after II Sunday of Advent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-12-04": {
- "tempora": "Feria V after I Sunday of Advent",
- "title": "St. Peter Chrysologus",
+ "2026-12-11": {
+ "id": "sancti:12-11:3:w",
+ "tempora": "Feria VI after II Sunday of Advent",
+ "title": "St. Damasus I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-05": {
+ "2026-12-12": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Feria VI after I Sunday of Advent",
- "rank": 3,
- "colour": "v"
- },
- "2025-12-06": {
- "tempora": "Sabbato after I Sunday of Advent",
- "title": "St. Nicholas",
+ "title": "Sabbato after II Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2025-12-14": {
+ "2026-12-13": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
"title": "III Sunday of Advent",
"rank": 1,
- "colour": "pv"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2025-12-15": {
+ "2026-12-14": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
"title": "Feria II after III Sunday of Advent",
"rank": 3,
- "colour": "pv"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2025-11-29": {
- "tempora": "Saturday after XXIV Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
- },
- "2025-12-18": {
+ "2026-12-15": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
- "title": "Feria V after III Sunday of Advent",
- "rank": 2,
- "colour": "pv"
- },
- "2025-12-11": {
- "tempora": "Feria V after II Sunday of Advent",
- "title": "St. Damasus I",
+ "title": "Feria III after III Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2025-12-25": {
+ "2026-12-16": {
+ "id": "tempora:Adv3-3:2:v",
"tempora": "",
- "title": "The Nativity of Our Lord",
- "rank": 1,
- "colour": "w"
+ "title": "Ember Wednesday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2025-12-19": {
+ "2026-12-17": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
- "title": "Ember Friday of Advent",
+ "title": "Feria V after III Sunday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2025-12-10": {
+ "2026-12-18": {
+ "id": "tempora:Adv3-5:2:v",
"tempora": "",
- "title": "Feria IV after II Sunday of Advent",
- "rank": 3,
- "colour": "v"
+ "title": "Ember Friday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2025-12-17": {
+ "2026-12-19": {
+ "id": "tempora:Adv3-6:2:v",
"tempora": "",
- "title": "Ember Wednesday of Advent",
+ "title": "Ember Saturday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-11-26": {
- "tempora": "Feria IV after XXIV Sunday after Pentecost",
- "title": "St. Sylvester",
- "rank": 3,
- "colour": "w"
- },
- "2025-12-21": {
+ "2026-12-20": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
"title": "IV Sunday of Advent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-12-21": {
+ "id": "sancti:12-21:2:r",
+ "tempora": "Feria II after IV Sunday of Advent",
+ "title": "St. Thomas",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2025-12-22": {
+ "2026-12-22": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
- "title": "Feria II after IV Sunday of Advent",
+ "title": "Feria III after IV Sunday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-12-24": {
+ "2026-12-23": {
+ "id": "tempora:Adv4-0:1:v",
+ "tempora": "",
+ "title": "Feria IV after IV Sunday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2026-12-24": {
+ "id": "sancti:12-24:1:v",
"tempora": "",
"title": "Vigil of Christmas",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2025-12-13": {
- "tempora": "Sabbato after II Sunday of Advent",
- "title": "St. Lucy",
- "rank": 3,
- "colour": "r"
+ "2026-12-25": {
+ "id": "sancti:12-25m1:1:w",
+ "tempora": "",
+ "title": "The Nativity of Our Lord",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-12-23": {
+ "2026-12-26": {
+ "id": "sancti:12-26:2:r",
"tempora": "",
- "title": "Feria III after IV Sunday of Advent",
+ "title": "St. Stephen",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "r"
+ ]
},
- "2025-12-16": {
- "tempora": "Feria III after III Sunday of Advent",
- "title": "St. Eusebius",
- "rank": 3,
- "colour": "r"
- },
- "2025-12-30": {
+ "2026-12-27": {
+ "id": "tempora:Nat1-0:2:w",
"tempora": "",
- "title": "Feria in the Octave of Christmas",
+ "title": "Sunday in the Octave of Christmas",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-26": {
+ "2026-12-28": {
+ "id": "sancti:12-28:2:r",
"tempora": "",
- "title": "St. Stephen",
+ "title": "Holy Innocents",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2025-12-31": {
+ "2026-12-29": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
"title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-29": {
+ "2026-12-30": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
"title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-27": {
+ "2026-12-31": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
- "title": "St. John the Evangelist",
+ "title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2025-12-20": {
+ "2027-01-01": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
- "title": "Ember Saturday of Advent",
- "rank": 2,
- "colour": "v"
+ "title": "Octave Day of Christmas",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2025-12-28": {
+ "2027-01-02": {
+ "id": "commune:C10b:4:w",
"tempora": "",
- "title": "Sunday in the Octave of Christmas",
+ "title": "II Mass of the B. V. M. – Vultum Tuum",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-01-03": {
+ "id": "tempora:Nat2-0:2:w",
+ "tempora": "",
+ "title": "Holy Name of Jesus",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-01": {
+ "2027-01-04": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
- "title": "Octave Day of Christmas",
- "rank": 1,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-01-02": {
+ "2027-01-05": {
+ "id": "sancti:01-01:1:w",
"tempora": "",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-06": {
+ "2027-01-06": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
"title": "Epiphany of the Lord",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-04": {
+ "2027-01-07": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
- "title": "Holy Name of Jesus",
- "rank": 2,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-01-07": {
+ "2027-01-08": {
+ "id": "sancti:01-06:1:w",
"tempora": "",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-05": {
+ "2027-01-09": {
+ "id": "commune:C10b:4:w",
"tempora": "",
- "title": "Feria",
+ "title": "II Mass of the B. V. M. – Vultum Tuum",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-12": {
+ "2027-01-10": {
+ "id": "tempora:Epi1-0:2:w",
+ "tempora": "",
+ "title": "The Holy Family: Jesus, Mary & Joseph",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-01-11": {
+ "id": "tempora:Epi1-0a:2:w",
"tempora": "Feria II after Epiphany",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-18": {
- "tempora": "",
- "title": "II Sunday after Epiphany",
- "rank": 2,
- "colour": "g"
+ "2027-01-12": {
+ "id": "tempora:Epi1-0a:2:w",
+ "tempora": "Feria III after Epiphany",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-01-11": {
- "tempora": "",
- "title": "The Holy Family: Jesus, Mary & Joseph",
+ "2027-01-13": {
+ "id": "sancti:01-13:2:w",
+ "tempora": "Feria IV after Epiphany",
+ "title": "Commemoration of the Baptism of the Lord",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-17": {
- "tempora": "Saturday after Epiphany",
- "title": "St. Anthony",
+ "2027-01-14": {
+ "id": "sancti:01-14:3:w",
+ "tempora": "Feria V after Epiphany",
+ "title": "St. Hilary",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-20": {
- "tempora": "Feria III after II Sunday after Epiphany",
- "title": "Sts. Fabian & Sebastian",
+ "2027-01-15": {
+ "id": "sancti:01-15:3:w",
+ "tempora": "Feria VI after Epiphany",
+ "title": "St. Paul, the First Hermit",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-21": {
- "tempora": "Feria IV after II Sunday after Epiphany",
- "title": "St. Agnes",
+ "2027-01-16": {
+ "id": "sancti:01-16:3:r",
+ "tempora": "Saturday after Epiphany",
+ "title": "St. Marcellus I",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-01-19": {
+ "2027-01-17": {
+ "id": "tempora:Epi2-0:2:g",
+ "tempora": "",
+ "title": "II Sunday after Epiphany",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-01-18": {
+ "id": "tempora:Epi2-0:2:g",
"tempora": "Feria II after II Sunday after Epiphany",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-01-22": {
+ "2027-01-19": {
+ "id": "tempora:Epi2-0:2:g",
+ "tempora": "Feria III after II Sunday after Epiphany",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-01-20": {
+ "id": "sancti:01-20:3:r",
+ "tempora": "Feria IV after II Sunday after Epiphany",
+ "title": "Sts. Fabian & Sebastian",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-01-21": {
+ "id": "sancti:01-21:3:r",
"tempora": "Feria V after II Sunday after Epiphany",
+ "title": "St. Agnes",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-01-22": {
+ "id": "sancti:01-22:3:r",
+ "tempora": "Feria VI after II Sunday after Epiphany",
"title": "Sts. Vincent & Anastasius",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-01-25": {
+ "2027-01-23": {
+ "id": "sancti:01-23:3:w",
+ "tempora": "Saturday after II Sunday after Epiphany",
+ "title": "St. Raymond of Peñafort",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-01-24": {
+ "id": "tempora:Quadp1-0:2:v",
"tempora": "",
- "title": "III Sunday after Epiphany",
+ "title": "Septuagesima Sunday",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "v"
+ ]
},
- "2026-01-26": {
- "tempora": "Feria II after III Sunday after Epiphany",
- "title": "St. Polycarp",
+ "2027-01-25": {
+ "id": "sancti:01-25r:3:w",
+ "tempora": "Feria II after Septuagesima",
+ "title": "Conversion of St. Paul",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-24": {
- "tempora": "Saturday after II Sunday after Epiphany",
- "title": "St. Timothy",
+ "2027-01-26": {
+ "id": "sancti:01-26:3:r",
+ "tempora": "Feria III after Septuagesima",
+ "title": "St. Polycarp",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-01-27": {
- "tempora": "Feria III after III Sunday after Epiphany",
+ "2027-01-27": {
+ "id": "sancti:01-27:3:w",
+ "tempora": "Feria IV after Septuagesima",
"title": "St. John Chrysostom",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-28": {
- "tempora": "Feria IV after III Sunday after Epiphany",
+ "2027-01-28": {
+ "id": "sancti:01-28:3:w",
+ "tempora": "Feria V after Septuagesima",
"title": "St. Peter Nolasco",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-29": {
- "tempora": "Feria V after III Sunday after Epiphany",
+ "2027-01-29": {
+ "id": "sancti:01-29:3:w",
+ "tempora": "Feria VI after Septuagesima",
"title": "St. Francis de Sales",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-31": {
- "tempora": "Saturday after III Sunday after Epiphany",
- "title": "St. John Bosco",
- "rank": 3,
- "colour": "w"
- },
- "2026-01-23": {
- "tempora": "Feria VI after II Sunday after Epiphany",
- "title": "St. Raymond of Peñafort",
+ "2027-01-30": {
+ "id": "sancti:01-30:3:r",
+ "tempora": "Saturday after Septuagesima",
+ "title": "St. Martina",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-02-01": {
+ "2027-01-31": {
+ "id": "tempora:Quadp2-0:2:v",
"tempora": "",
- "title": "Septuagesima Sunday",
- "rank": 2,
- "colour": "v"
- },
- "2026-01-13": {
- "tempora": "Feria III after Epiphany",
- "title": "Commemoration of the Baptism of the Lord",
+ "title": "Sexagesima Sunday",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-01-30": {
- "tempora": "Feria VI after III Sunday after Epiphany",
- "title": "St. Martina",
+ "2027-02-01": {
+ "id": "sancti:02-01:3:r",
+ "tempora": "Feria II after Sexagesima",
+ "title": "St. Ignatius of Antioch",
"rank": 3,
- "colour": "r"
- },
- "2026-02-03": {
- "tempora": "Feria III after Septuagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
- },
- "2026-01-08": {
- "tempora": "",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
- },
- "2026-01-09": {
- "tempora": "",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-02-02": {
- "tempora": "Feria II after Septuagesima",
+ "2027-02-02": {
+ "id": "sancti:02-02:2:w",
+ "tempora": "Feria III after Sexagesimæ",
"title": "Purification of the Blessed Virgin Mary",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-10": {
- "tempora": "",
- "title": "II Mass of the B. V. M. – Vultum Tuum",
- "rank": 4,
- "colour": "w"
- },
- "2026-01-03": {
- "tempora": "",
- "title": "II Mass of the B. V. M. – Vultum Tuum",
+ "2027-02-03": {
+ "id": "tempora:Quadp2-0:2:v",
+ "tempora": "Feria IV after Sexagesimæ",
+ "title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-01-16": {
- "tempora": "Feria VI after Epiphany",
- "title": "St. Marcellus I",
- "rank": 3,
- "colour": "r"
- },
- "2026-02-08": {
- "tempora": "",
- "title": "Sexagesima Sunday",
- "rank": 2,
- "colour": "v"
- },
- "2026-02-07": {
- "tempora": "Saturday after Septuagesima",
- "title": "St. Romuald",
- "rank": 3,
- "colour": "w"
- },
- "2026-02-10": {
- "tempora": "Feria III after Sexagesimæ",
- "title": "St. Scholastica",
+ "2027-02-04": {
+ "id": "sancti:02-04:3:w",
+ "tempora": "Feria V after Sexagesimæ",
+ "title": "St. Andrew Corsini",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-02-05": {
- "tempora": "Feria V after Septuagesima",
+ "2027-02-05": {
+ "id": "sancti:02-05:3:r",
+ "tempora": "Feria VI after Sexagesimæ",
"title": "St. Agatha",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-01-15": {
- "tempora": "Feria V after Epiphany",
- "title": "St. Paul, the First Hermit",
+ "2027-02-06": {
+ "id": "sancti:02-06:3:w",
+ "tempora": "Saturday after Sexagesimæ",
+ "title": "St. Titus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-02-11": {
- "tempora": "Feria IV after Sexagesimæ",
- "title": "Our Lady of Lourdes",
- "rank": 3,
- "colour": "w"
+ "2027-02-07": {
+ "id": "tempora:Quadp3-0:2:v",
+ "tempora": "",
+ "title": "Quinquagesima Sunday",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-02-12": {
- "tempora": "Feria V after Sexagesimæ",
- "title": "Seven Holy Servite Founders",
+ "2027-02-08": {
+ "id": "sancti:02-08:3:w",
+ "tempora": "Feria II after Quinquagesima",
+ "title": "St. John of Matha",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-02-13": {
- "tempora": "Feria VI after Sexagesimæ",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
- },
- "2026-02-04": {
- "tempora": "Feria IV after Septuagesima",
- "title": "St. Andrew Corsini",
+ "2027-02-09": {
+ "id": "sancti:02-09:3:w",
+ "tempora": "Feria III after Quinquagesima",
+ "title": "St. Cyril of Alexandria",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-01-14": {
- "tempora": "Feria IV after Epiphany",
- "title": "St. Hilary",
- "rank": 3,
- "colour": "w"
+ "2027-02-10": {
+ "id": "tempora:Quadp3-3:1:v",
+ "tempora": "",
+ "title": "Ash Wednesday",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2026-02-20": {
+ "2027-02-11": {
+ "id": "tempora:Quadp3-4:3:v",
"tempora": "",
- "title": "Feria VI after Ash Wednesday",
+ "title": "Feria V after Ash Wednesday",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-15": {
+ "2027-02-12": {
+ "id": "tempora:Quadp3-5:3:v",
"tempora": "",
- "title": "Quinquagesima Sunday",
- "rank": 2,
- "colour": "v"
+ "title": "Feria VI after Ash Wednesday",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2026-02-19": {
+ "2027-02-13": {
+ "id": "tempora:Quadp3-6:3:v",
"tempora": "",
- "title": "Feria V after Ash Wednesday",
+ "title": "Saturday after Ash Wednesday",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-22": {
+ "2027-02-14": {
+ "id": "tempora:Quad1-0:1:v",
"tempora": "",
"title": "I Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-21": {
+ "2027-02-15": {
+ "id": "tempora:Quad1-1:3:v",
"tempora": "",
- "title": "Saturday after Ash Wednesday",
+ "title": "Feria II after the I Sunday of Lent",
"rank": 3,
- "colour": "v"
- },
- "2026-02-17": {
- "tempora": "Feria III after Quinquagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
- },
- "2026-02-16": {
- "tempora": "Feria II after Quinquagesima",
- "title": "Feria",
- "rank": 4,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-06": {
- "tempora": "Feria VI after Septuagesima",
- "title": "St. Titus",
+ "2027-02-16": {
+ "id": "tempora:Quad1-2:3:v",
+ "tempora": "",
+ "title": "Feria III after the I Sunday of Lent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-25": {
+ "2027-02-17": {
+ "id": "tempora:Quad1-3:2:v",
"tempora": "",
"title": "Ember Wednesday of Lent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-18": {
+ "2027-02-18": {
+ "id": "tempora:Quad1-4:3:v",
"tempora": "",
- "title": "Ash Wednesday",
- "rank": 1,
- "colour": "v"
+ "title": "Feria V after the I Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2026-03-02": {
+ "2027-02-19": {
+ "id": "tempora:Quad1-5:2:v",
"tempora": "",
- "title": "Feria II after the II Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "title": "Ember Friday of Lent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-03-01": {
+ "2027-02-20": {
+ "id": "tempora:Quad1-6:2:v",
+ "tempora": "",
+ "title": "Ember Saturday of Lent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-02-21": {
+ "id": "tempora:Quad2-0:1:v",
"tempora": "",
"title": "II Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-26": {
- "tempora": "",
- "title": "Feria V after the I Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "2027-02-22": {
+ "id": "sancti:02-22:2:w",
+ "tempora": "Feria II after the II Sunday of Lent",
+ "title": "Chair of St. Peter",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2026-03-03": {
+ "2027-02-23": {
+ "id": "tempora:Quad2-2:3:v",
"tempora": "",
"title": "Feria III after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-24": {
- "tempora": "Feria III after the I Sunday of Lent",
+ "2027-02-24": {
+ "id": "sancti:02-24:2:r",
+ "tempora": "Feria IV after the II Sunday of Lent",
"title": "St. Matthias",
"rank": 2,
- "colour": "r"
- },
- "2026-02-14": {
- "tempora": "Saturday after Sexagesimæ",
- "title": "III Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-02-09": {
- "tempora": "Feria II after Sexagesima",
- "title": "St. Cyril of Alexandria",
+ "2027-02-25": {
+ "id": "tempora:Quad2-4:3:v",
+ "tempora": "",
+ "title": "Feria V after the II Sunday of Lent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-23": {
+ "2027-02-26": {
+ "id": "tempora:Quad2-5:3:v",
"tempora": "",
- "title": "Feria II after the I Sunday of Lent",
+ "title": "Feria VI after the II Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-02-27": {
+ "2027-02-27": {
+ "id": "tempora:Quad2-6:3:v",
"tempora": "",
- "title": "Ember Friday of Lent",
- "rank": 2,
- "colour": "v"
+ "title": "Saturday after the II Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
},
- "2026-03-08": {
+ "2027-02-28": {
+ "id": "tempora:Quad3-0:1:v",
"tempora": "",
"title": "III Sunday of Lent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-05": {
+ "2027-03-01": {
+ "id": "tempora:Quad3-1:3:v",
"tempora": "",
- "title": "Feria V after the II Sunday of Lent",
+ "title": "Feria II after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-11": {
+ "2027-03-02": {
+ "id": "tempora:Quad3-2:3:v",
+ "tempora": "",
+ "title": "Feria III after the III Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-03-03": {
+ "id": "tempora:Quad3-3:3:v",
"tempora": "",
"title": "Feria IV after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-13": {
+ "2027-03-04": {
+ "id": "tempora:Quad3-4:3:v",
+ "tempora": "",
+ "title": "Feria V after the III Sunday of Lent",
+ "rank": 3,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-03-05": {
+ "id": "tempora:Quad3-5:3:v",
"tempora": "",
"title": "Feria VI after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-14": {
+ "2027-03-06": {
+ "id": "tempora:Quad3-6:3:v",
"tempora": "",
"title": "Saturday after the III Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-15": {
+ "2027-03-07": {
+ "id": "tempora:Quad4-0:1:pv",
"tempora": "",
"title": "IV Sunday of Lent",
"rank": 1,
- "colour": "pv"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2026-02-28": {
- "tempora": "",
- "title": "Ember Saturday of Lent",
- "rank": 2,
- "colour": "v"
- },
- "2026-03-16": {
+ "2027-03-08": {
+ "id": "tempora:Quad4-1:3:v",
"tempora": "",
"title": "Feria II after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-12": {
+ "2027-03-09": {
+ "id": "tempora:Quad4-2:3:v",
"tempora": "",
- "title": "Feria V after the III Sunday of Lent",
+ "title": "Feria III after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-06": {
+ "2027-03-10": {
+ "id": "tempora:Quad4-3:3:v",
"tempora": "",
- "title": "Feria VI after the II Sunday of Lent",
+ "title": "Feria IV after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-10": {
+ "2027-03-11": {
+ "id": "tempora:Quad4-4:3:v",
"tempora": "",
- "title": "Feria III after the III Sunday of Lent",
+ "title": "Feria V after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-09": {
+ "2027-03-12": {
+ "id": "tempora:Quad4-5:3:v",
"tempora": "",
- "title": "Feria II after the III Sunday of Lent",
+ "title": "Feria VI after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-07": {
+ "2027-03-13": {
+ "id": "tempora:Quad4-6:3:v",
"tempora": "",
- "title": "Saturday after the II Sunday of Lent",
+ "title": "Saturday after the IV Sunday of Lent",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-22": {
+ "2027-03-14": {
+ "id": "tempora:Quad5-0:1:v",
"tempora": "",
"title": "Passion Sunday",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-20": {
+ "2027-03-15": {
+ "id": "tempora:Quad5-1:3:v",
"tempora": "",
- "title": "Feria VI after the IV Sunday of Lent",
+ "title": "Feria II of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-23": {
+ "2027-03-16": {
+ "id": "tempora:Quad5-2:3:v",
"tempora": "",
- "title": "Feria II of Passion Week",
+ "title": "Feria III of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-26": {
+ "2027-03-17": {
+ "id": "tempora:Quad5-3:3:v",
"tempora": "",
- "title": "Feria V of Passion Week",
+ "title": "Feria IV of Passion Week",
"rank": 3,
- "colour": "v"
- },
- "2026-03-19": {
- "tempora": "Feria V after the IV Sunday of Lent",
- "title": "St. Joseph, Spouse of the Bl. Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-24": {
+ "2027-03-18": {
+ "id": "tempora:Quad5-4:3:v",
"tempora": "",
- "title": "Feria III of Passion Week",
+ "title": "Feria V of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-27": {
+ "2027-03-19": {
+ "id": "tempora:Quad5-5Feria:3:v",
"tempora": "",
"title": "Feria VI of Passion Week",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-30": {
+ "2027-03-20": {
+ "id": "tempora:Quad5-6:3:v",
"tempora": "",
- "title": "Feria II of Holy Week",
- "rank": 1,
- "colour": "v"
- },
- "2026-03-21": {
- "tempora": "",
- "title": "Saturday after the IV Sunday of Lent",
+ "title": "Saturday of Passion Week",
"rank": 3,
- "colour": "v"
- },
- "2026-03-25": {
- "tempora": "Feria IV of Passion Week",
- "title": "Annunciation of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-04-02": {
+ "2027-03-21": {
+ "id": "tempora:Quad6-0r:1:rv",
"tempora": "",
- "title": "Holy Thursday",
+ "title": "Palm Sunday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "r",
+ "v"
+ ]
},
- "2026-04-03": {
+ "2027-03-22": {
+ "id": "tempora:Quad6-1:1:v",
"tempora": "",
- "title": "Good Friday",
+ "title": "Feria II of Holy Week",
"rank": 1,
- "colour": "bv"
+ "colours": [
+ "v"
+ ]
},
- "2026-03-28": {
+ "2027-03-23": {
+ "id": "tempora:Quad6-2:1:v",
"tempora": "",
- "title": "Saturday of Passion Week",
- "rank": 3,
- "colour": "v"
+ "title": "Feria III of Holy Week",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2026-03-18": {
+ "2027-03-24": {
+ "id": "tempora:Quad6-3:1:v",
"tempora": "",
- "title": "Feria IV after the IV Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "title": "Feria IV of Holy Week",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2026-03-04": {
+ "2027-03-25": {
+ "id": "tempora:Quad6-4r:1:w",
"tempora": "",
- "title": "Feria IV after the II Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "title": "Holy Thursday",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2026-03-17": {
+ "2027-03-26": {
+ "id": "tempora:Quad6-5r:1:bv",
"tempora": "",
- "title": "Feria III after the IV Sunday of Lent",
- "rank": 3,
- "colour": "v"
+ "title": "Good Friday",
+ "rank": 1,
+ "colours": [
+ "b",
+ "v"
+ ]
},
- "2026-04-04": {
+ "2027-03-27": {
+ "id": "tempora:Quad6-6r:1:vw",
"tempora": "",
"title": "Holy Saturday",
"rank": 1,
- "colour": "vw"
+ "colours": [
+ "v",
+ "w"
+ ]
},
- "2026-04-06": {
+ "2027-03-28": {
+ "id": "tempora:Pasc0-0:1:w",
"tempora": "",
- "title": "Monday in the Octave of Easter",
+ "title": "Easter Sunday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-05": {
+ "2027-03-29": {
+ "id": "tempora:Pasc0-1:1:w",
"tempora": "",
- "title": "Easter Sunday",
+ "title": "Monday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-07": {
+ "2027-03-30": {
+ "id": "tempora:Pasc0-2:1:w",
"tempora": "",
"title": "Tuesday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-03-29": {
+ "2027-03-31": {
+ "id": "tempora:Pasc0-3:1:w",
"tempora": "",
- "title": "Palm Sunday",
+ "title": "Wednesday in the Octave of Easter",
"rank": 1,
- "colour": "rv"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-09": {
+ "2027-04-01": {
+ "id": "tempora:Pasc0-4:1:w",
"tempora": "",
"title": "Thursday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-03-31": {
+ "2027-04-02": {
+ "id": "tempora:Pasc0-5:1:w",
"tempora": "",
- "title": "Feria III of Holy Week",
+ "title": "Friday in the Octave of Easter",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-08": {
+ "2027-04-03": {
+ "id": "tempora:Pasc0-6:1:w",
"tempora": "",
- "title": "Wednesday in the Octave of Easter",
+ "title": "Saturday in the Octave of Easter",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-10": {
- "tempora": "",
- "title": "Friday in the Octave of Easter",
- "rank": 1,
- "colour": "w"
- },
- "2026-04-12": {
+ "2027-04-04": {
+ "id": "tempora:Pasc1-0:1:w",
"tempora": "",
"title": "Low Sunday",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-11": {
- "tempora": "",
- "title": "Saturday in the Octave of Easter",
+ "2027-04-05": {
+ "id": "sancti:03-25:1:w",
+ "tempora": "Monday after I Sunday after Easter",
+ "title": "Annunciation of the Blessed Virgin Mary",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-16": {
- "tempora": "Thursday after I Sunday after Easter",
+ "2027-04-06": {
+ "id": "tempora:Pasc1-0:1:w",
+ "tempora": "Tuesday after I Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-15": {
+ "2027-04-07": {
+ "id": "tempora:Pasc1-0:1:w",
"tempora": "Wednesday after I Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-19": {
+ "2027-04-08": {
+ "id": "tempora:Pasc1-0:1:w",
+ "tempora": "Thursday after I Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-09": {
+ "id": "tempora:Pasc1-0:1:w",
+ "tempora": "Friday after I Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-10": {
+ "id": "commune:C10Pasc:4:w",
+ "tempora": "Saturday after I Sunday after Easter",
+ "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-11": {
+ "id": "tempora:Pasc2-0:2:w",
"tempora": "",
"title": "II Sunday after Easter",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-13": {
- "tempora": "Monday after I Sunday after Easter",
- "title": "St. Hermenegild",
- "rank": 3,
- "colour": "r"
- },
- "2026-04-20": {
+ "2027-04-12": {
+ "id": "tempora:Pasc2-0:2:w",
"tempora": "Monday after II Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-01": {
- "tempora": "",
- "title": "Feria IV of Holy Week",
- "rank": 1,
- "colour": "v"
- },
- "2026-04-14": {
- "tempora": "Tuesday after I Sunday after Easter",
- "title": "St. Justin",
+ "2027-04-13": {
+ "id": "sancti:04-13:3:r",
+ "tempora": "Tuesday after II Sunday after Easter",
+ "title": "St. Hermenegild",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-04-22": {
+ "2027-04-14": {
+ "id": "sancti:04-14:3:r",
"tempora": "Wednesday after II Sunday after Easter",
- "title": "Sts. Soter & Caius",
+ "title": "St. Justin",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-04-25": {
+ "2027-04-15": {
+ "id": "tempora:Pasc2-0:2:w",
+ "tempora": "Thursday after II Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-16": {
+ "id": "tempora:Pasc2-0:2:w",
+ "tempora": "Friday after II Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-17": {
+ "id": "commune:C10Pasc:4:w",
"tempora": "Saturday after II Sunday after Easter",
- "title": "St. Mark",
- "rank": 2,
- "colour": "r"
+ "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-04-26": {
+ "2027-04-18": {
+ "id": "tempora:Pasc3-0r:2:w",
"tempora": "",
"title": "III Sunday after Easter",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-28": {
- "tempora": "Tuesday after III Sunday after Easter",
- "title": "St. Paul of the Cross",
- "rank": 3,
- "colour": "w"
- },
- "2026-04-17": {
- "tempora": "Friday after I Sunday after Easter",
+ "2027-04-19": {
+ "id": "tempora:Pasc3-0r:2:w",
+ "tempora": "Monday after III Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
- },
- "2026-04-24": {
- "tempora": "Friday after II Sunday after Easter",
- "title": "St. Fidelis of Sigmaringen",
- "rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-23": {
- "tempora": "Thursday after II Sunday after Easter",
+ "2027-04-20": {
+ "id": "tempora:Pasc3-0r:2:w",
+ "tempora": "Tuesday after III Sunday after Easter",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-21": {
- "tempora": "Tuesday after II Sunday after Easter",
+ "2027-04-21": {
+ "id": "sancti:04-21:3:w",
+ "tempora": "Wednesday after III Sunday after Easter",
"title": "St. Anselm",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-01": {
- "tempora": "Friday after III Sunday after Easter",
- "title": "St. Joseph the Workman",
- "rank": 1,
- "colour": "w"
- },
- "2026-04-29": {
- "tempora": "Wednesday after III Sunday after Easter",
- "title": "St. Peter of Verona",
+ "2027-04-22": {
+ "id": "sancti:04-22:3:r",
+ "tempora": "Thursday after III Sunday after Easter",
+ "title": "Sts. Soter & Caius",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-02": {
+ "2027-04-23": {
+ "id": "tempora:Pasc3-0r:2:w",
+ "tempora": "Friday after III Sunday after Easter",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-04-24": {
+ "id": "sancti:04-24:3:r",
"tempora": "Saturday after III Sunday after Easter",
- "title": "St. Athanasius",
+ "title": "St. Fidelis of Sigmaringen",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-03": {
+ "2027-04-25": {
+ "id": "tempora:Pasc4-0:2:w",
"tempora": "",
"title": "IV Sunday after Easter",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-04-30": {
- "tempora": "Thursday after III Sunday after Easter",
- "title": "St. Catherine of Siena",
+ "2027-04-26": {
+ "id": "sancti:04-26:3:r",
+ "tempora": "Monday after IV Sunday after Easter",
+ "title": "Sts. Cletus & Marcellinus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-04-27": {
- "tempora": "Monday after III Sunday after Easter",
+ "2027-04-27": {
+ "id": "sancti:04-27:3:w",
+ "tempora": "Tuesday after IV Sunday after Easter",
"title": "St. Peter Canisius",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-10": {
- "tempora": "",
- "title": "V Sunday after Easter",
- "rank": 2,
- "colour": "w"
+ "2027-04-28": {
+ "id": "sancti:04-28:3:w",
+ "tempora": "Wednesday after IV Sunday after Easter",
+ "title": "St. Paul of the Cross",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-05-04": {
- "tempora": "Monday after IV Sunday after Easter",
- "title": "St. Monica",
+ "2027-04-29": {
+ "id": "sancti:04-29:3:r",
+ "tempora": "Thursday after IV Sunday after Easter",
+ "title": "St. Peter of Verona",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-08": {
+ "2027-04-30": {
+ "id": "sancti:04-30:3:w",
"tempora": "Friday after IV Sunday after Easter",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
+ "title": "St. Catherine of Siena",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-04-18": {
- "tempora": "Saturday after I Sunday after Easter",
- "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2027-05-01": {
+ "id": "sancti:05-01r:1:w",
+ "tempora": "Saturday after IV Sunday after Easter",
+ "title": "St. Joseph the Workman",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2026-05-06": {
- "tempora": "Wednesday after IV Sunday after Easter",
+ "2027-05-02": {
+ "id": "tempora:Pasc5-0:2:w",
+ "tempora": "",
+ "title": "V Sunday after Easter",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-05-03": {
+ "id": "tempora:Pasc5-0:2:w",
+ "tempora": "The Minor Litanies – Rogations",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-05": {
- "tempora": "Tuesday after IV Sunday after Easter",
- "title": "St. Pius V",
- "rank": 3,
- "colour": "w"
- },
- "2026-05-12": {
+ "2027-05-04": {
+ "id": "sancti:05-04:3:w",
"tempora": "The Minor Litanies – Rogations",
- "title": "Sts. Nereus, Achilleus, Domitilla, & Pancras",
+ "title": "St. Monica",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-11": {
- "tempora": "The Minor Litanies – Rogations",
- "title": "Sts. Philip & James",
+ "2027-05-05": {
+ "id": "tempora:Pasc5-3:2:w",
+ "tempora": "",
+ "title": "Vigil of the Ascension",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-07": {
- "tempora": "Thursday after IV Sunday after Easter",
- "title": "St. Stanislaus",
- "rank": 3,
- "colour": "r"
- },
- "2026-05-14": {
+ "2027-05-06": {
+ "id": "tempora:Pasc5-4:1:w",
"tempora": "",
"title": "Ascension of the Lord",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-17": {
+ "2027-05-07": {
+ "id": "sancti:05-07:3:r",
+ "tempora": "Feria VI after the Ascension",
+ "title": "St. Stanislaus",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-05-08": {
+ "id": "commune:C10Pasc:4:w",
+ "tempora": "Saturday after the Ascension",
+ "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-05-09": {
+ "id": "tempora:Pasc6-0:2:w",
"tempora": "",
"title": "Sunday after the Ascension",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-21": {
- "tempora": "Feria V after the Ascension",
- "title": "Feria",
- "rank": 4,
- "colour": "w"
- },
- "2026-05-18": {
+ "2027-05-10": {
+ "id": "sancti:05-10:3:w",
"tempora": "Feria II after the Ascension",
- "title": "St. Venantius",
+ "title": "St. Antoninus",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-09": {
- "tempora": "Saturday after IV Sunday after Easter",
- "title": "St. Gregory of Nazianzen",
+ "2027-05-11": {
+ "id": "sancti:05-11r:2:r",
+ "tempora": "Feria III after the Ascension",
+ "title": "Sts. Philip & James",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-05-12": {
+ "id": "sancti:05-12:3:r",
+ "tempora": "Feria IV after the Ascension",
+ "title": "Sts. Nereus, Achilleus, Domitilla, & Pancras",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-23": {
- "tempora": "",
- "title": "Saturday after the Ascension",
- "rank": 1,
- "colour": "r"
+ "2027-05-13": {
+ "id": "sancti:05-13:3:w",
+ "tempora": "Feria V after the Ascension",
+ "title": "St. Robert Bellarmine",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-05-22": {
+ "2027-05-14": {
+ "id": "tempora:Pasc6-0:2:w",
"tempora": "Feria VI after the Ascension",
"title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-05-24": {
+ "2027-05-15": {
+ "id": "tempora:Pasc6-6:1:r",
"tempora": "",
- "title": "Pentecost Sunday",
+ "title": "Saturday after the Ascension",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-26": {
+ "2027-05-16": {
+ "id": "tempora:Pasc7-0:1:r",
"tempora": "",
- "title": "Tuesday after Pentecost",
+ "title": "Pentecost Sunday",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-13": {
- "tempora": "",
- "title": "Vigil of the Ascension",
- "rank": 2,
- "colour": "w"
- },
- "2026-05-25": {
+ "2027-05-17": {
+ "id": "tempora:Pasc7-1:1:r",
"tempora": "",
"title": "Monday after Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-15": {
- "tempora": "Feria VI after the Ascension",
- "title": "St. John Baptist de la Salle",
- "rank": 3,
- "colour": "w"
- },
- "2026-05-28": {
+ "2027-05-18": {
+ "id": "tempora:Pasc7-2:1:r",
"tempora": "",
- "title": "Thursday after Pentecost",
+ "title": "Tuesday after Pentecost",
"rank": 1,
- "colour": "r"
- },
- "2026-05-19": {
- "tempora": "Feria III after the Ascension",
- "title": "St. Peter Celestine",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-20": {
- "tempora": "Feria IV after the Ascension",
- "title": "St. Bernardine of Siena",
- "rank": 3,
- "colour": "w"
- },
- "2026-05-27": {
+ "2027-05-19": {
+ "id": "tempora:Pasc7-3:1:r",
"tempora": "",
"title": "Ember Wednesday of Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-29": {
+ "2027-05-20": {
+ "id": "tempora:Pasc7-4:1:r",
"tempora": "",
- "title": "Ember Friday of Pentecost",
+ "title": "Thursday after Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-05-16": {
- "tempora": "Saturday after the Ascension",
- "title": "IV Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "2027-05-21": {
+ "id": "tempora:Pasc7-5:1:r",
+ "tempora": "",
+ "title": "Ember Friday of Pentecost",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
},
- "2026-05-30": {
+ "2027-05-22": {
+ "id": "tempora:Pasc7-6:1:r",
"tempora": "",
"title": "Ember Saturday of Pentecost",
"rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-06-03": {
- "tempora": "Feria IV after I Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2027-05-23": {
+ "id": "tempora:Pent01-0r:1:w",
+ "tempora": "",
+ "title": "Trinity Sunday",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2026-06-08": {
- "tempora": "Feria II after II Sunday after Pentecost",
+ "2027-05-24": {
+ "id": "tempora:Pent01-0a:2:g",
+ "tempora": "Feria II after I Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-05": {
- "tempora": "Feria V after I Sunday after Pentecost",
- "title": "St. Boniface",
+ "2027-05-25": {
+ "id": "sancti:05-25:3:w",
+ "tempora": "Feria III after I Sunday after Pentecost",
+ "title": "St. Gregory VII",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-07": {
- "tempora": "",
- "title": "II Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "2027-05-26": {
+ "id": "sancti:05-26:3:w",
+ "tempora": "Feria IV after I Sunday after Pentecost",
+ "title": "St. Philip Neri",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-05-31": {
+ "2027-05-27": {
+ "id": "tempora:Pent01-4:1:w",
"tempora": "",
- "title": "Trinity Sunday",
+ "title": "Corpus Christi",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-11": {
- "tempora": "Feria V after II Sunday after Pentecost",
- "title": "St. Barnabas",
+ "2027-05-28": {
+ "id": "sancti:05-28:3:w",
+ "tempora": "Feria V after I Sunday after Pentecost",
+ "title": "St. Augustine of Canterbury",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-01": {
- "tempora": "Feria II after I Sunday after Pentecost",
+ "2027-05-29": {
+ "id": "sancti:05-29:3:w",
+ "tempora": "Saturday after I Sunday after Pentecost",
+ "title": "St. Mary Magdalene de Pazzi",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-05-30": {
+ "id": "tempora:Pent02-0r:2:g",
+ "tempora": "",
+ "title": "II Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-05-31": {
+ "id": "sancti:05-31:2:w",
+ "tempora": "Feria II after II Sunday after Pentecost",
+ "title": "Queenship of the Blessed Virgin Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-06-01": {
+ "id": "sancti:06-01:3:w",
+ "tempora": "Feria III after II Sunday after Pentecost",
"title": "St. Angela Merici",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-10": {
+ "2027-06-02": {
+ "id": "tempora:Pent02-0r:2:g",
"tempora": "Feria IV after II Sunday after Pentecost",
- "title": "St. Margaret of Scotland",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-06-04": {
+ "2027-06-03": {
+ "id": "tempora:Pent02-0r:2:g",
+ "tempora": "Feria V after II Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-06-04": {
+ "id": "tempora:Pent02-5:1:w",
"tempora": "",
- "title": "Corpus Christi",
+ "title": "Sacred Heart of Jesus",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-14": {
+ "2027-06-05": {
+ "id": "sancti:06-05:3:r",
+ "tempora": "Saturday after II Sunday after Pentecost",
+ "title": "St. Boniface",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-06-06": {
+ "id": "tempora:Pent03-0r:2:g",
"tempora": "",
"title": "III Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-16": {
+ "2027-06-07": {
+ "id": "tempora:Pent03-0r:2:g",
+ "tempora": "Feria II after III Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-06-08": {
+ "id": "tempora:Pent03-0r:2:g",
"tempora": "Feria III after III Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-02": {
- "tempora": "Feria III after I Sunday after Pentecost",
+ "2027-06-09": {
+ "id": "tempora:Pent03-0r:2:g",
+ "tempora": "Feria IV after III Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-12": {
- "tempora": "",
- "title": "Sacred Heart of Jesus",
- "rank": 1,
- "colour": "w"
+ "2027-06-10": {
+ "id": "sancti:06-10:3:w",
+ "tempora": "Feria V after III Sunday after Pentecost",
+ "title": "St. Margaret of Scotland",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-06-21": {
+ "2027-06-11": {
+ "id": "sancti:06-11:3:r",
+ "tempora": "Feria VI after III Sunday after Pentecost",
+ "title": "St. Barnabas",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-06-12": {
+ "id": "sancti:06-12:3:r",
+ "tempora": "Saturday after III Sunday after Pentecost",
+ "title": "St. John of San Fecundo",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-06-13": {
+ "id": "tempora:Pent04-0:2:g",
"tempora": "",
"title": "IV Sunday after Pentecost",
"rank": 2,
- "colour": "g"
- },
- "2026-06-09": {
- "tempora": "Feria III after II Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-13": {
- "tempora": "Saturday after II Sunday after Pentecost",
- "title": "St. Anthony of Padua",
+ "2027-06-14": {
+ "id": "sancti:06-14:3:w",
+ "tempora": "Feria II after IV Sunday after Pentecost",
+ "title": "St. Basil the Great",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-23": {
+ "2027-06-15": {
+ "id": "tempora:Pent04-0:2:g",
"tempora": "Feria III after IV Sunday after Pentecost",
- "title": "Vigil of the Nativity of St. John the Baptist",
- "rank": 2,
- "colour": "v"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-06-15": {
- "tempora": "Feria II after III Sunday after Pentecost",
+ "2027-06-16": {
+ "id": "tempora:Pent04-0:2:g",
+ "tempora": "Feria IV after IV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-06": {
- "tempora": "Saturday after I Sunday after Pentecost",
- "title": "St. Norbert",
+ "2027-06-17": {
+ "id": "sancti:06-17r:3:w",
+ "tempora": "Feria V after IV Sunday after Pentecost",
+ "title": "St. Gregory Barbarigo",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-22": {
- "tempora": "Feria II after IV Sunday after Pentecost",
- "title": "St. Paulinus of Nola",
+ "2027-06-18": {
+ "id": "sancti:06-18:3:r",
+ "tempora": "Feria VI after IV Sunday after Pentecost",
+ "title": "St. Ephrem of Syria",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-06-19": {
- "tempora": "Feria VI after III Sunday after Pentecost",
+ "2027-06-19": {
+ "id": "sancti:06-19:3:r",
+ "tempora": "Saturday after IV Sunday after Pentecost",
"title": "St. Julia of Falconieri",
"rank": 3,
- "colour": "r"
- },
- "2026-07-01": {
- "tempora": "Feria IV after V Sunday after Pentecost",
- "title": "The Precious Blood of Our Lord Jesus Christ",
- "rank": 1,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-07-02": {
- "tempora": "Feria V after V Sunday after Pentecost",
- "title": "Visitation of the Blessed Virgin Mary",
+ "2027-06-20": {
+ "id": "tempora:Pent05-0:2:g",
+ "tempora": "",
+ "title": "V Sunday after Pentecost",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-03": {
- "tempora": "Feria VI after V Sunday after Pentecost",
- "title": "St. Irenaeus",
+ "2027-06-21": {
+ "id": "sancti:06-21:3:w",
+ "tempora": "Feria II after V Sunday after Pentecost",
+ "title": "St. Aloysius Gongzaga",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-24": {
- "tempora": "Feria IV after IV Sunday after Pentecost",
+ "2027-06-22": {
+ "id": "sancti:06-22:3:w",
+ "tempora": "Feria III after V Sunday after Pentecost",
+ "title": "St. Paulinus of Nola",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-06-23": {
+ "id": "sancti:06-23:2:v",
+ "tempora": "Feria IV after V Sunday after Pentecost",
+ "title": "Vigil of the Nativity of St. John the Baptist",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-06-24": {
+ "id": "sancti:06-24:1:w",
+ "tempora": "Feria V after V Sunday after Pentecost",
"title": "Nativity of St. John the Baptist",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-04": {
+ "2027-06-25": {
+ "id": "sancti:06-25:3:w",
+ "tempora": "Feria VI after V Sunday after Pentecost",
+ "title": "St. William",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-06-26": {
+ "id": "sancti:06-26:3:r",
"tempora": "Saturday after V Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "title": "Sts. John & Paul",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2026-07-05": {
+ "2027-06-27": {
+ "id": "tempora:Pent06-0:2:g",
"tempora": "",
"title": "VI Sunday after Pentecost",
"rank": 2,
- "colour": "g"
- },
- "2026-07-07": {
- "tempora": "Feria III after VI Sunday after Pentecost",
- "title": "Sts. Cyril & Methodius",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-06": {
+ "2027-06-28": {
+ "id": "sancti:06-28r:2:v",
"tempora": "Feria II after VI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "Vigil of Sts. Peter & Paul",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-07-08": {
+ "2027-06-29": {
+ "id": "sancti:06-29:1:r",
+ "tempora": "Feria III after VI Sunday after Pentecost",
+ "title": "Sts. Peter & Paul",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-06-30": {
+ "id": "sancti:06-30:3:r",
"tempora": "Feria IV after VI Sunday after Pentecost",
- "title": "St. Elizabeth of Portugal",
+ "title": "In Commemoratione Sancti Pauli Apostoli",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-07-09": {
+ "2027-07-01": {
+ "id": "sancti:07-01:1:r",
"tempora": "Feria V after VI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "The Precious Blood of Our Lord Jesus Christ",
+ "rank": 1,
+ "colours": [
+ "r"
+ ]
},
- "2026-07-10": {
+ "2027-07-02": {
+ "id": "sancti:07-02:2:w",
"tempora": "Feria VI after VI Sunday after Pentecost",
- "title": "Seven Holy Brothers and Sts. Rufina & Secunda",
- "rank": 3,
- "colour": "r"
- },
- "2026-06-26": {
- "tempora": "Feria VI after IV Sunday after Pentecost",
- "title": "Sts. John & Paul",
- "rank": 3,
- "colour": "r"
+ "title": "Visitation of the Blessed Virgin Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2026-07-11": {
+ "2027-07-03": {
+ "id": "sancti:07-03r:3:r",
"tempora": "Saturday after VI Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "title": "St. Irenaeus",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2026-07-12": {
+ "2027-07-04": {
+ "id": "tempora:Pent07-0:2:g",
"tempora": "",
"title": "VII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-13": {
+ "2027-07-05": {
+ "id": "sancti:07-05:3:w",
"tempora": "Feria II after VII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Anthony Mary Zaccariah",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-07-14": {
+ "2027-07-06": {
+ "id": "tempora:Pent07-0:2:g",
"tempora": "Feria III after VII Sunday after Pentecost",
- "title": "St. Bonaventure",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-06-18": {
- "tempora": "Feria V after III Sunday after Pentecost",
- "title": "St. Ephrem of Syria",
+ "2027-07-07": {
+ "id": "sancti:07-07:3:w",
+ "tempora": "Feria IV after VII Sunday after Pentecost",
+ "title": "Sts. Cyril & Methodius",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-15": {
- "tempora": "Feria IV after VII Sunday after Pentecost",
- "title": "St. Henry the Emperor",
+ "2027-07-08": {
+ "id": "sancti:07-08:3:w",
+ "tempora": "Feria V after VII Sunday after Pentecost",
+ "title": "St. Elizabeth of Portugal",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-17": {
+ "2027-07-09": {
+ "id": "tempora:Pent07-0:2:g",
"tempora": "Feria VI after VII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
- },
- "2026-07-16": {
- "tempora": "Feria V after VII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-18": {
+ "2027-07-10": {
+ "id": "sancti:07-10:3:r",
"tempora": "Saturday after VII Sunday after Pentecost",
- "title": "Camillus de Lellis",
+ "title": "Seven Holy Brothers and Sts. Rufina & Secunda",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-07-19": {
+ "2027-07-11": {
+ "id": "tempora:Pent08-0:2:g",
"tempora": "",
"title": "VIII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-29": {
- "tempora": "Feria II after V Sunday after Pentecost",
- "title": "Sts. Peter & Paul",
- "rank": 1,
- "colour": "r"
- },
- "2026-07-22": {
- "tempora": "Feria IV after VIII Sunday after Pentecost",
- "title": "St. Mary Magdalene",
+ "2027-07-12": {
+ "id": "sancti:07-12:3:r",
+ "tempora": "Feria II after VIII Sunday after Pentecost",
+ "title": "St. John Gualbert",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-07-21": {
+ "2027-07-13": {
+ "id": "tempora:Pent08-0:2:g",
"tempora": "Feria III after VIII Sunday after Pentecost",
- "title": "St. Laurence of Brindisi",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-07-14": {
+ "id": "sancti:07-14:3:w",
+ "tempora": "Feria IV after VIII Sunday after Pentecost",
+ "title": "St. Bonaventure",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-23": {
+ "2027-07-15": {
+ "id": "sancti:07-15:3:w",
"tempora": "Feria V after VIII Sunday after Pentecost",
- "title": "St. Apollinaris",
+ "title": "St. Henry the Emperor",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-24": {
+ "2027-07-16": {
+ "id": "tempora:Pent08-0:2:g",
"tempora": "Feria VI after VIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-25": {
+ "2027-07-17": {
+ "id": "commune:C10t:4:w",
"tempora": "Saturday after VIII Sunday after Pentecost",
- "title": "St. James the Greater",
- "rank": 2,
- "colour": "r"
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-07-26": {
+ "2027-07-18": {
+ "id": "tempora:Pent09-0:2:g",
"tempora": "",
"title": "IX Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-07-27": {
+ "2027-07-19": {
+ "id": "sancti:07-19:3:w",
"tempora": "Feria II after IX Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Vincent de Paul",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-07-28": {
+ "2027-07-20": {
+ "id": "sancti:07-20:3:r",
"tempora": "Feria III after IX Sunday after Pentecost",
- "title": "Sts. Nazarius & Celsus, St. Victor I & St. Innocent I",
+ "title": "St. Jerome Emiliani",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-07-29": {
+ "2027-07-21": {
+ "id": "sancti:07-21r:3:w",
"tempora": "Feria IV after IX Sunday after Pentecost",
- "title": "St. Martha",
+ "title": "St. Laurence of Brindisi",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-30": {
+ "2027-07-22": {
+ "id": "sancti:07-22:3:w",
"tempora": "Feria V after IX Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Mary Magdalene",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-07-31": {
+ "2027-07-23": {
+ "id": "sancti:07-23:3:w",
"tempora": "Feria VI after IX Sunday after Pentecost",
- "title": "St. Ignatius Loyola",
+ "title": "St. Apollinaris",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-01": {
+ "2027-07-24": {
+ "id": "commune:C10t:4:w",
"tempora": "Saturday after IX Sunday after Pentecost",
"title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-02": {
+ "2027-07-25": {
+ "id": "tempora:Pent10-0:2:g",
"tempora": "",
"title": "X Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-08-03": {
+ "2027-07-26": {
+ "id": "sancti:07-26:2:w",
"tempora": "Feria II after X Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Anne, Mother of the Blessed Virgin",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2026-08-04": {
+ "2027-07-27": {
+ "id": "tempora:Pent10-0:2:g",
"tempora": "Feria III after X Sunday after Pentecost",
- "title": "St. Dominic",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-08-05": {
+ "2027-07-28": {
+ "id": "sancti:07-28:3:r",
"tempora": "Feria IV after X Sunday after Pentecost",
- "title": "Dedication of the Basilica of St. Mary Major",
+ "title": "Sts. Nazarius & Celsus, St. Victor I & St. Innocent I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-08-06": {
+ "2027-07-29": {
+ "id": "sancti:07-29:3:r",
"tempora": "Feria V after X Sunday after Pentecost",
- "title": "Transfiguration of Our Lord",
- "rank": 2,
- "colour": "w"
- },
- "2026-06-17": {
- "tempora": "Feria IV after III Sunday after Pentecost",
- "title": "St. Gregory Barbarigo",
+ "title": "St. Martha",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-08-07": {
+ "2027-07-30": {
+ "id": "tempora:Pent10-0:2:g",
"tempora": "Feria VI after X Sunday after Pentecost",
- "title": "St. Cajetan",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-08-08": {
+ "2027-07-31": {
+ "id": "sancti:07-31:3:w",
"tempora": "Saturday after X Sunday after Pentecost",
- "title": "St. John Mary Vianney",
+ "title": "St. Ignatius Loyola",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-10": {
- "tempora": "Feria II after XI Sunday after Pentecost",
- "title": "St. Lawrence",
+ "2027-08-01": {
+ "id": "tempora:Pent11-0:2:g",
+ "tempora": "",
+ "title": "XI Sunday after Pentecost",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "g"
+ ]
},
- "2026-08-09": {
- "tempora": "XI Sunday after Pentecost",
- "title": "Vigil of St. Lawrence",
+ "2027-08-02": {
+ "id": "sancti:08-02:3:r",
+ "tempora": "Feria II after XI Sunday after Pentecost",
+ "title": "St. Alphonsus Liguori",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-08-11": {
+ "2027-08-03": {
+ "id": "tempora:Pent11-0:2:g",
"tempora": "Feria III after XI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-08-12": {
+ "2027-08-04": {
+ "id": "sancti:08-04:3:w",
"tempora": "Feria IV after XI Sunday after Pentecost",
- "title": "St. Clare",
+ "title": "St. Dominic",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-13": {
+ "2027-08-05": {
+ "id": "sancti:08-05:3:w",
"tempora": "Feria V after XI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2026-08-16": {
- "tempora": "",
- "title": "XII Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "title": "Dedication of the Basilica of St. Mary Major",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-08-14": {
+ "2027-08-06": {
+ "id": "sancti:08-06:2:w",
"tempora": "Feria VI after XI Sunday after Pentecost",
- "title": "Vigil of the Assumption",
+ "title": "Transfiguration of Our Lord",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-15": {
+ "2027-08-07": {
+ "id": "sancti:08-07:3:w",
"tempora": "Saturday after XI Sunday after Pentecost",
- "title": "Assumption of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
+ "title": "St. Cajetan",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-08-17": {
+ "2027-08-08": {
+ "id": "tempora:Pent12-0:2:g",
+ "tempora": "",
+ "title": "XII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-08-09": {
+ "id": "sancti:08-09t:3:r",
"tempora": "Feria II after XII Sunday after Pentecost",
- "title": "St. Hyacinth",
+ "title": "Vigil of St. Lawrence",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-08-18": {
+ "2027-08-10": {
+ "id": "sancti:08-10:2:r",
"tempora": "Feria III after XII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Lawrence",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
},
- "2026-08-19": {
+ "2027-08-11": {
+ "id": "tempora:Pent12-0:2:g",
"tempora": "Feria IV after XII Sunday after Pentecost",
- "title": "St. John Eudes",
- "rank": 3,
- "colour": "w"
- },
- "2026-06-25": {
- "tempora": "Feria V after IV Sunday after Pentecost",
- "title": "St. William",
- "rank": 3,
- "colour": "w"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-08-20": {
+ "2027-08-12": {
+ "id": "sancti:08-12:3:w",
"tempora": "Feria V after XII Sunday after Pentecost",
- "title": "St. Bernard of Clairvaux",
+ "title": "St. Clare",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-21": {
+ "2027-08-13": {
+ "id": "tempora:Pent12-0:2:g",
"tempora": "Feria VI after XII Sunday after Pentecost",
- "title": "St. Jane Frances de Chantal",
- "rank": 3,
- "colour": "w"
- },
- "2026-08-23": {
- "tempora": "",
- "title": "XIII Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-08-22": {
+ "2027-08-14": {
+ "id": "sancti:08-14:2:w",
"tempora": "Saturday after XII Sunday after Pentecost",
- "title": "Immaculate Heart of Mary",
+ "title": "Vigil of the Assumption",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-24": {
+ "2027-08-15": {
+ "id": "sancti:08-15:1:w",
+ "tempora": "XIII Sunday after Pentecost",
+ "title": "Assumption of the Blessed Virgin Mary",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-08-16": {
+ "id": "sancti:08-16:2:w",
"tempora": "Feria II after XIII Sunday after Pentecost",
- "title": "St. Bartholomew",
+ "title": "St. Joachim, Father of the Blessed Virgin",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-25": {
+ "2027-08-17": {
+ "id": "sancti:08-17:3:w",
"tempora": "Feria III after XIII Sunday after Pentecost",
- "title": "St. Louis IX",
+ "title": "St. Hyacinth",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-26": {
+ "2027-08-18": {
+ "id": "tempora:Pent13-0:2:g",
"tempora": "Feria IV after XIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-08-27": {
+ "2027-08-19": {
+ "id": "sancti:08-19:3:w",
"tempora": "Feria V after XIII Sunday after Pentecost",
- "title": "St. Joseph Calasance",
+ "title": "St. John Eudes",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-28": {
+ "2027-08-20": {
+ "id": "sancti:08-20:3:w",
"tempora": "Feria VI after XIII Sunday after Pentecost",
- "title": "St. Augustine",
+ "title": "St. Bernard of Clairvaux",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-29": {
+ "2027-08-21": {
+ "id": "sancti:08-21:3:w",
"tempora": "Saturday after XIII Sunday after Pentecost",
- "title": "Beheading of St. John the Baptist",
+ "title": "St. Jane Frances de Chantal",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-08-30": {
+ "2027-08-22": {
+ "id": "tempora:Pent14-0:2:g",
"tempora": "",
"title": "XIV Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-08-31": {
+ "2027-08-23": {
+ "id": "sancti:08-23:3:w",
"tempora": "Feria II after XIV Sunday after Pentecost",
- "title": "St. Raymond Nonnatus",
+ "title": "St. Philip Benizi",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-01": {
+ "2027-08-24": {
+ "id": "sancti:08-24:2:r",
"tempora": "Feria III after XIV Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2026-06-28": {
- "tempora": "",
- "title": "V Sunday after Pentecost",
+ "title": "St. Bartholomew",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "r"
+ ]
},
- "2026-09-07": {
- "tempora": "Feria II after XV Sunday after Pentecost",
+ "2027-08-25": {
+ "id": "sancti:08-25:3:w",
+ "tempora": "Feria IV after XIV Sunday after Pentecost",
+ "title": "St. Louis IX",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-08-26": {
+ "id": "tempora:Pent14-0:2:g",
+ "tempora": "Feria V after XIV Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-04": {
+ "2027-08-27": {
+ "id": "sancti:08-27:3:w",
"tempora": "Feria VI after XIV Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Joseph Calasance",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-09-06": {
+ "2027-08-28": {
+ "id": "sancti:08-28:3:r",
+ "tempora": "Saturday after XIV Sunday after Pentecost",
+ "title": "St. Augustine",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-08-29": {
+ "id": "tempora:Pent15-0:2:g",
"tempora": "",
"title": "XV Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-30": {
- "tempora": "Feria III after V Sunday after Pentecost",
- "title": "In Commemoratione Sancti Pauli Apostoli",
+ "2027-08-30": {
+ "id": "sancti:08-30:3:r",
+ "tempora": "Feria II after XV Sunday after Pentecost",
+ "title": "St. Rose of Lima",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-09-03": {
- "tempora": "Feria V after XIV Sunday after Pentecost",
- "title": "St. Pius X",
+ "2027-08-31": {
+ "id": "sancti:08-31:3:w",
+ "tempora": "Feria III after XV Sunday after Pentecost",
+ "title": "St. Raymond Nonnatus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-13": {
- "tempora": "",
- "title": "XVI Sunday after Pentecost",
- "rank": 2,
- "colour": "g"
- },
- "2026-09-14": {
- "tempora": "Feria II after XVI Sunday after Pentecost",
- "title": "Exaltation of the Holy Cross",
- "rank": 2,
- "colour": "r"
+ "2027-09-01": {
+ "id": "tempora:Pent15-0:2:g",
+ "tempora": "Feria IV after XV Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-09-10": {
+ "2027-09-02": {
+ "id": "sancti:09-02:3:w",
"tempora": "Feria V after XV Sunday after Pentecost",
- "title": "St. Nicholas of Tolentino",
+ "title": "St. Stephen of Hungary",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-02": {
- "tempora": "Feria IV after XIV Sunday after Pentecost",
- "title": "St. Stephen of Hungary",
+ "2027-09-03": {
+ "id": "sancti:09-03:3:w",
+ "tempora": "Feria VI after XV Sunday after Pentecost",
+ "title": "St. Pius X",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-06-27": {
- "tempora": "Saturday after IV Sunday after Pentecost",
+ "2027-09-04": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XV Sunday after Pentecost",
"title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-07-20": {
- "tempora": "Feria II after VIII Sunday after Pentecost",
- "title": "St. Jerome Emiliani",
- "rank": 3,
- "colour": "r"
- },
- "2026-09-08": {
- "tempora": "Feria III after XV Sunday after Pentecost",
- "title": "Nativity of the Blessed Virgin Mary",
+ "2027-09-05": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "",
+ "title": "XVI Sunday after Pentecost",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-06-20": {
- "tempora": "Saturday after III Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "2027-09-06": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "Feria II after XVI Sunday after Pentecost",
+ "title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-09": {
- "tempora": "Feria IV after XV Sunday after Pentecost",
+ "2027-09-07": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "Feria III after XVI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-11": {
- "tempora": "Feria VI after XV Sunday after Pentecost",
+ "2027-09-08": {
+ "id": "sancti:09-08:2:w",
+ "tempora": "Feria IV after XVI Sunday after Pentecost",
+ "title": "Nativity of the Blessed Virgin Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-09-09": {
+ "id": "tempora:Pent16-0:2:g",
+ "tempora": "Feria V after XVI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-12": {
- "tempora": "Saturday after XV Sunday after Pentecost",
- "title": "Most Holy Name of Mary",
+ "2027-09-10": {
+ "id": "sancti:09-10:3:w",
+ "tempora": "Feria VI after XVI Sunday after Pentecost",
+ "title": "St. Nicholas of Tolentino",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-19": {
+ "2027-09-11": {
+ "id": "commune:C10t:4:w",
"tempora": "Saturday after XVI Sunday after Pentecost",
- "title": "St. Januarius & Companions",
- "rank": 3,
- "colour": "r"
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-09-21": {
+ "2027-09-12": {
+ "id": "tempora:Pent17-0:2:g",
+ "tempora": "",
+ "title": "XVII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-09-13": {
+ "id": "tempora:Pent17-0:2:g",
"tempora": "Feria II after XVII Sunday after Pentecost",
- "title": "St. Matthew",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-09-14": {
+ "id": "sancti:09-14:2:r",
+ "tempora": "Feria III after XVII Sunday after Pentecost",
+ "title": "Exaltation of the Holy Cross",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-09-20": {
- "tempora": "",
- "title": "XVII Sunday after Pentecost",
+ "2027-09-15": {
+ "id": "sancti:09-15:2:w",
+ "tempora": "Feria IV after XVII Sunday after Pentecost",
+ "title": "Seven Sorrows of the Blessed Virgin Mary",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-05": {
- "tempora": "Saturday after XIV Sunday after Pentecost",
- "title": "St. Lawrence Justinian",
+ "2027-09-16": {
+ "id": "sancti:09-16:3:r",
+ "tempora": "Feria V after XVII Sunday after Pentecost",
+ "title": "Sts. Cornelius & Cyprian",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-09-18": {
- "tempora": "Feria VI after XVI Sunday after Pentecost",
- "title": "St. Joseph of Cupertino",
- "rank": 3,
- "colour": "w"
+ "2027-09-17": {
+ "id": "tempora:Pent17-0:2:g",
+ "tempora": "Feria VI after XVII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-09-28": {
- "tempora": "Feria II after XVIII Sunday after Pentecost",
- "title": "St. Wenceslaus",
+ "2027-09-18": {
+ "id": "sancti:09-18:3:w",
+ "tempora": "Saturday after XVII Sunday after Pentecost",
+ "title": "St. Joseph of Cupertino",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-09-27": {
+ "2027-09-19": {
+ "id": "tempora:Pent18-0:2:g",
"tempora": "",
"title": "XVIII Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-25": {
- "tempora": "",
- "title": "Ember Friday of September",
- "rank": 2,
- "colour": "v"
+ "2027-09-20": {
+ "id": "tempora:Pent18-0:2:g",
+ "tempora": "Feria II after XVIII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-09-29": {
+ "2027-09-21": {
+ "id": "sancti:09-21:2:r",
"tempora": "Feria III after XVIII Sunday after Pentecost",
- "title": "Dedication of St. Michael the Archangel",
- "rank": 1,
- "colour": "w"
- },
- "2026-09-15": {
- "tempora": "Feria III after XVI Sunday after Pentecost",
- "title": "Seven Sorrows of the Blessed Virgin Mary",
+ "title": "St. Matthew",
"rank": 2,
- "colour": "w"
- },
- "2026-09-17": {
- "tempora": "Feria V after XVI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "r"
+ ]
},
- "2026-09-23": {
+ "2027-09-22": {
+ "id": "tempora:093-3:2:v",
"tempora": "",
"title": "Ember Wednesday of September",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-10-02": {
- "tempora": "Feria VI after XVIII Sunday after Pentecost",
- "title": "Holy Guardian Angels",
- "rank": 3,
- "colour": "w"
- },
- "2026-10-03": {
- "tempora": "Saturday after XVIII Sunday after Pentecost",
- "title": "St. Theresa of the Infant Jesus",
+ "2027-09-23": {
+ "id": "sancti:09-23:3:r",
+ "tempora": "Feria V after XVIII Sunday after Pentecost",
+ "title": "St. Linus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-10-04": {
+ "2027-09-24": {
+ "id": "tempora:093-5:2:v",
"tempora": "",
- "title": "XIX Sunday after Pentecost",
+ "title": "Ember Friday of September",
"rank": 2,
- "colour": "g"
- },
- "2026-09-30": {
- "tempora": "Feria IV after XVIII Sunday after Pentecost",
- "title": "St. Jerome",
- "rank": 3,
- "colour": "w"
- },
- "2026-10-05": {
- "tempora": "Feria II after XIX Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "colours": [
+ "v"
+ ]
},
- "2026-09-24": {
- "tempora": "Feria V after XVII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2027-09-25": {
+ "id": "tempora:093-6:2:v",
+ "tempora": "",
+ "title": "Ember Saturday of September",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-10-07": {
- "tempora": "Feria IV after XIX Sunday after Pentecost",
- "title": "Our Lady of the Rosary",
+ "2027-09-26": {
+ "id": "tempora:Pent19-0:2:g",
+ "tempora": "",
+ "title": "XIX Sunday after Pentecost",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-09": {
- "tempora": "Feria VI after XIX Sunday after Pentecost",
- "title": "St. John Leonardi",
+ "2027-09-27": {
+ "id": "sancti:09-27:3:r",
+ "tempora": "Feria II after XIX Sunday after Pentecost",
+ "title": "Sts. Cosmas & Damian",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-10-06": {
+ "2027-09-28": {
+ "id": "sancti:09-28:3:r",
"tempora": "Feria III after XIX Sunday after Pentecost",
- "title": "St. Bruno",
+ "title": "St. Wenceslaus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-10-10": {
- "tempora": "Saturday after XIX Sunday after Pentecost",
- "title": "St. Francis Borgia",
+ "2027-09-29": {
+ "id": "sancti:09-29:1:w",
+ "tempora": "Feria IV after XIX Sunday after Pentecost",
+ "title": "Dedication of St. Michael the Archangel",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-09-30": {
+ "id": "sancti:09-30:3:w",
+ "tempora": "Feria V after XIX Sunday after Pentecost",
+ "title": "St. Jerome",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-12": {
- "tempora": "Feria II after XX Sunday after Pentecost",
+ "2027-10-01": {
+ "id": "tempora:Pent19-0:2:g",
+ "tempora": "Feria VI after XIX Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-08": {
- "tempora": "Feria V after XIX Sunday after Pentecost",
- "title": "St. Bridget of Sweden",
+ "2027-10-02": {
+ "id": "sancti:10-02:3:w",
+ "tempora": "Saturday after XIX Sunday after Pentecost",
+ "title": "Holy Guardian Angels",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-11": {
+ "2027-10-03": {
+ "id": "tempora:Pent20-0:2:g",
"tempora": "",
"title": "XX Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-09-26": {
- "tempora": "",
- "title": "Ember Saturday of September",
- "rank": 2,
- "colour": "v"
- },
- "2026-10-16": {
- "tempora": "Feria VI after XX Sunday after Pentecost",
- "title": "St. Hedwig",
- "rank": 3,
- "colour": "w"
- },
- "2026-10-19": {
- "tempora": "Feria II after XXI Sunday after Pentecost",
- "title": "St. Peter of Alcantara",
+ "2027-10-04": {
+ "id": "sancti:10-04:3:w",
+ "tempora": "Feria II after XX Sunday after Pentecost",
+ "title": "St. Francis of Assisi",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-17": {
- "tempora": "Saturday after XX Sunday after Pentecost",
- "title": "St. Margaret Mary Alacoque",
- "rank": 3,
- "colour": "w"
+ "2027-10-05": {
+ "id": "tempora:Pent20-0:2:g",
+ "tempora": "Feria III after XX Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-10-14": {
+ "2027-10-06": {
+ "id": "sancti:10-06:3:w",
"tempora": "Feria IV after XX Sunday after Pentecost",
- "title": "St. Callistus I",
- "rank": 3,
- "colour": "r"
- },
- "2026-09-22": {
- "tempora": "Feria III after XVII Sunday after Pentecost",
- "title": "St. Thomas of Villanova",
+ "title": "St. Bruno",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-15": {
+ "2027-10-07": {
+ "id": "sancti:10-07:2:w",
"tempora": "Feria V after XX Sunday after Pentecost",
- "title": "St. Teresa of Avila",
- "rank": 3,
- "colour": "w"
+ "title": "Our Lady of the Rosary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2026-09-16": {
- "tempora": "Feria IV after XVI Sunday after Pentecost",
- "title": "Sts. Cornelius & Cyprian",
+ "2027-10-08": {
+ "id": "sancti:10-08:3:w",
+ "tempora": "Feria VI after XX Sunday after Pentecost",
+ "title": "St. Bridget of Sweden",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-20": {
- "tempora": "Feria III after XXI Sunday after Pentecost",
- "title": "St. John Cantius",
+ "2027-10-09": {
+ "id": "sancti:10-09:3:w",
+ "tempora": "Saturday after XX Sunday after Pentecost",
+ "title": "St. John Leonardi",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-18": {
+ "2027-10-10": {
+ "id": "tempora:Pent21-0:2:g",
"tempora": "",
"title": "XXI Sunday after Pentecost",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-27": {
- "tempora": "Feria III after XXII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2027-10-11": {
+ "id": "sancti:10-11:2:w",
+ "tempora": "Feria II after XXI Sunday after Pentecost",
+ "title": "Maternity of the Blessed Virgin Mary",
+ "rank": 2,
+ "colours": [
+ "w"
+ ]
},
- "2026-10-01": {
- "tempora": "Feria V after XVIII Sunday after Pentecost",
+ "2027-10-12": {
+ "id": "tempora:Pent21-0:2:g",
+ "tempora": "Feria III after XXI Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-23": {
- "tempora": "Feria VI after XXI Sunday after Pentecost",
- "title": "St. Anthony Mary Claret",
+ "2027-10-13": {
+ "id": "sancti:10-13:3:w",
+ "tempora": "Feria IV after XXI Sunday after Pentecost",
+ "title": "St. Edward",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-22": {
+ "2027-10-14": {
+ "id": "sancti:10-14:3:r",
"tempora": "Feria V after XXI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "title": "St. Callistus I",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2026-10-24": {
+ "2027-10-15": {
+ "id": "sancti:10-15:3:w",
+ "tempora": "Feria VI after XXI Sunday after Pentecost",
+ "title": "St. Teresa of Avila",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-10-16": {
+ "id": "sancti:10-16:3:w",
"tempora": "Saturday after XXI Sunday after Pentecost",
- "title": "St. Raphael the Archangel",
+ "title": "St. Hedwig",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-25": {
- "tempora": "XXII Sunday after Pentecost",
- "title": "Christ the King",
- "rank": 1,
- "colour": "w"
+ "2027-10-17": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "",
+ "title": "XXII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2026-10-28": {
- "tempora": "Feria IV after XXII Sunday after Pentecost",
- "title": "Sts. Simon & Jude",
+ "2027-10-18": {
+ "id": "sancti:10-18:2:r",
+ "tempora": "Feria II after XXII Sunday after Pentecost",
+ "title": "St. Luke the Evangelist",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-10-13": {
- "tempora": "Feria III after XX Sunday after Pentecost",
- "title": "St. Edward",
+ "2027-10-19": {
+ "id": "sancti:10-19:3:w",
+ "tempora": "Feria III after XXII Sunday after Pentecost",
+ "title": "St. Peter of Alcantara",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-30": {
+ "2027-10-20": {
+ "id": "sancti:10-20:3:w",
+ "tempora": "Feria IV after XXII Sunday after Pentecost",
+ "title": "St. John Cantius",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-10-21": {
+ "id": "tempora:Pent22-0:2:g",
+ "tempora": "Feria V after XXII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-10-22": {
+ "id": "tempora:Pent22-0:2:g",
"tempora": "Feria VI after XXII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-29": {
- "tempora": "Feria V after XXII Sunday after Pentecost",
+ "2027-10-23": {
+ "id": "sancti:10-23r:3:w",
+ "tempora": "Saturday after XXII Sunday after Pentecost",
+ "title": "St. Anthony Mary Claret",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-10-24": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "",
+ "title": "XXIII Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-10-25": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria II after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-03": {
+ "2027-10-26": {
+ "id": "tempora:Pent23-0:2:g",
"tempora": "Feria III after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-05": {
+ "2027-10-27": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria IV after XXIII Sunday after Pentecost",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
+ },
+ "2027-10-28": {
+ "id": "sancti:10-28:2:r",
"tempora": "Feria V after XXIII Sunday after Pentecost",
+ "title": "Sts. Simon & Jude",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-10-29": {
+ "id": "tempora:Pent23-0:2:g",
+ "tempora": "Feria VI after XXIII Sunday after Pentecost",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-01": {
- "tempora": "XXIII Sunday after Pentecost",
+ "2027-10-30": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XXIII Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-10-31": {
+ "id": "sancti:10-DU:1:w",
+ "tempora": "IV Sunday after Epiphany",
+ "title": "Christ the King",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-11-01": {
+ "id": "sancti:11-01:1:w",
+ "tempora": "Feria II after IV Sunday after Epiphany",
"title": "All Saints",
"rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-10-26": {
- "tempora": "Feria II after XXII Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2027-11-02": {
+ "id": "sancti:11-02m1:1:b",
+ "tempora": "Feria III after IV Sunday after Epiphany",
+ "title": "Commemoration of All Souls",
+ "rank": 1,
+ "colours": [
+ "b"
+ ]
},
- "2026-11-06": {
- "tempora": "Feria VI after XXIII Sunday after Pentecost",
+ "2027-11-03": {
+ "id": "tempora:Epi4-0:2:g",
+ "tempora": "Feria IV after IV Sunday after Epiphany",
"title": "Feria",
"rank": 4,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-14": {
- "tempora": "Saturday after V Sunday after Epiphany",
- "title": "St. Josaphat",
+ "2027-11-04": {
+ "id": "sancti:11-04:3:w",
+ "tempora": "Feria V after IV Sunday after Epiphany",
+ "title": "St. Charles Borromeo",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-12": {
- "tempora": "Feria V after V Sunday after Epiphany",
- "title": "St. Martin I",
- "rank": 3,
- "colour": "r"
+ "2027-11-05": {
+ "id": "tempora:Epi4-0:2:g",
+ "tempora": "Feria VI after IV Sunday after Epiphany",
+ "title": "Feria",
+ "rank": 4,
+ "colours": [
+ "g"
+ ]
},
- "2026-11-08": {
+ "2027-11-06": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after IV Sunday after Epiphany",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-11-07": {
+ "id": "tempora:Epi5-0:2:g",
"tempora": "",
"title": "V Sunday after Epiphany",
"rank": 2,
- "colour": "g"
- },
- "2026-11-16": {
- "tempora": "Feria II after VI Sunday after Epiphany",
- "title": "St. Gertrude the Great",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-10-31": {
- "tempora": "Saturday after XXII Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "2027-11-08": {
+ "id": "tempora:Epi5-0:2:g",
+ "tempora": "Feria II after V Sunday after Epiphany",
+ "title": "Feria",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-15": {
- "tempora": "",
- "title": "VI Sunday after Epiphany",
+ "2027-11-09": {
+ "id": "sancti:11-09:2:w",
+ "tempora": "Feria III after V Sunday after Epiphany",
+ "title": "Dedication of the Archbasilica of Our Holy Savior",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-11": {
+ "2027-11-10": {
+ "id": "sancti:11-10:3:w",
"tempora": "Feria IV after V Sunday after Epiphany",
+ "title": "St. Andrew Avellino",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-11-11": {
+ "id": "sancti:11-11:3:w",
+ "tempora": "Feria V after V Sunday after Epiphany",
"title": "St. Martin of Tours",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-13": {
+ "2027-11-12": {
+ "id": "sancti:11-12:3:r",
"tempora": "Feria VI after V Sunday after Epiphany",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2026-11-04": {
- "tempora": "Feria IV after XXIII Sunday after Pentecost",
- "title": "St. Charles Borromeo",
+ "title": "St. Martin I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-10-21": {
- "tempora": "Feria IV after XXI Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
- },
- "2026-11-07": {
- "tempora": "Saturday after XXIII Sunday after Pentecost",
+ "2027-11-13": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after V Sunday after Epiphany",
"title": "V Mass of the B. V. M. – Salve, Sancta Parens",
"rank": 4,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-22": {
+ "2027-11-14": {
+ "id": "tempora:Epi6-0:2:g",
"tempora": "",
- "title": "XXIV Sunday after Pentecost",
+ "title": "VI Sunday after Epiphany",
"rank": 2,
- "colour": "g"
+ "colours": [
+ "g"
+ ]
},
- "2026-11-10": {
- "tempora": "Feria III after V Sunday after Epiphany",
- "title": "St. Andrew Avellino",
+ "2027-11-15": {
+ "id": "sancti:11-15:3:w",
+ "tempora": "Feria II after VI Sunday after Epiphany",
+ "title": "St. Albert the Great",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-20": {
- "tempora": "Feria VI after VI Sunday after Epiphany",
- "title": "St. Felix of Valois",
+ "2027-11-16": {
+ "id": "sancti:11-16:3:w",
+ "tempora": "Feria III after VI Sunday after Epiphany",
+ "title": "St. Gertrude the Great",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-19": {
+ "2027-11-17": {
+ "id": "sancti:11-17:3:w",
+ "tempora": "Feria IV after VI Sunday after Epiphany",
+ "title": "St. Gregory the Wonderworker",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-11-18": {
+ "id": "sancti:11-18r:3:w",
"tempora": "Feria V after VI Sunday after Epiphany",
+ "title": "Dedication of the Basilicas of Sts. Peter & Paul",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
+ },
+ "2027-11-19": {
+ "id": "sancti:11-19:3:w",
+ "tempora": "Feria VI after VI Sunday after Epiphany",
"title": "St. Elizabeth of Hungary",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-17": {
- "tempora": "Feria III after VI Sunday after Epiphany",
- "title": "St. Gregory the Wonderworker",
+ "2027-11-20": {
+ "id": "sancti:11-20:3:w",
+ "tempora": "Saturday after VI Sunday after Epiphany",
+ "title": "St. Felix of Valois",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-27": {
- "tempora": "Feria VI after XXIV Sunday after Pentecost",
- "title": "Feria",
- "rank": 4,
- "colour": "g"
+ "2027-11-21": {
+ "id": "tempora:Pent24-0:2:g",
+ "tempora": "",
+ "title": "XXIV Sunday after Pentecost",
+ "rank": 2,
+ "colours": [
+ "g"
+ ]
},
- "2026-11-23": {
+ "2027-11-22": {
+ "id": "sancti:11-22:3:r",
"tempora": "Feria II after XXIV Sunday after Pentecost",
- "title": "St. Clement I",
+ "title": "St. Cecilia",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "r"
+ ]
},
- "2026-11-09": {
- "tempora": "Feria II after V Sunday after Epiphany",
- "title": "Dedication of the Archbasilica of Our Holy Savior",
- "rank": 2,
- "colour": "w"
- },
- "2026-11-30": {
- "tempora": "Feria II after I Sunday of Advent",
- "title": "St. Andrew",
- "rank": 2,
- "colour": "r"
+ "2027-11-23": {
+ "id": "sancti:11-23:3:r",
+ "tempora": "Feria III after XXIV Sunday after Pentecost",
+ "title": "St. Clement I",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
},
- "2026-11-29": {
- "tempora": "",
- "title": "I Sunday of Advent",
- "rank": 1,
- "colour": "v"
+ "2027-11-24": {
+ "id": "sancti:11-24:3:w",
+ "tempora": "Feria IV after XXIV Sunday after Pentecost",
+ "title": "St. John of the Cross",
+ "rank": 3,
+ "colours": [
+ "w"
+ ]
},
- "2026-12-01": {
- "tempora": "",
- "title": "Feria III after I Sunday of Advent",
+ "2027-11-25": {
+ "id": "sancti:11-25:3:r",
+ "tempora": "Feria V after XXIV Sunday after Pentecost",
+ "title": "St. Catherine of Alexandria",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "r"
+ ]
},
- "2026-11-21": {
- "tempora": "Saturday after VI Sunday after Epiphany",
- "title": "Presentation of the Blessed Virgin Mary",
+ "2027-11-26": {
+ "id": "sancti:11-26:3:w",
+ "tempora": "Feria VI after XXIV Sunday after Pentecost",
+ "title": "St. Sylvester",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-11-02": {
- "tempora": "Feria II after XXIII Sunday after Pentecost",
- "title": "Commemoration of All Souls",
- "rank": 1,
- "colour": "b"
+ "2027-11-27": {
+ "id": "commune:C10t:4:w",
+ "tempora": "Saturday after XXIV Sunday after Pentecost",
+ "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
+ "rank": 4,
+ "colours": [
+ "w"
+ ]
},
- "2026-12-06": {
+ "2027-11-28": {
+ "id": "tempora:Adv1-0:1:v",
"tempora": "",
- "title": "II Sunday of Advent",
+ "title": "I Sunday of Advent",
"rank": 1,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-11-25": {
- "tempora": "Feria IV after XXIV Sunday after Pentecost",
- "title": "St. Catherine of Alexandria",
+ "2027-11-29": {
+ "id": "tempora:Adv1-0:1:v",
+ "tempora": "",
+ "title": "Feria II after I Sunday of Advent",
"rank": 3,
- "colour": "r"
+ "colours": [
+ "v"
+ ]
},
- "2026-11-24": {
- "tempora": "Feria III after XXIV Sunday after Pentecost",
- "title": "St. John of the Cross",
+ "2027-11-30": {
+ "id": "sancti:11-30:2:r",
+ "tempora": "Feria III after I Sunday of Advent",
+ "title": "St. Andrew",
+ "rank": 2,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-12-01": {
+ "id": "tempora:Adv1-0:1:v",
+ "tempora": "",
+ "title": "Feria IV after I Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-02": {
- "tempora": "Feria IV after I Sunday of Advent",
+ "2027-12-02": {
+ "id": "sancti:12-02:3:r",
+ "tempora": "Feria V after I Sunday of Advent",
"title": "St. Vivian",
"rank": 3,
- "colour": "r"
- },
- "2026-11-28": {
- "tempora": "Saturday after XXIV Sunday after Pentecost",
- "title": "V Mass of the B. V. M. – Salve, Sancta Parens",
- "rank": 4,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-11-18": {
- "tempora": "Feria IV after VI Sunday after Epiphany",
- "title": "Dedication of the Basilicas of Sts. Peter & Paul",
+ "2027-12-03": {
+ "id": "sancti:12-03:3:w",
+ "tempora": "Feria VI after I Sunday of Advent",
+ "title": "St. Francis Xavier",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-03": {
- "tempora": "Feria V after I Sunday of Advent",
- "title": "St. Francis Xavier",
+ "2027-12-04": {
+ "id": "sancti:12-04:3:w",
+ "tempora": "Sabbato after I Sunday of Advent",
+ "title": "St. Peter Chrysologus",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-09": {
+ "2027-12-05": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Feria IV after II Sunday of Advent",
+ "title": "II Sunday of Advent",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-12-06": {
+ "id": "sancti:12-06:3:w",
+ "tempora": "Feria II after II Sunday of Advent",
+ "title": "St. Nicholas",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-08": {
+ "2027-12-07": {
+ "id": "sancti:12-07:3:w",
"tempora": "Feria III after II Sunday of Advent",
- "title": "Immaculate Conception of the Blessed Virgin Mary",
- "rank": 1,
- "colour": "w"
- },
- "2026-12-12": {
- "tempora": "",
- "title": "Sabbato after II Sunday of Advent",
+ "title": "St. Ambrose",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-13": {
- "tempora": "",
- "title": "III Sunday of Advent",
+ "2027-12-08": {
+ "id": "sancti:12-08:1:w",
+ "tempora": "Feria IV after II Sunday of Advent",
+ "title": "Immaculate Conception of the Blessed Virgin Mary",
"rank": 1,
- "colour": "pv"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-05": {
+ "2027-12-09": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Sabbato after I Sunday of Advent",
- "rank": 3,
- "colour": "v"
- },
- "2026-12-04": {
- "tempora": "Feria VI after I Sunday of Advent",
- "title": "St. Peter Chrysologus",
+ "title": "Feria V after II Sunday of Advent",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-14": {
+ "2027-12-10": {
+ "id": "tempora:Adv2-0:1:v",
"tempora": "",
- "title": "Feria II after III Sunday of Advent",
+ "title": "Feria VI after II Sunday of Advent",
"rank": 3,
- "colour": "pv"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-11": {
- "tempora": "Feria VI after II Sunday of Advent",
+ "2027-12-11": {
+ "id": "sancti:12-11:3:w",
+ "tempora": "Sabbato after II Sunday of Advent",
"title": "St. Damasus I",
"rank": 3,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-17": {
+ "2027-12-12": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
- "title": "Feria V after III Sunday of Advent",
- "rank": 2,
- "colour": "pv"
+ "title": "III Sunday of Advent",
+ "rank": 1,
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2026-12-15": {
+ "2027-12-13": {
+ "id": "sancti:12-13r:3:r",
+ "tempora": "Feria II after III Sunday of Advent",
+ "title": "St. Lucy",
+ "rank": 3,
+ "colours": [
+ "r"
+ ]
+ },
+ "2027-12-14": {
+ "id": "tempora:Adv3-0:1:pv",
"tempora": "",
"title": "Feria III after III Sunday of Advent",
"rank": 3,
- "colour": "pv"
+ "colours": [
+ "p",
+ "v"
+ ]
},
- "2026-12-10": {
+ "2027-12-15": {
+ "id": "tempora:Adv3-3:2:v",
"tempora": "",
- "title": "Feria V after II Sunday of Advent",
+ "title": "Ember Wednesday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
+ },
+ "2027-12-16": {
+ "id": "sancti:12-16:3:r",
+ "tempora": "Feria V after III Sunday of Advent",
+ "title": "St. Eusebius",
"rank": 3,
- "colour": "v"
+ "colours": [
+ "r"
+ ]
},
- "2026-12-18": {
+ "2027-12-17": {
+ "id": "tempora:Adv3-5:2:v",
"tempora": "",
"title": "Ember Friday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-11-26": {
- "tempora": "Feria V after XXIV Sunday after Pentecost",
- "title": "St. Sylvester",
- "rank": 3,
- "colour": "w"
+ "2027-12-18": {
+ "id": "tempora:Adv3-6:2:v",
+ "tempora": "",
+ "title": "Ember Saturday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-12-20": {
+ "2027-12-19": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
"title": "IV Sunday of Advent",
"rank": 1,
- "colour": "v"
- },
- "2026-12-07": {
- "tempora": "Feria II after II Sunday of Advent",
- "title": "St. Ambrose",
- "rank": 3,
- "colour": "w"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-24": {
+ "2027-12-20": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
- "title": "Vigil of Christmas",
- "rank": 1,
- "colour": "v"
+ "title": "Feria II after IV Sunday of Advent",
+ "rank": 2,
+ "colours": [
+ "v"
+ ]
},
- "2026-12-22": {
- "tempora": "",
- "title": "Feria III after IV Sunday of Advent",
+ "2027-12-21": {
+ "id": "sancti:12-21:2:r",
+ "tempora": "Feria III after IV Sunday of Advent",
+ "title": "St. Thomas",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "r"
+ ]
},
- "2026-12-23": {
+ "2027-12-22": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
"title": "Feria IV after IV Sunday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-16": {
+ "2027-12-23": {
+ "id": "tempora:Adv4-0:1:v",
"tempora": "",
- "title": "Ember Wednesday of Advent",
+ "title": "Feria V after IV Sunday of Advent",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "v"
+ ]
},
- "2026-12-21": {
- "tempora": "Feria II after IV Sunday of Advent",
- "title": "St. Thomas",
- "rank": 2,
- "colour": "r"
+ "2027-12-24": {
+ "id": "sancti:12-24:1:v",
+ "tempora": "",
+ "title": "Vigil of Christmas",
+ "rank": 1,
+ "colours": [
+ "v"
+ ]
},
- "2026-12-30": {
+ "2027-12-25": {
+ "id": "sancti:12-25m1:1:w",
"tempora": "",
- "title": "Feria in the Octave of Christmas",
- "rank": 2,
- "colour": "w"
+ "title": "The Nativity of Our Lord",
+ "rank": 1,
+ "colours": [
+ "w"
+ ]
},
- "2026-12-26": {
+ "2027-12-26": {
+ "id": "tempora:Nat1-0:2:w",
"tempora": "",
- "title": "St. Stephen",
+ "title": "Sunday in the Octave of Christmas",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-28": {
+ "2027-12-27": {
+ "id": "sancti:12-27:2:w",
"tempora": "",
- "title": "Holy Innocents",
+ "title": "St. John the Evangelist",
"rank": 2,
- "colour": "r"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-29": {
+ "2027-12-28": {
+ "id": "sancti:12-28:2:r",
"tempora": "",
- "title": "Feria in the Octave of Christmas",
+ "title": "Holy Innocents",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "r"
+ ]
},
- "2026-12-31": {
+ "2027-12-29": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
"title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-19": {
+ "2027-12-30": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
- "title": "Ember Saturday of Advent",
+ "title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "v"
+ "colours": [
+ "w"
+ ]
},
- "2026-12-27": {
+ "2027-12-31": {
+ "id": "tempora:Nat1-1:2:w",
"tempora": "",
- "title": "Sunday in the Octave of Christmas",
+ "title": "Feria in the Octave of Christmas",
"rank": 2,
- "colour": "w"
- },
- "2026-12-25": {
- "tempora": "",
- "title": "The Nativity of Our Lord",
- "rank": 1,
- "colour": "w"
+ "colours": [
+ "w"
+ ]
}
}
diff --git a/internal/calendar/types.go b/internal/calendar/types.go
index 298e49d..6d828f1 100644
--- a/internal/calendar/types.go
+++ b/internal/calendar/types.go
@@ -17,6 +17,18 @@ const (
RankFeast Rank = "feast" //
RankSolemnity Rank = "solemnity" //
+ // RankSunday is a DISPLAY-ONLY rank: in the 1969 Universal Norms' Table of
+ // Liturgical Days, Sunday is its own category, never a solemnity (Sundays
+ // of Christmas Time/Ordinary Time are band 6, below feasts of the Lord;
+ // Sundays of Advent/Lent/Easter are band 2, above solemnities -- a flat
+ // Rank cannot express both bands, and this constant does not try to).
+ // Nothing in this package ever assigns it to Celebration.Rank, and it MUST
+ // NOT be added to ofRankOrder below: ofRankOrder's default case (0,
+ // ferial-level) would make every Sunday lose every precedence contest.
+ // Callers that want it derive it themselves from the already-computed,
+ // unchanged Celebration (see internal/readings/offline.go's displayRank).
+ RankSunday Rank = "sunday"
+
// Extraordinary Form ranks (1960 Code of Rubrics): I-IV class + commemoration.
RankClass1 Rank = "class-1"
RankClass2 Rank = "class-2"
diff --git a/internal/i18n/golden_test.go b/internal/i18n/golden_test.go
index 5a29097..d06d63b 100644
--- a/internal/i18n/golden_test.go
+++ b/internal/i18n/golden_test.go
@@ -22,6 +22,15 @@ var enUI = UI{
"drugie_czytanie": "2nd reading",
"aklamacja": "Acclamation",
"ewangelia": "Gospel",
+ "epistola": "Lesson",
+ "evangelium": "Gospel",
+ },
+ Rank: map[string]string{
+ "solemnity": "solemnity", "feast": "feast", "memorial": "memorial",
+ "optional": "optional memorial", "ferial": "feria", "sunday": "Sunday",
+ "class-1": "I class", "class-2": "II class",
+ "class-3": "III class", "class-4": "IV class",
+ "commemoration": "commemoration",
},
FooterKeys: "tab/⇧tab version ←/→ day d date j/k scroll space/b page g/G top/bottom q quit",
Loading: "loading…",
@@ -110,6 +119,16 @@ var plUI = UI{
"drugie_czytanie": "2. czytanie",
"aklamacja": "Aklamacja",
"ewangelia": "Ewangelia",
+ "epistola": "Lekcja",
+ "evangelium": "Ewangelia",
+ },
+ Rank: map[string]string{
+ "solemnity": "uroczystość", "feast": "święto",
+ "memorial": "wspomnienie obowiązkowe", "optional": "wspomnienie dowolne",
+ "ferial": "dzień powszedni", "sunday": "niedziela",
+ "class-1": "I klasy", "class-2": "II klasy",
+ "class-3": "III klasy", "class-4": "IV klasy",
+ "commemoration": "komemoracja",
},
FooterKeys: "tab/⇧tab wersja ←/→ dzień d data j/k przewiń spacja/b strona g/G góra/dół q wyjście",
Loading: "ładowanie…",
diff --git a/internal/i18n/i18n.go b/internal/i18n/i18n.go
index fece4a8..6785705 100644
--- a/internal/i18n/i18n.go
+++ b/internal/i18n/i18n.go
@@ -15,14 +15,24 @@ type UI struct {
// version code (wuj, vul, grb, drb).
Version map[string]string
- // PartLabel names each modern-lectionary section's heading label word,
- // keyed by liturgy.Section.PartID (pierwsze_czytanie, psalm,
+ // PartLabel names each lectionary section's heading label word, keyed by
+ // liturgy.Section.PartID -- the modern IDs (pierwsze_czytanie, psalm,
// drugie_czytanie, aklamacja, ewangelia). The pl entries are the exact
// prefixes niedziela.pl's scraped headings carry, used by
// render.LocalizeHeading to recognise and swap the label word while
// keeping the citation untouched.
PartLabel map[string]string
+ // Rank names each liturgical rank, keyed by the string form of
+ // calendar.Rank. Two vocabularies share the map: the Ordinary Form's
+ // ferial/optional/memorial/feast/solemnity and the 1962 form's
+ // class-1..class-4/commemoration. The English values are hand-synced to
+ // agree with internal/cli/liturgy.go's own rankLabel() switch, but the
+ // CLI does not read this map -- it renders rank independently, and the
+ // two are kept in sync by hand. The actual consumers of this map are the
+ // dlectio app's day banner and calendar rows.
+ Rank map[string]string
+
// TUI keybar and status messages. NoReadingsFor and ErrorPrefix each
// carry their own single trailing space (the TUI concatenates a date or
// error string directly onto them, no separator added at the call site).
diff --git a/internal/i18n/lang/en.ini b/internal/i18n/lang/en.ini
index 8444a4d..4abd5d1 100644
--- a/internal/i18n/lang/en.ini
+++ b/internal/i18n/lang/en.ini
@@ -4,9 +4,22 @@ version.vul = Vulgate (Latin)
version.wuj = Wujek (Polish)
part_label.aklamacja = Acclamation
part_label.drugie_czytanie = 2nd reading
+part_label.epistola = Lesson
+part_label.evangelium = Gospel
part_label.ewangelia = Gospel
part_label.pierwsze_czytanie = 1st reading
part_label.psalm = Psalm
+rank.class-1 = I class
+rank.class-2 = II class
+rank.class-3 = III class
+rank.class-4 = IV class
+rank.commemoration = commemoration
+rank.feast = feast
+rank.ferial = feria
+rank.memorial = memorial
+rank.optional = optional memorial
+rank.solemnity = solemnity
+rank.sunday = Sunday
footer_keys = tab/⇧tab version ←/→ day d date j/k scroll space/b page g/G top/bottom q quit
loading = loading…
no_readings_for = "no readings for "
diff --git a/internal/i18n/lang/pl.ini b/internal/i18n/lang/pl.ini
index 305c4c9..4ae4ebf 100644
--- a/internal/i18n/lang/pl.ini
+++ b/internal/i18n/lang/pl.ini
@@ -4,9 +4,22 @@ version.vul = Wulgata (lac.)
version.wuj = Wujek (pol.)
part_label.aklamacja = Aklamacja
part_label.drugie_czytanie = 2. czytanie
+part_label.epistola = Lekcja
+part_label.evangelium = Ewangelia
part_label.ewangelia = Ewangelia
part_label.pierwsze_czytanie = 1. czytanie
part_label.psalm = Psalm
+rank.class-1 = I klasy
+rank.class-2 = II klasy
+rank.class-3 = III klasy
+rank.class-4 = IV klasy
+rank.commemoration = komemoracja
+rank.feast = święto
+rank.ferial = dzień powszedni
+rank.memorial = wspomnienie obowiązkowe
+rank.optional = wspomnienie dowolne
+rank.solemnity = uroczystość
+rank.sunday = niedziela
footer_keys = tab/⇧tab wersja ←/→ dzień d data j/k przewiń spacja/b strona g/G góra/dół q wyjście
loading = ładowanie…
no_readings_for = "brak czytań na "
diff --git a/internal/i18n/vocab_test.go b/internal/i18n/vocab_test.go
new file mode 100644
index 0000000..d0fd603
--- /dev/null
+++ b/internal/i18n/vocab_test.go
@@ -0,0 +1,98 @@
+package i18n
+
+import (
+ "testing"
+
+ "github.com/lukaszkasprzak/lectio/internal/calendar"
+)
+
+// Every rank the calendar can emit must have a word in every shipped
+// language. This is the guard against adding a constant later and silently
+// rendering a raw key like "class-2" in the UI.
+func TestVocabularyCoversEveryConstant(t *testing.T) {
+ ranks := []calendar.Rank{
+ calendar.RankFerial, calendar.RankOptional, calendar.RankMemorial,
+ calendar.RankFeast, calendar.RankSolemnity, calendar.RankSunday,
+ calendar.RankClass1, calendar.RankClass2, calendar.RankClass3,
+ calendar.RankClass4, calendar.RankCommemoration,
+ }
+ for _, lang := range []string{"en", "pl"} {
+ ui := Get(lang)
+ for _, r := range ranks {
+ if ui.Rank[string(r)] == "" {
+ t.Errorf("%s: no rank word for %q", lang, r)
+ }
+ }
+ }
+}
+
+// The English rank words must not change: lectio's CLI has printed these since
+// before the table existed, and English users' output should be untouched.
+func TestEnglishRankWordingUnchanged(t *testing.T) {
+ want := map[string]string{
+ "solemnity": "solemnity", "feast": "feast", "memorial": "memorial",
+ "optional": "optional memorial", "ferial": "feria", "sunday": "Sunday",
+ "class-1": "I class", "class-2": "II class",
+ "class-3": "III class", "class-4": "IV class",
+ "commemoration": "commemoration",
+ }
+ ui := Get("en")
+ for k, v := range want {
+ if got := ui.Rank[k]; got != v {
+ t.Errorf("rank[%q] = %q, want %q", k, got, v)
+ }
+ }
+}
+
+// The Polish rank words must be exactly this spelling, diacritics included:
+// TestVocabularyCoversEveryConstant only checks non-emptiness, so a typo
+// (e.g. "uroczystosc" for "uroczystość", or a wrong diacritic) would pass
+// silently without this pin. Polish correctness is the whole point of this
+// project.
+func TestPolishRankWordingUnchanged(t *testing.T) {
+ want := map[string]string{
+ "solemnity": "uroczystość", "feast": "święto",
+ "memorial": "wspomnienie obowiązkowe", "optional": "wspomnienie dowolne",
+ "ferial": "dzień powszedni", "sunday": "niedziela",
+ "class-1": "I klasy", "class-2": "II klasy",
+ "class-3": "III klasy", "class-4": "IV klasy",
+ "commemoration": "komemoracja",
+ }
+ ui := Get("pl")
+ for k, v := range want {
+ if got := ui.Rank[k]; got != v {
+ t.Errorf("rank[%q] = %q, want %q", k, got, v)
+ }
+ }
+}
+
+// The Polish part labels must be exactly this spelling, diacritics included,
+// and no others. This asserts against plUI directly, NOT i18n.Get("pl"):
+// Get overlays the embedded English baseline first and then the Polish file
+// on top (lang.go's Get), so a label present in English and missing only
+// from plUI.PartLabel would resolve through Get("pl") to the identical
+// English word rather than "" -- invisible to
+// internal/readings/partids_test.go's TestEveryPartIDHasLabels, which only
+// checks Get(lang) for non-emptiness. plUI is the unmerged golden source
+// with no fallback, so a missing entry is genuinely absent there, which is
+// the only way to catch this. The exact key-count check guards against a
+// future addition to plUI.PartLabel slipping in unpinned.
+func TestPolishPartLabelWordingUnchanged(t *testing.T) {
+ want := map[string]string{
+ "pierwsze_czytanie": "1. czytanie",
+ "psalm": "Psalm",
+ "drugie_czytanie": "2. czytanie",
+ "aklamacja": "Aklamacja",
+ "ewangelia": "Ewangelia",
+ "epistola": "Lekcja",
+ "evangelium": "Ewangelia",
+ }
+ if len(plUI.PartLabel) != len(want) {
+ t.Fatalf("plUI.PartLabel has %d keys, want %d: %v", len(plUI.PartLabel), len(want), plUI.PartLabel)
+ }
+ for k, v := range want {
+ if got, ok := plUI.PartLabel[k]; !ok || got != v {
+ t.Errorf("plUI.PartLabel[%q] = %q (present=%v), want %q", k, got, ok, v)
+ }
+ }
+}
diff --git a/internal/liturgy/section.go b/internal/liturgy/section.go
index dcca7b5..baf2b9d 100644
--- a/internal/liturgy/section.go
+++ b/internal/liturgy/section.go
@@ -33,4 +33,13 @@ type DayInfo struct {
// Colour is the normalized liturgical colour: "white", "green",
// "violet", "red", "rose", or "" when unknown/unmapped.
Colour string
+ // Rank is the normalized liturgical rank of the observed celebration:
+ // the Ordinary Form's "ferial", "optional", "memorial", "feast",
+ // "solemnity", or the 1962 form's "class-1".."class-4",
+ // "commemoration". The engine always supplies a rank: an unset or
+ // unrecognised rank on a sanctoral celebration defaults to "ferial"
+ // (calendar.buildCelebration), and every temporal-day constructor sets
+ // one explicitly. Consumers must not treat an empty Rank as meaning "no
+ // celebration".
+ Rank string
}
diff --git a/internal/readings/offline.go b/internal/readings/offline.go
index d0b8942..b2c16df 100644
--- a/internal/readings/offline.go
+++ b/internal/readings/offline.go
@@ -8,6 +8,7 @@ import (
"github.com/lukaszkasprzak/lectio/internal/caldata"
"github.com/lukaszkasprzak/lectio/internal/calendar"
"github.com/lukaszkasprzak/lectio/internal/config"
+ "github.com/lukaszkasprzak/lectio/internal/i18n"
"github.com/lukaszkasprzak/lectio/internal/liturgy"
"github.com/lukaszkasprzak/lectio/internal/naming"
)
@@ -60,24 +61,68 @@ var ofPart = map[string]struct{ id, heading string }{
"gospel": {"ewangelia", "Ewangelia"},
}
-// efPartHeading gives the traditional (1962) section's heading per UI language;
-// the EF has only an epistle/lesson and a gospel. Unlike the OF headings these
-// are not translated downstream, so they are set in the target language here.
+// efPartHeading gives the traditional (1962) section's ID and heading per UI
+// language; the EF has only an epistle/lesson and a gospel. The label words are
+// i18n data, like the modern ones. Unlike the OF headings these are not
+// translated downstream (render.LocalizeHeading only handles modern IDs), so
+// they are resolved in the target language here.
func efPartHeading(part, lang string) (id, heading string) {
- pl := lang == "pl"
switch part {
case "first":
- if pl {
- return "epistola", "Lekcja"
- }
- return "epistola", "Lesson"
+ id = "epistola"
case "gospel":
- if pl {
- return "evangelium", "Ewangelia"
- }
- return "evangelium", "Gospel"
+ id = "evangelium"
+ default:
+ return "", ""
+ }
+ heading = i18n.Get(lang).PartLabel[id]
+ if heading == "" {
+ heading = id
+ }
+ return id, heading
+}
+
+// ofPartOrder and efPartOrder are the display orders of each lectionary's
+// sections. They are the single source of truth for which part IDs exist.
+//
+// ofPartOrder's five modern IDs must remain the same *set* as
+// internal/render/render.go's modernPartOrder, which lists them in a
+// different, deliberate order (prefix-match determinism for
+// render.LocalizeHeading, unrelated to display order). Nothing enforces
+// that agreement mechanically -- internal/readings and internal/render do
+// not import each other (adding a cross-package test would create a new
+// dependency edge that does not exist today) -- so if a sixth modern part
+// is ever added here, add it to modernPartOrder too, by hand.
+var (
+ ofPartOrder = []string{"pierwsze_czytanie", "psalm", "drugie_czytanie", "aklamacja", "ewangelia"}
+ efPartOrder = []string{"epistola", "evangelium"}
+)
+
+// ofEmittedPartOrder is the subset of ofPartOrder the offline engine can
+// actually produce, in display order. It excludes "aklamacja":
+// internal/caldata/caldata.go:42 parses only "first", "psalm", "second" and
+// "gospel" out of the lectionary data, so no computed OF reading ever carries
+// Part == "acclamation" and ofPart's "aklamacja" mapping above is never
+// reached. ofPartOrder stays the full five-ID set on purpose -- it also
+// drives render.LocalizeHeading's *label* matching, where a scraped heading
+// can still read "Aklamacja" even though this engine's own readings never
+// produce that section -- so PartIDs, which promises IDs an app can filter
+// on, needs this narrower list rather than reusing or shrinking ofPartOrder.
+var ofEmittedPartOrder = []string{"pierwsze_czytanie", "psalm", "drugie_czytanie", "ewangelia"}
+
+// PartIDs returns the part IDs the given lectionary can emit, in display order.
+// lect takes config.Config.Lectionary's values: "new" or "traditional". An
+// unknown lectionary returns nil. Callers that build per-part UI (the dlectio
+// app's reading filters) must derive their list from this rather than
+// hardcoding IDs.
+func PartIDs(lect string) []string {
+ switch lect {
+ case "new":
+ return append([]string(nil), ofEmittedPartOrder...)
+ case "traditional":
+ return append([]string(nil), efPartOrder...)
}
- return "", ""
+ return nil
}
// sectionsFor turns computed readings into render-ready sections, tagging each
@@ -109,14 +154,62 @@ func sectionsFor(rs []calendar.Reading, form, lang, siglaLang string, tbl *bible
return out
}
-// dayInfo builds the header (celebration name, liturgical colour) for the
-// computed day. Season is left empty: the celebration name already carries the
-// temporal identity for temporal days, and the header is a nice-to-have.
+// dayInfo builds the header (celebration name, liturgical colour, rank) for
+// the computed day. Season is left empty: the celebration name already
+// carries the temporal identity for temporal days, and the header is a
+// nice-to-have.
func dayInfo(cfg config.Config, day calendar.LiturgicalDay) liturgy.DayInfo {
return liturgy.DayInfo{
Name: celebrationName(cfg, day.Observed),
Colour: string(day.Colour),
+ Rank: displayRank(cfg, day),
+ }
+}
+
+// displayRank is the Ordinary Form's REPORTED rank for the observed
+// celebration -- it never changes calendar.Celebration.Rank (the engine's own
+// field, which drives precedence via ofRankOrder); it only relabels what is
+// handed to a caller here, after the engine has already finished computing.
+//
+// In the 1969 Universal Norms' Table of Liturgical Days, Sunday is its own
+// category, not a solemnity. The calendar engine's temporal.go builds every
+// "Nth Sunday of <season>" day (Ordinary Time, Advent, Lent, the Easter
+// season, Christmas time, and Palm Sunday) with sundayDay(), which sets
+// Rank=solemnity but leaves Class at its zero value (calendar.ClassNone) --
+// solemnity is a placeholder there, not a real classification. A genuinely
+// NAMED solemnity of the Lord that happens to fall on a Sunday (Easter Sunday
+// itself, Pentecost, Ascension/Corpus Christi when transferred, Trinity,
+// Christ the King, Christmas, Epiphany) is built by solemn(), which does set
+// Class=ClassLord, and must keep reporting "solemnity"; a feast of the Lord
+// (Holy Family, Baptism of the Lord) is Rank=feast already and is untouched.
+//
+// Investigated first: temporal.go's own Sunday bool (sundayDay's
+// `Sunday: !priv`) looked like the natural signal, but it does not reach
+// calendar.LiturgicalDay at all (LiturgicalDay carries no such field, only
+// the aggregate ObservedBand), and even if plumbed through it would be the
+// wrong signal here -- by its own doc comment it marks only the band-6
+// Christmas-time/Ordinary-time Sundays, not the band-2 Advent/Lent/Easter
+// Sundays this change must ALSO relabel (the 1st Sunday of Advent from the
+// original bug report is band 2, Privileged=true, Sunday=false). Using
+// Celebration.Class instead of that flag, or of temporalDay.Privileged,
+// covers exactly the sundayDay()-built set in both bands without adding any
+// new field: RankSolemnity + Layer=="temporal" + Class!=ClassLord occurs only
+// from sundayDay(), and (checked against every call site in temporal.go) only
+// ever on an actual Sunday, so the weekday check below is defensive, not
+// load-bearing.
+//
+// The Extraordinary Form (1962) has no such category and is untouched: this
+// only ever fires when the modern form is selected.
+func displayRank(cfg config.Config, day calendar.LiturgicalDay) string {
+ obs := day.Observed
+ if cfg.Selection().Form != "old" &&
+ day.Weekday == time.Sunday &&
+ obs.Layer == "temporal" &&
+ obs.Rank == calendar.RankSolemnity &&
+ obs.Class != calendar.ClassLord {
+ return string(calendar.RankSunday)
}
+ return string(obs.Rank)
}
// celebrationName is the observed celebration's name in the UI language,
diff --git a/internal/readings/partids_test.go b/internal/readings/partids_test.go
new file mode 100644
index 0000000..fdbd816
--- /dev/null
+++ b/internal/readings/partids_test.go
@@ -0,0 +1,75 @@
+package readings
+
+import (
+ "testing"
+
+ "github.com/lukaszkasprzak/lectio/internal/config"
+ "github.com/lukaszkasprzak/lectio/internal/i18n"
+)
+
+// The day header must carry the rank, not just name and colour: the app's
+// calendar rows and the CLI's day line both display it.
+func TestDayInfoCarriesRank(t *testing.T) {
+ cases := []struct {
+ date, lect, wantRank string
+ }{
+ // 2026-08-01 is the memorial of St Alphonsus Liguori in the OF.
+ {"2026-08-01", "new", "memorial"},
+ // 2026-12-25 is a solemnity.
+ {"2026-12-25", "new", "solemnity"},
+ }
+ for _, c := range cases {
+ cfg := config.Config{UILanguage: "en", Lectionary: c.lect, All: true}
+ _, info, err := Load(cfg, Options{Date: c.date, All: true})
+ if err != nil {
+ t.Fatalf("%s: load: %v", c.date, err)
+ }
+ if info.Rank != c.wantRank {
+ t.Errorf("%s: rank = %q, want %q", c.date, info.Rank, c.wantRank)
+ }
+ }
+}
+
+// PartIDs must list exactly the IDs the engine can emit, in display order.
+// The app derives its "show readings" checkboxes from this; when it hardcoded
+// them instead, seven of the nine 1962 IDs were wrong and the epistle's
+// checkbox did nothing.
+func TestPartIDs(t *testing.T) {
+ wantNew := []string{"pierwsze_czytanie", "psalm", "drugie_czytanie", "ewangelia"}
+ wantOld := []string{"epistola", "evangelium"}
+ if got := PartIDs("new"); !equalSlice(got, wantNew) {
+ t.Errorf("PartIDs(new) = %v, want %v", got, wantNew)
+ }
+ if got := PartIDs("traditional"); !equalSlice(got, wantOld) {
+ t.Errorf("PartIDs(traditional) = %v, want %v", got, wantOld)
+ }
+ if got := PartIDs("nonsense"); len(got) != 0 {
+ t.Errorf("PartIDs(nonsense) = %v, want empty", got)
+ }
+}
+
+// Every ID PartIDs lists must have a label in every shipped language,
+// otherwise a checkbox would render a raw ID like "epistola".
+func TestEveryPartIDHasLabels(t *testing.T) {
+ for _, lect := range []string{"new", "traditional"} {
+ for _, id := range PartIDs(lect) {
+ for _, lang := range []string{"en", "pl"} {
+ if i18n.Get(lang).PartLabel[id] == "" {
+ t.Errorf("%s/%s: no label for %q", lect, lang, id)
+ }
+ }
+ }
+ }
+}
+
+func equalSlice(a, b []string) bool {
+ if len(a) != len(b) {
+ return false
+ }
+ for i := range a {
+ if a[i] != b[i] {
+ return false
+ }
+ }
+ return true
+}
diff --git a/internal/readings/readings_test.go b/internal/readings/readings_test.go
index 143b43e..1674d85 100644
--- a/internal/readings/readings_test.go
+++ b/internal/readings/readings_test.go
@@ -99,6 +99,43 @@ func TestLoadModern(t *testing.T) {
}
}
+// TestSundayRankIsDisplayOnly guards the Ordinary Form's Sunday display rank.
+// Sunday is its own category in the 1969 Universal Norms' Table of Liturgical
+// Days -- never a solemnity -- so an ordinary "Nth Sunday of <season>" temporal
+// day (Ordinary Time, Advent, Lent, the Easter season, Christmas time; this
+// also covers Palm Sunday) must report "sunday". A NAMED solemnity of the Lord
+// that happens to fall on a Sunday (Easter Sunday itself, Pentecost) is a
+// genuine solemnity and must keep reporting "solemnity"; a feast of the Lord
+// (Holy Family) must keep reporting "feast". This is display-only: it must
+// never touch the engine's internal precedence, so the 1962 form (which has no
+// such Sunday category -- Sundays report their class exactly as before) is
+// asserted unchanged too. Dates are the ones from the original bug report,
+// plus the Easter/Pentecost/Holy Family dates they imply for the same
+// liturgical year.
+func TestSundayRankIsDisplayOnly(t *testing.T) {
+ cases := []struct {
+ date, lect, wantRank, why string
+ }{
+ {"2026-08-09", "new", "sunday", "19th Sunday in Ordinary Time"},
+ {"2026-11-29", "new", "sunday", "1st Sunday of Advent"},
+ {"2027-03-28", "new", "solemnity", "Easter Sunday itself"},
+ {"2027-05-16", "new", "solemnity", "Pentecost"},
+ {"2026-12-27", "new", "feast", "Holy Family"},
+ {"2026-08-09", "traditional", "class-2", "1962 Sunday after Pentecost"},
+ {"2026-11-29", "traditional", "class-1", "1962 1st Sunday of Advent"},
+ }
+ for _, c := range cases {
+ cfg := config.Config{Lectionary: c.lect}
+ _, info, err := Load(cfg, Options{Date: c.date, All: true})
+ if err != nil {
+ t.Fatalf("%s (%s, %s): Load: %v", c.date, c.lect, c.why, err)
+ }
+ if info.Rank != c.wantRank {
+ t.Errorf("%s (%s, %s): Rank = %q, want %q (name=%q)", c.date, c.lect, c.why, info.Rank, c.wantRank, info.Name)
+ }
+ }
+}
+
// TestLoadTraditional computes the Extraordinary Form day offline: it never
// needs the network, and yields the EF epistle+gospel with a header name.
func TestLoadTraditional(t *testing.T) {
diff --git a/internal/render/render.go b/internal/render/render.go
index c744aac..3437396 100644
--- a/internal/render/render.go
+++ b/internal/render/render.go
@@ -29,6 +29,14 @@ func versionLabel(version, lang string) string {
// than ranging over i18n.UI.PartLabel (a map, so Go randomises its
// iteration order). None of the five labels is a prefix of another, so the
// order never changes which one matches, only determinism.
+//
+// Its *set* of five IDs must match internal/readings/offline.go's
+// ofPartOrder, which lists the same modern IDs in a different, deliberate
+// order (display order, unrelated to this package's prefix-match need).
+// Nothing enforces that agreement mechanically -- internal/render and
+// internal/readings do not import each other (adding a cross-package test
+// would create a new dependency edge that does not exist today) -- so if a
+// sixth modern part is ever added to ofPartOrder, add it here too, by hand.
var modernPartOrder = []string{"pierwsze_czytanie", "drugie_czytanie", "psalm", "aklamacja", "ewangelia"}
// LocalizeHeading swaps a modern (niedziela.pl) section heading's leading