From 355a9f0d000f2732c7e00ec68ba69f3153c1e612 Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Sat, 6 Apr 2024 16:41:53 -0400 Subject: [PATCH] feat: keyword parser --- internal/parsers/all.go | 1 + internal/parsers/keyword/meta.go | 9 ++++ internal/parsers/keyword/parser.go | 67 ++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 internal/parsers/keyword/meta.go create mode 100644 internal/parsers/keyword/parser.go diff --git a/internal/parsers/all.go b/internal/parsers/all.go index d305bd6..c687743 100644 --- a/internal/parsers/all.go +++ b/internal/parsers/all.go @@ -4,6 +4,7 @@ import ( _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/cpplint" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/diff" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/dummy" + _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/keyword" _ "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/parsers/resultstatus" ) diff --git a/internal/parsers/keyword/meta.go b/internal/parsers/keyword/meta.go new file mode 100644 index 0000000..fd2dccd --- /dev/null +++ b/internal/parsers/keyword/meta.go @@ -0,0 +1,9 @@ +package keyword + +import "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" + +var name = "keyword" + +func init() { + stage.RegisterParser(name, &Keyword{}) +} diff --git a/internal/parsers/keyword/parser.go b/internal/parsers/keyword/parser.go new file mode 100644 index 0000000..f11fb4a --- /dev/null +++ b/internal/parsers/keyword/parser.go @@ -0,0 +1,67 @@ +package keyword + +import ( + "fmt" + "strings" + + "focs.ji.sjtu.edu.cn/git/FOCS-dev/JOJ3/internal/stage" +) + +type Match struct { + Keyword string + Score int +} + +type Conf struct { + FullScore int + MinScore int + Files []string + EndOnMatch bool + Matches []Match +} + +type Keyword struct{} + +func Parse(executorResult stage.ExecutorResult, conf Conf) ( + stage.ParserResult, bool, +) { + score := conf.FullScore + comment := "" + matched := false + for _, file := range conf.Files { + content := executorResult.Files[file] + for _, match := range conf.Matches { + count := strings.Count(content, match.Keyword) + if count > 0 { + matched = true + score -= count * match.Score + comment += fmt.Sprintf( + "Matched keyword %d time(s): %s\n", + count, match.Keyword) + } + } + } + return stage.ParserResult{ + Score: min(score, conf.MinScore), + Comment: comment, + }, matched +} + +func (*Keyword) Run(results []stage.ExecutorResult, confAny any) ( + []stage.ParserResult, bool, error, +) { + conf, err := stage.DecodeConf[Conf](confAny) + if err != nil { + return nil, true, err + } + var res []stage.ParserResult + end := false + for _, result := range results { + tmp, matched := Parse(result, *conf) + if matched && conf.EndOnMatch { + end = true + } + res = append(res, tmp) + } + return res, end, nil +}