| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
transfers)
Ordinary Form:
- Add the movable Marian memorials that have no fixed date: Mary, Mother of the
Church (Monday after Pentecost) and the Immaculate Heart (Saturday after the
Sacred Heart), computed in computeOF.
- General Norms 60: two coinciding obligatory memorials both become optional and
the ferial is observed -- except Mary, Mother of the Church, which keeps
precedence per its 2018 decree.
Extraordinary Form:
- Capture fixed-date vigils in the sanctoral harvest (Christmas, the Nativity of
St John the Baptist, Sts Peter & Paul, St Lawrence, the Assumption, All Saints,
the Immaculate Conception) -- previously filtered out.
- temporalEF: the movable vigils of the Ascension (I class eve) and Pentecost
(Whitsun Eve), and the September/Advent Ember days (II class violet ferias).
- transferIfImpededEF: the Annunciation transfers past Holy Week/the Easter
octave to the Monday after Low Sunday; All Souls moves to Nov 3 when Nov 2 is a
Sunday.
- genlect harvests proper Masses for the new Ember/vigil days.
Adds TestEFCoverage + TestOFMovableMemorials. Bumps to 0.39.0.
Verified per-day: OF 0 real errors vs calapi (2026-2028, 100% correct-observed);
EF 0 real errors vs missalemeum (2025-2027), residual = deep-tail vigil-occurrence
and St Joseph Passiontide-transfer edges (~1-2 days/yr, documented).
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Audit of the OF sanctoral vs calapi's full celebration list (2026-2028) found
saints that calapi only ever shows as 'commemoration' in a privileged season
(Lent, late Advent, the Christmas octave) were dropped by the generator, and
'first-year-wins' froze a stale rank.
- gen-sanctoral.go: map calapi 'commemoration' -> optional memorial; keep the
HIGHEST rank per saint across an expanded 2025-2029 reference span (so a saint
is seen at its true rank on an ordinary weekday, e.g. Polycarp as a memorial
when Feb 23 falls in Ordinary Time).
- Recovers 15 saints: Polycarp, Perpetua & Felicity, John of God, Frances of
Rome, Patrick, Cyril of Jerusalem, Turibius, Isidore, Vincent Ferrer, Peter
Canisius, John of Kanty, Thomas Becket, Sylvester I, and others (197->212).
- Corrects St Irenaeus (June 28) optional -> obligatory memorial (2022 change).
Verified vs calapi per-day 2026-2028: remaining diffs are only the 3 skipped
movable memorials and name-phrasing of temporal days.
|
| |
|
|
|
|
|
|
|
|
|
|
| |
Generate internal/caldata/tridentine-calendar.ini from missalemeum's per-date
proper API (Divinum Officium 1962 data) via scripts/gen-sanctoral-ef.go: each
fixed date's observed saint with rank, colour, English name and proper
Epistle/Gospel citations, plus sancti commemorations. Multiple reference years
are tried per date so a saint occulted by a Sunday in one year is still captured
observed in another; saints never observed are ranked commemoration. Feasts of
the Lord are marked class=lord. Latin names hand-curated (missalemeum has none).
Adds TestTridentineLoads, credits missalemeum in NOTICE, bumps to 0.38.0.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Septuagesima ferias are IV class (per annum), not III class, so a III
class saint (e.g. Conversion of St Paul, Jan 25) displaces them.
- Holy Week ferias and the privileged octaves of Easter and Pentecost are
I class: no saint's feast is admitted (temporal office wins).
- Occurrence tie-break is asymmetric by season: an ordinary feria (Advent,
per annum) yields to an equal-class feast; Lent/Passiontide ferias keep
their privilege and win the tie.
- A II class feast of the Lord (Purification, Exaltation of the Cross,
Dedication of the Lateran) displaces a II class Sunday it falls on.
Validated against missalemeum across 2025-2027: ~97.5% of days observe the
liturgically-correct celebration, 100% rank agreement on saint-days.
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
transferred-fixed
- Skip ALL dates the temporal engine owns (Sundays + its solemnities/feasts), so
Christ the King / Trinity no longer leak into the sanctoral as duplicate
fixed-date entries; saints are captured on their weekday occurrences.
- Explicit skip-list for genuinely movable memorials (Mary Mother of the Church,
Immaculate Heart, BVM-on-Saturday) that a fixed-date calendar cannot represent
-- a documented gap needing temporal-engine support.
- 'first year wins' keeps a transferred-but-fixed feast (Annunciation Mar 25) on
its proper date. Lord-feast class inference fixed earlier.
Calendar rank vs calapi: 2026 1/86, 2027 2/86, 2028 2/92 mismatches (~98-99%);
residual = the skipped movable memorials.
|
| |
|
|
|
|
|
| |
More true-ferial years per position; 359/365 days of 2026 now resolve. The 6
residual gaps are rare pre-Lent Ordinary-Time positions (weeks 3/4/9) that never
occurred as a true ferial in the harvestable past (niedziela publishes no future
years) -- an irreducible limit of date-based harvesting, documented.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Validation vs USCCB (Catholic Readings API) caught two bugs:
- Obligatory memorials were keyed by their own slug, freezing ONE year's ferial
(a memorial's fixed date lands in a different Ordinary-Time week each year), so
most weekday memorials showed the wrong week's reading. Now memorials are
skipped in the harvest and fall back to the day's ferial slug at runtime -> the
correct week's reading. (Proper-reading memorials show the permitted ferial;
their propers are a later refinement.)
- gen-sanctoral classOf missed feasts of the Lord whose title says 'Holy Cross'
(not 'of the Cross') etc., so the Exaltation of the Cross (and Transfiguration,
Presentation) did not displace an Ordinary Sunday. Fixed the Lord/BVM class
inference; the Cross now correctly displaces the Sunday and shows its proper.
USCCB agreement on the sampled 2025 window rose to ~92%; residual diffs are
proper-reading memorials (Guardian Angels/Sorrows gospels), citation-granularity
(same reading, different verse range), and week numbering around feast-displaced
Sundays -- documented as known refinements.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Populate the OF General Roman Calendar sanctoral and extend the OF readings to
weekdays and sanctoral days.
Sanctoral calendar (roman-calendar.ini: 29 -> 202 celebrations):
- scripts/gen-sanctoral.go generates it from calapi.inadiutorium.cz (authoritative
General Roman Calendar) -- English name/rank/colour from general-en, Latin from
general-la, Polish from niedziela DayInfo (obligatory celebrations). Fixed dates
the temporal engine already computes are excluded. VALIDATED: my engine's
observed rank agrees with calapi on all 86 obligatory sanctoral days of 2026
(0 mismatches).
Precedence fix (precedence.go): an optional memorial no longer displaces the
weekday as the DEFAULT observed celebration (it sorts below the ferial, shown as
an option) -- matching the General Roman Calendar / calapi.
Readings (of-lectionary.ini: 254 -> 1018 entries) via genlect-of.go:
- Weekday (ferial) 2-year cycle I/II, keyed <ferial-slug>-<WeekdayCycle>, harvested
from niedziela over 2020-2025 (multiple years per cycle; retry-on-failure so a
glitch year never poisons a key; only TRUE ferials + optional-memorial days,
where niedziela shows the ferial).
- Obligatory memorials keyed by their OWN slug (niedziela shows their proper, e.g.
Barnabas -> Acts 11, or the ferial for memorials without a proper) -- never
miskeyed to a ferial position.
- caldata.Readings: OF resolves slug+SundayCycle | slug+WeekdayCycle, else a
memorial falls back to the day's ferial readings.
- Source-glitch normalisation (1J->1 J, PnP->Pnp).
books.ini: canonical names "Song of Solomon" and "The Acts" added as their own
[en] forms (ToEnglishRef emits the canonical; it must resolve). Fixes ~32
cross-chapter Song-of-Songs/Acts citations.
Coverage: 359/365 days of 2026 render (98.4%); 6 residual ferial positions never a
true-ferial in 2020-2025. EF sanctoral and OF psalm renumbering still pending.
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Lookup now detects a verse-tail range that crosses a chapter boundary
("M-P:Q", e.g. "30-28:7" in "Sirach 27:30-28:7") and fetches chapter N
from verse M to its end, any whole chapters between, and chapter P from
verse 1 through Q, instead of misreading the tail as a plain from-to
range and coming up empty. SplitRef expands the same pattern inside a
comma list so a trailing group after the jump (e.g. the ",8-10" in
"Malachi 1:14-2:2,8-10") resolves against the new current chapter.
FormatRef renders the range intact as "<sigla> N:M-P:Q" instead of
splitting off a fake new-chapter marker from the embedded "P:" and
mangling the display (previously "Sir 27:7").
No sentinel value is ever stored in a ref string; it only bounds an
internal verse-filter loop in Lookup.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Task 2. scripts/genlect-of.go harvests niedziela over the PAST cycle-equivalent
years 2023(A)/2024(B)/2025(C) -- niedziela only publishes ~6 weeks ahead, so the
future 2025-2027 span was unfetchable; the 3-year cycle repeats, so a liturgical
position's cycle-A readings are identical whether they fall in 2023 or 2026.
Produces internal/caldata/of-lectionary.ini: 254 entries (A=86, B=87, C=81),
keyed <slug>-<cycle>, citations English-canonical via ToEnglishRef.
Also: books.ini [en] Matthew gains "Mat" (ToEnglishRef maps Polish Mt->Mat; now
resolves and displays as Matt). of_test.go assertion relaxed to accept either
spelling.
KNOWN GAP: 8 cross-chapter range citations (e.g. Sirach 27:30-28:7, John
18:1-19:42) don't yet resolve -- the bible ref parser handles semicolon groups
but not a dash-range spanning a chapter boundary. Fix next.
|
| | |
|
| |
|
|
|
|
|
| |
3 TDD tasks: OF resolver + embedded table (seed), niedziela generator
(2025-2027, All:true harvest), render verification + coverage sweep. Keyed by
<slug>-<cycle>. Verified caldata.Universal(), readings.Options.All (gospel-only
default), and the OF slugs against current code.
|
| |
|
|
|
|
|
|
|
| |
Offline OF Sunday/solemnity lectionary keyed by <computed-slug>-<SundayCycle>,
generated once from niedziela over 2025-2027 (covers A/B/C), citations
normalized English-canonical via ToEnglishRef, rendered from public-domain
corpora (Polish->Latin fallback, EF pattern). Extends caldata.Readings with an
OF branch; flows into -L + the API. Weekdays/sanctoral deferred. Verified
SundayCycle is populated on non-Sunday solemnities.
|
| | |
|
| |
|
|
| |
validated)
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
| |
5 TDD tasks: calfeed JSON renderer, RFC-5545 iCal renderer w/ injection-safe
escaping (security test first), shared day builder + reusable reading resolver,
CLI --format json|ical + range flags, web endpoints (capped/nosniff/validated).
Security controls each mapped to a test. Code grounded in real calendar types
+ Go 1.22 web mux.
|
| |
|
|
|
|
|
|
|
| |
Two surfaces, one engine: CLI --format json|ical (offline/pipeable) + thin
lectio-web /api/calendar.json + /calendar.ics endpoints. Pure internal/calfeed
renderer. Identity + reading citations (no full text). Security section:
range-cap DoS control (1830d web), RFC-5545 iCal injection escaping (custom
calendar names are untrusted), strict input validation, nosniff content types,
no file/layer injection over HTTP, GET-only.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Task 3 of national-bibles. Adds reading_lang (any language code) and
reading_version (explicit corpus code) config fields, setField cases,
renderConfigINI lines + self-documenting header, and Config.ReadingCorpus():
reading_version > reading_lang match > ui_language match > "" (Latin fallback
applied by the caller).
Also adds an `autoselect` corpus-metadata flag (default true), surfaced during
this task: the built-in wuj declares lang=pl, so lang-auto would have
re-selected the incomplete Wujek for Polish users and defeated the wuj-drop.
wuj.ini now sets autoselect=false, so it is reachable only via an explicit
reading_version or --ref; the resolver's language auto-match skips
non-autoselectable corpora. A corrected Wujek drop-in (autoselect defaults
true) auto-serves Polish with zero config.
|
| | |
|
| | |
|
| |
|
|
|
|
|
| |
6 TDD tasks: sidecars+meta parser, user-dir discovery+override registry,
reading_lang/reading_version config+resolver, --corpus-check validator,
wire resolver into rendering + surface user corpora, scripts+Makefile.
Code verified against internal/ini ([]Section) and configPath() helper.
|
| |
|
|
|
|
|
| |
psalm_system becomes stored+validated metadata only; per-corpus psalm
numbering application is deferred to the future psalm-readings work (offline
lectionary has no psalm parts yet, so wiring now would be dead code). Testing
updated for reading_lang + the deferred psalter.
|
| |
|
|
|
|
| |
reading_lang (any language code) drives corpus auto-selection; empty follows
ui_language. Resolver: reading_version > reading_lang match > ui_language match
> Latin vul. traditional_lang dropped from selection entirely (scraper-only).
|
| |
|
|
|
|
|
|
|
| |
A corpus = <code>.tsv (6-col verse text) + <code>.ini (metadata) pair,
serving both compile-in (glob go:embed + Makefile validate/embed) and
runtime drop-in (~/.config/lectio/corpora/, overrides built-ins). Offline
reading selection becomes config-driven (reading_version > lang-auto > Latin
fallback); traditional_lang stays deprecated/scraper-only. Adds
lectio --corpus-check validator with a coverage report vs the Latin vul.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The Wujek (wuj) corpus is missing the deuterocanonical Daniel 3:24-90 (Song
of the Three), Daniel 13-14, and Esther 10:4-16:24, plus ~400 verses its
builder (parse_bwujek.py) dropped or mis-numbered (e.g. Matthew 5:13/39 are
in the source HTML but absent from wuj.tsv). Rendering computed readings from
it silently produced gaps.
vernacularVersion() now renders Polish from the complete Latin Vulgate (vul)
instead of wuj; English stays on Douay-Rheims (complete after the deuterocanon
backfill). wuj remains embedded for explicit `--ref -b wuj` and version
comparison -- it just isn't auto-selected for computed reading text. A properly
formatted Polish Bible can later be dropped in as a user corpus (the
national-bibles feature) to restore native Polish rendering.
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Latin fallback
Finish the Extraordinary Form (1962) offline Mass readings so every day of
the year resolves in both English and Polish.
Temporal engine (temporal_ef.go):
- Unique ferial slugs "ef-<season>-<week>-<weekday>" so penitential-season
weekdays (Lent, Advent, Passiontide, Easter octave) can key their own
proper Masses; green-season ferias have no entry and fall back to the
preceding Sunday (the 1962 rule).
- Special "ef-lent-after-ashes-<weekday>" case for the days between Ash
Wednesday and Lent I, which have their own propers.
Lectionary (tridentine-lectionary.ini, 55 -> 143 entries) via genlect.go:
- Generator now fetches proper-season weekdays and stores a feria only when
its Mass differs from the preceding Sunday's.
- cleanCite() normalises two missalemeum data glitches: a stray comma
between book and chapter ("4 Kings, 5:1" -> "4 Kings 5:1") and a
period-as-separator ("John 20. 19-31" -> "John 20:19-31"), both guarded so
legitimate multi-chapter citations are untouched.
Citations & corpora:
- books.ini: Douay abbreviations in the [en] dialect (Ex, Ezech, Jonas, and
3/4 Kings -> canonical 1/2 Kings), so the EF Lenten epistles resolve while
the display keeps modern sigla.
- drb.tsv: +205 rows backfilling the deuterocanonical Daniel 13-14 (Susanna,
Bel) and Esther 11-16 (Greek additions) from get.bible douayrheims, which
the base corpus omitted; scripts/gen-deutero.py documents the fetch.
Rendering (liturgy.go):
- readingLine() falls back to the Latin Vulgate (complete) when the
vernacular corpus lacks a passage, with a clear note. Covers the Polish
Wujek deuterocanon gap (no clean public-domain source exists) and any
future vernacular gap; faithful to the EF as a Latin rite.
Result: 730/730 days resolve for both EN (native) and PL (native + Latin
fallback for 3 deuterocanon days). Version 0.32.0 -> 0.33.0.
|
| | |
|
| |
|
|
|
|
| |
dayReadings() falls back, for an EF weekday with no proper Mass, to the
preceding Sunday's temporal lectionary (the 1962 green-season rule). Lenten/
Advent proper ferias show the Sunday's readings pending their own data.
|
| | |
|
| |
|
|
|
|
|
|
|
| |
Unique temporal-day slugs (season-sunday-week); scripts/genlect.go generates
tridentine-lectionary.ini from missalemeum keyed by slug (55 entries: the
Sundays of the whole EF year). caldata.TemporalReadings(form,slug) lookup;
--liturgy resolves proper-of-feast else the temporal cycle and renders the text.
bible.ParseRef strips abbreviation dots (1 Cor. -> 1 Cor). 52/53 Sundays fully
resolve offline.
|
| |
|
|
|
|
|
| |
normalizeSigla treats ';' as a group separator so SplitRef resolves each
chapter; FormatRef renders multi-chapter refs per chapter in the dialect's
sigla. Restored the full Assumption (Judith 13:22-25; 15:10) and St Lucy
(2 Cor 10:17-18; 11:1-2) epistles.
|
| | |
|
| |
|
|
|
|
|
|
|
|
| |
config-scoped citation display
books.ini with [en]/[pl]/[la]; parseBooks reads INI (bible drops go-toml).
Latin dialect resolves EF citations (Eccli->Sirach, Apoc->Revelation, Luc...);
sigla_style gains 'latin'. Reading citations now DISPLAY in the configured
sigla (FormatRef(SiglaLang)), not raw English. One-shot books.toml->books.ini
user migration (go-toml now config-only). Web settings editor -> books.ini.
|
| |
|
|
|
|
|
| |
Added 1962 Epistle+Gospel citations (from missalemeum) to the 15 EF feasts;
--liturgy now resolves + renders the reading text via the corpora (drb/wuj),
incl. deuterocanon (Assumption's Judith epistle). Cross-chapter citations use
their primary range pending multi-chapter parser support.
|
| | |
|
| |
|
|
|
|
|
|
| |
Added Tobit, Judith, Wisdom, Sirach, Baruch to vul (5) and those + 1-2
Maccabees to drb (7), from get.bible's public-domain Clementine Vulgate /
Douay-Rheims (Clementine versification = the EF citation basis). EF and OF
deuterocanonical citations (e.g. the Assumption's Judith epistle) now resolve
against the corpora. Flipped the gap-documenting test to assert resolution.
|
| | |
|