为Markdown文件生成目录

本文介绍了一个简单的工具,该工具能够为Markdown文件自动生成目录。利用HTML标签,此工具通过解析Markdown标题并创建链接来实现这一目标。这不仅使得Markdown文件更易于导航,同时也保留了Markdown的简洁性和易编辑性。
缘由

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

思路

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

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

575312-20170908183041476-850609780.png

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

575312-20170908183247116-418882356.png

原文件和处理后文件

575312-20170908184102163-971903777.png

代码实现
/**
     * 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<File> files = new LinkedList<File>();
        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;
    }
看都看了,不点个推荐,心不会痛吗? =..=

转载于:https://www.cnblogs.com/lknny/p/7495914.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值