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  }