在Go上GAE显示由html /模板生成的换行符

时间:2016-03-20 13:34:48

标签: javascript html string google-app-engine go

我的应用程序是用Go编写的。应用程序的页面从HTML文本区域接收用户数据,该文本区域作为字符串数据保存到Google App Engine数据存储区。然后,在应用程序的另一页上,它需要以用户键入HTML文本区域的格式显示数据,或者至少在用户按下输入键时保留换行符,同时在HTML文本字段中键入数据。

我尝试使用<pre>标记来显示用户在文本字段中输入的保留换行符,该换行符运行正常。但是,我发现有一个双标签

  

\吨\吨

在使用<pre>标记时插入字符串的开头,我可以使用Javascript删除双标签。

我想保留用户在文本字段中输入的换行符是使用javascript替换函数将所有\r\n\n\r替换为<br>,然而,它没有成功。看起来Go并没有将换行输出到html源代码中。我正在使用&#34; html / template&#34;出于安全原因,但我并不期望它完全从输出中删除\r\n个字符。在字符串的开头有奇怪的双重标签\t\t是否有任何建议?

2 个答案:

答案 0 :(得分:3)

您可以使用CSS格式解决问题,即white-space属性:

  

white-space属性指定如何处理元素内的空白区域。

     

CSS语法:

white-space: normal|nowrap|pre|pre-line|pre-wrap|initial|inherit;

pre值的作用就好像它会包含在HTML <pre>标记中,这也会呈现双标签。

使用pre-line值适合您:

  

pre-line空格的序列将折叠成一个空格。文本将在必要时包装,并在换行符

因此保留了行,但是多个空格被折叠成一个空格。优点是您不需要转换原始文本,浏览器将应用正确的格式。代码对于HTML注入攻击仍然是安全的。

完整示例:

func main() {
    t := template.Must(template.New("").Parse(src))
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        t.Execute(w, text)
    })
    panic(http.ListenAndServe("localhost:8080", nil))
}

const src = `<html><body>Entered text:
<div style="white-space:pre-line">{{.}}</div>
</body></html>`

const text = "\t\t1st line\n2nd line\r\n3rdline"

您的初始双标签\t\t

请注意,您的初始双标签\t\t不是由浏览器或表单提交生成的(如果您将其存储在那里也不会生成数据存储区),但很可能是您使用模板缩进为2的结果标签。缩进模板也会写入输出,因此您应该在模板中没有换行符的情况下正确关闭<textarea>。由于你没有发布你的模板和代码,我找不到为什么你有初始的双标签,但是你应该找到根本原因而不是治疗症状。

答案 1 :(得分:2)

不要在javascript中将换行符更改为<br>,而是在Go中执行:http://play.golang.org/p/jJXMZxtYcv

package main

import (
    "html/template"
    "log"
    "os"
    "strings"
)

func main() {
    const tpl = `
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{{.Title}}</title>
    </head>
    <body>
        <div>{{nl2br .Text}}</div>
    </body>
</html>`

    check := func(err error) {
        if err != nil {
            log.Fatal(err)
        }
    }

    funcs := template.FuncMap{
        "nl2br": func(text string) template.HTML {
            return template.HTML(strings.Replace(template.HTMLEscapeString(text), "\n", "<br>", -1))
        },
    }

    t, err := template.New("webpage").Funcs(funcs).Parse(tpl)
    check(err)

    data := struct {
        Title string
        Text  string
    }{
        Title: "My page",
        Text:  "\t\tLine 1\r\nLine2\r\n",
    }

    err = t.Execute(os.Stdout, data)
    check(err)
}