64 lines
1 KiB
Go
64 lines
1 KiB
Go
package create
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"regexp"
|
|
)
|
|
|
|
func NewRegexpWriter(out io.Writer, re *regexp.Regexp, repl string) *RegexpWriter {
|
|
return &RegexpWriter{out: out, re: *re, repl: repl}
|
|
}
|
|
|
|
type RegexpWriter struct {
|
|
out io.Writer
|
|
re regexp.Regexp
|
|
repl string
|
|
buf []byte
|
|
}
|
|
|
|
func (s *RegexpWriter) Write(data []byte) (int, error) {
|
|
if len(data) == 0 {
|
|
return 0, nil
|
|
}
|
|
|
|
filtered := []byte{}
|
|
repl := []byte(s.repl)
|
|
lines := bytes.SplitAfter(data, []byte("\n"))
|
|
|
|
if len(s.buf) > 0 {
|
|
lines[0] = append(s.buf, lines[0]...)
|
|
}
|
|
|
|
for i, line := range lines {
|
|
if i == len(lines) {
|
|
s.buf = line
|
|
} else {
|
|
f := s.re.ReplaceAll(line, repl)
|
|
if len(f) > 0 {
|
|
filtered = append(filtered, f...)
|
|
}
|
|
}
|
|
}
|
|
|
|
if len(filtered) != 0 {
|
|
_, err := s.out.Write(filtered)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
}
|
|
|
|
return len(data), nil
|
|
}
|
|
|
|
func (s *RegexpWriter) Flush() (int, error) {
|
|
if len(s.buf) > 0 {
|
|
repl := []byte(s.repl)
|
|
filtered := s.re.ReplaceAll(s.buf, repl)
|
|
if len(filtered) > 0 {
|
|
return s.out.Write(filtered)
|
|
}
|
|
}
|
|
|
|
return 0, nil
|
|
}
|