Merge commit 'f955c625aded244864e83a872b396868a490dbc5' as 'go-enry'

This commit is contained in:
2024-09-04 16:33:41 -03:00
192 changed files with 528500 additions and 0 deletions

View File

@ -0,0 +1,29 @@
//go:build oniguruma
// +build oniguruma
package regex
import (
rubex "github.com/go-enry/go-oniguruma"
)
const Name = Oniguruma
type EnryRegexp = *rubex.Regexp
func MustCompile(s string) EnryRegexp {
return rubex.MustCompileASCII(s)
}
// MustCompileMultiline matches in multi-line mode by default with Oniguruma.
func MustCompileMultiline(s string) EnryRegexp {
return MustCompile(s)
}
func MustCompileRuby(s string) EnryRegexp {
return MustCompile(s)
}
func QuoteMeta(s string) string {
return rubex.QuoteMeta(s)
}

9
go-enry/regex/regex.go Normal file
View File

@ -0,0 +1,9 @@
package regex
// Package regex abstracts regular expression engine
// that can be chosen at compile-time by a build tag.
const (
RE2 = "RE2"
Oniguruma = "Oniguruma"
)

38
go-enry/regex/standard.go Normal file
View File

@ -0,0 +1,38 @@
//go:build !oniguruma
// +build !oniguruma
package regex
import (
"regexp"
)
const Name = RE2
type EnryRegexp = *regexp.Regexp
func MustCompile(str string) EnryRegexp {
return regexp.MustCompile(str)
}
// MustCompileMultiline mimics Ruby defaults for regexp, where ^$ matches begin/end of line.
// I.e. it converts Ruby regexp syntaxt to RE2 equivalent
func MustCompileMultiline(s string) EnryRegexp {
const multilineModeFlag = "(?m)"
return regexp.MustCompile(multilineModeFlag + s)
}
// MustCompileRuby used for expressions with syntax not supported by RE2.
// Now it's confusing as we use the result as [data/rule.Matcher] and
//
// (*Matcher)(nil) != nil
//
// What is a better way for an expression to indicate unsupported syntax?
// e.g. add .IsValidSyntax() to both, Matcher interface and EnryRegexp implementations?
func MustCompileRuby(s string) EnryRegexp {
return nil
}
func QuoteMeta(s string) string {
return regexp.QuoteMeta(s)
}

View File

@ -0,0 +1,27 @@
//go:build !oniguruma
// +build !oniguruma
package regex
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestMustCompileMultiline(t *testing.T) {
const re = `^\.(.*)!$`
want := MustCompileMultiline(re)
assert.Equal(t, "(?m)"+re, want.String())
const s = `.one
.two!
thre!`
if !want.MatchString(s) {
t.Fatalf("MustCompileMultiline(`%s`) must match multiline %q\n", re, s)
}
}
func TestMustCompileRuby(t *testing.T) {
assert.Nil(t, MustCompileRuby(``))
}