• 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
    2. 引入:

      improt "github.com/russoss/blackfriday"
      
      • 1
    3. 解析 MarkDown 内容:

      package main
      
      import (
      	"fmt"
      
      	"github.com/russross/blackfriday"
      )
      
      func main() {
      	input := []byte("### 三级标题")
      	output := blackfriday.MarkdownCommon(input)
      	fmt.Println(string(output))
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • MarkdownBasic(input []byte) []byte

        MarkdownBasic 是一个方便简单渲染的函数,它处理没有启用扩展的markdown输入。

        这里input是[]byte类型,可以将markdown类型的字符串强转为[]byte,即input = []byte(string),返回值是一个转化为HTML格式的``[]byte`类型。

      运行输出:

      <h3>三级标题h3>
      
      • 1

    安全过滤:

    blackfriday 库仅实现了 MarkDown 的解析,没有做关于安全注入方面的过滤。若不能保证待解析的内容安全性,例如来自于用户提供的内容,则需要进行内容过滤来保证安全。推荐使用 microcosm-cc/bluemonday 完成。

    • 引入:

      go get -u github.com/microcosm-cc/bluemonday
      
      • 1
    • 使用:

      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))
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 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{..}
        
        • 1
        • 2
        • 3
        • 4
      • 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()
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9

    基本上就这些操作。

    例子:

    package main
    
    import (
    	"fmt"
    
    	"github.com/microcosm-cc/bluemonday"
    
    	"github.com/russross/blackfriday"
    )
    
    func main() {
    	input := []byte(`
    # 标题1
    **加粗**  
    *斜体*  
    如果你真的想要插入
    标签的话,在行尾加上两个以上的空白,然后按enter。 [百度](http://www.baidu.com)`
    ) unsafe := blackfriday.MarkdownCommon(input) output := bluemonday.UGCPolicy().SanitizeBytes(unsafe) fmt.Println(string(output)) }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行结果:

    <h1>标题1h1>
    
    <p><strong>加粗strong><br/>
    <em>斜体em><br/>
    如果你真的想要插入<br/>标签的话,在行尾加上两个以上的空白,然后按enter。
    <a href="http://www.baidu.com" rel="nofollow">百度a>p>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

  • 相关阅读:
    动态规划之打家劫舍系列
    编辑距离算法
    [非线性控制理论]8_三种鲁棒控制器的比较
    超越边界:如何ChatGPT 3.5、GPT-4、DALL·E 3和Midjourney共同重塑创意产业
    利用idea新创建maven项目时的一些基本配置
    RocketMQ —消费进度管理
    详解深拷贝,浅拷贝
    湖南特色农产品销售系统APP /基于android的农产品销售系统/基于android的购物系统
    c++基础代码备忘录-指针与数组
    Hierarchy-Aware Global Model for Hierarchical Text Classification
  • 原文地址:https://blog.csdn.net/weixin_52000204/article/details/126823679