我的解决方案主要针对Python文件,但最终也在HTML和JS文件中找到了问题。仍需要手动筛选错误结果,但只需几分钟即可完成,并找出了约150处注释的拼写错误,这些错误还可以在非注释的部分中找到。
将此保存为可执行文件,例如extractcomments
:
import argparse
import io
import tokenize
if __name__ == "__main__":
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('filename')
args = parser.parse_args()
with io.open(args.filename, "r", encoding="utf-8") as sourcefile:
for t in tokenize.generate_tokens(sourcefile.readline):
if t.type == tokenize.COMMENT:
print(t.string.lstrip("#").strip())
收集所有评论以进行进一步处理:
for f in **/*.py ; do ~/extractcomments $f >> ~/comments.txt ; done
使用一个或多个 aspell
字典递归地在您的代码库上运行它,并收集所有被识别为拼写错误的单词并计算它们的出现次数:
aspell <~/comments.txt --lang=en list|aspell --lang=de list | sort | uniq -c | sort -n > ~/typos.txt
生成的结果如下:
10 availabe
8 assignement
7 hardwird
将不带前导数字的列表清理出误报后,将其复制到第二个文件correct.txt
中,并运行aspell以获取每个拼写错误的期望替换:aspell -c correct.txt
现在将这两个文件粘贴在一起,格式为typo;correction
,使用paste -d";" typos.txt correct.txt > known_typos.csv
现在我们想要递归地替换代码库中的这些内容:
#!/bin/bash
root_dir=$(git rev-parse --show-toplevel)
while IFS=";" read -r typo fix ; do
git grep -l -z -w "${typo}" -- "*.py" "*.html" | xargs -r --null sed -i "s/\b${typo}\b/${fix}/g"
done < $root_dir/known_typos.csv
我的bash技能很差,所以肯定还有提高的空间。
更新:通过运行以下命令,我可以找到更多方法名称中的拼写错误:
grep -r def --include \*.py . | cut -d ":" -f 2- |tr "_" " " | aspell --lang=en list | sort -u
更新2:成功修复了一些错别字,例如下划线名称中的拼写错误或者没有单词边界的字符串(如i_am_a_typpo3
)。
#!/bin/bash
root_dir=$(git rev-parse --show-toplevel)
while IFS=";" read -r typo fix ; do
echo ${typo}
find $root_dir \( -name '*.py' -or -name '*.html' \) -print0 | xargs -0 perl -pi -e "s/(?<![a-zA-Z])${typo}(?![a-zA-Z])/${fix}/g"
done < $root_dir/known_typos.csv