Git作MD代码笔记用时,提交前自动生成根目录索引的钩子

本文介绍如何使用Git钩子和VNote软件自动生成Markdown格式代码笔记的目录索引,实现高效管理个人代码知识库。

Git 做代码笔记,利用钩子自动生成所有目录下的 MD 文件索引

偶然有一天,我想利用Markdown格式的文件来做代码笔记本,试用了多款软件,发现VNote这款软件还不错,下载地址: https://github.com/tamlok/vnote/releases/tag/v2.8.2

我结合了目录文件方法,还有VNote软件的使用,达到了自己想要用Markdown写代码笔记的目的,目录文件利用Git钩子生成所有文件的索引,可以方便在GitHub上查看,而VNote则作为md文件的编辑器及本地客户端使用。

我的 Git 代码笔记的目录结构:

  • git 项目根目录
    • HTML
      • xxx.md
      • yyy.md
    • CSS
    • Git
    • 前端
      • VUE
    • README.md

大概就类似这样,支持多级目录,目录下就是 md 文件,我的想法是,通过钩子自动提取这些文件的文件名并自动生成一个目录索引,就像下面这样:

我的代码笔记

Composer

Express

Git

NPM

PHP

VUE

我要的最终效果就是上面这样的,然后我用它替换 README.tpl.md 里面的一个特殊字符串,生成README.md,最后在自动提交推送到 GitHub 上,于是所有的 md 就有索引了,一个简单的 md 代码笔记本就完成了!

我的系统是 Windows,而且也安装了 NodeJs,所以 Git 的钩子就用 Node 写了,钩子文件名是 pre-commit ,需要放在项目目录下 .git\hooks 文件夹下,使用了VNote,需要过滤一些文件,定义在钩子文件里,钩子文件完整代码如下:

#!/usr/bin/env node

const execSync = require('child_process').execSync
const fs = require('fs')
const path = require('path')

const urlPrefix = 'https://github.com/qq940390/CodeNote/blob/master/'
const projectPath = path.join(__dirname, '../../')

//要忽略的文件夹或文件
const ignoreItem = ['.git', '_v_recycle_bin', '_vnote.json']
//要忽略的文件后缀
const ignoreExt = ['json']

//获取所有目录和子目录下的文件,如果需要判断文件格式,需要另外修改
function getAllFiles (_path) {
    let files = []
    let level = 1
    function findFile (_path) {
        let paths = fs.readdirSync(_path)
        paths.forEach(function (item, index) {
            //排除文件夹和文件
            if (ignoreItem.indexOf(item) !== -1 || ignoreExt.indexOf(item.substr(item.lastIndexOf('.') + 1)) !== -1) return;

            let fPath = path.join(_path, item)
            let stat = fs.statSync(fPath)
            if (stat.isDirectory() === true) {
                level += 1
                findFile(fPath)
                level -= 1
            }
            if (stat.isFile() === true && level > 1) {
                fPath = fPath.replace(projectPath, '').replace('\\', '/')
                let pathPrefix = fPath.replace(item, '')
                files.push([pathPrefix, fPath.replace(pathPrefix, '')])
            }
        })
    }
    findFile(_path)
    return files
}

//将文件名改变为 md 中的 url 格式内容
var dirFiles = getAllFiles(projectPath)
var data = []
dirFiles.forEach(function (item, index) {
    let url = urlPrefix + encodeURI(item[0] + item[1])
    if (!data[item[0]]) data[item[0]] = []
    data[item[0]].push('[' + item[1] + '](' + url + ')')
})

//按照一定格式制定内容
var fileData = []
for (let index in data) {
    let str = []
    str.push('## ' + index.substr(0, index.length - 1) + '\n')
    data[index].forEach(function (item) {
        str.push('* ' + item)
    })
    fileData.push(str.join('\n') + '\n')
}

//读取 README.md 的模板文件 README.tpl.md
var tplData = fs.readFileSync(projectPath + '/README.tpl.md').toString()
//替换变量标签 {{replacement}} 为正式内容
tplData = tplData.replace('{{replacement}}', fileData.join('\n'))

//覆盖 README.md 文件
fs.writeFileSync(projectPath + '/README.md', tplData)

//将变更的文件列入待提交内容里
execSync(`git add README.md`)

//正确退出,输出非0值表示拒绝提交
process.exit(0)

README.tpl.md 文件的内容:

# 我的代码笔记

{{replacement}}

代码粗糙别介意,能实现功能就行。其中 README.tpl.md 和 README.md 文件同级目录。
钩子文件里的 urlPrefix 可以自行将 https://github.com/qq940390/CodeNote 替换为自己项目的地址。
最后,还要将 *.vswp 类型加入 .gitignore 文件里忽略掉,这是VNote编辑md文件时的临时文件。

最终生成的 md 列表格式,也是可以修改的,在 pre-commit 文件里修改,最终的 README.md 的上面部分的内容可以在模板里根据自己需要修改。同理,大家也可以发挥更多的想象,实现更多的想法。

如果大家觉得有用,就点个赞吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值