diff --git a/README.md b/README.md
index 07b7134..3d86093 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@ This repo contains:
* `src`: Go and Bash source code for the site
* `meta`: metadata used to generate the site
* `tool`: toolchain used to generate the site
-* `style`: CSS for the site
+* `template`: HTML templates and CSS for the site
The site is built by extracting the code & comments from
the `.go` and `.sh` source files in `src` and rendering
diff --git a/template/chapter.tmpl b/template/chapter.tmpl
new file mode 100644
index 0000000..28f65ee
--- /dev/null
+++ b/template/chapter.tmpl
@@ -0,0 +1,22 @@
+
+
+
+
+ Go by Example: {{.Name}}
+
+
+
+
+
+
+ {{range .Segs}}
+
+ {{.DocsRendered}}
+ {{.CodeRendered}}
+
+ {{end}}
+
+
+
+
+
diff --git a/template/index.tmpl b/template/index.tmpl
new file mode 100644
index 0000000..0d44024
--- /dev/null
+++ b/template/index.tmpl
@@ -0,0 +1,18 @@
+
+
+
+
+ Go by Example
+
+
+
+
+
+
diff --git a/style/site.css b/template/site.css
similarity index 100%
rename from style/site.css
rename to template/site.css
diff --git a/tool/generate.go b/tool/generate.go
index 73f8b20..7639167 100644
--- a/tool/generate.go
+++ b/tool/generate.go
@@ -11,6 +11,7 @@ import (
"path/filepath"
"regexp"
"strings"
+ "text/template"
)
var cacheDir = "/tmp/gobyexample-cache"
@@ -103,18 +104,19 @@ var docsPat = regexp.MustCompile("^\\s*(\\/\\/|#)\\s")
var todoPat = regexp.MustCompile("\\/\\/ todo: ")
type Seg struct {
- docs, code, docsRendered, codeRendered string
+ Docs, DocsRendered string
+ Code, CodeRendered, CodeClasses string
}
type Chapter struct {
- id, name string
- segs []*Seg
+ Id, Name string
+ Segs []*Seg
}
func parseSegs(sourcePath string) []*Seg {
lines := readLines(sourcePath)
segs := []*Seg{}
- segs = append(segs, &Seg{code: "", docs: ""})
+ segs = append(segs, &Seg{Code: "", Docs: ""})
lastSeen := ""
for _, line := range lines {
if line == "" {
@@ -127,44 +129,44 @@ func parseSegs(sourcePath string) []*Seg {
matchDocs := docsPat.MatchString(line)
matchCode := !matchDocs
lastSeg := segs[len(segs)-1]
- newDocs := (lastSeen == "") || ((lastSeen != "docs") && (lastSeg.docs != ""))
- newCode := (lastSeen == "") || ((lastSeen != "code") && (lastSeg.code != ""))
+ newDocs := (lastSeen == "") || ((lastSeen != "docs") && (lastSeg.Docs != ""))
+ newCode := (lastSeen == "") || ((lastSeen != "code") && (lastSeg.Code != ""))
if newDocs || newCode {
debug("NEWSEG")
}
if matchDocs {
trimmed := docsPat.ReplaceAllString(line, "")
if newDocs {
- newSeg := Seg{docs: trimmed, code: ""}
+ newSeg := Seg{Docs: trimmed, Code: ""}
segs = append(segs, &newSeg)
} else {
- lastSeg.docs = lastSeg.docs + "\n" + trimmed
+ lastSeg.Docs = lastSeg.Docs + "\n" + trimmed
}
debug("DOCS: " + line)
lastSeen = "docs"
} else if matchCode {
if newCode {
- newSeg := Seg{docs: "", code: line}
+ newSeg := Seg{Docs: "", Code: line}
segs = append(segs, &newSeg)
} else {
- lastSeg.code = lastSeg.code + "\n" + line
+ lastSeg.Code = lastSeg.Code + "\n" + line
}
debug("CODE: " + line)
lastSeen = "code"
}
}
- return append(segs, &Seg{code: "", docs: ""})
+ return append(segs, &Seg{Code: "", Docs: ""})
}
func parseAndRenderSegs(sourcePath string) []*Seg {
segs := parseSegs(sourcePath)
lexer := whichLexer(sourcePath)
for _, seg := range segs {
- if seg.docs != "" {
- seg.docsRendered = markdown(seg.docs)
+ if seg.Docs != "" {
+ seg.DocsRendered = markdown(seg.Docs)
}
- if seg.code != "" {
- seg.codeRendered = cachedPygmentize(lexer, seg.code)
+ if seg.Code != "" {
+ seg.CodeRendered = cachedPygmentize(lexer, seg.Code)
}
}
return segs
@@ -175,9 +177,9 @@ func parseChapters() []*Chapter {
chapters := make([]*Chapter, 0)
for _, chapterId := range chapterLines {
if (chapterId != "") && !strings.HasPrefix(chapterId, "#") {
- chapter := Chapter{id: chapterId}
+ chapter := Chapter{Id: chapterId}
chapterLines := readLines("src/" + chapterId + "/" + chapterId + ".go")
- chapter.name = chapterLines[0][6:]
+ chapter.Name = chapterLines[0][6:]
chapterPath := "src/" + chapterId
sourcePaths := mustGlob(chapterPath + "/*")
segs := []*Seg{}
@@ -185,7 +187,7 @@ func parseChapters() []*Chapter {
sourceSegs := parseAndRenderSegs(sourcePath)
segs = append(segs, sourceSegs...)
}
- chapter.segs = segs
+ chapter.Segs = segs
chapters = append(chapters, &chapter)
}
}
@@ -193,56 +195,28 @@ func parseChapters() []*Chapter {
}
func renderIndex(chapters []*Chapter) {
+ indexTmpl := template.New("index")
+ _, err := indexTmpl.Parse(mustReadFile("template/index.tmpl"))
+ check(err)
indexF, err := os.Create(siteDir + "/index.html")
check(err)
- fmt.Fprint(indexF,
- `
-
-
-
- Go by Example
-
-
-
-
-
Go by Example
-
`)
-
- for _, chapter := range chapters {
- fmt.Fprintf(indexF, `%s `, chapter.id, chapter.name)
- }
- fmt.Fprint(indexF, ` `)
+ indexTmpl.Execute(indexF, chapters)
}
func renderChapters(chapters []*Chapter) {
+ chapterTmpl := template.New("chapter")
+ _, err := chapterTmpl.Parse(mustReadFile("template/chapter.tmpl"))
+ check(err)
for _, chapter := range chapters {
- chapterF, err := os.Create(siteDir + "/" + chapter.id + ".html")
- check(err)
- fmt.Fprintf(chapterF,
- `
-
-
-
- Go by Example: %s
-
-
-
-
-
`,
- chapter.name, chapter.id)
- for _, seg := range chapter.segs {
- codeClasses := "code"
- if seg.code == "" {
- codeClasses = codeClasses + " empty"
+ for _, seg := range chapter.Segs {
+ seg.CodeClasses = "code"
+ if seg.Code == "" {
+ seg.CodeClasses = seg.CodeClasses + " empty"
}
- fmt.Fprintf(chapterF,
- `
- %s
- %s
- `,
- seg.docsRendered, codeClasses, seg.codeRendered)
}
- fmt.Fprint(chapterF, `
`)
+ chapterF, err := os.Create(siteDir + "/" + chapter.Id + ".html")
+ check(err)
+ chapterTmpl.Execute(chapterF, chapter)
}
}