Markdown标题自动添加编号

这篇具有很好参考价值的文章主要介绍了Markdown标题自动添加编号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

markdown写文档很方便,但是有个困扰的地方,就是标题的编号问题。
写文档的时候,经常会在中间插入新的标题和内容,所以手动管理编号的话,如果新的标题插在前面,则要调整后面所有的编号。

如果在文档完成后再手动加上编号的话,不仅容易忘记,
而且有时候我们是在其他编辑器里编辑文档再导出markdown的,比如用语雀编写文档再导出markdown,这时每次修改文档再导出就要重新给导出的文档添加编号。
我用语雀比较多,常常因此而困扰。

所以,用golang简单写了个命令行工具,用来给markdown文档的标题添加编号。

1. 处理流程

处理过程很简单:

  1. 首先读取markdown文件的所有行
  2. 然后依次解析每一行
    1. 如果是标题行,添加编号
    2. 非标题行,略过
  3. 将添加了编号的内容重新写入markdown文件

2. 主要步骤

主要的步骤有三个:

2.1. 读取markdown文件

// 获取文件所有的行
func getAllLines(fp string) ([]string, error) {
    fi, err := os.Open(fp)
    if err != nil {
        return nil, err
    }
    defer fi.Close()

    br := bufio.NewReader(fi)
    lines := make([]string, 0)
    for {
        a, _, c := br.ReadLine()
        if c == io.EOF {
            break
        }
        lines = append(lines, string(a))
    }

    return lines, nil
}

返回的是文件所有行的数组。

2.2. 添加标题编号

// 添加标题编号,最多支持五级标题
func addTitle(lines []string) ([]string, []ChangedLine) {
	cLines := make([]ChangedLine, 0)
	titles := [5]int{0, 0, 0, 0, 0}

	for index, line := range lines {
		titleLevel := getTitleLevel(line)
		switch titleLevel {
		case 1:
			titles[0]++
			lines[index] = strings.Replace(line, "# ", fmt.Sprintf("# %d. ", titles[0]), 1)
			titles = [5]int{titles[0], 0, 0, 0, 0}
		case 2:
			titles[1]++
			lines[index] = strings.Replace(line, "## ", fmt.Sprintf("## %d.%d. ", titles[0], titles[1]), 1)
			titles = [5]int{titles[0], titles[1], 0, 0, 0}
		case 3:
			titles[2]++
			lines[index] = strings.Replace(line, "### ", fmt.Sprintf("### %d.%d.%d. ", titles[0], titles[1], titles[2]), 1)
			titles = [5]int{titles[0], titles[1], titles[2], 0, 0}
		case 4:
			titles[3]++
			lines[index] = strings.Replace(line, "#### ", fmt.Sprintf("#### %d.%d.%d.%d. ", titles[0], titles[1], titles[2], titles[3]), 1)
			titles = [5]int{titles[0], titles[1], titles[2], titles[3], 0}
		case 5:
			titles[4]++
			lines[index] = strings.Replace(line, "##### ", fmt.Sprintf("##### %d.%d.%d.%d.%d. ", titles[0], titles[1], titles[2], titles[3], titles[4]), 1)
			titles = [5]int{titles[0], titles[1], titles[2], titles[3], titles[4]}
		}

		if titleLevel != -1 {
			cLines = append(cLines, ChangedLine{LineNo: index + 1, Before: line, After: lines[index]})
		}
	}

	return lines, cLines
}

这里支持最多5级标题的编号,写的略显繁琐,本身逻辑比较简单,暂时没有去优化。

获取标题的等级写了简单的小函数:
(根据markdown的语法,根据每行开头 # 的个数来判断是几级的标题)

// 获取标题的等级
func getTitleLevel(s string) int {
	if strings.HasPrefix(s, "# ") {
		return 1
	}
	if strings.HasPrefix(s, "## ") {
		return 2
	}
	if strings.HasPrefix(s, "### ") {
		return 3
	}
	if strings.HasPrefix(s, "#### ") {
		return 4
	}
	if strings.HasPrefix(s, "##### ") {
		return 5
	}

	return -1
}

2.3. 新内容写入markdown文件

// 写入多行数据
func writeLines(fp string, lines []string) error {
	content := strings.Join(lines, "\n")
	return ioutil.WriteFile(fp, []byte(content), 0644)
}

2.4. 步骤合并起来

此命令行工具使用了 cobra 框架,最后把修改的部分也打印出来了。

type ChangedLine struct {
	LineNo int
	Before string
	After  string
}

var rootCmd = &cobra.Command{
	Use:   "mt",
	Short: "给mkdown标题添加编号",
	RunE: func(cmd *cobra.Command, args []string) error {
		if len(args) < 1 {
			return fmt.Errorf("NO file input!")
		}
		fp := args[0]
		lines, err := getAllLines(fp)
		if err != nil {
			return err
		}

		newLines, changedLines := addTitle(lines)
		err = writeLines(fp, newLines)
		if err != nil {
			return err
		}

		fmt.Println("修改的内容:>>>")
		for _, cl := range changedLines {
			fmt.Println("===================================")
			fmt.Printf("line【%d】:\n修改前:%s\n修改后:%s\n", cl.LineNo, cl.Before, cl.After)
			fmt.Println("===================================")
		}

		return nil
	},
}

3. 使用方法

go build  # 编译后生成 mdtitle 二进制文件
./mdtitle xxxx.md   # 运行

本文最后附加的下载地址中有完整源码。
其中也包含编译好的二进制(linux和windows版本2个都有)。

4. 补充说明

今天一时起意写的小工具,只是为了方便给自己从语雀导出的markdown加标题编号。
一定还有很多不足之处有待完善,写完之后我自己感觉至少还需要完善:

  1. 没有判断文档是否已经有标题编号,已经有标题编号的情况,应当忽略继续添加标题编号
  2. 标题的层级是硬编码的,目前只支持5级标题(不过5级应该满足大部分情况了)

代码下载地址(其中包含编译好的linux和windows下的二进制):
md-title.zip: https://url11.ctfile.com/f/45455611-859852761-9f5f8e?p=6872
(访问密码: 6872)文章来源地址https://www.toymoban.com/news/detail-457272.html

到了这里,关于Markdown标题自动添加编号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Markdown文档书写规范

    MarkDown 越来越成为方便快捷有效的文档书写格式。尤其对开发者来说。 主要有两个地方用到: 项目的 README.md 文件是每个项目都应该有的一个项目说明文档,里面介绍了项目的基础信息,和需要注意的地方。 写博客的时候,技术的或者生活的 但发现大多数人的书写还是非常

    2024年02月09日
    浏览(39)
  • jupyter文档转换成markdown

    上一篇文章**《如何优雅地用python生成模拟数据》**我就使用 jupyter 写的,这个真的是万能的,可以插入 markdown 格式的内容,也可写代码,关键是像 ipython 一样,可以分步执行。 我可以这样自由的写我的博客内容,但是问题来了, 现在的博客都是去识别markdown格式的内容的

    2024年02月13日
    浏览(42)
  • 【python】使用docx获取word文档的标题等级、大纲等级和编号等级

    在Microsoft Word中: 【标题X】是一个样式,一般来说,【标题1】样式的大纲级别是1级。 大纲级别一般用于页面导航和生成目录。可以右键文字-段落里查看/设置大纲的级别。设置成【x级】后左侧导航栏就会显示。 编号等级就是大家熟知的项目编号,常用于正文。 基本没有一

    2024年02月03日
    浏览(42)
  • 玩转开源 | 搭建 Hugo 管理 Markdown 文档

    在工作、学习中,不可避免会要写一些文档;又或者想搭建个简单网站,记录和分享您的生活经验或知识;撰写这些文档中使用 markdown 是一个非常不错的选择,让我们更加聚焦在文档表达的内容上。实际上笔者的文档基本都是在 Sublime 中用 markdown 格式撰写的。 在 先前文章

    2024年02月05日
    浏览(50)
  • 在markdown中添加视频的两种方法

    查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 markdown浏览器中如何添加视频呢?两种方式: 。 源代码: Network 灰鸽宝典为开发配置保驾护航,让服务运行

    2024年02月03日
    浏览(41)
  • 安卓平板怎么写word文档,安卓平板怎么写markdown

    大家好,本文将围绕安卓平板怎么写论文的软件展开说明,安卓平板怎么写字做笔记是一个很多人都想弄明白的事情,想搞清楚安卓平板怎么写word文档需要先了解以下几个事情。 Source code download: 本文相关源码         看着刚刚人入手的华为鸿蒙系统MatePad11平板,是如此

    2024年03月15日
    浏览(96)
  • SpringBoot接口文档生成插件:EasyYapi(支持yapi、Markdown、Postman)

    优势 对比手写文档: 略 对比Swagger: 不需要写繁杂的swagger注解,只要求代码注释遵循全球统一的JavaDoc规范 支持导出到Yapi、Postman脚本、Markdown文档、Json 准备工作 IDEA安装插件:EasyYapi GitHub 规范 JavaDoc规范 遵循JavaDoc规范(其实就是开发过程中把字段注释和方法注释写好)。

    2024年02月02日
    浏览(49)
  • UEditorPlus v3.8.0 文档导入支持直接粘贴 Markdown 格式,已知问题修复

    UEditor 是由百度开发的所见即所得的开源富文本编辑器,基于MIT开源协议,该富文本编辑器帮助不少网站开发者解决富文本编辑器的难点。 UEditorPlus 是有 ModStart 团队基于 UEditor 二次开发的富文本编辑器,主要做了样式的定制,更符合现代浏览器的审美。 在开发过程中解决了

    2024年02月19日
    浏览(56)
  • Swagger + DOCWAY 一步导出为优雅完整的Markdown、Pdf接口文档

           只要开发,只要写接口应该没人不知道Swagger,但DOCWAY可能知道的人不多,但知道用过后就离不开了,不管是作为多方联调的接口文档,还是交接给客户的文档,都是可以的,具体如何使用,详细步骤可以参考这篇博文,我就不在这里赘述了。       看下PDF的生成效果

    2024年02月06日
    浏览(36)
  • 【飞书】飞书导出md文档 | 飞书markdown文档导出 | 解决飞书只能导出pdf word

    github地址:https://github.com/Wsine/feishu2md 这是一个下载飞书文档为 Markdown 文件的工具,使用 Go 语言实现。 请看这里:招募有需求和有兴趣的开发者,共同探讨开发维护,有兴趣请联系。 《一日一技 | 我开发的这款小工具,轻松助你将飞书文档转为 Markdown》 配置文件需要填写

    2024年02月15日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包