Class skillls/list splitting
This commit is contained in:
@@ -13,9 +13,13 @@ type wikiDataProvidersDocument struct {
|
||||
}
|
||||
|
||||
type wikiDataProviderDefinition struct {
|
||||
Source string `json:"source" yaml:"source"`
|
||||
Levels string `json:"levels" yaml:"levels"`
|
||||
ClassFeats wikiDataProviderClassFeatConfig `json:"class_feats" yaml:"class_feats"`
|
||||
Source string `json:"source" yaml:"source"`
|
||||
Levels string `json:"levels" yaml:"levels"`
|
||||
ClassFeats wikiDataProviderClassFeatConfig `json:"class_feats" yaml:"class_feats"`
|
||||
Provider string `json:"provider" yaml:"provider"`
|
||||
Columns int `json:"columns" yaml:"columns"`
|
||||
ItemsPerColumn int `json:"items_per_column" yaml:"items_per_column"`
|
||||
ForceColumns bool `json:"force_columns" yaml:"force_columns"`
|
||||
}
|
||||
|
||||
type wikiDataProviderClassFeatConfig struct {
|
||||
@@ -45,7 +49,8 @@ func loadWikiDataProviders(path string) (map[string]wikiDataProviderDefinition,
|
||||
if strings.TrimSpace(def.Source) == "" {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s missing source", path, name)
|
||||
}
|
||||
switch strings.TrimSpace(def.Source) {
|
||||
source := strings.TrimSpace(def.Source)
|
||||
switch source {
|
||||
case "class_progression":
|
||||
for field, projection := range def.ClassFeats.Fields {
|
||||
if strings.TrimSpace(field) == "" {
|
||||
@@ -55,6 +60,22 @@ func loadWikiDataProviders(path string) (map[string]wikiDataProviderDefinition,
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s class feat projection %s missing when", path, name, field)
|
||||
}
|
||||
}
|
||||
case "columns":
|
||||
if len(def.ClassFeats.Fields) > 0 {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s class feat projections require source class_progression", path, name)
|
||||
}
|
||||
if strings.TrimSpace(def.Provider) == "" {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s columns provider missing provider", path, name)
|
||||
}
|
||||
if strings.TrimSpace(def.Provider) == name {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s columns provider must not reference itself", path, name)
|
||||
}
|
||||
if def.Columns <= 0 {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s columns must be a positive integer", path, name)
|
||||
}
|
||||
if def.ItemsPerColumn <= 0 {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s items_per_column must be a positive integer", path, name)
|
||||
}
|
||||
case "class_feats", "class_skills", "class_summary", "race_feats", "race_name_forms":
|
||||
if len(def.ClassFeats.Fields) > 0 {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s class feat projections require source class_progression", path, name)
|
||||
@@ -63,6 +84,14 @@ func loadWikiDataProviders(path string) (map[string]wikiDataProviderDefinition,
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s has unknown source %q", path, name, def.Source)
|
||||
}
|
||||
}
|
||||
for name, def := range doc.Providers {
|
||||
if strings.TrimSpace(def.Source) != "columns" {
|
||||
continue
|
||||
}
|
||||
if _, ok := doc.Providers[strings.TrimSpace(def.Provider)]; !ok {
|
||||
return nil, fmt.Errorf("wiki data providers %s: provider %s columns provider references missing provider %q", path, name, def.Provider)
|
||||
}
|
||||
}
|
||||
if doc.Providers == nil {
|
||||
return map[string]wikiDataProviderDefinition{}, nil
|
||||
}
|
||||
@@ -75,6 +104,12 @@ func (ctx *wikiContext) wikiDataProviderRows(name string, page wikiTemplatePage)
|
||||
return nil, fmt.Errorf("missing wiki data provider %q in %s", name, ctx.wikiDataPath)
|
||||
}
|
||||
switch strings.TrimSpace(def.Source) {
|
||||
case "columns":
|
||||
sourceRows, err := ctx.wikiDataProviderRows(strings.TrimSpace(def.Provider), page)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return wikiColumnProviderRows(sourceRows, def.Columns, def.ItemsPerColumn, def.ForceColumns), nil
|
||||
case "class_progression":
|
||||
if page.Category != "classes" {
|
||||
return nil, nil
|
||||
@@ -110,6 +145,44 @@ func (ctx *wikiContext) wikiDataProviderRows(name string, page wikiTemplatePage)
|
||||
}
|
||||
}
|
||||
|
||||
func wikiColumnProviderRows(sourceRows []map[string]any, configuredColumns, itemsPerColumn int, forceColumns bool) []map[string]any {
|
||||
if configuredColumns <= 0 || itemsPerColumn <= 0 {
|
||||
return nil
|
||||
}
|
||||
needed := 0
|
||||
if len(sourceRows) > 0 {
|
||||
needed = (len(sourceRows) + itemsPerColumn - 1) / itemsPerColumn
|
||||
}
|
||||
total := needed
|
||||
if forceColumns && configuredColumns > total {
|
||||
total = configuredColumns
|
||||
}
|
||||
if total == 0 {
|
||||
return nil
|
||||
}
|
||||
rows := make([]map[string]any, 0, total)
|
||||
for i := 0; i < total; i++ {
|
||||
start := i * itemsPerColumn
|
||||
end := start + itemsPerColumn
|
||||
if start > len(sourceRows) {
|
||||
start = len(sourceRows)
|
||||
}
|
||||
if end > len(sourceRows) {
|
||||
end = len(sourceRows)
|
||||
}
|
||||
items := make([]map[string]any, 0, end-start)
|
||||
for _, source := range sourceRows[start:end] {
|
||||
items = append(items, cloneRowMap(source))
|
||||
}
|
||||
rows = append(rows, map[string]any{
|
||||
"Index": i + 1,
|
||||
"Count": len(items),
|
||||
"Items": items,
|
||||
})
|
||||
}
|
||||
return rows
|
||||
}
|
||||
|
||||
func (ctx *wikiContext) classSkillRows(classRow map[string]any) []map[string]any {
|
||||
table := ctx.tableForValue(fieldValue(classRow, "SkillsTable"), ctx.classSkillTables)
|
||||
if table == nil {
|
||||
|
||||
Reference in New Issue
Block a user