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