mirror of
https://github.com/golang/go
synced 2024-11-24 22:57:57 -07:00
godoc: specify HTML page metadata with a JSON blob
This allows HTML pages to specify arbitrary data in a header: <!--{ "Title": "The page title", ... }--> replacing the old style comments: <!-- title The page title --> R=gri, rsc, r, bradfitz, dsymonds CC=golang-dev https://golang.org/cl/5532093
This commit is contained in:
parent
b71883e9b0
commit
7cb21a79a4
@ -1,4 +1,6 @@
|
|||||||
<!-- Defer, Panic, and Recover -->
|
<!--{
|
||||||
|
"Title": "Defer, Panic, and Recover"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml articles/defer_panic_recover.tmpl
|
tmpltohtml articles/defer_panic_recover.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Defer, Panic, and Recover -->
|
<!--{
|
||||||
|
"Title": "Defer, Panic, and Recover"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
<p>
|
<p>
|
||||||
Go has the usual mechanisms for control flow: if, for, switch, goto. It also
|
Go has the usual mechanisms for control flow: if, for, switch, goto. It also
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Error Handling and Go -->
|
<!--{
|
||||||
|
"Title": "Error Handling and Go"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml articles/error_handling.tmpl
|
tmpltohtml articles/error_handling.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Error Handling and Go -->
|
<!--{
|
||||||
|
"Title": "Error Handling and Go"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
<p>
|
<p>
|
||||||
If you have written any Go code you have probably encountered the built-in
|
If you have written any Go code you have probably encountered the built-in
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Slices: usage and internals -->
|
<!--{
|
||||||
|
"Title": "Slices: usage and internals"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml articles/slices_usage_and_internals.tmpl
|
tmpltohtml articles/slices_usage_and_internals.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Slices: usage and internals -->
|
<!--{
|
||||||
|
"Title": "Slices: usage and internals"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- How to Write Go Code -->
|
<!--{
|
||||||
|
"Title": "How to Write Go Code"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2 id="Introduction">Introduction</h2>
|
<h2 id="Introduction">Introduction</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Using Mercurial Queues with Codereview -->
|
<!--{
|
||||||
|
"Title": "Using Mercurial Queues with Codereview"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2 id="Introduction">Introduction</h2>
|
<h2 id="Introduction">Introduction</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- title Community -->
|
<!--{
|
||||||
|
"Title": "Community"
|
||||||
|
}-->
|
||||||
|
|
||||||
<div class="left-column">
|
<div class="left-column">
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- title Contributing -->
|
<!--{
|
||||||
|
"Title": "Contributing"
|
||||||
|
}-->
|
||||||
|
|
||||||
<div class="left-column">
|
<div class="left-column">
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Contribution Guidelines -->
|
<!--{
|
||||||
|
"Title": "Contribution Guidelines"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2 id="Introduction">Introduction</h2>
|
<h2 id="Introduction">Introduction</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- title Debugging Go Code with GDB -->
|
<!--{
|
||||||
|
"Title": "Debugging Go Code with GDB"
|
||||||
|
}-->
|
||||||
|
|
||||||
<p><i>
|
<p><i>
|
||||||
This applies to the 6g toolchain. Gccgo has native gdb support. Besides this
|
This applies to the 6g toolchain. Gccgo has native gdb support. Besides this
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- title Documentation -->
|
<!--{
|
||||||
|
"Title": "Documentation"
|
||||||
|
}-->
|
||||||
|
|
||||||
<div class="left-column">
|
<div class="left-column">
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Effective Go -->
|
<!--{
|
||||||
|
"Title": "Effective Go"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml effective_go.tmpl
|
tmpltohtml effective_go.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Effective Go -->
|
<!--{
|
||||||
|
"Title": "Effective Go"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
|
|
||||||
<h2 id="introduction">Introduction</h2>
|
<h2 id="introduction">Introduction</h2>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Contributing to the gccgo frontend -->
|
<!--{
|
||||||
|
"Title": "Contributing to the gccgo frontend"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Setting up and using gccgo -->
|
<!--{
|
||||||
|
"Title": "Setting up and using gccgo"
|
||||||
|
}-->
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
This document explains how to use <code>gccgo</code>, a compiler for
|
This document explains how to use <code>gccgo</code>, a compiler for
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Go 1 Release Notes -->
|
<!--{
|
||||||
|
"Title": "Go 1 Release Notes"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml go1.tmpl
|
tmpltohtml go1.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Go 1 Release Notes -->
|
<!--{
|
||||||
|
"Title": "Go 1 Release Notes"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
|
|
||||||
<h2 id="introduction">Introduction to Go 1</h2>
|
<h2 id="introduction">Introduction to Go 1</h2>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- FAQ -->
|
<!--{
|
||||||
|
"Title": "FAQ"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2 id="Origins">Origins</h2>
|
<h2 id="Origins">Origins</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Go For C++ Programmers -->
|
<!--{
|
||||||
|
"Title": "Go For C++ Programmers"
|
||||||
|
}-->
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Go is a systems programming language intended to be a general-purpose
|
Go is a systems programming language intended to be a general-purpose
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<!-- The Go Memory Model -->
|
<!--{
|
||||||
<!-- subtitle Version of June 10, 2011 -->
|
"Title": "The Go Memory Model",
|
||||||
|
"Subtitle": "Version of June 10, 2011"
|
||||||
|
}-->
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
p.rule {
|
p.rule {
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
<!-- title The Go Programming Language Specification -->
|
<!--{
|
||||||
<!-- subtitle Version of January 13, 2012 -->
|
"Title": "The Go Programming Language Specification",
|
||||||
|
"Subtitle": "Version of January 13, 2012"
|
||||||
|
}-->
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
TODO
|
TODO
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- A Tutorial for the Go Programming Language -->
|
<!--{
|
||||||
|
"Title": "A Tutorial for the Go Programming Language"
|
||||||
|
}-->
|
||||||
<!--
|
<!--
|
||||||
DO NOT EDIT: created by
|
DO NOT EDIT: created by
|
||||||
tmpltohtml go_tutorial.tmpl
|
tmpltohtml go_tutorial.tmpl
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- A Tutorial for the Go Programming Language -->
|
<!--{
|
||||||
|
"Title": "A Tutorial for the Go Programming Language"
|
||||||
|
}-->
|
||||||
{{donotedit}}
|
{{donotedit}}
|
||||||
|
|
||||||
<h2>Introduction</h2>
|
<h2>Introduction</h2>
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- Getting Started -->
|
<!--{
|
||||||
|
"Title": "Getting Started"
|
||||||
|
}-->
|
||||||
|
|
||||||
<h2 id="introduction">Introduction</h2>
|
<h2 id="introduction">Introduction</h2>
|
||||||
|
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
<!-- About the Go Playground -->
|
<!--{
|
||||||
|
"Title": "About the Go Playground"
|
||||||
|
}-->
|
||||||
|
|
||||||
<div class="left-column">
|
<div class="left-column">
|
||||||
<p>
|
<p>
|
||||||
|
@ -6,6 +6,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"go/ast"
|
"go/ast"
|
||||||
@ -692,17 +693,14 @@ func serveText(w http.ResponseWriter, text []byte) {
|
|||||||
// Files
|
// Files
|
||||||
|
|
||||||
var (
|
var (
|
||||||
titleRx = regexp.MustCompile(`<!-- title ([^\-]*)-->`)
|
doctype = []byte("<!DOCTYPE ")
|
||||||
subtitleRx = regexp.MustCompile(`<!-- subtitle ([^\-]*)-->`)
|
jsonStart = []byte("<!--{")
|
||||||
firstCommentRx = regexp.MustCompile(`<!--([^\-]*)-->`)
|
jsonEnd = []byte("}-->")
|
||||||
)
|
)
|
||||||
|
|
||||||
func extractString(src []byte, rx *regexp.Regexp) (s string) {
|
type Metadata struct {
|
||||||
m := rx.FindSubmatch(src)
|
Title string
|
||||||
if m != nil {
|
Subtitle string
|
||||||
s = strings.TrimSpace(string(m[1]))
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func serveHTMLDoc(w http.ResponseWriter, r *http.Request, abspath, relpath string) {
|
func serveHTMLDoc(w http.ResponseWriter, r *http.Request, abspath, relpath string) {
|
||||||
@ -716,11 +714,23 @@ func serveHTMLDoc(w http.ResponseWriter, r *http.Request, abspath, relpath strin
|
|||||||
|
|
||||||
// if it begins with "<!DOCTYPE " assume it is standalone
|
// if it begins with "<!DOCTYPE " assume it is standalone
|
||||||
// html that doesn't need the template wrapping.
|
// html that doesn't need the template wrapping.
|
||||||
if bytes.HasPrefix(src, []byte("<!DOCTYPE ")) {
|
if bytes.HasPrefix(src, doctype) {
|
||||||
w.Write(src)
|
w.Write(src)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if it begins with a JSON blob, read in the metadata.
|
||||||
|
var meta Metadata
|
||||||
|
if bytes.HasPrefix(src, jsonStart) {
|
||||||
|
if end := bytes.Index(src, jsonEnd); end > -1 {
|
||||||
|
b := src[len(jsonStart)-1 : end+1] // drop leading <!-- and include trailing }
|
||||||
|
if err := json.Unmarshal(b, &meta); err != nil {
|
||||||
|
log.Printf("decoding metadata for %s: %v", relpath, err)
|
||||||
|
}
|
||||||
|
src = src[end+len(jsonEnd):]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// if it's the language spec, add tags to EBNF productions
|
// if it's the language spec, add tags to EBNF productions
|
||||||
if strings.HasSuffix(abspath, "go_spec.html") {
|
if strings.HasSuffix(abspath, "go_spec.html") {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
@ -728,15 +738,7 @@ func serveHTMLDoc(w http.ResponseWriter, r *http.Request, abspath, relpath strin
|
|||||||
src = buf.Bytes()
|
src = buf.Bytes()
|
||||||
}
|
}
|
||||||
|
|
||||||
// get title and subtitle, if any
|
servePage(w, meta.Title, meta.Subtitle, "", src)
|
||||||
title := extractString(src, titleRx)
|
|
||||||
if title == "" {
|
|
||||||
// no title found; try first comment for backward-compatibility
|
|
||||||
title = extractString(src, firstCommentRx)
|
|
||||||
}
|
|
||||||
subtitle := extractString(src, subtitleRx)
|
|
||||||
|
|
||||||
servePage(w, title, subtitle, "", src)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func applyTemplate(t *template.Template, name string, data interface{}) []byte {
|
func applyTemplate(t *template.Template, name string, data interface{}) []byte {
|
||||||
|
Loading…
Reference in New Issue
Block a user