Manually-authored class notes

This commit is contained in:
2026-05-27 08:45:45 +02:00
parent 89508b3c03
commit 981288f09e
3 changed files with 51 additions and 3 deletions
+2
View File
@@ -26,6 +26,8 @@ func normalizeWikiMetadataKey(key string) string {
return "canonical" return "canonical"
case "status", "wikistatus": case "status", "wikistatus":
return "status" return "status"
case "progressionnotes", "progression_notes", "classprogressionnotes", "class_progression_notes":
return "progression_notes"
default: default:
return "" return ""
} }
+9 -2
View File
@@ -1506,7 +1506,7 @@ tables:
value: "{{range(HPMin, HPMax)}}" value: "{{range(HPMin, HPMax)}}"
- key: notes - key: notes
label: Notes label: Notes
value: "{{if(Level == 4 && BonusFeat != \"0\", link(\"feat:weapon_specialization\", \"Weapon Specialization\") + \" first available.\", Notes)}}" value: "{{if(Level == 4 && BonusFeat != \"0\", link(\"feat:weapon_specialization\", \"Weapon Specialization\") + \" first available.\" + if(present(Notes), \" \" + Notes, \"\"), Notes)}}"
empty: "" empty: ""
allow_wiki_markup: true allow_wiki_markup: true
`) `)
@@ -1521,6 +1521,13 @@ tables:
"FeatsTable": map[string]any{"table": "classes/feats:fighter"}, "FeatsTable": map[string]any{"table": "classes/feats:fighter"},
"HitDie": 10, "HitDie": 10,
"SavingThrowTable": map[string]any{"table": "classes/saves:fortitude"}, "SavingThrowTable": map[string]any{"table": "classes/saves:fortitude"},
"meta": map[string]any{
"wiki": map[string]any{
"progression_notes": map[string]any{
"4": "Manual level note.",
},
},
},
}, },
} }
@@ -1538,7 +1545,7 @@ tables:
`<td>2</td>`, `<td>2</td>`,
`<td>[[Feats/Literate|Literate]], [[Feats/Simple_Weapon_Proficiency|Simple Weapon Proficiency]]</td>`, `<td>[[Feats/Literate|Literate]], [[Feats/Simple_Weapon_Proficiency|Simple Weapon Proficiency]]</td>`,
`<td>1-10</td>`, `<td>1-10</td>`,
`<td>[[Feats/Weapon_Specialization|Weapon Specialization]] first available.</td>`, `<td>[[Feats/Weapon_Specialization|Weapon Specialization]] first available. Manual level note.</td>`,
} { } {
if !strings.Contains(got, expected) { if !strings.Contains(got, expected) {
t.Fatalf("expected %q in rendered table:\n%s", expected, got) t.Fatalf("expected %q in rendered table:\n%s", expected, got)
+39
View File
@@ -441,7 +441,14 @@ func (ctx *wikiContext) classProgressionRows(levels string, projections map[stri
if hitDie > 0 { if hitDie > 0 {
row["HPMax"] = level * hitDie row["HPMax"] = level * hitDie
} }
if !presentWikiValue(fieldValue(row, "Notes")) {
if note := ctx.classProgressionNote(classRow, level); note != "" {
row["Notes"] = note
}
}
if _, ok := row["Notes"]; !ok {
row["Notes"] = "" row["Notes"] = ""
}
row["HasSpellProgression"] = hasSpellProgression(classRow) row["HasSpellProgression"] = hasSpellProgression(classRow)
row["HasSpellsPerDay"] = hasPerDay row["HasSpellsPerDay"] = hasPerDay
row["HasSpellsKnown"] = hasKnown row["HasSpellsKnown"] = hasKnown
@@ -452,6 +459,38 @@ func (ctx *wikiContext) classProgressionRows(levels string, projections map[stri
return out, nil return out, nil
} }
func (ctx *wikiContext) classProgressionNote(classRow map[string]any, level int) string {
meta, err := parseExistingMetadata(classRow)
if err != nil || meta == nil {
return ""
}
wiki, _ := meta["wiki"].(map[string]any)
if wiki == nil {
return ""
}
raw := wiki["progression_notes"]
if raw == nil {
return ""
}
switch typed := raw.(type) {
case map[string]any:
for _, key := range []string{strconv.Itoa(level), formatLevelNoteKey(level)} {
if value, ok := typed[key]; ok {
return strings.TrimSpace(ctx.resolveTextValue(value, nil))
}
}
case []any:
if level > 0 && level <= len(typed) {
return strings.TrimSpace(ctx.resolveTextValue(typed[level-1], nil))
}
}
return ""
}
func formatLevelNoteKey(level int) string {
return "level_" + strconv.Itoa(level)
}
func classSpellProgressionByLevel(table *wikiTable) map[int]map[int]string { func classSpellProgressionByLevel(table *wikiTable) map[int]map[int]string {
out := map[int]map[int]string{} out := map[int]map[int]string{}
if table == nil { if table == nil {