Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
21509fa
Add GitHub Actions CI to verify generated HTML is in sync
claude Feb 18, 2026
35bf9c6
Switch CI from blocking to auto-committing regenerated HTML
claude Feb 18, 2026
0639c9e
Fix .gitattributes typo and mark generated HTML as linguist-generated
claude Feb 18, 2026
c15144d
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 18, 2026
10ce6e7
Merge pull request #5 from zurillion/claude/review-changes-mlsgga5of9…
zurillion Feb 18, 2026
988fd9b
Add DLC filter to Cookbooks page
claude Feb 18, 2026
73179bb
Merge pull request #6 from zurillion/claude/review-changes-mlsgga5of9…
zurillion Feb 18, 2026
7277e42
Add cloud sync & backup with Google Drive (Phase 1+2+5)
claude Feb 19, 2026
900c917
Configure Google OAuth Client ID for Drive sync
claude Feb 19, 2026
813a6ba
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
ddf2497
Merge pull request #7 from zurillion/claude/review-changes-mlsgga5of9…
zurillion Feb 19, 2026
ea70b73
Fix Cloud Sync section lost on CI regeneration
claude Feb 19, 2026
838bfcc
Merge pull request #8 from zurillion/claude/review-changes-mlsgga5of9…
zurillion Feb 19, 2026
1d8cd54
Add GitHub Gist sync provider
claude Feb 19, 2026
b57f603
Remove iCloud from sync provider list
claude Feb 19, 2026
966ee9d
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
052ab35
Merge pull request #9 from zurillion/claude/review-changes-mlsgga5of9…
zurillion Feb 19, 2026
abf35fd
Fix generate.py to produce active GitHub Gist sync button
claude Feb 19, 2026
83efa11
Merge pull request #10 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
7863989
Fix sync stuck in 'syncing' on first GitHub Gist connect
claude Feb 19, 2026
4021845
Make version history description provider-aware
claude Feb 19, 2026
b06d62a
Revert manually generated options.html — let CI regenerate
claude Feb 19, 2026
9e3fafa
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
ee25ebc
Fixed bug on GitHub first sync remaining stuck forever
zurillion Feb 19, 2026
aae4721
Make Options section collapsible, collapsed by default
claude Feb 19, 2026
a1e7829
Fix bidirectional sync: pull on periodic timer and handle missing tim…
claude Feb 19, 2026
bb04027
Merge pull request #12 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
07856ec
Scope Options collapse to textarea only, not the whole section
claude Feb 19, 2026
d2f1959
Merge pull request #13 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
973941a
Fix theme sync and persist DLC filter to profile
claude Feb 19, 2026
b773cf5
Merge pull request #14 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
61e0ce8
Hide Google Drive option from sync provider modal
claude Feb 19, 2026
8267f75
Hide Google Drive option in sync modal via generate.py
claude Feb 19, 2026
23a3e06
Merge pull request #15 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
512f126
Fix search+DLC filter interaction: hide empty DLC sections during search
claude Feb 19, 2026
bcfb0e1
Revert generated HTML files from previous commit (only generate.py sh…
claude Feb 19, 2026
0746d00
Revert options.html to pre-modification state (only generate.py shoul…
claude Feb 19, 2026
582dd69
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
292edef
Merge pull request #16 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
a1cdede
Add DLC filter to 7 more tabs and tag their DLC items
claude Feb 19, 2026
33ce4d5
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
b1fb76b
Merge pull request #17 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
d1473e4
Hide empty subsection headings (h5) under DLC filter
claude Feb 19, 2026
31c972c
Merge pull request #18 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
0d0ca05
Hide empty subsections during search (mirrors DLC filter behaviour)
claude Feb 19, 2026
991d360
Merge pull request #19 from zurillion/claude/review-changes-mlsgga5of…
zurillion Feb 19, 2026
b473d88
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 19, 2026
526ea70
Fix checklist search hiding for empty subsections
zurillion Feb 20, 2026
cd87912
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 20, 2026
dad6605
Merge pull request #20 from zurillion/codex/fix-subsection-visibility…
zurillion Feb 20, 2026
ad8d07a
Update Google Client ID placeholder in sync.js
zurillion Feb 23, 2026
a2d8c20
Merge pull request #21 from RoundtableHold/main
zurillion Feb 23, 2026
2a1ccaa
Translate anchor display text in armor data_it while preserving URLs
zurillion Feb 24, 2026
c951501
Auto-regenerate HTML from YAML changes [skip ci]
github-actions[bot] Feb 24, 2026
24a6b1d
Merge pull request #23 from zurillion/codex/fix-subsection-visibility…
zurillion Feb 24, 2026
ce1a5f5
Improve Italian armor translations in data_it fields
claude Feb 24, 2026
ca86a16
Fix remaining Italian armor translation issues (second pass)
claude Feb 24, 2026
a8b3e51
Fix YAML syntax error: escape apostrophes in single-quoted string
claude Feb 24, 2026
574246f
Merge pull request #25 from zurillion/claude/review-armor-translation…
zurillion Feb 24, 2026
4305861
Add title_it Italian translations for all 185 armor set titles
claude Feb 24, 2026
201ded3
Add Italian translations (data_it and title_it) to weapons.yaml
claude Feb 25, 2026
dafc296
Add script used to insert Italian translations into weapons.yaml
claude Feb 25, 2026
457f49a
Merge pull request #26 from zurillion/claude/review-armor-translation…
zurillion Feb 25, 2026
75e96d4
Add language selector with EN/IT support and extensible translation f…
claude Feb 25, 2026
ee104b2
Merge pull request #27 from zurillion/claude/add-language-selector-aoRiu
zurillion Feb 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
*.png binary

docs/checklists/*.html linguist-generated=true
1 change: 0 additions & 1 deletion .gitatttributes

This file was deleted.

49 changes: 49 additions & 0 deletions .github/workflows/check-generated.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: Keep generated HTML in sync

on:
pull_request:
push:
branches:
- main

permissions:
contents: write

jobs:
sync:
name: Regenerate HTML if needed
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
# Check out the actual branch, not the merge commit,
# so we can push back to it if needed.
ref: ${{ github.head_ref || github.ref_name }}
token: ${{ secrets.GITHUB_TOKEN }}

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
cache: "pip"

- name: Install dependencies
run: pip install -r requirements.txt

- name: Run generator
run: python generate.py

- name: Commit regenerated HTML if out of sync
run: |
if ! git diff --exit-code docs/ > /dev/null 2>&1; then
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add docs/
git commit -m "Auto-regenerate HTML from YAML changes [skip ci]"
git push
echo "Regenerated and committed updated HTML."
else
echo "HTML is already in sync, nothing to commit."
fi
234 changes: 234 additions & 0 deletions add_title_it.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
#!/usr/bin/env python3
"""Add title_it fields to armor.yaml with official Italian translations."""

TRANSLATIONS = {
# Page title
"Armor": "Armatura",
# --- DLC: Shadow of the Erdtree ---
"Dane's Set": "Set di Dane",
"Gaius's Set": "Set di Gaio",
"Oathseeker Knight Set": "Set del Cavaliere Cercagiuramento",
"Leda's Armor": "Armatura di Leda",
"Verdigris Set": "Set Verderame",
"Iron Rivet Set": "Set a Rivetti di Ferro",
"Thiollier's Set": "Set di Thiollier",
"High Priest Set": "Set dell'Alto Sacerdote",
"Hornsent Set": "Set di Hornsent",
"Dancer's Set": "Set della Danzatrice",
"Night Set": "Set della Notte",
"Igon's Set": "Set di Igon",
"Ansbach's Set": "Set di Ansbach",
"Freyja's Set": "Set di Freyja",
"Solitude Set": "Set della Solitudine",
"Messmer Soldier Set": "Set del Soldato di Messmer",
"Black Knight Set": "Set del Cavaliere Nero",
"Rakshasa Set": "Set di Rakshasa",
"Fire Knight Set": "Set del Cavaliere del Fuoco",
"Death Mask Helm": "Elmo Maschera della Morte",
"Winged Serpent Helm": "Elmo del Serpente Alato",
"Salza's Hood": "Cappuccio di Salza",
"Highland Warrior Set": "Set del Guerriero degli Altopiani",
"Death Knight Set": "Set del Cavaliere della Morte",
"Ascetic's Set": "Set dell'Asceta",
"Messmer's Set": "Set di Messmer",
"Gravebird Set": "Set dell'Uccello Sepolcrale",
"Common Soldier Set": "Set del Soldato Comune",
"Horned Warrior Set": "Set del Guerriero Cornuto",
"Divine Beast Set": "Set della Bestia Divina",
"Divine Bird Set": "Set dell'Uccello Divino",
"Rellana's Set": "Set di Rellana",
"Young Lion's Set": "Set del Giovane Leone",
"Circlet of Light": "Cerchietto della Luce",
"Shadow Militiaman Set": "Set del Miliziano Ombra",
"Divine Beast Head": "Testa della Bestia Divina",
"St. Trina's Blossom": "Fiore di St. Trina",
"Crucible Hammer-Helm": "Elmo a Martello del Crogiolo",
"Greatjar": "Gran Vaso",
"Imp Head (Lion)": "Testa di Imp (Leone)",
# --- Base Game ---
"Traveler's Set (No Helmet)": "Set del Viandante (senza elmo)",
"Commoner's Set": "Set del Popolano",
"Aristocrat Set": "Set dell'Aristocratico",
"Old Aristocrat Set (No Gloves)": "Set del Vecchio Aristocratico (senza guanti)",
"Page Set (No Gloves)": "Set del Paggio (senza guanti)",
"High Page Set (No Gloves)": "Set dell'Alto Paggio (senza guanti)",
"Guardian Set": "Set del Guardiano",
"Festive Set (No Gloves or Legs)": "Set Festivo (senza guanti né gambali)",
"Blue Festive Set (No Gloves or Legs)": "Set Festivo Azzurro (senza guanti né gambali)",
"Guilty Set (No Gloves)": "Set del Colpevole (senza guanti)",
"Prisoner Set (No Gloves)": "Set del Prigioniero (senza guanti)",
"Blackguard's Iron Mask (Helmet Only)": "Maschera di Ferro di Blackguard (solo elmo)",
"Bloodsoaked Set (No Legs)": "Set Insanguinato (senza gambali)",
"Black Dumpling (Helmet Only)": "Gnocco Nero (solo elmo)",
"Mushroom Set": "Set del Fungo",
"Astrologer Set": "Set dell'Astrologo",
"Juvenile Scholar Set (No Gloves or Legs)": "Set del Giovane Studioso (senza guanti né gambali)",
"Raya Lucarian Sorcerer Set": "Set dello Stregone di Raya Lucaria",
"Lazuli Sorcerer Set": "Set dello Stregone Lazuli",
"Battlemage Set": "Set del Mago Guerriero",
"Errant Sorcerer Set": "Set dello Stregone Errante",
"Spellblade Set": "Set di Spellblade",
"Alberich's Set": "Set di Alberich",
"Preceptor's Set": "Set del Precettore",
"Mask of Confidence (Helmet Only)": "Maschera della Sicurezza (solo elmo)",
"Azur's Glintstone Set (No Legs)": "Set di Glintstone di Azur (senza gambali)",
"Lusat's Glintstone Set": "Set di Glintstone di Lusat",
"Queen of the Full Moon Set": "Set della Regina della Luna Piena",
"Snow Witch Set (No Gloves)": "Set della Strega della Neve (senza guanti)",
"Fia's Set (No Gloves or Legs)": "Set di Fia (senza guanti né gambali)",
"Deathbed Dress (Chest Only)": "Abito del Letto di Morte (solo busto)",
"Prophet Set (No Gloves)": "Set del Profeta (senza guanti)",
"Corhyn's Robe (Chest Only)": "Veste di Corhyn (solo busto)",
"Traveling Maiden Set": "Set della Donzella Viaggiatrice",
"Finger Maiden Set (No Gloves)": "Set della Donzella delle Dita (senza guanti)",
"Sage Set (No Gloves)": "Set del Saggio (senza guanti)",
"Greathood (Helmet Only)": "Gran Cappuccio (solo elmo)",
"Goldmask's Set": "Set di Goldmask",
"Perfumer Set": "Set del Profumiere",
"Perfumer Traveler's Set": "Set del Profumiere Viaggiatore",
"Depraved Perfumer Set": "Set del Profumiere Depravato",
"Upper-Class Robe (Chest Only)": "Veste dell'Alta Classe (solo busto)",
"Ruler's Set (No Gloves or Legs)": "Set del Sovrano (senza guanti né gambali)",
"Consort's Set (No Gloves)": "Set del Consorte (senza guanti)",
"House Marais Set (No Gloves or Legs)": "Set della Casa Marais (senza guanti né gambali)",
"Fur Set (No Gloves)": "Set di Pelliccia (senza guanti)",
"Shaman Set (No Gloves)": "Set dello Sciamano (senza guanti)",
"Godskin Apostle Set": "Set dell'Apostolo della Pelle Divina",
"Godskin Noble Set": "Set del Nobile della Pelle Divina",
"Fell Omen Cloak (Chest Only)": "Mantello del Presagio Oscuro (solo busto)",
"Sanguine Noble Set (No Gloves)": "Set del Nobile Sanguineo (senza guanti)",
"Lord of Blood's Robes (Chest Only)": "Vesti del Signore del Sangue (solo busto)",
"Scarab Masks": "Maschere Scarabeo",
"Imp Heads": "Teste di Imp",
"Nox Mirrorhelm (Helmet Only)": "Elmo Specchio Nox (solo elmo)",
"Iji's Mirrorhelm (Helmet Only)": "Elmo Specchio di Iji (solo elmo)",
"Silver Tear Mask (Helmet Only)": "Maschera della Lacrima d'Argento (solo elmo)",
"Envoy Crown (Helmet Only)": "Corona dell'Ambasciatore (solo elmo)",
"Octopus Head (Helmet Only)": "Testa di Polpo (solo elmo)",
"Jar (Helmet Only)": "Vaso (solo elmo)",
"Albinauric Set (No Gloves or Legs)": "Set degli Albinauric (senza guanti né gambali)",
"Leather Set": "Set di Cuoio",
"Blue Cloth Set": "Set di Panno Blu",
"Noble's Set": "Set del Nobile",
"War Surgeon Set": "Set del Chirurgo di Guerra",
"Nomadic Merchant's Set (No Gloves)": "Set del Mercante Nomade (senza guanti)",
"Bandit Set": "Set del Bandito",
"Confessor Set": "Set del Confessore",
"Omenkiller Set": "Set dell'Uccisore di Presagi",
"Raptor's Set": "Set del Rapace",
"Godrick Foot Soldier Set": "Set del Fante di Godrick",
"Raya Lucarian Foot Soldier Set": "Set del Fante di Raya Lucaria",
"Radahn Foot Soldier Set": "Set del Fante di Radahn",
"Leyndell Foot Soldier Set": "Set del Fante di Leyndell",
"Haligtree Foot Soldier Set": "Set del Fante dell'Albero Santo",
"Mausoleum Foot Soldier Set": "Set del Fante del Mausoleo",
"Highwayman Set": "Set del Brigante",
"Vulgar Militia Set": "Set della Milizia Volgare",
"Duelist Set (No Gloves)": "Set del Duelista (senza guanti)",
"Rotten Duelist Set (No Gloves)": "Set del Duelista Marcio (senza guanti)",
"Nox Monk Set": "Set del Monaco Nox",
"Nox Swordstress Set": "Set della Spadaccina Nox",
"Night Maiden Set": "Set della Fanciulla della Notte",
"Champion Set": "Set del Campione",
"Chain Set": "Set a Maglia",
"Iron Set": "Set di Ferro",
"Godrick Soldier Set": "Set del Soldato di Godrick",
"Raya Lucarian Soldier Set": "Set del Soldato di Raya Lucaria",
"Radahn Soldier Set": "Set del Soldato di Radahn",
"Leyndell Soldier Set": "Set del Soldato di Leyndell",
"Haligtree Set": "Set dell'Albero Santo",
"Mausoleum Soldier Set (No Helmet)": "Set del Soldato del Mausoleo (senza elmo)",
"Exile Set": "Set dell'Esiliato",
"Kaiden Set": "Set di Kaiden",
"Land of Reeds Set": "Set della Terra dei Giunchi",
"White Reed Set": "Set del Giunco Bianco",
"Ronin's Set": "Set del Ronin",
"Eccentric Set": "Set dell'Eccentrico",
"Marionette Soldier Set (No Gloves or Legs)": "Set del Soldato Marionetta (senza guanti né gambali)",
"Blue Silver Set": "Set Blu-Argento",
"Fire Monk Set": "Set del Monaco del Fuoco",
"Blackflame Set": "Set della Fiamma Nera",
"Zamor Set": "Set di Zamor",
"Black Knife Set": "Set del Coltello Nero",
"Malenia's Set": "Set di Malenia",
"Elden Lord Set": "Set di Elden Lord",
"Knight Set": "Set del Cavaliere",
"Vagabond Knight Set": "Set del Cavaliere Vagabondo",
"Greathelm (Helmet Only)": "Gran Elmo (solo elmo)",
"Carian Knight Set": "Set del Cavaliere di Caria",
"Godrick Knight Set": "Set del Cavaliere di Godrick",
"Cuckoo Knight Set": "Set del Cavaliere del Cuculo",
"Redmane Knight Set": "Set del Cavaliere Criniera Rossa",
"Gelmir Knight Set": "Set del Cavaliere di Gelmir",
"Leyndell Knight Set": "Set del Cavaliere di Leyndell",
"Haligtree Knight Set": "Set del Cavaliere dell'Albero Santo",
"Mausoleum Knight Set (No Helmet)": "Set del Cavaliere del Mausoleo (senza elmo)",
"Bloodhound Knight Set": "Set del Cavaliere Segugio",
"Cleanrot Set": "Set Cleanrot",
"Raging Wolf Set": "Set del Lupo Furioso",
"Hoslow's Set": "Set di Hoslow",
"Twinned Set": "Set Gemellato",
"Drake Knight Set": "Set del Cavaliere del Drago",
"Blaidd's Set": "Set di Blaidd",
"Briar Set": "Set dei Rovi",
"Fingerprint Set": "Set dell'Impronta",
"Royal Remains Set": "Set dei Resti Regali",
"All-Knowing Set": "Set dell'Onnisciente",
"Royal Knight Set": "Set del Cavaliere Reale",
"Maliketh's Set": "Set di Maliketh",
"Banished Knight Set": "Set del Cavaliere Bandito",
"Night's Cavalry Set": "Set della Cavalleria Notturna",
"Veteran's Set": "Set del Veterano",
"Scaled Set": "Set Squamato",
"Beast Champion Set": "Set del Campione Bestiale",
"Tree Sentinel Set": "Set della Sentinella dell'Albero",
"Malformed Dragon Set": "Set del Drago Deforme",
"Crucible Axe Set": "Set dell'Ascia del Crogiolo",
"Crucible Tree Set": "Set dell'Albero del Crogiolo",
"General Radahn's Set": "Set del Generale Radahn",
"Lionel's Set": "Set di Lionel",
"Bull-Goat Set": "Set del Capro-Toro",
"Omen Set": "Set del Presagio",
"Fire Prelate's Set": "Set del Prelato del Fuoco",
"Pumpkin Helm (Helmet Only)": "Elmo Zucca (solo elmo)",
}

import re

with open('data/checklists/armor.yaml', 'r', encoding='utf-8') as f:
lines = f.readlines()

new_lines = []
missing = []

for line in lines:
new_lines.append(line)
# Match top-level title (no leading spaces/dash)
m = re.match(r'^(title): (.+)\n', line)
if m:
val = m.group(2).strip()
it = TRANSLATIONS.get(val)
if it:
new_lines.append(f'title_it: {it}\n')
elif val != 'Armor': # Armor is already handled
missing.append(val)
continue
# Match section title lines: "- title: ..."
m = re.match(r'^(- title): (.+)\n', line)
if m:
val = m.group(2).strip()
it = TRANSLATIONS.get(val)
if it:
new_lines.append(f' title_it: {it}\n')
else:
missing.append(val)

with open('data/checklists/armor.yaml', 'w', encoding='utf-8') as f:
f.writelines(new_lines)

if missing:
print(f"WARNING: {len(missing)} untranslated titles:")
for m in missing:
print(f" - {m}")
else:
print(f"Done. All titles translated.")
Loading
Loading