hunterlong/statup

View on GitHub
source/generate_help.go

Summary

Maintainability
A
1 hr
Test Coverage
// +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/statping.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)
}