- commit
- fba67d140fb58e82e4f9f492e4d049b80955d81b
- parent
- 082e5a38bff61e648d7d956fb5f3e97f9ac8d8c2
- author
- Dami <dami.etoile@gmail.com>
| M | internal/ | 46 | +++++++++++++++++------------- |
| M | internal/ | 40 | +++++++++++++++----------- |
| M | internal/ | 33 | +++++++++++++-------- |
@@ -12,26 +12,7 @@ const DocsMarker = "<!-- Generated from internal/config/registry.go by `go test
1212 // Reference is the option reference in Markdown, one section per group.1313 func Reference() string {1414 var b strings.Builder15- b.WriteString("\n| Option | Default | Environment, flag |\n|---|---|---|\n")16- for _, g := range Groups {17- for _, o := range Options {18- if o.Group != g {19- continue20- }21- def := ""22- if o.Default != "" {23- def = "`" + o.Default + "`"24- }25- var via []string26- for _, e := range o.Env {27- via = append(via, "`"+e+"`")28- }29- if o.Flag != "" {30- via = append(via, "`"+o.Flag+"`")31- }32- fmt.Fprintf(&b, "| [`%s`](#%s) | %s | %s |\n", o.Name, o.Name, def, strings.Join(via, ", "))33- }34- }15+ overview(&b)3516 for _, g := range Groups {3617 fmt.Fprintf(&b, "\n### %s\n", g)3718 for _, o := range Options {@@ -71,3 +52,28 @@ func (o *Option) typeDoc() string {
7152 }7253 return o.Kind.String()7354 }55+56+// overview is a table of every option, its default and where else it's57+// set, linking to its section.58+func overview(b *strings.Builder) {59+ b.WriteString("\n| Option | Default | Environment, flag |\n|---|---|---|\n")60+ for _, g := range Groups {61+ for _, o := range Options {62+ if o.Group != g {63+ continue64+ }65+ def := ""66+ if o.Default != "" {67+ def = "`" + o.Default + "`"68+ }69+ var via []string70+ for _, e := range o.Env {71+ via = append(via, "`"+e+"`")72+ }73+ if o.Flag != "" {74+ via = append(via, "`"+o.Flag+"`")75+ }76+ fmt.Fprintf(b, "| [`%s`](#%s) | %s | %s |\n", o.Name, o.Name, def, strings.Join(via, ", "))77+ }78+ }79+}@@ -40,26 +40,32 @@ func TestDocsNameOptions(t *testing.T) {
4040 if err != nil {4141 t.Fatal(err)4242 }43- name := strings.TrimPrefix(p, "../../")44- check := func(key string) {45- if _, ok := Lookup(key); !ok && key != "key" {46- t.Errorf("%s names setting %q, which isn't an option", name, key)47- }48- }49- for _, m := range inlineSetting.FindAllStringSubmatch(string(data), -1) {50- check(m[1])43+ checkDocOptions(t, strings.TrimPrefix(p, "../../"), string(data), env)44+ }45+}46+47+// checkDocOptions reports settings and variables doc names that aren't48+// options.49+func checkDocOptions(t *testing.T, name, doc string, env []string) {50+ t.Helper()51+ check := func(key string) {52+ if _, ok := Lookup(key); !ok && key != "key" {53+ t.Errorf("%s names setting %q, which isn't an option", name, key)5154 }52- for _, block := range configBlocks(string(data)) {53- for _, l := range block {54- if m := fileSetting.FindStringSubmatch(strings.TrimSpace(l)); m != nil {55- check(m[1])56- }55+ }56+ for _, m := range inlineSetting.FindAllStringSubmatch(doc, -1) {57+ check(m[1])58+ }59+ for _, block := range configBlocks(doc) {60+ for _, l := range block {61+ if m := fileSetting.FindStringSubmatch(l); m != nil {62+ check(m[1])5763 }5864 }59- for _, v := range envVar.FindAllString(string(data), -1) {60- if !slices.Contains(env, v) && !slices.Contains(notOptions, v) {61- t.Errorf("%s names %s, which no option reads", name, v)62- }65+ }66+ for _, v := range envVar.FindAllString(doc, -1) {67+ if !slices.Contains(env, v) && !slices.Contains(notOptions, v) {68+ t.Errorf("%s names %s, which no option reads", name, v)6369 }6470 }6571 }@@ -98,19 +98,7 @@ func resolveMenuPath(title, rest string) string {
9898 }9999 }100100 for {101- var found *menuItem102- for i, it := range items {103- if it.sep {104- continue105- }106- label := it.label()107- short, _, _ := strings.Cut(label, " (")108- for _, l := range []string{label, short} {109- if labelPrefix(rest, l) && (found == nil || len(l) > len(found.label())) {110- found = &items[i]111- }112- }113- }101+ found := menuItemAt(items, rest)114102 if found == nil {115103 return "no such item in the " + title + " menu"116104 }@@ -129,6 +117,25 @@ func resolveMenuPath(title, rest string) string {
129117 }130118 }131119 120+// menuItemAt is the item of items whose label, or its part before a121+// parenthesis, text starts with; the longest when several do.122+func menuItemAt(items []menuItem, text string) *menuItem {123+ var found *menuItem124+ for i, it := range items {125+ if it.sep {126+ continue127+ }128+ label := it.label()129+ short, _, _ := strings.Cut(label, " (")130+ for _, l := range []string{label, short} {131+ if labelPrefix(text, l) && (found == nil || len(l) > len(found.label())) {132+ found = &items[i]133+ }134+ }135+ }136+ return found137+}138+132139 // labelPrefix reports whether text starts with label as whole words.133140 func labelPrefix(text, label string) bool {134141 if !strings.HasPrefix(strings.ToLower(text), strings.ToLower(label)) {