aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2010-03-30 17:37:42 -0700
committerRobert Griesemer <gri@golang.org>2010-03-30 17:37:42 -0700
commite8e4987ba3212fecf8fd936d55e212c247ba4026 (patch)
tree791eee90f4e98f6d6ea9f06a12134dcd22cdcf20
parent7ecefdc03f2ef38ce6df9bf65e11ae1b8e0b0b8e (diff)
downloadgo-e8e4987ba3212fecf8fd936d55e212c247ba4026.tar.gz
go-e8e4987ba3212fecf8fd936d55e212c247ba4026.zip
godoc: support for title and subtitle headers when serving .html docs
and use it to show version (date) of go spec Fixes #68. R=rsc CC=golang-dev, r https://golang.org/cl/848042
-rw-r--r--doc/go_spec.html3
-rw-r--r--doc/style.css5
-rw-r--r--lib/godoc/godoc.html9
-rw-r--r--src/cmd/godoc/godoc.go42
-rw-r--r--src/cmd/godoc/main.go2
5 files changed, 42 insertions, 19 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html
index 003bbdc03a..84480f6e8a 100644
--- a/doc/go_spec.html
+++ b/doc/go_spec.html
@@ -1,4 +1,5 @@
-<!-- The Go Programming Language Specification -->
+<!-- title The Go Programming Language Specification -->
+<!-- subtitle Version of March 25, 2010 -->
<!--
Todo
diff --git a/doc/style.css b/doc/style.css
index 597e70bb34..38cf68d61d 100644
--- a/doc/style.css
+++ b/doc/style.css
@@ -198,6 +198,11 @@ span.highlight {
background-color: #ffffa0;
}
+span.subtitle {
+ font-weight: bold;
+ font-size: medium;
+}
+
/* same style as for gettingStarted */
#menu {
margin-top: 1.5em;
diff --git a/lib/godoc/godoc.html b/lib/godoc/godoc.html
index 99cd55eae6..dd21799810 100644
--- a/lib/godoc/godoc.html
+++ b/lib/godoc/godoc.html
@@ -133,11 +133,18 @@
</div>
{.end}
- <h1 id="generatedHeader">{Title|html-esc}</h1>
+ {.section Title}
+ <h1 id="generatedHeader">{@|html-esc}</h1>
+ {.end}
+ {.section Subtitle}
+ <span class="subtitle">{@|html-esc}</span>
+ {.end}
+ <p>
<!-- The Table of Contents is automatically inserted in this <div>.
Do not delete this <div>. -->
<div id="nav"></div>
+ </p>
<!-- Content is HTML-escaped elsewhere -->
{Content}
diff --git a/src/cmd/godoc/godoc.go b/src/cmd/godoc/godoc.go
index 62265cf6a8..f302f8c7e9 100644
--- a/src/cmd/godoc/godoc.go
+++ b/src/cmd/godoc/godoc.go
@@ -19,6 +19,7 @@ import (
"log"
"os"
pathutil "path"
+ "regexp"
"runtime"
"strings"
"sync"
@@ -874,9 +875,10 @@ func readTemplates() {
// ----------------------------------------------------------------------------
// Generic HTML wrapper
-func servePage(c *http.Conn, title, query string, content []byte) {
+func servePage(c *http.Conn, title, subtitle, query string, content []byte) {
type Data struct {
Title string
+ Subtitle string
PkgRoots []string
Timestamp uint64 // int64 to be compatible with os.Dir.Mtime_ns
Query string
@@ -888,6 +890,7 @@ func servePage(c *http.Conn, title, query string, content []byte) {
_, ts := fsTree.get()
d := Data{
Title: title,
+ Subtitle: subtitle,
PkgRoots: fsMap.PrefixList(),
Timestamp: uint64(ts) * 1e9, // timestamp in ns
Query: query,
@@ -912,16 +915,16 @@ func serveText(c *http.Conn, text []byte) {
// Files
var (
- tagBegin = []byte("<!--")
- tagEnd = []byte("-->")
+ titleRx = regexp.MustCompile(`<!-- title ([^\-]*)-->`)
+ subtitleRx = regexp.MustCompile(`<!-- subtitle ([^\-]*)-->`)
+ firstCommentRx = regexp.MustCompile(`<!--([^\-]*)-->`)
)
-// commentText returns the text of the first HTML comment in src.
-func commentText(src []byte) (text string) {
- i := bytes.Index(src, tagBegin)
- j := bytes.Index(src, tagEnd)
- if i >= 0 && j >= i+len(tagBegin) {
- text = string(bytes.TrimSpace(src[i+len(tagBegin) : j]))
+
+func extractString(src []byte, rx *regexp.Regexp) (s string) {
+ m := rx.Execute(src)
+ if len(m) >= 4 {
+ s = strings.TrimSpace(string(src[m[2]:m[3]]))
}
return
}
@@ -950,8 +953,15 @@ func serveHTMLDoc(c *http.Conn, r *http.Request, abspath, relpath string) {
src = buf.Bytes()
}
- title := commentText(src)
- servePage(c, title, "", src)
+ // get title and subtitle, if any
+ title := extractString(src, titleRx)
+ if title == "" {
+ // no title found; try first comment for backward-compatibility
+ title = extractString(src, firstCommentRx)
+ }
+ subtitle := extractString(src, subtitleRx)
+
+ servePage(c, title, subtitle, "", src)
}
@@ -983,7 +993,7 @@ func serveGoSource(c *http.Conn, r *http.Request, abspath, relpath string) {
info := &SourceInfo{buf.Bytes(), styler.mapping()}
contents := applyTemplate(sourceHTML, "sourceHTML", info)
- servePage(c, "Source file "+relpath, "", contents)
+ servePage(c, "Source file "+relpath, "", "", contents)
}
@@ -1056,7 +1066,7 @@ func serveTextFile(c *http.Conn, r *http.Request, abspath, relpath string) {
template.HTMLEscape(&buf, src)
fmt.Fprintln(&buf, "</pre>")
- servePage(c, "Text file "+relpath, "", buf.Bytes())
+ servePage(c, "Text file "+relpath, "", "", buf.Bytes())
}
@@ -1079,7 +1089,7 @@ func serveDirectory(c *http.Conn, r *http.Request, abspath, relpath string) {
}
contents := applyTemplate(dirlistHTML, "dirlistHTML", list)
- servePage(c, "Directory "+relpath, "", contents)
+ servePage(c, "Directory "+relpath, "", "", contents)
}
@@ -1326,7 +1336,7 @@ func (h *httpHandler) ServeHTTP(c *http.Conn, r *http.Request) {
}
contents := applyTemplate(packageHTML, "packageHTML", info)
- servePage(c, title, "", contents)
+ servePage(c, title, "", "", contents)
}
@@ -1373,7 +1383,7 @@ func search(c *http.Conn, r *http.Request) {
}
contents := applyTemplate(searchHTML, "searchHTML", result)
- servePage(c, title, query, contents)
+ servePage(c, title, "", query, contents)
}
diff --git a/src/cmd/godoc/main.go b/src/cmd/godoc/main.go
index 0ede0dcc94..7a9279a2f4 100644
--- a/src/cmd/godoc/main.go
+++ b/src/cmd/godoc/main.go
@@ -66,7 +66,7 @@ var (
func serveError(c *http.Conn, r *http.Request, relpath string, err os.Error) {
contents := applyTemplate(errorHTML, "errorHTML", err) // err may contain an absolute path!
- servePage(c, "File "+relpath, "", contents)
+ servePage(c, "File "+relpath, "", "", contents)
}