为Markdown文件生成目录

缘由

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

思路

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

效果

左侧为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>
posted @ 2017-09-08 18:28  toto怎么会喝醉  阅读(835)  评论(0编辑  收藏  举报