From 7d50f43d0bfed469d62cb02577f394a1d3b21600 Mon Sep 17 00:00:00 2001 From: Lilleman auf Larv Date: Fri, 18 Sep 2026 18:26:41 +0200 Subject: [PATCH] Scope the layout quote outside selectors and prove parent-keyed names in their own function --- table.go | 30 ++++++++++++++++++++---------- template.go | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/table.go b/table.go index 1800d84..37f6ae1 100644 --- a/table.go +++ b/table.go @@ -228,21 +228,31 @@ func (t *table) bindOptions(o tableOptionValues) error { if err := t.indexKeys(); err != nil { return err } + if err := t.proveNamesInsideParent(); err != nil { + return err + } return t.sumWeights() } -// indexKeys proves every key names one row, and keeps the index a link is proved by; -// without a key, a name names one row inside its parent. +// proveNamesInsideParent proves a name without a key names one row inside its parent. +func (t *table) proveNamesInsideParent() error { + if t.key >= 0 || t.name < 0 { + return nil + } + inside := make(map[string]int, t.rows()) + for r := 0; r < t.rows(); r++ { + k := t.cell(r, t.parent) + "\t" + t.cell(r, t.name) + if first, dup := inside[k]; dup { + return fmt.Errorf("%s line %d: name %q repeats line %d inside %s %q; a name selects one row inside its parent", t.file, r+2, t.cell(r, t.name), first+2, t.columns[t.parent], t.cell(r, t.parent)) + } + inside[k] = r + } + return nil +} + +// indexKeys proves every key names one row, and keeps the index a link is proved by. func (t *table) indexKeys() error { if t.key < 0 { - inside := make(map[string]int, t.rows()) - for r := 0; r < t.rows() && t.name >= 0; r++ { - k := t.cell(r, t.parent) + "\t" + t.cell(r, t.name) - if first, dup := inside[k]; dup { - return fmt.Errorf("%s line %d: name %q repeats line %d inside %s %q; a name selects one row inside its parent", t.file, r+2, t.cell(r, t.name), first+2, t.columns[t.parent], t.cell(r, t.parent)) - } - inside[k] = r - } return nil } t.byKey = make(map[string]int, t.rows()) diff --git a/template.go b/template.go index 321db26..d2ce7d2 100644 --- a/template.go +++ b/template.go @@ -98,7 +98,7 @@ func splitArgs(s string) []string { depth, quoted, start := 0, false, 0 for i := 0; i < len(s); i++ { switch c := s[i]; { - case c == '\'': + case c == '\'' && depth == 0: quoted = !quoted case quoted: case c == '[':