基于Go语言开发一个Markdown转HTML工具

 更新时间:2025年09月10日 08:18:05   作者:程序员爱钓鱼  
这篇文章主要为大家详细介绍了如何基于Go语言开发一个Markdown转HTML工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

这个小工具可以把 .md 文件转换为 .html 文件,非常适合写笔记、博客或者快速预览 Markdown 内容。

案例目标

  • 读取一个 Markdown 文件
  • 使用开源库将 Markdown 转换为 HTML
  • 将 HTML 输出到新文件中

所需库

我们用 goldmark 这个 Markdown 解析库,它轻量且高效。

安装:

go get github.com/yuin/goldmark

实现代码

package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"

	"github.com/yuin/goldmark"
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("用法: go run main.go <markdown文件>")
		return
	}

	mdFile := os.Args[1]

	// 读取Markdown文件
	content, err := ioutil.ReadFile(mdFile)
	if err != nil {
		fmt.Printf("读取文件失败: %v\n", err)
		return
	}

	// 转换为HTML
	var htmlOutput []byte
	md := goldmark.New()
	var buf []byte
	htmlBuf := &buf
	err = md.Convert(content, htmlBuf)
	if err != nil {
		fmt.Printf("Markdown 转换失败: %v\n", err)
		return
	}
	htmlOutput = *htmlBuf

	// 生成HTML文件名
	htmlFile := filepath.Base(mdFile[:len(mdFile)-len(filepath.Ext(mdFile))]) + ".html"

	// 写入HTML文件
	err = ioutil.WriteFile(htmlFile, htmlOutput, 0644)
	if err != nil {
		fmt.Printf("写入HTML文件失败: %v\n", err)
		return
	}

	fmt.Printf("转换成功!输出文件: %s\n", htmlFile)
}

使用方法

保存代码为 main.go

准备一个 test.md 文件,例如:

# Hello Markdown
这是一个 **Markdown 转 HTML** 的测试。
- 项目一
- 项目二

运行:

go run main.go test.md

会生成 test.html,在浏览器里打开就能看到格式化的内容

方法补充

golang 自定义解析 markdown为 html

输出 HTML 模板内容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Custom Markdown</title>
    <link rel="stylesheet" href="markdown.css" rel="external nofollow" />
</head>
<body>
{{ . }}
</body>
</html>

golang 程序如下

安装依赖 go get -u github.com/gomarkdown/markdown

package main

import (
	"bufio"
	"github.com/gomarkdown/markdown"
	"github.com/gomarkdown/markdown/ast"
	"github.com/gomarkdown/markdown/html"
	"html/template"
	"io"
	"log"
	"os"
)

// return (ast.GoToNext, true) to tell html renderer to skip rendering this node
// (because you've rendered it)
func renderHookCodeBlock(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool) {

	// skip all nodes that are not CodeBlock nodes
	if _, ok := node.(*ast.CodeBlock); !ok {
		return ast.GoToNext, false
	}

	// custom rendering logic for ast.CodeBlock. By doing nothing it won't be
	// 写入自定义数据
	w.Write([]byte(`<span>Hello World</span>`))

	return ast.GoToNext, false
}

func main() {

	inputFile := "markdown.md"           // 输入 md 文件
	inputTemplateFile := "template.html" // 模板文件
	outputFile := "markdown.html"        // 输出 html 文件

	opts := html.RendererOptions{
		Flags:          html.CommonFlags,
		RenderNodeHook: renderHookCodeBlock, // 设置自定义处理钩子
	}
	renderer := html.NewRenderer(opts)

	// 打开 md 文件
	fs, err := os.Open(inputFile)
	if err != nil {
		return
	}

	// 读取 md 内容
	var md string
	scanner := bufio.NewScanner(fs)
	for scanner.Scan() {
		md += scanner.Text() + "\n"
	}
	if scanner.Err() != nil {
		log.Panicln(err)
	}

	// md to html
	html := markdown.ToHTML([]byte(md), nil, renderer)

	tp, err := template.ParseFiles(inputTemplateFile)
	if err != nil {
		return
	}

	// 写入输出文件
	f, err := os.Create(outputFile)
	if err != nil {
		return
	}
	tp.Execute(f, template.HTML(html))

	print(string(html))
}

到此这篇关于基于Go语言开发一个Markdown转HTML工具的文章就介绍到这了,更多相关Go Markdown转HTML内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang中Json的序列化和反序列化的使用

    Golang中Json的序列化和反序列化的使用

    本文主要介绍了Golang中Json的序列化和反序列化的使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • Go处理JSON数据的实现

    Go处理JSON数据的实现

    本文主要介绍了Go处理JSON数据的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • go语言实现同步操作项目示例

    go语言实现同步操作项目示例

    本文主要介绍了go语言实现同步操作项目示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Go语言的限流与熔断机制的多种方法实现

    Go语言的限流与熔断机制的多种方法实现

    限流和熔断是保障系统稳定性的重要机制,它们可以防止系统因过载而崩溃,提高系统的可用性和可靠性,本文就来详细的介绍一下Go语言的限流与熔断机制的多种方法实现,感兴趣的可以了解一下
    2026-04-04
  • Go常用技能日志log包创建使用示例

    Go常用技能日志log包创建使用示例

    这篇文章主要为大家介绍了Go常用技能日志log包创建使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang 手写贪吃蛇示例实现

    golang 手写贪吃蛇示例实现

    这篇文章主要为大家介绍了golang 手写贪吃蛇示例实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang的匿名函数和普通函数的区别解析

    golang的匿名函数和普通函数的区别解析

    匿名函数是不具名的函数,可以在不定义函数名的情况下直接使用,通常用于函数内部的局部作用域中,这篇文章主要介绍了golang的匿名函数和普通函数的区别,需要的朋友可以参考下
    2023-03-03
  • 通过Golang实现linux命令ls命令(命令行工具构建)

    通过Golang实现linux命令ls命令(命令行工具构建)

    这篇文章主要为大家详细介绍了如何通过Golang实现一个linux命令ls命令(命令行工具构建),文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-01-01
  • Go标准库sync功能实例详解

    Go标准库sync功能实例详解

    Go语言通过goroutine实现轻量级并发,而sync库是并发编程中同步原语的核心集合,提供了多种用于协调goroutine执行、保护共享资源的工具,这篇文章给大家介绍Go标准库sync功能实例详解,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • golang validator参数校验的实现

    golang validator参数校验的实现

    这篇文章主要介绍了golang validator参数校验的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论