为Markdown文件生成目录
缘由
Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件。虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有Markdown方面。以上,所以我决定生成一种既有目录,并且修改起来还比较方面的Markdown文件。
思路
Markdown是兼容HTML语法的,那么通过抽取Markdown中的标题,生成HTML标签,并且链接到各标题,一份简易的目录即可完成。
效果
左侧为Markdown文件,右侧为Markdown文件预览

处理后的Markdown文件和预览效果

原文件和处理后文件

代码实现
```java
/**
* 1.目录仅支持从##开始
* 2.正文不要有##符号
* 3.启动入参必须为文件夹目录,目录下所有md文件,均会转化。默认为运行路径。
*/
public static void main(String[] args) {
String dir=System.getProperty("user.dir");
if (null!=args&&args.length>0){
dir = args[0];
}
List files = new LinkedList();
files.addAll(FileUtils.listFiles(new File(dir), new String[] { "md" }, true));
for (File file : files) {
int index = 0;
int initLevel = 1;
StringBuilder header = new StringBuilder();
StringBuilder content = new StringBuilder();
try {
// 读取文件,并且以utf-8的形式写出去
BufferedReader bufread;
String read;
bufread = new BufferedReader(new FileReader(file));
while ((read = bufread.readLine()) != null) {
if (read.contains("##")){
String cxt = read.replaceAll("#", "");
if (index==0){
//初始目录层级,第一层字体为3
initLevel = getLevel(read);
header.append("* ");
header.append("[<font size=3 face=\"微软雅黑\">" + cxt + "</font>](#" + index + ")");
header.append("\r\n");
}else {
int level = getLevel(read)-initLevel;
for (int i=0;i<level;i++) {
header.append(" ");
}
header.append("* [<font size=3 face=\"微软雅黑\">" + cxt + "</font>](#" + index + ")");
header.append("\r\n");
}
content.append("<h4 id="+index+"><font color=red size=3 face=\"微软雅黑\">"+cxt+"</font></h4>");
++index;
}else{
content.append(read);
}
content.append("\r\n");
}
bufread.close();
File newFile = new File(file.getAbsolutePath().replace(".md", "_new.md"));
FileWriter fileWritter = new FileWriter(newFile.getName(), false);
fileWritter.write(header.toString());
fileWritter.write("\r\n");
fileWritter.write(content.toString());
fileWritter.flush();
fileWritter.close();
} catch (FileNotFoundException ex) {
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
private static int getLevel(String read) {
int i = 0;
for(int j=0;j<read.length();j++) {
if (read.charAt(j) == '#') {
++i;
}
}
return i;
}
<h4 id=5><font color=green size=3 face="微软雅黑"> 看都看了,不点个推荐,心不会痛吗? =..=</font></h4>
为Markdown文件生成目录的更多相关文章
- 为 github markdown 文件生成目录(toc)
业务需要 在编写 github 项目时,有时候会编写各种 README.md 等 markdown 文件,但是 github 默认是没有目录的. 于是就自己写了一个小工具. markdown-toc ...
- Markdown自动生成目录
Markdown自动生成目录 使用npm语法生成 1.安装npm 2.安装doctoc插件 3.执行生成 参考 Markdown自动生成目录 使用npm语法生成 1.安装npm 我的系统是deepin ...
- 对扫描的pdf文件生成目录
很多pdf文件是直接扫描生成的,于是它的内容都是一张张的图片,当然就更没有目录索引了. 有的时候想找某些内容,只能一点点的移动滚动条,非常不方便. 那么有什么方法能生成目录呢? 方法一:使用福昕pdf ...
- 解析Markdown文件生成React组件文档
前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...
- GitHub README文件生成目录导航
效果 环境说明 [root@C61 ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@C61 ~]# uname -a Lin ...
- 几种编辑器的markdown-toc生成目录在github上的表现
Vscode vscode的markdown-toc插件的实现是比较好的, 目前发现的问题就只有在自动生成带链接目录的时候无法正确识别和生成一些特殊的字符. 例如: ▶ 这导致在标题中不能加入特殊字符 ...
- 为Github的README.md生成目录的小工具
1 概述 因为Github的README.md文件[TOC]不生效,因此封装了一个别人已封装好的JAR包供大家使用. 2 使用方法 用Java做的,只需要JDK11以上的环境: java -jar t ...
- Markdown基本语法及生成目录结构的方法
Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 一.标题 在想要设置为标题的文字前面加#来表示一个#是一级标题,二个#是二级标题,以此类推.支持六 ...
- vue 将markdown字符串转html、修改主题、生成目录
前言 将 markdown 字符串转成 html 显示出来,同时把目录也提取出来一起显示.可以使用 marked 来读取 markdown 字符串解析成 html marked官网:https://m ...
随机推荐
- (转)fiddler实现手机抓包的基础设置问题
电脑最好是笔记本,这样能和手机保持统一局域网内:其他不多说,直接说步骤了. 一.对PC(笔记本)参数进行配置 1. 配置fiddler允许监听到https(fiddler默认只抓取http格式的 ...
- js实现轮播图效果(附源码)--原生js的应用
1.js实现轮播图效果 <!DOCTYPE html><html lang="en"><head> <meta charset=" ...
- helpers.bulk时 action_request_validation_exception 异常
语言Python 在开发时,批量插入ES,出现了action_request_validation_exception异常.我的代码是这样的 action = { } helpers.bulk(es, ...
- 深入浅出数据结构C语言班(11)——简要介绍算法时间复杂度
在接下来的数据结构博文中,我们将会开始接触到一些算法,也就是"解决某个问题的方法",而解决同一个问题总是会存在不同的算法,所以我们需要在不同的算法之中做出抉择,而做出抉择的根据往往 ...
- Linux(7)chmod解析
在UNIX和Linux的操作系统中, 每个文件(文件夹也被看作是文件)都按读, 写, 运行设定权限 比如用ls -l或ll命令列文件表时, 得到如下输出: -rw-r--r-- 1 apple use ...
- Hibernate与 MyBatis的比较(转)
第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.NET,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀 ...
- expdp导出文件,ORA-01555: 快照过旧: 回退段号 716
快照号过旧,回退段号过小,信息如下:ORA-31693: 表数据对象 "CZBSDB"."SMS_RESULT_RECORD" 无法加载/卸载并且被跳过, 错误 ...
- ASP.NET在母版页或内容页上获取控件ID
原本想给一个button添加一个confirm,不同的分数提示不同的信息(大于80合格,小于80不合格,提示是否提交),最开始用了button.Atribute.Add();但是它每次获取到的是lab ...
- [BZOJ3038]上帝造题的七分钟2 树状数组+并查集
考试的时候用了两个树状数组去优化,暴力修改,树状数组维护修改后区间差值还有最终求和,最后骗了40分.. 这道题有好多种做法,求和好说,最主要的是开方.这道题过的关键就是掌握一点:在数据范围内,最多开方 ...
- Java静态绑定与动态绑定
程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来.对java来说,绑定分为静态绑定和动态绑定:或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定(也就是说 ...