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

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

邮箱: [email protected]

博客园地址: http://www.cnblogs.com/jiangxinnju

GitHub地址: https://github.com/jiangxincode

知乎地址: https://www.zhihu.com/people/jiangxinnju

现在各种编程语言都有自己的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();
        }
    }

}

原文地址:https://www.cnblogs.com/jiangxinnju/p/8505026.html

时间: 2024-08-03 15:17:27

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

《极客头条》精选:每天每周每月每年程序员该做的事情

程序员每天该做的事 1.总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2.考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3.考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢的 4.考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗?(1+

每天,每周,每月,每年程序员该做的事情

程序员每天该做的事 1.总结自己一天任务的完成情况 最好的方式是写工作日志,把自己今天完成了什么事情,遇见了什么问题都记录下来,日后翻看好处多多 2.考虑自己明天应该做的主要工作 把明天要做的事情列出来,并按照优先级排列,第二天应该把自己效率最高的时间分配给最重要的工作 3.考虑自己一天工作中失误的地方,并想出避免下一次再犯的方法 出错不要紧,最重要的是不要重复犯相同的错误,那是愚蠢的 4.考虑自己一天工作完成的质量和效率能否还能提高 一天只提高1%,365天你的效率就能提高多少倍你知道吗? (

无论做什么事情都不可能做到一蹴而就,很多事情都是水滴石穿。那么作为一名Java程序员

无论做什么事情都不可能做到一蹴而就,很多事情都是水滴石穿.那么作为一名Java程序员当然也要保持不断学习的状态才能在这个领域站稳脚跟.那些工作了一定年限的技术人总有一天会感觉到自己遇到了职业瓶颈,这个时候如果你还是安于现状不去学习钻研的话只会被长江后浪推前浪 把你拍死在沙滩上了. 那么该怎么学习呢 ?学习什么呢?系统化的学习工作所需要的是基础知识,而不是到百度或谷歌查资料解决.这样有助于遇到问题后通过相关知识关联分析,也有助于搭建更合理的技术架构,或改进现有技术架构的不足,让知识形成协同效应.

【Android开发-1】必做的事情,android开发环境搭建

前言:互联网移动端现在发展的速度越来越快了,各种App应用软件和手游的崛起,把移动端弄的丰富多彩:心情一激动,头脑一发热,就开始看视频.看书学习了.记得11年的时候有学习了下Android的开发,但是只是基础的学习了下,没认真深入学习.这次自己决定认真学习下,并用博客记录下,见证自己成长的过程. 一.准备工作 1.下载最新版jdk:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.下载Eclipse,选择Ec

Android Activity生命周期都该做哪些事情?

Android系统根据生命周期的不同阶段唤起对应的回调函数来执行代码.系统存在启动与销毁一个activity的一套有序的回调函数.本节来讨论下不同生命周期的回调函数里都该做哪些事情,不该做哪些事情. 理解生命周期的回调 在一个activity的生命周期中,系统会像金字塔模型一样去调用一系列的生命周期回调函数.Activity生命周期的每一个阶段就像金字塔中的台阶.当系统创建了一个新的activity实例,每一个回调函数会向上一阶移动activity状态.处在金字塔顶端意味着当前activity处

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有

迭代器就是重复地做一些事情,可以简单的理解为循环,在python中实现了__iter__方法的对象是可迭代的,实现了next()方法的对象是迭代器,这样说起来有点拗口,实际上要想让一个迭代器工作,至少要实现__iter__方法和next方法.很多时候使用迭代器完成的工作使用列表也可以完成,但是如果有很多值列表就会占用太多的内存,而且使用迭代器也让我们的程序更加通用.优雅.pythonic.下边是一个例子,从里边你会感受到不用列表而用迭代器的原因. #!/usr/bin/env python #c

C# Online ! 第三篇:连C#也不例外 ! 这是新手都要做的事情!!

玩过Online game的朋友一定都知道,游戏刚开始新手都会有一定要做的事情,可能是先去打木人,或是先找头上有惊叹号的人说说话,这样很快就可以练到LV5了喔!!这种简单的事情对新手来说,意义可是很重大的,从LV1(什么都没有) ~ LV5(好像还是什么都没有...但是等级至少比较高了嘛..),既然新手都有一些一定要做的事情,想必写程序也是一样,来去Bing一下吧!! "hello, world"这个是我查询出来的结果,这似乎是写程序的初心者一开始都必须做的事情啊...而且这是有典故的

程序员IT狗有什么副业可以做呢?

1. 开篇 副业有很多,全网有做什么公众号.闲鱼.手机卡,各种各样的都有,大部分是骗子,小部分是通过自己的努力,获得了成功. 从年初就开始实践如何做一个自由职业者,近大半年有一些感受正好一起分享交流一下. 2. 流量 今年有一个名词:私域流量很火,什么意思呢,其实通俗易懂地说就是粉丝经济,只不过这个名词表达得更广泛.更系统. 举个初级例子,我们最常见的公众号,就是一个比较好的聚集私域流量的介质.假如做技术垂类的公众号,比如讲python,最后通过技术.运营把粉丝做到一定规模,阅读量做到一定规模,

oracle数据库创建后要做的事情

用conn /as sysdba登录数据库. 一:先新建用户 create user test01 identified by test02(test01为用户名,test02为用户密码) 二:赋予数据库操作的基本权限 grant connect,resource,dba to test01; 三:创建表空间 根据相应的要求,创建相应的表空间. CREATE TABLESPACE EDUTABLES DATAFILE 'D:\app\Administrator\oradata\test\EDUT