Detect theme and exercice language at runtime (not stored)
This commit is contained in:
parent
99cc79421f
commit
aa0e7406c1
|
@ -153,7 +153,7 @@ func CheckExerciceFiles(i Importer, exercice *fic.Exercice, exceptions *CheckExc
|
||||||
if f, exists := paramsFiles[fname]; exists {
|
if f, exists := paramsFiles[fname]; exists {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, hk := range hooks.mdTextHooks {
|
for _, hk := range hooks.mdTextHooks {
|
||||||
for _, err := range hk(f.Disclaimer, exceptions) {
|
for _, err := range hk(f.Disclaimer, exercice.Language, exceptions) {
|
||||||
errs = append(errs, NewFileError(exercice, fname, err))
|
errs = append(errs, NewFileError(exercice, fname, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ func CheckExerciceFiles(i Importer, exercice *fic.Exercice, exceptions *CheckExc
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.fileHooks {
|
for _, h := range hooks.fileHooks {
|
||||||
for _, e := range h(file, exceptions) {
|
for _, e := range h(file, exercice, exceptions) {
|
||||||
errs = append(errs, NewFileError(exercice, fname, e))
|
errs = append(errs, NewFileError(exercice, fname, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,7 +213,7 @@ func SyncExerciceFiles(i Importer, exercice *fic.Exercice, exceptions *CheckExce
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, hk := range hooks.mdTextHooks {
|
for _, hk := range hooks.mdTextHooks {
|
||||||
for _, err := range hk(f.Disclaimer, exceptions) {
|
for _, err := range hk(f.Disclaimer, exercice.Language, exceptions) {
|
||||||
errs = append(errs, NewFileError(exercice, fname, err))
|
errs = append(errs, NewFileError(exercice, fname, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,7 +234,7 @@ func SyncExerciceFiles(i Importer, exercice *fic.Exercice, exceptions *CheckExce
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.fileHooks {
|
for _, h := range hooks.fileHooks {
|
||||||
for _, e := range h(file, exceptions) {
|
for _, e := range h(file, exercice, exceptions) {
|
||||||
errs = append(errs, NewFileError(exercice, fname, e))
|
errs = append(errs, NewFileError(exercice, fname, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,7 +85,7 @@ func buildExerciceHints(i Importer, exercice *fic.Exercice, exceptions *CheckExc
|
||||||
} else {
|
} else {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, hk := range hooks.mdTextHooks {
|
for _, hk := range hooks.mdTextHooks {
|
||||||
for _, err := range hk(h.Content, exceptions) {
|
for _, err := range hk(h.Content, exercice.Language, exceptions) {
|
||||||
errs = append(errs, NewHintError(exercice, h, n, err))
|
errs = append(errs, NewHintError(exercice, h, n, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +97,7 @@ func buildExerciceHints(i Importer, exercice *fic.Exercice, exceptions *CheckExc
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, hook := range hooks.hintHooks {
|
for _, hook := range hooks.hintHooks {
|
||||||
for _, e := range hook(h, exceptions) {
|
for _, e := range hook(h, exercice, exceptions) {
|
||||||
errs = append(errs, NewHintError(exercice, h, n, e))
|
errs = append(errs, NewHintError(exercice, h, n, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ func buildLabelFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, exc
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(flag.Label, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
for _, err := range h(flag.Label, exercice.Language, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, flagline, err))
|
errs = append(errs, NewFlagError(exercice, &flag, flagline, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,7 @@ func buildLabelFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, exc
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.flagLabelHooks {
|
for _, h := range hooks.flagLabelHooks {
|
||||||
for _, e := range h(f, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
for _, e := range h(f, exercice, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,7 @@ func buildKeyFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, defau
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.flagKeyHooks {
|
for _, h := range hooks.flagKeyHooks {
|
||||||
for _, e := range h(fk, raw, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
for _, e := range h(fk, raw, exercice, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ func buildKeyFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, defau
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.flagChoiceHooks {
|
for _, h := range hooks.flagChoiceHooks {
|
||||||
for _, e := range h(fc, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
for _, e := range h(fc, exercice, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,7 @@ func buildKeyFlag(exercice *fic.Exercice, flag ExerciceFlag, flagline int, defau
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.flagKeyWithChoicesHooks {
|
for _, h := range hooks.flagKeyWithChoicesHooks {
|
||||||
for _, e := range h(fk, raw, choices, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
for _, e := range h(fk, raw, choices, exercice, exceptions.Filter2ndCol(strconv.Itoa(flagline))) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
errs = append(errs, NewFlagError(exercice, &flag, flagline, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -441,7 +441,7 @@ func buildExerciceFlag(i Importer, exercice *fic.Exercice, flag ExerciceFlag, nl
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.flagMCQHooks {
|
for _, h := range hooks.flagMCQHooks {
|
||||||
for _, e := range h(&addedFlag, addedFlag.Entries, exceptions) {
|
for _, e := range h(&addedFlag, addedFlag.Entries, exercice, exceptions) {
|
||||||
errs = append(errs, NewFlagError(exercice, &flag, nline+1, e))
|
errs = append(errs, NewFlagError(exercice, &flag, nline+1, e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,6 +109,17 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
|
||||||
exceptions = exceptions.GetExerciceExceptions(e)
|
exceptions = exceptions.GetExerciceExceptions(e)
|
||||||
//log.Printf("Kept repochecker exceptions for this exercice: %v", exceptions)
|
//log.Printf("Kept repochecker exceptions for this exercice: %v", exceptions)
|
||||||
|
|
||||||
|
e.Language = theme.Language
|
||||||
|
// Overwrite language if language.txt exists
|
||||||
|
if language, err := GetFileContent(i, path.Join(epath, "language.txt")); err == nil {
|
||||||
|
language = strings.TrimSpace(language)
|
||||||
|
if strings.Contains(language, "\n") {
|
||||||
|
errs = append(errs, NewExerciceError(e, fmt.Errorf("language.txt: Language can't contain new lines"), theme))
|
||||||
|
} else {
|
||||||
|
e.Language = language
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Overwrite title if title.txt exists
|
// Overwrite title if title.txt exists
|
||||||
if myTitle, err := GetFileContent(i, path.Join(epath, "title.txt")); err == nil {
|
if myTitle, err := GetFileContent(i, path.Join(epath, "title.txt")); err == nil {
|
||||||
myTitle = strings.TrimSpace(myTitle)
|
myTitle = strings.TrimSpace(myTitle)
|
||||||
|
@ -142,7 +153,7 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
|
||||||
|
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(e.Overview, exceptions.GetFileExceptions("overview.md", "overview.txt")) {
|
for _, err := range h(e.Overview, e.Language, exceptions.GetFileExceptions("overview.md", "overview.txt")) {
|
||||||
errs = append(errs, NewExerciceError(e, fmt.Errorf("overview.md: %w", err)))
|
errs = append(errs, NewExerciceError(e, fmt.Errorf("overview.md: %w", err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -172,7 +183,7 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
|
||||||
} else {
|
} else {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(e.Statement, exceptions.GetFileExceptions("statement.md", "statement.txt")) {
|
for _, err := range h(e.Statement, e.Language, exceptions.GetFileExceptions("statement.md", "statement.txt")) {
|
||||||
errs = append(errs, NewExerciceError(e, fmt.Errorf("statement.md: %w", err)))
|
errs = append(errs, NewExerciceError(e, fmt.Errorf("statement.md: %w", err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,7 +203,7 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
|
||||||
} else if len(e.Finished) > 0 {
|
} else if len(e.Finished) > 0 {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(e.Finished, exceptions.GetFileExceptions("finished.md", "finished.txt")) {
|
for _, err := range h(e.Finished, e.Language, exceptions.GetFileExceptions("finished.md", "finished.txt")) {
|
||||||
errs = append(errs, NewExerciceError(e, fmt.Errorf("finished.md: %w", err)))
|
errs = append(errs, NewExerciceError(e, fmt.Errorf("finished.md: %w", err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -291,7 +302,7 @@ func BuildExercice(i Importer, theme *fic.Theme, epath string, dmap *map[int64]*
|
||||||
} else {
|
} else {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(e.Resolution, exceptions.GetFileExceptions("resolution.md"), p.GetRawFlags()...) {
|
for _, err := range h(e.Resolution, e.Language, exceptions.GetFileExceptions("resolution.md"), p.GetRawFlags()...) {
|
||||||
errs = append(errs, NewExerciceError(e, fmt.Errorf("resolution.md: %w", err)))
|
errs = append(errs, NewExerciceError(e, fmt.Errorf("resolution.md: %w", err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,14 +9,14 @@ import (
|
||||||
|
|
||||||
var hooks = &CheckHooks{customHooks: map[string]CustomCheckHook{}}
|
var hooks = &CheckHooks{customHooks: map[string]CustomCheckHook{}}
|
||||||
|
|
||||||
type CheckFlagChoiceHook func(*fic.FlagChoice, *CheckExceptions) []error
|
type CheckFlagChoiceHook func(*fic.FlagChoice, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckFlagKeyHook func(*fic.FlagKey, string, *CheckExceptions) []error
|
type CheckFlagKeyHook func(*fic.FlagKey, string, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckFlagKeyWithChoicesHook func(*fic.FlagKey, string, []*fic.FlagChoice, *CheckExceptions) []error
|
type CheckFlagKeyWithChoicesHook func(*fic.FlagKey, string, []*fic.FlagChoice, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckFlagLabelHook func(*fic.FlagLabel, *CheckExceptions) []error
|
type CheckFlagLabelHook func(*fic.FlagLabel, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckFlagMCQHook func(*fic.MCQ, []*fic.MCQ_entry, *CheckExceptions) []error
|
type CheckFlagMCQHook func(*fic.MCQ, []*fic.MCQ_entry, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckFileHook func(*fic.EFile, *CheckExceptions) []error
|
type CheckFileHook func(*fic.EFile, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckHintHook func(*fic.EHint, *CheckExceptions) []error
|
type CheckHintHook func(*fic.EHint, *fic.Exercice, *CheckExceptions) []error
|
||||||
type CheckMDTextHook func(string, *CheckExceptions, ...string) []error
|
type CheckMDTextHook func(string, string, *CheckExceptions, ...string) []error
|
||||||
type CheckExerciceHook func(*fic.Exercice, *CheckExceptions) []error
|
type CheckExerciceHook func(*fic.Exercice, *CheckExceptions) []error
|
||||||
type CustomCheckHook func(interface{}, *CheckExceptions) []error
|
type CustomCheckHook func(interface{}, *CheckExceptions) []error
|
||||||
|
|
||||||
|
|
|
@ -112,6 +112,16 @@ func BuildTheme(i Importer, tdir string) (th *fic.Theme, exceptions *CheckExcept
|
||||||
// Get exceptions
|
// Get exceptions
|
||||||
exceptions = LoadException(i, th)
|
exceptions = LoadException(i, th)
|
||||||
|
|
||||||
|
// Overwrite language
|
||||||
|
if language, err := GetFileContent(i, path.Join(tdir, "language.txt")); err == nil {
|
||||||
|
language = strings.TrimSpace(language)
|
||||||
|
if strings.Contains(language, "\n") {
|
||||||
|
errs = append(errs, NewThemeError(th, fmt.Errorf("language.txt: Language can't contain new lines")))
|
||||||
|
} else {
|
||||||
|
th.Language = language
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Extract theme's label
|
// Extract theme's label
|
||||||
if tname, err := GetFileContent(i, path.Join(tdir, "title.txt")); err == nil {
|
if tname, err := GetFileContent(i, path.Join(tdir, "title.txt")); err == nil {
|
||||||
th.Name = fixnbsp(tname)
|
th.Name = fixnbsp(tname)
|
||||||
|
@ -144,7 +154,7 @@ func BuildTheme(i Importer, tdir string) (th *fic.Theme, exceptions *CheckExcept
|
||||||
} else {
|
} else {
|
||||||
// Call checks hooks
|
// Call checks hooks
|
||||||
for _, h := range hooks.mdTextHooks {
|
for _, h := range hooks.mdTextHooks {
|
||||||
for _, err := range h(intro, exceptions.GetFileExceptions("overview.md", "overview.txt")) {
|
for _, err := range h(intro, th.Language, exceptions.GetFileExceptions("overview.md", "overview.txt")) {
|
||||||
errs = append(errs, NewThemeError(th, fmt.Errorf("overview.md: %w", err)))
|
errs = append(errs, NewThemeError(th, fmt.Errorf("overview.md: %w", err)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,9 +20,10 @@ var ExerciceCurrentCoefficient = 1.0
|
||||||
|
|
||||||
// Exercice represents a challenge inside a Theme.
|
// Exercice represents a challenge inside a Theme.
|
||||||
type Exercice struct {
|
type Exercice struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
IdTheme int64 `json:"id_theme"`
|
IdTheme int64 `json:"id_theme"`
|
||||||
Title string `json:"title"`
|
Language string `json:"lang,omitempty"`
|
||||||
|
Title string `json:"title"`
|
||||||
// WIP indicates if the exercice is in development or not
|
// WIP indicates if the exercice is in development or not
|
||||||
WIP bool `json:"wip"`
|
WIP bool `json:"wip"`
|
||||||
// URLid is used to reference the challenge from the URL path
|
// URLid is used to reference the challenge from the URL path
|
||||||
|
|
|
@ -5,6 +5,7 @@ import ()
|
||||||
// Theme represents a group of challenges, to display to players
|
// Theme represents a group of challenges, to display to players
|
||||||
type Theme struct {
|
type Theme struct {
|
||||||
Id int64 `json:"id"`
|
Id int64 `json:"id"`
|
||||||
|
Language string `json:"lang,omitempty"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
URLId string `json:"urlid"`
|
URLId string `json:"urlid"`
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"srs.epita.fr/fic-server/libfic"
|
"srs.epita.fr/fic-server/libfic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func EPITACheckFile(file *fic.EFile, exceptions *sync.CheckExceptions) (errs []error) {
|
func EPITACheckFile(file *fic.EFile, _ *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
// Enforce file format
|
// Enforce file format
|
||||||
if path.Ext(file.Name) == ".rar" || path.Ext(file.Name) == ".7z" {
|
if path.Ext(file.Name) == ".rar" || path.Ext(file.Name) == ".7z" {
|
||||||
errs = append(errs, fmt.Errorf("this file use a forbidden archive type."))
|
errs = append(errs, fmt.Errorf("this file use a forbidden archive type."))
|
||||||
|
|
|
@ -10,7 +10,7 @@ import (
|
||||||
"srs.epita.fr/fic-server/libfic"
|
"srs.epita.fr/fic-server/libfic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func EPITACheckKeyFlag(flag *fic.FlagKey, raw string, exceptions *sync.CheckExceptions) (errs []error) {
|
func EPITACheckKeyFlag(flag *fic.FlagKey, raw string, _ *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
if (flag.Label[0] == 'Q' || flag.Label[0] == 'q') && (flag.Label[1] == 'U' || flag.Label[1] == 'u') ||
|
if (flag.Label[0] == 'Q' || flag.Label[0] == 'q') && (flag.Label[1] == 'U' || flag.Label[1] == 'u') ||
|
||||||
(flag.Label[0] == 'W' || flag.Label[0] == 'w') && (flag.Label[1] == 'H' || flag.Label[1] == 'h') {
|
(flag.Label[0] == 'W' || flag.Label[0] == 'w') && (flag.Label[1] == 'H' || flag.Label[1] == 'h') {
|
||||||
errs = append(errs, fmt.Errorf("Label should not begin with %s. This seem to be a question. Reword your label as a description of the expected flag, `:` are automatically appended.", flag.Label[0:2]))
|
errs = append(errs, fmt.Errorf("Label should not begin with %s. This seem to be a question. Reword your label as a description of the expected flag, `:` are automatically appended.", flag.Label[0:2]))
|
||||||
|
@ -47,7 +47,7 @@ func EPITACheckKeyFlag(flag *fic.FlagKey, raw string, exceptions *sync.CheckExce
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func EPITACheckKeyFlagWithChoices(flag *fic.FlagKey, raw string, choices []*fic.FlagChoice, exceptions *sync.CheckExceptions) (errs []error) {
|
func EPITACheckKeyFlagWithChoices(flag *fic.FlagKey, raw string, choices []*fic.FlagChoice, _ *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
if !exceptions.HasException(":bruteforcable-choices") {
|
if !exceptions.HasException(":bruteforcable-choices") {
|
||||||
if len(choices) < 10 && flag.ChoicesCost == 0 {
|
if len(choices) < 10 && flag.ChoicesCost == 0 {
|
||||||
errs = append(errs, fmt.Errorf("requires at least 10 choices to avoid brute-force"))
|
errs = append(errs, fmt.Errorf("requires at least 10 choices to avoid brute-force"))
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
"srs.epita.fr/fic-server/libfic"
|
"srs.epita.fr/fic-server/libfic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func InspectFile(file *fic.EFile, exceptions *sync.CheckExceptions) (errs []error) {
|
func InspectFile(file *fic.EFile, _ *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
if filepath.Ext(file.Name) == ".tar" || strings.HasSuffix(file.Name, ".tar.gz") || strings.HasSuffix(file.Name, ".tar.bz2") {
|
if filepath.Ext(file.Name) == ".tar" || strings.HasSuffix(file.Name, ".tar.gz") || strings.HasSuffix(file.Name, ".tar.bz2") {
|
||||||
// Check there is more than 1 file in tarball
|
// Check there is more than 1 file in tarball
|
||||||
errs = append(errs, checkTarball(file, exceptions)...)
|
errs = append(errs, checkTarball(file, exceptions)...)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
"unicode"
|
"unicode"
|
||||||
|
|
||||||
"srs.epita.fr/fic-server/admin/sync"
|
"srs.epita.fr/fic-server/admin/sync"
|
||||||
|
@ -11,7 +12,11 @@ import (
|
||||||
lib "srs.epita.fr/fic-server/repochecker/grammalecte/lib"
|
lib "srs.epita.fr/fic-server/repochecker/grammalecte/lib"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GrammalecteCheckKeyFlag(flag *fic.FlagKey, raw string, exceptions *sync.CheckExceptions) (errs []error) {
|
func GrammalecteCheckKeyFlag(flag *fic.FlagKey, raw string, exercice *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
|
if !isRecognizedLanguage(exercice.Language) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
label, _, _, _ := flag.AnalyzeFlagLabel()
|
label, _, _, _ := flag.AnalyzeFlagLabel()
|
||||||
for _, err := range grammalecte("label ", label, -1, exceptions, &CommonOpts) {
|
for _, err := range grammalecte("label ", label, -1, exceptions, &CommonOpts) {
|
||||||
if e, ok := err.(lib.GrammarError); ok && e.RuleId == "poncfin_règle1" {
|
if e, ok := err.(lib.GrammarError); ok && e.RuleId == "poncfin_règle1" {
|
||||||
|
@ -28,7 +33,11 @@ func GrammalecteCheckKeyFlag(flag *fic.FlagKey, raw string, exceptions *sync.Che
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GrammalecteCheckFlagChoice(choice *fic.FlagChoice, exceptions *sync.CheckExceptions) (errs []error) {
|
func GrammalecteCheckFlagChoice(choice *fic.FlagChoice, exercice *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
|
if !isRecognizedLanguage(exercice.Language) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
errs = append(errs, grammalecte("label ", choice.Label, -1, exceptions, &CommonOpts)...)
|
errs = append(errs, grammalecte("label ", choice.Label, -1, exceptions, &CommonOpts)...)
|
||||||
|
|
||||||
if len(errs) == 0 && !unicode.IsUpper(bytes.Runes([]byte(choice.Label))[0]) && !exceptions.HasException(":label_majuscule") {
|
if len(errs) == 0 && !unicode.IsUpper(bytes.Runes([]byte(choice.Label))[0]) && !exceptions.HasException(":label_majuscule") {
|
||||||
|
@ -38,7 +47,11 @@ func GrammalecteCheckFlagChoice(choice *fic.FlagChoice, exceptions *sync.CheckEx
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func GrammalecteCheckHint(hint *fic.EHint, exceptions *sync.CheckExceptions) (errs []error) {
|
func GrammalecteCheckHint(hint *fic.EHint, exercice *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
|
if !isRecognizedLanguage(exercice.Language) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if len(hint.Title) > 0 {
|
if len(hint.Title) > 0 {
|
||||||
errs = append(errs, grammalecte("title ", hint.Title, -1, exceptions, &CommonOpts)...)
|
errs = append(errs, grammalecte("title ", hint.Title, -1, exceptions, &CommonOpts)...)
|
||||||
if len(errs) == 0 && !unicode.IsUpper(bytes.Runes([]byte(hint.Title))[0]) && !exceptions.HasException(":title_majuscule") {
|
if len(errs) == 0 && !unicode.IsUpper(bytes.Runes([]byte(hint.Title))[0]) && !exceptions.HasException(":title_majuscule") {
|
||||||
|
@ -52,8 +65,15 @@ func GrammalecteCheckHint(hint *fic.EHint, exceptions *sync.CheckExceptions) (er
|
||||||
}
|
}
|
||||||
|
|
||||||
func GrammalecteCheckGrammar(data interface{}, exceptions *sync.CheckExceptions) []error {
|
func GrammalecteCheckGrammar(data interface{}, exceptions *sync.CheckExceptions) []error {
|
||||||
if s, ok := data.(string); ok {
|
if s, ok := data.(struct {
|
||||||
return grammalecte("", s, 0, exceptions, &CommonOpts)
|
Str string
|
||||||
|
Language string
|
||||||
|
}); ok {
|
||||||
|
if s.Language != "" && strings.HasPrefix(s.Language, "fr") {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return grammalecte("", s.Str, 0, exceptions, &CommonOpts)
|
||||||
} else {
|
} else {
|
||||||
log.Printf("Unknown data given to GrammalecteCheckGrammar: %T", data)
|
log.Printf("Unknown data given to GrammalecteCheckGrammar: %T", data)
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"srs.epita.fr/fic-server/admin/sync"
|
"srs.epita.fr/fic-server/admin/sync"
|
||||||
|
@ -104,6 +105,11 @@ func runGrammalecteServer() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func isRecognizedLanguage(lang string) bool {
|
||||||
|
// Grammalecte can only check french texts
|
||||||
|
return lang == "" || strings.HasPrefix(lang, "fr")
|
||||||
|
}
|
||||||
|
|
||||||
func RegisterChecksHooks(h *sync.CheckHooks) {
|
func RegisterChecksHooks(h *sync.CheckHooks) {
|
||||||
if err := runGrammalecteServer(); err != nil {
|
if err := runGrammalecteServer(); err != nil {
|
||||||
log.Fatal("Unable to start grammalecte-server:", err)
|
log.Fatal("Unable to start grammalecte-server:", err)
|
||||||
|
|
|
@ -17,7 +17,11 @@ import (
|
||||||
"github.com/yuin/goldmark/util"
|
"github.com/yuin/goldmark/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func GrammalecteCheckMDText(str string, exceptions *sync.CheckExceptions, forbiddenStrings ...string) (errs []error) {
|
func GrammalecteCheckMDText(str string, lang string, exceptions *sync.CheckExceptions, forbiddenStrings ...string) (errs []error) {
|
||||||
|
if !isRecognizedLanguage(lang) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if exceptions != nil {
|
if exceptions != nil {
|
||||||
for k := range *exceptions {
|
for k := range *exceptions {
|
||||||
tmp := strings.SplitN(k, ":", 3)
|
tmp := strings.SplitN(k, ":", 3)
|
||||||
|
|
|
@ -109,7 +109,7 @@ func CheckTextFile(fd *os.File) (errs []error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func InspectFileForIPAddr(file *fic.EFile, exceptions *sync.CheckExceptions) (errs []error) {
|
func InspectFileForIPAddr(file *fic.EFile, _ *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
fd, closer, err := sync.GetFile(sync.GlobalImporter, file.GetOrigin())
|
fd, closer, err := sync.GetFile(sync.GlobalImporter, file.GetOrigin())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("Unable to open %q: %s", file.GetOrigin(), err.Error())
|
log.Printf("Unable to open %q: %s", file.GetOrigin(), err.Error())
|
||||||
|
|
|
@ -11,9 +11,10 @@ import (
|
||||||
ffmpeg "github.com/u2takey/ffmpeg-go"
|
ffmpeg "github.com/u2takey/ffmpeg-go"
|
||||||
|
|
||||||
"srs.epita.fr/fic-server/admin/sync"
|
"srs.epita.fr/fic-server/admin/sync"
|
||||||
|
"srs.epita.fr/fic-server/libfic"
|
||||||
)
|
)
|
||||||
|
|
||||||
func CheckGrammarSubtitleTrack(path string, exceptions *sync.CheckExceptions) (errs []error) {
|
func CheckGrammarSubtitleTrack(path string, exercice *fic.Exercice, exceptions *sync.CheckExceptions) (errs []error) {
|
||||||
tmpfile, err := ioutil.TempFile("", "resolution-*.srt")
|
tmpfile, err := ioutil.TempFile("", "resolution-*.srt")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errs = append(errs, fmt.Errorf("unable to create a temporary file: %w", err))
|
errs = append(errs, fmt.Errorf("unable to create a temporary file: %w", err))
|
||||||
|
@ -39,7 +40,10 @@ func CheckGrammarSubtitleTrack(path string, exceptions *sync.CheckExceptions) (e
|
||||||
for _, item := range subtitles.Items {
|
for _, item := range subtitles.Items {
|
||||||
lines = append(lines, item.String())
|
lines = append(lines, item.String())
|
||||||
}
|
}
|
||||||
for _, e := range hooks.CallCustomHook("CheckGrammar", strings.Join(lines, "\n"), exceptions) {
|
for _, e := range hooks.CallCustomHook("CheckGrammar", struct {
|
||||||
|
Str string
|
||||||
|
Language string
|
||||||
|
}{Str: strings.Join(lines, "\n"), Language: exercice.Language}, exceptions) {
|
||||||
errs = append(errs, fmt.Errorf("subtitle-track: %w", e))
|
errs = append(errs, fmt.Errorf("subtitle-track: %w", e))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -143,7 +143,7 @@ func checkResolutionVideo(e *fic.Exercice, exceptions *sync.CheckExceptions) (er
|
||||||
if !subtitles_seen && !exceptions.HasException(":subtitle:no_track") {
|
if !subtitles_seen && !exceptions.HasException(":subtitle:no_track") {
|
||||||
errs = append(errs, fmt.Errorf("no subtitles track found"))
|
errs = append(errs, fmt.Errorf("no subtitles track found"))
|
||||||
} else if subtitles_seen {
|
} else if subtitles_seen {
|
||||||
errs = append(errs, CheckGrammarSubtitleTrack(path, exceptions)...)
|
errs = append(errs, CheckGrammarSubtitleTrack(path, e, exceptions)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue