首页后端开发GOGo语言——快速使用Markdown解析库

Go语言——快速使用Markdown解析库

时间2023-04-23 22:24:01发布访客分类GO浏览1097
导读:go解析markdownMarkdown 是一种轻量级的标记语言。设计的目的是通过简单、轻量级的方式来添加格式,而不需要使用 HTML。markdown解析库Go 语言中解析 MarkDown 最知名的库就是 russross/blackf...

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文档,但对用户期望的格式干扰最小。

源码:

// UGCPolicy returns a policy aimed at user generated content that is a result of HTML WYSIWYG tools and Markdown conversions.
//
// This is expected to be a fairly rich document where as much markup as possible should be retained. Markdown permits raw HTML so we are basically providing a policy to sanitise HTML5 documents safely but with the least intrusion on the formatting expectations of the user.
func UGCPolicy() *Policy{
..}

SanitizeBytes(b []byte) []byte

SanitizeBytes 采用包含 HTML 片段或文档的 []byte 并应用给定的策略允许列表。它返回一个包含已被策略清理的 HTML 的 [] byte,如果发生错误,则返回一个空的 [] byte(很可能是由于输入格式极不正确)

源码:

// SanitizeBytes takes a []byte that contains a HTML fragment or document and applies the given policy allowlist.
//
// It returns a []byte containing the HTML that has been sanitized by the policy or an empty []byte if an error has occurred (most likely as a consequence of extremely malformed input)
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语法文档(翻译)

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

gomarkdown安全语法源码

若转载请注明出处: Go语言——快速使用Markdown解析库
本文地址: https://pptw.com/jishu/6694.html
2023-04-16:给定一个长度为N的数组,值一定在0~N-1范围,且每个值不重复 比如,arr = [4, 2, 0, 3, 1] Go语言——使用模糊查询检索关键词小技巧

游客 回复需填写必要信息