fix(tech): default Blog year category to execution year

Dateless posts silently lost their Blog:<year> category. build_wikitext
now falls back to datetime.now().year when no date is declared, so every
published post lands in a year category. Docs corrected accordingly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-11 13:05:29 +09:00
parent bb57f319c5
commit bf96cd10e7
3 changed files with 9 additions and 8 deletions
+2 -2
View File
@@ -10,7 +10,7 @@ Publishes tech blog posts from `mikkeli/tech-blogs` to `https://wiki.novoyuuparo
- YAML frontmatter parsing per [SCHEMA.md](SCHEMA.md) - YAML frontmatter parsing per [SCHEMA.md](SCHEMA.md)
- Pandoc-based markdown → wikitext body rendering (h1 elements preserved) - Pandoc-based markdown → wikitext body rendering (h1 elements preserved)
- Auto-generated banner (`{{Auto-generated|source=...|commit=<sha>}}`) - Auto-generated banner (`{{Auto-generated|source=...|commit=<sha>}}`)
- Category injection: `[[Category:Tech blog]]` on every page; `[[Category:Blog:<year>]]` from `date` field; `[[Category:<tag>]]` per tag entry - Category injection: `[[Category:Tech blog]]` on every page; `[[Category:Blog:<year>]]` from `date` field (falling back to the action's execution year); `[[Category:<tag>]]` per tag entry
- No title prefix — pages live at their bare title - No title prefix — pages live at their bare title
- MediaWiki bot API write with idempotency — no-op if wiki content matches generated output - MediaWiki bot API write with idempotency — no-op if wiki content matches generated output
- Files without `wiki.publish: true` silently skipped - Files without `wiki.publish: true` silently skipped
@@ -65,7 +65,7 @@ Shared code lives in `lib/wiki.py` (repo root).
|---|---|---| |---|---|---|
| No title prefix | Tech posts live at bare titles — no namespace needed | 2026-06-10 | | No title prefix | Tech posts live at bare titles — no namespace needed | 2026-06-10 |
| Fixed category | Every post gets `Category:Tech blog` | 2026-06-10 | | Fixed category | Every post gets `Category:Tech blog` | 2026-06-10 |
| Year category | `Category:Blog:<year>` from `date` field; omitted if no date | 2026-06-10 | | Year category | `Category:Blog:<year>` from `date` field; falls back to the execution year if no date | 2026-06-10 |
| Tag categories | Each tag → `[[Category:<tag>]]` with no prefix | 2026-06-10 | | Tag categories | Each tag → `[[Category:<tag>]]` with no prefix | 2026-06-10 |
| WIP exclusion | None — `wiki.publish: false` is the only gate | 2026-06-10 | | WIP exclusion | None — `wiki.publish: false` is the only gate | 2026-06-10 |
| Publish mode | Always `--all` | 2026-06-10 | | Publish mode | Always `--all` | 2026-06-10 |
+3 -3
View File
@@ -45,7 +45,7 @@ wiki:
#### `date` (ISO 8601 date) #### `date` (ISO 8601 date)
Publication date in `YYYY-MM-DD` format. Drives `[[Category:Blog:<year>]]` injection. If omitted, no year category is added. Publication date in `YYYY-MM-DD` format. Drives `[[Category:Blog:<year>]]` injection. If omitted, the year falls back to the time the publish action runs.
#### `tags` (list of strings) #### `tags` (list of strings)
@@ -69,7 +69,7 @@ For each `.md` with `wiki.publish: true`:
1. Parse and validate frontmatter. 1. Parse and validate frontmatter.
2. Pipe the body through `pandoc -f markdown -t mediawiki`. 2. Pipe the body through `pandoc -f markdown -t mediawiki`.
4. Prepend the auto-generated banner: `{{Auto-generated|source=<source URL>|commit=<sha>}}`. 4. Prepend the auto-generated banner: `{{Auto-generated|source=<source URL>|commit=<sha>}}`.
5. Append category tags: `[[Category:Tech blog]]`; `[[Category:Blog:<year>]]` if `date` is set; `[[Category:<tag>]]` for each tag. 5. Append category tags: `[[Category:Tech blog]]`; `[[Category:Blog:<year>]]` (from `date`, or the action's execution year if `date` is absent); `[[Category:<tag>]]` for each tag.
6. Read the current wiki page content; if identical, skip the write (idempotency). 6. Read the current wiki page content; if identical, skip the write (idempotency).
7. If the page exists without `{{Auto-generated`, skip with a warning (manual page protection). 7. If the page exists without `{{Auto-generated`, skip with a warning (manual page protection).
8. Otherwise, write with an edit summary referencing the source commit. 8. Otherwise, write with an edit summary referencing the source commit.
@@ -80,7 +80,7 @@ For each `.md` with `wiki.publish: true`:
- Pandoc-based markdown → wikitext rendering (h1 elements preserved) - Pandoc-based markdown → wikitext rendering (h1 elements preserved)
- Banner template injection - Banner template injection
- `Category:Tech blog` on every published page - `Category:Tech blog` on every published page
- `Category:Blog:<year>` from `date` field - `Category:Blog:<year>` from `date` field, falling back to the execution year
- `Category:<tag>` per entry in `tags` - `Category:<tag>` per entry in `tags`
- Idempotent writes - Idempotent writes
- Manual-page protection - Manual-page protection
+3 -2
View File
@@ -41,8 +41,9 @@ def build_wikitext(fm: dict, body_wikitext: str, source_url: str, source_ref: st
banner = f"{{{{Auto-generated|source={source_url}|commit={source_ref}}}}}" banner = f"{{{{Auto-generated|source={source_url}|commit={source_ref}}}}}"
cat_parts = ["[[Category:Tech blog]]"] cat_parts = ["[[Category:Tech blog]]"]
date_val = fm.get("date") date_val = fm.get("date")
if date_val: # Fall back to the action's execution year when no date is declared, so
year = str(date_val)[:4] # every post still lands in a Blog:<year> category.
year = str(date_val)[:4] if date_val else str(datetime.now().year)
cat_parts.append(f"[[Category:Blog:{year}]]") cat_parts.append(f"[[Category:Blog:{year}]]")
for tag in (fm.get("tags") or []): for tag in (fm.get("tags") or []):
cat_parts.append(f"[[Category:{tag}]]") cat_parts.append(f"[[Category:{tag}]]")