Add name-template substitution for Common-of-a-Holy-Woman's invitatory antiphon
Deploy / deploy (push) Successful in 1m20s
Deploy / deploy (push) Successful in 1m20s
Commune/C7's own invitatory antiphon ("Laudémus Deum nostrum * In
confessióne beátæ N..") needs a per-saint genitive-singular name, unlike
every other Common invitatory antiphon currently authored. Exports
resolve-common.ts's existing substituteName helper (previously only used
by getDayCollect for collectCommon/collectName) and wires it into
resolveMatinsInvitatoryText via a new SaintRecord.invitatoryName field
-- kept separate from collectName since the two templates' {N}
placeholders don't always need the same grammatical case. Fills in real
declined names for the 3 saints using common-of-a-holy-woman (Anne,
Martha, Mary Magdalene).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012AVXS5iTrk3c2anSYVGwxS
This commit is contained in:
@@ -2765,13 +2765,21 @@ a-dedication.yml` (Commune/C8's own `[Invit]`, "Domum Dei decet sanctitúdo"). D
|
|||||||
St. Joseph Calasanctius (2026-08-27, Confessor, duplex) falling all the way to the plain
|
St. Joseph Calasanctius (2026-08-27, Confessor, duplex) falling all the way to the plain
|
||||||
ferial invitatory antiphon.
|
ferial invitatory antiphon.
|
||||||
|
|
||||||
|
**Holy Women (C7) invitatory antiphon authored, new name-template mechanism (2026-08-27)**:
|
||||||
|
`matins-invitatory-common-of-a-holy-woman.yml` ("Laudémus Deum nostrum * In confessióne beátæ
|
||||||
|
{N}..", Commune/C7.txt's own `[Invit]`) is the first Common invitatory antiphon needing a
|
||||||
|
per-saint name substitution. Reused `hours/resolve-common.ts`'s existing `substituteName`
|
||||||
|
helper (previously only called from `getDayCollect` for `collectCommon`/`collectName`) — now
|
||||||
|
exported and wired into `hours/matins.ts`'s `resolveMatinsInvitatoryText` too, via a new
|
||||||
|
`SaintRecord.invitatoryName` field (a separate field from `collectName` since the invitatory's
|
||||||
|
own `{N}` position needs its own grammatical case — genitive singular here — not necessarily
|
||||||
|
`collectName`'s case, though for these 3 saints it happens to be the same declension). All 3
|
||||||
|
`common-of-a-holy-woman` saints given real genitive-singular Latin names (St. Anne → "Annæ",
|
||||||
|
St. Martha → "Marthæ", reusing her existing `collectName` value; St. Mary Magdalene → "Maríæ
|
||||||
|
Magdalénæ") and live-traced end to end.
|
||||||
|
|
||||||
**Still not authored, logged as explicit backlog**, same incremental-content pattern as
|
**Still not authored, logged as explicit backlog**, same incremental-content pattern as
|
||||||
everywhere else in this project:
|
everywhere else in this project:
|
||||||
- Holy Women (C7) invitatory antiphon — Commune/C7.txt's own `[Invit]` ("Laudémus Deum nostrum
|
|
||||||
* In confessióne beátæ N..") is a name-template text (a literal "N." placeholder, like
|
|
||||||
`collectCommon`'s `{N}` substitution elsewhere) — this project's invitatory-antiphon files
|
|
||||||
have no substitution mechanism built yet, so authoring this one needs that groundwork first,
|
|
||||||
not just a transcription. Only 3 saints use `common-of-a-holy-woman`.
|
|
||||||
- General/All Saints (C9) invitatory antiphon — re-investigated 2026-08-27: the reference
|
- General/All Saints (C9) invitatory antiphon — re-investigated 2026-08-27: the reference
|
||||||
engine's own `Commune/C9.txt` is actually the Office of the Dead ("Regem, cui ómnia vivunt"),
|
engine's own `Commune/C9.txt` is actually the Office of the Dead ("Regem, cui ómnia vivunt"),
|
||||||
not a General/All-Saints common — this backlog item's own C-number was mislabeled at the time
|
not a General/All-Saints common — this backlog item's own C-number was mislabeled at the time
|
||||||
|
|||||||
@@ -75,6 +75,19 @@ export interface SaintRecord {
|
|||||||
* independently per saint, not assumed identical).
|
* independently per saint, not assumed identical).
|
||||||
*/
|
*/
|
||||||
benedictusCommon?: string;
|
benedictusCommon?: string;
|
||||||
|
/**
|
||||||
|
* The `{N}` substitution value(s) for the Matins invitatory antiphon's
|
||||||
|
* own Common template (`hours/matins.ts`'s `resolveMatinsInvitatoryText`,
|
||||||
|
* via `hours/resolve-common.ts`'s `substituteName` — the same helper
|
||||||
|
* `getDayCollect` already uses for `collectCommon`/`collectName`, just a
|
||||||
|
* separate field here since the invitatory's own `{N}` position needs
|
||||||
|
* its own grammatical case, not necessarily the same one `collectName`
|
||||||
|
* was declined for). Currently only needed for Common-of-a-Holy-Woman
|
||||||
|
* (`Commune/C7.txt`'s own `[Invit]`, "Laudémus Deum nostrum * In
|
||||||
|
* confessióne beátæ N.." — genitive singular, e.g. "Marthæ") — every
|
||||||
|
* other Common category in use has name-free invitatory text. Absent
|
||||||
|
* for saints whose Common invitatory antiphon needs no substitution. */
|
||||||
|
invitatoryName?: { la: string[]; en: string[] };
|
||||||
/** See calendar/types.ts's OctaveConfig doc comment. Absent for the vast
|
/** See calendar/types.ts's OctaveConfig doc comment. Absent for the vast
|
||||||
* majority of saints — only ones with a real octave declare it. */
|
* majority of saints — only ones with a real octave declare it. */
|
||||||
octave?: OctaveConfig;
|
octave?: OctaveConfig;
|
||||||
|
|||||||
@@ -13,3 +13,9 @@ propers: "st-anne"
|
|||||||
# already live-query-verified for common-of-a-virgin.yml (see TODO.md's
|
# already live-query-verified for common-of-a-virgin.yml (see TODO.md's
|
||||||
# 'minor hour content gaps' section).
|
# 'minor hour content gaps' section).
|
||||||
minorHoursCommon: common-of-a-virgin
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
# Common-of-a-Holy-Woman's own Matins invitatory antiphon needs a
|
||||||
|
# genitive-singular {N} ("beátæ N..", matins-invitatory-common-of-a-
|
||||||
|
# holy-woman.yml) -- standard Latin 1st-declension genitive of "Anna".
|
||||||
|
invitatoryName:
|
||||||
|
la: ["Annæ"]
|
||||||
|
en: ["Anne"]
|
||||||
|
|||||||
@@ -21,3 +21,9 @@ collectName:
|
|||||||
en: ["Martha"]
|
en: ["Martha"]
|
||||||
minorHoursCommon: common-of-a-virgin
|
minorHoursCommon: common-of-a-virgin
|
||||||
benedictusCommon: common-of-a-virgin
|
benedictusCommon: common-of-a-virgin
|
||||||
|
# Same genitive form as collectName above -- collect-c6a's own "beátæ {N}
|
||||||
|
# Vírginis tuæ" and the Matins invitatory's "beátæ N.." are both this
|
||||||
|
# same genitive-singular position.
|
||||||
|
invitatoryName:
|
||||||
|
la: ["Marthæ"]
|
||||||
|
en: ["Martha"]
|
||||||
|
|||||||
@@ -14,3 +14,10 @@ propers: "st-mary-magdalene"
|
|||||||
# already live-query-verified for common-of-a-virgin.yml (see TODO.md's
|
# already live-query-verified for common-of-a-virgin.yml (see TODO.md's
|
||||||
# 'minor hour content gaps' section).
|
# 'minor hour content gaps' section).
|
||||||
minorHoursCommon: common-of-a-virgin
|
minorHoursCommon: common-of-a-virgin
|
||||||
|
# Common-of-a-Holy-Woman's own Matins invitatory antiphon needs a
|
||||||
|
# genitive-singular {N} ("beátæ N..", matins-invitatory-common-of-a-
|
||||||
|
# holy-woman.yml) -- standard Latin genitive of "Maria Magdalena", both
|
||||||
|
# parts declined.
|
||||||
|
invitatoryName:
|
||||||
|
la: ["Maríæ Magdalénæ"]
|
||||||
|
en: ["Mary Magdalene"]
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
# The Common-of-a-Holy-Woman's own invitatory antiphon, read from the
|
||||||
|
# reference engine's own Commune/C7.txt [Invit] line (both languages) --
|
||||||
|
# a name-template text, not a fixed one like every other Common category's
|
||||||
|
# invitatory antiphon in this app: the literal `{N}` here stands for the
|
||||||
|
# winning saint's own name in genitive-singular Latin ("beátæ N.." =
|
||||||
|
# "of blessed N."), substituted at read time by
|
||||||
|
# hours/matins.ts's resolveMatinsInvitatoryText via hours/resolve-
|
||||||
|
# common.ts's substituteName (SaintRecord.invitatoryName) -- the same
|
||||||
|
# mechanism getDayCollect already uses for collectCommon/collectName,
|
||||||
|
# just for this separate template family. Any winning holy woman with no
|
||||||
|
# proper invitatory antiphon of her own authored falls to this Common
|
||||||
|
# tier.
|
||||||
|
id: matins-invitatory-common-of-a-holy-woman
|
||||||
|
text:
|
||||||
|
la: "Laudémus Deum nostrum * In confessióne beátæ {N}.."
|
||||||
|
en: "Let us praise our God * for the confession of blessed {N}."
|
||||||
|
status:
|
||||||
|
la: verified
|
||||||
|
en: verified
|
||||||
+9
-2
@@ -79,6 +79,7 @@ import {
|
|||||||
verifiedText,
|
verifiedText,
|
||||||
splitNamedAntiphon,
|
splitNamedAntiphon,
|
||||||
openingAntiphon,
|
openingAntiphon,
|
||||||
|
substituteName,
|
||||||
} from './resolve-common';
|
} from './resolve-common';
|
||||||
import { getSaintRecord } from '../calendar/feasts';
|
import { getSaintRecord } from '../calendar/feasts';
|
||||||
import { getBiblePlanReadings } from '../propers/bible-plan';
|
import { getBiblePlanReadings } from '../propers/bible-plan';
|
||||||
@@ -193,11 +194,17 @@ function resolveMatinsInvitatoryText(day: LiturgicalDay): ResolvedText {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
const winner = resolveOfficeWinner(day);
|
const winner = resolveOfficeWinner(day);
|
||||||
const commonId = winner.kind === 'sanctoral' ? getSaintRecord(winner.id)?.common : undefined;
|
const saint = winner.kind === 'sanctoral' ? getSaintRecord(winner.id) : undefined;
|
||||||
|
const commonId = saint?.common;
|
||||||
if (commonId) {
|
if (commonId) {
|
||||||
const common = resolveCommon(`matins-invitatory-${commonId}`);
|
const common = resolveCommon(`matins-invitatory-${commonId}`);
|
||||||
if (common.status.la !== 'missing' || common.status.en !== 'missing') {
|
if (common.status.la !== 'missing' || common.status.en !== 'missing') {
|
||||||
return common;
|
// Common-of-a-Holy-Woman's own invitatory antiphon is a name
|
||||||
|
// template ("beátæ N..") -- the only Common invitatory antiphon
|
||||||
|
// currently in use that needs one (see matins-invitatory-common-
|
||||||
|
// of-a-holy-woman.yml's own header). Same substituteName idiom
|
||||||
|
// getDayCollect already uses for collectCommon/collectName.
|
||||||
|
return saint?.invitatoryName ? substituteName(common, saint.invitatoryName) : common;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const seasonSuffix = seasonalOfficeSuffix(day.season);
|
const seasonSuffix = seasonalOfficeSuffix(day.season);
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ export function resolveOfficeBundle(
|
|||||||
* saint who shares it. Positional: the template's `{N}` occurrences fill
|
* saint who shares it. Positional: the template's `{N}` occurrences fill
|
||||||
* left-to-right from `names`, in document order — most templates have
|
* left-to-right from `names`, in document order — most templates have
|
||||||
* one, a few (two co-named saints commemorated together) have two. */
|
* one, a few (two co-named saints commemorated together) have two. */
|
||||||
function substituteName(text: ResolvedText, name: { la: string[]; en: string[] }): ResolvedText {
|
export function substituteName(text: ResolvedText, name: { la: string[]; en: string[] }): ResolvedText {
|
||||||
const substituted: Partial<Record<string, string>> = {};
|
const substituted: Partial<Record<string, string>> = {};
|
||||||
for (const [lang, t] of Object.entries(text.text)) {
|
for (const [lang, t] of Object.entries(text.text)) {
|
||||||
if (!t) {
|
if (!t) {
|
||||||
|
|||||||
Reference in New Issue
Block a user