github.com/serge-v/zero@v1.0.2-0.20220911142406-af4b6a19e68a/examples/math144/main.go (about) 1 // Handler math144 prints match exercises pages. 2 package main 3 4 import ( 5 "bytes" 6 "fmt" 7 "log" 8 "math/rand" 9 "net/http" 10 "strings" 11 "time" 12 ) 13 14 const page = ` 15 <html> 16 <head> 17 <style> 18 body { 19 margin: 0; 20 padding: 0; 21 font: 14pt "Menlo"; 22 line-height: 1em; 23 } 24 pre { 25 font: 14pt "Menlo"; 26 line-height: 1em; 27 } 28 * { 29 box-sizing: border-box; 30 -moz-box-sizing: border-box; 31 } 32 .page { 33 width: 8.5in; 34 min-height: 11in; 35 padding: 0.8in; 36 margin: 1in auto; 37 border: 1px #D3D3D3 solid; 38 border-radius: 5px; 39 background: white; 40 } 41 .subpage { 42 padding: 0in; 43 border: 0px gray solid; 44 height: 9in; 45 } 46 47 @page { 48 size: Letter; 49 margin: 0; 50 } 51 @media print { 52 .page { 53 margin: 0; 54 border: initial; 55 border-radius: initial; 56 width: initial; 57 min-height: initial; 58 box-shadow: initial; 59 background: initial; 60 page-break-after: always; 61 } 62 } 63 </style> 64 </head> 65 <body> 66 <div class="book"> 67 {pages} 68 </div> 69 </body> 70 </html> 71 ` 72 73 func generateMultiplications(max int) string { 74 var text string 75 var b bytes.Buffer 76 for x := 0; x < 7; x++ { 77 for y := 0; y < 8; y++ { 78 fmt.Fprintf(&b, " %2d ", mathRand.Intn(max-3)+3) 79 } 80 fmt.Fprintln(&b) 81 for y := 0; y < 8; y++ { 82 fmt.Fprintf(&b, "x%2d ", mathRand.Intn(max-3)+3) 83 } 84 fmt.Fprintln(&b) 85 for y := 0; y < 8; y++ { 86 fmt.Fprintf(&b, "--- ") 87 } 88 for y := 0; y < 5; y++ { 89 fmt.Fprintln(&b) 90 } 91 } 92 text += `<div class="page"><div class="subpage"><pre>` + b.String() + `</pre></div></div>` 93 return text 94 } 95 96 func generateDivisions(max int) string { 97 var text string 98 var b bytes.Buffer 99 for x := 0; x < 8; x++ { 100 for y := 0; y < 6; y++ { 101 fmt.Fprintf(&b, " ---- ") 102 } 103 fmt.Fprintln(&b) 104 for y := 0; y < 6; y++ { 105 c := mathRand.Intn(max-2) + 2 106 d := mathRand.Intn(max-2) + 2 107 fmt.Fprintf(&b, " %2d) %2d ", c, c*d) 108 } 109 for y := 0; y < 5; y++ { 110 fmt.Fprintln(&b) 111 } 112 } 113 text += `<div class="page"><div class="subpage"><pre>` + b.String() + `</pre></div></div>` + "\n" 114 return text 115 } 116 117 var mathRand *rand.Rand 118 119 func init() { 120 seed := time.Now().Truncate(time.Hour * 24 * 7).Unix() // new seed every week 121 mathRand = rand.New(rand.NewSource(seed)) 122 } 123 124 func HandleMath144(w http.ResponseWriter, r *http.Request) { 125 var text string 126 for page := 0; page < 10; page++ { 127 text += generateMultiplications(13) 128 text += generateDivisions(13) 129 } 130 out := strings.Replace(page, "{pages}", text, 1) 131 fmt.Fprintln(w, out) 132 } 133 134 func main() { 135 http.HandleFunc("/", HandleMath144) 136 log.Fatal(http.ListenAndServe("127.0.0.1:8092", nil)) 137 }