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  }