]> Cypherpunks repositories - gostls13.git/commitdiff
doc/codelab: use new template package
authorAndrew Gerrand <adg@golang.org>
Thu, 18 Aug 2011 00:38:08 +0000 (10:38 +1000)
committerAndrew Gerrand <adg@golang.org>
Thu, 18 Aug 2011 00:38:08 +0000 (10:38 +1000)
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/4897048

doc/codelab/wiki/edit.html
doc/codelab/wiki/final-noclosure.go
doc/codelab/wiki/final-noerror.go
doc/codelab/wiki/final.go
doc/codelab/wiki/htmlify.go
doc/codelab/wiki/index.html
doc/codelab/wiki/srcextract.go
doc/codelab/wiki/view.html
doc/codelab/wiki/wiki.html

index 7a5768ce96c5f9907b25adc803445aab6e942815..c14953b17ba4d9b4141fa9680ae944395dce567a 100644 (file)
@@ -1,6 +1,6 @@
-<h1>Editing {Title}</h1>
+<h1>Editing {{.Title |html}}</h1>
 
-<form action="/save/{Title}" method="POST">
-<div><textarea name="body" rows="20" cols="80">{Body|html}</textarea></div>
+<form action="/save/{{.Title |html}}" method="POST">
+<div><textarea name="body" rows="20" cols="80">{{printf "%s" .Body |html}}</textarea></div>
 <div><input type="submit" value="Save"></div>
 </form>
index 2e1c3ec86cbc9c2478ff31a10561ea19bd619371..067f502c6bb5ecd3e41098ac26851b270fac081f 100644 (file)
@@ -3,9 +3,9 @@ package main
 import (
        "http"
        "io/ioutil"
-       "old/template"
        "os"
        "regexp"
+       "template"
 )
 
 type Page struct {
@@ -68,7 +68,7 @@ func saveHandler(w http.ResponseWriter, r *http.Request) {
 }
 
 func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
-       t, err := template.ParseFile(tmpl+".html", nil)
+       t, err := template.ParseFile(tmpl+".html")
        if err != nil {
                http.Error(w, err.String(), http.StatusInternalServerError)
                return
index d9f5350de1ae579ffa4e67296bd06f401931c655..b8edbee9bdfaa90d8eabc2d4b36cae65287d826b 100644 (file)
@@ -3,8 +3,8 @@ package main
 import (
        "http"
        "io/ioutil"
-       "old/template"
        "os"
+       "template"
 )
 
 type Page struct {
@@ -34,14 +34,14 @@ func editHandler(w http.ResponseWriter, r *http.Request) {
        if err != nil {
                p = &Page{Title: title}
        }
-       t, _ := template.ParseFile("edit.html", nil)
+       t, _ := template.ParseFile("edit.html")
        t.Execute(w, p)
 }
 
 func viewHandler(w http.ResponseWriter, r *http.Request) {
        title := r.URL.Path[lenPath:]
        p, _ := loadPage(title)
-       t, _ := template.ParseFile("view.html", nil)
+       t, _ := template.ParseFile("view.html")
        t.Execute(w, p)
 }
 
index 3d79d6e4827cd738ee4bde0e2a941fbbc32cd17f..47a4c3473ea86246e52f2f474a148e6a7b195bcf 100644 (file)
@@ -3,9 +3,9 @@ package main
 import (
        "http"
        "io/ioutil"
-       "old/template"
        "os"
        "regexp"
+       "template"
 )
 
 type Page struct {
@@ -59,7 +59,8 @@ var templates = make(map[string]*template.Template)
 
 func init() {
        for _, tmpl := range []string{"edit", "view"} {
-               templates[tmpl] = template.MustParseFile(tmpl+".html", nil)
+               t := template.Must(template.ParseFile(tmpl+".html"))
+               templates[tmpl] = t
        }
 }
 
index a89d6b7f34b27fa2c27086707f2d74b86939674a..9e7605b92111b50cd4ea0a517b0afa88da4a9dad 100644 (file)
@@ -1,12 +1,12 @@
 package main
 
 import (
-       "old/template"
+       "template"
        "os"
        "io/ioutil"
 )
 
 func main() {
        b, _ := ioutil.ReadAll(os.Stdin)
-       template.HTMLFormatter(os.Stdout, "", b)
+       template.HTMLEscape(os.Stdout, b)
 }
index 103986a82b1ddfa2940b5e3c7e29453e98dfb69c..50e9db5e990b468081d0d0247a60af9d53d9ece7 100644 (file)
@@ -7,7 +7,7 @@ Covered in this codelab:
 <ul>
 <li>Creating a data structure with load and save methods</li>
 <li>Using the <code>http</code> package to build web applications
-<li>Using the <code>old/template</code> package to process HTML templates</li>
+<li>Using the <code>template</code> package to process HTML templates</li>
 <li>Using the <code>regexp</code> package to validate user input</li>
 <li>Using closures</li>
 </ul>
@@ -426,27 +426,27 @@ This function will work fine, but all that hard-coded HTML is ugly.
 Of course, there is a better way.
 </p>
  
-<h2>The <code>old/template</code> package</h2>
+<h2>The <code>template</code> package</h2>
 
 <p>
-The <code>old/template</code> package is part of the Go standard library.
+The <code>template</code> package is part of the Go standard library.
 (A new template package is coming; this code lab will be updated soon.)
 We can
-use <code>old/template</code> to keep the HTML in a separate file, allowing
+use <code>template</code> to keep the HTML in a separate file, allowing
 us to change the layout of our edit page without modifying the underlying Go
 code.
 </p>
 
 <p>
-First, we must add <code>old/template</code> to the list of imports:
+First, we must add <code>template</code> to the list of imports:
 </p>
 
 <pre>
 import (
        "http"
        "io/ioutil"
-       <b>"old/template"</b>
        "os"
+       <b>"template"</b>
 )
 </pre>
 
@@ -456,10 +456,10 @@ Open a new file named <code>edit.html</code>, and add the following lines:
 </p>
 
 <pre>
-&lt;h1&gt;Editing {Title}&lt;/h1&gt;
+&lt;h1&gt;Editing {{.Title |html}}&lt;/h1&gt;
 
-&lt;form action=&#34;/save/{Title}&#34; method=&#34;POST&#34;&gt;
-&lt;div&gt;&lt;textarea name=&#34;body&#34; rows=&#34;20&#34; cols=&#34;80&#34;&gt;{Body|html}&lt;/textarea&gt;&lt;/div&gt;
+&lt;form action=&#34;/save/{{.Title |html}}&#34; method=&#34;POST&#34;&gt;
+&lt;div&gt;&lt;textarea name=&#34;body&#34; rows=&#34;20&#34; cols=&#34;80&#34;&gt;{{printf &#34;%s&#34; .Body |html}}&lt;/textarea&gt;&lt;/div&gt;
 &lt;div&gt;&lt;input type=&#34;submit&#34; value=&#34;Save&#34;&gt;&lt;/div&gt;
 &lt;/form&gt;
 </pre>
@@ -476,7 +476,7 @@ func editHandler(w http.ResponseWriter, r *http.Request) {
        if err != nil {
                p = &amp;Page{Title: title}
        }
-       t, _ := template.ParseFile(&#34;edit.html&#34;, nil)
+       t, _ := template.ParseFile(&#34;edit.html&#34;)
        t.Execute(w, p)
 }
 </pre>
@@ -487,19 +487,21 @@ The function <code>template.ParseFile</code> will read the contents of
 </p>
 
 <p>
-The method <code>t.Execute</code> replaces all occurrences of 
-<code>{Title}</code> and <code>{Body}</code> with the values of 
-<code>p.Title</code> and <code>p.Body</code>, and writes the resultant
-HTML to the <code>http.ResponseWriter</code>.
+The method <code>t.Execute</code> executes the template, writing the
+generated HTML to the <code>http.ResponseWriter</code>.
+The <code>.Title</code> and <code>.Body</code> dotted identifiers refer to
+<code>p.Title</code> and <code>p.Body</code>.
 </p>
 
 <p>
-Note that we've used <code>{Body|html}</code> in the above template.  
-The <code>|html</code> part asks the template engine to pass the value
-<code>Body</code> through the <code>html</code> formatter before outputting it,
-which escapes HTML characters (such as replacing <code>&gt;</code> with 
-<code>&amp;gt;</code>). 
-This will prevent user data from corrupting the form HTML. 
+Template directives are enclosed in double curly braces.
+The <code>printf "%s" .Body</code> instruction is a function call
+that outputs <code>.Body</code> as a string instead of a stream of bytes,
+the same as a call to <code>fmt.Printf</code>.
+The <code>|html</code> part of each directive pipes the value through the
+<code>html</code> formatter before outputting it, which escapes HTML
+characters (such as replacing <code>&gt;</code> with <code>&amp;gt;</code>),
+preventing user data from corrupting the form HTML. 
 </p>
 
 <p>
@@ -513,11 +515,11 @@ While we're working with templates, let's create a template for our
 </p>
 
 <pre>
-&lt;h1&gt;{Title}&lt;/h1&gt;
+&lt;h1&gt;{{.Title |html}}&lt;/h1&gt;
 
-&lt;p&gt;[&lt;a href=&#34;/edit/{Title}&#34;&gt;edit&lt;/a&gt;]&lt;/p&gt;
+&lt;p&gt;[&lt;a href=&#34;/edit/{{.Title |html}}&#34;&gt;edit&lt;/a&gt;]&lt;/p&gt;
 
-&lt;div&gt;{Body}&lt;/div&gt;
+&lt;div&gt;{{printf &#34;%s&#34; .Body |html}}&lt;/div&gt;
 </pre>
 
 <p>
@@ -528,7 +530,7 @@ Modify <code>viewHandler</code> accordingly:
 func viewHandler(w http.ResponseWriter, r *http.Request) {
        title := r.URL.Path[lenPath:]
        p, _ := loadPage(title)
-       t, _ := template.ParseFile(&#34;view.html&#34;, nil)
+       t, _ := template.ParseFile(&#34;view.html&#34;)
        t.Execute(w, p)
 }
 </pre>
@@ -708,16 +710,17 @@ var templates = make(map[string]*template.Template)
 <p>
 Then we create an <code>init</code> function, which will be called before
 <code>main</code> at program initialization. The function
-<code>template.MustParseFile</code> is a convenience wrapper around
-<code>ParseFile</code> that does not return an error code; instead, it panics
-if an error is encountered. A panic is appropriate here; if the templates can't
-be loaded the only sensible thing to do is exit the program.
+<code>template.Must</code> is a convenience wrapper that panics when passed a
+non-nil <code>os.Error</code> value, and otherwise returns the
+<code>*Template</code> unaltered. A panic is appropriate here; if the templates
+can't be loaded the only sensible thing to do is exit the program.
 </p>
 
 <pre>
 func init() {
        for _, tmpl := range []string{&#34;edit&#34;, &#34;view&#34;} {
-               templates[tmpl] = template.MustParseFile(tmpl+&#34;.html&#34;, nil)
+               t := template.Must(template.ParseFile(tmpl + &#34;.html&#34;))
+               templates[tmpl] = t
        }
 }
 </pre>
@@ -763,10 +766,9 @@ var titleValidator = regexp.MustCompile(&#34;^[a-zA-Z0-9]+$&#34;)
 <p>
 The function <code>regexp.MustCompile</code> will parse and compile the 
 regular expression, and return a <code>regexp.Regexp</code>. 
-<code>MustCompile</code>, like <code>template.MustParseFile</code>,
-is distinct from <code>Compile</code> in that it will panic if 
-the expression compilation fails, while <code>Compile</code> returns an 
-<code>os.Error</code> as a second parameter. 
+<code>MustCompile</code> is distinct from <code>Compile</code> in that it will
+panic if the expression compilation fails, while <code>Compile</code> returns
+an <code>os.Error</code> as a second parameter. 
 </p>
 
 <p>
index 60d4303df9b86d3dcd3b0a75564440a634914de1..6b5fbcb4323dbeb44a07ba2147503d837f2a56c1 100644 (file)
@@ -8,7 +8,7 @@ import (
        "go/ast"
        "go/token"
        "log"
-       "old/template"
+       "template"
        "os"
 )
 
index ca2ffc20b6401dd74e705f409a5180cc51d361bd..023391577421f845de43db3fada5bdb167047b7b 100644 (file)
@@ -1,5 +1,5 @@
-<h1>{Title}</h1>
+<h1>{{.Title |html}}</h1>
 
-<p>[<a href="/edit/{Title}">edit</a>]</p>
+<p>[<a href="/edit/{{.Title |html}}">edit</a>]</p>
 
-<div>{Body}</div>
+<div>{{printf "%s" .Body |html}}</div>
index 91221bd616c7a3d0eae8e2863f815d9825b457f1..634babd8b8f2988441756062131ed5192cd10dfe 100644 (file)
@@ -7,7 +7,7 @@ Covered in this codelab:
 <ul>
 <li>Creating a data structure with load and save methods</li>
 <li>Using the <code>http</code> package to build web applications
-<li>Using the <code>old/template</code> package to process HTML templates</li>
+<li>Using the <code>template</code> package to process HTML templates</li>
 <li>Using the <code>regexp</code> package to validate user input</li>
 <li>Using closures</li>
 </ul>
@@ -366,27 +366,27 @@ This function will work fine, but all that hard-coded HTML is ugly.
 Of course, there is a better way.
 </p>
  
-<h2>The <code>old/template</code> package</h2>
+<h2>The <code>template</code> package</h2>
 
 <p>
-The <code>old/template</code> package is part of the Go standard library.
+The <code>template</code> package is part of the Go standard library.
 (A new template package is coming; this code lab will be updated soon.)
 We can
-use <code>old/template</code> to keep the HTML in a separate file, allowing
+use <code>template</code> to keep the HTML in a separate file, allowing
 us to change the layout of our edit page without modifying the underlying Go
 code.
 </p>
 
 <p>
-First, we must add <code>old/template</code> to the list of imports:
+First, we must add <code>template</code> to the list of imports:
 </p>
 
 <pre>
 import (
        "http"
        "io/ioutil"
-       <b>"old/template"</b>
        "os"
+       <b>"template"</b>
 )
 </pre>
 
@@ -414,19 +414,21 @@ The function <code>template.ParseFile</code> will read the contents of
 </p>
 
 <p>
-The method <code>t.Execute</code> replaces all occurrences of 
-<code>{Title}</code> and <code>{Body}</code> with the values of 
-<code>p.Title</code> and <code>p.Body</code>, and writes the resultant
-HTML to the <code>http.ResponseWriter</code>.
+The method <code>t.Execute</code> executes the template, writing the
+generated HTML to the <code>http.ResponseWriter</code>.
+The <code>.Title</code> and <code>.Body</code> dotted identifiers refer to
+<code>p.Title</code> and <code>p.Body</code>.
 </p>
 
 <p>
-Note that we've used <code>{Body|html}</code> in the above template.  
-The <code>|html</code> part asks the template engine to pass the value
-<code>Body</code> through the <code>html</code> formatter before outputting it,
-which escapes HTML characters (such as replacing <code>&gt;</code> with 
-<code>&amp;gt;</code>). 
-This will prevent user data from corrupting the form HTML. 
+Template directives are enclosed in double curly braces.
+The <code>printf "%s" .Body</code> instruction is a function call
+that outputs <code>.Body</code> as a string instead of a stream of bytes,
+the same as a call to <code>fmt.Printf</code>.
+The <code>|html</code> part of each directive pipes the value through the
+<code>html</code> formatter before outputting it, which escapes HTML
+characters (such as replacing <code>&gt;</code> with <code>&amp;gt;</code>),
+preventing user data from corrupting the form HTML. 
 </p>
 
 <p>
@@ -572,10 +574,10 @@ our <code>*Template</code> values, keyed by <code>string</code>
 <p>
 Then we create an <code>init</code> function, which will be called before
 <code>main</code> at program initialization. The function
-<code>template.MustParseFile</code> is a convenience wrapper around
-<code>ParseFile</code> that does not return an error code; instead, it panics
-if an error is encountered. A panic is appropriate here; if the templates can't
-be loaded the only sensible thing to do is exit the program.
+<code>template.Must</code> is a convenience wrapper that panics when passed a
+non-nil <code>os.Error</code> value, and otherwise returns the
+<code>*Template</code> unaltered. A panic is appropriate here; if the templates
+can't be loaded the only sensible thing to do is exit the program.
 </p>
 
 <pre>
@@ -618,10 +620,9 @@ Then we can create a global variable to store our validation regexp:
 <p>
 The function <code>regexp.MustCompile</code> will parse and compile the 
 regular expression, and return a <code>regexp.Regexp</code>. 
-<code>MustCompile</code>, like <code>template.MustParseFile</code>,
-is distinct from <code>Compile</code> in that it will panic if 
-the expression compilation fails, while <code>Compile</code> returns an 
-<code>os.Error</code> as a second parameter. 
+<code>MustCompile</code> is distinct from <code>Compile</code> in that it will
+panic if the expression compilation fails, while <code>Compile</code> returns
+an <code>os.Error</code> as a second parameter. 
 </p>
 
 <p>