Class skillls/list splitting
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user