More racial template entries

This commit is contained in:
2026-05-24 17:21:30 +02:00
parent 6707edfccf
commit cc9996cd69
2 changed files with 70 additions and 0 deletions
+55
View File
@@ -1193,6 +1193,61 @@ func TestWikiTemplateCanRenderRacialFactsAndFeatListInHTML(t *testing.T) {
} }
} }
func TestWikiTemplateRacialOptionalFactsRenderOnlyWhenPresent(t *testing.T) {
ctx := &wikiContext{}
template := `{{#if present(ECL)}}ECL={{ECL}}{{/if}}
{{#if present(PreferredAlignments)}}Preferred={{PreferredAlignments}}{{/if}}
{{#if present(StartLanguages)}}Start={{StartLanguages}}{{/if}}
{{#if present(BonusLanguages)}}Bonus={{BonusLanguages}}{{/if}}`
page := wikiTemplatePage{
PageID: "racialtypes:human",
Category: "racialtypes",
Key: "racialtypes:human",
Title: "Human",
Row: map[string]any{
"ECL": 0,
"PreferredAlignments": "0x00",
"StartLanguages": "regional",
"BonusLanguages": "all",
},
}
got, err := ctx.renderWikiTemplateString("racialtypes.html", template, page)
if err != nil {
t.Fatalf("render template: %v", err)
}
for _, want := range []string{
"ECL=0",
"Preferred=0x00",
"Start=regional",
"Bonus=all",
} {
if !strings.Contains(got, want) {
t.Fatalf("expected rendered output to contain %q:\n%s", want, got)
}
}
page.Row = map[string]any{
"ECL": nil,
"PreferredAlignments": "",
"StartLanguages": "****",
}
got, err = ctx.renderWikiTemplateString("racialtypes.html", template, page)
if err != nil {
t.Fatalf("render template with absent values: %v", err)
}
for _, unwanted := range []string{
"ECL=",
"Preferred=",
"Start=",
"Bonus=",
} {
if strings.Contains(got, unwanted) {
t.Fatalf("expected rendered output to omit %q for absent values:\n%s", unwanted, got)
}
}
}
func TestWikiTemplateDescriptionFiltersExtractParagraphsAndSections(t *testing.T) { func TestWikiTemplateDescriptionFiltersExtractParagraphsAndSections(t *testing.T) {
ctx := &wikiContext{} ctx := &wikiContext{}
page := wikiTemplatePage{ page := wikiTemplatePage{
+15
View File
@@ -855,9 +855,14 @@ func (p *wikiExprParser) parsePrimary() (any, error) {
p.pos++ p.pos++
args := []any{} args := []any{}
if p.peek().kind != wikiExprRParen { if p.peek().kind != wikiExprRParen {
previousAllowMissing := p.allowMissingFields
if wikiExprHelperAllowsMissingArgs(token.text) {
p.allowMissingFields = true
}
for { for {
arg, err := p.parseComparison() arg, err := p.parseComparison()
if err != nil { if err != nil {
p.allowMissingFields = previousAllowMissing
return nil, err return nil, err
} }
args = append(args, arg) args = append(args, arg)
@@ -865,6 +870,7 @@ func (p *wikiExprParser) parsePrimary() (any, error) {
break break
} }
} }
p.allowMissingFields = previousAllowMissing
} }
if _, ok := p.take(wikiExprRParen); !ok { if _, ok := p.take(wikiExprRParen); !ok {
return nil, fmt.Errorf("missing closing parenthesis for %s", token.text) return nil, fmt.Errorf("missing closing parenthesis for %s", token.text)
@@ -887,6 +893,15 @@ func (p *wikiExprParser) parsePrimary() (any, error) {
} }
} }
func wikiExprHelperAllowsMissingArgs(name string) bool {
switch name {
case "present", "all_present", "any_present":
return true
default:
return false
}
}
func (p *wikiExprParser) resolveField(name string) (any, error) { func (p *wikiExprParser) resolveField(name string) (any, error) {
name = strings.TrimPrefix(name, "row.") name = strings.TrimPrefix(name, "row.")
if name == "HasSpellProgression" { if name == "HasSpellProgression" {