Class skillls/list splitting

This commit is contained in:
2026-05-23 20:10:01 +02:00
parent 22d7fa5e6f
commit 3f36ed529a
4 changed files with 335 additions and 7 deletions
+53 -3
View File
@@ -147,13 +147,14 @@ func (ctx *wikiContext) renderWikiTemplateRange(source string, offset int, stopB
return "", offset, false, err
}
if state.active {
rows, err := ctx.wikiDataProviderRows(providerName, state.page)
items, err := ctx.resolveWikiTemplateEachItems(providerName, state)
if err != nil {
return "", offset, false, fmt.Errorf("render wiki template %s for %s: %w", state.path, state.page.PageID, err)
}
for _, row := range rows {
for _, item := range items {
child := *state
child.row = row
child.row = item.row
child.dot = item.dot
rendered, childOffset, closed, err := ctx.renderWikiTemplateRange(body, 0, "", &child)
if err != nil {
return "", offset, false, err
@@ -239,6 +240,55 @@ func (ctx *wikiContext) renderWikiTemplateRange(source string, offset int, stopB
}
}
type wikiTemplateEachItem struct {
row map[string]any
dot any
}
func (ctx *wikiContext) resolveWikiTemplateEachItems(name string, state *wikiTemplateRenderState) ([]wikiTemplateEachItem, error) {
if value, ok := ctx.resolveWikiTemplateScopedValue(name, state); ok {
return wikiTemplateEachItemsFromValue(value), nil
}
rows, err := ctx.wikiDataProviderRows(name, state.page)
if err != nil {
return nil, err
}
items := make([]wikiTemplateEachItem, 0, len(rows))
for _, row := range rows {
items = append(items, wikiTemplateEachItem{row: row, dot: row})
}
return items, nil
}
func wikiTemplateEachItemsFromValue(value any) []wikiTemplateEachItem {
switch typed := value.(type) {
case []map[string]any:
items := make([]wikiTemplateEachItem, 0, len(typed))
for _, row := range typed {
items = append(items, wikiTemplateEachItem{row: row, dot: row})
}
return items
case []any:
items := make([]wikiTemplateEachItem, 0, len(typed))
for _, value := range typed {
if row, ok := value.(map[string]any); ok {
items = append(items, wikiTemplateEachItem{row: row, dot: row})
continue
}
items = append(items, wikiTemplateEachItem{dot: value})
}
return items
case []string:
items := make([]wikiTemplateEachItem, 0, len(typed))
for _, value := range typed {
items = append(items, wikiTemplateEachItem{dot: value})
}
return items
default:
return nil
}
}
func (ctx *wikiContext) renderWikiTemplateTokenWithState(token string, state *wikiTemplateRenderState) (string, string, error) {
if strings.HasPrefix(token, "format:") || strings.HasPrefix(token, "table:") || strings.HasPrefix(token, "field:") || strings.HasPrefix(token, "section:") {
rendered, sectionID, err := ctx.renderWikiTemplateToken(state.path, token, state.page)