|
|
|
@ -0,0 +1,51 @@ |
|
|
|
#!/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) |