Javascript 在Go-on GAE中显示html/模板生成的换行符

Javascript 在Go-on GAE中显示html/模板生成的换行符,javascript,html,string,google-app-engine,go,Javascript,Html,String,Google App Engine,Go,我的申请书是用围棋写的。应用程序的一个页面从HTML文本区域接收用户数据,该文本区域作为字符串数据保存到Google App Engine数据存储中。然后,在应用程序的另一个页面上,它需要以用户在HTML文本区域中键入的格式显示数据,或者至少在用户在HTML文本字段中键入数据时按enter键时保留换行符 我尝试使用标记来显示用户在文本字段中键入的保留换行符,效果很好。然而,我发现有一个双重标签 package main import ( "html/template" "log

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

我尝试使用
标记来显示用户在文本字段中键入的保留换行符,效果很好。然而,我发现有一个双重标签

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)
}
\t\t

在使用
标记时插入字符串的开头,我可以使用Javascript删除双选项卡

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

我的想法是保留用户在文本字段中键入的换行符,即使用javascript替换函数替换所有
\r\n
\n
\r

,但是,它没有起作用。Go似乎没有将换行符输出到html源代码中。出于安全考虑,我使用“html/template”,但我没想到它会从输出中完全删除
\r\n
字符。对于字符串开头奇怪的双制表符
\t\t
有什么建议吗

不要在javascript中将换行符更改为

,而是在Go中执行:

主程序包
进口(
“html/模板”
“日志”
“操作系统”
“字符串”
)
func main(){
常数tpl=`
{{.Title}
{{nl2br.Text}
`
检查:=func(错误){
如果错误!=零{
log.Fatal(错误)
}
}
funcs:=template.FuncMap{
“nl2br”:func(文本字符串)template.HTML{
return template.HTML(strings.Replace(template.HTMLEscapeString(text),“\n”,“
”,-1)) }, } t、 错误:=template.New(“网页”).Funcs(Funcs.Parse(tpl) 检查(错误) 数据:=struct{ 标题字符串 文本字符串 }{ 标题:“我的页面”, 文本:“\t\t行1\r\n行2\r\n”, } err=t.Execute(os.Stdout,数据) 检查(错误) }
您可以简单地解决CSS格式的问题,即属性:

空白属性指定如何处理元素内的空白

CSS语法:

pre
值的作用就像它将被包装在HTML

您最初的双制表符
\t\t

请注意,最初的双制表符
\t\t
不是由浏览器或表单提交生成的(如果将数据存储在其中,也不是由数据存储生成的),但很可能是使用缩进两个制表符的模板的结果。模板的缩进也会写入输出,因此您应该正确地关闭
,而不在模板中添加换行符。由于您没有发布模板和代码,因此我无法帮助您找出最初使用双标签的原因,但您应该找到根本原因,而不是治疗症状。

我也替换了
\n
,我也没有解决问题。我正在使用Linux。您是否尝试过
template.New(name).Funcs(Funcs).ParseFiles(name)
?是的,这正是我所做的。它已编译,但在请求时显示错误<代码>http:127.0.0.1:36496:运行时错误:调用
模板后内存地址无效或零指针解引用
。执行
。在调用
templates.Execute
之前,当我使用
template.Must(template.ParseFiles(“page.html”)
时,它起作用了。我处理了错误,但错误不是由我的处理程序抛出的,而是由Go的恐慌函数抛出的。这很奇怪,它在操场上是这样工作的:已解决!我只需在
New(name)中命名模板名称即可
作为
ParseFiles(name)
函数中的名称。感谢用户1431317!哦,是的,如果我的评论不清楚的话,很抱歉。谢谢icza。你是一个英雄!非常有用的答案!
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"