Golang中的HTML模板

托马斯·拉科夫斯基(Tomasz Rakowski)

我正在关注本教程:golang教程-Wiki,并且我设法使所有工作均正常进行,但“其他任务”部分中的最后一点除外。我对本教程的实现:

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "html/template"
    "regexp"
)

type Page struct {
    Title string
    Body []byte
}

func (p *Page) save() error {
    filename := "data/" + p.Title + ".txt"
    return ioutil.WriteFile(filename, p.Body, 0600)
}

func loadPage(title string) (*Page, error) {
    filename := "data/" + title + ".txt"
    body, err := ioutil.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    return &Page{Title: title, Body: body}, nil
}

func renderTemplate(w http.ResponseWriter, tmpl string, p *Page) {
    t, _ := template.ParseFiles("template/" + tmpl + ".html");
    t.Execute(w, p)
}

func viewHandler(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Path[len("/view/"):]
    p, err := loadPage(title)
    if err != nil {
        http.Redirect(w, r, "/edit/" + title, http.StatusFound);
        return
    }
    expr := regexp.MustCompile(`\[.+\]`)
    p.Body = expr.ReplaceAllFunc(p.Body, func ( match []byte) []byte {
        return []byte("<a href='/view/" + string(match) + "'>" + string(match) + "</a>")
    })
    renderTemplate(w, "view", p);
}

func saveHandler(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Path[len("/save/"):]
    body := r.FormValue("body")
    p := &Page{Title: title, Body: []byte(body)}
    p.save()
    http.Redirect(w, r, "/view/" + title, http.StatusFound)
}

func editHandler(w http.ResponseWriter, r *http.Request) {
    title := r.URL.Path[len("/edit/"):]
    p, err := loadPage(title);

    if err != nil {
        p = &Page{Title: title}
    }
    renderTemplate(w, "edit", p);
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        http.Redirect(w, r, "/view/index", http.StatusFound)    
        })
    http.HandleFunc("/view/", viewHandler)
    http.HandleFunc("/edit/", editHandler)
    http.HandleFunc("/save/", saveHandler)
    http.ListenAndServe(":8080", nil)
    fmt.Println("Running");
}

html / template引擎会按预期方式打印定位标记,但会使用html实体对其进行转义。我还没有找到合适的方法。

樱桃柠檬

使用template.HTML将正文标记为安全HTML。

以下函数将正文转换为HTML。

// Move to package-level variable so that it's compile once.
var linkPat = regexp.MustCompile(`\[.+\]`)

func toHTML(s string) template.HTML {

  // Escape everything in the string first to ensure that
  // special characters ('<' for example) are displayed as
  // characters and not treated as markup.
  s = template.HTMLEscapeString(s)

  // Insert the links.
  s = linkPat.ReplaceAllStringFunc(s, func(m string) string {
    s = s[1 : len(s)-1]
    return "<a href='/view/" + m + "'>" + m + "</a>"
  })

  return template.HTML(s)
}

使用以下方式渲染页面:

renderTemplate(w, "edit", map[string]interface{}{
   "Title": p.Body,
   "Body": toHTML(p.Body),
})

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

转义到&#39; 在golang html模板中

来自分类Dev

html模板中的golang乘法算法

来自分类Dev

Golang模板中的HTML表单提交

来自分类Dev

在golang html模板中访问{{range。}}范围之外的struct变量

来自分类Dev

Ansible 中的 Golang 模板

来自分类Dev

Golang模板中的呼叫链接

来自分类Dev

HTML模板中的图标

来自分类Dev

HTML模板中的Json

来自分类Dev

在html模板golang中的许多结构的切片中访问结构变量

来自分类Dev

如何在gin gonic框架(golang)中通过c.HTML()将函数传递给模板

来自分类Dev

Golang-HTML模板-范围限制

来自分类Dev

如何在Golang模板中打印换行?

来自分类Dev

索引中struct的Golang模板属性

来自分类Dev

在golang中执行不带引号的模板

来自分类Dev

在golang文本/模板中解引用指针

来自分类Dev

Golang中的变量内部定义模板

来自分类Dev

使用Golang模板,如何在每个模板中设置变量?

来自分类Dev

HTML模板中的playframework JsValue

来自分类Dev

HTML模板中的playframework JsValue

来自分类Dev

Apache Cordova中的HTML模板?

来自分类Dev

在python中从HTML模板生成HTML?

来自分类Dev

Golang html /模板:具有自定义Delims的ParseFiles

来自分类Dev

在GoLang中将Json数据映射到HTML模板

来自分类Dev

在Golang的HTML模板中使用Vue.js

来自分类Dev

如何将基本模板文件用于golang html / template?

来自分类Dev

Golang从文件中嵌入HTML

来自分类Dev

Web组件中的模板html和模板字符串

来自分类Dev

访问模板 html 模板中的自定义属性

来自分类Dev

Golang模板:如何在变量中定义数组?