summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* fix(of): sanctoral generation — exclude temporal & movable, keep ↵Lukasz Kasprzak2026-07-282-110/+74
| | | | | | | | | | | | | | | | 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.
* chore(of): extend lectionary harvest to 2018-2025 (98.4% coverage)Lukasz Kasprzak2026-07-282-232/+299
| | | | | | | 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.
* fix(of): correct memorial readings (ferial fallback) + Lord-feast classLukasz Kasprzak2026-07-284-728/+104
| | | | | | | | | | | | | | | | | | | 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.
* feat(of): full sanctoral calendar + weekday/memorial readingsLukasz Kasprzak2026-07-288-324/+5956
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* chore: bump to 0.36.0 + NOTICE credit for OF/EF lectionary citation sourcesLukasz Kasprzak2026-07-272-1/+10
|
* test(caldata): OF Sunday readings resolve end-to-end (real engine + table)Lukasz Kasprzak2026-07-271-0/+23
|
* feat(bible): resolve and display cross-chapter verse ranges (N:M-P:Q)Lukasz Kasprzak2026-07-273-8/+227
| | | | | | | | | | | | | | | | 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.
* feat(caldata): generate OF Sunday/solemnity lectionary from niedzielaLukasz Kasprzak2026-07-274-12/+1452
| | | | | | | | | | | | | | | | | 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.
* feat(caldata): OF Sunday/solemnity readings by slug+cycle (seed table)Lukasz Kasprzak2026-07-274-3/+67
|
* docs: implementation plan for OF readings (Sundays + solemnities)Lukasz Kasprzak2026-07-271-0/+205
| | | | | | | 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.
* docs: design spec for OF readings (Sundays + solemnities)Lukasz Kasprzak2026-07-271-0/+92
| | | | | | | | | 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.
* chore: bump to 0.35.0 + README for calendar API (JSON/iCal)Lukasz Kasprzak2026-07-272-1/+22
|
* feat(web): /api/calendar.json + /calendar.ics endpoints (capped, nosniff, ↵Lukasz Kasprzak2026-07-273-0/+306
| | | | validated)
* feat(cli): --format json|ical calendar emitters with range + validationLukasz Kasprzak2026-07-273-4/+314
|
* feat(calfeed): shared day builder + reusable reading resolverLukasz Kasprzak2026-07-274-20/+149
|
* feat(calfeed): RFC-5545 iCal renderer with injection-safe escapingLukasz Kasprzak2026-07-272-0/+144
|
* feat(calfeed): day wire model + JSON rendererLukasz Kasprzak2026-07-273-0/+82
|
* docs: implementation plan for calendar API (JSON + iCal)Lukasz Kasprzak2026-07-271-0/+409
| | | | | | | | 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.
* docs: design spec for calendar API (JSON + iCal), security-firstLukasz Kasprzak2026-07-271-0/+125
| | | | | | | | | 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.
* chore: bump version to 0.34.0 (national bibles)Lukasz Kasprzak2026-07-271-1/+1
|
* build: corpus-validate script + add-corpus/check-corpora make targetsLukasz Kasprzak2026-07-272-2/+30
|
* feat(cli): config-driven reading corpus + surface user corporaLukasz Kasprzak2026-07-274-14/+89
|
* docs: record Task 4 deviations (dup-verse=warning, grb check-corpora exemption)Lukasz Kasprzak2026-07-271-1/+13
|
* feat(cli): lectio --corpus-check validatorLukasz Kasprzak2026-07-2713-0/+272
|
* docs: record autoselect metadata flag in national-bibles spec+planLukasz Kasprzak2026-07-272-2/+2
|
* feat(config): reading_lang/reading_version + ReadingCorpus resolverLukasz Kasprzak2026-07-275-2/+63
| | | | | | | | | | | | | | | | 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.
* feat(bible): user corpus discovery + override registryLukasz Kasprzak2026-07-274-2/+165
|
* feat(bible): corpus metadata sidecars + parserLukasz Kasprzak2026-07-277-1/+75
|
* docs: implementation plan for national-bibles corporaLukasz Kasprzak2026-07-271-0/+699
| | | | | | | 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.
* docs: tighten national-bibles spec (defer psalm_system application)Lukasz Kasprzak2026-07-271-5/+4
| | | | | | | 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.
* docs: add reading_lang field to national-bibles specLukasz Kasprzak2026-07-271-8/+9
| | | | | | 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).
* docs: design spec for user-addable national Bible corporaLukasz Kasprzak2026-07-271-0/+122
| | | | | | | | | 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.
* fix(readings): stop auto-rendering from the defective wuj corpusLukasz Kasprzak2026-07-271-3/+8
| | | | | | | | | | | | | | | 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.
* feat(ef): complete offline EF readings — proper ferias, deuterocanon, ↵Lukasz Kasprzak2026-07-278-34/+731
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* chore: bump to 0.32.0 (EF ferial readings)Lukasz Kasprzak2026-07-271-1/+1
|
* feat(cli): EF ferial readings — weekdays repeat the preceding Sunday's MassLukasz Kasprzak2026-07-271-11/+26
| | | | | | 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.
* chore: bump to 0.31.0 (EF temporal Sunday lectionary + cross-chapter citations)Lukasz Kasprzak2026-07-271-1/+1
|
* feat: EF temporal Sunday lectionary (offline Sunday Mass readings)Lukasz Kasprzak2026-07-277-16/+394
| | | | | | | | | 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.
* fix(bible): resolve + format cross-chapter citations (13:22-25; 15:10)Lukasz Kasprzak2026-07-272-6/+38
| | | | | | | 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.
* chore: bump to 0.30.0 (EF feast readings + books.ini multi-language)Lukasz Kasprzak2026-07-271-1/+1
|
* feat: books.toml -> books.ini, multi-language (add Latin dialect), ↵Lukasz Kasprzak2026-07-2710-68/+374
| | | | | | | | | | 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.
* feat(cli,caldata): EF feast proper readings — offline text in --liturgyLukasz Kasprzak2026-07-273-4/+69
| | | | | | | 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.
* chore: bump to 0.29.0 (deuterocanon in vul + drb)Lukasz Kasprzak2026-07-271-1/+1
|
* data(bible): close the deuterocanon gap in vul + drb corporaLukasz Kasprzak2026-07-274-2/+7274
| | | | | | | | 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.
* chore: bump to 0.28.0 (EF 1962 computed calendar)Lukasz Kasprzak2026-07-271-1/+1
|
* test(calendar): EF oracle vs missalemeum 2025-2026 (0 season mismatches)Lukasz Kasprzak2026-07-273-0/+4536
| | | | | | temporalEF validated against Divinum Officium data. Season-mapping handles the Whit octave (Paschaltide), the Christmas vigil (Advent), and the resumed Epiphany Sundays (within Time after Pentecost).
* feat(caldata,cli): embed 1962 EF calendar + form-aware Stack; --liturgy ↵Lukasz Kasprzak2026-07-276-27/+189
| | | | | | | | computes EF caldata.Tridentine()/Base(form); Stack(form,dir,use); runLiturgy drops the EF guard and uses the form's base; rankLabel shows I-IV class; display omits OF cycles + strips ef- slug prefix for EF.
* feat(calendar): Compute branches on Form (computeEF via temporalEF/precedenceEF)Lukasz Kasprzak2026-07-272-3/+65
|
* feat(calendar): precedenceEF (1960 occurrence by class + ↵Lukasz Kasprzak2026-07-272-0/+78
| | | | temporal-before-sanctoral)
* feat(calendar): EF (1962) temporal cycle temporalEF + EF seasonsLukasz Kasprzak2026-07-273-9/+192
| | | | | | 8 EF seasons by date boundary (Septuagesima, Passiontide, Time after Epiphany/ Pentecost + shared); major feasts of the Lord; Christ the King = last Sun of October. ParseRank accepts EF ranks.