From cc9996cd693054eb45e0f2b81285923bae64ef8c Mon Sep 17 00:00:00 2001 From: vickydotbat Date: Sun, 24 May 2026 17:21:30 +0200 Subject: [PATCH] More racial template entries --- internal/topdata/wiki_native_test.go | 55 ++++++++++++++++++++++++++++ internal/topdata/wiki_tables.go | 15 ++++++++ 2 files changed, 70 insertions(+) diff --git a/internal/topdata/wiki_native_test.go b/internal/topdata/wiki_native_test.go index 21905a7..6335580 100644 --- a/internal/topdata/wiki_native_test.go +++ b/internal/topdata/wiki_native_test.go @@ -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) { ctx := &wikiContext{} page := wikiTemplatePage{ diff --git a/internal/topdata/wiki_tables.go b/internal/topdata/wiki_tables.go index 69f09d4..182d621 100644 --- a/internal/topdata/wiki_tables.go +++ b/internal/topdata/wiki_tables.go @@ -855,9 +855,14 @@ func (p *wikiExprParser) parsePrimary() (any, error) { p.pos++ args := []any{} if p.peek().kind != wikiExprRParen { + previousAllowMissing := p.allowMissingFields + if wikiExprHelperAllowsMissingArgs(token.text) { + p.allowMissingFields = true + } for { arg, err := p.parseComparison() if err != nil { + p.allowMissingFields = previousAllowMissing return nil, err } args = append(args, arg) @@ -865,6 +870,7 @@ func (p *wikiExprParser) parsePrimary() (any, error) { break } } + p.allowMissingFields = previousAllowMissing } if _, ok := p.take(wikiExprRParen); !ok { 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) { name = strings.TrimPrefix(name, "row.") if name == "HasSpellProgression" {