You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

51 lines
1.7 KiB

#!/usr/bin/python
import re
import argparse
import functools
leading_whitespace = re.compile(r'^( +)(?! )')
#@functools.lru_cache(maxsize=None)
def get_whitespaces_re(line):
return leading_whitespace.match(line)
def get_indent_frequency(lines):
lens = sorted(match.span()[1] for match in filter(bool,map(get_whitespaces_re,lines)))
freq = {}
for i in range(len(lens)-1):
p = lens[i]
n = lens[i+1]
diff = n - p
if diff > 0:
new_val = freq.get(diff,0) + 1
freq[diff] = new_val
return freq
def get_best_canitdate(lines):
freqs = get_indent_frequency(lines)
if freqs:
return sorted(freqs.keys(),key = lambda k: freqs[k],reverse=True)[0]
def change_all(text,new_indent):
lines = text.split('\n')
i = get_best_canitdate(lines)
for row,line in enumerate(lines):
prev_whitespaces = get_whitespaces_re(line)
if prev_whitespaces is not None:
prev_len = prev_whitespaces.span()[1]
n,remaining = divmod(prev_len,i)
if remaining*2 >= i:
n += 1
stripped = line.lstrip(' ')
lines[row] = ' '*(new_indent*n) + stripped
return '\n'.join(lines)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('-o',help='output file')
parser.add_argument('file')
parser.add_argument('indent',type=int)
args = parser.parse_args()
with open(args.file) as file:
text = file.read()
new = change_all(text,args.indent)
if args.o:
with open(args.o,'w') as file:
file.write(new)
else:
with open(args.file,'w') as file:
file.write(new)