为Markdown文件生成目录

时间:2023-01-27 13:59:55

缘由

Markdown源生文件源生不支持目录,目前比较主流的生成目录的方式(各式插件),都是转化为HTML文件。虽然HTML文件可以生成眼花缭乱的目录,但是修改起来又没有Markdown方面。以上,所以我决定生成一种既有目录,并且修改起来还比较方面的Markdown文件。

思路

Markdown是兼容HTML语法的,那么通过抽取Markdown中的标题,生成HTML标签,并且链接到各标题,一份简易的目录即可完成。

效果

左侧为Markdown文件,右侧为Markdown文件预览

为Markdown文件生成目录

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

为Markdown文件生成目录

原文件和处理后文件

![](http://images2017.cnblogs.com/blog/575312/201709/575312-20170908184102163-971903777.png)

代码实现

```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文件生成目录的更多相关文章

  1. 为 github markdown 文件生成目录&lpar;toc&rpar;

    业务需要 在编写 github 项目时,有时候会编写各种 README.md 等 markdown 文件,但是 github 默认是没有目录的. 于是就自己写了一个小工具. markdown-toc ...

  2. Markdown自动生成目录

    Markdown自动生成目录 使用npm语法生成 1.安装npm 2.安装doctoc插件 3.执行生成 参考 Markdown自动生成目录 使用npm语法生成 1.安装npm 我的系统是deepin ...

  3. 对扫描的pdf文件生成目录

    很多pdf文件是直接扫描生成的,于是它的内容都是一张张的图片,当然就更没有目录索引了. 有的时候想找某些内容,只能一点点的移动滚动条,非常不方便. 那么有什么方法能生成目录呢? 方法一:使用福昕pdf ...

  4. 解析Markdown文件生成React组件文档

    前言 最近做的项目使用了微前端框架single-spa. 对于这类微前端框架而言,通常有个utility应用,也就是公共应用,里面是各个子应用之间可以共用的一些公共组件或者方法. 对于一个团队而言,项 ...

  5. GitHub README文件生成目录导航

    效果 环境说明 [root@C61 ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@C61 ~]# uname -a Lin ...

  6. 几种编辑器的markdown-toc生成目录在github上的表现

    Vscode vscode的markdown-toc插件的实现是比较好的, 目前发现的问题就只有在自动生成带链接目录的时候无法正确识别和生成一些特殊的字符. 例如: ▶ 这导致在标题中不能加入特殊字符 ...

  7. 为Github的README&period;md生成目录的小工具

    1 概述 因为Github的README.md文件[TOC]不生效,因此封装了一个别人已封装好的JAR包供大家使用. 2 使用方法 用Java做的,只需要JDK11以上的环境: java -jar t ...

  8. Markdown基本语法及生成目录结构的方法

    Markdown是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式. 一.标题 在想要设置为标题的文字前面加#来表示一个#是一级标题,二个#是二级标题,以此类推.支持六 ...

  9. linux怎么实时查看目录下是否有文件生成

    inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件. inotify-tools是用 ...

随机推荐

  1. 两个APP之间怎么调用《IT蓝豹》

    两个app之间怎么调用?   (1):通过显示Intent 启动    首先:配置好B app 的action,即AndroidManifest.xml中声明 <intent-filter&gt ...

  2. php随机生成指定长度的字符串 可以固定数字 字母 混合

    php 生成随机字符串 可以指定是纯数字 还是纯字母 或者混合的. 可以指定长度的. function rand_zifu($what,$number){ $string=''; for($i = 1 ...

  3. centos下各种c&plus;&plus;库文件的安装

    Centos编译boost   1.下载最新的boost http://www.boost.org/   2.解压文件 tar -xzvf boost_1_45_0.tar.gz    3.编译bja ...

  4. Android记录4--自定义ToggleButton&plus;用SharedPreferences保存用户配置

    Android记录4--自定义ToggleButton+用SharedPreferences保存用户配置 2013年8月14日Android记录 很多应用都会有用户设置,用户的一些偏好可以由用户来决定 ...

  5. Java JSON处理库Jackson

    Jackson是一款为Java平台提供的一套数据处理类库工具,Jackson的主要功能是提供JSON解析和生成.另外,Jackson还提供额外的类库以支持处理Avro, CBOR, CSV, Smil ...

  6. &lbrack;js&rsqb; 实现接口

    摘要 js 语言并没有interface implement 关键字,如果要做到和后端语言类似的接口,一般会需要模拟实现. 在oo 编程中, 接口可以让架构师规定好模块必须要实现的方法, 尽量解耦模块 ...

  7. Number 类型

    Javascript使用IEEE -754格式存储整型和浮点型(有些语言称为双精度) 因为这种存储格式,所以javascript中有正的0和负的0   整型也可以存储八进制和十六制   八进制第一个数 ...

  8. JDBC常见面试题

    以下我是归纳的JDBC知识点图: 图上的知识点都可以在我其他的文章内找到相应内容. JDBC常见面试题 JDBC操作数据库的步骤 ? JDBC操作数据库的步骤 ? 注册数据库驱动. 建立数据库连接. ...

  9. 云计算基础 (redhat7介绍及相关配置)

    redhat7简介 新版本的rhel7不再对32位架构的支持 引导程序: GRUB2,比之前的GRUB更强大,GRUB2支持bios,efi和openfiremware GRUB2支持mbr分区表和g ...

  10. Rxjava学习&lpar;二操作符&rpar;

    操作符是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件 1.filter filter()操作符是可 ...