From 6be58e9f1d700093d01f61876b2abb05887fe950 Mon Sep 17 00:00:00 2001
From: Mark McGranaghan <mmcgrana@gmail.com>
Date: Mon, 1 Oct 2012 18:15:22 -0700
Subject: [PATCH] 3 second build

---
 tool/build-html              |  1 +
 tool/src/build-html-inner.go | 26 +++++++++++++++++++++++---
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/tool/build-html b/tool/build-html
index 75b38a3..d9d0f83 100755
--- a/tool/build-html
+++ b/tool/build-html
@@ -1,3 +1,4 @@
 #!/bin/bash
 
+mkdir -p /tmp/gbe-book-cache
 ls src/0*/*.{go,sh} | xargs tool/build-html-inner > build/go-by-example.html
diff --git a/tool/src/build-html-inner.go b/tool/src/build-html-inner.go
index f3df19e..7c4f629 100644
--- a/tool/src/build-html-inner.go
+++ b/tool/src/build-html-inner.go
@@ -1,6 +1,8 @@
 package main
 
 import (
+    "crypto/sha1"
+    "encoding/hex"
     "fmt"
     "github.com/russross/blackfriday"
     "io/ioutil"
@@ -16,7 +18,7 @@ func check(err error) {
     }
 }
 
-func render(bin string, arg []string, src string) string {
+func render(bin string, arg []string, src string) []byte {
     cmd := exec.Command(bin, arg...)
     in, _ := cmd.StdinPipe()
     out, _ := cmd.StdoutPipe()
@@ -26,7 +28,25 @@ func render(bin string, arg []string, src string) string {
     bytes, _ := ioutil.ReadAll(out)
     err := cmd.Wait()
     check(err)
-    return string(bytes)
+    return bytes
+}
+
+func sha1Sum(s string) string {
+    h := sha1.New()
+    h.Write([]byte(s))
+    b := h.Sum(nil)
+    return hex.EncodeToString(b)
+}
+func cachedRender(bin string, arg []string, src string) string {
+    cachePath := "/tmp/gbe-book-cache/pygmentize" + "-" + strings.Join(arg, "-") + "-" + sha1Sum(src)
+    cacheBytes, cacheErr := ioutil.ReadFile(cachePath)
+    if cacheErr == nil {
+        return string(cacheBytes)
+    }
+    renderBytes := render(bin, arg, src)
+    writeErr := ioutil.WriteFile(cachePath, renderBytes, 0600)
+    check(writeErr)
+    return string(renderBytes)
 }
 
 func readLines(path string) []string {
@@ -148,7 +168,7 @@ func main() {
                 seg.docsRendered = string(blackfriday.MarkdownCommon([]byte(seg.docs)))
             }
             if seg.code != "" {
-                seg.codeRendered = render("/usr/local/bin/pygmentize", []string{"-l", lexer, "-f", "html"}, seg.code)
+                seg.codeRendered = cachedRender("/usr/local/bin/pygmentize", []string{"-l", lexer, "-f", "html"}, seg.code)
             }
         }