Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 54d1d6190e | |||
| b050e523ec |
@@ -10,9 +10,12 @@ parts:
|
|||||||
resolve: by-weekday
|
resolve: by-weekday
|
||||||
- kind: chapter
|
- kind: chapter
|
||||||
textRef: { source: common, id: none-capitulum-per-annum }
|
textRef: { source: common, id: none-capitulum-per-annum }
|
||||||
|
- kind: preces
|
||||||
|
textRef: { source: common, id: minor-hour-kyrie-pater }
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: minor-hour-preces-feriales }
|
textRef: { source: common, id: minor-hour-preces-feriales }
|
||||||
label: Preces
|
label: Preces
|
||||||
|
ferialOnly: true
|
||||||
- kind: day-collect
|
- kind: day-collect
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: little-hour-conclusio }
|
textRef: { source: common, id: little-hour-conclusio }
|
||||||
|
|||||||
@@ -10,9 +10,12 @@ parts:
|
|||||||
resolve: by-weekday
|
resolve: by-weekday
|
||||||
- kind: chapter
|
- kind: chapter
|
||||||
textRef: { source: common, id: sext-capitulum-per-annum }
|
textRef: { source: common, id: sext-capitulum-per-annum }
|
||||||
|
- kind: preces
|
||||||
|
textRef: { source: common, id: minor-hour-kyrie-pater }
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: minor-hour-preces-feriales }
|
textRef: { source: common, id: minor-hour-preces-feriales }
|
||||||
label: Preces
|
label: Preces
|
||||||
|
ferialOnly: true
|
||||||
- kind: day-collect
|
- kind: day-collect
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: little-hour-conclusio }
|
textRef: { source: common, id: little-hour-conclusio }
|
||||||
|
|||||||
@@ -18,8 +18,13 @@
|
|||||||
# Preces (Kyrie/Pater Noster + a short V/R litany) were added after the
|
# Preces (Kyrie/Pater Noster + a short V/R litany) were added after the
|
||||||
# chapter/collect, by deliberate choice, even though real Monastic
|
# chapter/collect, by deliberate choice, even though real Monastic
|
||||||
# Terce/Sext/None has none — see minor-hour-preces-feriales.yml's header
|
# Terce/Sext/None has none — see minor-hour-preces-feriales.yml's header
|
||||||
# for the reference-engine source and the "every day" simplification,
|
# for the reference-engine source, mirroring the same deviation already
|
||||||
# mirroring the same deviation already made for Prime.
|
# made for Prime. Split 2026-09-01, by explicit choice: the Kyrie/Pater
|
||||||
|
# Noster piece (minor-hour-kyrie-pater) always shows regardless of rank,
|
||||||
|
# while the further Preces versicles proper (minor-hour-preces-feriales,
|
||||||
|
# now trimmed to just those) are ferial-only (`ferialOnly: true`) —
|
||||||
|
# see hours/resolve-common.ts's isFerialOrVigil, the same predicate
|
||||||
|
# Lauds'/Vespers' own ferial Preces use.
|
||||||
id: terce
|
id: terce
|
||||||
parts:
|
parts:
|
||||||
- kind: opening-versicle
|
- kind: opening-versicle
|
||||||
@@ -29,9 +34,12 @@ parts:
|
|||||||
resolve: by-weekday
|
resolve: by-weekday
|
||||||
- kind: chapter
|
- kind: chapter
|
||||||
textRef: { source: common, id: terce-capitulum-per-annum }
|
textRef: { source: common, id: terce-capitulum-per-annum }
|
||||||
|
- kind: preces
|
||||||
|
textRef: { source: common, id: minor-hour-kyrie-pater }
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: minor-hour-preces-feriales }
|
textRef: { source: common, id: minor-hour-preces-feriales }
|
||||||
label: Preces
|
label: Preces
|
||||||
|
ferialOnly: true
|
||||||
- kind: day-collect
|
- kind: day-collect
|
||||||
- kind: preces
|
- kind: preces
|
||||||
textRef: { source: common, id: little-hour-conclusio }
|
textRef: { source: common, id: little-hour-conclusio }
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
# Split out of minor-hour-preces-feriales.yml on 2026-09-01, by explicit
|
||||||
|
# choice: Terce/Sext/None should always show the Kyrie and Pater Noster
|
||||||
|
# (with its own "Et ne nos indúcas/Sed líbera nos a malo" completion),
|
||||||
|
# even on a Sunday or feast, while the further Preces versicles that used
|
||||||
|
# to follow in the same block (now trimmed down to just those, still under
|
||||||
|
# minor-hour-preces-feriales's own id) become ferial-only — see that
|
||||||
|
# file's header and data/hours/terce.yml's for the reasoning. Text
|
||||||
|
# otherwise unchanged from what was verified there.
|
||||||
|
id: minor-hour-kyrie-pater
|
||||||
|
text:
|
||||||
|
la: |
|
||||||
|
Kýrie, eléison. Christe, eléison. Kýrie, eléison.
|
||||||
|
Pater noster, qui es in cælis, sanctificétur nomen tuum: advéniat regnum tuum: fiat volúntas tua, sicut in cælo et in terra. Panem nostrum cotidiánum da nobis hódie: et dimítte nobis débita nostra, sicut et nos dimíttimus debitóribus nostris:
|
||||||
|
V. Et ne nos indúcas in tentatiónem:
|
||||||
|
R. Sed líbera nos a malo.
|
||||||
|
en: |
|
||||||
|
Lord, have mercy. Christ, have mercy. Lord, have mercy.
|
||||||
|
Our Father, who art in heaven, hallowed be thy name; thy kingdom come; thy will be done on earth as it is in heaven. Give us this day our daily bread; and forgive us our trespasses, as we forgive those who trespass against us:
|
||||||
|
V. And lead us not into temptation:
|
||||||
|
R. But deliver us from evil.
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
@@ -5,28 +5,24 @@
|
|||||||
# [Preces feriales minora]). Shared by Terce, Sext, and None — the Latin is
|
# [Preces feriales minora]). Shared by Terce, Sext, and None — the Latin is
|
||||||
# identical across all three per the reference engine.
|
# identical across all three per the reference engine.
|
||||||
#
|
#
|
||||||
# Deliberate deviation from real Monastic 1617 (which has no Preces at the
|
# Trimmed 2026-09-01, by explicit choice: this file used to hold the whole
|
||||||
# Little Hours at all) and from the reference engine's own rubric (which
|
# block (Kyrie + Pater Noster + all four V/R pairs) and was shown every
|
||||||
# says the Pater Noster here is "secreto," silent): by explicit choice this
|
# day. The Kyrie/Pater Noster piece was split out into its own always-
|
||||||
# project shows the Kyrie and Pater Noster as spoken text rather than
|
# shown `minor-hour-kyrie-pater` part (see that file) so it keeps
|
||||||
# dropping them the way Prime drops its silently-said opening Pater/Ave —
|
# appearing regardless of rank; what's left here — the three further V/R
|
||||||
# see prime.yml's header for that contrasting precedent.
|
# pairs, the actual "Preces" versicles proper — is now ferial-only
|
||||||
|
# (`ferialOnly: true` in data/hours/terce.yml etc.), matching real
|
||||||
|
# historical practice (Preces are dropped on Sundays/feasts) more closely
|
||||||
|
# than the old "every day" simplification did.
|
||||||
#
|
#
|
||||||
# Also by explicit choice, said on *every* day regardless of rank, not just
|
# Deliberate deviation from real Monastic 1617 (which has no Preces at the
|
||||||
# ferias — mirroring the same "every day" simplification already made for
|
# Little Hours at all): by explicit choice this project still adds them on
|
||||||
# Prime's ferial Preces (see prime-preces-feriales.yml). The reference
|
# ferial days, mirroring the same "every day" simplification originally
|
||||||
# engine's Sunday/feast form for the Little Hours (Kyrie + Pater Noster +
|
# made for Prime's ferial Preces (see prime-preces-feriales.yml) but now
|
||||||
# a silently-said Creed, then a V/R block that's actually reused from
|
# scoped to ferias only, per direct instruction.
|
||||||
# Compline's own dominical Preces) looks like a data-reuse quirk rather
|
|
||||||
# than genuinely-authored minor-hour content, so it was deliberately not
|
|
||||||
# imported.
|
|
||||||
id: minor-hour-preces-feriales
|
id: minor-hour-preces-feriales
|
||||||
text:
|
text:
|
||||||
la: |
|
la: |
|
||||||
Kýrie, eléison. Christe, eléison. Kýrie, eléison.
|
|
||||||
Pater noster, qui es in cælis, sanctificétur nomen tuum: advéniat regnum tuum: fiat volúntas tua, sicut in cælo et in terra. Panem nostrum cotidiánum da nobis hódie: et dimítte nobis débita nostra, sicut et nos dimíttimus debitóribus nostris:
|
|
||||||
V. Et ne nos indúcas in tentatiónem:
|
|
||||||
R. Sed líbera nos a malo.
|
|
||||||
V. Dómine, Deus virtútum, convérte nos.
|
V. Dómine, Deus virtútum, convérte nos.
|
||||||
R. Et osténde fáciem tuam, et salvi érimus.
|
R. Et osténde fáciem tuam, et salvi érimus.
|
||||||
V. Exsúrge, Christe, ádjuva nos.
|
V. Exsúrge, Christe, ádjuva nos.
|
||||||
@@ -34,10 +30,6 @@ text:
|
|||||||
V. Dómine, exáudi oratiónem meam.
|
V. Dómine, exáudi oratiónem meam.
|
||||||
R. Et clamor meus ad te véniat.
|
R. Et clamor meus ad te véniat.
|
||||||
en: |
|
en: |
|
||||||
Lord, have mercy. Christ, have mercy. Lord, have mercy.
|
|
||||||
Our Father, who art in heaven, hallowed be thy name; thy kingdom come; thy will be done on earth as it is in heaven. Give us this day our daily bread; and forgive us our trespasses, as we forgive those who trespass against us:
|
|
||||||
V. And lead us not into temptation:
|
|
||||||
R. But deliver us from evil.
|
|
||||||
V. O Lord, God of hosts, convert us.
|
V. O Lord, God of hosts, convert us.
|
||||||
R. And show us thy face, and we shall be saved.
|
R. And show us thy face, and we shall be saved.
|
||||||
V. Arise, O Christ, and help us.
|
V. Arise, O Christ, and help us.
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
resolveMinorHourAntiphon,
|
resolveMinorHourAntiphon,
|
||||||
resolveMinorHourChapter,
|
resolveMinorHourChapter,
|
||||||
resolveSelfContainedHymn,
|
resolveSelfContainedHymn,
|
||||||
|
isFerialOrVigil,
|
||||||
} from './resolve-common';
|
} from './resolve-common';
|
||||||
import noneDefinitionData from '../data/hours/none.yml';
|
import noneDefinitionData from '../data/hours/none.yml';
|
||||||
import antiphonsData from '../data/hours/none-antiphons.yml';
|
import antiphonsData from '../data/hours/none-antiphons.yml';
|
||||||
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
|
|||||||
case 'day-collect':
|
case 'day-collect':
|
||||||
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
||||||
case 'preces':
|
case 'preces':
|
||||||
|
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
|
||||||
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
||||||
case 'variable': {
|
case 'variable': {
|
||||||
// Only 'by-weekday' applies here — one antiphon framing all three
|
// Only 'by-weekday' applies here — one antiphon framing all three
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
resolveMinorHourAntiphon,
|
resolveMinorHourAntiphon,
|
||||||
resolveMinorHourChapter,
|
resolveMinorHourChapter,
|
||||||
resolveSelfContainedHymn,
|
resolveSelfContainedHymn,
|
||||||
|
isFerialOrVigil,
|
||||||
} from './resolve-common';
|
} from './resolve-common';
|
||||||
import sextDefinitionData from '../data/hours/sext.yml';
|
import sextDefinitionData from '../data/hours/sext.yml';
|
||||||
import antiphonsData from '../data/hours/sext-antiphons.yml';
|
import antiphonsData from '../data/hours/sext-antiphons.yml';
|
||||||
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
|
|||||||
case 'day-collect':
|
case 'day-collect':
|
||||||
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
||||||
case 'preces':
|
case 'preces':
|
||||||
|
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
|
||||||
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
||||||
case 'variable': {
|
case 'variable': {
|
||||||
// Only 'by-weekday' applies here — one antiphon framing all three
|
// Only 'by-weekday' applies here — one antiphon framing all three
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import {
|
|||||||
resolveMinorHourAntiphon,
|
resolveMinorHourAntiphon,
|
||||||
resolveMinorHourChapter,
|
resolveMinorHourChapter,
|
||||||
resolveSelfContainedHymn,
|
resolveSelfContainedHymn,
|
||||||
|
isFerialOrVigil,
|
||||||
} from './resolve-common';
|
} from './resolve-common';
|
||||||
import terceDefinitionData from '../data/hours/terce.yml';
|
import terceDefinitionData from '../data/hours/terce.yml';
|
||||||
import antiphonsData from '../data/hours/terce-antiphons.yml';
|
import antiphonsData from '../data/hours/terce-antiphons.yml';
|
||||||
@@ -32,6 +33,7 @@ function resolvePart(part: HourPart, day: LiturgicalDay): ResolvedPart[] {
|
|||||||
case 'day-collect':
|
case 'day-collect':
|
||||||
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
return [{ kind: 'prayer', text: getDayCollect(day) }];
|
||||||
case 'preces':
|
case 'preces':
|
||||||
|
if (part.ferialOnly && !isFerialOrVigil(day)) return [];
|
||||||
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
return [{ kind: 'preces', text: resolveCommon(part.textRef.id), label: part.label }];
|
||||||
case 'variable': {
|
case 'variable': {
|
||||||
// Only 'by-weekday' applies here — one antiphon framing all three
|
// Only 'by-weekday' applies here — one antiphon framing all three
|
||||||
|
|||||||
+8
-1
@@ -43,7 +43,14 @@ export type HourPart =
|
|||||||
// both Monastic and secular tracks, drops Compline's Preces to nothing
|
// both Monastic and secular tracks, drops Compline's Preces to nothing
|
||||||
// on a Double, with no substitute) — the flag still means "not the full
|
// on a Double, with no substitute) — the flag still means "not the full
|
||||||
// text here," just not "nothing here."
|
// text here," just not "nothing here."
|
||||||
| { kind: 'preces'; textRef: PropersRef; label?: string; omitOnDouble?: true }
|
// `ferialOnly` marks a part that's dropped outright (not substituted)
|
||||||
|
// on a Sunday/feast day — Terce/Sext/None's own trailing Preces
|
||||||
|
// versicles (minor-hour-preces-feriales, trimmed 2026-09-01 to just
|
||||||
|
// those versicles) are the only current user: the Kyrie/Pater Noster
|
||||||
|
// that used to precede them in the same block was split out into its
|
||||||
|
// own always-shown `minor-hour-kyrie-pater` part instead of following
|
||||||
|
// suit, by explicit choice — see data/hours/terce.yml's header.
|
||||||
|
| { kind: 'preces'; textRef: PropersRef; label?: string; omitOnDouble?: true; ferialOnly?: true }
|
||||||
| { kind: 'psalm'; psalmNumber: number; verses?: string; antiphonRef?: PropersRef }
|
| { kind: 'psalm'; psalmNumber: number; verses?: string; antiphonRef?: PropersRef }
|
||||||
| { kind: 'canticle'; canticleId: string; textRef: PropersRef; antiphonRef?: PropersRef }
|
| { kind: 'canticle'; canticleId: string; textRef: PropersRef; antiphonRef?: PropersRef }
|
||||||
| {
|
| {
|
||||||
|
|||||||
@@ -72,12 +72,39 @@ describe.each(LITTLE_HOURS)('resolveOrdo(%s, ...)', (hourId) => {
|
|||||||
expect(prayer && prayer.kind === 'prayer' ? prayer.text.text.en : undefined).toContain('Let us pray.');
|
expect(prayer && prayer.kind === 'prayer' ? prayer.text.text.en : undefined).toContain('Let us pray.');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('resolves a shared Preces (Kyrie/Pater Noster + short litany) after the chapter, identical across all three hours', () => {
|
it('resolves the shared Kyrie/Pater Noster after the chapter on every day, identical across all three hours', () => {
|
||||||
const ordo = resolveOrdo(hourId, TUESDAY);
|
const sunday = resolveOrdo(hourId, SUNDAY);
|
||||||
const preces = ordo.parts.find((p) => p.kind === 'preces' && p.label === 'Preces');
|
const tuesday = resolveOrdo(hourId, TUESDAY);
|
||||||
|
for (const ordo of [sunday, tuesday]) {
|
||||||
|
const kyriePater = ordo.parts.find((p) => p.kind === 'preces' && p.label === undefined);
|
||||||
|
expect(kyriePater && kyriePater.kind === 'preces' ? kyriePater.text.status.en : undefined).toBe('verified');
|
||||||
|
expect(kyriePater && kyriePater.kind === 'preces' ? kyriePater.text.text.en : undefined).toContain(
|
||||||
|
'Lord, have mercy.',
|
||||||
|
);
|
||||||
|
expect(kyriePater && kyriePater.kind === 'preces' ? kyriePater.text.text.en : undefined).toContain(
|
||||||
|
'Our Father',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it('resolves the further Preces versicles only on a bare ferial day, not on Sunday or a sanctoral winner', () => {
|
||||||
|
// Plain ferial (post-Pentecost 15's own week, no sanctoral winner) —
|
||||||
|
// see prime.test.ts's own use of this date for the same reason.
|
||||||
|
const feria = resolveOrdo(hourId, '2026-09-07');
|
||||||
|
const preces = feria.parts.find((p) => p.kind === 'preces' && p.label === 'Preces');
|
||||||
expect(preces && preces.kind === 'preces' ? preces.text.status.en : undefined).toBe('verified');
|
expect(preces && preces.kind === 'preces' ? preces.text.status.en : undefined).toBe('verified');
|
||||||
expect(preces && preces.kind === 'preces' ? preces.text.text.en : undefined).toContain('Lord, have mercy.');
|
expect(preces && preces.kind === 'preces' ? preces.text.text.en : undefined).toContain(
|
||||||
expect(preces && preces.kind === 'preces' ? preces.text.text.en : undefined).toContain('Our Father');
|
'O Lord, God of hosts, convert us.',
|
||||||
|
);
|
||||||
|
|
||||||
|
const sunday = resolveOrdo(hourId, SUNDAY);
|
||||||
|
expect(sunday.parts.some((p) => p.kind === 'preces' && p.label === 'Preces')).toBe(false);
|
||||||
|
|
||||||
|
// TUESDAY is St. Edward the Confessor's day (semiduplex sanctoral
|
||||||
|
// winner) — a sanctoral winner also drops the ferial-only Preces, not
|
||||||
|
// just Sunday.
|
||||||
|
const tuesday = resolveOrdo(hourId, TUESDAY);
|
||||||
|
expect(tuesday.parts.some((p) => p.kind === 'preces' && p.label === 'Preces')).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('ends with the shared Little Hour conclusion, identical across all three hours', () => {
|
it('ends with the shared Little Hour conclusion, identical across all three hours', () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user