diff options
| author | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-09-14 23:34:51 +0200 |
|---|---|---|
| committer | Lukasz Kasprzak <lukas@labunix.xyz> | 2026-09-14 23:34:51 +0200 |
| commit | 3990586a85e91923c0a3ae1a1f0f61420db555ac (patch) | |
| tree | 041692e7961cb66333b2c7b47d32a25487c6522d /internal/cond/eval.go | |
| parent | 01b0cfe2055e23cf03870d9a9f60648037b4005e (diff) | |
| download | krino-3990586a85e91923c0a3ae1a1f0f61420db555ac.tar.gz krino-3990586a85e91923c0a3ae1a1f0f61420db555ac.zip | |
captures keep the name's diacritics
Diffstat (limited to 'internal/cond/eval.go')
| -rw-r--r-- | internal/cond/eval.go | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/internal/cond/eval.go b/internal/cond/eval.go index b0ee828..f241504 100644 --- a/internal/cond/eval.go +++ b/internal/cond/eval.go @@ -164,17 +164,33 @@ func (c *Cond) evalLeaf(n *node, f Facts) (ok bool, reason, warn string, caps [] subj = f.Rel() word = "path" } - subj = norm.Name(subj, c.opt.Fold) + if n.kind == kPath { + subj = norm.Name(subj, c.opt.Fold) + for _, p := range n.patterns { + if p.re.MatchString(subj) { + return true, word + ` "` + p.src + `"`, "", nil + } + } + return false, "", "", nil + } + // A name test matches the folded name, but its captures are read + // back from the original, so {1} keeps the name's diacritics. + folded := norm.Folded{Text: subj} + if c.opt.Fold { + folded = norm.FoldMapped(subj) + } for _, p := range n.patterns { - m := p.re.FindStringSubmatch(subj) - if m == nil { + loc := p.re.FindStringSubmatchIndex(folded.Text) + if loc == nil { continue } - reason = word + ` "` + p.src + `"` - if n.kind == kName { - return true, reason, "", m + caps := make([]string, len(loc)/2) + for g := range caps { + if loc[2*g] >= 0 { + caps[g] = folded.Source(loc[2*g], loc[2*g+1]) + } } - return true, reason, "", nil + return true, word + ` "` + p.src + `"`, "", caps } return false, "", "", nil |
