mirror of
https://codeberg.org/scip/tablizer.git
synced 2025-12-17 04:30:56 +01:00
re-organized pattern matching code
This commit is contained in:
14
lib/io.go
14
lib/io.go
@@ -24,25 +24,29 @@ import (
|
||||
"os"
|
||||
)
|
||||
|
||||
func ProcessFiles(c cfg.Config, args []string) error {
|
||||
fds, pattern, err := determineIO(&c, args)
|
||||
func ProcessFiles(c *cfg.Config, args []string) error {
|
||||
fds, pattern, err := determineIO(c, args)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := c.PreparePattern(pattern); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
for _, fd := range fds {
|
||||
data, err := parseFile(c, fd, pattern)
|
||||
data, err := Parse(*c, fd)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
err = PrepareColumns(&c, &data)
|
||||
err = PrepareColumns(c, &data)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
printData(os.Stdout, c, &data)
|
||||
printData(os.Stdout, *c, &data)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
@@ -29,19 +29,25 @@ import (
|
||||
"strings"
|
||||
)
|
||||
|
||||
/*
|
||||
Parser switch
|
||||
*/
|
||||
func Parse(c cfg.Config, input io.Reader) (Tabdata, error) {
|
||||
if len(c.Separator) == 1 {
|
||||
return parseCSV(c, input)
|
||||
}
|
||||
|
||||
return parseTabular(c, input)
|
||||
}
|
||||
|
||||
/*
|
||||
Parse CSV input.
|
||||
*/
|
||||
func parseCSV(c cfg.Config, input io.Reader, pattern string) (Tabdata, error) {
|
||||
func parseCSV(c cfg.Config, input io.Reader) (Tabdata, error) {
|
||||
var content io.Reader = input
|
||||
data := Tabdata{}
|
||||
|
||||
patternR, err := regexp.Compile(pattern)
|
||||
if err != nil {
|
||||
return data, errors.Unwrap(fmt.Errorf("Regexp pattern %s is invalid: %w", pattern, err))
|
||||
}
|
||||
|
||||
if len(pattern) > 0 {
|
||||
if len(c.Pattern) > 0 {
|
||||
scanner := bufio.NewScanner(input)
|
||||
lines := []string{}
|
||||
hadFirst := false
|
||||
@@ -49,7 +55,7 @@ func parseCSV(c cfg.Config, input io.Reader, pattern string) (Tabdata, error) {
|
||||
line := strings.TrimSpace(scanner.Text())
|
||||
if hadFirst {
|
||||
// don't match 1st line, it's the header
|
||||
if patternR.MatchString(line) == c.InvertMatch {
|
||||
if c.PatternR.MatchString(line) == c.InvertMatch {
|
||||
// by default -v is false, so if a line does NOT
|
||||
// match the pattern, we will ignore it. However,
|
||||
// if the user specified -v, the matching is inverted,
|
||||
@@ -94,20 +100,13 @@ func parseCSV(c cfg.Config, input io.Reader, pattern string) (Tabdata, error) {
|
||||
/*
|
||||
Parse tabular input.
|
||||
*/
|
||||
func parseFile(c cfg.Config, input io.Reader, pattern string) (Tabdata, error) {
|
||||
if len(c.Separator) == 1 {
|
||||
return parseCSV(c, input, pattern)
|
||||
}
|
||||
func parseTabular(c cfg.Config, input io.Reader) (Tabdata, error) {
|
||||
data := Tabdata{}
|
||||
|
||||
var scanner *bufio.Scanner
|
||||
|
||||
hadFirst := false
|
||||
separate := regexp.MustCompile(c.Separator)
|
||||
patternR, err := regexp.Compile(pattern)
|
||||
if err != nil {
|
||||
return data, errors.Unwrap(fmt.Errorf("Regexp pattern %s is invalid: %w", pattern, err))
|
||||
}
|
||||
|
||||
scanner = bufio.NewScanner(input)
|
||||
|
||||
@@ -142,8 +141,8 @@ func parseFile(c cfg.Config, input io.Reader, pattern string) (Tabdata, error) {
|
||||
}
|
||||
} else {
|
||||
// data processing
|
||||
if len(pattern) > 0 {
|
||||
if patternR.MatchString(line) == c.InvertMatch {
|
||||
if len(c.Pattern) > 0 {
|
||||
if c.PatternR.MatchString(line) == c.InvertMatch {
|
||||
// by default -v is false, so if a line does NOT
|
||||
// match the pattern, we will ignore it. However,
|
||||
// if the user specified -v, the matching is inverted,
|
||||
|
||||
@@ -66,7 +66,7 @@ func TestParser(t *testing.T) {
|
||||
t.Run(testname, func(t *testing.T) {
|
||||
readFd := strings.NewReader(strings.TrimSpace(in.text))
|
||||
c := cfg.Config{Separator: in.separator}
|
||||
gotdata, err := parseFile(c, readFd, "")
|
||||
gotdata, err := Parse(c, readFd)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Parser returned error: %s\nData processed so far: %+v", err, gotdata)
|
||||
@@ -101,13 +101,6 @@ func TestParserPatternmatching(t *testing.T) {
|
||||
pattern: "ig",
|
||||
invert: true,
|
||||
},
|
||||
{
|
||||
entries: [][]string{
|
||||
{"asd", "igig", "cxxxncnc"},
|
||||
},
|
||||
pattern: "[a-z",
|
||||
want: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, in := range input {
|
||||
@@ -118,8 +111,10 @@ func TestParserPatternmatching(t *testing.T) {
|
||||
c := cfg.Config{InvertMatch: tt.invert, Pattern: tt.pattern,
|
||||
Separator: in.separator}
|
||||
|
||||
_ = c.PreparePattern(tt.pattern)
|
||||
|
||||
readFd := strings.NewReader(strings.TrimSpace(in.text))
|
||||
gotdata, err := parseFile(c, readFd, tt.pattern)
|
||||
gotdata, err := Parse(c, readFd)
|
||||
|
||||
if err != nil {
|
||||
if !tt.want {
|
||||
@@ -157,7 +152,7 @@ asd igig
|
||||
|
||||
readFd := strings.NewReader(strings.TrimSpace(table))
|
||||
c := cfg.Config{Separator: cfg.DefaultSeparator}
|
||||
gotdata, err := parseFile(c, readFd, "")
|
||||
gotdata, err := Parse(c, readFd)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("Parser returned error: %s\nData processed so far: %+v", err, gotdata)
|
||||
|
||||
Reference in New Issue
Block a user