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
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)
|