From 0c18c9689a4330d907621c53708d7e9f45dcd244 Mon Sep 17 00:00:00 2001 From: Mark McGranaghan Date: Wed, 11 Sep 2013 08:40:30 -0700 Subject: [PATCH] initial changes to generate play buttons, ref #37 --- server.go | 1 + templates/example.tmpl | 1 + templates/play.png | Bin 0 -> 30822 bytes tools/generate.go | 80 ++++++++++++++++++++++++++++++++--------- 4 files changed, 66 insertions(+), 16 deletions(-) create mode 100644 templates/play.png diff --git a/server.go b/server.go index 4b7164c..fc420c8 100644 --- a/server.go +++ b/server.go @@ -142,6 +142,7 @@ func router() *mux.Router { router := mux.NewRouter() router.HandleFunc("/", static).Methods("GET") router.HandleFunc("/favicon.ico", static).Methods("GET") + router.HandleFunc("/play.png", static).Methods("GET") router.HandleFunc("/site.css", static).Methods("GET") entries, err := ioutil.ReadDir("public") check(err) diff --git a/templates/example.tmpl b/templates/example.tmpl index 3ad84f3..66dc55d 100644 --- a/templates/example.tmpl +++ b/templates/example.tmpl @@ -20,6 +20,7 @@

Go by Example: {{.Name}}

+ {{range .Segs}} {{range .}} diff --git a/templates/play.png b/templates/play.png new file mode 100644 index 0000000000000000000000000000000000000000..b450204efaa361506629a5d162f57b36575e0b39 GIT binary patch literal 30822 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 OhLDj^6t5OF4*DM{V>7G( literal 0 HcmV?d00001 diff --git a/tools/generate.go b/tools/generate.go index 3aceaa3..1286bb5 100644 --- a/tools/generate.go +++ b/tools/generate.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/russross/blackfriday" "io/ioutil" + "net/http" "os" "os/exec" "path/filepath" @@ -123,13 +124,43 @@ type Seg struct { } type Example struct { - Id, Name string - Segs [][]*Seg - NextExample *Example + Id, Name string + GoCode, GoCodeHash, UrlHash string + Segs [][]*Seg + NextExample *Example } -func parseSegs(sourcePath string) []*Seg { +func parseHashFile(sourcePath string) (string, string) { + var codehash,urlkey string lines := readLines(sourcePath) + for idx,line := range lines { + switch idx { + case 0: + codehash = line + case 1: + urlkey = line + } + } + return codehash,urlkey +} + +func resetUrlHashFile(codehash, code, sourcePath string) string { + payload := strings.NewReader(code) + resp, err := http.Post("http://play.golang.org/share", "text/plain", payload) + if err != nil { + // handle error + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + urlkey := string(body) + data := fmt.Sprintf("%s\n%s",codehash,urlkey) + ioutil.WriteFile(sourcePath,[]byte(data),0644) + return urlkey +} + +func parseSegs(sourcePath string) ([]*Seg, string) { + lines := readLines(sourcePath) + filecontent := strings.Join(lines, "\n") segs := []*Seg{} lastSeen := "" for _, line := range lines { @@ -172,21 +203,25 @@ func parseSegs(sourcePath string) []*Seg { seg.CodeEmpty = (seg.Code == "") seg.CodeLeading = (i < (len(segs) - 1)) } - return segs + return segs,filecontent } -func parseAndRenderSegs(sourcePath string) []*Seg { - segs := parseSegs(sourcePath) +func parseAndRenderSegs(sourcePath string) ([]*Seg, string) { + segs,filecontent := parseSegs(sourcePath) lexer := whichLexer(sourcePath) for _, seg := range segs { - if seg.Docs != "" { - seg.DocsRendered = markdown(seg.Docs) - } - if seg.Code != "" { - seg.CodeRendered = cachedPygmentize(lexer, seg.Code) - } + if seg.Docs != "" { + seg.DocsRendered = markdown(seg.Docs) + } + if seg.Code != "" { + seg.CodeRendered = cachedPygmentize(lexer, seg.Code) + } } - return segs + // we are only interested in the 'go' code to pass to play.golang.org + if lexer != "go" { + filecontent = "" + } + return segs,filecontent } func parseExamples() []*Example { @@ -204,9 +239,21 @@ func parseExamples() []*Example { example.Segs = make([][]*Seg, 0) sourcePaths := mustGlob("examples/" + exampleId + "/*") for _, sourcePath := range sourcePaths { - sourceSegs := parseAndRenderSegs(sourcePath) - example.Segs = append(example.Segs, sourceSegs) + switch strings.HasSuffix(sourcePath,".hash") { + case true: + example.GoCodeHash,example.UrlHash = parseHashFile(sourcePath) + default: + sourceSegs,filecontents := parseAndRenderSegs(sourcePath) + if (filecontents != "") { + example.GoCode = filecontents + } + example.Segs = append(example.Segs, sourceSegs) + } } + newCodeHash := sha1Sum(example.GoCode) + if (example.GoCodeHash != newCodeHash) { + example.UrlHash = resetUrlHashFile(newCodeHash,example.GoCode,"examples/"+example.Id+"/"+ example.Id + ".hash") + } examples = append(examples, &example) } } @@ -242,6 +289,7 @@ func main() { copyFile("templates/site.css", siteDir+"/site.css") copyFile("templates/favicon.ico", siteDir+"/favicon.ico") copyFile("templates/404.html", siteDir+"/404.html") + copyFile("templates/play.png", siteDir+"/play.png") examples := parseExamples() renderIndex(examples) renderExamples(examples)