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

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

关于Markdown的语法:Markdown语法文档(翻译)

go解析markdown

Markdown 是一种轻量级的标记语言。设计的目的是通过简单、轻量级的方式来添加格式,而不需要使用 HTML。

markdown解析库

Go 语言中解析 MarkDown 最知名的库就是 russross/blackfriday 了。github 地址为:russross/blackfriday。

Blackfriday是在Go中实现的Markdown处理器。您可以安全地输入用户提供的数据,速度快,支持通用扩展(表,智能标点符号替换等),并且对于所有utf-8(unicode)都是安全的输入。

当前支持HTML输出以及Smartypants扩展。

使用:

  1. 安装:
go get -u github.com/russross/blackfriday
  1. 引入:
improt "github.com/russoss/blackfriday"
  1. 解析 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语法文档(翻译)

相关文章
|
9月前
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
596 90
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1033 29
|
10月前
|
存储 自然语言处理 算法
【LeetCode 热题100】208:实现 Trie (前缀树)(详细解析)(Go语言版)
本文详细解析了力扣热题 208——实现 Trie(前缀树)。Trie 是一种高效的树形数据结构,用于存储和检索字符串集合。文章通过插入、查找和前缀匹配三个核心操作,结合 Go 语言实现代码,清晰展示了 Trie 的工作原理。时间复杂度为 O(m),空间复杂度也为 O(m),其中 m 为字符串长度。此外,还探讨了 Trie 的变种及应用场景,如自动补全和词典查找等。适合初学者深入了解 Trie 结构及其实际用途。
344 14
|
10月前
|
SQL 运维 监控
高效定位 Go 应用问题:Go 可观测性功能深度解析
为进一步赋能用户在复杂场景下快速定位与解决问题,我们结合近期发布的一系列全新功能,精心梳理了一套从接入到问题发现、再到问题排查与精准定位的最佳实践指南。
|
10月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
365 11
|
11月前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
11月前
|
存储 算法 安全
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
207 0
|
10月前
|
前端开发 Docker 容器
写作利器,一款极简的Markdown 编辑器
WeChat Markdown Editor 是一款高度简洁的微信 Markdown 编辑器:支持 Markdown 语法、色盘取色、多图上传、一键下载文档、自定义 CSS 样式、一键重置等特性。
561 70
写作利器,一款极简的Markdown 编辑器
|
Ubuntu Linux 测试技术
Linux系统之部署轻量级Markdown文本编辑器
【10月更文挑战第6天】Linux系统之部署轻量级Markdown文本编辑器
670 1
Linux系统之部署轻量级Markdown文本编辑器
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
702 0

推荐镜像

更多
  • DNS