merge
This commit is contained in:
commit
ebd20b53ed
2 changed files with 123 additions and 0 deletions
62
embed/cli/root/description.tmpl~
Normal file
62
embed/cli/root/description.tmpl~
Normal file
|
@ -0,0 +1,62 @@
|
|||
{{define "description"}}
|
||||
# Probo
|
||||
|
||||
`probo` is a quiz management and administration system designed for
|
||||
command line and text interface enthusiasts. `probo` aims to highlight
|
||||
themes such as privacy, interoperability, accessibility,
|
||||
decentralization, and quick usage speed.
|
||||
|
||||
`probo` organizes information in plain text files and folders so that
|
||||
data can be easily revised through version control systems. Quizzes
|
||||
can be written in Markdown format, filters use the `jq` language, exam
|
||||
sessions, participants, and their quiz answers are JSON files.
|
||||
|
||||
`probo` contains a built-in web server that allows quizzes to be
|
||||
administered to participants and their answers received.
|
||||
|
||||
`probo` is a self-contained application that can be distributed through
|
||||
a simple executable containing all necessary assets for its operation.
|
||||
|
||||
# Quickstart
|
||||
|
||||
1. Initialize the working directory
|
||||
|
||||
```
|
||||
probo init
|
||||
```
|
||||
|
||||
2. Create our first quiz.
|
||||
|
||||
```
|
||||
probo create quiz > data/quizzes/quiz_1.md
|
||||
```
|
||||
|
||||
3. Create two participants.
|
||||
|
||||
```
|
||||
probo create participant > data/participants/john.json
|
||||
probo create participant > data/participants/mary.json
|
||||
```
|
||||
|
||||
4. Filter participants and quizzes (in this case, all participants and
|
||||
all quizzes present in the store will be selected) and create an exam
|
||||
session.
|
||||
|
||||
```
|
||||
probo filter participant -f '.' | probo filter quizzes -f '.' | probo create session --name="My First Session" > data/sessions/my_session.json
|
||||
```
|
||||
|
||||
5. Run the web server to allow participants to respond.
|
||||
|
||||
```
|
||||
probo serve
|
||||
```
|
||||
|
||||
6. Share the *qrcode* generated from the previous step with the participants and wait for them to finish responding.
|
||||
|
||||
7. Explore the results.
|
||||
|
||||
```
|
||||
probo filter responses -f '.' | probo rank
|
||||
```
|
||||
{{end}}
|
61
embed/embed.go~
Normal file
61
embed/embed.go~
Normal file
|
@ -0,0 +1,61 @@
|
|||
package embed
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"io"
|
||||
"io/fs"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
var (
|
||||
//go:embed templates/*
|
||||
Templates embed.FS
|
||||
Assets embed.FS
|
||||
//go:embed data/*
|
||||
Data embed.FS
|
||||
)
|
||||
|
||||
func CopyToWorkingDirectory(data embed.FS) error {
|
||||
currentDir, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := fs.WalkDir(data, ".", func(path string, info fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fullPath := path
|
||||
|
||||
if info.IsDir() {
|
||||
dirPath := filepath.Join(currentDir, path)
|
||||
if err := os.MkdirAll(dirPath, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
srcFile, err := data.Open(fullPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dstFile, err := os.Create(filepath.Join(currentDir, path))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer dstFile.Close()
|
||||
|
||||
_, err = io.Copy(dstFile, srcFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in a new issue