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语法文档(翻译)

相关文章
|
10月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
1096 0
|
8月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟蒋星熠Jaxonic,Go语言探索者。深耕云计算、微服务与并发编程,以代码为笔,在二进制星河中书写极客诗篇。分享Go核心原理、性能优化与实战架构,助力开发者掌握云原生时代利器。#Go语言 #并发编程 #性能优化
678 43
Go语言深度解析:从入门到精通的完整指南
|
8月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
413 2
|
9月前
|
Cloud Native 安全 Java
Go语言深度解析:从入门到精通的完整指南
🌟 蒋星熠Jaxonic,执着的星际旅人,用Go语言编写代码诗篇。🚀 Go语言以简洁、高效、并发为核心,助力云计算与微服务革新。📚 本文详解Go语法、并发模型、性能优化与实战案例,助你掌握现代编程精髓。🌌 从goroutine到channel,从内存优化到高并发架构,全面解析Go的强大力量。🔧 实战构建高性能Web服务,展现Go在云原生时代的无限可能。✨ 附技术对比、最佳实践与生态全景,带你踏上Go语言的星辰征途。#Go语言 #并发编程 #云原生 #性能优化
|
10月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
634 0
|
10月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
454 0
|
10月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
496 0
|
10月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
673 0
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。

热门文章

最新文章

推荐镜像

更多
  • DNS