我使用Martini框架,我有一些标记文件,我希望将其呈现为tmpl/html模板中的HTML.

减价文件如下所示:

title: A Test Demo
---
##ABC
> 123

模板文件如下所示:

<head>
  <title>{{name}}</title>
</head>

<body>
  <h2>{{abc}}</h2>
  <blockquote>
    <p>{{xyz}}</p>
  </blockquote>
</body>

我使用BlackFriday解析Markdown并返回[]bytetype,下一步我想将Markdown文件呈现到此模板中,并使每个挡路位于正确的位置,那么我该如何才能正确地做到这一点呢?或者用什么方法把这件事做得更好?

推荐答案

实现这一点的一种方法是使用Funcs方法将自定义函数添加到模板函数映射中.有关更多信息,请参阅the template package docs的第Functions节.

给定一个模板文件page.html、某个编写器w(可能是http.ResponseWriter)和某个 struct p(其中包含要放入模板字段中的数据的字段Body),您可以执行如下操作:

定义函数:

func markDowner(args ...interface{}) template.HTML {
    s := blackfriday.MarkdownCommon([]byte(fmt.Sprintf("%s", args...)))
    return template.HTML(s)
}

将其添加到模板函数映射中:

tmpl := template.Must(template.New("page.html").Funcs(template.FuncMap{"markDown": markDowner}).ParseFiles("page.html"))

执行模板:

err := tmpl.ExecuteTemplate(w, "page.html", p)
if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
}

然后,您可以在模板文件中放置如下内容:

{{.Body | markDown}}

它将通过您的markDowner函数传递Body.

Playground

Go相关问答推荐

Go 1.22 http mux:在同一路径上提供一个手柄和一个FS

如何描述OpenAPI规范中围棋的数据类型.JSON?

如何在围棋中从多部分.Part中获取多部分.文件而不保存到磁盘?

Go 1.20 中如何计算连接错误?

如何为循环扫描的bufio scanner 设置超时?

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

如何在 Go 服务中导入 monorepo 中的包?

如何用mpb创建两行进度条?

是否可以在调试期间在 VSCode 中预览 github.com/shopspring/decimal 值?

在密钥不存在时处理 PATCH 部分更新

没有任务角色的 AWS CDK ECS 任务定义

使用 os/exec 和在命令行执行之间的结果莫名其妙地不同

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

查找、解析和验证邮箱地址

我相信我正确地在 sRGB 和线性 RGB 之间进行了转换,那么为什么深色的结果看起来更糟呢?

将 CSVExport 函数传递给处理程序 Gin

什么是无效字符实体 &ccb

gqlgen go,通过添加一个解析器来减少数据库调用

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

go routine 和接收错误或成功的通道