/md_manager

使用qt,c++写的简单的本地markdown管理工具

Primary LanguageC++

md_manager

p 平常在本地使用 typoral 写markdown 笔记,通过git管理本地的笔记文件,定时上传github,使用hexo环境编译笔记并同步到github主页,但是由于 typoral 只是一个文档编辑器,每次要插入笔记引用和笔记yaml头等操作时很麻烦。

动机

一方面,本地 typoral + hexo + github 管理笔记的模式在创建笔记连接的时候不方便 另一方面,熟悉一下 c++ 编程,所以编写了一个简单的插件辅助管理本地的笔记

开发环境

windows / QT 5.12 / C++

开发流程

  1. qt crator 编写代码,本地调试
  2. 使用 windeployqt main_window.exe 将exe运行需要的依赖文件都自动拷贝到一个文件夹下
  3. 使用 Inno setup 打包出安装文件,生成安装包,可以在任何电脑上运行 (使用方法 Inno使用方法

软件使用方法

image-20210514172857737

第一次使用的时候,通过参数设置页面,设置本地笔记的根目录,然后退出重启,即可。

软件功能

  • 生成笔记连接:第一次单击需要插入引用的 笔记,选择添加笔记引用功能,第二次单击它要引用的笔记文件;然后会自动将引用写入系统粘贴板,粘贴至笔记中即可
  • 生成笔记yaml头信息:同样,单击,选择添加笔记功头选项。即可在对应文件的开头插入 yaml 信息,这个在 hexo 编译的时候用的上
  • 更新文件中的引用和头信息:当本地笔记文件目录或者名字改变时,通过最上面的更新引用功能,即可自动修正相关的引用(实现原理是 将每个文件的创建时间作为 标识,通过缓存文件来记录每个文件的历史路径)
  • 一键同步上传本地笔记:使用 system 函数调用cmd,因此可以在参数设置页面中设置 hexo 编译和 git 上传的命令,每一行为一条命令,最后一行没有换行符。设置完后,就可以使用一键上传功能

开发记录

实现原理

首先 需要一个本地缓存,首次运行遍历 当前目录下的所有 md 文件,查找文件中的 插入的超链接 和它连接到的文件;使用一个 类 来管理。

  1. 扫描文件夹,建立缓冲文件,即预先存储所有的 笔记连接映射,还有一些配置参数
  2. 将缓存文件读入内存,以键值对的形式保存。
  3. 当单个文件名和路径修改时,需要找到原始的文件名,然后替换。(如果不是通过软件修改,怎么识别变动?)
    • 通过唯一的文件创建时间来建立 映射,初始遍历所有文件,如果有重复的创建时间,需要去重,并修改id,然后建立 文件名和创建时间的映射。然后将这个映射写进 缓存文件。
    • 后续如果有文件修改,找出这个最近修改了的文件名和唯一标识符。首先遍历所有 md 文件,和历史缓存的信息对比
      • 唯一标志符存在,且和本地记录的文件名一致,说明只是文件内容修改了,这种情况不用操作
      • 唯一标志符存在,对应的文件路径不一致,说明要么是移动了路径,要么是修改了文件名。找到引用它的所有文件,以及它自己引用的所有文件 (因为引用的插入都是相对路径的形式), 修改笔记中的引用,如果它有 yaml 头信息,还要将 categories 信息修正。这一步调整的都是 md 文件
      • 唯一标志符不存在,说明是新建立的文件,这中情况也不用操作
  4. 完成上述操作后,重新扫描一遍文件夹,在内存中重新建立缓存,并写入本地 cathe.json文件中。

上述的逻辑可能不是最优的,因为要扫描两遍,比较耗时。不过本地文件较少,目前没用多线程去扫描,这个判断逻辑应该可以优化吧。

问题

c++ 的 ifstream 这种功能很奇怪,当路径为中文并且使用 UTF-8 编码的格式,就打不开。因为md文件默认编码都是 utf8 qt编辑器默认也是 utf8 而使用 c++ 的 ifstream 以及 文件遍历的函数都只能支持 gbk 编码的中文路径。很无解,所以在代码中有频繁的 utf8 转 gbk 的地方,用的很混乱。

管理 mrkdown 的类使用的 纯c++ 没有使用 qt ,感觉还是用 qt 做目录遍历,文件读写啥的会方便很多,不用考虑编码格式问题吧

qt 的 QFileSystemModel 看起来很牛皮,实现文件浏览只用一行代码。但是居然只提供了 文件 rename 的信号,如果是文件移动就不能实时给出信号。所以本来想增加一个文件监视的共能,如果有一个文件变动,就只修改这一项,不用再遍历所有文件对比了。但是没找到qt 的这个接口,倒是有个 QFileSystemWatcher 但是这个用于监控一个文件还好,如果是很多文件夹,好像就不太好。

对 Qt 不熟悉,界面功能实现上走了好多弯路。

本地笔记管理流程

使用typoral+github / 图床云笔记 typoral云笔记搭建.,在本地通过 typoral编写笔记,使用git同步到云端

使用hexo+github 制作个人主页 hexo的使用.,方便在网页中浏览笔记

最后使用该软件辅助,作为 typoral 的补充