关于Markdown的语法:Markdown语法文档(翻译)
go解析markdown
Markdown 是一种轻量级的标记语言。设计的目的是通过简单、轻量级的方式来添加格式,而不需要使用 HTML。
markdown解析库
Go 语言中解析 MarkDown 最知名的库就是 russross/blackfriday 了。github 地址为:russross/blackfriday。
Blackfriday是在Go中实现的Markdown处理器。您可以安全地输入用户提供的数据,速度快,支持通用扩展(表,智能标点符号替换等),并且对于所有utf-8(unicode)都是安全的输入。
当前支持HTML输出以及Smartypants 扩展。
使用:
-
安装: go get -u github.com/russross/blackfriday
-
引入: improt "github.com/russoss/blackfriday"
-
解析 MarkDown 内容: package main
import (
"fmt"
"github.com/russross/blackfriday"
)
func main() {
input := []byte("### 三级标题")
output := blackfriday.MarkdownCommon(input)
fmt.Println(string(output))
}
-
MarkdownBasic(input []byte) []byte : MarkdownBasic 是一个方便简单渲染的函数,它处理没有启用扩展的markdown输入。 这里input是[]byte 类型,可以将markdown类型的字符串强转为[]byte ,即input = []byte(string) ,返回值是一个转化为HTML格式的``[]byte`类型。 运行输出: <h3>三级标题</h3>
安全过滤:
blackfriday 库仅实现了 MarkDown 的解析,没有做关于安全注入方面的过滤。若不能保证待解析的内容安全性,例如来自于用户提供的内容,则需要进行内容过滤来保证安全。推荐使用 microcosm-cc/bluemonday 完成。
-
引入: go get -u github.com/microcosm-cc/bluemonday
-
使用: package main
import (
"fmt"
"github.com/russross/blackfriday"
)
func main() {
input := []byte("### 三级标题")
unsafe := blackfriday.MarkdownCommon(input)
output:= bluemonday.UGCpolicy().SanitizeBytes(unsafe)
fmt.Println(string(output))
}
-
UGCPolicy() *Policy : UGCPolicy 返回一个针对用户生成内容的策略,该内容是HTML所见即所得工具和Markdown转换的结果。这将是一个相当丰富的文档,其中应该保留尽可能多的标记。Markdown允许原始HTML,所以我们基本上提供了一种策略来安全清理HTML5文档,但对用户期望的格式干扰最小。 源码:
func UGCPolicy() *Policy{..}
-
SanitizeBytes(b []byte) []byte : SanitizeBytes 采用包含 HTML 片段或文档的 []byte 并应用给定的策略允许列表。它返回一个包含已被策略清理的 HTML 的 [] byte ,如果发生错误,则返回一个空的 [] byte (很可能是由于输入格式极不正确) 源码:
func (p *Policy) SanitizeBytes(b []byte) []byte {
if len(bytes.TrimSpace(b)) == 0 {
return b
}
return p.sanitizeWithBuff(bytes.NewReader(b)).Bytes()
}
基本上就这些操作。
例子:
package main
import (
"fmt"
"github.com/microcosm-cc/bluemonday"
"github.com/russross/blackfriday"
)
func main() {
input := []byte(`
# 标题1
**加粗**
*斜体*
如果你真的想要插入<br />标签的话,在行尾加上两个以上的空白,然后按enter。
[百度](http://www.baidu.com)`)
unsafe := blackfriday.MarkdownCommon(input)
output := bluemonday.UGCPolicy().SanitizeBytes(unsafe)
fmt.Println(string(output))
}
运行结果:
<h1>标题1</h1>
<p><strong>加粗</strong><br/>
<em>斜体</em><br/>
如果你真的想要插入<br/>标签的话,在行尾加上两个以上的空白,然后按enter。
<a href="http://www.baidu.com" rel="nofollow">百度</a></p>
更多关于Markdown的语法见:Markdown语法文档(翻译)
|