github.com/sercand/please@v13.4.0+incompatible/docs/template.go (about) 1 package main 2 3 import ( 4 "hash/adler32" 5 "io/ioutil" 6 "os" 7 "path" 8 "strings" 9 "text/template" 10 ) 11 12 var shapes = []string{ 13 "circle", 14 "hexagon", 15 "pentagon", 16 "square", 17 "triangle", 18 } 19 20 var colours = []string{ 21 "b", // blue 22 "c", // cyan 23 "g", // green 24 "p", // pink 25 "r", // red 26 "t", // turquoise 27 "v", // violet 28 "y", // yellow 29 } 30 31 var rotations = []string{ 32 "rotate1", 33 "rotate2", 34 "rotate3", 35 "rotate4", 36 "rotate5", 37 "rotate6", 38 "rotate7", 39 } 40 41 var pageTitles = map[string]string{ 42 "advanced.html": "Advanced Please", 43 "acknowledgements.html": "Acknowledgements", 44 "basics.html": "Please basics", 45 "cache.html": "Please caching system", 46 "commands.html": "Please commands", 47 "config.html": "Please config file reference", 48 "faq.html": "Please FAQ", 49 "index.html": "Please", 50 "intermediate.html": "Intermediate Please", 51 "language.html": "The Please BUILD language", 52 "lexicon.html": "Please Lexicon", 53 "pleasings.html": "Extra rules (aka. Pleasings)", 54 "quickstart.html": "Please quickstart", 55 "error.html": "plz op...", 56 } 57 58 func mustRead(filename string) string { 59 b, err := ioutil.ReadFile(filename) 60 if err != nil { 61 panic(err) 62 } 63 return string(b) 64 } 65 66 func main() { 67 filename := os.Args[2] 68 basename := path.Base(filename) 69 basenameIndex := int(adler32.Checksum([]byte(basename))) 70 modulo := func(s []string, i int) string { return s[(basenameIndex+i)%len(s)] } 71 random := func(x, min, max int) int { return (x*basenameIndex+min)%(max-min) + min } 72 funcs := template.FuncMap{ 73 "menuItem": func(s string) string { 74 if basename[:len(basename)-5] == s { 75 return ` class="selected"` 76 } 77 return "" 78 }, 79 "shape": func(i int) string { return modulo(shapes, i) }, 80 "colour": func(i int) string { return modulo(colours, i) }, 81 "rotate": func(i int) string { return modulo(rotations, i) }, 82 "random": func(x, min, max int) int { return (x*basenameIndex+min)%(max-min) + min }, 83 "randomoffset": func(x, min, max, step int) int { return x*step + random(x, min, max) }, 84 } 85 data := struct { 86 Title, Header, Contents string 87 SideImages []int 88 Player, IsIndex bool 89 }{ 90 Title: pageTitles[basename], 91 Header: mustRead(os.Args[1]), 92 Contents: mustRead(filename), 93 Player: basename == "faq.html", 94 IsIndex: basename == "index.html", 95 } 96 for i := 0; i <= strings.Count(data.Contents, "\n")/150; i++ { 97 // Awkwardly this seems to have to be a slice to range over in the template. 98 data.SideImages = append(data.SideImages, i+1) 99 } 100 101 tmpl := template.Must(template.New("tmpl").Funcs(funcs).Parse(mustRead(os.Args[1]))) 102 err := tmpl.Execute(os.Stdout, data) 103 if err != nil { 104 panic(err) 105 } 106 }