mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-17 20:41:03 +01:00
implement multiple regex support and icase and negate flags
This commit is contained in:
@@ -52,6 +52,12 @@ type Transposer struct {
|
||||
Replace string
|
||||
}
|
||||
|
||||
type Pattern struct {
|
||||
Pattern string
|
||||
PatternRe *regexp.Regexp
|
||||
Negate bool
|
||||
}
|
||||
|
||||
// internal config
|
||||
type Config struct {
|
||||
Debug bool
|
||||
@@ -62,8 +68,7 @@ type Config struct {
|
||||
Separator string
|
||||
OutputMode int
|
||||
InvertMatch bool
|
||||
Pattern string
|
||||
PatternR *regexp.Regexp
|
||||
Patterns []*Pattern
|
||||
UseFuzzySearch bool
|
||||
UseHighlight bool
|
||||
|
||||
@@ -333,15 +338,39 @@ func (conf *Config) ApplyDefaults() {
|
||||
}
|
||||
}
|
||||
|
||||
func (conf *Config) PreparePattern(pattern string) error {
|
||||
PatternR, err := regexp.Compile(pattern)
|
||||
func (conf *Config) PreparePattern(patterns []*Pattern) error {
|
||||
// regex checks if a pattern looks like /$pattern/[i!]
|
||||
flagre := regexp.MustCompile(`^/(.*)/([i!]+)$`)
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("regexp pattern %s is invalid: %w", conf.Pattern, err)
|
||||
for _, pattern := range patterns {
|
||||
matches := flagre.FindAllStringSubmatch(pattern.Pattern, -1)
|
||||
|
||||
if matches != nil {
|
||||
// we have a regex with flags
|
||||
for _, match := range matches {
|
||||
pattern.Pattern = match[1] // the inner part is our actual pattern
|
||||
flags := match[2] // the flags
|
||||
|
||||
for _, flag := range flags {
|
||||
switch flag {
|
||||
case 'i':
|
||||
pattern.Pattern = `(?i)` + pattern.Pattern
|
||||
case '!':
|
||||
pattern.Negate = true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PatternRe, err := regexp.Compile(pattern.Pattern)
|
||||
if err != nil {
|
||||
return fmt.Errorf("regexp pattern %s is invalid: %w", pattern.Pattern, err)
|
||||
}
|
||||
|
||||
pattern.PatternRe = PatternRe
|
||||
}
|
||||
|
||||
conf.PatternR = PatternR
|
||||
conf.Pattern = pattern
|
||||
conf.Patterns = patterns
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -79,20 +79,55 @@ func TestPrepareSortFlags(t *testing.T) {
|
||||
|
||||
func TestPreparePattern(t *testing.T) {
|
||||
var tests = []struct {
|
||||
pattern string
|
||||
wanterr bool
|
||||
patterns []*Pattern
|
||||
name string
|
||||
wanterr bool
|
||||
wanticase bool
|
||||
wantneg bool
|
||||
}{
|
||||
{"[A-Z]+", false},
|
||||
{"[a-z", true},
|
||||
{
|
||||
[]*Pattern{{Pattern: "[A-Z]+"}},
|
||||
"simple",
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
},
|
||||
{
|
||||
[]*Pattern{{Pattern: "[a-z"}},
|
||||
"regfail",
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
},
|
||||
{
|
||||
[]*Pattern{{Pattern: "/[A-Z]+/i"}},
|
||||
"icase",
|
||||
false,
|
||||
true,
|
||||
false,
|
||||
},
|
||||
{
|
||||
[]*Pattern{{Pattern: "/[A-Z]+/!"}},
|
||||
"negate",
|
||||
false,
|
||||
false,
|
||||
true,
|
||||
},
|
||||
{
|
||||
[]*Pattern{{Pattern: "/[A-Z]+/!i"}},
|
||||
"negicase",
|
||||
false,
|
||||
true,
|
||||
true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, testdata := range tests {
|
||||
testname := fmt.Sprintf("PreparePattern-pattern-%s-wanterr-%t",
|
||||
testdata.pattern, testdata.wanterr)
|
||||
testname := fmt.Sprintf("PreparePattern-pattern-%s-wanterr-%t", testdata.name, testdata.wanterr)
|
||||
t.Run(testname, func(t *testing.T) {
|
||||
conf := Config{}
|
||||
|
||||
err := conf.PreparePattern(testdata.pattern)
|
||||
err := conf.PreparePattern(testdata.patterns)
|
||||
|
||||
if err != nil {
|
||||
if !testdata.wanterr {
|
||||
|
||||
Reference in New Issue
Block a user