Parse a format once into tokens, and have the fences read its ops

This commit is contained in:
2026-09-24 23:26:39 +02:00
committed by Lillem4n
parent aa972bbd95
commit 467cb6fb18
9 changed files with 186 additions and 208 deletions
+12 -16
View File
@@ -87,7 +87,7 @@ func linkRefs(root map[string]node) error {
// category it sits in.
// docs/decisions.md#a-category-never-references-itself-and-a-records-fences-run-at-load
func linkTemplateRefs(folder []string, path, category string, t *template, root map[string]node) error {
names := refTokens(t.format)
names := refTokens(t.tokens)
if len(names) == 0 {
return nil
}
@@ -130,7 +130,7 @@ type columnRead struct {
}
func columnReadOf(t *template) *columnRead {
name, lone := loneRef(t.format)
name, lone := loneRef(t.tokens)
if !lone || t.repeat != 1 {
return nil
}
@@ -143,17 +143,11 @@ func columnReadOf(t *template) *columnRead {
}
// loneRef is the reference a format of one reference token and nothing else reads.
func loneRef(format string) (string, bool) {
units, body := 0, ""
err := eachToken(format, func(t ftoken) error {
units++
body = t.body
return nil
})
if err != nil || units != 1 || !isRef(body) || strings.ContainsAny(body, "|(") {
func loneRef(toks []formatToken) (string, bool) {
if len(toks) != 1 || toks[0].kind != 'f' || len(toks[0].names) != 1 || !isRef(toks[0].names[0]) {
return "", false
}
return body, true
return toks[0].names[0], true
}
// eachTemplate calls fn once per template, with the folder its category sits in
@@ -220,13 +214,15 @@ func resolveCategory(root map[string]node, segments []string) (head []string, ta
}
// refTokens returns the reference names a format reads, as tokens or as operands.
func refTokens(format string) []string {
func refTokens(toks []formatToken) []string {
var refs []string
seen := map[string]bool{}
for _, name := range append(fieldTokens(format), operandTokens(format)...) {
if isRef(name) && !seen[name] {
seen[name] = true
refs = append(refs, name)
for _, tok := range toks {
for _, name := range tok.names {
if isRef(name) && !seen[name] {
seen[name] = true
refs = append(refs, name)
}
}
}
return refs