Typora 博文标题自动编号

1、Why?

1.1、Typora标题自动编号

  • 修改 base.user.css 中的 css 代码可达到如下效果,看着还不错

1.2、博文效果

  • 修改 base.user.css 中的 css 代码只能实现 Typora 中的视觉效果,并不是真正在标题中添加了序号

2、Let’s Do it

2.1、目标

  • 编写 Java 脚本,读取 MD 文件的内容,并在每个标题之前添加标题序号

2.2、代码

  • 大致思路:

    • 每一级标题都有自己的计数器,由于一级标题不参与编号,从二级标题开始算起,Typora 最多支持六级标题,我们用一个长度为 5 的一维数组代表 2~6 级标题计数器
    • 每读取一行,便判断此行是否为标题行,如果是标题行,则为当前标题添加标题序号
    • 标题计数器初始默认值为 0 ,每次用的时候便执行 += 1 操作

public class TitleAutoNumbering {public static void main(String[] args) {// MD 文件位置String destMdFilePath;// 从命令行读取 MD 文件位置,否则使用默认值if (args == null || args.length == 0) {destMdFilePath = "C:\\Users\\Heygo\\Desktop\\Typora + PicGo + Aliyun OSS + CSDN.md";} else {destMdFilePath = args[0];}// 执行标题自动编号doTitleAutoNumbering(destMdFilePath);}/*** 执行标题自动编号** @param destMdFilePath MD 文件路径*/private static void doTitleAutoNumbering(String destMdFilePath) {// 获取标题自动编号的MD文件内容String mdFileContent = getAutoTitledMdContent(destMdFilePath);// 执行保存(覆盖原文件)SaveMdContentToFile(destMdFilePath, mdFileContent);}/*** 获取标题自动编号的MD文件内容** @param destMdFilePath MD 文件路径* @return*/private static String getAutoTitledMdContent(String destMdFilePath) {// 如果不是 MD 文件,滚蛋Boolean isMdFile = destMdFilePath.endsWith(".md");if (!isMdFile) {return "";}// 标题编号/*标题编号规则:- 一级标题为文章的题目,不对一级标题编号- 二级、三级、四级标题需要级联编号- 五级、六级标题无需级联编号,只需看上一级标题的脸色,递增即可*/Integer[] titleNumber = new Integer[]{0, 0, 0, 0, 0};// 存储md文件内容StringBuilder sb = new StringBuilder();// 当前行内容String curLine;// 装饰者模式:FileReader无法一行一行读取,所以使用BufferedReader装饰FileReadertry (FileReader fr = new FileReader(destMdFilePath);BufferedReader br = new BufferedReader(fr);) {// 当前行有内容while ((curLine = br.readLine()) != null) {// 判断是否为标题行,如果是标题,是几级标题Integer curTitleLevel = calcTitleLevel(curLine);if (curTitleLevel != -1) {// 插入标题序号curLine = insertTitleNumber(curLine, titleNumber);// 重新计算标题计数器RecalcTitleCounter(curTitleLevel, titleNumber);}// 向缓冲区中追加内容sb.append(curLine + "\r\n");}// 返回 MD 文件内容return sb.toString();} catch (IOException e) {e.printStackTrace();// 失败返回空字符串return "";}}/*** 计算当前标题等级** @param curLine 当前行的内容* @return -1 :非标题行;大于等于 2 的正数:当前行的标题等级*/private static Integer calcTitleLevel(String curLine) {// 由于一级标题无需编号,所以从二级标题开始判断boolean isTitle = curLine.startsWith("##");if (!isTitle) {// 返回 -1 表示非标题行return -1;}// 现在来看看是几级标题Integer titleLevel = curLine.indexOf(" ");return titleLevel;}/*** 重新计算标题计数器的值** @param titleLevel  当前行的标题等级* @param titleNumber 标题计数器*/private static void RecalcTitleCounter(Integer titleLevel, Integer[] titleNumber) {// 二级标题更新时,三级及三级以下的标题序号重置为 0Integer startIndex = titleLevel - 1;for (int i = startIndex; i < titleNumber.length; i++) {titleNumber[i] = 0;}}/*** 向标题行中插入标题序号** @param curLine     当前行内容* @param titleNumber 标题计数器* @return*/private static String insertTitleNumber(String curLine, Integer[] titleNumber) {// 标题等级(以空格分隔的前提是 Typora 开启严格模式)Integer titleLevel = curLine.indexOf(" ");// 标题等级部分String titleLevelStr = curLine.substring(0, titleLevel);// 标题内容部分String titleContent = curLine.substring(titleLevel + 1);// 先去除之前的编号titleContent = RemovePreviousTitleNumber(titleContent);// 标题等级递增Integer titleIndex = titleLevel - 2;titleNumber[titleIndex] += 1;// 标题序号String titleNumberStr = "";switch (titleLevel) {case 2:titleNumberStr = titleNumber[0].toString();break;case 3:titleNumberStr = titleNumber[0].toString() + "." + titleNumber[1];break;case 4:titleNumberStr = titleNumber[0].toString() + "." + titleNumber[1] + "." + titleNumber[2];break;case 5:titleNumberStr = titleNumber[3].toString();break;case 6:titleNumberStr = titleNumber[4].toString() + " ) ";break;}titleNumberStr += "、";// 插入标题序号titleContent = titleNumberStr + titleContent;System.out.println("已增加标题序号:" + titleContent);// 返回带序号的标题curLine = titleLevelStr + " " + titleContent;return curLine;}/*** 去除之前标题的编号* @param titleContent 标题内容* @return 去除标题编号之后的标题内容*/private static String RemovePreviousTitleNumber(String titleContent) {// 寻找标题中的 、 字符Integer index = titleContent.indexOf("、");if (index > 0 && index < 6) {// 之前已经进行过标号return titleContent.substring(index + 1);} else {// 之前未进行过标号,直接返回return titleContent;}}/*** 保存MD文件** @param destMdFilePath MD文件路径* @param mdFileContent  MD文件内容*/public static void SaveMdContentToFile(String destMdFilePath, String mdFileContent) {// 不保存空文件if (mdFileContent == null || mdFileContent == "") {return;}// 执行保存try (FileWriter fw = new FileWriter(destMdFilePath)) {fw.write(mdFileContent);} catch (IOException e) {e.printStackTrace();}}}

2.3、效果

  • 博文标题有编号,看着就舒服多了

Typora 博文标题自动编号相关推荐

  1. typora markdown 标题自动编号

    typora markdown 标题自动编号 1.参考资料 https://blog.csdn.net/HackerTom/article/details/96640782 https://zhuan ...

  2. Typora设置标题自动标号

    Typora由于默认标题无法自动标号,每次编辑时需要手动处理.为实现标题自动编号,需要进行相关操作. 一 官方说明 To achieve this, add the following to your ...

  3. Typroa标题自动编号(从一级目录或二级目录开始)

    Typora+Picgo+Gitee实现上传图片 单行换行:shift+enter 分段:enter 标题自动编号 从一级标题开始编号 创建base.user.css 文件,复制以下内容 保存文件到t ...

  4. Word章节标题及图表的自动编号及引用简记(含设置完标题自动编号之后的标题格式调整)

    Word标题及图表的自动编号及引用 最近需要给文章排版,做一简记. Word标题的自动编号 主要参考一百度文库文章: https://wenku.baidu.com/view/2557d6023c1e ...

  5. word标题自动编号

    word标题自动编号 wps可以只设置编号,,设置一次后,后面能自动跟着设置编号.只有编号不设置标题,不能生成导航和目录. word版调整方式: 1.需要编号的文字样式设置对应的标题样式,可以设置一个 ...

  6. 信创办公--基于WPS的Word最佳实践系列(实现标题自动编号)

    信创办公–基于WPS的Word最佳实践系列(实现标题自动编号) 1.应用背景 利用[导航窗格]可以对文档进行组织重排,对某一部分的顺序进行快速调换,但是如果标题前的编号是人工编号的话,编号是不会自动更 ...

  7. Typora设置标题自动添加序号

    仅供学习,转载请注明出处 打开文件 - 偏好设置 - 打开主题文件夹 设置css样式 创建一个空文件,命名为base.user.css. 里面粘贴如下内容保存后重启Typora,输入标题时会自动出现序 ...

  8. word中设置多级标题,标题自动编号

      word二级标题自动编号,本来应该是2.1,可是却变成1.3,怎么办?设置三个标题差不多够用了,因此,这里以三个标题为例,首先在样式里设置三个样式,可以命名为Title1,Title2,及Titl ...

  9. word 标题自动编号、按章节给图片设置题注、给图片添加对应的文字交叉引用

    论文标题自动编号.按章节给图片设置题注.给图片添加对应的文字交叉引用 1.准备环节及工作环境 2.多级列表 2.1 定义新的多级列表 2.2 修改标题格式 3.按章节给图片编号 3.1 插入题注 3. ...

最新文章

  1. Altium Designer隐藏电气连接线
  2. Java 里的HashMap(HashTable) 简介.
  3. 使用TCP的简单C/S程序
  4. java 变量共享_java对象,共享变量
  5. Net5 已经来临,让我来送你一个成功
  6. [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢?
  7. Django基础11(Django中form表单)
  8. 在C#中使用C++编写的类
  9. windows 编程随笔——输出文本WM_PAINT消息|有效矩形和无效矩形
  10. WebStorm生成Vue的组件关系图
  11. mybatis select 返回值long null_Mybatis框架(二)
  12. Shell:export命令
  13. UVA10014 Simple calculations【数列】
  14. 解决想从证书导出p12文件但是该证书中没有密码无法导出P12文件的问题
  15. 计算机超级终端 串口设置,win10系统超级终端软件连接串口设备的处理技巧
  16. word中怎么加脚注不分栏_如何在Microsoft Word 2010中使用脚注
  17. 门店电子会员卡系统,积分储值卡金额会员卡功能,JavaScript 局部作用域
  18. web前端简易网页制作
  19. android中注册的账号密码储存在,android SharedPreferences实现用户的注册和保存账号密码...
  20. windows系统信息修改

热门文章

  1. 第7章 贪吃蛇(《C和C++游戏趣味编程》配套教学视频)
  2. 信息泄露案件_圆通回应运单信息泄露案件:系主动报案,涉4万余条敏感信息...
  3. ubuntu中wps缺失字体
  4. 程序员笑话集锦:丈夫与妻子篇
  5. 当开源奔向物流,阿里云 PolarDB-X 数据库与韵达携手的背后
  6. 如何避免大规模线上故障?
  7. 拒绝假货!LVMH与普拉达、卡地亚联手推出区块链平台AURA
  8. 上线两天用户 10W+,这款 AI 知识图谱小程序有多牛?
  9. 为信息产业自主化而奋斗,第一本龙芯平台的Linux内核书来了!
  10. 如何快速写一款小而美的“上滑无限加载的控件”?| 博文精选