能让程序做的事情坚决不用人来做——批量修复markdownlint MD034警告

欢迎和大家交流技术相关问题:

现在各种编程语言都有自己的lint工具来做静态检查,防止一些低级错误并维持统一的风格。Markdown这样的样式标记语言也不例外,现在大家用的比较多的是markdownlint。该项目开源在github:https://github.com/markdownlint/markdownlint,当前很多实用markdown语言的项目都使用该工具。

markdownlint的检查规则目前有41项https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md,其中"MD034 - Bare URL used"是大家经常遇到的问题,如果你在Markdown文档中使用URL,但是没有在URL周围使用<>的话就会产生警告,我维护了一个类似于awesome的项目https://github.com/jiangxincode/cnblogs,其中报了1000多个类似的警告,如果全部手工来修改估计手都回废掉,因此写了个小程序在所有的.md文档中的所有url两遍加上了<>。

程序使用Java编写,比较简单,主要使用了正则表达式的替换,程序如下:

package edu.jiangxin.tools;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Solve the problem of MD034. <p>
 * {@link https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md}
 * This program doesn't process any exception!
 * @author aloys
 *
 */
public class MD034Solver {
    public static final String regex = "\\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$]";
    
    public static final String sourceDirStr = "D:\\temp\\cnblogs";
    
    public static final String targetDirStr = "D:\\temp\\cnblogsbak";

    public static void main(String[] args) throws IOException {
        // Source directory must be a valid directory which contains the text files to be processed.
        File sourceDir = new File(sourceDirStr);

        // Target directory must be a valid directory which will save the proecessed files.
        File targetDir = new File(targetDirStr);

        for (File file : sourceDir.listFiles()) {

            // take off the .git directory and .gitignore file
            if (file.getName().startsWith(".")) {
                continue;
            }

            BufferedReader reader = new BufferedReader(new FileReader(file));
            BufferedWriter writer = new BufferedWriter(new FileWriter(new File(targetDir, file.getName())));

            String temp = null;
            while ((temp = reader.readLine()) != null) {
                Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
                Matcher regexMatcher = pattern.matcher(temp);
                StringBuffer sb = new StringBuffer();
                while (regexMatcher.find()) {
                    String group = regexMatcher.group();
                    int start = regexMatcher.start();
                    if (start >= 1 && (temp.charAt(start - 1) == '<' || temp.charAt(start - 1) == '(')) {
                        regexMatcher.appendReplacement(sb, group);
                    } else {
                        regexMatcher.appendReplacement(sb, "<" + group + ">");
                    }

                }
                regexMatcher.appendTail(sb);
                writer.write(sb.toString());
                writer.newLine();
            }
            reader.close();
            writer.close();
        }
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏公众号_薛勤的博客

Java之文本文件的创建和读取(含IO流操作)

12620
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,

1:登录注册IO版本案例(掌握) 要求,对着写一遍。 cn.itcast.pojo User cn.itcast.dao UserDao cn.itca...

37980
来自专栏个人随笔

当Java遇到XML 的邂逅+dom4j

16820
来自专栏我杨某人的青春满是悔恨

封装一个 Swift-Style 的网络模块

Swift 跟 OC 有着完全不同的设计哲学,它鼓励你使用 protocol 而不是 super class,使用 enum 和 struct 而不是 clas...

10230
来自专栏于晓飞的专栏

Java I/O 总结

Java I/O的的架构使用了装饰器的模式,我们在使用流的时候需要新建很多的装饰器对象,对源数据进行层层包装。各个包装类名以及它们的应用场景比较多,初学的时候难...

25230
来自专栏软件工程师成长笔记

Java判断计算机网络连接是否正常

35420
来自专栏非典型技术宅

Swift实践:使用CoreData存储多种数据类的通讯录1. CoreData支持存储数据类型2. 使用CoreData存储多种数据类的通讯录3. Codable

20630
来自专栏IT大咖说

Getting started with Kotlin on Android

摘要 Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrain设计开发并开源,与Java相比,Kotlin的语法更简洁,更具表达性,而且提供了...

28750
来自专栏电光石火

java获取网页源代码

public static String getHtmlContent(URL url, String encode) {    StringBuffer...

27770
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列17-编程题-读取服务器字符、实现序列化、计数器、1000阶乘、n出列问题等

一,Java的通信编程,编程题(或问答),用JAVA SOCKET编程,读服务器几个字符,再写入本地显示? Server端程序: package test;...

47980

扫码关注云+社区

领取腾讯云代金券