<feed xmlns='http://www.w3.org/2005/Atom'>
<title>lectio.git/internal/cli, branch v0.45.0</title>
<subtitle>offline Catholic daily readings and liturgical calendar in Go, with CLI, TUI and web clients</subtitle>
<id>https://git.labunix.xyz/lectio.git/atom?h=v0.45.0</id>
<link rel='self' href='https://git.labunix.xyz/lectio.git/atom?h=v0.45.0'/>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/'/>
<updated>2026-07-29T18:56:46Z</updated>
<entry>
<title>test(cli): isolate the suite from the real ~/.config/lectio</title>
<updated>2026-07-29T18:56:46Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T18:56:46Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=7d26aa60349e72c3d437d329a678a51331914233'/>
<id>urn:sha1:7d26aa60349e72c3d437d329a678a51331914233</id>
<content type='text'>
The ref/rand cli tests assume English book abbreviations ("Jn 3:16"), but
with no LECTIO_CONFIG set they read the developer's real user config. On a
machine whose config has ui_language = pl (sigla_style = auto -&gt; Polish
dialect), "Jn" is not a valid abbreviation and TestRefSingle,
TestRefEnglishDialect, TestRefRejectsPolishAbbrevInEnglish, TestRefCompare
and TestRandVerse fail -- while passing on a clean CI.

Add a package TestMain that points LECTIO_CONFIG at a throwaway temp path,
forcing built-in defaults for every cli test and guaranteeing the suite
never reads or writes the real user config. Suite now green on a Polish
config too.
</content>
</entry>
<entry>
<title>test(bible): skip corpus-dependent tests when optional corpora aren't embedded</title>
<updated>2026-07-29T09:46:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T09:46:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=8ddd910dd545c45a7227da87ca125758b4a0e2cb'/>
<id>urn:sha1:8ddd910dd545c45a7227da87ca125758b4a0e2cb</id>
<content type='text'>
Since 51c0f4e split the corpora (only vul embedded by default; wuj/drb/grb
behind -tags fullbible), `go test ./...` on the default build was red across six
packages -- every failure was a test assuming an optional corpus is present.

Guard those assertions with a skip keyed on bible.Meta(code), so they run under
-tags fullbible and skip -- not fail -- on the default vul-only build. Mixed
tests are split into subtests so the always-embedded vul assertions and pure
logic (pl-&gt;vul fallback, explicit passthrough, bt-rejection, i18n labels) keep
running on both builds. Test-only change; no product code or corpora touched.

- internal/bible: TestVerses, TestLookup, TestCorpusBooks, TestChapters,
  TestGrbNoApparatusMarkers, TestCrossChapterRange* (requireCorpus helper).
- internal/cli, config, render, tui, web: the same pattern for their
  corpus-dependent tests.
- Fixes an index-out-of-range panic in internal/tui's reader tests that was
  aborting the package binary and masking 3 further corpus-absence failures
  (TestReaderBookmarkFlow, TestReaderChapterJump, TestReaderRemembersPlace).

Verified: `go test ./...` and `go test -tags fullbible ./...` both green (0 FAIL);
guards active only on the default build (29 skips vs 1 unrelated pre-existing);
gofmt and go vet clean.
</content>
</entry>
<entry>
<title>feat(cli): --cal-dump NAME to generate a commented calendar template</title>
<updated>2026-07-29T06:24:34Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-29T06:24:34Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=4ef5570c348e2d8d83c67e049b06e7b5d1a7542d'/>
<id>urn:sha1:4ef5570c348e2d8d83c67e049b06e7b5d1a7542d</id>
<content type='text'>
Replace the static examples/sanctorale-of.ini with a `--cal-dump NAME` flag
that writes the running universal calendar to ~/.config/lectio/calendars/NAME.ini
as a fully-commented layer template (every celebration present, all commented).
Uncomment one day and edit a field to override it; enable with `use = NAME`.

- Form-aware: respects -l/--lectionary, so `-l trad --cal-dump x` dumps the 1962
  calendar (322 entries) and the default dumps the OF calendar (212 entries).
- Entries sorted by date then slug; refuses to overwrite an existing file.
- Always in sync with the embedded (or sanctorale-overridden) calendar, so no
  stale checked-in template to maintain.
- Update help text, man page (OPTIONS/FILES/EXAMPLES) and README to match;
  drop examples/sanctorale-of.ini.
</content>
</entry>
<entry>
<title>cli: --year N prints the year's key liturgical dates</title>
<updated>2026-07-28T23:05:08Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T23:05:08Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=1610b0bf8b0df108b4eeda870e9cf2e83f9c5390'/>
<id>urn:sha1:1610b0bf8b0df108b4eeda870e9cf2e83f9c5390</id>
<content type='text'>
On its own, `--year N` now prints a human-readable overview of the year's key
dates -- season boundaries, solemnities and feasts of the Lord -- computed from
the engine for the configured form (and custom-calendar layers), paged when a
pager is configured. With --format json|ical it still emits the machine
calendar (runFeed) as before. Numbered seasonal Sundays and Octave weekdays are
omitted from the solemnity list (the season boundary already marks them).
</content>
</entry>
<entry>
<title>help: refresh -h/--help for lectio, lectio-ui, lectio-web</title>
<updated>2026-07-28T21:39:17Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T21:39:17Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=fd950f027300d3185c7b66b06981eddcfcfead4f'/>
<id>urn:sha1:fd950f027300d3185c7b66b06981eddcfcfead4f</id>
<content type='text'>
The help text predated this session's changes. Update all three binaries:

- Taglines: drop "(Polish + 4 versions)" -&gt; "offline ... daily readings (OF + EF)".
- Versions: state that only the Latin Vulgate is built in; wuj/grb/drb are
  optional (make build-full, or drop &lt;code&gt;.tsv/.ini into the corpora dir); a
  missing version renders "(not in &lt;code&gt;)".
- --ui-lang: now any code (en, pl, ...), not just pl|en; note names/&lt;code&gt;.ini,
  ui/&lt;code&gt;.ini, custom calendars and the sanctorale override.
- lectio-ui: drop the removed "bt" version and the no-op -o/--offline flag from
  the help (the tool is fully offline; --offline only ever dropped bt).
- lectio-web: drop -o/--offline; add a one-line description of what it serves.

No behaviour change; full suite green.
</content>
</entry>
<entry>
<title>caldata: allow an external universal sanctorale to override the embedded one</title>
<updated>2026-07-28T17:22:40Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T17:22:40Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=d5d175118138249fe7d9e85d1bc65fb0b7e3a398'/>
<id>urn:sha1:d5d175118138249fe7d9e85d1bc65fb0b7e3a398</id>
<content type='text'>
The universal calendar of saints can now be refreshed or replaced without a
rebuild: if ~/.config/lectio/sanctorale/of.ini (OF) or ef.ini (EF) is present
and parses, caldata.Base uses it instead of the embedded calendar; a missing or
malformed file falls back to the embedded default, so the binary stays
self-contained and correct out of the box. Local diocesan/national additions
keep layering on top via calendars/ + `use` (unchanged). The temporal cycle and
precedence rules stay in code -- only the sanctorale is data.

- caldata.SetSanctoraleDir hook (mirrors bible/naming/i18n); Base() prefers the
  external file per form. config.SanctoraleDir(); wired in the CLI, TUI and web
  entry points. Tests cover override, no-file, and malformed-file fallback.
- README: new "Calendar of saints" section (two tiers: overlay via `use`,
  replace via sanctorale/&lt;form&gt;.ini); config comment notes the override.
</content>
</entry>
<entry>
<title>i18n: make all UI chrome user-translatable via ui/&lt;code&gt;.ini</title>
<updated>2026-07-28T17:03:15Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T17:03:15Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=9100973576f87adcadaf6c8b331df7e729aeb117'/>
<id>urn:sha1:9100973576f87adcadaf6c8b331df7e729aeb117</id>
<content type='text'>
The interface chrome (version labels, TUI keybar/messages, CLI banner words,
web control labels, section-heading words) was English/Polish hardcoded in Go.
It is now data: the English and Polish tables ship as embedded lang/en.ini and
lang/pl.ini, and any language is user-overridable at &lt;config&gt;/ui/&lt;code&gt;.ini,
resolved per key with an English fallback. With ui_language = &lt;code&gt; plus a
names/&lt;code&gt;.ini, the WHOLE interface -- chrome, day names, saint names -- is
translatable without a rebuild.

- i18n.Get loads the embedded English baseline, overlays the embedded/user
  language file, caches per lang; field &lt;-&gt; INI-key mapping is by reflection
  (lang.go) so the tables and files stay in sync automatically. Edge-space
  values (e.g. "error: ") are double-quoted so the INI trim keeps them. The
  Go tables move to golden_test.go; TestGoldenMatchesEmbedded asserts the
  embedded files still parse back to them, and TestGenerateLangFiles
  regenerates them (LECTIO_GEN=1).
- config.UIDir(); wire i18n.SetUserDir in the CLI, TUI and web entry points.
- README/config: document ui/&lt;code&gt;.ini alongside names/&lt;code&gt;.ini.
</content>
</entry>
<entry>
<title>naming: localise liturgical day names in any language</title>
<updated>2026-07-28T16:15:29Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T16:15:29Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=539a7c71b60115144959f712ef5966f48c63f9f0'/>
<id>urn:sha1:539a7c71b60115144959f712ef5966f48c63f9f0</id>
<content type='text'>
Add internal/naming, which renders temporal day names and celebration
display names from the calendar engine's slugs in any language. English is
the built-in baseline; a language is data -- an embedded lang/&lt;code&gt;.ini
(pl shipped) and/or a user file at &lt;config dir&gt;/names/&lt;code&gt;.ini that
overrides it key by key. Names compose from a small vocabulary plus
per-language format templates, so word order and grammatical case can
differ (e.g. Polish genitive "3. Niedziela Okresu Zwykłego"); any string a
language omits falls back to English.

- Move day-name generation out of calendar (calendar.HumanizeSlug removed,
  calendar stays a pure engine) into naming.DayName; the English golden
  cases carry over verbatim.
- naming.CelebrationName unifies the three duplicated resolvers
  (cli/readings/calfeed): name.&lt;lang&gt; -&gt; English -&gt; Latin -&gt; humanized slug.
  Saint names stay in the calendar data (name.&lt;lang&gt;), overridable via
  calendar layers.
- config: ui_language now accepts any code (lower-cased, not clamped to
  en/pl) so names/&lt;code&gt;.ini applies; UI chrome still resolves en/pl and
  falls back to English. Add NamesDir(); wire naming.SetUserDir (and the
  previously unwired bible.SetUserCorporaDir) in the TUI and web mains too,
  so external corpora and name files work across all three binaries.
</content>
</entry>
<entry>
<title>refactor: remove the niedziela/missalemeum scrapers, bt, traditional_lang</title>
<updated>2026-07-28T10:50:31Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T10:50:31Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=7b220084cf3951c8cde0582efdfcf628afc64336'/>
<id>urn:sha1:7b220084cf3951c8cde0582efdfcf628afc64336</id>
<content type='text'>
The daily view now computes entirely offline (previous commit), so retire the
network path and everything that served it:

- Delete internal/tradlit (missalemeum) and the niedziela scraper from
  internal/liturgy (fetch/store/parse + fixtures); keep Section, DayInfo and
  ExtractCitation.
- Remove the "bt" version everywhere (render gatherBT + branches, config,
  i18n, web form, TUI) and bible.ToEnglishRef (Polish citation converter).
  A legacy config carrying "bt" migrates to "wuj" on load (config.migrateBT).
- Remove the traditional_lang config field and the -g/--lang flag from all
  three binaries.
- Drop the now-dead flags -R/--refresh, -o/--offline, -u/--update,
  -C/--clean and the harvest/clean commands.
- New defaults: versions = wuj,vul,grb,drb; default_version = vul.

Update the README (offline-by-design, no harvest/update), help text, and
stale niedziela/bt doc comments. Tests updated for the offline reality;
go test ./... and go vet ./... are clean, all three binaries build and run
offline (OF + EF, compare, web).
</content>
</entry>
<entry>
<title>feat(readings): compute the daily view offline (OF + EF)</title>
<updated>2026-07-28T09:57:45Z</updated>
<author>
<name>Lukasz Kasprzak</name>
<email>lukas@labunix.xyz</email>
</author>
<published>2026-07-28T09:57:45Z</published>
<link rel='alternate' type='text/html' href='https://git.labunix.xyz/lectio.git/commit/?id=feede51697be870ae183a95b513ef64f031dbd0f'/>
<id>urn:sha1:feede51697be870ae183a95b513ef64f031dbd0f</id>
<content type='text'>
Route readings.Load through the embedded calendar engine and lectionary
data instead of the niedziela/missalemeum scrapers. The daily view now
computes each day (calendar.Compute + caldata.Readings) and renders text
from the public-domain corpora, with citations resolved per corpus.

- bible.OFRef: normalise an English-canonical OF citation (drop sub-verse
  letters, ";" -&gt; ",") and renumber Psalms for the target Psalter
  (Hebrew-&gt;Vulgate chapter for vul/grb/wuj; DRB title-fold verses for drb).
- liturgy.Section gains Ref (English-canonical lookup ref) alongside
  Citation (sigla-dialect display); the loader fills both, resolveRef uses
  Ref, headings/citation command show Citation.
- EffectiveVersions always drops "bt" (no offline corpus); the single
  daily version defaults to vernacularVersion (reading corpus else Latin).

Scraper packages remain in the tree, unreferenced, pending removal.
</content>
</entry>
</feed>
