statping-ng/source/generate_help.go

184 lines
3.7 KiB
Go

// +build ignore
package main
import (
"bufio"
"bytes"
"fmt"
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/html"
"html/template"
"io/ioutil"
"os"
"os/exec"
"strings"
"time"
)
const wikiUrl = "https://github.com/statping-ng/statping-ng.wiki"
var vue = `<template>
<div class="col-12">
<div class="row mb-4">
{{ range .Categories }}
<div class="col">
<h4 class="h4 mb-2">{{ .String }}</h4>
{{ range .Pages }}
<a @click.prevent='tab="{{.String}}"' class="d-block mb-1 text-link" href="#">{{.String}}</a>
{{end}}
</div>
{{end}}
</div>
<div class="col-12" v-if='tab === "Home"'>
<div v-pre>
{{html .Home.Data}}
</div>
</div>
{{ range .Pages }}
<div class="col-12" v-if='tab === "{{.String}}"'>
<h1 class="h1 mt-5 mb-5 text-muted">{{ .String }}</h1>
<span class="spacer"></span>
<div v-pre>
{{html .Data}}
</div>
</div>
{{end}}
<div class="col-12 shadow-md mt-5">
<div class="text-dim" v-pre>
{{html .Footer.Data}}
</div>
</div>
<div class="text-center small text-dim" v-pre>
Automatically generated from Statping's Wiki on {{.CreatedAt}}
</div>
</div>
</template>
<script>
export default {
name: 'Help',
data () {
return {
tab: "Home",
}
}
}
</script>
<style scoped>
IMG {
max-width: 80%;
alignment: center;
display: block;
}
</style>
`
var temp *template.Template
type Category struct {
String string
Pages []*Page
}
type Page struct {
String string
Data string
}
type Render struct {
Categories []*Category
Pages []*Page
Home *Page
Footer *Page
CreatedAt time.Time
}
func main() {
fmt.Println("RUNNING: ./source/generate_help.go")
fmt.Println("\n\nGenerating Help.vue from Statping's Wiki")
fmt.Println("Cloning ", wikiUrl)
cmd := exec.Command("git", "clone", wikiUrl)
cmd.Start()
cmd.Wait()
fmt.Println("Generating Help view from Wiki")
d, _ := ioutil.ReadFile("statping.wiki/_Sidebar.md")
var cats []*Category
var pages []*Page
scanner := bufio.NewScanner(strings.NewReader(string(d)))
var thisCategory *Category
for scanner.Scan() {
txt := scanner.Text()
if txt == "" {
continue
}
if txt[0:1] == "#" {
newCate := &Category{
String: txt[2:len(txt)],
}
if txt[2:len(txt)] == "Contact" || txt[2:len(txt)] == "Badges" {
continue
}
thisCategory = newCate
cats = append(cats, newCate)
}
if txt[0:2] == "[[" {
file := "statping.wiki/" + txt[2:len(txt)-2] + ".md"
file = strings.ReplaceAll(file, " ", "-")
page := &Page{
String: txt[2 : len(txt)-2],
Data: open(file),
}
pages = append(pages, page)
thisCategory.Pages = append(thisCategory.Pages, page)
}
}
home := &Page{
String: "Home",
Data: open("statping.wiki/Home.md"),
}
footer := &Page{
String: "Footer",
Data: open("statping.wiki/_Footer.md"),
}
w := bytes.NewBufferString("")
temp = template.New("wiki")
temp.Funcs(template.FuncMap{
"html": func(val string) template.HTML {
return template.HTML(val)
},
"fake": func(val string) template.HTML {
return template.HTML(`{{` + val + `}}`)
},
})
temp, _ = temp.Parse(vue)
temp.ExecuteTemplate(w, "wiki", Render{Categories: cats, Pages: pages, Home: home, Footer: footer, CreatedAt: time.Now().UTC()})
fmt.Println("Saving wiki page to: ./frontend/src/pages/Home.vue")
ioutil.WriteFile("../frontend/src/pages/Help.vue", w.Bytes(), os.FileMode(0755))
fmt.Println("Deleting statping wiki repo")
os.RemoveAll("statping.wiki")
}
func open(filename string) string {
htmlFlags := html.CommonFlags | html.HrefTargetBlank
opts := html.RendererOptions{Flags: htmlFlags}
renderer := html.NewRenderer(opts)
d, _ := ioutil.ReadFile(filename)
output := markdown.ToHTML(d, nil, renderer)
return string(output)
}